From fc0c327a2a4200ce106787baa79bf8fd06dbdc31 Mon Sep 17 00:00:00 2001 From: Ravin D Date: Sun, 8 Mar 2026 20:34:07 +0530 Subject: [PATCH 1/3] feat: Typescript sdk for opencode --- sdk/typescript/README.md | 58 + sdk/typescript/examples/producer.ts | 25 + sdk/typescript/examples/worker.ts | 35 + sdk/typescript/node_modules/.bin/esbuild | 1 + sdk/typescript/node_modules/.bin/rollup | 1 + sdk/typescript/node_modules/.bin/sucrase | 1 + sdk/typescript/node_modules/.bin/sucrase-node | 1 + sdk/typescript/node_modules/.bin/tree-kill | 1 + sdk/typescript/node_modules/.bin/tsc | 1 + sdk/typescript/node_modules/.bin/tsserver | 1 + sdk/typescript/node_modules/.bin/tsup | 1 + sdk/typescript/node_modules/.bin/tsup-node | 1 + sdk/typescript/node_modules/.bin/vite | 1 + sdk/typescript/node_modules/.bin/vite-node | 1 + sdk/typescript/node_modules/.bin/vitest | 1 + .../node_modules/.bin/why-is-node-running | 1 + .../node_modules/.package-lock.json | 1750 +++ .../node_modules/@vitest/expect/LICENSE | 21 + .../node_modules/@vitest/expect/README.md | 17 + .../node_modules/@vitest/expect/index.d.ts | 3 + .../node_modules/@vitest/expect/package.json | 47 + .../node_modules/@vitest/runner/LICENSE | 21 + .../node_modules/@vitest/runner/README.md | 5 + .../node_modules/p-limit/async-hooks-stub.js | 15 + .../runner/node_modules/p-limit/index.d.ts | 38 + .../runner/node_modules/p-limit/index.js | 71 + .../runner/node_modules/p-limit/license | 9 + .../runner/node_modules/p-limit/package.json | 64 + .../runner/node_modules/p-limit/readme.md | 88 + .../@vitest/runner/node_modules/pathe/LICENSE | 44 + .../runner/node_modules/pathe/README.md | 69 + .../runner/node_modules/pathe/package.json | 48 + .../runner/node_modules/pathe/utils.d.ts | 1 + .../node_modules/yocto-queue/index.d.ts | 75 + .../runner/node_modules/yocto-queue/index.js | 90 + .../runner/node_modules/yocto-queue/license | 9 + .../node_modules/yocto-queue/package.json | 48 + .../runner/node_modules/yocto-queue/readme.md | 80 + .../node_modules/@vitest/runner/package.json | 49 + .../node_modules/@vitest/runner/types.d.ts | 1 + .../node_modules/@vitest/runner/utils.d.ts | 1 + .../node_modules/@vitest/snapshot/LICENSE | 21 + .../node_modules/@vitest/snapshot/README.md | 79 + .../@vitest/snapshot/environment.d.ts | 1 + .../@vitest/snapshot/manager.d.ts | 1 + .../node_modules/@jest/schemas/LICENSE | 21 + .../node_modules/@jest/schemas/README.md | 3 + .../node_modules/@jest/schemas/package.json | 29 + .../@sinclair/typebox/compiler/compiler.d.ts | 35 + .../@sinclair/typebox/compiler/compiler.js | 577 + .../@sinclair/typebox/compiler/index.d.ts | 2 + .../@sinclair/typebox/compiler/index.js | 47 + .../@sinclair/typebox/errors/errors.d.ts | 88 + .../@sinclair/typebox/errors/errors.js | 609 + .../@sinclair/typebox/errors/index.d.ts | 1 + .../@sinclair/typebox/errors/index.js | 44 + .../node_modules/@sinclair/typebox/license | 23 + .../@sinclair/typebox/package.json | 49 + .../node_modules/@sinclair/typebox/readme.md | 1424 ++ .../@sinclair/typebox/system/index.d.ts | 1 + .../@sinclair/typebox/system/index.js | 44 + .../@sinclair/typebox/system/system.d.ts | 26 + .../@sinclair/typebox/system/system.js | 90 + .../@sinclair/typebox/typebox.d.ts | 717 + .../node_modules/@sinclair/typebox/typebox.js | 2220 +++ .../@sinclair/typebox/value/cast.d.ts | 30 + .../@sinclair/typebox/value/cast.js | 372 + .../@sinclair/typebox/value/check.d.ts | 12 + .../@sinclair/typebox/value/check.js | 484 + .../@sinclair/typebox/value/clone.d.ts | 3 + .../@sinclair/typebox/value/clone.js | 71 + .../@sinclair/typebox/value/convert.d.ts | 13 + .../@sinclair/typebox/value/convert.js | 372 + .../@sinclair/typebox/value/create.d.ts | 26 + .../@sinclair/typebox/value/create.js | 480 + .../@sinclair/typebox/value/delta.d.ts | 43 + .../@sinclair/typebox/value/delta.js | 204 + .../@sinclair/typebox/value/equal.d.ts | 3 + .../@sinclair/typebox/value/equal.js | 80 + .../@sinclair/typebox/value/hash.d.ts | 8 + .../@sinclair/typebox/value/hash.js | 208 + .../@sinclair/typebox/value/index.d.ts | 6 + .../@sinclair/typebox/value/index.js | 56 + .../@sinclair/typebox/value/is.d.ts | 11 + .../@sinclair/typebox/value/is.js | 53 + .../@sinclair/typebox/value/mutate.d.ts | 13 + .../@sinclair/typebox/value/mutate.js | 121 + .../@sinclair/typebox/value/pointer.d.ts | 24 + .../@sinclair/typebox/value/pointer.js | 142 + .../@sinclair/typebox/value/value.d.ts | 39 + .../@sinclair/typebox/value/value.js | 99 + .../node_modules/ansi-styles/index.d.ts | 167 + .../node_modules/ansi-styles/index.js | 164 + .../snapshot/node_modules/ansi-styles/license | 9 + .../node_modules/ansi-styles/package.json | 52 + .../node_modules/ansi-styles/readme.md | 144 + .../snapshot/node_modules/pathe/LICENSE | 44 + .../snapshot/node_modules/pathe/README.md | 69 + .../snapshot/node_modules/pathe/package.json | 48 + .../snapshot/node_modules/pathe/utils.d.ts | 1 + .../node_modules/pretty-format/LICENSE | 21 + .../node_modules/pretty-format/README.md | 463 + .../node_modules/pretty-format/package.json | 43 + .../snapshot/node_modules/react-is/LICENSE | 21 + .../snapshot/node_modules/react-is/README.md | 104 + .../react-is/cjs/react-is.development.js | 221 + .../react-is/cjs/react-is.production.min.js | 14 + .../snapshot/node_modules/react-is/index.js | 7 + .../node_modules/react-is/package.json | 26 + .../react-is/umd/react-is.development.js | 220 + .../react-is/umd/react-is.production.min.js | 15 + .../@vitest/snapshot/package.json | 54 + .../node_modules/@vitest/spy/LICENSE | 21 + .../node_modules/@vitest/spy/README.md | 3 + .../@vitest/spy/node_modules/tinyspy/LICENCE | 21 + .../spy/node_modules/tinyspy/README.md | 12 + .../spy/node_modules/tinyspy/package.json | 36 + .../node_modules/@vitest/spy/package.json | 38 + .../node_modules/@vitest/utils/LICENSE | 21 + .../node_modules/@vitest/utils/diff.d.ts | 1 + .../node_modules/@vitest/utils/error.d.ts | 1 + .../node_modules/@vitest/utils/helpers.d.ts | 1 + .../utils/node_modules/@jest/schemas/LICENSE | 21 + .../node_modules/@jest/schemas/README.md | 3 + .../node_modules/@jest/schemas/package.json | 29 + .../@sinclair/typebox/compiler/compiler.d.ts | 35 + .../@sinclair/typebox/compiler/compiler.js | 577 + .../@sinclair/typebox/compiler/index.d.ts | 2 + .../@sinclair/typebox/compiler/index.js | 47 + .../@sinclair/typebox/errors/errors.d.ts | 88 + .../@sinclair/typebox/errors/errors.js | 609 + .../@sinclair/typebox/errors/index.d.ts | 1 + .../@sinclair/typebox/errors/index.js | 44 + .../node_modules/@sinclair/typebox/license | 23 + .../@sinclair/typebox/package.json | 49 + .../node_modules/@sinclair/typebox/readme.md | 1424 ++ .../@sinclair/typebox/system/index.d.ts | 1 + .../@sinclair/typebox/system/index.js | 44 + .../@sinclair/typebox/system/system.d.ts | 26 + .../@sinclair/typebox/system/system.js | 90 + .../@sinclair/typebox/typebox.d.ts | 717 + .../node_modules/@sinclair/typebox/typebox.js | 2220 +++ .../@sinclair/typebox/value/cast.d.ts | 30 + .../@sinclair/typebox/value/cast.js | 372 + .../@sinclair/typebox/value/check.d.ts | 12 + .../@sinclair/typebox/value/check.js | 484 + .../@sinclair/typebox/value/clone.d.ts | 3 + .../@sinclair/typebox/value/clone.js | 71 + .../@sinclair/typebox/value/convert.d.ts | 13 + .../@sinclair/typebox/value/convert.js | 372 + .../@sinclair/typebox/value/create.d.ts | 26 + .../@sinclair/typebox/value/create.js | 480 + .../@sinclair/typebox/value/delta.d.ts | 43 + .../@sinclair/typebox/value/delta.js | 204 + .../@sinclair/typebox/value/equal.d.ts | 3 + .../@sinclair/typebox/value/equal.js | 80 + .../@sinclair/typebox/value/hash.d.ts | 8 + .../@sinclair/typebox/value/hash.js | 208 + .../@sinclair/typebox/value/index.d.ts | 6 + .../@sinclair/typebox/value/index.js | 56 + .../@sinclair/typebox/value/is.d.ts | 11 + .../@sinclair/typebox/value/is.js | 53 + .../@sinclair/typebox/value/mutate.d.ts | 13 + .../@sinclair/typebox/value/mutate.js | 121 + .../@sinclair/typebox/value/pointer.d.ts | 24 + .../@sinclair/typebox/value/pointer.js | 142 + .../@sinclair/typebox/value/value.d.ts | 39 + .../@sinclair/typebox/value/value.js | 99 + .../utils/node_modules/@types/estree/LICENSE | 21 + .../node_modules/@types/estree/README.md | 15 + .../node_modules/@types/estree/flow.d.ts | 167 + .../node_modules/@types/estree/index.d.ts | 694 + .../node_modules/@types/estree/package.json | 27 + .../utils/node_modules/ansi-styles/index.d.ts | 167 + .../utils/node_modules/ansi-styles/index.js | 164 + .../utils/node_modules/ansi-styles/license | 9 + .../node_modules/ansi-styles/package.json | 52 + .../utils/node_modules/ansi-styles/readme.md | 144 + .../utils/node_modules/diff-sequences/LICENSE | 21 + .../node_modules/diff-sequences/README.md | 404 + .../node_modules/diff-sequences/package.json | 39 + .../utils/node_modules/estree-walker/LICENSE | 7 + .../node_modules/estree-walker/README.md | 48 + .../node_modules/estree-walker/package.json | 38 + .../node_modules/estree-walker/src/async.js | 152 + .../node_modules/estree-walker/src/index.js | 34 + .../node_modules/estree-walker/src/sync.js | 152 + .../node_modules/estree-walker/src/walker.js | 61 + .../estree-walker/types/async.d.ts | 36 + .../estree-walker/types/index.d.ts | 32 + .../estree-walker/types/sync.d.ts | 36 + .../estree-walker/types/walker.d.ts | 39 + .../utils/node_modules/get-func-name/LICENSE | 19 + .../node_modules/get-func-name/README.md | 123 + .../get-func-name/get-func-name.js | 1 + .../utils/node_modules/get-func-name/index.js | 52 + .../node_modules/get-func-name/package.json | 85 + .../utils/node_modules/loupe/CHANGELOG.md | 5 + .../@vitest/utils/node_modules/loupe/LICENSE | 9 + .../utils/node_modules/loupe/README.md | 63 + .../@vitest/utils/node_modules/loupe/index.js | 219 + .../@vitest/utils/node_modules/loupe/loupe.js | 891 ++ .../utils/node_modules/loupe/package.json | 141 + .../utils/node_modules/pretty-format/LICENSE | 21 + .../node_modules/pretty-format/README.md | 463 + .../node_modules/pretty-format/package.json | 43 + .../utils/node_modules/react-is/LICENSE | 21 + .../utils/node_modules/react-is/README.md | 104 + .../react-is/cjs/react-is.development.js | 221 + .../react-is/cjs/react-is.production.min.js | 14 + .../utils/node_modules/react-is/index.js | 7 + .../utils/node_modules/react-is/package.json | 26 + .../react-is/umd/react-is.development.js | 220 + .../react-is/umd/react-is.production.min.js | 15 + .../node_modules/@vitest/utils/package.json | 74 + .../node_modules/acorn-walk/CHANGELOG.md | 209 + .../node_modules/acorn-walk/LICENSE | 21 + .../node_modules/acorn-walk/README.md | 124 + .../acorn-walk/node_modules/.bin/acorn | 1 + .../node_modules/acorn/CHANGELOG.md | 972 ++ .../acorn-walk/node_modules/acorn/LICENSE | 21 + .../acorn-walk/node_modules/acorn/README.md | 301 + .../acorn-walk/node_modules/acorn/bin/acorn | 4 + .../node_modules/acorn/package.json | 50 + .../node_modules/acorn-walk/package.json | 50 + .../node_modules/bundle-require/LICENSE | 21 + .../node_modules/bundle-require/README.md | 55 + .../node_modules/load-tsconfig/LICENSE | 21 + .../node_modules/load-tsconfig/README.md | 44 + .../node_modules/load-tsconfig/package.json | 39 + .../node_modules/bundle-require/package.json | 44 + sdk/typescript/node_modules/cac/LICENSE | 21 + sdk/typescript/node_modules/cac/README.md | 536 + sdk/typescript/node_modules/cac/deno/CAC.ts | 331 + .../node_modules/cac/deno/Command.ts | 269 + .../node_modules/cac/deno/Option.ts | 52 + sdk/typescript/node_modules/cac/deno/deno.ts | 4 + sdk/typescript/node_modules/cac/deno/index.ts | 10 + sdk/typescript/node_modules/cac/deno/utils.ts | 145 + .../node_modules/cac/index-compat.js | 11 + sdk/typescript/node_modules/cac/mod.js | 2 + sdk/typescript/node_modules/cac/mod.ts | 2 + sdk/typescript/node_modules/cac/package.json | 104 + sdk/typescript/node_modules/chai/CODEOWNERS | 1 + .../node_modules/chai/CODE_OF_CONDUCT.md | 58 + .../node_modules/chai/CONTRIBUTING.md | 212 + sdk/typescript/node_modules/chai/History.md | 1059 ++ sdk/typescript/node_modules/chai/LICENSE | 21 + sdk/typescript/node_modules/chai/README.md | 212 + .../node_modules/chai/ReleaseNotes.md | 737 + sdk/typescript/node_modules/chai/bower.json | 26 + sdk/typescript/node_modules/chai/chai.js | 11300 ++++++++++++++++ sdk/typescript/node_modules/chai/index.js | 1 + sdk/typescript/node_modules/chai/index.mjs | 14 + .../node_modules/chai/karma.conf.js | 34 + .../node_modules/chai/karma.sauce.js | 41 + .../node_modules/assertion-error/History.md | 24 + .../node_modules/assertion-error/README.md | 41 + .../node_modules/assertion-error/index.d.ts | 11 + .../node_modules/assertion-error/index.js | 116 + .../node_modules/assertion-error/package.json | 29 + .../chai/node_modules/check-error/LICENSE | 19 + .../chai/node_modules/check-error/README.md | 207 + .../node_modules/check-error/check-error.js | 1 + .../chai/node_modules/check-error/index.js | 148 + .../node_modules/check-error/package.json | 87 + .../chai/node_modules/deep-eql/LICENSE | 19 + .../chai/node_modules/deep-eql/README.md | 93 + .../chai/node_modules/deep-eql/deep-eql.js | 1 + .../chai/node_modules/deep-eql/index.js | 498 + .../chai/node_modules/deep-eql/package.json | 79 + .../chai/node_modules/get-func-name/LICENSE | 19 + .../chai/node_modules/get-func-name/README.md | 123 + .../get-func-name/get-func-name.js | 1 + .../chai/node_modules/get-func-name/index.js | 52 + .../node_modules/get-func-name/package.json | 85 + .../chai/node_modules/loupe/CHANGELOG.md | 5 + .../chai/node_modules/loupe/LICENSE | 9 + .../chai/node_modules/loupe/README.md | 63 + .../chai/node_modules/loupe/index.js | 219 + .../chai/node_modules/loupe/loupe.js | 891 ++ .../chai/node_modules/loupe/package.json | 141 + .../chai/node_modules/pathval/CHANGELOG.md | 18 + .../chai/node_modules/pathval/LICENSE | 16 + .../chai/node_modules/pathval/README.md | 147 + .../chai/node_modules/pathval/index.js | 301 + .../chai/node_modules/pathval/package.json | 80 + .../chai/node_modules/pathval/pathval.js | 1 + .../chai/node_modules/type-detect/LICENSE | 19 + .../chai/node_modules/type-detect/README.md | 235 + .../chai/node_modules/type-detect/index.d.ts | 1 + .../chai/node_modules/type-detect/index.js | 129 + .../chai/node_modules/type-detect/index.ts | 393 + .../node_modules/type-detect/package.json | 113 + .../node_modules/type-detect/type-detect.js | 139 + sdk/typescript/node_modules/chai/package.json | 63 + .../node_modules/chai/register-assert.js | 1 + .../node_modules/chai/register-expect.js | 1 + .../node_modules/chai/register-should.js | 1 + .../node_modules/chai/sauce.browsers.js | 106 + sdk/typescript/node_modules/chokidar/LICENSE | 21 + .../node_modules/chokidar/README.md | 305 + .../node_modules/chokidar/esm/handler.d.ts | 90 + .../node_modules/chokidar/esm/handler.js | 629 + .../node_modules/chokidar/esm/index.d.ts | 215 + .../node_modules/chokidar/esm/index.js | 798 ++ .../node_modules/chokidar/esm/package.json | 1 + .../node_modules/chokidar/handler.d.ts | 90 + .../node_modules/chokidar/handler.js | 635 + .../node_modules/chokidar/index.d.ts | 215 + sdk/typescript/node_modules/chokidar/index.js | 804 ++ .../chokidar/node_modules/readdirp/LICENSE | 21 + .../chokidar/node_modules/readdirp/README.md | 120 + .../node_modules/readdirp/esm/index.d.ts | 108 + .../node_modules/readdirp/esm/index.js | 257 + .../node_modules/readdirp/esm/package.json | 1 + .../chokidar/node_modules/readdirp/index.d.ts | 108 + .../chokidar/node_modules/readdirp/index.js | 263 + .../node_modules/readdirp/package.json | 70 + .../node_modules/chokidar/package.json | 69 + sdk/typescript/node_modules/consola/LICENSE | 47 + sdk/typescript/node_modules/consola/README.md | 352 + .../node_modules/consola/basic.d.ts | 1 + .../node_modules/consola/browser.d.ts | 1 + sdk/typescript/node_modules/consola/core.d.ts | 1 + .../node_modules/consola/package.json | 136 + .../node_modules/consola/utils.d.ts | 1 + sdk/typescript/node_modules/debug/LICENSE | 20 + sdk/typescript/node_modules/debug/README.md | 481 + .../debug/node_modules/ms/index.js | 162 + .../debug/node_modules/ms/license.md | 21 + .../debug/node_modules/ms/package.json | 38 + .../debug/node_modules/ms/readme.md | 59 + .../node_modules/debug/package.json | 64 + .../node_modules/debug/src/browser.js | 272 + .../node_modules/debug/src/common.js | 292 + .../node_modules/debug/src/index.js | 10 + sdk/typescript/node_modules/debug/src/node.js | 263 + .../node_modules/esbuild/LICENSE.md | 21 + sdk/typescript/node_modules/esbuild/README.md | 3 + .../node_modules/esbuild/bin/esbuild | Bin 0 -> 11108536 bytes .../node_modules/esbuild/install.js | 289 + .../node_modules/@esbuild/linux-x64/README.md | 3 + .../@esbuild/linux-x64/bin/esbuild | Bin 0 -> 11108536 bytes .../@esbuild/linux-x64/package.json | 20 + .../node_modules/esbuild/package.json | 49 + sdk/typescript/node_modules/execa/index.d.ts | 955 ++ sdk/typescript/node_modules/execa/index.js | 309 + sdk/typescript/node_modules/execa/license | 9 + .../execa/node_modules/.bin/node-which | 1 + .../execa/node_modules/cross-spawn/LICENSE | 21 + .../execa/node_modules/cross-spawn/README.md | 89 + .../execa/node_modules/cross-spawn/index.js | 39 + .../node_modules/cross-spawn/package.json | 73 + .../execa/node_modules/get-stream/license | 9 + .../node_modules/get-stream/package.json | 53 + .../execa/node_modules/get-stream/readme.md | 291 + .../get-stream/source/array-buffer.js | 84 + .../node_modules/get-stream/source/array.js | 32 + .../node_modules/get-stream/source/buffer.js | 20 + .../get-stream/source/contents.js | 101 + .../node_modules/get-stream/source/index.d.ts | 119 + .../node_modules/get-stream/source/index.js | 5 + .../node_modules/get-stream/source/string.js | 36 + .../node_modules/get-stream/source/utils.js | 11 + .../execa/node_modules/human-signals/LICENSE | 201 + .../node_modules/human-signals/README.md | 168 + .../node_modules/human-signals/package.json | 61 + .../execa/node_modules/is-stream/index.d.ts | 81 + .../execa/node_modules/is-stream/index.js | 29 + .../execa/node_modules/is-stream/license | 9 + .../execa/node_modules/is-stream/package.json | 44 + .../execa/node_modules/is-stream/readme.md | 60 + .../execa/node_modules/isexe/.npmignore | 2 + .../execa/node_modules/isexe/LICENSE | 15 + .../execa/node_modules/isexe/README.md | 51 + .../execa/node_modules/isexe/index.js | 57 + .../execa/node_modules/isexe/mode.js | 41 + .../execa/node_modules/isexe/package.json | 31 + .../execa/node_modules/isexe/test/basic.js | 221 + .../execa/node_modules/isexe/windows.js | 42 + .../execa/node_modules/merge-stream/LICENSE | 21 + .../execa/node_modules/merge-stream/README.md | 78 + .../execa/node_modules/merge-stream/index.js | 41 + .../node_modules/merge-stream/package.json | 19 + .../execa/node_modules/mimic-fn/index.d.ts | 52 + .../execa/node_modules/mimic-fn/index.js | 71 + .../execa/node_modules/mimic-fn/license | 9 + .../execa/node_modules/mimic-fn/package.json | 45 + .../execa/node_modules/mimic-fn/readme.md | 90 + .../node_modules/npm-run-path/index.d.ts | 90 + .../execa/node_modules/npm-run-path/index.js | 52 + .../execa/node_modules/npm-run-path/license | 9 + .../node_modules/path-key/index.d.ts | 31 + .../node_modules/path-key/index.js | 12 + .../node_modules/path-key/license | 9 + .../node_modules/path-key/package.json | 41 + .../node_modules/path-key/readme.md | 57 + .../node_modules/npm-run-path/package.json | 49 + .../execa/node_modules/npm-run-path/readme.md | 104 + .../execa/node_modules/onetime/index.d.ts | 59 + .../execa/node_modules/onetime/index.js | 41 + .../execa/node_modules/onetime/license | 9 + .../execa/node_modules/onetime/package.json | 45 + .../execa/node_modules/onetime/readme.md | 94 + .../execa/node_modules/path-key/index.d.ts | 40 + .../execa/node_modules/path-key/index.js | 16 + .../execa/node_modules/path-key/license | 9 + .../execa/node_modules/path-key/package.json | 39 + .../execa/node_modules/path-key/readme.md | 61 + .../node_modules/shebang-command/index.js | 19 + .../node_modules/shebang-command/license | 9 + .../node_modules/shebang-command/package.json | 34 + .../node_modules/shebang-command/readme.md | 34 + .../node_modules/shebang-regex/index.d.ts | 22 + .../execa/node_modules/shebang-regex/index.js | 2 + .../execa/node_modules/shebang-regex/license | 9 + .../node_modules/shebang-regex/package.json | 35 + .../node_modules/shebang-regex/readme.md | 33 + .../node_modules/signal-exit/LICENSE.txt | 16 + .../execa/node_modules/signal-exit/README.md | 74 + .../node_modules/signal-exit/package.json | 106 + .../node_modules/strip-final-newline/index.js | 14 + .../node_modules/strip-final-newline/license | 9 + .../strip-final-newline/package.json | 43 + .../strip-final-newline/readme.md | 35 + .../execa/node_modules/which/CHANGELOG.md | 166 + .../execa/node_modules/which/LICENSE | 15 + .../execa/node_modules/which/README.md | 54 + .../execa/node_modules/which/bin/node-which | 52 + .../execa/node_modules/which/package.json | 43 + .../execa/node_modules/which/which.js | 125 + .../node_modules/execa/package.json | 90 + sdk/typescript/node_modules/execa/readme.md | 822 ++ .../fix-dts-default-cjs-exports/LICENSE | 21 + .../fix-dts-default-cjs-exports/README.md | 79 + .../node_modules/.bin/acorn | 1 + .../node_modules/acorn/CHANGELOG.md | 972 ++ .../node_modules/acorn/LICENSE | 21 + .../node_modules/acorn/README.md | 301 + .../node_modules/acorn/bin/acorn | 4 + .../node_modules/acorn/package.json | 50 + .../node_modules/confbox/LICENSE | 118 + .../node_modules/confbox/README.md | 191 + .../node_modules/confbox/json5.d.ts | 2 + .../node_modules/confbox/jsonc.d.ts | 2 + .../node_modules/confbox/package.json | 86 + .../node_modules/confbox/toml.d.ts | 2 + .../node_modules/confbox/yaml.d.ts | 2 + .../node_modules/mlly/LICENSE | 21 + .../node_modules/mlly/README.md | 561 + .../node_modules/mlly/package.json | 55 + .../node_modules/pathe/LICENSE | 70 + .../node_modules/pathe/README.md | 73 + .../node_modules/pathe/package.json | 61 + .../node_modules/pathe/utils.d.ts | 1 + .../node_modules/pkg-types/LICENSE | 44 + .../node_modules/pkg-types/README.md | 167 + .../node_modules/pkg-types/package.json | 47 + .../node_modules/ufo/LICENSE | 21 + .../node_modules/ufo/README.md | 582 + .../node_modules/ufo/package.json | 48 + .../fix-dts-default-cjs-exports/package.json | 87 + sdk/typescript/node_modules/joycon/LICENSE | 21 + sdk/typescript/node_modules/joycon/README.md | 133 + .../node_modules/joycon/package.json | 39 + .../node_modules/joycon/types/index.d.ts | 62 + sdk/typescript/node_modules/local-pkg/LICENSE | 21 + .../node_modules/local-pkg/README.md | 55 + .../local-pkg/node_modules/.bin/acorn | 1 + .../local-pkg/node_modules/acorn/CHANGELOG.md | 972 ++ .../local-pkg/node_modules/acorn/LICENSE | 21 + .../local-pkg/node_modules/acorn/README.md | 301 + .../local-pkg/node_modules/acorn/bin/acorn | 4 + .../local-pkg/node_modules/acorn/package.json | 50 + .../local-pkg/node_modules/confbox/LICENSE | 118 + .../local-pkg/node_modules/confbox/README.md | 191 + .../local-pkg/node_modules/confbox/json5.d.ts | 2 + .../local-pkg/node_modules/confbox/jsonc.d.ts | 2 + .../node_modules/confbox/package.json | 86 + .../local-pkg/node_modules/confbox/toml.d.ts | 2 + .../local-pkg/node_modules/confbox/yaml.d.ts | 2 + .../local-pkg/node_modules/mlly/LICENSE | 21 + .../local-pkg/node_modules/mlly/README.md | 561 + .../local-pkg/node_modules/mlly/package.json | 55 + .../local-pkg/node_modules/pathe/LICENSE | 70 + .../local-pkg/node_modules/pathe/README.md | 73 + .../local-pkg/node_modules/pathe/package.json | 61 + .../local-pkg/node_modules/pathe/utils.d.ts | 1 + .../local-pkg/node_modules/pkg-types/LICENSE | 44 + .../node_modules/pkg-types/README.md | 167 + .../node_modules/pkg-types/package.json | 47 + .../local-pkg/node_modules/ufo/LICENSE | 21 + .../local-pkg/node_modules/ufo/README.md | 582 + .../local-pkg/node_modules/ufo/package.json | 48 + .../node_modules/local-pkg/package.json | 65 + .../node_modules/magic-string/LICENSE | 7 + .../node_modules/magic-string/README.md | 325 + .../@jridgewell/sourcemap-codec/LICENSE | 19 + .../@jridgewell/sourcemap-codec/README.md | 264 + .../@jridgewell/sourcemap-codec/package.json | 63 + .../@jridgewell/sourcemap-codec/src/scopes.ts | 345 + .../sourcemap-codec/src/sourcemap-codec.ts | 111 + .../sourcemap-codec/src/strings.ts | 65 + .../@jridgewell/sourcemap-codec/src/vlq.ts | 55 + .../sourcemap-codec/types/scopes.d.cts | 50 + .../sourcemap-codec/types/scopes.d.cts.map | 1 + .../sourcemap-codec/types/scopes.d.mts | 50 + .../sourcemap-codec/types/scopes.d.mts.map | 1 + .../types/sourcemap-codec.d.cts | 9 + .../types/sourcemap-codec.d.cts.map | 1 + .../types/sourcemap-codec.d.mts | 9 + .../types/sourcemap-codec.d.mts.map | 1 + .../sourcemap-codec/types/strings.d.cts | 16 + .../sourcemap-codec/types/strings.d.cts.map | 1 + .../sourcemap-codec/types/strings.d.mts | 16 + .../sourcemap-codec/types/strings.d.mts.map | 1 + .../sourcemap-codec/types/vlq.d.cts | 7 + .../sourcemap-codec/types/vlq.d.cts.map | 1 + .../sourcemap-codec/types/vlq.d.mts | 7 + .../sourcemap-codec/types/vlq.d.mts.map | 1 + .../node_modules/magic-string/package.json | 67 + .../node_modules/picocolors/LICENSE | 15 + .../node_modules/picocolors/README.md | 21 + .../node_modules/picocolors/package.json | 25 + .../picocolors/picocolors.browser.js | 4 + .../node_modules/picocolors/picocolors.d.ts | 5 + .../node_modules/picocolors/picocolors.js | 75 + .../node_modules/picocolors/types.d.ts | 51 + .../node_modules/postcss-load-config/LICENSE | 20 + .../postcss-load-config/README.md | 474 + .../node_modules/lilconfig/LICENSE | 21 + .../node_modules/lilconfig/package.json | 42 + .../node_modules/lilconfig/readme.md | 98 + .../node_modules/lilconfig/src/index.d.ts | 54 + .../node_modules/lilconfig/src/index.js | 460 + .../postcss-load-config/package.json | 61 + .../postcss-load-config/src/index.d.ts | 65 + .../postcss-load-config/src/index.js | 178 + .../postcss-load-config/src/options.js | 48 + .../postcss-load-config/src/plugins.js | 89 + .../postcss-load-config/src/req.js | 62 + sdk/typescript/node_modules/postcss/LICENSE | 20 + sdk/typescript/node_modules/postcss/README.md | 29 + .../postcss/node_modules/.bin/nanoid | 1 + .../postcss/node_modules/nanoid/LICENSE | 20 + .../postcss/node_modules/nanoid/README.md | 39 + .../nanoid/async/index.browser.cjs | 69 + .../nanoid/async/index.browser.js | 34 + .../node_modules/nanoid/async/index.cjs | 71 + .../node_modules/nanoid/async/index.d.ts | 56 + .../node_modules/nanoid/async/index.js | 35 + .../node_modules/nanoid/async/index.native.js | 26 + .../node_modules/nanoid/async/package.json | 12 + .../node_modules/nanoid/bin/nanoid.cjs | 55 + .../node_modules/nanoid/index.browser.cjs | 72 + .../node_modules/nanoid/index.browser.js | 34 + .../postcss/node_modules/nanoid/index.cjs | 85 + .../postcss/node_modules/nanoid/index.d.cts | 91 + .../postcss/node_modules/nanoid/index.d.ts | 91 + .../postcss/node_modules/nanoid/index.js | 45 + .../postcss/node_modules/nanoid/nanoid.js | 1 + .../node_modules/nanoid/non-secure/index.cjs | 34 + .../node_modules/nanoid/non-secure/index.d.ts | 33 + .../node_modules/nanoid/non-secure/index.js | 21 + .../nanoid/non-secure/package.json | 6 + .../postcss/node_modules/nanoid/package.json | 89 + .../nanoid/url-alphabet/index.cjs | 7 + .../node_modules/nanoid/url-alphabet/index.js | 3 + .../nanoid/url-alphabet/package.json | 6 + .../node_modules/source-map-js/LICENSE | 28 + .../node_modules/source-map-js/README.md | 765 ++ .../node_modules/source-map-js/package.json | 71 + .../source-map-js/source-map.d.ts | 104 + .../node_modules/source-map-js/source-map.js | 8 + .../node_modules/postcss/package.json | 88 + .../node_modules/resolve-from/index.d.ts | 31 + .../node_modules/resolve-from/index.js | 47 + .../node_modules/resolve-from/license | 9 + .../node_modules/resolve-from/package.json | 36 + .../node_modules/resolve-from/readme.md | 72 + sdk/typescript/node_modules/rollup/LICENSE.md | 679 + sdk/typescript/node_modules/rollup/README.md | 134 + .../@rollup/rollup-linux-x64-gnu/README.md | 3 + .../@rollup/rollup-linux-x64-gnu/package.json | 25 + .../rollup.linux-x64-gnu.node | Bin 0 -> 2030680 bytes .../rollup/node_modules/@types/estree/LICENSE | 21 + .../node_modules/@types/estree/README.md | 15 + .../node_modules/@types/estree/flow.d.ts | 167 + .../node_modules/@types/estree/index.d.ts | 694 + .../node_modules/@types/estree/package.json | 27 + .../node_modules/rollup/package.json | 288 + .../node_modules/source-map/LICENSE | 28 + .../node_modules/source-map/README.md | 837 ++ .../node_modules/source-map/package.json | 79 + .../node_modules/source-map/source-map.d.ts | 423 + .../node_modules/source-map/source-map.js | 10 + sdk/typescript/node_modules/std-env/LICENCE | 22 + sdk/typescript/node_modules/std-env/README.md | 118 + .../node_modules/std-env/package.json | 46 + .../node_modules/strip-literal/LICENSE | 21 + .../node_modules/strip-literal/README.md | 29 + .../node_modules/js-tokens/LICENSE | 21 + .../node_modules/js-tokens/README.md | 14 + .../node_modules/js-tokens/index.d.ts | 37 + .../node_modules/js-tokens/index.js | 396 + .../node_modules/js-tokens/package.json | 22 + .../node_modules/strip-literal/package.json | 62 + sdk/typescript/node_modules/sucrase/LICENSE | 21 + sdk/typescript/node_modules/sucrase/README.md | 295 + .../node_modules/sucrase/bin/sucrase | 3 + .../node_modules/sucrase/bin/sucrase-node | 18 + .../@jridgewell/gen-mapping/LICENSE | 19 + .../@jridgewell/gen-mapping/README.md | 227 + .../@jridgewell/gen-mapping/package.json | 67 + .../gen-mapping/src/gen-mapping.ts | 614 + .../@jridgewell/gen-mapping/src/set-array.ts | 82 + .../gen-mapping/src/sourcemap-segment.ts | 16 + .../@jridgewell/gen-mapping/src/types.ts | 61 + .../gen-mapping/types/gen-mapping.d.cts | 89 + .../gen-mapping/types/gen-mapping.d.cts.map | 1 + .../gen-mapping/types/gen-mapping.d.mts | 89 + .../gen-mapping/types/gen-mapping.d.mts.map | 1 + .../gen-mapping/types/set-array.d.cts | 33 + .../gen-mapping/types/set-array.d.cts.map | 1 + .../gen-mapping/types/set-array.d.mts | 33 + .../gen-mapping/types/set-array.d.mts.map | 1 + .../gen-mapping/types/sourcemap-segment.d.cts | 13 + .../types/sourcemap-segment.d.cts.map | 1 + .../gen-mapping/types/sourcemap-segment.d.mts | 13 + .../types/sourcemap-segment.d.mts.map | 1 + .../@jridgewell/gen-mapping/types/types.d.cts | 44 + .../gen-mapping/types/types.d.cts.map | 1 + .../@jridgewell/gen-mapping/types/types.d.mts | 44 + .../gen-mapping/types/types.d.mts.map | 1 + .../@jridgewell/resolve-uri/LICENSE | 19 + .../@jridgewell/resolve-uri/README.md | 40 + .../@jridgewell/resolve-uri/package.json | 69 + .../@jridgewell/sourcemap-codec/LICENSE | 19 + .../@jridgewell/sourcemap-codec/README.md | 264 + .../@jridgewell/sourcemap-codec/package.json | 63 + .../@jridgewell/sourcemap-codec/src/scopes.ts | 345 + .../sourcemap-codec/src/sourcemap-codec.ts | 111 + .../sourcemap-codec/src/strings.ts | 65 + .../@jridgewell/sourcemap-codec/src/vlq.ts | 55 + .../sourcemap-codec/types/scopes.d.cts | 50 + .../sourcemap-codec/types/scopes.d.cts.map | 1 + .../sourcemap-codec/types/scopes.d.mts | 50 + .../sourcemap-codec/types/scopes.d.mts.map | 1 + .../types/sourcemap-codec.d.cts | 9 + .../types/sourcemap-codec.d.cts.map | 1 + .../types/sourcemap-codec.d.mts | 9 + .../types/sourcemap-codec.d.mts.map | 1 + .../sourcemap-codec/types/strings.d.cts | 16 + .../sourcemap-codec/types/strings.d.cts.map | 1 + .../sourcemap-codec/types/strings.d.mts | 16 + .../sourcemap-codec/types/strings.d.mts.map | 1 + .../sourcemap-codec/types/vlq.d.cts | 7 + .../sourcemap-codec/types/vlq.d.cts.map | 1 + .../sourcemap-codec/types/vlq.d.mts | 7 + .../sourcemap-codec/types/vlq.d.mts.map | 1 + .../@jridgewell/trace-mapping/LICENSE | 19 + .../@jridgewell/trace-mapping/README.md | 348 + .../@jridgewell/trace-mapping/package.json | 67 + .../trace-mapping/src/binary-search.ts | 115 + .../trace-mapping/src/by-source.ts | 41 + .../trace-mapping/src/flatten-map.ts | 192 + .../@jridgewell/trace-mapping/src/resolve.ts | 16 + .../@jridgewell/trace-mapping/src/sort.ts | 45 + .../trace-mapping/src/sourcemap-segment.ts | 23 + .../trace-mapping/src/strip-filename.ts | 8 + .../trace-mapping/src/trace-mapping.ts | 502 + .../@jridgewell/trace-mapping/src/types.ts | 114 + .../trace-mapping/types/binary-search.d.cts | 33 + .../types/binary-search.d.cts.map | 1 + .../trace-mapping/types/binary-search.d.mts | 33 + .../types/binary-search.d.mts.map | 1 + .../trace-mapping/types/by-source.d.cts | 4 + .../trace-mapping/types/by-source.d.cts.map | 1 + .../trace-mapping/types/by-source.d.mts | 4 + .../trace-mapping/types/by-source.d.mts.map | 1 + .../trace-mapping/types/flatten-map.d.cts | 9 + .../trace-mapping/types/flatten-map.d.cts.map | 1 + .../trace-mapping/types/flatten-map.d.mts | 9 + .../trace-mapping/types/flatten-map.d.mts.map | 1 + .../trace-mapping/types/resolve.d.cts | 4 + .../trace-mapping/types/resolve.d.cts.map | 1 + .../trace-mapping/types/resolve.d.mts | 4 + .../trace-mapping/types/resolve.d.mts.map | 1 + .../trace-mapping/types/sort.d.cts | 4 + .../trace-mapping/types/sort.d.cts.map | 1 + .../trace-mapping/types/sort.d.mts | 4 + .../trace-mapping/types/sort.d.mts.map | 1 + .../types/sourcemap-segment.d.cts | 17 + .../types/sourcemap-segment.d.cts.map | 1 + .../types/sourcemap-segment.d.mts | 17 + .../types/sourcemap-segment.d.mts.map | 1 + .../trace-mapping/types/strip-filename.d.cts | 5 + .../types/strip-filename.d.cts.map | 1 + .../trace-mapping/types/strip-filename.d.mts | 5 + .../types/strip-filename.d.mts.map | 1 + .../trace-mapping/types/trace-mapping.d.cts | 80 + .../types/trace-mapping.d.cts.map | 1 + .../trace-mapping/types/trace-mapping.d.mts | 80 + .../types/trace-mapping.d.mts.map | 1 + .../trace-mapping/types/types.d.cts | 107 + .../trace-mapping/types/types.d.cts.map | 1 + .../trace-mapping/types/types.d.mts | 107 + .../trace-mapping/types/types.d.mts.map | 1 + .../node_modules/any-promise/.jshintrc | 4 + .../node_modules/any-promise/.npmignore | 7 + .../sucrase/node_modules/any-promise/LICENSE | 19 + .../node_modules/any-promise/README.md | 161 + .../any-promise/implementation.d.ts | 3 + .../any-promise/implementation.js | 1 + .../node_modules/any-promise/index.d.ts | 73 + .../sucrase/node_modules/any-promise/index.js | 1 + .../node_modules/any-promise/loader.js | 78 + .../node_modules/any-promise/optional.js | 6 + .../node_modules/any-promise/package.json | 45 + .../node_modules/any-promise/register-shim.js | 18 + .../node_modules/any-promise/register.d.ts | 17 + .../node_modules/any-promise/register.js | 94 + .../any-promise/register/bluebird.d.ts | 1 + .../any-promise/register/bluebird.js | 2 + .../any-promise/register/es6-promise.d.ts | 1 + .../any-promise/register/es6-promise.js | 2 + .../any-promise/register/lie.d.ts | 1 + .../node_modules/any-promise/register/lie.js | 2 + .../register/native-promise-only.d.ts | 1 + .../register/native-promise-only.js | 2 + .../any-promise/register/pinkie.d.ts | 1 + .../any-promise/register/pinkie.js | 2 + .../any-promise/register/promise.d.ts | 1 + .../any-promise/register/promise.js | 2 + .../node_modules/any-promise/register/q.d.ts | 1 + .../node_modules/any-promise/register/q.js | 2 + .../any-promise/register/rsvp.d.ts | 1 + .../node_modules/any-promise/register/rsvp.js | 2 + .../any-promise/register/vow.d.ts | 1 + .../node_modules/any-promise/register/vow.js | 2 + .../any-promise/register/when.d.ts | 1 + .../node_modules/any-promise/register/when.js | 2 + .../node_modules/commander/CHANGELOG.md | 436 + .../sucrase/node_modules/commander/LICENSE | 22 + .../sucrase/node_modules/commander/Readme.md | 713 + .../sucrase/node_modules/commander/index.js | 1649 +++ .../node_modules/commander/package.json | 41 + .../node_modules/commander/typings/index.d.ts | 311 + .../node_modules/lines-and-columns/LICENSE | 21 + .../node_modules/lines-and-columns/README.md | 33 + .../lines-and-columns/package.json | 49 + .../sucrase/node_modules/mz/HISTORY.md | 66 + .../sucrase/node_modules/mz/LICENSE | 22 + .../sucrase/node_modules/mz/README.md | 106 + .../sucrase/node_modules/mz/child_process.js | 8 + .../sucrase/node_modules/mz/crypto.js | 9 + .../sucrase/node_modules/mz/dns.js | 16 + .../sucrase/node_modules/mz/fs.js | 62 + .../sucrase/node_modules/mz/index.js | 8 + .../sucrase/node_modules/mz/package.json | 44 + .../sucrase/node_modules/mz/readline.js | 64 + .../sucrase/node_modules/mz/zlib.js | 13 + .../node_modules/object-assign/index.js | 90 + .../node_modules/object-assign/license | 21 + .../node_modules/object-assign/package.json | 42 + .../node_modules/object-assign/readme.md | 61 + .../sucrase/node_modules/pirates/LICENSE | 21 + .../sucrase/node_modules/pirates/README.md | 73 + .../sucrase/node_modules/pirates/index.d.ts | 82 + .../sucrase/node_modules/pirates/package.json | 43 + .../node_modules/thenify-all/History.md | 11 + .../sucrase/node_modules/thenify-all/LICENSE | 22 + .../node_modules/thenify-all/README.md | 66 + .../sucrase/node_modules/thenify-all/index.js | 73 + .../node_modules/thenify-all/package.json | 34 + .../sucrase/node_modules/thenify/History.md | 11 + .../sucrase/node_modules/thenify/LICENSE | 22 + .../sucrase/node_modules/thenify/README.md | 120 + .../sucrase/node_modules/thenify/index.js | 77 + .../sucrase/node_modules/thenify/package.json | 31 + .../node_modules/ts-interface-checker/LICENSE | 201 + .../ts-interface-checker/README.md | 185 + .../ts-interface-checker/package.json | 60 + .../node_modules/sucrase/package.json | 88 + .../node_modules/sucrase/register/index.js | 1 + .../node_modules/sucrase/register/js.js | 1 + .../node_modules/sucrase/register/jsx.js | 1 + .../register/ts-legacy-module-interop.js | 1 + .../node_modules/sucrase/register/ts.js | 1 + .../register/tsx-legacy-module-interop.js | 1 + .../node_modules/sucrase/register/tsx.js | 1 + .../sucrase/ts-node-plugin/index.js | 83 + sdk/typescript/node_modules/tinybench/LICENSE | 21 + .../node_modules/tinybench/README.md | 422 + .../node_modules/tinybench/package.json | 27 + sdk/typescript/node_modules/tinyexec/LICENSE | 21 + .../node_modules/tinyexec/README.md | 256 + .../node_modules/tinyexec/package.json | 66 + .../node_modules/tinyglobby/LICENSE | 21 + .../node_modules/tinyglobby/README.md | 25 + .../tinyglobby/node_modules/fdir/LICENSE | 7 + .../tinyglobby/node_modules/fdir/README.md | 91 + .../tinyglobby/node_modules/fdir/package.json | 103 + .../tinyglobby/node_modules/picomatch/LICENSE | 21 + .../node_modules/picomatch/README.md | 738 + .../node_modules/picomatch/index.js | 17 + .../node_modules/picomatch/package.json | 83 + .../node_modules/picomatch/posix.js | 3 + .../node_modules/tinyglobby/package.json | 73 + sdk/typescript/node_modules/tinypool/LICENSE | 24 + .../node_modules/tinypool/README.md | 21 + .../node_modules/tinypool/package.json | 30 + sdk/typescript/node_modules/tree-kill/LICENSE | 21 + .../node_modules/tree-kill/README.md | 89 + sdk/typescript/node_modules/tree-kill/cli.js | 14 + .../node_modules/tree-kill/index.d.ts | 13 + .../node_modules/tree-kill/index.js | 118 + .../node_modules/tree-kill/package.json | 51 + sdk/typescript/node_modules/tsup/LICENSE | 21 + sdk/typescript/node_modules/tsup/README.md | 75 + .../node_modules/tsup/assets/cjs_shims.js | 13 + .../node_modules/tsup/assets/esm_shims.js | 9 + .../node_modules/tsup/assets/package.json | 3 + sdk/typescript/node_modules/tsup/package.json | 99 + sdk/typescript/node_modules/tsup/schema.json | 362 + .../node_modules/typescript/LICENSE.txt | 55 + .../node_modules/typescript/README.md | 50 + .../node_modules/typescript/SECURITY.md | 41 + .../typescript/ThirdPartyNoticeText.txt | 193 + .../node_modules/typescript/bin/tsc | 2 + .../node_modules/typescript/bin/tsserver | 2 + .../node_modules/typescript/package.json | 120 + sdk/typescript/node_modules/vite-node/LICENSE | 21 + .../node_modules/vite-node/README.md | 186 + .../vite-node/node_modules/pathe/LICENSE | 44 + .../vite-node/node_modules/pathe/README.md | 69 + .../vite-node/node_modules/pathe/package.json | 48 + .../vite-node/node_modules/pathe/utils.d.ts | 1 + .../node_modules/vite-node/package.json | 95 + .../node_modules/vite-node/vite-node.mjs | 2 + sdk/typescript/node_modules/vite/LICENSE.md | 3423 +++++ sdk/typescript/node_modules/vite/README.md | 20 + .../vite/bin/openChrome.applescript | 95 + sdk/typescript/node_modules/vite/bin/vite.js | 61 + sdk/typescript/node_modules/vite/client.d.ts | 256 + sdk/typescript/node_modules/vite/index.cjs | 60 + sdk/typescript/node_modules/vite/index.d.cts | 6 + .../vite/node_modules/.bin/esbuild | 1 + .../node_modules/@esbuild/linux-x64/README.md | 3 + .../@esbuild/linux-x64/bin/esbuild | Bin 0 -> 9707520 bytes .../@esbuild/linux-x64/package.json | 20 + .../vite/node_modules/esbuild/LICENSE.md | 21 + .../vite/node_modules/esbuild/README.md | 3 + .../vite/node_modules/esbuild/bin/esbuild | Bin 0 -> 9707520 bytes .../vite/node_modules/esbuild/install.js | 285 + .../vite/node_modules/esbuild/package.json | 46 + sdk/typescript/node_modules/vite/package.json | 191 + .../node_modules/vite/types/customEvent.d.ts | 39 + .../node_modules/vite/types/hmrPayload.d.ts | 65 + .../node_modules/vite/types/hot.d.ts | 36 + .../node_modules/vite/types/import-meta.d.ts | 5 + .../node_modules/vite/types/importGlob.d.ts | 75 + .../node_modules/vite/types/importMeta.d.ts | 22 + .../node_modules/vite/types/metadata.d.ts | 10 + .../node_modules/vite/types/package.json | 4 + sdk/typescript/node_modules/vitest/LICENSE.md | 1530 +++ sdk/typescript/node_modules/vitest/README.md | 7 + .../node_modules/vitest/browser.d.ts | 1 + .../node_modules/vitest/config.d.ts | 1 + .../node_modules/vitest/coverage.d.ts | 1 + .../node_modules/vitest/environments.d.ts | 1 + .../node_modules/vitest/execute.d.ts | 1 + .../node_modules/vitest/globals.d.ts | 19 + .../node_modules/vitest/import-meta.d.ts | 5 + .../node_modules/vitest/importMeta.d.ts | 4 + sdk/typescript/node_modules/vitest/index.cjs | 5 + .../node_modules/vitest/index.d.cts | 1 + sdk/typescript/node_modules/vitest/jsdom.d.ts | 6 + sdk/typescript/node_modules/vitest/node.d.ts | 1 + .../vitest/node_modules/pathe/LICENSE | 44 + .../vitest/node_modules/pathe/README.md | 69 + .../vitest/node_modules/pathe/package.json | 48 + .../vitest/node_modules/pathe/utils.d.ts | 1 + .../node_modules/vitest/package.json | 203 + .../node_modules/vitest/reporters.d.ts | 1 + .../node_modules/vitest/runners.d.ts | 1 + .../node_modules/vitest/snapshot.d.ts | 1 + sdk/typescript/node_modules/vitest/suite.d.ts | 1 + .../node_modules/vitest/suppress-warnings.cjs | 23 + sdk/typescript/node_modules/vitest/utils.d.ts | 1 + sdk/typescript/node_modules/vitest/vitest.mjs | 2 + .../node_modules/vitest/workers.d.ts | 1 + .../why-is-node-running/.github/FUNDING.yml | 1 + .../node_modules/why-is-node-running/LICENSE | 21 + .../why-is-node-running/README.md | 104 + .../node_modules/why-is-node-running/cli.js | 18 + .../why-is-node-running/example.js | 15 + .../why-is-node-running/include.js | 3 + .../node_modules/why-is-node-running/index.js | 67 + .../node_modules/siginfo/.travis.yml | 13 + .../node_modules/siginfo/LICENSE | 13 + .../node_modules/siginfo/README.md | 47 + .../node_modules/siginfo/index.js | 20 + .../node_modules/siginfo/package.json | 32 + .../node_modules/siginfo/test.js | 16 + .../node_modules/stackback/.npmignore | 1 + .../node_modules/stackback/.travis.yml | 4 + .../node_modules/stackback/README.md | 41 + .../node_modules/stackback/formatstack.js | 57 + .../node_modules/stackback/index.js | 46 + .../node_modules/stackback/package.json | 23 + .../node_modules/stackback/test.js | 24 + .../why-is-node-running/package.json | 39 + sdk/typescript/package-lock.json | 2925 ++++ sdk/typescript/package.json | 30 + sdk/typescript/src/client.ts | 282 + sdk/typescript/src/errors.ts | 41 + sdk/typescript/src/index.ts | 11 + sdk/typescript/src/types.ts | 78 + sdk/typescript/tsconfig.json | 18 + 921 files changed, 107210 insertions(+) create mode 100644 sdk/typescript/README.md create mode 100644 sdk/typescript/examples/producer.ts create mode 100644 sdk/typescript/examples/worker.ts create mode 120000 sdk/typescript/node_modules/.bin/esbuild create mode 120000 sdk/typescript/node_modules/.bin/rollup create mode 120000 sdk/typescript/node_modules/.bin/sucrase create mode 120000 sdk/typescript/node_modules/.bin/sucrase-node create mode 120000 sdk/typescript/node_modules/.bin/tree-kill create mode 120000 sdk/typescript/node_modules/.bin/tsc create mode 120000 sdk/typescript/node_modules/.bin/tsserver create mode 120000 sdk/typescript/node_modules/.bin/tsup create mode 120000 sdk/typescript/node_modules/.bin/tsup-node create mode 120000 sdk/typescript/node_modules/.bin/vite create mode 120000 sdk/typescript/node_modules/.bin/vite-node create mode 120000 sdk/typescript/node_modules/.bin/vitest create mode 120000 sdk/typescript/node_modules/.bin/why-is-node-running create mode 100644 sdk/typescript/node_modules/.package-lock.json create mode 100644 sdk/typescript/node_modules/@vitest/expect/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/expect/README.md create mode 100644 sdk/typescript/node_modules/@vitest/expect/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/expect/package.json create mode 100644 sdk/typescript/node_modules/@vitest/runner/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/runner/README.md create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/async-hooks-stub.js create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/index.js create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/license create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/package.json create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/readme.md create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/README.md create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/package.json create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/utils.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/index.js create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/license create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/package.json create mode 100644 sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/readme.md create mode 100644 sdk/typescript/node_modules/@vitest/runner/package.json create mode 100644 sdk/typescript/node_modules/@vitest/runner/types.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/runner/utils.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/README.md create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/environment.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/manager.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/README.md create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/package.json create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/compiler.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/compiler.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/index.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/errors.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/errors.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/index.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/license create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/package.json create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/readme.md create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/index.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/system.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/system.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/typebox.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/typebox.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/cast.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/cast.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/check.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/check.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/clone.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/clone.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/convert.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/convert.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/create.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/create.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/delta.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/delta.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/equal.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/equal.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/hash.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/hash.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/index.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/is.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/is.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/mutate.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/mutate.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/pointer.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/pointer.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/value.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/value.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/index.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/license create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/package.json create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/readme.md create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/README.md create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/package.json create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/utils.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/README.md create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/package.json create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/README.md create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/cjs/react-is.development.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/cjs/react-is.production.min.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/index.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/package.json create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/umd/react-is.development.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/umd/react-is.production.min.js create mode 100644 sdk/typescript/node_modules/@vitest/snapshot/package.json create mode 100644 sdk/typescript/node_modules/@vitest/spy/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/spy/README.md create mode 100644 sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/LICENCE create mode 100644 sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/README.md create mode 100644 sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/package.json create mode 100644 sdk/typescript/node_modules/@vitest/spy/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/diff.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/error.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/helpers.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/README.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/compiler.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/compiler.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/errors.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/errors.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/license create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/readme.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/system.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/system.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/typebox.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/typebox.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/cast.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/cast.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/check.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/check.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/clone.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/clone.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/convert.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/convert.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/create.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/create.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/delta.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/delta.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/equal.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/equal.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/hash.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/hash.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/is.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/is.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/mutate.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/mutate.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/pointer.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/pointer.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/value.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/value.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/README.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/flow.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/license create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/readme.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/README.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/README.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/async.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/sync.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/walker.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/async.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/index.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/sync.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/walker.d.ts create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/README.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/get-func-name.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/README.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/loupe.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/README.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/LICENSE create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/README.md create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/cjs/react-is.development.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/cjs/react-is.production.min.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/index.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/package.json create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/umd/react-is.development.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/umd/react-is.production.min.js create mode 100644 sdk/typescript/node_modules/@vitest/utils/package.json create mode 100644 sdk/typescript/node_modules/acorn-walk/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/acorn-walk/LICENSE create mode 100644 sdk/typescript/node_modules/acorn-walk/README.md create mode 120000 sdk/typescript/node_modules/acorn-walk/node_modules/.bin/acorn create mode 100644 sdk/typescript/node_modules/acorn-walk/node_modules/acorn/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/acorn-walk/node_modules/acorn/LICENSE create mode 100644 sdk/typescript/node_modules/acorn-walk/node_modules/acorn/README.md create mode 100644 sdk/typescript/node_modules/acorn-walk/node_modules/acorn/bin/acorn create mode 100644 sdk/typescript/node_modules/acorn-walk/node_modules/acorn/package.json create mode 100644 sdk/typescript/node_modules/acorn-walk/package.json create mode 100644 sdk/typescript/node_modules/bundle-require/LICENSE create mode 100644 sdk/typescript/node_modules/bundle-require/README.md create mode 100644 sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/LICENSE create mode 100644 sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/README.md create mode 100644 sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/package.json create mode 100644 sdk/typescript/node_modules/bundle-require/package.json create mode 100644 sdk/typescript/node_modules/cac/LICENSE create mode 100644 sdk/typescript/node_modules/cac/README.md create mode 100644 sdk/typescript/node_modules/cac/deno/CAC.ts create mode 100644 sdk/typescript/node_modules/cac/deno/Command.ts create mode 100644 sdk/typescript/node_modules/cac/deno/Option.ts create mode 100644 sdk/typescript/node_modules/cac/deno/deno.ts create mode 100644 sdk/typescript/node_modules/cac/deno/index.ts create mode 100644 sdk/typescript/node_modules/cac/deno/utils.ts create mode 100644 sdk/typescript/node_modules/cac/index-compat.js create mode 100644 sdk/typescript/node_modules/cac/mod.js create mode 100644 sdk/typescript/node_modules/cac/mod.ts create mode 100644 sdk/typescript/node_modules/cac/package.json create mode 100644 sdk/typescript/node_modules/chai/CODEOWNERS create mode 100644 sdk/typescript/node_modules/chai/CODE_OF_CONDUCT.md create mode 100644 sdk/typescript/node_modules/chai/CONTRIBUTING.md create mode 100644 sdk/typescript/node_modules/chai/History.md create mode 100644 sdk/typescript/node_modules/chai/LICENSE create mode 100644 sdk/typescript/node_modules/chai/README.md create mode 100644 sdk/typescript/node_modules/chai/ReleaseNotes.md create mode 100644 sdk/typescript/node_modules/chai/bower.json create mode 100644 sdk/typescript/node_modules/chai/chai.js create mode 100644 sdk/typescript/node_modules/chai/index.js create mode 100644 sdk/typescript/node_modules/chai/index.mjs create mode 100644 sdk/typescript/node_modules/chai/karma.conf.js create mode 100644 sdk/typescript/node_modules/chai/karma.sauce.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/assertion-error/History.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/assertion-error/README.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/assertion-error/index.d.ts create mode 100644 sdk/typescript/node_modules/chai/node_modules/assertion-error/index.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/assertion-error/package.json create mode 100644 sdk/typescript/node_modules/chai/node_modules/check-error/LICENSE create mode 100644 sdk/typescript/node_modules/chai/node_modules/check-error/README.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/check-error/check-error.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/check-error/index.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/check-error/package.json create mode 100644 sdk/typescript/node_modules/chai/node_modules/deep-eql/LICENSE create mode 100644 sdk/typescript/node_modules/chai/node_modules/deep-eql/README.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/deep-eql/deep-eql.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/deep-eql/index.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/deep-eql/package.json create mode 100644 sdk/typescript/node_modules/chai/node_modules/get-func-name/LICENSE create mode 100644 sdk/typescript/node_modules/chai/node_modules/get-func-name/README.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/get-func-name/get-func-name.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/get-func-name/index.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/get-func-name/package.json create mode 100644 sdk/typescript/node_modules/chai/node_modules/loupe/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/loupe/LICENSE create mode 100644 sdk/typescript/node_modules/chai/node_modules/loupe/README.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/loupe/index.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/loupe/loupe.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/loupe/package.json create mode 100644 sdk/typescript/node_modules/chai/node_modules/pathval/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/pathval/LICENSE create mode 100644 sdk/typescript/node_modules/chai/node_modules/pathval/README.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/pathval/index.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/pathval/package.json create mode 100644 sdk/typescript/node_modules/chai/node_modules/pathval/pathval.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/type-detect/LICENSE create mode 100644 sdk/typescript/node_modules/chai/node_modules/type-detect/README.md create mode 100644 sdk/typescript/node_modules/chai/node_modules/type-detect/index.d.ts create mode 100644 sdk/typescript/node_modules/chai/node_modules/type-detect/index.js create mode 100644 sdk/typescript/node_modules/chai/node_modules/type-detect/index.ts create mode 100644 sdk/typescript/node_modules/chai/node_modules/type-detect/package.json create mode 100644 sdk/typescript/node_modules/chai/node_modules/type-detect/type-detect.js create mode 100644 sdk/typescript/node_modules/chai/package.json create mode 100644 sdk/typescript/node_modules/chai/register-assert.js create mode 100644 sdk/typescript/node_modules/chai/register-expect.js create mode 100644 sdk/typescript/node_modules/chai/register-should.js create mode 100644 sdk/typescript/node_modules/chai/sauce.browsers.js create mode 100644 sdk/typescript/node_modules/chokidar/LICENSE create mode 100644 sdk/typescript/node_modules/chokidar/README.md create mode 100644 sdk/typescript/node_modules/chokidar/esm/handler.d.ts create mode 100644 sdk/typescript/node_modules/chokidar/esm/handler.js create mode 100644 sdk/typescript/node_modules/chokidar/esm/index.d.ts create mode 100644 sdk/typescript/node_modules/chokidar/esm/index.js create mode 100644 sdk/typescript/node_modules/chokidar/esm/package.json create mode 100644 sdk/typescript/node_modules/chokidar/handler.d.ts create mode 100644 sdk/typescript/node_modules/chokidar/handler.js create mode 100644 sdk/typescript/node_modules/chokidar/index.d.ts create mode 100644 sdk/typescript/node_modules/chokidar/index.js create mode 100644 sdk/typescript/node_modules/chokidar/node_modules/readdirp/LICENSE create mode 100644 sdk/typescript/node_modules/chokidar/node_modules/readdirp/README.md create mode 100644 sdk/typescript/node_modules/chokidar/node_modules/readdirp/esm/index.d.ts create mode 100644 sdk/typescript/node_modules/chokidar/node_modules/readdirp/esm/index.js create mode 100644 sdk/typescript/node_modules/chokidar/node_modules/readdirp/esm/package.json create mode 100644 sdk/typescript/node_modules/chokidar/node_modules/readdirp/index.d.ts create mode 100644 sdk/typescript/node_modules/chokidar/node_modules/readdirp/index.js create mode 100644 sdk/typescript/node_modules/chokidar/node_modules/readdirp/package.json create mode 100644 sdk/typescript/node_modules/chokidar/package.json create mode 100644 sdk/typescript/node_modules/consola/LICENSE create mode 100644 sdk/typescript/node_modules/consola/README.md create mode 100644 sdk/typescript/node_modules/consola/basic.d.ts create mode 100644 sdk/typescript/node_modules/consola/browser.d.ts create mode 100644 sdk/typescript/node_modules/consola/core.d.ts create mode 100644 sdk/typescript/node_modules/consola/package.json create mode 100644 sdk/typescript/node_modules/consola/utils.d.ts create mode 100644 sdk/typescript/node_modules/debug/LICENSE create mode 100644 sdk/typescript/node_modules/debug/README.md create mode 100644 sdk/typescript/node_modules/debug/node_modules/ms/index.js create mode 100644 sdk/typescript/node_modules/debug/node_modules/ms/license.md create mode 100644 sdk/typescript/node_modules/debug/node_modules/ms/package.json create mode 100644 sdk/typescript/node_modules/debug/node_modules/ms/readme.md create mode 100644 sdk/typescript/node_modules/debug/package.json create mode 100644 sdk/typescript/node_modules/debug/src/browser.js create mode 100644 sdk/typescript/node_modules/debug/src/common.js create mode 100644 sdk/typescript/node_modules/debug/src/index.js create mode 100644 sdk/typescript/node_modules/debug/src/node.js create mode 100644 sdk/typescript/node_modules/esbuild/LICENSE.md create mode 100644 sdk/typescript/node_modules/esbuild/README.md create mode 100644 sdk/typescript/node_modules/esbuild/bin/esbuild create mode 100644 sdk/typescript/node_modules/esbuild/install.js create mode 100644 sdk/typescript/node_modules/esbuild/node_modules/@esbuild/linux-x64/README.md create mode 100644 sdk/typescript/node_modules/esbuild/node_modules/@esbuild/linux-x64/bin/esbuild create mode 100644 sdk/typescript/node_modules/esbuild/node_modules/@esbuild/linux-x64/package.json create mode 100644 sdk/typescript/node_modules/esbuild/package.json create mode 100644 sdk/typescript/node_modules/execa/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/index.js create mode 100644 sdk/typescript/node_modules/execa/license create mode 120000 sdk/typescript/node_modules/execa/node_modules/.bin/node-which create mode 100644 sdk/typescript/node_modules/execa/node_modules/cross-spawn/LICENSE create mode 100644 sdk/typescript/node_modules/execa/node_modules/cross-spawn/README.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/cross-spawn/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/cross-spawn/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/source/array-buffer.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/source/array.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/source/buffer.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/source/contents.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/source/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/source/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/source/string.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/get-stream/source/utils.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/human-signals/LICENSE create mode 100644 sdk/typescript/node_modules/execa/node_modules/human-signals/README.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/human-signals/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/is-stream/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/node_modules/is-stream/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/is-stream/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/is-stream/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/is-stream/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/isexe/.npmignore create mode 100644 sdk/typescript/node_modules/execa/node_modules/isexe/LICENSE create mode 100644 sdk/typescript/node_modules/execa/node_modules/isexe/README.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/isexe/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/isexe/mode.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/isexe/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/isexe/test/basic.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/isexe/windows.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/merge-stream/LICENSE create mode 100644 sdk/typescript/node_modules/execa/node_modules/merge-stream/README.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/merge-stream/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/merge-stream/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/mimic-fn/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/node_modules/mimic-fn/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/mimic-fn/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/mimic-fn/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/mimic-fn/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/node_modules/path-key/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/node_modules/path-key/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/node_modules/path-key/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/node_modules/path-key/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/node_modules/path-key/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/npm-run-path/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/onetime/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/node_modules/onetime/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/onetime/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/onetime/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/onetime/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/path-key/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/node_modules/path-key/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/path-key/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/path-key/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/path-key/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-command/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-command/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-command/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-command/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-regex/index.d.ts create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-regex/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-regex/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-regex/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/shebang-regex/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/signal-exit/LICENSE.txt create mode 100644 sdk/typescript/node_modules/execa/node_modules/signal-exit/README.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/signal-exit/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/strip-final-newline/index.js create mode 100644 sdk/typescript/node_modules/execa/node_modules/strip-final-newline/license create mode 100644 sdk/typescript/node_modules/execa/node_modules/strip-final-newline/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/strip-final-newline/readme.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/which/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/which/LICENSE create mode 100644 sdk/typescript/node_modules/execa/node_modules/which/README.md create mode 100644 sdk/typescript/node_modules/execa/node_modules/which/bin/node-which create mode 100644 sdk/typescript/node_modules/execa/node_modules/which/package.json create mode 100644 sdk/typescript/node_modules/execa/node_modules/which/which.js create mode 100644 sdk/typescript/node_modules/execa/package.json create mode 100644 sdk/typescript/node_modules/execa/readme.md create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/LICENSE create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/README.md create mode 120000 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/.bin/acorn create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/acorn/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/acorn/LICENSE create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/acorn/README.md create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/acorn/bin/acorn create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/acorn/package.json create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/confbox/LICENSE create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/confbox/README.md create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/confbox/json5.d.ts create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/confbox/jsonc.d.ts create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/confbox/package.json create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/confbox/toml.d.ts create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/confbox/yaml.d.ts create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/mlly/LICENSE create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/mlly/README.md create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/mlly/package.json create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/pathe/LICENSE create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/pathe/README.md create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/pathe/package.json create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/pathe/utils.d.ts create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/pkg-types/LICENSE create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/pkg-types/README.md create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/pkg-types/package.json create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/ufo/LICENSE create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/ufo/README.md create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/node_modules/ufo/package.json create mode 100644 sdk/typescript/node_modules/fix-dts-default-cjs-exports/package.json create mode 100644 sdk/typescript/node_modules/joycon/LICENSE create mode 100644 sdk/typescript/node_modules/joycon/README.md create mode 100644 sdk/typescript/node_modules/joycon/package.json create mode 100644 sdk/typescript/node_modules/joycon/types/index.d.ts create mode 100644 sdk/typescript/node_modules/local-pkg/LICENSE create mode 100644 sdk/typescript/node_modules/local-pkg/README.md create mode 120000 sdk/typescript/node_modules/local-pkg/node_modules/.bin/acorn create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/acorn/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/acorn/LICENSE create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/acorn/README.md create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/acorn/bin/acorn create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/acorn/package.json create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/confbox/LICENSE create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/confbox/README.md create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/confbox/json5.d.ts create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/confbox/jsonc.d.ts create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/confbox/package.json create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/confbox/toml.d.ts create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/confbox/yaml.d.ts create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/mlly/LICENSE create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/mlly/README.md create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/mlly/package.json create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/pathe/LICENSE create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/pathe/README.md create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/pathe/package.json create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/pathe/utils.d.ts create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/pkg-types/LICENSE create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/pkg-types/README.md create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/pkg-types/package.json create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/ufo/LICENSE create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/ufo/README.md create mode 100644 sdk/typescript/node_modules/local-pkg/node_modules/ufo/package.json create mode 100644 sdk/typescript/node_modules/local-pkg/package.json create mode 100644 sdk/typescript/node_modules/magic-string/LICENSE create mode 100644 sdk/typescript/node_modules/magic-string/README.md create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/LICENSE create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/README.md create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/package.json create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/strings.ts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts create mode 100644 sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map create mode 100644 sdk/typescript/node_modules/magic-string/package.json create mode 100644 sdk/typescript/node_modules/picocolors/LICENSE create mode 100644 sdk/typescript/node_modules/picocolors/README.md create mode 100644 sdk/typescript/node_modules/picocolors/package.json create mode 100644 sdk/typescript/node_modules/picocolors/picocolors.browser.js create mode 100644 sdk/typescript/node_modules/picocolors/picocolors.d.ts create mode 100644 sdk/typescript/node_modules/picocolors/picocolors.js create mode 100644 sdk/typescript/node_modules/picocolors/types.d.ts create mode 100644 sdk/typescript/node_modules/postcss-load-config/LICENSE create mode 100644 sdk/typescript/node_modules/postcss-load-config/README.md create mode 100644 sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/LICENSE create mode 100644 sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/package.json create mode 100644 sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/readme.md create mode 100644 sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/src/index.d.ts create mode 100644 sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/src/index.js create mode 100644 sdk/typescript/node_modules/postcss-load-config/package.json create mode 100644 sdk/typescript/node_modules/postcss-load-config/src/index.d.ts create mode 100644 sdk/typescript/node_modules/postcss-load-config/src/index.js create mode 100644 sdk/typescript/node_modules/postcss-load-config/src/options.js create mode 100644 sdk/typescript/node_modules/postcss-load-config/src/plugins.js create mode 100644 sdk/typescript/node_modules/postcss-load-config/src/req.js create mode 100644 sdk/typescript/node_modules/postcss/LICENSE create mode 100644 sdk/typescript/node_modules/postcss/README.md create mode 120000 sdk/typescript/node_modules/postcss/node_modules/.bin/nanoid create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/LICENSE create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/README.md create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.browser.cjs create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.browser.js create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.cjs create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.d.ts create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.js create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.native.js create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/async/package.json create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/bin/nanoid.cjs create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/index.browser.cjs create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/index.browser.js create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/index.cjs create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/index.d.cts create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/index.d.ts create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/index.js create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/nanoid.js create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.cjs create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.d.ts create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.js create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/package.json create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/package.json create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/index.cjs create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/index.js create mode 100644 sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/package.json create mode 100644 sdk/typescript/node_modules/postcss/node_modules/source-map-js/LICENSE create mode 100644 sdk/typescript/node_modules/postcss/node_modules/source-map-js/README.md create mode 100644 sdk/typescript/node_modules/postcss/node_modules/source-map-js/package.json create mode 100644 sdk/typescript/node_modules/postcss/node_modules/source-map-js/source-map.d.ts create mode 100644 sdk/typescript/node_modules/postcss/node_modules/source-map-js/source-map.js create mode 100644 sdk/typescript/node_modules/postcss/package.json create mode 100644 sdk/typescript/node_modules/resolve-from/index.d.ts create mode 100644 sdk/typescript/node_modules/resolve-from/index.js create mode 100644 sdk/typescript/node_modules/resolve-from/license create mode 100644 sdk/typescript/node_modules/resolve-from/package.json create mode 100644 sdk/typescript/node_modules/resolve-from/readme.md create mode 100644 sdk/typescript/node_modules/rollup/LICENSE.md create mode 100644 sdk/typescript/node_modules/rollup/README.md create mode 100644 sdk/typescript/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu/README.md create mode 100644 sdk/typescript/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu/package.json create mode 100644 sdk/typescript/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu/rollup.linux-x64-gnu.node create mode 100644 sdk/typescript/node_modules/rollup/node_modules/@types/estree/LICENSE create mode 100644 sdk/typescript/node_modules/rollup/node_modules/@types/estree/README.md create mode 100644 sdk/typescript/node_modules/rollup/node_modules/@types/estree/flow.d.ts create mode 100644 sdk/typescript/node_modules/rollup/node_modules/@types/estree/index.d.ts create mode 100644 sdk/typescript/node_modules/rollup/node_modules/@types/estree/package.json create mode 100644 sdk/typescript/node_modules/rollup/package.json create mode 100644 sdk/typescript/node_modules/source-map/LICENSE create mode 100644 sdk/typescript/node_modules/source-map/README.md create mode 100644 sdk/typescript/node_modules/source-map/package.json create mode 100644 sdk/typescript/node_modules/source-map/source-map.d.ts create mode 100644 sdk/typescript/node_modules/source-map/source-map.js create mode 100644 sdk/typescript/node_modules/std-env/LICENCE create mode 100644 sdk/typescript/node_modules/std-env/README.md create mode 100644 sdk/typescript/node_modules/std-env/package.json create mode 100644 sdk/typescript/node_modules/strip-literal/LICENSE create mode 100644 sdk/typescript/node_modules/strip-literal/README.md create mode 100644 sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/LICENSE create mode 100644 sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/README.md create mode 100644 sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/index.d.ts create mode 100644 sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/index.js create mode 100644 sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/package.json create mode 100644 sdk/typescript/node_modules/strip-literal/package.json create mode 100644 sdk/typescript/node_modules/sucrase/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/README.md create mode 100644 sdk/typescript/node_modules/sucrase/bin/sucrase create mode 100644 sdk/typescript/node_modules/sucrase/bin/sucrase-node create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/set-array.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/types.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/strings.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/binary-search.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/by-source.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/resolve.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/sort.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/types.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.cts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.mts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/.jshintrc create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/.npmignore create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/implementation.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/implementation.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/index.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/index.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/loader.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/optional.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register-shim.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/bluebird.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/bluebird.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/es6-promise.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/es6-promise.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/lie.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/lie.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/native-promise-only.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/native-promise-only.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/pinkie.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/pinkie.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/promise.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/promise.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/q.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/q.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/rsvp.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/rsvp.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/vow.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/vow.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/when.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/when.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/commander/CHANGELOG.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/commander/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/commander/Readme.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/commander/index.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/commander/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/commander/typings/index.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/HISTORY.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/child_process.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/crypto.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/dns.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/fs.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/index.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/readline.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/mz/zlib.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/object-assign/index.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/object-assign/license create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/object-assign/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/object-assign/readme.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/pirates/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/pirates/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/pirates/index.d.ts create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/pirates/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify-all/History.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify-all/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify-all/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify-all/index.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify-all/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify/History.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify/index.js create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/thenify/package.json create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/LICENSE create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/README.md create mode 100644 sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/package.json create mode 100644 sdk/typescript/node_modules/sucrase/package.json create mode 100644 sdk/typescript/node_modules/sucrase/register/index.js create mode 100644 sdk/typescript/node_modules/sucrase/register/js.js create mode 100644 sdk/typescript/node_modules/sucrase/register/jsx.js create mode 100644 sdk/typescript/node_modules/sucrase/register/ts-legacy-module-interop.js create mode 100644 sdk/typescript/node_modules/sucrase/register/ts.js create mode 100644 sdk/typescript/node_modules/sucrase/register/tsx-legacy-module-interop.js create mode 100644 sdk/typescript/node_modules/sucrase/register/tsx.js create mode 100644 sdk/typescript/node_modules/sucrase/ts-node-plugin/index.js create mode 100644 sdk/typescript/node_modules/tinybench/LICENSE create mode 100644 sdk/typescript/node_modules/tinybench/README.md create mode 100644 sdk/typescript/node_modules/tinybench/package.json create mode 100644 sdk/typescript/node_modules/tinyexec/LICENSE create mode 100644 sdk/typescript/node_modules/tinyexec/README.md create mode 100644 sdk/typescript/node_modules/tinyexec/package.json create mode 100644 sdk/typescript/node_modules/tinyglobby/LICENSE create mode 100644 sdk/typescript/node_modules/tinyglobby/README.md create mode 100644 sdk/typescript/node_modules/tinyglobby/node_modules/fdir/LICENSE create mode 100644 sdk/typescript/node_modules/tinyglobby/node_modules/fdir/README.md create mode 100644 sdk/typescript/node_modules/tinyglobby/node_modules/fdir/package.json create mode 100644 sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/LICENSE create mode 100644 sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/README.md create mode 100644 sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/index.js create mode 100644 sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/package.json create mode 100644 sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/posix.js create mode 100644 sdk/typescript/node_modules/tinyglobby/package.json create mode 100644 sdk/typescript/node_modules/tinypool/LICENSE create mode 100644 sdk/typescript/node_modules/tinypool/README.md create mode 100644 sdk/typescript/node_modules/tinypool/package.json create mode 100644 sdk/typescript/node_modules/tree-kill/LICENSE create mode 100644 sdk/typescript/node_modules/tree-kill/README.md create mode 100644 sdk/typescript/node_modules/tree-kill/cli.js create mode 100644 sdk/typescript/node_modules/tree-kill/index.d.ts create mode 100644 sdk/typescript/node_modules/tree-kill/index.js create mode 100644 sdk/typescript/node_modules/tree-kill/package.json create mode 100644 sdk/typescript/node_modules/tsup/LICENSE create mode 100644 sdk/typescript/node_modules/tsup/README.md create mode 100644 sdk/typescript/node_modules/tsup/assets/cjs_shims.js create mode 100644 sdk/typescript/node_modules/tsup/assets/esm_shims.js create mode 100644 sdk/typescript/node_modules/tsup/assets/package.json create mode 100644 sdk/typescript/node_modules/tsup/package.json create mode 100644 sdk/typescript/node_modules/tsup/schema.json create mode 100644 sdk/typescript/node_modules/typescript/LICENSE.txt create mode 100644 sdk/typescript/node_modules/typescript/README.md create mode 100644 sdk/typescript/node_modules/typescript/SECURITY.md create mode 100644 sdk/typescript/node_modules/typescript/ThirdPartyNoticeText.txt create mode 100644 sdk/typescript/node_modules/typescript/bin/tsc create mode 100644 sdk/typescript/node_modules/typescript/bin/tsserver create mode 100644 sdk/typescript/node_modules/typescript/package.json create mode 100644 sdk/typescript/node_modules/vite-node/LICENSE create mode 100644 sdk/typescript/node_modules/vite-node/README.md create mode 100644 sdk/typescript/node_modules/vite-node/node_modules/pathe/LICENSE create mode 100644 sdk/typescript/node_modules/vite-node/node_modules/pathe/README.md create mode 100644 sdk/typescript/node_modules/vite-node/node_modules/pathe/package.json create mode 100644 sdk/typescript/node_modules/vite-node/node_modules/pathe/utils.d.ts create mode 100644 sdk/typescript/node_modules/vite-node/package.json create mode 100644 sdk/typescript/node_modules/vite-node/vite-node.mjs create mode 100644 sdk/typescript/node_modules/vite/LICENSE.md create mode 100644 sdk/typescript/node_modules/vite/README.md create mode 100644 sdk/typescript/node_modules/vite/bin/openChrome.applescript create mode 100644 sdk/typescript/node_modules/vite/bin/vite.js create mode 100644 sdk/typescript/node_modules/vite/client.d.ts create mode 100644 sdk/typescript/node_modules/vite/index.cjs create mode 100644 sdk/typescript/node_modules/vite/index.d.cts create mode 120000 sdk/typescript/node_modules/vite/node_modules/.bin/esbuild create mode 100644 sdk/typescript/node_modules/vite/node_modules/@esbuild/linux-x64/README.md create mode 100644 sdk/typescript/node_modules/vite/node_modules/@esbuild/linux-x64/bin/esbuild create mode 100644 sdk/typescript/node_modules/vite/node_modules/@esbuild/linux-x64/package.json create mode 100644 sdk/typescript/node_modules/vite/node_modules/esbuild/LICENSE.md create mode 100644 sdk/typescript/node_modules/vite/node_modules/esbuild/README.md create mode 100644 sdk/typescript/node_modules/vite/node_modules/esbuild/bin/esbuild create mode 100644 sdk/typescript/node_modules/vite/node_modules/esbuild/install.js create mode 100644 sdk/typescript/node_modules/vite/node_modules/esbuild/package.json create mode 100644 sdk/typescript/node_modules/vite/package.json create mode 100644 sdk/typescript/node_modules/vite/types/customEvent.d.ts create mode 100644 sdk/typescript/node_modules/vite/types/hmrPayload.d.ts create mode 100644 sdk/typescript/node_modules/vite/types/hot.d.ts create mode 100644 sdk/typescript/node_modules/vite/types/import-meta.d.ts create mode 100644 sdk/typescript/node_modules/vite/types/importGlob.d.ts create mode 100644 sdk/typescript/node_modules/vite/types/importMeta.d.ts create mode 100644 sdk/typescript/node_modules/vite/types/metadata.d.ts create mode 100644 sdk/typescript/node_modules/vite/types/package.json create mode 100644 sdk/typescript/node_modules/vitest/LICENSE.md create mode 100644 sdk/typescript/node_modules/vitest/README.md create mode 100644 sdk/typescript/node_modules/vitest/browser.d.ts create mode 100644 sdk/typescript/node_modules/vitest/config.d.ts create mode 100644 sdk/typescript/node_modules/vitest/coverage.d.ts create mode 100644 sdk/typescript/node_modules/vitest/environments.d.ts create mode 100644 sdk/typescript/node_modules/vitest/execute.d.ts create mode 100644 sdk/typescript/node_modules/vitest/globals.d.ts create mode 100644 sdk/typescript/node_modules/vitest/import-meta.d.ts create mode 100644 sdk/typescript/node_modules/vitest/importMeta.d.ts create mode 100644 sdk/typescript/node_modules/vitest/index.cjs create mode 100644 sdk/typescript/node_modules/vitest/index.d.cts create mode 100644 sdk/typescript/node_modules/vitest/jsdom.d.ts create mode 100644 sdk/typescript/node_modules/vitest/node.d.ts create mode 100644 sdk/typescript/node_modules/vitest/node_modules/pathe/LICENSE create mode 100644 sdk/typescript/node_modules/vitest/node_modules/pathe/README.md create mode 100644 sdk/typescript/node_modules/vitest/node_modules/pathe/package.json create mode 100644 sdk/typescript/node_modules/vitest/node_modules/pathe/utils.d.ts create mode 100644 sdk/typescript/node_modules/vitest/package.json create mode 100644 sdk/typescript/node_modules/vitest/reporters.d.ts create mode 100644 sdk/typescript/node_modules/vitest/runners.d.ts create mode 100644 sdk/typescript/node_modules/vitest/snapshot.d.ts create mode 100644 sdk/typescript/node_modules/vitest/suite.d.ts create mode 100644 sdk/typescript/node_modules/vitest/suppress-warnings.cjs create mode 100644 sdk/typescript/node_modules/vitest/utils.d.ts create mode 100644 sdk/typescript/node_modules/vitest/vitest.mjs create mode 100644 sdk/typescript/node_modules/vitest/workers.d.ts create mode 100644 sdk/typescript/node_modules/why-is-node-running/.github/FUNDING.yml create mode 100644 sdk/typescript/node_modules/why-is-node-running/LICENSE create mode 100644 sdk/typescript/node_modules/why-is-node-running/README.md create mode 100644 sdk/typescript/node_modules/why-is-node-running/cli.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/example.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/include.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/index.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/siginfo/.travis.yml create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/siginfo/LICENSE create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/siginfo/README.md create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/siginfo/index.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/siginfo/package.json create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/siginfo/test.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/stackback/.npmignore create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/stackback/.travis.yml create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/stackback/README.md create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/stackback/formatstack.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/stackback/index.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/stackback/package.json create mode 100644 sdk/typescript/node_modules/why-is-node-running/node_modules/stackback/test.js create mode 100644 sdk/typescript/node_modules/why-is-node-running/package.json create mode 100644 sdk/typescript/package-lock.json create mode 100644 sdk/typescript/package.json create mode 100644 sdk/typescript/src/client.ts create mode 100644 sdk/typescript/src/errors.ts create mode 100644 sdk/typescript/src/index.ts create mode 100644 sdk/typescript/src/types.ts create mode 100644 sdk/typescript/tsconfig.json diff --git a/sdk/typescript/README.md b/sdk/typescript/README.md new file mode 100644 index 0000000..5875989 --- /dev/null +++ b/sdk/typescript/README.md @@ -0,0 +1,58 @@ +# OpenQueue TypeScript SDK + +TypeScript client for OpenQueue. + +## Installation + +```bash +npm install @ravin-d-27/openqueue +``` + +## Usage + +### As a Producer + +```typescript +import { OpenQueue } from "@ravin-d-27/openqueue"; + +const client = new OpenQueue("https://queue.example.com", "your-api-token"); + +const jobId = await client.enqueue("my-queue", { task: "do_something" }); +console.log(`Enqueued job: ${jobId}`); +``` + +### As a Worker + +```typescript +import { OpenQueue } from "@ravin-d-27/openqueue"; + +const client = new OpenQueue("https://queue.example.com", "your-api-token"); + +const leased = await client.lease("my-queue", "worker-1"); +if (leased) { + console.log(`Processing job: ${leased.job.id}`); + await client.ack(leased.job.id, leased.lease_token, { result: { done: true } }); +} +``` + +## API + +### Producer Methods + +- `enqueue(queueName, payload, options?)` - Enqueue a new job +- `enqueueBatch(jobs)` - Enqueue multiple jobs +- `getStatus(jobId)` - Get job status +- `getJob(jobId)` - Get full job details +- `listJobs(options?)` - List jobs with filters +- `cancelJob(jobId)` - Cancel a pending job + +### Worker Methods + +- `lease(queueName, workerId, options?)` - Lease next available job +- `ack(jobId, leaseToken, options?)` - Acknowledge job completion +- `nack(jobId, leaseToken, error, options?)` - Report job failure +- `heartbeat(jobId, leaseToken, options?)` - Send heartbeat to extend lease + +### Dashboard Methods + +- `getQueueStats()` - Get queue statistics diff --git a/sdk/typescript/examples/producer.ts b/sdk/typescript/examples/producer.ts new file mode 100644 index 0000000..b9ad64f --- /dev/null +++ b/sdk/typescript/examples/producer.ts @@ -0,0 +1,25 @@ +import { OpenQueue } from "@ravin-d-27/openqueue"; + +const client = new OpenQueue("http://localhost:8000", "your-api-token"); + +async function main() { + const jobId = await client.enqueue("my-queue", { task: "do_something" }); + console.log(`Enqueued job: ${jobId}`); + + const jobs = await client.enqueueBatch([ + { queue_name: "my-queue", payload: { task: "job1" } }, + { queue_name: "my-queue", payload: { task: "job2" }, priority: 10 }, + ]); + console.log(`Enqueued batch: ${jobs.join(", ")}`); + + const status = await client.getStatus(jobId); + console.log(`Job status: ${status}`); + + const job = await client.getJob(jobId); + console.log(`Job details: ${JSON.stringify(job)}`); + + const list = await client.listJobs({ queue_name: "my-queue", limit: 10 }); + console.log(`Found ${list.total} jobs`); +} + +main().catch(console.error); diff --git a/sdk/typescript/examples/worker.ts b/sdk/typescript/examples/worker.ts new file mode 100644 index 0000000..f31e5f8 --- /dev/null +++ b/sdk/typescript/examples/worker.ts @@ -0,0 +1,35 @@ +import { OpenQueue } from "@ravin-d-27/openqueue"; + +const client = new OpenQueue("http://localhost:8000", "your-api-token"); + +async function processJob() { + while (true) { + const leased = await client.lease("my-queue", "worker-1"); + + if (!leased) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + continue; + } + + console.log(`Processing job: ${leased.job.id}`); + + try { + const result = await client.ack( + leased.job.id, + leased.lease_token, + { result: { success: true } } + ); + console.log(`Job acknowledged: ${result}`); + } catch (error) { + console.error(`Failed to ack job: ${error}`); + await client.nack( + leased.job.id, + leased.lease_token, + "Processing failed", + { retry: true } + ); + } + } +} + +processJob().catch(console.error); diff --git a/sdk/typescript/node_modules/.bin/esbuild b/sdk/typescript/node_modules/.bin/esbuild new file mode 120000 index 0000000..c83ac07 --- /dev/null +++ b/sdk/typescript/node_modules/.bin/esbuild @@ -0,0 +1 @@ +../esbuild/bin/esbuild \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/rollup b/sdk/typescript/node_modules/.bin/rollup new file mode 120000 index 0000000..5939621 --- /dev/null +++ b/sdk/typescript/node_modules/.bin/rollup @@ -0,0 +1 @@ +../rollup/dist/bin/rollup \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/sucrase b/sdk/typescript/node_modules/.bin/sucrase new file mode 120000 index 0000000..0ac7e77 --- /dev/null +++ b/sdk/typescript/node_modules/.bin/sucrase @@ -0,0 +1 @@ +../sucrase/bin/sucrase \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/sucrase-node b/sdk/typescript/node_modules/.bin/sucrase-node new file mode 120000 index 0000000..8b96fae --- /dev/null +++ b/sdk/typescript/node_modules/.bin/sucrase-node @@ -0,0 +1 @@ +../sucrase/bin/sucrase-node \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/tree-kill b/sdk/typescript/node_modules/.bin/tree-kill new file mode 120000 index 0000000..26dcd2c --- /dev/null +++ b/sdk/typescript/node_modules/.bin/tree-kill @@ -0,0 +1 @@ +../tree-kill/cli.js \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/tsc b/sdk/typescript/node_modules/.bin/tsc new file mode 120000 index 0000000..0863208 --- /dev/null +++ b/sdk/typescript/node_modules/.bin/tsc @@ -0,0 +1 @@ +../typescript/bin/tsc \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/tsserver b/sdk/typescript/node_modules/.bin/tsserver new file mode 120000 index 0000000..f8f8f1a --- /dev/null +++ b/sdk/typescript/node_modules/.bin/tsserver @@ -0,0 +1 @@ +../typescript/bin/tsserver \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/tsup b/sdk/typescript/node_modules/.bin/tsup new file mode 120000 index 0000000..c280636 --- /dev/null +++ b/sdk/typescript/node_modules/.bin/tsup @@ -0,0 +1 @@ +../tsup/dist/cli-default.js \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/tsup-node b/sdk/typescript/node_modules/.bin/tsup-node new file mode 120000 index 0000000..ef5e5df --- /dev/null +++ b/sdk/typescript/node_modules/.bin/tsup-node @@ -0,0 +1 @@ +../tsup/dist/cli-node.js \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/vite b/sdk/typescript/node_modules/.bin/vite new file mode 120000 index 0000000..6d1e3be --- /dev/null +++ b/sdk/typescript/node_modules/.bin/vite @@ -0,0 +1 @@ +../vite/bin/vite.js \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/vite-node b/sdk/typescript/node_modules/.bin/vite-node new file mode 120000 index 0000000..d68f74c --- /dev/null +++ b/sdk/typescript/node_modules/.bin/vite-node @@ -0,0 +1 @@ +../vite-node/vite-node.mjs \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/vitest b/sdk/typescript/node_modules/.bin/vitest new file mode 120000 index 0000000..2273497 --- /dev/null +++ b/sdk/typescript/node_modules/.bin/vitest @@ -0,0 +1 @@ +../vitest/vitest.mjs \ No newline at end of file diff --git a/sdk/typescript/node_modules/.bin/why-is-node-running b/sdk/typescript/node_modules/.bin/why-is-node-running new file mode 120000 index 0000000..f08a594 --- /dev/null +++ b/sdk/typescript/node_modules/.bin/why-is-node-running @@ -0,0 +1 @@ +../why-is-node-running/cli.js \ No newline at end of file diff --git a/sdk/typescript/node_modules/.package-lock.json b/sdk/typescript/node_modules/.package-lock.json new file mode 100644 index 0000000..8016afe --- /dev/null +++ b/sdk/typescript/node_modules/.package-lock.json @@ -0,0 +1,1750 @@ +{ + "name": "openqueue", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@vitest/expect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", + "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", + "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/snapshot/node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/snapshot/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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/snapshot/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "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, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/snapshot/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", + "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy/node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", + "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/utils/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/utils/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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@vitest/utils/node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "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, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk/node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "node_modules/bundle-require/node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai/node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chai/node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chai/node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chai/node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chai/node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/chai/node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chai/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chokidar/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/execa/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, + "license": "MIT" + }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/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, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/execa/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fix-dts-default-cjs-exports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", + "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" + } + }, + "node_modules/fix-dts-default-cjs-exports/node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fix-dts-default-cjs-exports/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/fix-dts-default-cjs-exports/node_modules/mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/fix-dts-default-cjs-exports/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/fix-dts-default-cjs-exports/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/fix-dts-default-cjs-exports/node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/local-pkg/node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/local-pkg/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/local-pkg/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/local-pkg/node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/postcss/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/sucrase/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/sucrase/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/sucrase/node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/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, + "license": "MIT" + }, + "node_modules/sucrase/node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase/node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/sucrase/node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tsup": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", + "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.27.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "^0.7.6", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", + "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", + "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/why-is-node-running/node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/why-is-node-running/node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/sdk/typescript/node_modules/@vitest/expect/LICENSE b/sdk/typescript/node_modules/@vitest/expect/LICENSE new file mode 100644 index 0000000..5ae481f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/expect/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-Present Vitest Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/expect/README.md b/sdk/typescript/node_modules/@vitest/expect/README.md new file mode 100644 index 0000000..da5d16d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/expect/README.md @@ -0,0 +1,17 @@ +# @vitest/expect + +Jest's expect matchers as a Chai plugin. + +## Usage + +```js +import * as chai from 'chai' +import { JestAsymmetricMatchers, JestChaiExpect, JestExtend } from '@vitest/expect' + +// allows using expect.extend instead of chai.use to extend plugins +chai.use(JestExtend) +// adds all jest matchers to expect +chai.use(JestChaiExpect) +// adds asymmetric matchers like stringContaining, objectContaining +chai.use(JestAsymmetricMatchers) +``` diff --git a/sdk/typescript/node_modules/@vitest/expect/index.d.ts b/sdk/typescript/node_modules/@vitest/expect/index.d.ts new file mode 100644 index 0000000..3b82ac4 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/expect/index.d.ts @@ -0,0 +1,3 @@ +import './dist/chai.cjs' + +export * from './dist/index.js' diff --git a/sdk/typescript/node_modules/@vitest/expect/package.json b/sdk/typescript/node_modules/@vitest/expect/package.json new file mode 100644 index 0000000..41ffce0 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/expect/package.json @@ -0,0 +1,47 @@ +{ + "name": "@vitest/expect", + "type": "module", + "version": "1.6.1", + "description": "Jest's expect matchers as a Chai plugin", + "license": "MIT", + "funding": "https://opencollective.com/vitest", + "homepage": "https://github.com/vitest-dev/vitest/tree/main/packages/expect#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/expect" + }, + "bugs": { + "url": "https://github.com/vitest-dev/vitest/issues" + }, + "sideEffects": false, + "exports": { + ".": { + "types": "./index.d.ts", + "default": "./dist/index.js" + }, + "./*": "./*" + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./index.d.ts", + "files": [ + "*.d.ts", + "dist" + ], + "dependencies": { + "chai": "^4.3.10", + "@vitest/utils": "1.6.1", + "@vitest/spy": "1.6.1" + }, + "devDependencies": { + "@types/chai": "4.3.6", + "picocolors": "^1.0.0", + "rollup-plugin-copy": "^3.5.0", + "@vitest/runner": "1.6.1" + }, + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/runner/LICENSE b/sdk/typescript/node_modules/@vitest/runner/LICENSE new file mode 100644 index 0000000..5ae481f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-Present Vitest Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/runner/README.md b/sdk/typescript/node_modules/@vitest/runner/README.md new file mode 100644 index 0000000..2796b6a --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/README.md @@ -0,0 +1,5 @@ +# @vitest/runner + +Vitest mechanism to collect and run tasks. + +[GitHub](https://github.com/vitest-dev/vitest) | [Documentation](https://vitest.dev/advanced/runner) diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/async-hooks-stub.js b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/async-hooks-stub.js new file mode 100644 index 0000000..913c7c6 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/async-hooks-stub.js @@ -0,0 +1,15 @@ +export const AsyncResource = { + bind(fn, _type, thisArg) { + return fn.bind(thisArg); + }, +}; + +export class AsyncLocalStorage { + getStore() { + return undefined; + } + + run(_store, callback) { + return callback(); + } +} diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/index.d.ts b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/index.d.ts new file mode 100644 index 0000000..303c7d9 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/index.d.ts @@ -0,0 +1,38 @@ +export type LimitFunction = { + /** + The number of promises that are currently running. + */ + readonly activeCount: number; + + /** + The number of promises that are waiting to run (i.e. their internal `fn` was not called yet). + */ + readonly pendingCount: number; + + /** + Discard pending promises that are waiting to run. + + This might be useful if you want to teardown the queue at the end of your program's lifecycle or discard any function calls referencing an intermediary state of your app. + + Note: This does not cancel promises that are already running. + */ + clearQueue: () => void; + + /** + @param fn - Promise-returning/async function. + @param arguments - Any arguments to pass through to `fn`. Support for passing arguments on to the `fn` is provided in order to be able to avoid creating unnecessary closures. You probably don't need this optimization unless you're pushing a lot of functions. + @returns The promise returned by calling `fn(...arguments)`. + */ + ( + fn: (...arguments_: Arguments) => PromiseLike | ReturnType, + ...arguments_: Arguments + ): Promise; +}; + +/** +Run multiple promise-returning & async functions with limited concurrency. + +@param concurrency - Concurrency limit. Minimum: `1`. +@returns A `limit` function. +*/ +export default function pLimit(concurrency: number): LimitFunction; diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/index.js b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/index.js new file mode 100644 index 0000000..4a5a0f0 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/index.js @@ -0,0 +1,71 @@ +import Queue from 'yocto-queue'; +import {AsyncResource} from '#async_hooks'; + +export default function pLimit(concurrency) { + if (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) { + throw new TypeError('Expected `concurrency` to be a number from 1 and up'); + } + + const queue = new Queue(); + let activeCount = 0; + + const next = () => { + activeCount--; + + if (queue.size > 0) { + queue.dequeue()(); + } + }; + + const run = async (function_, resolve, arguments_) => { + activeCount++; + + const result = (async () => function_(...arguments_))(); + + resolve(result); + + try { + await result; + } catch {} + + next(); + }; + + const enqueue = (function_, resolve, arguments_) => { + queue.enqueue( + AsyncResource.bind(run.bind(undefined, function_, resolve, arguments_)), + ); + + (async () => { + // This function needs to wait until the next microtask before comparing + // `activeCount` to `concurrency`, because `activeCount` is updated asynchronously + // when the run function is dequeued and called. The comparison in the if-statement + // needs to happen asynchronously as well to get an up-to-date value for `activeCount`. + await Promise.resolve(); + + if (activeCount < concurrency && queue.size > 0) { + queue.dequeue()(); + } + })(); + }; + + const generator = (function_, ...arguments_) => new Promise(resolve => { + enqueue(function_, resolve, arguments_); + }); + + Object.defineProperties(generator, { + activeCount: { + get: () => activeCount, + }, + pendingCount: { + get: () => queue.size, + }, + clearQueue: { + value() { + queue.clear(); + }, + }, + }); + + return generator; +} diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/license b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/package.json b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/package.json new file mode 100644 index 0000000..6d5a9b7 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/package.json @@ -0,0 +1,64 @@ +{ + "name": "p-limit", + "version": "5.0.0", + "description": "Run multiple promise-returning & async functions with limited concurrency", + "license": "MIT", + "repository": "sindresorhus/p-limit", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": { + "types": "./index.d.ts", + "default": "./index.js" + }, + "imports": { + "#async_hooks": { + "node": "async_hooks", + "default": "./async-hooks-stub.js" + } + }, + "engines": { + "node": ">=18" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "async-hooks-stub.js" + ], + "keywords": [ + "promise", + "limit", + "limited", + "concurrency", + "throttle", + "throat", + "rate", + "batch", + "ratelimit", + "task", + "queue", + "async", + "await", + "promises", + "bluebird" + ], + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "devDependencies": { + "ava": "^5.3.1", + "delay": "^6.0.0", + "in-range": "^3.0.0", + "random-int": "^3.0.0", + "time-span": "^5.1.0", + "tsd": "^0.29.0", + "xo": "^0.56.0" + } +} diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/readme.md b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/readme.md new file mode 100644 index 0000000..4e890f8 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/p-limit/readme.md @@ -0,0 +1,88 @@ +# p-limit + +> Run multiple promise-returning & async functions with limited concurrency + +*Works in Node.js and browsers.* + +## Install + +```sh +npm install p-limit +``` + +## Usage + +```js +import pLimit from 'p-limit'; + +const limit = pLimit(1); + +const input = [ + limit(() => fetchSomething('foo')), + limit(() => fetchSomething('bar')), + limit(() => doSomething()) +]; + +// Only one promise is run at once +const result = await Promise.all(input); +console.log(result); +``` + +## API + +### pLimit(concurrency) + +Returns a `limit` function. + +#### concurrency + +Type: `number`\ +Minimum: `1`\ +Default: `Infinity` + +Concurrency limit. + +### limit(fn, ...args) + +Returns the promise returned by calling `fn(...args)`. + +#### fn + +Type: `Function` + +Promise-returning/async function. + +#### args + +Any arguments to pass through to `fn`. + +Support for passing arguments on to the `fn` is provided in order to be able to avoid creating unnecessary closures. You probably don't need this optimization unless you're pushing a *lot* of functions. + +### limit.activeCount + +The number of promises that are currently running. + +### limit.pendingCount + +The number of promises that are waiting to run (i.e. their internal `fn` was not called yet). + +### limit.clearQueue() + +Discard pending promises that are waiting to run. + +This might be useful if you want to teardown the queue at the end of your program's lifecycle or discard any function calls referencing an intermediary state of your app. + +Note: This does not cancel promises that are already running. + +## FAQ + +### How is this different from the [`p-queue`](https://github.com/sindresorhus/p-queue) package? + +This package is only about limiting the number of concurrent executions, while `p-queue` is a fully featured queue implementation with lots of different options, introspection, and ability to pause the queue. + +## Related + +- [p-throttle](https://github.com/sindresorhus/p-throttle) - Throttle promise-returning & async functions +- [p-debounce](https://github.com/sindresorhus/p-debounce) - Debounce promise-returning & async functions +- [p-all](https://github.com/sindresorhus/p-all) - Run promise-returning & async functions concurrently with optional limited concurrency +- [More…](https://github.com/sindresorhus/promise-fun) diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/LICENSE b/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/LICENSE new file mode 100644 index 0000000..743af99 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/LICENSE @@ -0,0 +1,44 @@ +MIT License + +Copyright (c) Pooya Parsa - Daniel Roe + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/README.md b/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/README.md new file mode 100644 index 0000000..a2af0fd --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/README.md @@ -0,0 +1,69 @@ +# 🛣️ pathe + +> Universal filesystem path utils + +[![version][npm-v-src]][npm-v-href] +[![downloads][npm-d-src]][npm-d-href] +[![size][size-src]][size-href] + +> **❓ Why** +> +> For [historical reasons](https://docs.microsoft.com/en-us/archive/blogs/larryosterman/why-is-the-dos-path-character), windows followed MS-DOS and using backslash for separating paths rather than slash used for macOS, Linux, and other Posix operating systems. Nowadays, [Windows](https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN) supports both Slash and Backslash for paths. [Node.js's built in `path` module](https://nodejs.org/api/path.html) in the default operation of the path module varies based on the operating system on which a Node.js application is running. Specifically, when running on a Windows operating system, the path module will assume that Windows-style paths are being used. **This makes inconsistent code behavior between Windows and POSIX.** +> Compared to popular [upath](https://github.com/anodynos/upath), pathe is providing **identical exports** of Node.js with normalization on **all operations** and written in modern **ESM/Typescript** and has **no dependency on Node.js**! + +This package is a drop-in replacement of the Node.js's [path module](https://nodejs.org/api/path.html) module and ensures paths are normalized with slash `/` and work in environments including Node.js. + +## 💿 Usage + +Install using npm or yarn: + +```bash +# npm +npm i pathe + +# yarn +yarn add pathe + +# pnpm +pnpm i pathe +``` + +Import: + +```js +// ESM / Typescript +import { resolve } from 'pathe' + +// CommonJS +const { resolve } = require('pathe') +``` + +Read more about path utils from [Node.js documentation](https://nodejs.org/api/path.html) and rest assured behavior is ALWAYS like POSIX regardless of your input paths format and running platform! + +### Extra utilties + +Pathe exports some extra utilities that do not exist in standard Node.js [path module](https://nodejs.org/api/path.html). +In order to use them, you can import from `pathe/utils` subpath: + +```js +import { filename, normalizeAliases, resolveAlias } from 'pathe/utils' +``` + +## License + +MIT. Made with 💖 + +Some code used from Node.js project. See [LICENSE](./LICENSE). + + +[npm-v-src]: https://img.shields.io/npm/v/pathe?style=flat-square +[npm-v-href]: https://npmjs.com/package/pathe + +[npm-d-src]: https://img.shields.io/npm/dm/pathe?style=flat-square +[npm-d-href]: https://npmjs.com/package/pathe + +[github-actions-src]: https://img.shields.io/github/workflow/status/unjs/pathe/ci/main?style=flat-square +[github-actions-href]: https://github.com/unjs/pathe/actions?query=workflow%3Aci + +[size-src]: https://packagephobia.now.sh/badge?p=pathe +[size-href]: https://packagephobia.now.sh/result?p=pathe diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/package.json b/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/package.json new file mode 100644 index 0000000..1b14f7d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/package.json @@ -0,0 +1,48 @@ +{ + "name": "pathe", + "version": "1.1.2", + "description": "Universal filesystem path utils", + "repository": "unjs/pathe", + "license": "MIT", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./utils": { + "types": "./dist/utils.d.ts", + "import": "./dist/utils.mjs", + "require": "./dist/utils.cjs" + } + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.ts", + "files": [ + "dist", + "utils.d.ts" + ], + "devDependencies": { + "@types/node": "^20.10.8", + "@vitest/coverage-v8": "^1.1.3", + "changelogen": "^0.5.5", + "eslint": "^8.56.0", + "eslint-config-unjs": "^0.2.1", + "jiti": "^1.21.0", + "prettier": "^3.1.1", + "typescript": "^5.3.3", + "unbuild": "^2.0.0", + "vitest": "^1.1.3" + }, + "packageManager": "pnpm@8.14.0", + "scripts": { + "build": "unbuild", + "dev": "vitest", + "lint": "eslint --ext .ts . && prettier -c src test", + "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test -w", + "release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags", + "test": "pnpm lint && vitest run --coverage", + "test:types": "tsc --noEmit" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/utils.d.ts b/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/utils.d.ts new file mode 100644 index 0000000..59cabd3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/pathe/utils.d.ts @@ -0,0 +1 @@ +export * from "./dist/utils"; diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/index.d.ts b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/index.d.ts new file mode 100644 index 0000000..0475d98 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/index.d.ts @@ -0,0 +1,75 @@ +export default class Queue implements Iterable { + /** + The size of the queue. + */ + readonly size: number; + + /** + Tiny queue data structure. + + The instance is an [`Iterable`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols), which means you can iterate over the queue front to back with a “for…of” loop, or use spreading to convert the queue to an array. Don't do this unless you really need to though, since it's slow. + + @example + ``` + import Queue from 'yocto-queue'; + + const queue = new Queue(); + + queue.enqueue('🦄'); + queue.enqueue('🌈'); + + console.log(queue.size); + //=> 2 + + console.log(...queue); + //=> '🦄 🌈' + + console.log(queue.dequeue()); + //=> '🦄' + + console.log(queue.dequeue()); + //=> '🌈' + ``` + */ + constructor(); + + /** + The instance is an [`Iterable`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols), which means you can iterate over the queue front to back with a “for…of” loop. Using the iterator will not remove the items from the queue. If you want that, use `drain()` instead. + + You can also use spreading to convert the queue to an array. Don't do this unless you really need to though, since it's slow. + */ + [Symbol.iterator](): IterableIterator; + + /** + Returns an iterator that dequeues items as you consume it. + + This allows you to empty the queue while processing its items. + + If you want to not remove items as you consume it, use the `Queue` object as an iterator. + */ + drain(): IterableIterator; + + /** + Add a value to the queue. + */ + enqueue(value: ValueType): void; + + /** + Remove the next value in the queue. + + @returns The removed value or `undefined` if the queue is empty. + */ + dequeue(): ValueType | undefined; + + /** + Get the next value in the queue without removing it. + + @returns The value or `undefined` if the queue is empty. + */ + peek(): ValueType | undefined; + + /** + Clear the queue. + */ + clear(): void; +} diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/index.js b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/index.js new file mode 100644 index 0000000..627ed53 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/index.js @@ -0,0 +1,90 @@ +/* +How it works: +`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value. +*/ + +class Node { + value; + next; + + constructor(value) { + this.value = value; + } +} + +export default class Queue { + #head; + #tail; + #size; + + constructor() { + this.clear(); + } + + enqueue(value) { + const node = new Node(value); + + if (this.#head) { + this.#tail.next = node; + this.#tail = node; + } else { + this.#head = node; + this.#tail = node; + } + + this.#size++; + } + + dequeue() { + const current = this.#head; + if (!current) { + return; + } + + this.#head = this.#head.next; + this.#size--; + + // Clean up tail reference when queue becomes empty + if (!this.#head) { + this.#tail = undefined; + } + + return current.value; + } + + peek() { + if (!this.#head) { + return; + } + + return this.#head.value; + + // TODO: Node.js 18. + // return this.#head?.value; + } + + clear() { + this.#head = undefined; + this.#tail = undefined; + this.#size = 0; + } + + get size() { + return this.#size; + } + + * [Symbol.iterator]() { + let current = this.#head; + + while (current) { + yield current.value; + current = current.next; + } + } + + * drain() { + while (this.#head) { + yield this.dequeue(); + } + } +} diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/license b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/package.json b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/package.json new file mode 100644 index 0000000..e9963ac --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/package.json @@ -0,0 +1,48 @@ +{ + "name": "yocto-queue", + "version": "1.2.2", + "description": "Tiny queue data structure", + "license": "MIT", + "repository": "sindresorhus/yocto-queue", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": "./index.js", + "types": "./index.d.ts", + "sideEffects": false, + "engines": { + "node": ">=12.20" + }, + "scripts": { + "//test": "xo && ava && tsd", + "test": "ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "queue", + "data", + "structure", + "algorithm", + "queues", + "queuing", + "list", + "array", + "linkedlist", + "fifo", + "enqueue", + "dequeue", + "data-structure" + ], + "devDependencies": { + "ava": "^3.15.0", + "tsd": "^0.17.0", + "xo": "^0.44.0" + } +} diff --git a/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/readme.md b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/readme.md new file mode 100644 index 0000000..f94f98e --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/node_modules/yocto-queue/readme.md @@ -0,0 +1,80 @@ +# yocto-queue [![](https://badgen.net/bundlephobia/minzip/yocto-queue)](https://bundlephobia.com/result?p=yocto-queue) + +> Tiny queue data structure + +You should use this package instead of an array if you do a lot of `Array#push()` and `Array#shift()` on large arrays, since `Array#shift()` has [linear time complexity](https://medium.com/@ariel.salem1989/an-easy-to-use-guide-to-big-o-time-complexity-5dcf4be8a444#:~:text=O(N)%E2%80%94Linear%20Time) *O(n)* while `Queue#dequeue()` has [constant time complexity](https://medium.com/@ariel.salem1989/an-easy-to-use-guide-to-big-o-time-complexity-5dcf4be8a444#:~:text=O(1)%20%E2%80%94%20Constant%20Time) *O(1)*. That makes a huge difference for large arrays. + +> A [queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) is an ordered list of elements where an element is inserted at the end of the queue and is removed from the front of the queue. A queue works based on the first-in, first-out ([FIFO](https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics))) principle. + +## Install + +```sh +npm install yocto-queue +``` + +## Usage + +```js +import Queue from 'yocto-queue'; + +const queue = new Queue(); + +queue.enqueue('🦄'); +queue.enqueue('🌈'); + +console.log(queue.size); +//=> 2 + +console.log(...queue); +//=> '🦄 🌈' + +console.log(queue.dequeue()); +//=> '🦄' + +console.log(queue.dequeue()); +//=> '🌈' +``` + +## API + +### `queue = new Queue()` + +The instance is an [`Iterable`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols), which means you can iterate over the queue front to back with a “for…of” loop. Using the iterator will not remove the items from the queue. If you want that, use [`drain()`](#drain) instead. + +You can also use spreading to convert the queue to an array. Don't do this unless you really need to though, since it's slow. + +#### `.enqueue(value)` + +Add a value to the queue. + +#### `.dequeue()` + +Remove the next value in the queue. + +Returns the removed value or `undefined` if the queue is empty. + +#### `.peek()` + +Get the next value in the queue without removing it. + +Returns the value or `undefined` if the queue is empty. + +#### `.drain()` + +Returns an iterator that dequeues items as you consume it. + +This allows you to empty the queue while processing its items. + +If you want to not remove items as you consume it, use the `Queue` object as an iterator. + +#### `.clear()` + +Clear the queue. + +#### `.size` + +The size of the queue. + +## Related + +- [quick-lru](https://github.com/sindresorhus/quick-lru) - Simple “Least Recently Used” (LRU) cache diff --git a/sdk/typescript/node_modules/@vitest/runner/package.json b/sdk/typescript/node_modules/@vitest/runner/package.json new file mode 100644 index 0000000..82b7481 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/package.json @@ -0,0 +1,49 @@ +{ + "name": "@vitest/runner", + "type": "module", + "version": "1.6.1", + "description": "Vitest test runner", + "license": "MIT", + "funding": "https://opencollective.com/vitest", + "homepage": "https://github.com/vitest-dev/vitest/tree/main/packages/runner#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/runner" + }, + "bugs": { + "url": "https://github.com/vitest-dev/vitest/issues" + }, + "sideEffects": true, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./utils": { + "types": "./dist/utils.d.ts", + "default": "./dist/utils.js" + }, + "./types": { + "types": "./dist/types.d.ts", + "default": "./dist/types.js" + }, + "./*": "./*" + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "*.d.ts", + "dist" + ], + "dependencies": { + "p-limit": "^5.0.0", + "pathe": "^1.1.1", + "@vitest/utils": "1.6.1" + }, + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/runner/types.d.ts b/sdk/typescript/node_modules/@vitest/runner/types.d.ts new file mode 100644 index 0000000..26a1254 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/types.d.ts @@ -0,0 +1 @@ +export * from './dist/types.js' diff --git a/sdk/typescript/node_modules/@vitest/runner/utils.d.ts b/sdk/typescript/node_modules/@vitest/runner/utils.d.ts new file mode 100644 index 0000000..e3f344e --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/runner/utils.d.ts @@ -0,0 +1 @@ +export * from './dist/utils.js' diff --git a/sdk/typescript/node_modules/@vitest/snapshot/LICENSE b/sdk/typescript/node_modules/@vitest/snapshot/LICENSE new file mode 100644 index 0000000..5ae481f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-Present Vitest Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/snapshot/README.md b/sdk/typescript/node_modules/@vitest/snapshot/README.md new file mode 100644 index 0000000..4c4ecda --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/README.md @@ -0,0 +1,79 @@ +# @vitest/snapshot + +Lightweight implementation of Jest's snapshots. + +## Usage + +```js +import { SnapshotClient } from '@vitest/snapshot' +import { NodeSnapshotEnvironment } from '@vitest/snapshot/environment' +import { SnapshotManager } from '@vitest/snapshot/manager' + +const client = new SnapshotClient({ + // you need to provide your own equality check implementation if you use it + // this function is called when `.toMatchSnapshot({ property: 1 })` is called + isEqual: (received, expected) => equals(received, expected, [iterableEquality, subsetEquality]), +}) + +// class that implements snapshot saving and reading +// by default uses fs module, but you can provide your own implementation depending on the environment +const environment = new NodeSnapshotEnvironment() + +// you need to implement this yourselves, +// this depends on your runner +function getCurrentFilepath() { + return '/file.spec.js' +} +function getCurrentTestName() { + return 'test1' +} + +// example for inline snapshots, nothing is required to support regular snapshots, +// just call `assert` with `isInline: false` +function wrapper(received) { + function __INLINE_SNAPSHOT__(inlineSnapshot, message) { + client.assert({ + received, + message, + isInline: true, + inlineSnapshot, + filepath: getCurrentFilepath(), + name: getCurrentTestName(), + }) + } + return { + // the name is hard-coded, it should be inside another function, so Vitest can find the actual test file where it was called (parses call stack trace + 2) + // you can override this behaviour in SnapshotState's `_inferInlineSnapshotStack` method by providing your own SnapshotState to SnapshotClient constructor + toMatchInlineSnapshot: (...args) => __INLINE_SNAPSHOT__(...args), + } +} + +const options = { + updateSnapshot: 'new', + snapshotEnvironment: environment, +} + +await client.startCurrentRun(getCurrentFilepath(), getCurrentTestName(), options) + +// this will save snapshot to a file which is returned by "snapshotEnvironment.resolvePath" +client.assert({ + received: 'some text', + isInline: false, +}) + +// uses "pretty-format", so it requires quotes +// also naming is hard-coded when parsing test files +wrapper('text 1').toMatchInlineSnapshot() +wrapper('text 2').toMatchInlineSnapshot('"text 2"') + +const result = await client.finishCurrentRun() // this saves files and returns SnapshotResult + +// you can use manager to manage several clients +const manager = new SnapshotManager(options) +manager.add(result) + +// do something +// and then read the summary + +console.log(manager.summary) +``` diff --git a/sdk/typescript/node_modules/@vitest/snapshot/environment.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/environment.d.ts new file mode 100644 index 0000000..855f0d1 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/environment.d.ts @@ -0,0 +1 @@ +export * from './dist/environment.js' diff --git a/sdk/typescript/node_modules/@vitest/snapshot/manager.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/manager.d.ts new file mode 100644 index 0000000..f3e8077 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/manager.d.ts @@ -0,0 +1 @@ +export * from './dist/manager.js' diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/LICENSE b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/LICENSE new file mode 100644 index 0000000..b93be90 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/README.md b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/README.md new file mode 100644 index 0000000..b2a1d12 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/README.md @@ -0,0 +1,3 @@ +# `@jest/schemas` + +Experimental and currently incomplete module for JSON schemas for [Jest's](https://jestjs.io/) configuration. diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/package.json b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/package.json new file mode 100644 index 0000000..db670bf --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@jest/schemas/package.json @@ -0,0 +1,29 @@ +{ + "name": "@jest/schemas", + "version": "29.6.3", + "repository": { + "type": "git", + "url": "https://github.com/jestjs/jest.git", + "directory": "packages/jest-schemas" + }, + "license": "MIT", + "main": "./build/index.js", + "types": "./build/index.d.ts", + "exports": { + ".": { + "types": "./build/index.d.ts", + "default": "./build/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "fb7d95c8af6e0d65a8b65348433d8a0ea0725b5b" +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/compiler.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/compiler.d.ts new file mode 100644 index 0000000..f35f75f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/compiler.d.ts @@ -0,0 +1,35 @@ +import * as Types from '../typebox'; +import { ValueErrorIterator } from '../errors/index'; +export type CheckFunction = (value: unknown) => boolean; +export declare class TypeCheck { + private readonly schema; + private readonly references; + private readonly checkFunc; + private readonly code; + constructor(schema: T, references: Types.TSchema[], checkFunc: CheckFunction, code: string); + /** Returns the generated assertion code used to validate this type. */ + Code(): string; + /** Returns an iterator for each error in this value. */ + Errors(value: unknown): ValueErrorIterator; + /** Returns true if the value matches the compiled type. */ + Check(value: unknown): value is Types.Static; +} +export declare class TypeCompilerUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class TypeCompilerDereferenceError extends Error { + readonly schema: Types.TRef; + constructor(schema: Types.TRef); +} +export declare class TypeCompilerTypeGuardError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +/** Compiles Types for Runtime Type Checking */ +export declare namespace TypeCompiler { + /** Returns the generated assertion code used to validate this type. */ + function Code(schema: T, references?: Types.TSchema[]): string; + /** Compiles the given type for runtime type checking. This compiler only accepts known TypeBox types non-inclusive of unsafe types. */ + function Compile(schema: T, references?: Types.TSchema[]): TypeCheck; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/compiler.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/compiler.js new file mode 100644 index 0000000..b318e7d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/compiler.js @@ -0,0 +1,577 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/compiler + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TypeCompiler = exports.TypeCompilerTypeGuardError = exports.TypeCompilerDereferenceError = exports.TypeCompilerUnknownTypeError = exports.TypeCheck = void 0; +const Types = require("../typebox"); +const index_1 = require("../errors/index"); +const index_2 = require("../system/index"); +const hash_1 = require("../value/hash"); +// ------------------------------------------------------------------- +// TypeCheck +// ------------------------------------------------------------------- +class TypeCheck { + constructor(schema, references, checkFunc, code) { + this.schema = schema; + this.references = references; + this.checkFunc = checkFunc; + this.code = code; + } + /** Returns the generated assertion code used to validate this type. */ + Code() { + return this.code; + } + /** Returns an iterator for each error in this value. */ + Errors(value) { + return index_1.ValueErrors.Errors(this.schema, this.references, value); + } + /** Returns true if the value matches the compiled type. */ + Check(value) { + return this.checkFunc(value); + } +} +exports.TypeCheck = TypeCheck; +// ------------------------------------------------------------------- +// Character +// ------------------------------------------------------------------- +var Character; +(function (Character) { + function DollarSign(code) { + return code === 36; + } + Character.DollarSign = DollarSign; + function IsUnderscore(code) { + return code === 95; + } + Character.IsUnderscore = IsUnderscore; + function IsAlpha(code) { + return (code >= 65 && code <= 90) || (code >= 97 && code <= 122); + } + Character.IsAlpha = IsAlpha; + function IsNumeric(code) { + return code >= 48 && code <= 57; + } + Character.IsNumeric = IsNumeric; +})(Character || (Character = {})); +// ------------------------------------------------------------------- +// MemberExpression +// ------------------------------------------------------------------- +var MemberExpression; +(function (MemberExpression) { + function IsFirstCharacterNumeric(value) { + if (value.length === 0) + return false; + return Character.IsNumeric(value.charCodeAt(0)); + } + function IsAccessor(value) { + if (IsFirstCharacterNumeric(value)) + return false; + for (let i = 0; i < value.length; i++) { + const code = value.charCodeAt(i); + const check = Character.IsAlpha(code) || Character.IsNumeric(code) || Character.DollarSign(code) || Character.IsUnderscore(code); + if (!check) + return false; + } + return true; + } + function EscapeHyphen(key) { + return key.replace(/'/g, "\\'"); + } + function Encode(object, key) { + return IsAccessor(key) ? `${object}.${key}` : `${object}['${EscapeHyphen(key)}']`; + } + MemberExpression.Encode = Encode; +})(MemberExpression || (MemberExpression = {})); +// ------------------------------------------------------------------- +// Identifier +// ------------------------------------------------------------------- +var Identifier; +(function (Identifier) { + function Encode($id) { + const buffer = []; + for (let i = 0; i < $id.length; i++) { + const code = $id.charCodeAt(i); + if (Character.IsNumeric(code) || Character.IsAlpha(code)) { + buffer.push($id.charAt(i)); + } + else { + buffer.push(`_${code}_`); + } + } + return buffer.join('').replace(/__/g, '_'); + } + Identifier.Encode = Encode; +})(Identifier || (Identifier = {})); +// ------------------------------------------------------------------- +// TypeCompiler +// ------------------------------------------------------------------- +class TypeCompilerUnknownTypeError extends Error { + constructor(schema) { + super('TypeCompiler: Unknown type'); + this.schema = schema; + } +} +exports.TypeCompilerUnknownTypeError = TypeCompilerUnknownTypeError; +class TypeCompilerDereferenceError extends Error { + constructor(schema) { + super(`TypeCompiler: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.TypeCompilerDereferenceError = TypeCompilerDereferenceError; +class TypeCompilerTypeGuardError extends Error { + constructor(schema) { + super('TypeCompiler: Preflight validation check failed to guard for the given schema'); + this.schema = schema; + } +} +exports.TypeCompilerTypeGuardError = TypeCompilerTypeGuardError; +/** Compiles Types for Runtime Type Checking */ +var TypeCompiler; +(function (TypeCompiler) { + // ------------------------------------------------------------------- + // Guards + // ------------------------------------------------------------------- + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsNumber(value) { + return typeof value === 'number' && globalThis.Number.isFinite(value); + } + function IsString(value) { + return typeof value === 'string'; + } + // ------------------------------------------------------------------- + // Polices + // ------------------------------------------------------------------- + function IsExactOptionalProperty(value, key, expression) { + return index_2.TypeSystem.ExactOptionalPropertyTypes ? `('${key}' in ${value} ? ${expression} : true)` : `(${MemberExpression.Encode(value, key)} !== undefined ? ${expression} : true)`; + } + function IsObjectCheck(value) { + return !index_2.TypeSystem.AllowArrayObjects ? `(typeof ${value} === 'object' && ${value} !== null && !Array.isArray(${value}))` : `(typeof ${value} === 'object' && ${value} !== null)`; + } + function IsRecordCheck(value) { + return !index_2.TypeSystem.AllowArrayObjects + ? `(typeof ${value} === 'object' && ${value} !== null && !Array.isArray(${value}) && !(${value} instanceof Date) && !(${value} instanceof Uint8Array))` + : `(typeof ${value} === 'object' && ${value} !== null && !(${value} instanceof Date) && !(${value} instanceof Uint8Array))`; + } + function IsNumberCheck(value) { + return !index_2.TypeSystem.AllowNaN ? `(typeof ${value} === 'number' && Number.isFinite(${value}))` : `typeof ${value} === 'number'`; + } + function IsVoidCheck(value) { + return index_2.TypeSystem.AllowVoidNull ? `(${value} === undefined || ${value} === null)` : `${value} === undefined`; + } + // ------------------------------------------------------------------- + // Types + // ------------------------------------------------------------------- + function* Any(schema, references, value) { + yield 'true'; + } + function* Array(schema, references, value) { + const expression = CreateExpression(schema.items, references, 'value'); + yield `Array.isArray(${value}) && ${value}.every(value => ${expression})`; + if (IsNumber(schema.minItems)) + yield `${value}.length >= ${schema.minItems}`; + if (IsNumber(schema.maxItems)) + yield `${value}.length <= ${schema.maxItems}`; + if (schema.uniqueItems === true) + yield `((function() { const set = new Set(); for(const element of ${value}) { const hashed = hash(element); if(set.has(hashed)) { return false } else { set.add(hashed) } } return true })())`; + } + function* BigInt(schema, references, value) { + yield `(typeof ${value} === 'bigint')`; + if (IsBigInt(schema.multipleOf)) + yield `(${value} % BigInt(${schema.multipleOf})) === 0`; + if (IsBigInt(schema.exclusiveMinimum)) + yield `${value} > BigInt(${schema.exclusiveMinimum})`; + if (IsBigInt(schema.exclusiveMaximum)) + yield `${value} < BigInt(${schema.exclusiveMaximum})`; + if (IsBigInt(schema.minimum)) + yield `${value} >= BigInt(${schema.minimum})`; + if (IsBigInt(schema.maximum)) + yield `${value} <= BigInt(${schema.maximum})`; + } + function* Boolean(schema, references, value) { + yield `typeof ${value} === 'boolean'`; + } + function* Constructor(schema, references, value) { + yield* Visit(schema.returns, references, `${value}.prototype`); + } + function* Date(schema, references, value) { + yield `(${value} instanceof Date) && Number.isFinite(${value}.getTime())`; + if (IsNumber(schema.exclusiveMinimumTimestamp)) + yield `${value}.getTime() > ${schema.exclusiveMinimumTimestamp}`; + if (IsNumber(schema.exclusiveMaximumTimestamp)) + yield `${value}.getTime() < ${schema.exclusiveMaximumTimestamp}`; + if (IsNumber(schema.minimumTimestamp)) + yield `${value}.getTime() >= ${schema.minimumTimestamp}`; + if (IsNumber(schema.maximumTimestamp)) + yield `${value}.getTime() <= ${schema.maximumTimestamp}`; + } + function* Function(schema, references, value) { + yield `typeof ${value} === 'function'`; + } + function* Integer(schema, references, value) { + yield `(typeof ${value} === 'number' && Number.isInteger(${value}))`; + if (IsNumber(schema.multipleOf)) + yield `(${value} % ${schema.multipleOf}) === 0`; + if (IsNumber(schema.exclusiveMinimum)) + yield `${value} > ${schema.exclusiveMinimum}`; + if (IsNumber(schema.exclusiveMaximum)) + yield `${value} < ${schema.exclusiveMaximum}`; + if (IsNumber(schema.minimum)) + yield `${value} >= ${schema.minimum}`; + if (IsNumber(schema.maximum)) + yield `${value} <= ${schema.maximum}`; + } + function* Intersect(schema, references, value) { + if (schema.unevaluatedProperties === undefined) { + const expressions = schema.allOf.map((schema) => CreateExpression(schema, references, value)); + yield `${expressions.join(' && ')}`; + } + else if (schema.unevaluatedProperties === false) { + // prettier-ignore + const schemaKeys = Types.KeyResolver.Resolve(schema).map((key) => `'${key}'`).join(', '); + const expressions = schema.allOf.map((schema) => CreateExpression(schema, references, value)); + const expression1 = `Object.getOwnPropertyNames(${value}).every(key => [${schemaKeys}].includes(key))`; + yield `${expressions.join(' && ')} && ${expression1}`; + } + else if (typeof schema.unevaluatedProperties === 'object') { + // prettier-ignore + const schemaKeys = Types.KeyResolver.Resolve(schema).map((key) => `'${key}'`).join(', '); + const expressions = schema.allOf.map((schema) => CreateExpression(schema, references, value)); + const expression1 = CreateExpression(schema.unevaluatedProperties, references, 'value[key]'); + const expression2 = `Object.getOwnPropertyNames(${value}).every(key => [${schemaKeys}].includes(key) || ${expression1})`; + yield `${expressions.join(' && ')} && ${expression2}`; + } + } + function* Literal(schema, references, value) { + if (typeof schema.const === 'number' || typeof schema.const === 'boolean') { + yield `${value} === ${schema.const}`; + } + else { + yield `${value} === '${schema.const}'`; + } + } + function* Never(schema, references, value) { + yield `false`; + } + function* Not(schema, references, value) { + const left = CreateExpression(schema.allOf[0].not, references, value); + const right = CreateExpression(schema.allOf[1], references, value); + yield `!${left} && ${right}`; + } + function* Null(schema, references, value) { + yield `${value} === null`; + } + function* Number(schema, references, value) { + yield IsNumberCheck(value); + if (IsNumber(schema.multipleOf)) + yield `(${value} % ${schema.multipleOf}) === 0`; + if (IsNumber(schema.exclusiveMinimum)) + yield `${value} > ${schema.exclusiveMinimum}`; + if (IsNumber(schema.exclusiveMaximum)) + yield `${value} < ${schema.exclusiveMaximum}`; + if (IsNumber(schema.minimum)) + yield `${value} >= ${schema.minimum}`; + if (IsNumber(schema.maximum)) + yield `${value} <= ${schema.maximum}`; + } + function* Object(schema, references, value) { + yield IsObjectCheck(value); + if (IsNumber(schema.minProperties)) + yield `Object.getOwnPropertyNames(${value}).length >= ${schema.minProperties}`; + if (IsNumber(schema.maxProperties)) + yield `Object.getOwnPropertyNames(${value}).length <= ${schema.maxProperties}`; + const knownKeys = globalThis.Object.getOwnPropertyNames(schema.properties); + for (const knownKey of knownKeys) { + const memberExpression = MemberExpression.Encode(value, knownKey); + const property = schema.properties[knownKey]; + if (schema.required && schema.required.includes(knownKey)) { + yield* Visit(property, references, memberExpression); + if (Types.ExtendsUndefined.Check(property)) + yield `('${knownKey}' in ${value})`; + } + else { + const expression = CreateExpression(property, references, memberExpression); + yield IsExactOptionalProperty(value, knownKey, expression); + } + } + if (schema.additionalProperties === false) { + if (schema.required && schema.required.length === knownKeys.length) { + yield `Object.getOwnPropertyNames(${value}).length === ${knownKeys.length}`; + } + else { + const keys = `[${knownKeys.map((key) => `'${key}'`).join(', ')}]`; + yield `Object.getOwnPropertyNames(${value}).every(key => ${keys}.includes(key))`; + } + } + if (typeof schema.additionalProperties === 'object') { + const expression = CreateExpression(schema.additionalProperties, references, 'value[key]'); + const keys = `[${knownKeys.map((key) => `'${key}'`).join(', ')}]`; + yield `(Object.getOwnPropertyNames(${value}).every(key => ${keys}.includes(key) || ${expression}))`; + } + } + function* Promise(schema, references, value) { + yield `(typeof value === 'object' && typeof ${value}.then === 'function')`; + } + function* Record(schema, references, value) { + yield IsRecordCheck(value); + if (IsNumber(schema.minProperties)) + yield `Object.getOwnPropertyNames(${value}).length >= ${schema.minProperties}`; + if (IsNumber(schema.maxProperties)) + yield `Object.getOwnPropertyNames(${value}).length <= ${schema.maxProperties}`; + const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0]; + const local = PushLocal(`new RegExp(/${keyPattern}/)`); + yield `(Object.getOwnPropertyNames(${value}).every(key => ${local}.test(key)))`; + const expression = CreateExpression(valueSchema, references, 'value'); + yield `Object.values(${value}).every(value => ${expression})`; + } + function* Ref(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new TypeCompilerDereferenceError(schema); + const target = references[index]; + // Reference: If we have seen this reference before we can just yield and return + // the function call. If this isn't the case we defer to visit to generate and + // set the function for subsequent passes. Consider for refactor. + if (state_local_function_names.has(schema.$ref)) + return yield `${CreateFunctionName(schema.$ref)}(${value})`; + yield* Visit(target, references, value); + } + function* String(schema, references, value) { + yield `(typeof ${value} === 'string')`; + if (IsNumber(schema.minLength)) + yield `${value}.length >= ${schema.minLength}`; + if (IsNumber(schema.maxLength)) + yield `${value}.length <= ${schema.maxLength}`; + if (schema.pattern !== undefined) { + const local = PushLocal(`${new RegExp(schema.pattern)};`); + yield `${local}.test(${value})`; + } + if (schema.format !== undefined) { + yield `format('${schema.format}', ${value})`; + } + } + function* Symbol(schema, references, value) { + yield `(typeof ${value} === 'symbol')`; + } + function* TemplateLiteral(schema, references, value) { + yield `(typeof ${value} === 'string')`; + const local = PushLocal(`${new RegExp(schema.pattern)};`); + yield `${local}.test(${value})`; + } + function* This(schema, references, value) { + const func = CreateFunctionName(schema.$ref); + yield `${func}(${value})`; + } + function* Tuple(schema, references, value) { + yield `(Array.isArray(${value}))`; + if (schema.items === undefined) + return yield `${value}.length === 0`; + yield `(${value}.length === ${schema.maxItems})`; + for (let i = 0; i < schema.items.length; i++) { + const expression = CreateExpression(schema.items[i], references, `${value}[${i}]`); + yield `${expression}`; + } + } + function* Undefined(schema, references, value) { + yield `${value} === undefined`; + } + function* Union(schema, references, value) { + const expressions = schema.anyOf.map((schema) => CreateExpression(schema, references, value)); + yield `(${expressions.join(' || ')})`; + } + function* Uint8Array(schema, references, value) { + yield `${value} instanceof Uint8Array`; + if (IsNumber(schema.maxByteLength)) + yield `(${value}.length <= ${schema.maxByteLength})`; + if (IsNumber(schema.minByteLength)) + yield `(${value}.length >= ${schema.minByteLength})`; + } + function* Unknown(schema, references, value) { + yield 'true'; + } + function* Void(schema, references, value) { + yield IsVoidCheck(value); + } + function* UserDefined(schema, references, value) { + const schema_key = `schema_key_${state_remote_custom_types.size}`; + state_remote_custom_types.set(schema_key, schema); + yield `custom('${schema[Types.Kind]}', '${schema_key}', ${value})`; + } + function* Visit(schema, references, value) { + const references_ = IsString(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + // Reference: Referenced schemas can originate from either additional schemas + // or inline in the schema itself. Ideally the recursive path should align to + // reference path. Consider for refactor. + if (IsString(schema.$id) && !state_local_function_names.has(schema.$id)) { + state_local_function_names.add(schema.$id); + const name = CreateFunctionName(schema.$id); + const body = CreateFunction(name, schema, references, 'value'); + PushFunction(body); + yield `${name}(${value})`; + return; + } + switch (schema_[Types.Kind]) { + case 'Any': + return yield* Any(schema_, references_, value); + case 'Array': + return yield* Array(schema_, references_, value); + case 'BigInt': + return yield* BigInt(schema_, references_, value); + case 'Boolean': + return yield* Boolean(schema_, references_, value); + case 'Constructor': + return yield* Constructor(schema_, references_, value); + case 'Date': + return yield* Date(schema_, references_, value); + case 'Function': + return yield* Function(schema_, references_, value); + case 'Integer': + return yield* Integer(schema_, references_, value); + case 'Intersect': + return yield* Intersect(schema_, references_, value); + case 'Literal': + return yield* Literal(schema_, references_, value); + case 'Never': + return yield* Never(schema_, references_, value); + case 'Not': + return yield* Not(schema_, references_, value); + case 'Null': + return yield* Null(schema_, references_, value); + case 'Number': + return yield* Number(schema_, references_, value); + case 'Object': + return yield* Object(schema_, references_, value); + case 'Promise': + return yield* Promise(schema_, references_, value); + case 'Record': + return yield* Record(schema_, references_, value); + case 'Ref': + return yield* Ref(schema_, references_, value); + case 'String': + return yield* String(schema_, references_, value); + case 'Symbol': + return yield* Symbol(schema_, references_, value); + case 'TemplateLiteral': + return yield* TemplateLiteral(schema_, references_, value); + case 'This': + return yield* This(schema_, references_, value); + case 'Tuple': + return yield* Tuple(schema_, references_, value); + case 'Undefined': + return yield* Undefined(schema_, references_, value); + case 'Union': + return yield* Union(schema_, references_, value); + case 'Uint8Array': + return yield* Uint8Array(schema_, references_, value); + case 'Unknown': + return yield* Unknown(schema_, references_, value); + case 'Void': + return yield* Void(schema_, references_, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new TypeCompilerUnknownTypeError(schema); + return yield* UserDefined(schema_, references_, value); + } + } + // ------------------------------------------------------------------- + // Compiler State + // ------------------------------------------------------------------- + const state_local_variables = new Set(); // local variables and functions + const state_local_function_names = new Set(); // local function names used call ref validators + const state_remote_custom_types = new Map(); // remote custom types used during compilation + function ResetCompiler() { + state_local_variables.clear(); + state_local_function_names.clear(); + state_remote_custom_types.clear(); + } + function CreateExpression(schema, references, value) { + return `(${[...Visit(schema, references, value)].join(' && ')})`; + } + function CreateFunctionName($id) { + return `check_${Identifier.Encode($id)}`; + } + function CreateFunction(name, schema, references, value) { + const expression = [...Visit(schema, references, value)].map((condition) => ` ${condition}`).join(' &&\n'); + return `function ${name}(value) {\n return (\n${expression}\n )\n}`; + } + function PushFunction(functionBody) { + state_local_variables.add(functionBody); + } + function PushLocal(expression) { + const local = `local_${state_local_variables.size}`; + state_local_variables.add(`const ${local} = ${expression}`); + return local; + } + function GetLocals() { + return [...state_local_variables.values()]; + } + // ------------------------------------------------------------------- + // Compile + // ------------------------------------------------------------------- + function Build(schema, references) { + ResetCompiler(); + const check = CreateFunction('check', schema, references, 'value'); + const locals = GetLocals(); + return `${locals.join('\n')}\nreturn ${check}`; + } + /** Returns the generated assertion code used to validate this type. */ + function Code(schema, references = []) { + if (!Types.TypeGuard.TSchema(schema)) + throw new TypeCompilerTypeGuardError(schema); + for (const schema of references) + if (!Types.TypeGuard.TSchema(schema)) + throw new TypeCompilerTypeGuardError(schema); + return Build(schema, references); + } + TypeCompiler.Code = Code; + /** Compiles the given type for runtime type checking. This compiler only accepts known TypeBox types non-inclusive of unsafe types. */ + function Compile(schema, references = []) { + const code = Code(schema, references); + const custom_schemas = new Map(state_remote_custom_types); + const compiledFunction = globalThis.Function('custom', 'format', 'hash', code); + const checkFunction = compiledFunction((kind, schema_key, value) => { + if (!Types.TypeRegistry.Has(kind) || !custom_schemas.has(schema_key)) + return false; + const schema = custom_schemas.get(schema_key); + const func = Types.TypeRegistry.Get(kind); + return func(schema, value); + }, (format, value) => { + if (!Types.FormatRegistry.Has(format)) + return false; + const func = Types.FormatRegistry.Get(format); + return func(value); + }, (value) => { + return hash_1.ValueHash.Create(value); + }); + return new TypeCheck(schema, references, checkFunction, code); + } + TypeCompiler.Compile = Compile; +})(TypeCompiler = exports.TypeCompiler || (exports.TypeCompiler = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/index.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/index.d.ts new file mode 100644 index 0000000..4062a62 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/index.d.ts @@ -0,0 +1,2 @@ +export { ValueError, ValueErrorType } from '../errors/index'; +export * from './compiler'; diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/index.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/index.js new file mode 100644 index 0000000..7a013c3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/compiler/index.js @@ -0,0 +1,47 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/compiler + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueErrorType = void 0; +var index_1 = require("../errors/index"); +Object.defineProperty(exports, "ValueErrorType", { enumerable: true, get: function () { return index_1.ValueErrorType; } }); +__exportStar(require("./compiler"), exports); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/errors.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/errors.d.ts new file mode 100644 index 0000000..89786c6 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/errors.d.ts @@ -0,0 +1,88 @@ +import * as Types from '../typebox'; +export declare enum ValueErrorType { + Array = 0, + ArrayMinItems = 1, + ArrayMaxItems = 2, + ArrayUniqueItems = 3, + BigInt = 4, + BigIntMultipleOf = 5, + BigIntExclusiveMinimum = 6, + BigIntExclusiveMaximum = 7, + BigIntMinimum = 8, + BigIntMaximum = 9, + Boolean = 10, + Date = 11, + DateExclusiveMinimumTimestamp = 12, + DateExclusiveMaximumTimestamp = 13, + DateMinimumTimestamp = 14, + DateMaximumTimestamp = 15, + Function = 16, + Integer = 17, + IntegerMultipleOf = 18, + IntegerExclusiveMinimum = 19, + IntegerExclusiveMaximum = 20, + IntegerMinimum = 21, + IntegerMaximum = 22, + Intersect = 23, + IntersectUnevaluatedProperties = 24, + Literal = 25, + Never = 26, + Not = 27, + Null = 28, + Number = 29, + NumberMultipleOf = 30, + NumberExclusiveMinimum = 31, + NumberExclusiveMaximum = 32, + NumberMinumum = 33, + NumberMaximum = 34, + Object = 35, + ObjectMinProperties = 36, + ObjectMaxProperties = 37, + ObjectAdditionalProperties = 38, + ObjectRequiredProperties = 39, + Promise = 40, + RecordKeyNumeric = 41, + RecordKeyString = 42, + String = 43, + StringMinLength = 44, + StringMaxLength = 45, + StringPattern = 46, + StringFormatUnknown = 47, + StringFormat = 48, + Symbol = 49, + TupleZeroLength = 50, + TupleLength = 51, + Undefined = 52, + Union = 53, + Uint8Array = 54, + Uint8ArrayMinByteLength = 55, + Uint8ArrayMaxByteLength = 56, + Void = 57, + Custom = 58 +} +export interface ValueError { + type: ValueErrorType; + schema: Types.TSchema; + path: string; + value: unknown; + message: string; +} +export declare class ValueErrorIterator { + private readonly iterator; + constructor(iterator: IterableIterator); + [Symbol.iterator](): IterableIterator; + /** Returns the first value error or undefined if no errors */ + First(): ValueError | undefined; +} +export declare class ValueErrorsUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueErrorsDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +/** Provides functionality to generate a sequence of errors against a TypeBox type. */ +export declare namespace ValueErrors { + function Errors(schema: T, references: Types.TSchema[], value: any): ValueErrorIterator; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/errors.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/errors.js new file mode 100644 index 0000000..4f7210b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/errors.js @@ -0,0 +1,609 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueErrors = exports.ValueErrorsDereferenceError = exports.ValueErrorsUnknownTypeError = exports.ValueErrorIterator = exports.ValueErrorType = void 0; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/errors + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +const Types = require("../typebox"); +const index_1 = require("../system/index"); +const hash_1 = require("../value/hash"); +// ------------------------------------------------------------------- +// ValueErrorType +// ------------------------------------------------------------------- +var ValueErrorType; +(function (ValueErrorType) { + ValueErrorType[ValueErrorType["Array"] = 0] = "Array"; + ValueErrorType[ValueErrorType["ArrayMinItems"] = 1] = "ArrayMinItems"; + ValueErrorType[ValueErrorType["ArrayMaxItems"] = 2] = "ArrayMaxItems"; + ValueErrorType[ValueErrorType["ArrayUniqueItems"] = 3] = "ArrayUniqueItems"; + ValueErrorType[ValueErrorType["BigInt"] = 4] = "BigInt"; + ValueErrorType[ValueErrorType["BigIntMultipleOf"] = 5] = "BigIntMultipleOf"; + ValueErrorType[ValueErrorType["BigIntExclusiveMinimum"] = 6] = "BigIntExclusiveMinimum"; + ValueErrorType[ValueErrorType["BigIntExclusiveMaximum"] = 7] = "BigIntExclusiveMaximum"; + ValueErrorType[ValueErrorType["BigIntMinimum"] = 8] = "BigIntMinimum"; + ValueErrorType[ValueErrorType["BigIntMaximum"] = 9] = "BigIntMaximum"; + ValueErrorType[ValueErrorType["Boolean"] = 10] = "Boolean"; + ValueErrorType[ValueErrorType["Date"] = 11] = "Date"; + ValueErrorType[ValueErrorType["DateExclusiveMinimumTimestamp"] = 12] = "DateExclusiveMinimumTimestamp"; + ValueErrorType[ValueErrorType["DateExclusiveMaximumTimestamp"] = 13] = "DateExclusiveMaximumTimestamp"; + ValueErrorType[ValueErrorType["DateMinimumTimestamp"] = 14] = "DateMinimumTimestamp"; + ValueErrorType[ValueErrorType["DateMaximumTimestamp"] = 15] = "DateMaximumTimestamp"; + ValueErrorType[ValueErrorType["Function"] = 16] = "Function"; + ValueErrorType[ValueErrorType["Integer"] = 17] = "Integer"; + ValueErrorType[ValueErrorType["IntegerMultipleOf"] = 18] = "IntegerMultipleOf"; + ValueErrorType[ValueErrorType["IntegerExclusiveMinimum"] = 19] = "IntegerExclusiveMinimum"; + ValueErrorType[ValueErrorType["IntegerExclusiveMaximum"] = 20] = "IntegerExclusiveMaximum"; + ValueErrorType[ValueErrorType["IntegerMinimum"] = 21] = "IntegerMinimum"; + ValueErrorType[ValueErrorType["IntegerMaximum"] = 22] = "IntegerMaximum"; + ValueErrorType[ValueErrorType["Intersect"] = 23] = "Intersect"; + ValueErrorType[ValueErrorType["IntersectUnevaluatedProperties"] = 24] = "IntersectUnevaluatedProperties"; + ValueErrorType[ValueErrorType["Literal"] = 25] = "Literal"; + ValueErrorType[ValueErrorType["Never"] = 26] = "Never"; + ValueErrorType[ValueErrorType["Not"] = 27] = "Not"; + ValueErrorType[ValueErrorType["Null"] = 28] = "Null"; + ValueErrorType[ValueErrorType["Number"] = 29] = "Number"; + ValueErrorType[ValueErrorType["NumberMultipleOf"] = 30] = "NumberMultipleOf"; + ValueErrorType[ValueErrorType["NumberExclusiveMinimum"] = 31] = "NumberExclusiveMinimum"; + ValueErrorType[ValueErrorType["NumberExclusiveMaximum"] = 32] = "NumberExclusiveMaximum"; + ValueErrorType[ValueErrorType["NumberMinumum"] = 33] = "NumberMinumum"; + ValueErrorType[ValueErrorType["NumberMaximum"] = 34] = "NumberMaximum"; + ValueErrorType[ValueErrorType["Object"] = 35] = "Object"; + ValueErrorType[ValueErrorType["ObjectMinProperties"] = 36] = "ObjectMinProperties"; + ValueErrorType[ValueErrorType["ObjectMaxProperties"] = 37] = "ObjectMaxProperties"; + ValueErrorType[ValueErrorType["ObjectAdditionalProperties"] = 38] = "ObjectAdditionalProperties"; + ValueErrorType[ValueErrorType["ObjectRequiredProperties"] = 39] = "ObjectRequiredProperties"; + ValueErrorType[ValueErrorType["Promise"] = 40] = "Promise"; + ValueErrorType[ValueErrorType["RecordKeyNumeric"] = 41] = "RecordKeyNumeric"; + ValueErrorType[ValueErrorType["RecordKeyString"] = 42] = "RecordKeyString"; + ValueErrorType[ValueErrorType["String"] = 43] = "String"; + ValueErrorType[ValueErrorType["StringMinLength"] = 44] = "StringMinLength"; + ValueErrorType[ValueErrorType["StringMaxLength"] = 45] = "StringMaxLength"; + ValueErrorType[ValueErrorType["StringPattern"] = 46] = "StringPattern"; + ValueErrorType[ValueErrorType["StringFormatUnknown"] = 47] = "StringFormatUnknown"; + ValueErrorType[ValueErrorType["StringFormat"] = 48] = "StringFormat"; + ValueErrorType[ValueErrorType["Symbol"] = 49] = "Symbol"; + ValueErrorType[ValueErrorType["TupleZeroLength"] = 50] = "TupleZeroLength"; + ValueErrorType[ValueErrorType["TupleLength"] = 51] = "TupleLength"; + ValueErrorType[ValueErrorType["Undefined"] = 52] = "Undefined"; + ValueErrorType[ValueErrorType["Union"] = 53] = "Union"; + ValueErrorType[ValueErrorType["Uint8Array"] = 54] = "Uint8Array"; + ValueErrorType[ValueErrorType["Uint8ArrayMinByteLength"] = 55] = "Uint8ArrayMinByteLength"; + ValueErrorType[ValueErrorType["Uint8ArrayMaxByteLength"] = 56] = "Uint8ArrayMaxByteLength"; + ValueErrorType[ValueErrorType["Void"] = 57] = "Void"; + ValueErrorType[ValueErrorType["Custom"] = 58] = "Custom"; +})(ValueErrorType = exports.ValueErrorType || (exports.ValueErrorType = {})); +// ------------------------------------------------------------------- +// ValueErrorIterator +// ------------------------------------------------------------------- +class ValueErrorIterator { + constructor(iterator) { + this.iterator = iterator; + } + [Symbol.iterator]() { + return this.iterator; + } + /** Returns the first value error or undefined if no errors */ + First() { + const next = this.iterator.next(); + return next.done ? undefined : next.value; + } +} +exports.ValueErrorIterator = ValueErrorIterator; +// ------------------------------------------------------------------- +// ValueErrors +// ------------------------------------------------------------------- +class ValueErrorsUnknownTypeError extends Error { + constructor(schema) { + super('ValueErrors: Unknown type'); + this.schema = schema; + } +} +exports.ValueErrorsUnknownTypeError = ValueErrorsUnknownTypeError; +class ValueErrorsDereferenceError extends Error { + constructor(schema) { + super(`ValueErrors: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueErrorsDereferenceError = ValueErrorsDereferenceError; +/** Provides functionality to generate a sequence of errors against a TypeBox type. */ +var ValueErrors; +(function (ValueErrors) { + // ---------------------------------------------------------------------- + // Guards + // ---------------------------------------------------------------------- + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsInteger(value) { + return globalThis.Number.isInteger(value); + } + function IsString(value) { + return typeof value === 'string'; + } + function IsDefined(value) { + return value !== undefined; + } + // ---------------------------------------------------------------------- + // Policies + // ---------------------------------------------------------------------- + function IsExactOptionalProperty(value, key) { + return index_1.TypeSystem.ExactOptionalPropertyTypes ? key in value : value[key] !== undefined; + } + function IsObject(value) { + const result = typeof value === 'object' && value !== null; + return index_1.TypeSystem.AllowArrayObjects ? result : result && !globalThis.Array.isArray(value); + } + function IsRecordObject(value) { + return IsObject(value) && !(value instanceof globalThis.Date) && !(value instanceof globalThis.Uint8Array); + } + function IsNumber(value) { + const result = typeof value === 'number'; + return index_1.TypeSystem.AllowNaN ? result : result && globalThis.Number.isFinite(value); + } + function IsVoid(value) { + const result = value === undefined; + return index_1.TypeSystem.AllowVoidNull ? result || value === null : result; + } + // ---------------------------------------------------------------------- + // Types + // ---------------------------------------------------------------------- + function* Any(schema, references, path, value) { } + function* Array(schema, references, path, value) { + if (!globalThis.Array.isArray(value)) { + return yield { type: ValueErrorType.Array, schema, path, value, message: `Expected array` }; + } + if (IsDefined(schema.minItems) && !(value.length >= schema.minItems)) { + yield { type: ValueErrorType.ArrayMinItems, schema, path, value, message: `Expected array length to be greater or equal to ${schema.minItems}` }; + } + if (IsDefined(schema.maxItems) && !(value.length <= schema.maxItems)) { + yield { type: ValueErrorType.ArrayMinItems, schema, path, value, message: `Expected array length to be less or equal to ${schema.maxItems}` }; + } + // prettier-ignore + if (schema.uniqueItems === true && !((function () { const set = new Set(); for (const element of value) { + const hashed = hash_1.ValueHash.Create(element); + if (set.has(hashed)) { + return false; + } + else { + set.add(hashed); + } + } return true; })())) { + yield { type: ValueErrorType.ArrayUniqueItems, schema, path, value, message: `Expected array elements to be unique` }; + } + for (let i = 0; i < value.length; i++) { + yield* Visit(schema.items, references, `${path}/${i}`, value[i]); + } + } + function* BigInt(schema, references, path, value) { + if (!IsBigInt(value)) { + return yield { type: ValueErrorType.BigInt, schema, path, value, message: `Expected bigint` }; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === globalThis.BigInt(0))) { + yield { type: ValueErrorType.BigIntMultipleOf, schema, path, value, message: `Expected bigint to be a multiple of ${schema.multipleOf}` }; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + yield { type: ValueErrorType.BigIntExclusiveMinimum, schema, path, value, message: `Expected bigint to be greater than ${schema.exclusiveMinimum}` }; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + yield { type: ValueErrorType.BigIntExclusiveMaximum, schema, path, value, message: `Expected bigint to be less than ${schema.exclusiveMaximum}` }; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + yield { type: ValueErrorType.BigIntMinimum, schema, path, value, message: `Expected bigint to be greater or equal to ${schema.minimum}` }; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + yield { type: ValueErrorType.BigIntMaximum, schema, path, value, message: `Expected bigint to be less or equal to ${schema.maximum}` }; + } + } + function* Boolean(schema, references, path, value) { + if (!(typeof value === 'boolean')) { + return yield { type: ValueErrorType.Boolean, schema, path, value, message: `Expected boolean` }; + } + } + function* Constructor(schema, references, path, value) { + yield* Visit(schema.returns, references, path, value.prototype); + } + function* Date(schema, references, path, value) { + if (!(value instanceof globalThis.Date)) { + return yield { type: ValueErrorType.Date, schema, path, value, message: `Expected Date object` }; + } + if (!globalThis.isFinite(value.getTime())) { + return yield { type: ValueErrorType.Date, schema, path, value, message: `Invalid Date` }; + } + if (IsDefined(schema.exclusiveMinimumTimestamp) && !(value.getTime() > schema.exclusiveMinimumTimestamp)) { + yield { type: ValueErrorType.DateExclusiveMinimumTimestamp, schema, path, value, message: `Expected Date timestamp to be greater than ${schema.exclusiveMinimum}` }; + } + if (IsDefined(schema.exclusiveMaximumTimestamp) && !(value.getTime() < schema.exclusiveMaximumTimestamp)) { + yield { type: ValueErrorType.DateExclusiveMaximumTimestamp, schema, path, value, message: `Expected Date timestamp to be less than ${schema.exclusiveMaximum}` }; + } + if (IsDefined(schema.minimumTimestamp) && !(value.getTime() >= schema.minimumTimestamp)) { + yield { type: ValueErrorType.DateMinimumTimestamp, schema, path, value, message: `Expected Date timestamp to be greater or equal to ${schema.minimum}` }; + } + if (IsDefined(schema.maximumTimestamp) && !(value.getTime() <= schema.maximumTimestamp)) { + yield { type: ValueErrorType.DateMaximumTimestamp, schema, path, value, message: `Expected Date timestamp to be less or equal to ${schema.maximum}` }; + } + } + function* Function(schema, references, path, value) { + if (!(typeof value === 'function')) { + return yield { type: ValueErrorType.Function, schema, path, value, message: `Expected function` }; + } + } + function* Integer(schema, references, path, value) { + if (!IsInteger(value)) { + return yield { type: ValueErrorType.Integer, schema, path, value, message: `Expected integer` }; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === 0)) { + yield { type: ValueErrorType.IntegerMultipleOf, schema, path, value, message: `Expected integer to be a multiple of ${schema.multipleOf}` }; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + yield { type: ValueErrorType.IntegerExclusiveMinimum, schema, path, value, message: `Expected integer to be greater than ${schema.exclusiveMinimum}` }; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + yield { type: ValueErrorType.IntegerExclusiveMaximum, schema, path, value, message: `Expected integer to be less than ${schema.exclusiveMaximum}` }; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + yield { type: ValueErrorType.IntegerMinimum, schema, path, value, message: `Expected integer to be greater or equal to ${schema.minimum}` }; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + yield { type: ValueErrorType.IntegerMaximum, schema, path, value, message: `Expected integer to be less or equal to ${schema.maximum}` }; + } + } + function* Intersect(schema, references, path, value) { + for (const subschema of schema.allOf) { + const next = Visit(subschema, references, path, value).next(); + if (!next.done) { + yield next.value; + yield { type: ValueErrorType.Intersect, schema, path, value, message: `Expected all sub schemas to be valid` }; + return; + } + } + if (schema.unevaluatedProperties === false) { + const schemaKeys = Types.KeyResolver.Resolve(schema); + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + for (const valueKey of valueKeys) { + if (!schemaKeys.includes(valueKey)) { + yield { type: ValueErrorType.IntersectUnevaluatedProperties, schema, path: `${path}/${valueKey}`, value, message: `Unexpected property` }; + } + } + } + if (typeof schema.unevaluatedProperties === 'object') { + const schemaKeys = Types.KeyResolver.Resolve(schema); + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + for (const valueKey of valueKeys) { + if (!schemaKeys.includes(valueKey)) { + const next = Visit(schema.unevaluatedProperties, references, `${path}/${valueKey}`, value[valueKey]).next(); + if (!next.done) { + yield next.value; + yield { type: ValueErrorType.IntersectUnevaluatedProperties, schema, path: `${path}/${valueKey}`, value, message: `Invalid additional property` }; + return; + } + } + } + } + } + function* Literal(schema, references, path, value) { + if (!(value === schema.const)) { + const error = typeof schema.const === 'string' ? `'${schema.const}'` : schema.const; + return yield { type: ValueErrorType.Literal, schema, path, value, message: `Expected ${error}` }; + } + } + function* Never(schema, references, path, value) { + yield { type: ValueErrorType.Never, schema, path, value, message: `Value cannot be validated` }; + } + function* Not(schema, references, path, value) { + if (Visit(schema.allOf[0].not, references, path, value).next().done === true) { + yield { type: ValueErrorType.Not, schema, path, value, message: `Value should not validate` }; + } + yield* Visit(schema.allOf[1], references, path, value); + } + function* Null(schema, references, path, value) { + if (!(value === null)) { + return yield { type: ValueErrorType.Null, schema, path, value, message: `Expected null` }; + } + } + function* Number(schema, references, path, value) { + if (!IsNumber(value)) { + return yield { type: ValueErrorType.Number, schema, path, value, message: `Expected number` }; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === 0)) { + yield { type: ValueErrorType.NumberMultipleOf, schema, path, value, message: `Expected number to be a multiple of ${schema.multipleOf}` }; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + yield { type: ValueErrorType.NumberExclusiveMinimum, schema, path, value, message: `Expected number to be greater than ${schema.exclusiveMinimum}` }; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + yield { type: ValueErrorType.NumberExclusiveMaximum, schema, path, value, message: `Expected number to be less than ${schema.exclusiveMaximum}` }; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + yield { type: ValueErrorType.NumberMaximum, schema, path, value, message: `Expected number to be greater or equal to ${schema.minimum}` }; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + yield { type: ValueErrorType.NumberMinumum, schema, path, value, message: `Expected number to be less or equal to ${schema.maximum}` }; + } + } + function* Object(schema, references, path, value) { + if (!IsObject(value)) { + return yield { type: ValueErrorType.Object, schema, path, value, message: `Expected object` }; + } + if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) { + yield { type: ValueErrorType.ObjectMinProperties, schema, path, value, message: `Expected object to have at least ${schema.minProperties} properties` }; + } + if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) { + yield { type: ValueErrorType.ObjectMaxProperties, schema, path, value, message: `Expected object to have less than ${schema.minProperties} properties` }; + } + const requiredKeys = globalThis.Array.isArray(schema.required) ? schema.required : []; + const knownKeys = globalThis.Object.getOwnPropertyNames(schema.properties); + const unknownKeys = globalThis.Object.getOwnPropertyNames(value); + for (const knownKey of knownKeys) { + const property = schema.properties[knownKey]; + if (schema.required && schema.required.includes(knownKey)) { + yield* Visit(property, references, `${path}/${knownKey}`, value[knownKey]); + if (Types.ExtendsUndefined.Check(schema) && !(knownKey in value)) { + yield { type: ValueErrorType.ObjectRequiredProperties, schema: property, path: `${path}/${knownKey}`, value: undefined, message: `Expected required property` }; + } + } + else { + if (IsExactOptionalProperty(value, knownKey)) { + yield* Visit(property, references, `${path}/${knownKey}`, value[knownKey]); + } + } + } + for (const requiredKey of requiredKeys) { + if (unknownKeys.includes(requiredKey)) + continue; + yield { type: ValueErrorType.ObjectRequiredProperties, schema: schema.properties[requiredKey], path: `${path}/${requiredKey}`, value: undefined, message: `Expected required property` }; + } + if (schema.additionalProperties === false) { + for (const valueKey of unknownKeys) { + if (!knownKeys.includes(valueKey)) { + yield { type: ValueErrorType.ObjectAdditionalProperties, schema, path: `${path}/${valueKey}`, value: value[valueKey], message: `Unexpected property` }; + } + } + } + if (typeof schema.additionalProperties === 'object') { + for (const valueKey of unknownKeys) { + if (knownKeys.includes(valueKey)) + continue; + yield* Visit(schema.additionalProperties, references, `${path}/${valueKey}`, value[valueKey]); + } + } + } + function* Promise(schema, references, path, value) { + if (!(typeof value === 'object' && typeof value.then === 'function')) { + yield { type: ValueErrorType.Promise, schema, path, value, message: `Expected Promise` }; + } + } + function* Record(schema, references, path, value) { + if (!IsRecordObject(value)) { + return yield { type: ValueErrorType.Object, schema, path, value, message: `Expected record object` }; + } + if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) { + yield { type: ValueErrorType.ObjectMinProperties, schema, path, value, message: `Expected object to have at least ${schema.minProperties} properties` }; + } + if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) { + yield { type: ValueErrorType.ObjectMaxProperties, schema, path, value, message: `Expected object to have less than ${schema.minProperties} properties` }; + } + const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0]; + const regex = new RegExp(keyPattern); + if (!globalThis.Object.getOwnPropertyNames(value).every((key) => regex.test(key))) { + const numeric = keyPattern === Types.PatternNumberExact; + const type = numeric ? ValueErrorType.RecordKeyNumeric : ValueErrorType.RecordKeyString; + const message = numeric ? 'Expected all object property keys to be numeric' : 'Expected all object property keys to be strings'; + return yield { type, schema, path, value, message }; + } + for (const [propKey, propValue] of globalThis.Object.entries(value)) { + yield* Visit(valueSchema, references, `${path}/${propKey}`, propValue); + } + } + function* Ref(schema, references, path, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueErrorsDereferenceError(schema); + const target = references[index]; + yield* Visit(target, references, path, value); + } + function* String(schema, references, path, value) { + if (!IsString(value)) { + return yield { type: ValueErrorType.String, schema, path, value, message: 'Expected string' }; + } + if (IsDefined(schema.minLength) && !(value.length >= schema.minLength)) { + yield { type: ValueErrorType.StringMinLength, schema, path, value, message: `Expected string length greater or equal to ${schema.minLength}` }; + } + if (IsDefined(schema.maxLength) && !(value.length <= schema.maxLength)) { + yield { type: ValueErrorType.StringMaxLength, schema, path, value, message: `Expected string length less or equal to ${schema.maxLength}` }; + } + if (schema.pattern !== undefined) { + const regex = new RegExp(schema.pattern); + if (!regex.test(value)) { + yield { type: ValueErrorType.StringPattern, schema, path, value, message: `Expected string to match pattern ${schema.pattern}` }; + } + } + if (schema.format !== undefined) { + if (!Types.FormatRegistry.Has(schema.format)) { + yield { type: ValueErrorType.StringFormatUnknown, schema, path, value, message: `Unknown string format '${schema.format}'` }; + } + else { + const format = Types.FormatRegistry.Get(schema.format); + if (!format(value)) { + yield { type: ValueErrorType.StringFormat, schema, path, value, message: `Expected string to match format '${schema.format}'` }; + } + } + } + } + function* Symbol(schema, references, path, value) { + if (!(typeof value === 'symbol')) { + return yield { type: ValueErrorType.Symbol, schema, path, value, message: 'Expected symbol' }; + } + } + function* TemplateLiteral(schema, references, path, value) { + if (!IsString(value)) { + return yield { type: ValueErrorType.String, schema, path, value, message: 'Expected string' }; + } + const regex = new RegExp(schema.pattern); + if (!regex.test(value)) { + yield { type: ValueErrorType.StringPattern, schema, path, value, message: `Expected string to match pattern ${schema.pattern}` }; + } + } + function* This(schema, references, path, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueErrorsDereferenceError(schema); + const target = references[index]; + yield* Visit(target, references, path, value); + } + function* Tuple(schema, references, path, value) { + if (!globalThis.Array.isArray(value)) { + return yield { type: ValueErrorType.Array, schema, path, value, message: 'Expected Array' }; + } + if (schema.items === undefined && !(value.length === 0)) { + return yield { type: ValueErrorType.TupleZeroLength, schema, path, value, message: 'Expected tuple to have 0 elements' }; + } + if (!(value.length === schema.maxItems)) { + yield { type: ValueErrorType.TupleLength, schema, path, value, message: `Expected tuple to have ${schema.maxItems} elements` }; + } + if (!schema.items) { + return; + } + for (let i = 0; i < schema.items.length; i++) { + yield* Visit(schema.items[i], references, `${path}/${i}`, value[i]); + } + } + function* Undefined(schema, references, path, value) { + if (!(value === undefined)) { + yield { type: ValueErrorType.Undefined, schema, path, value, message: `Expected undefined` }; + } + } + function* Union(schema, references, path, value) { + const errors = []; + for (const inner of schema.anyOf) { + const variantErrors = [...Visit(inner, references, path, value)]; + if (variantErrors.length === 0) + return; + errors.push(...variantErrors); + } + if (errors.length > 0) { + yield { type: ValueErrorType.Union, schema, path, value, message: 'Expected value of union' }; + } + for (const error of errors) { + yield error; + } + } + function* Uint8Array(schema, references, path, value) { + if (!(value instanceof globalThis.Uint8Array)) { + return yield { type: ValueErrorType.Uint8Array, schema, path, value, message: `Expected Uint8Array` }; + } + if (IsDefined(schema.maxByteLength) && !(value.length <= schema.maxByteLength)) { + yield { type: ValueErrorType.Uint8ArrayMaxByteLength, schema, path, value, message: `Expected Uint8Array to have a byte length less or equal to ${schema.maxByteLength}` }; + } + if (IsDefined(schema.minByteLength) && !(value.length >= schema.minByteLength)) { + yield { type: ValueErrorType.Uint8ArrayMinByteLength, schema, path, value, message: `Expected Uint8Array to have a byte length greater or equal to ${schema.maxByteLength}` }; + } + } + function* Unknown(schema, references, path, value) { } + function* Void(schema, references, path, value) { + if (!IsVoid(value)) { + return yield { type: ValueErrorType.Void, schema, path, value, message: `Expected void` }; + } + } + function* UserDefined(schema, references, path, value) { + const check = Types.TypeRegistry.Get(schema[Types.Kind]); + if (!check(schema, value)) { + return yield { type: ValueErrorType.Custom, schema, path, value, message: `Expected kind ${schema[Types.Kind]}` }; + } + } + function* Visit(schema, references, path, value) { + const references_ = IsDefined(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema_[Types.Kind]) { + case 'Any': + return yield* Any(schema_, references_, path, value); + case 'Array': + return yield* Array(schema_, references_, path, value); + case 'BigInt': + return yield* BigInt(schema_, references_, path, value); + case 'Boolean': + return yield* Boolean(schema_, references_, path, value); + case 'Constructor': + return yield* Constructor(schema_, references_, path, value); + case 'Date': + return yield* Date(schema_, references_, path, value); + case 'Function': + return yield* Function(schema_, references_, path, value); + case 'Integer': + return yield* Integer(schema_, references_, path, value); + case 'Intersect': + return yield* Intersect(schema_, references_, path, value); + case 'Literal': + return yield* Literal(schema_, references_, path, value); + case 'Never': + return yield* Never(schema_, references_, path, value); + case 'Not': + return yield* Not(schema_, references_, path, value); + case 'Null': + return yield* Null(schema_, references_, path, value); + case 'Number': + return yield* Number(schema_, references_, path, value); + case 'Object': + return yield* Object(schema_, references_, path, value); + case 'Promise': + return yield* Promise(schema_, references_, path, value); + case 'Record': + return yield* Record(schema_, references_, path, value); + case 'Ref': + return yield* Ref(schema_, references_, path, value); + case 'String': + return yield* String(schema_, references_, path, value); + case 'Symbol': + return yield* Symbol(schema_, references_, path, value); + case 'TemplateLiteral': + return yield* TemplateLiteral(schema_, references_, path, value); + case 'This': + return yield* This(schema_, references_, path, value); + case 'Tuple': + return yield* Tuple(schema_, references_, path, value); + case 'Undefined': + return yield* Undefined(schema_, references_, path, value); + case 'Union': + return yield* Union(schema_, references_, path, value); + case 'Uint8Array': + return yield* Uint8Array(schema_, references_, path, value); + case 'Unknown': + return yield* Unknown(schema_, references_, path, value); + case 'Void': + return yield* Void(schema_, references_, path, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueErrorsUnknownTypeError(schema); + return yield* UserDefined(schema_, references_, path, value); + } + } + function Errors(schema, references, value) { + const iterator = Visit(schema, references, '', value); + return new ValueErrorIterator(iterator); + } + ValueErrors.Errors = Errors; +})(ValueErrors = exports.ValueErrors || (exports.ValueErrors = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/index.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/index.d.ts new file mode 100644 index 0000000..f72bc43 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/index.d.ts @@ -0,0 +1 @@ +export * from './errors'; diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/index.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/index.js new file mode 100644 index 0000000..9637155 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/errors/index.js @@ -0,0 +1,44 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/errors + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./errors"), exports); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/license b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/license new file mode 100644 index 0000000..08641fd --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/license @@ -0,0 +1,23 @@ +TypeBox: JSON Schema Type Builder with Static Type Resolution for TypeScript + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/package.json b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/package.json new file mode 100644 index 0000000..5d24c50 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/package.json @@ -0,0 +1,49 @@ +{ + "name": "@sinclair/typebox", + "version": "0.27.10", + "description": "JSONSchema Type Builder with Static Type Resolution for TypeScript", + "keywords": [ + "typescript", + "json-schema", + "validate", + "typecheck" + ], + "author": "sinclairzx81", + "license": "MIT", + "main": "./typebox.js", + "types": "./typebox.d.ts", + "exports": { + "./compiler": "./compiler/index.js", + "./errors": "./errors/index.js", + "./system": "./system/index.js", + "./value": "./value/index.js", + ".": "./typebox.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/sinclairzx81/typebox-legacy" + }, + "scripts": { + "clean": "hammer task clean", + "format": "hammer task format", + "start": "hammer task start", + "test": "hammer task test", + "benchmark": "hammer task benchmark", + "build": "hammer task build", + "build:native": "hammer task build_native", + "publish": "hammer task publish" + }, + "devDependencies": { + "@sinclair/hammer": "^0.17.1", + "@typescript/native-preview": "^7.0.0-dev.20260203.1", + "@types/chai": "^4.3.3", + "@types/mocha": "^9.1.1", + "@types/node": "^18.19.130", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "chai": "^4.3.6", + "mocha": "^9.2.2", + "prettier": "^2.7.1", + "typescript": "5.0.2" + } +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/readme.md b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/readme.md new file mode 100644 index 0000000..c5120a9 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/readme.md @@ -0,0 +1,1424 @@ +
+ +

TypeBox

+ +

JSON Schema Type Builder with Static Type Resolution for TypeScript

+ + + +
+
+ +[![npm version](https://badge.fury.io/js/%40sinclair%2Ftypebox.svg)](https://badge.fury.io/js/%40sinclair%2Ftypebox) +[![Downloads](https://img.shields.io/npm/dm/%40sinclair%2Ftypebox.svg)](https://www.npmjs.com/package/%40sinclair%2Ftypebox) +[![GitHub CI](https://github.com/sinclairzx81/typebox/workflows/GitHub%20CI/badge.svg)](https://github.com/sinclairzx81/typebox/actions) + +
+ + + +## Install + +#### Npm +```bash +$ npm install @sinclair/typebox --save +``` + +#### Deno +```typescript +import { Static, Type } from 'npm:@sinclair/typebox' +``` + +#### Esm + +```typescript +import { Static, Type } from 'https://esm.sh/@sinclair/typebox' +``` + +## Example + +```typescript +import { Static, Type } from '@sinclair/typebox' + +const T = Type.Object({ // const T = { + x: Type.Number(), // type: 'object', + y: Type.Number(), // required: ['x', 'y', 'z'], + z: Type.Number() // properties: { +}) // x: { type: 'number' }, + // y: { type: 'number' }, + // z: { type: 'number' } + // } + // } + +type T = Static // type T = { + // x: number, + // y: number, + // z: number + // } +``` + + + + +## Overview + +TypeBox is a runtime type builder that creates in-memory JSON Schema objects that can be statically inferred as TypeScript types. The schemas produced by this library are designed to match the static type assertion rules of the TypeScript compiler. TypeBox enables one to create a unified type that can be statically checked by TypeScript and runtime asserted using standard JSON Schema validation. + +This library is designed to enable JSON schema to compose with the same flexibility as TypeScript's type system. It can be used as a simple tool to build up complex schemas or integrated into REST or RPC services to help validate data received over the wire. + +License MIT + +## Contents +- [Install](#install) +- [Overview](#overview) +- [Usage](#usage) +- [Types](#types) + - [Standard](#types-standard) + - [Extended](#types-extended) + - [Modifiers](#types-modifiers) + - [Options](#types-options) + - [Generics](#types-generics) + - [References](#types-references) + - [Recursive](#types-recursive) + - [Conditional](#types-conditional) + - [Template Literal](#types-template-literal) + - [Guards](#types-guards) + - [Unsafe](#types-unsafe) + - [Strict](#types-strict) +- [Values](#values) + - [Create](#values-create) + - [Clone](#values-clone) + - [Check](#values-check) + - [Convert](#values-convert) + - [Cast](#values-cast) + - [Equal](#values-equal) + - [Hash](#values-hash) + - [Diff](#values-diff) + - [Patch](#values-patch) + - [Errors](#values-errors) + - [Mutate](#values-mutate) + - [Pointer](#values-pointer) +- [TypeCheck](#typecheck) + - [Ajv](#typecheck-ajv) + - [TypeCompiler](#typecheck-typecompiler) +- [TypeSystem](#typesystem) + - [Types](#typesystem-types) + - [Formats](#typesystem-formats) + - [Policies](#typesystem-policies) +- [Benchmark](#benchmark) + - [Compile](#benchmark-compile) + - [Validate](#benchmark-validate) + - [Compression](#benchmark-compression) +- [Contribute](#contribute) + + + +## Usage + +The following shows general usage. + +```typescript +import { Static, Type } from '@sinclair/typebox' + +//-------------------------------------------------------------------------------------------- +// +// Let's say you have the following type ... +// +//-------------------------------------------------------------------------------------------- + +type T = { + id: string, + name: string, + timestamp: number +} + +//-------------------------------------------------------------------------------------------- +// +// ... you can express this type in the following way. +// +//-------------------------------------------------------------------------------------------- + +const T = Type.Object({ // const T = { + id: Type.String(), // type: 'object', + name: Type.String(), // properties: { + timestamp: Type.Integer() // id: { +}) // type: 'string' + // }, + // name: { + // type: 'string' + // }, + // timestamp: { + // type: 'integer' + // } + // }, + // required: [ + // 'id', + // 'name', + // 'timestamp' + // ] + // } + +//-------------------------------------------------------------------------------------------- +// +// ... then infer back to the original static type this way. +// +//-------------------------------------------------------------------------------------------- + +type T = Static // type T = { + // id: string, + // name: string, + // timestamp: number + // } + +//-------------------------------------------------------------------------------------------- +// +// ... then use the type both as JSON schema and as a TypeScript type. +// +//-------------------------------------------------------------------------------------------- + +import { Value } from '@sinclair/typebox/value' + +function receive(value: T) { // ... as a Static Type + + if(Value.Check(T, value)) { // ... as a JSON Schema + + // ok... + } +} +``` + + + +## Types + +TypeBox types are JSON schema fragments that can be composed into more complex types. Each fragment is structured such that a JSON schema compliant validator can runtime assert a value the same way TypeScript will statically assert a type. TypeBox provides a set of Standard types which are used create JSON schema compliant schematics as well as an Extended type set used to create schematics for constructs native to JavaScript. + + + +### Standard Types + +The following table lists the Standard TypeBox types. These types are fully compatible with the JSON Schema Draft 6 specification. + +```typescript +┌────────────────────────────────┬─────────────────────────────┬────────────────────────────────┐ +│ TypeBox │ TypeScript │ JSON Schema │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Any() │ type T = any │ const T = { } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Unknown() │ type T = unknown │ const T = { } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.String() │ type T = string │ const T = { │ +│ │ │ type: 'string' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Number() │ type T = number │ const T = { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Integer() │ type T = number │ const T = { │ +│ │ │ type: 'integer' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Boolean() │ type T = boolean │ const T = { │ +│ │ │ type: 'boolean' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Null() │ type T = null │ const T = { │ +│ │ │ type: 'null' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Literal(42) │ type T = 42 │ const T = { │ +│ │ │ const: 42, │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Array( │ type T = number[] │ const T = { │ +│ Type.Number() │ │ type: 'array', │ +│ ) │ │ items: { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const T = { │ +│ x: Type.Number(), │ x: number, │ type: 'object', │ +│ y: Type.Number() │ y: number │ required: ['x', 'y'], │ +│ }) │ } │ properties: { │ +│ │ │ x: { │ +│ │ │ type: 'number' │ +│ │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Tuple([ │ type T = [number, number] │ const T = { │ +│ Type.Number(), │ │ type: 'array', │ +│ Type.Number() │ │ items: [{ │ +│ ]) │ │ type: 'number' │ +│ │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ }], │ +│ │ │ additionalItems: false, │ +│ │ │ minItems: 2, │ +│ │ │ maxItems: 2 │ +│ │ │ } │ +│ │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ enum Foo { │ enum Foo { │ const T = { │ +│ A, │ A, │ anyOf: [{ │ +│ B │ B │ type: 'number', │ +│ } │ } │ const: 0 │ +│ │ │ }, { │ +│ const T = Type.Enum(Foo) │ type T = Foo │ type: 'number', │ +│ │ │ const: 1 │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.KeyOf( │ type T = keyof { │ const T = { │ +│ Type.Object({ │ x: number, │ anyOf: [{ │ +│ x: Type.Number(), │ y: number │ type: 'string', │ +│ y: Type.Number() │ } │ const: 'x' │ +│ }) │ │ }, { │ +│ ) │ │ type: 'string', │ +│ │ │ const: 'y' │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Union([ │ type T = string | number │ const T = { │ +│ Type.String(), │ │ anyOf: [{ │ +│ Type.Number() │ │ type: 'string' │ +│ ]) │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Intersect([ │ type T = { │ const T = { │ +│ Type.Object({ │ x: number │ allOf: [{ │ +│ x: Type.Number() │ } & { │ type: 'object', │ +│ }), │ y: number │ required: ['x'], │ +│ Type.Object({ │ } │ properties: { │ +│ y: Type.Number() │ │ x: { │ +│ ]) │ │ type: 'number' │ +│ ]) │ │ } │ +│ │ │ } │ +│ │ │ }, { │ +│ │ │ type: 'object', | +│ │ │ required: ['y'], │ +│ │ │ properties: { │ +│ │ │ y: { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Composite([ │ type I = { │ const T = { │ +│ Type.Object({ │ x: number │ type: 'object', │ +│ x: Type.Number() │ } & { │ required: ['x', 'y'], │ +│ }), │ y: number │ properties: { │ +│ Type.Object({ │ } │ x: { │ +│ y: Type.Number() │ │ type: 'number' │ +│ }) │ type T = { │ }, │ +│ ]) │ [K in keyof I]: I[K] │ y: { │ +│ │ } │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Never() │ type T = never │ const T = { │ +│ │ │ not: {} │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Not( | type T = string │ const T = { │ +| Type.Union([ │ │ allOf: [{ │ +│ Type.Literal('x'), │ │ not: { │ +│ Type.Literal('y'), │ │ anyOf: [ │ +│ Type.Literal('z') │ │ { const: 'x' }, │ +│ ]), │ │ { const: 'y' }, │ +│ Type.String() │ │ { const: 'z' } │ +│ ) │ │ ] │ +│ │ │ } │ +│ │ │ }, { │ +│ │ │ type: 'string' │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Extends( │ type T = │ const T = { │ +│ Type.String(), │ string extends number │ const: false, │ +│ Type.Number(), │ true : false │ type: 'boolean' │ +│ Type.Literal(true), │ │ } │ +│ Type.Literal(false) │ │ │ +│ ) │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Extract( │ type T = Extract< │ const T = { │ +│ Type.Union([ │ string | number, │ type: 'string' │ +│ Type.String(), │ string │ } │ +│ Type.Number(), │ > │ │ +│ ]), │ │ │ +│ Type.String() │ │ │ +│ ) │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Exclude( │ type T = Exclude< │ const T = { │ +│ Type.Union([ │ string | number, │ type: 'number' │ +│ Type.String(), │ string │ } │ +│ Type.Number(), │ > │ │ +│ ]), │ │ │ +│ Type.String() │ │ │ +│ ) │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const U = Type.Union([ │ type U = 'open' | 'close' │ const T = { │ +│ Type.Literal('open'), │ │ type: 'string', │ +│ Type.Literal('close') │ type T = `on${U}` │ pattern: '^on(open|close)$' │ +│ ]) │ │ } │ +│ │ │ │ +│ const T = Type │ │ │ +│ .TemplateLiteral([ │ │ │ +│ Type.Literal('on'), │ │ │ +│ U │ │ │ +│ ]) │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Record( │ type T = Record< │ const T = { │ +│ Type.String(), │ string, │ type: 'object', │ +│ Type.Number() │ number │ patternProperties: { │ +│ ) │ > │ '^.*$': { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Partial( │ type T = Partial<{ │ const T = { │ +│ Type.Object({ │ x: number, │ type: 'object', │ +│ x: Type.Number(), │ y: number │ properties: { │ +│ y: Type.Number() | }> │ x: { │ +│ }) │ │ type: 'number' │ +│ ) │ │ }, │ +│ │ │ y: { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Required( │ type T = Required<{ │ const T = { │ +│ Type.Object({ │ x?: number, │ type: 'object', │ +│ x: Type.Optional( │ y?: number │ required: ['x', 'y'], │ +│ Type.Number() | }> │ properties: { │ +│ ), │ │ x: { │ +│ y: Type.Optional( │ │ type: 'number' │ +│ Type.Number() │ │ }, │ +│ ) │ │ y: { │ +│ }) │ │ type: 'number' │ +│ ) │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Pick( │ type T = Pick<{ │ const T = { │ +│ Type.Object({ │ x: number, │ type: 'object', │ +│ x: Type.Number(), │ y: number │ required: ['x'], │ +│ y: Type.Number() │ }, 'x'> │ properties: { │ +│ }), ['x'] | │ x: { │ +│ ) │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Omit( │ type T = Omit<{ │ const T = { │ +│ Type.Object({ │ x: number, │ type: 'object', │ +│ x: Type.Number(), │ y: number │ required: ['y'], │ +│ y: Type.Number() │ }, 'x'> │ properties: { │ +│ }), ['x'] | │ y: { │ +│ ) │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const R = { │ +│ x: Type.Number(), │ x: number, │ $ref: 'T' │ +│ y: Type.Number() │ y: number │ } │ +│ }, { $id: 'T' }) | } │ │ +│ │ │ │ +│ const R = Type.Ref(T) │ type R = T │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +└────────────────────────────────┴─────────────────────────────┴────────────────────────────────┘ +``` + + + +### Extended Types + +TypeBox provides several extended types that can be used to produce schematics for common JavaScript constructs. These types can not be used with standard JSON schema validators; but are useful to help frame schematics for RPC interfaces that may receive JSON validated data. Extended types are prefixed with the `[Extended]` doc comment for convenience. The following table lists the supported types. + +```typescript +┌────────────────────────────────┬─────────────────────────────┬────────────────────────────────┐ +│ TypeBox │ TypeScript │ Extended Schema │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Constructor([ │ type T = new ( │ const T = { │ +│ Type.String(), │ arg0: string, │ type: 'object', │ +│ Type.Number() │ arg1: number │ instanceOf: 'Constructor', │ +│ ], Type.Boolean()) │ ) => boolean │ parameters: [{ │ +│ │ │ type: 'string' │ +│ │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ }], │ +│ │ │ return: { │ +│ │ │ type: 'boolean' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Function([ │ type T = ( │ const T = { │ +| Type.String(), │ arg0: string, │ type : 'object', │ +│ Type.Number() │ arg1: number │ instanceOf: 'Function', │ +│ ], Type.Boolean()) │ ) => boolean │ parameters: [{ │ +│ │ │ type: 'string' │ +│ │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ }], │ +│ │ │ return: { │ +│ │ │ type: 'boolean' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Promise( │ type T = Promise │ const T = { │ +│ Type.String() │ │ type: 'object', │ +│ ) │ │ instanceOf: 'Promise', │ +│ │ │ item: { │ +│ │ │ type: 'string' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Uint8Array() │ type T = Uint8Array │ const T = { │ +│ │ │ type: 'object', │ +│ │ │ instanceOf: 'Uint8Array' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Date() │ type T = Date │ const T = { │ +│ │ │ type: 'object', │ +│ │ │ instanceOf: 'Date' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Undefined() │ type T = undefined │ const T = { │ +│ │ │ type: 'null', │ +│ │ │ typeOf: 'Undefined' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.RegEx(/foo/) │ type T = string │ const T = { │ +│ │ │ type: 'string', │ +│ │ │ pattern: 'foo' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Symbol() │ type T = symbol │ const T = { │ +│ │ │ type: 'null', │ +│ │ │ typeOf: 'Symbol' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.BigInt() │ type T = bigint │ const T = { │ +│ │ │ type: 'null', │ +│ │ │ typeOf: 'BigInt' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Void() │ type T = void │ const T = { │ +│ │ │ type: 'null' │ +│ │ │ typeOf: 'Void' │ +│ │ │ } │ +│ │ │ │ +└────────────────────────────────┴─────────────────────────────┴────────────────────────────────┘ +``` + + + +### Modifiers + +TypeBox provides modifiers that allow schema properties to be statically inferred as `readonly` or `optional`. The following table shows the supported modifiers and how they map between TypeScript and JSON Schema. + +```typescript +┌────────────────────────────────┬─────────────────────────────┬────────────────────────────────┐ +│ TypeBox │ TypeScript │ JSON Schema │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const T = { │ +│ name: Type.Optional( │ name?: string │ type: 'object', │ +│ Type.String() │ } │ properties: { │ +│ ) │ │ name: { │ +│ }) │ │ type: 'string' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const T = { │ +│ name: Type.Readonly( │ readonly name: string │ type: 'object', │ +│ Type.String() │ } │ properties: { │ +│ ) │ │ name: { │ +│ }) │ │ type: 'string' │ +│ │ │ } │ +│ │ │ }, │ +│ │ │ required: ['name'] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const T = { │ +│ name: Type.ReadonlyOptional( │ readonly name?: string │ type: 'object', │ +│ Type.String() │ } │ properties: { │ +│ ) │ │ name: { │ +│ }) │ │ type: 'string' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +└────────────────────────────────┴─────────────────────────────┴────────────────────────────────┘ +``` + + + +### Options + +You can pass JSON Schema options on the last argument of any type. Option hints specific to each type are provided for convenience. + +```typescript +// String must be an email +const T = Type.String({ // const T = { + format: 'email' // type: 'string', +}) // format: 'email' + // } + +// Mumber must be a multiple of 2 +const T = Type.Number({ // const T = { + multipleOf: 2 // type: 'number', +}) // multipleOf: 2 + // } + +// Array must have at least 5 integer values +const T = Type.Array(Type.Integer(), { // const T = { + minItems: 5 // type: 'array', +}) // minItems: 5, + // items: { + // type: 'integer' + // } + // } + +``` + + + +### Generic Types + +Generic types can be created with generic functions constrained to type `TSchema`. The following creates a generic `Vector` type. + +```typescript +import { Type, Static, TSchema } from '@sinclair/typebox' + +const Vector = (t: T) => Type.Object({ x: t, y: t, z: t }) + +const NumberVector = Vector(Type.Number()) // const NumberVector = { + // type: 'object', + // required: ['x', 'y', 'z'], + // properties: { + // x: { type: 'number' }, + // y: { type: 'number' }, + // z: { type: 'number' } + // } + // } + +type NumberVector = Static // type NumberVector = { + // x: number, + // y: number, + // z: number + // } + +const BooleanVector = Vector(Type.Boolean()) // const BooleanVector = { + // type: 'object', + // required: ['x', 'y', 'z'], + // properties: { + // x: { type: 'boolean' }, + // y: { type: 'boolean' }, + // z: { type: 'boolean' } + // } + // } + +type BooleanVector = Static // type BooleanVector = { + // x: boolean, + // y: boolean, + // z: boolean + // } +``` + +The following creates a generic `Nullable` type. + +```typescript +const Nullable = (schema: T) => Type.Union([schema, Type.Null()]) + +const T = Nullable(Type.String()) // const T = { + // anyOf: [ + // { type: 'string' }, + // { type: 'null' } + // ] + // } + +type T = Static // type T = string | null +``` + + + +### Reference Types + +Reference types are supported with `Type.Ref`. The target type must specify a valid `$id`. + +```typescript +const T = Type.String({ $id: 'T' }) // const T = { + // $id: 'T', + // type: 'string' + // } + +const R = Type.Ref(T) // const R = { + // $ref: 'T' + // } +``` + + + +### Recursive Types + +Recursive types are supported with `Type.Recursive` + +```typescript +const Node = Type.Recursive(Node => Type.Object({ // const Node = { + id: Type.String(), // $id: 'Node', + nodes: Type.Array(Node) // type: 'object', +}), { $id: 'Node' }) // properties: { + // id: { + // type: 'string' + // }, + // nodes: { + // type: 'array', + // items: { + // $ref: 'Node' + // } + // } + // }, + // required: [ + // 'id', + // 'nodes' + // ] + // } + +type Node = Static // type Node = { + // id: string + // nodes: Node[] + // } + +function test(node: Node) { + const id = node.nodes[0].nodes[0].id // id is string +} +``` + + + +### Conditional Types + +Conditional types are supported with `Type.Extends`, `Type.Exclude` and `Type.Extract` + +```typescript +// TypeScript + +type T0 = string extends number ? true : false // type T0 = false + +type T1 = Extract // type T1 = number + +type T2 = Exclude // type T2 = string + +// TypeBox + +const T0 = Type.Extends(Type.String(), Type.Number(), Type.Literal(true), Type.Literal(false)) + +const T1 = Type.Extract(Type.Union([Type.String(), Type.Number()]), Type.Number()) + +const T2 = Type.Exclude(Type.Union([Type.String(), Type.Number()]), Type.Number()) + + +type T0 = Static // type T0 = false + +type T1 = Static // type T1 = number + +type T2 = Static // type T2 = string +``` + + + +### Template Literal Types + +Template Literal types are supported with `Type.TemplateLiteral` + +```typescript +// TypeScript + +type T = `option${'A'|'B'}` // type T = 'optionA' | 'optionB' + +type R = Record // type R = { + // optionA: string + // optionB: string + // } + +// TypeBox + +const T = Type.TemplateLiteral([ // const T = { + Type.Literal('option'), // pattern: '^option(A|B)$', + Type.Union([ // type: 'string' + Type.Literal('A'), // } + Type.Literal('B') + ]) +]) + +const R = Type.Record(T, Type.String()) // const R = { + // type: 'object', + // required: ['optionA', 'optionB'], + // properties: { + // optionA: { + // type: 'string' + // }, + // optionB: { + // type: 'string' + // } + // } + // } + +type T = Static // type T = 'optionA' | 'optionB' + +type R = Static // type R = { + // optionA: string + // optionB: string + // } +``` + + + +### Unsafe + +Use `Type.Unsafe` to create custom schematics with user defined inference rules. + +```typescript +const T = Type.Unsafe({ type: 'number' }) // const T = { + // type: 'number' + // } + +type T = Static // type T = string +``` + +The `Type.Unsafe` type can be useful to express specific OpenAPI schema representations. + +```typescript +import { Type, Static, TSchema } from '@sinclair/typebox' + +// Nullable + +function Nullable(schema: T) { + return Type.Unsafe | null>({ ...schema, nullable: true }) +} + +const T = Nullable(Type.String()) // const T = { + // type: 'string', + // nullable: true + // } + +type T = Static // type T = string | null + +// StringEnum + +function StringEnum(values: [...T]) { + return Type.Unsafe({ type: 'string', enum: values }) +} + +const T = StringEnum(['A', 'B', 'C']) // const T = { + // enum: ['A', 'B', 'C'] + // } + +type T = Static // type T = 'A' | 'B' | 'C' +``` + + + +### Guards + +TypeBox provides a `TypeGuard` module that can be used for reflection and asserting values as types. + +```typescript +import { Type, TypeGuard } from '@sinclair/typebox' + +const T = Type.String() + +if(TypeGuard.TString(T)) { + + // T is TString +} +``` + + + +### Strict + +TypeBox schemas contain the `Kind` and `Modifier` symbol properties. These properties are used for type composition and reflection. These properties are not strictly valid JSON schema; so in some cases it may be desirable to omit them. TypeBox provides a `Type.Strict` function that will omit these properties if necessary. + +```typescript +const T = Type.Object({ // const T = { + name: Type.Optional(Type.String()) // [Kind]: 'Object', +}) // type: 'object', + // properties: { + // name: { + // [Kind]: 'String', + // type: 'string', + // [Modifier]: 'Optional' + // } + // } + // } + +const U = Type.Strict(T) // const U = { + // type: 'object', + // properties: { + // name: { + // type: 'string' + // } + // } + // } +``` + + + +## Values + +TypeBox provides an optional utility module that can be used to perform common operations on JavaScript values. This module includes functionality to create, check and cast values from types as well as check equality, clone, diff and patch JavaScript values. This module is provided via optional import. + +```typescript +import { Value } from '@sinclair/typebox/value' +``` + + + +### Create + +Use the Create function to create a value from a type. TypeBox will use default values if specified. + +```typescript +const T = Type.Object({ x: Type.Number(), y: Type.Number({ default: 42 }) }) + +const A = Value.Create(T) // const A = { x: 0, y: 42 } +``` + + + +### Clone + +Use the Clone function to deeply clone a value + +```typescript +const A = Value.Clone({ x: 1, y: 2, z: 3 }) // const A = { x: 1, y: 2, z: 3 } +``` + + + +### Check + +Use the Check function to type check a value + +```typescript +const T = Type.Object({ x: Type.Number() }) + +const R = Value.Check(T, { x: 1 }) // const R = true +``` + + + +### Convert + +Use the Convert function to convert a value into its target type if a reasonable conversion is possible. + +```typescript +const T = Type.Object({ x: Type.Number() }) + +const R1 = Value.Convert(T, { x: '3.14' }) // const R1 = { x: 3.14 } + +const R2 = Value.Convert(T, { x: 'not a number' }) // const R2 = { x: 'not a number' } +``` + + + +### Cast + +Use the Cast function to cast a value into a type. The cast function will retain as much information as possible from the original value. + +```typescript +const T = Type.Object({ x: Type.Number(), y: Type.Number() }, { additionalProperties: false }) + +const X = Value.Cast(T, null) // const X = { x: 0, y: 0 } + +const Y = Value.Cast(T, { x: 1 }) // const Y = { x: 1, y: 0 } + +const Z = Value.Cast(T, { x: 1, y: 2, z: 3 }) // const Z = { x: 1, y: 2 } +``` + + + +### Equal + +Use the Equal function to deeply check for value equality. + +```typescript +const R = Value.Equal( // const R = true + { x: 1, y: 2, z: 3 }, + { x: 1, y: 2, z: 3 } +) +``` + + + +### Hash + +Use the Hash function to create a [FNV1A-64](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) non cryptographic hash of a value. + +```typescript +const A = Value.Hash({ x: 1, y: 2, z: 3 }) // const A = 2910466848807138541n + +const B = Value.Hash({ x: 1, y: 4, z: 3 }) // const B = 1418369778807423581n +``` + + + +### Diff + +Use the Diff function to produce a sequence of edits to transform one value into another. + +```typescript +const E = Value.Diff( // const E = [ + { x: 1, y: 2, z: 3 }, // { type: 'update', path: '/y', value: 4 }, + { y: 4, z: 5, w: 6 } // { type: 'update', path: '/z', value: 5 }, +) // { type: 'insert', path: '/w', value: 6 }, + // { type: 'delete', path: '/x' } + // ] +``` + + + +### Patch + +Use the Patch function to apply edits + +```typescript +const A = { x: 1, y: 2 } + +const B = { x: 3 } + +const E = Value.Diff(A, B) // const E = [ + // { type: 'update', path: '/x', value: 3 }, + // { type: 'delete', path: '/y' } + // ] + +const C = Value.Patch(A, E) // const C = { x: 3 } +``` + + + +### Errors + +Use the Errors function enumerate validation errors. + +```typescript +const T = Type.Object({ x: Type.Number(), y: Type.Number() }) + +const R = [...Value.Errors(T, { x: '42' })] // const R = [{ + // schema: { type: 'number' }, + // path: '/x', + // value: '42', + // message: 'Expected number' + // }, { + // schema: { type: 'number' }, + // path: '/y', + // value: undefined, + // message: 'Expected number' + // }] +``` + + + +### Mutate + +Use the Mutate function to perform a deep mutable value assignment while retaining internal references. + +```typescript +const Y = { z: 1 } // const Y = { z: 1 } + +const X = { y: Y } // const X = { y: { z: 1 } } + +const A = { x: X } // const A = { x: { y: { z: 1 } } } + + +Value.Mutate(A, { x: { y: { z: 2 } } }) // const A' = { x: { y: { z: 2 } } } + +const R0 = A.x.y.z === 2 // const R0 = 2 + +const R1 = A.x.y === Y // const R1 = true + +const R2 = A.x === X // const R2 = true +``` + + + +### Pointer + +Use ValuePointer to perform mutable updates on existing values using [RFC6901](https://www.rfc-editor.org/rfc/rfc6901) JSON Pointers. + +```typescript +import { ValuePointer } from '@sinclair/typebox/value' + +const A = { x: 0, y: 0, z: 0 } + +ValuePointer.Set(A, '/x', 1) // const A' = { x: 1, y: 0, z: 0 } + +ValuePointer.Set(A, '/y', 1) // const A' = { x: 1, y: 1, z: 0 } + +ValuePointer.Set(A, '/z', 1) // const A' = { x: 1, y: 1, z: 1 } +``` + + + +## TypeCheck + +TypeBox types target JSON Schema draft 6 so are compatible with any validator that supports this specification. TypeBox also provides a built in type checking compiler designed specifically for high performance compilation and value assertion. + +The following sections detail using Ajv and TypeBox's compiler infrastructure. + + + +## Ajv + +The following shows the recommended setup for Ajv. + +```bash +$ npm install ajv ajv-formats --save +``` + +```typescript +import { Type } from '@sinclair/typebox' +import addFormats from 'ajv-formats' +import Ajv from 'ajv' + +const ajv = addFormats(new Ajv({}), [ + 'date-time', + 'time', + 'date', + 'email', + 'hostname', + 'ipv4', + 'ipv6', + 'uri', + 'uri-reference', + 'uuid', + 'uri-template', + 'json-pointer', + 'relative-json-pointer', + 'regex' +]) + +const C = ajv.compile(Type.Object({ + x: Type.Number(), + y: Type.Number(), + z: Type.Number() +})) + +const R = C({ x: 1, y: 2, z: 3 }) // const R = true +``` + + + +### TypeCompiler + +The TypeBox TypeCompiler is a high performance JIT compiler that transforms TypeBox types into optimized JavaScript validation routines. The compiler is tuned for fast compilation as well as fast value assertion. It is designed to serve as a validation backend that can be integrated into larger applications; but can also be used as a general purpose validator. + +The TypeCompiler is provided as an optional import. + +```typescript +import { TypeCompiler } from '@sinclair/typebox/compiler' +``` + +Use the `Compile(...)` function to compile a type. + +```typescript +const C = TypeCompiler.Compile(Type.Object({ // const C: TypeCheck> + +const R = C.Check({ x: 1, y: 2, z: 3 }) // const R = true +``` + +Use the `Errors(...)` function to produce diagnostic errors for a value. The `Errors(...)` function will return an iterator that if enumerated; will perform an exhaustive check across the entire value and yield any error found. For performance, this function should only be called after failed `Check(...)`. Applications may also choose to yield only the first value to avoid exhaustive error generation. + +```typescript +const C = TypeCompiler.Compile(Type.Object({ // const C: TypeCheck> + +const value = { } + +const errors = [...C.Errors(value)] // const errors = [{ + // schema: { type: 'number' }, + // path: '/x', + // value: undefined, + // message: 'Expected number' + // }, { + // schema: { type: 'number' }, + // path: '/y', + // value: undefined, + // message: 'Expected number' + // }, { + // schema: { type: 'number' }, + // path: '/z', + // value: undefined, + // message: 'Expected number' + // }] +``` + +Compiled routines can be inspected with the `.Code()` function. + +```typescript +const C = TypeCompiler.Compile(Type.String()) // const C: TypeCheck + +console.log(C.Code()) // return function check(value) { + // return ( + // (typeof value === 'string') + // ) + // } +``` + + + +## TypeSystem + +The TypeBox TypeSystem module provides functionality to define types above and beyond the Standard and Extended type sets as well as control various assertion polices. Configurations made to the TypeSystem module are observed by both `TypeCompiler` and `Value` modules. + +The TypeSystem module is provided as an optional import. + +```typescript +import { TypeSystem } from '@sinclair/typebox/system' +``` + + + +### Types + +Use the `Type(...)` function to create a custom type. This function will return a type factory function that can be used to construct the type. The following creates a Point type. + +```typescript +type PointOptions = { } // The Type Options + +type PointType = { x: number, y: number } // The Static Type + +const Point = TypeSystem.Type('Point', (options, value) => { + return ( + typeof value === 'object' && value !== null && + typeof value.x === 'number' && + typeof value.y === 'number' + ) +}) + +const T = Point() + +type T = Static // type T = { x: number, y: number } + +const R = Value.Check(T, { x: 1, y: 2 }) // const R = true +``` + + + +### Formats + +Use the `Format(...)` function to create a custom string format. The following creates a format that checks for lowercase strings. + +```typescript +TypeSystem.Format('lowercase', value => value === value.toLowerCase()) // format should be lowercase + +const T = Type.String({ format: 'lowercase' }) + +const A = Value.Check(T, 'Hello') // const A = false + +const B = Value.Check(T, 'hello') // const B = true +``` + + + +### Policies + +TypeBox validates using JSON Schema assertion policies by default. It is possible to override these policies and have TypeBox assert using TypeScript policies. The following overrides are available. + +```typescript +// Allow arrays to validate as object types (default is false) +// +// const A: {} = [] - allowed in TS + +TypeSystem.AllowArrayObjects = true + +// Allow numeric values to be NaN or + or - Infinity (default is false) +// +// const A: number = NaN - allowed in TS + +TypeSystem.AllowNaN = true +``` + + + +## Benchmark + +This project maintains a set of benchmarks that measure Ajv, Value and TypeCompiler compilation and validation performance. These benchmarks can be run locally by cloning this repository and running `npm run benchmark`. The results below show for Ajv version 8.12.0. + +For additional comparative benchmarks, please refer to [typescript-runtime-type-benchmarks](https://moltar.github.io/typescript-runtime-type-benchmarks/). + + + +### Compile + +This benchmark measures compilation performance for varying types. You can review this benchmark [here](https://github.com/sinclairzx81/typebox/blob/master/benchmark/measurement/module/compile.ts). + +```typescript +┌────────────────────────────┬────────────┬──────────────┬──────────────┬──────────────┐ +│ (index) │ Iterations │ Ajv │ TypeCompiler │ Performance │ +├────────────────────────────┼────────────┼──────────────┼──────────────┼──────────────┤ +│ Literal_String │ 1000 │ ' 257 ms' │ ' 8 ms' │ ' 32.13 x' │ +│ Literal_Number │ 1000 │ ' 203 ms' │ ' 4 ms' │ ' 50.75 x' │ +│ Literal_Boolean │ 1000 │ ' 183 ms' │ ' 4 ms' │ ' 45.75 x' │ +│ Primitive_Number │ 1000 │ ' 174 ms' │ ' 8 ms' │ ' 21.75 x' │ +│ Primitive_String │ 1000 │ ' 158 ms' │ ' 9 ms' │ ' 17.56 x' │ +│ Primitive_String_Pattern │ 1000 │ ' 213 ms' │ ' 13 ms' │ ' 16.38 x' │ +│ Primitive_Boolean │ 1000 │ ' 136 ms' │ ' 6 ms' │ ' 22.67 x' │ +│ Primitive_Null │ 1000 │ ' 144 ms' │ ' 6 ms' │ ' 24.00 x' │ +│ Object_Unconstrained │ 1000 │ ' 1176 ms' │ ' 38 ms' │ ' 30.95 x' │ +│ Object_Constrained │ 1000 │ ' 1181 ms' │ ' 31 ms' │ ' 38.10 x' │ +│ Object_Vector3 │ 1000 │ ' 387 ms' │ ' 8 ms' │ ' 48.38 x' │ +│ Object_Box3D │ 1000 │ ' 1693 ms' │ ' 25 ms' │ ' 67.72 x' │ +│ Tuple_Primitive │ 1000 │ ' 470 ms' │ ' 15 ms' │ ' 31.33 x' │ +│ Tuple_Object │ 1000 │ ' 1206 ms' │ ' 17 ms' │ ' 70.94 x' │ +│ Composite_Intersect │ 1000 │ ' 567 ms' │ ' 20 ms' │ ' 28.35 x' │ +│ Composite_Union │ 1000 │ ' 515 ms' │ ' 21 ms' │ ' 24.52 x' │ +│ Math_Vector4 │ 1000 │ ' 787 ms' │ ' 10 ms' │ ' 78.70 x' │ +│ Math_Matrix4 │ 1000 │ ' 386 ms' │ ' 8 ms' │ ' 48.25 x' │ +│ Array_Primitive_Number │ 1000 │ ' 349 ms' │ ' 7 ms' │ ' 49.86 x' │ +│ Array_Primitive_String │ 1000 │ ' 336 ms' │ ' 4 ms' │ ' 84.00 x' │ +│ Array_Primitive_Boolean │ 1000 │ ' 284 ms' │ ' 3 ms' │ ' 94.67 x' │ +│ Array_Object_Unconstrained │ 1000 │ ' 1704 ms' │ ' 19 ms' │ ' 89.68 x' │ +│ Array_Object_Constrained │ 1000 │ ' 1456 ms' │ ' 18 ms' │ ' 80.89 x' │ +│ Array_Tuple_Primitive │ 1000 │ ' 792 ms' │ ' 15 ms' │ ' 52.80 x' │ +│ Array_Tuple_Object │ 1000 │ ' 1552 ms' │ ' 17 ms' │ ' 91.29 x' │ +│ Array_Composite_Intersect │ 1000 │ ' 744 ms' │ ' 18 ms' │ ' 41.33 x' │ +│ Array_Composite_Union │ 1000 │ ' 783 ms' │ ' 15 ms' │ ' 52.20 x' │ +│ Array_Math_Vector4 │ 1000 │ ' 1093 ms' │ ' 14 ms' │ ' 78.07 x' │ +│ Array_Math_Matrix4 │ 1000 │ ' 684 ms' │ ' 6 ms' │ ' 114.00 x' │ +└────────────────────────────┴────────────┴──────────────┴──────────────┴──────────────┘ +``` + + + +### Validate + +This benchmark measures validation performance for varying types. You can review this benchmark [here](https://github.com/sinclairzx81/typebox/blob/master/benchmark/measurement/module/check.ts). + +```typescript +┌────────────────────────────┬────────────┬──────────────┬──────────────┬──────────────┬──────────────┐ +│ (index) │ Iterations │ ValueCheck │ Ajv │ TypeCompiler │ Performance │ +├────────────────────────────┼────────────┼──────────────┼──────────────┼──────────────┼──────────────┤ +│ Literal_String │ 1000000 │ ' 27 ms' │ ' 6 ms' │ ' 5 ms' │ ' 1.20 x' │ +│ Literal_Number │ 1000000 │ ' 23 ms' │ ' 21 ms' │ ' 11 ms' │ ' 1.91 x' │ +│ Literal_Boolean │ 1000000 │ ' 21 ms' │ ' 20 ms' │ ' 10 ms' │ ' 2.00 x' │ +│ Primitive_Number │ 1000000 │ ' 26 ms' │ ' 19 ms' │ ' 11 ms' │ ' 1.73 x' │ +│ Primitive_String │ 1000000 │ ' 25 ms' │ ' 19 ms' │ ' 10 ms' │ ' 1.90 x' │ +│ Primitive_String_Pattern │ 1000000 │ ' 155 ms' │ ' 49 ms' │ ' 43 ms' │ ' 1.14 x' │ +│ Primitive_Boolean │ 1000000 │ ' 23 ms' │ ' 19 ms' │ ' 10 ms' │ ' 1.90 x' │ +│ Primitive_Null │ 1000000 │ ' 24 ms' │ ' 19 ms' │ ' 10 ms' │ ' 1.90 x' │ +│ Object_Unconstrained │ 1000000 │ ' 804 ms' │ ' 35 ms' │ ' 28 ms' │ ' 1.25 x' │ +│ Object_Constrained │ 1000000 │ ' 1041 ms' │ ' 55 ms' │ ' 41 ms' │ ' 1.34 x' │ +│ Object_Vector3 │ 1000000 │ ' 380 ms' │ ' 26 ms' │ ' 20 ms' │ ' 1.30 x' │ +│ Object_Box3D │ 1000000 │ ' 1785 ms' │ ' 65 ms' │ ' 52 ms' │ ' 1.25 x' │ +│ Object_Recursive │ 1000000 │ ' 4984 ms' │ ' 396 ms' │ ' 114 ms' │ ' 3.47 x' │ +│ Tuple_Primitive │ 1000000 │ ' 168 ms' │ ' 24 ms' │ ' 16 ms' │ ' 1.50 x' │ +│ Tuple_Object │ 1000000 │ ' 673 ms' │ ' 30 ms' │ ' 26 ms' │ ' 1.15 x' │ +│ Composite_Intersect │ 1000000 │ ' 751 ms' │ ' 28 ms' │ ' 20 ms' │ ' 1.40 x' │ +│ Composite_Union │ 1000000 │ ' 489 ms' │ ' 24 ms' │ ' 16 ms' │ ' 1.50 x' │ +│ Math_Vector4 │ 1000000 │ ' 259 ms' │ ' 23 ms' │ ' 13 ms' │ ' 1.77 x' │ +│ Math_Matrix4 │ 1000000 │ ' 1002 ms' │ ' 40 ms' │ ' 30 ms' │ ' 1.33 x' │ +│ Array_Primitive_Number │ 1000000 │ ' 252 ms' │ ' 22 ms' │ ' 15 ms' │ ' 1.47 x' │ +│ Array_Primitive_String │ 1000000 │ ' 227 ms' │ ' 22 ms' │ ' 18 ms' │ ' 1.22 x' │ +│ Array_Primitive_Boolean │ 1000000 │ ' 150 ms' │ ' 23 ms' │ ' 22 ms' │ ' 1.05 x' │ +│ Array_Object_Unconstrained │ 1000000 │ ' 4754 ms' │ ' 71 ms' │ ' 64 ms' │ ' 1.11 x' │ +│ Array_Object_Constrained │ 1000000 │ ' 4787 ms' │ ' 142 ms' │ ' 123 ms' │ ' 1.15 x' │ +│ Array_Object_Recursive │ 1000000 │ ' 19088 ms' │ ' 1735 ms' │ ' 314 ms' │ ' 5.53 x' │ +│ Array_Tuple_Primitive │ 1000000 │ ' 650 ms' │ ' 41 ms' │ ' 31 ms' │ ' 1.32 x' │ +│ Array_Tuple_Object │ 1000000 │ ' 2770 ms' │ ' 67 ms' │ ' 55 ms' │ ' 1.22 x' │ +│ Array_Composite_Intersect │ 1000000 │ ' 2693 ms' │ ' 50 ms' │ ' 39 ms' │ ' 1.28 x' │ +│ Array_Composite_Union │ 1000000 │ ' 1982 ms' │ ' 72 ms' │ ' 33 ms' │ ' 2.18 x' │ +│ Array_Math_Vector4 │ 1000000 │ ' 1068 ms' │ ' 40 ms' │ ' 26 ms' │ ' 1.54 x' │ +│ Array_Math_Matrix4 │ 1000000 │ ' 4609 ms' │ ' 115 ms' │ ' 88 ms' │ ' 1.31 x' │ +└────────────────────────────┴────────────┴──────────────┴──────────────┴──────────────┴──────────────┘ +``` + + + +### Compression + +The following table lists esbuild compiled and minified sizes for each TypeBox module. + +```typescript +┌──────────────────────┬────────────┬────────────┬─────────────┐ +│ (index) │ Compiled │ Minified │ Compression │ +├──────────────────────┼────────────┼────────────┼─────────────┤ +│ typebox/compiler │ '124.3 kb' │ ' 55.7 kb' │ '2.23 x' │ +│ typebox/errors │ '107.8 kb' │ ' 47.9 kb' │ '2.25 x' │ +│ typebox/system │ ' 73.3 kb' │ ' 30.2 kb' │ '2.43 x' │ +│ typebox/value │ '170.7 kb' │ ' 74.2 kb' │ '2.30 x' │ +│ typebox │ ' 72.0 kb' │ ' 29.7 kb' │ '2.43 x' │ +└──────────────────────┴────────────┴────────────┴─────────────┘ +``` + + + +## Contribute + +TypeBox is open to community contribution. Please ensure you submit an open issue before submitting your pull request. The TypeBox project preferences open community discussion prior to accepting new features. diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/index.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/index.d.ts new file mode 100644 index 0000000..4b58cda --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/index.d.ts @@ -0,0 +1 @@ +export * from './system'; diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/index.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/index.js new file mode 100644 index 0000000..3c5107f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/index.js @@ -0,0 +1,44 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/system + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./system"), exports); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/system.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/system.d.ts new file mode 100644 index 0000000..4308454 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/system.d.ts @@ -0,0 +1,26 @@ +import * as Types from '../typebox'; +export declare class TypeSystemDuplicateTypeKind extends Error { + constructor(kind: string); +} +export declare class TypeSystemDuplicateFormat extends Error { + constructor(kind: string); +} +/** Creates user defined types and formats and provides overrides for value checking behaviours */ +export declare namespace TypeSystem { + /** Sets whether TypeBox should assert optional properties using the TypeScript `exactOptionalPropertyTypes` assertion policy. The default is `false` */ + let ExactOptionalPropertyTypes: boolean; + /** Sets whether arrays should be treated as a kind of objects. The default is `false` */ + let AllowArrayObjects: boolean; + /** Sets whether `NaN` or `Infinity` should be treated as valid numeric values. The default is `false` */ + let AllowNaN: boolean; + /** Sets whether `null` should validate for void types. The default is `false` */ + let AllowVoidNull: boolean; + /** Creates a new type */ + function Type(kind: string, check: (options: Options, value: unknown) => boolean): (options?: Partial) => Types.TUnsafe; + /** Creates a new string format */ + function Format(format: F, check: (value: string) => boolean): F; + /** @deprecated Use `TypeSystem.Type()` instead. */ + function CreateType(kind: string, check: (options: Options, value: unknown) => boolean): (options?: Partial) => Types.TUnsafe; + /** @deprecated Use `TypeSystem.Format()` instead. */ + function CreateFormat(format: F, check: (value: string) => boolean): F; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/system.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/system.js new file mode 100644 index 0000000..44911a4 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/system/system.js @@ -0,0 +1,90 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/system + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TypeSystem = exports.TypeSystemDuplicateFormat = exports.TypeSystemDuplicateTypeKind = void 0; +const Types = require("../typebox"); +class TypeSystemDuplicateTypeKind extends Error { + constructor(kind) { + super(`Duplicate type kind '${kind}' detected`); + } +} +exports.TypeSystemDuplicateTypeKind = TypeSystemDuplicateTypeKind; +class TypeSystemDuplicateFormat extends Error { + constructor(kind) { + super(`Duplicate string format '${kind}' detected`); + } +} +exports.TypeSystemDuplicateFormat = TypeSystemDuplicateFormat; +/** Creates user defined types and formats and provides overrides for value checking behaviours */ +var TypeSystem; +(function (TypeSystem) { + // ------------------------------------------------------------------------ + // Assertion Policies + // ------------------------------------------------------------------------ + /** Sets whether TypeBox should assert optional properties using the TypeScript `exactOptionalPropertyTypes` assertion policy. The default is `false` */ + TypeSystem.ExactOptionalPropertyTypes = false; + /** Sets whether arrays should be treated as a kind of objects. The default is `false` */ + TypeSystem.AllowArrayObjects = false; + /** Sets whether `NaN` or `Infinity` should be treated as valid numeric values. The default is `false` */ + TypeSystem.AllowNaN = false; + /** Sets whether `null` should validate for void types. The default is `false` */ + TypeSystem.AllowVoidNull = false; + // ------------------------------------------------------------------------ + // String Formats and Types + // ------------------------------------------------------------------------ + /** Creates a new type */ + function Type(kind, check) { + if (Types.TypeRegistry.Has(kind)) + throw new TypeSystemDuplicateTypeKind(kind); + Types.TypeRegistry.Set(kind, check); + return (options = {}) => Types.Type.Unsafe({ ...options, [Types.Kind]: kind }); + } + TypeSystem.Type = Type; + /** Creates a new string format */ + function Format(format, check) { + if (Types.FormatRegistry.Has(format)) + throw new TypeSystemDuplicateFormat(format); + Types.FormatRegistry.Set(format, check); + return format; + } + TypeSystem.Format = Format; + // ------------------------------------------------------------------------ + // Deprecated + // ------------------------------------------------------------------------ + /** @deprecated Use `TypeSystem.Type()` instead. */ + function CreateType(kind, check) { + return Type(kind, check); + } + TypeSystem.CreateType = CreateType; + /** @deprecated Use `TypeSystem.Format()` instead. */ + function CreateFormat(format, check) { + return Format(format, check); + } + TypeSystem.CreateFormat = CreateFormat; +})(TypeSystem = exports.TypeSystem || (exports.TypeSystem = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/typebox.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/typebox.d.ts new file mode 100644 index 0000000..9581b4a --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/typebox.d.ts @@ -0,0 +1,717 @@ +export declare const Modifier: unique symbol; +export declare const Hint: unique symbol; +export declare const Kind: unique symbol; +export declare const PatternBoolean = "(true|false)"; +export declare const PatternNumber = "(0|[1-9][0-9]*)"; +export declare const PatternString = "(.*)"; +export declare const PatternBooleanExact: string; +export declare const PatternNumberExact: string; +export declare const PatternStringExact: string; +export type TupleToIntersect = T extends [infer I] ? I : T extends [infer I, ...infer R] ? I & TupleToIntersect : never; +export type TupleToUnion = { + [K in keyof T]: T[K]; +}[number]; +export type UnionToIntersect = (U extends unknown ? (arg: U) => 0 : never) extends (arg: infer I) => 0 ? I : never; +export type UnionLast = UnionToIntersect 0 : never> extends (x: infer L) => 0 ? L : never; +export type UnionToTuple> = [U] extends [never] ? [] : [...UnionToTuple>, L]; +export type Assert = T extends E ? T : never; +export type Evaluate = T extends infer O ? { + [K in keyof O]: O[K]; +} : never; +export type Ensure = T extends infer U ? U : never; +export type TModifier = TReadonlyOptional | TOptional | TReadonly; +export type TReadonly = T & { + [Modifier]: 'Readonly'; +}; +export type TOptional = T & { + [Modifier]: 'Optional'; +}; +export type TReadonlyOptional = T & { + [Modifier]: 'ReadonlyOptional'; +}; +export interface SchemaOptions { + $schema?: string; + /** Id for this schema */ + $id?: string; + /** Title of this schema */ + title?: string; + /** Description of this schema */ + description?: string; + /** Default value for this schema */ + default?: any; + /** Example values matching this schema */ + examples?: any; + [prop: string]: any; +} +export interface TKind { + [Kind]: string; +} +export interface TSchema extends SchemaOptions, TKind { + [Modifier]?: string; + [Hint]?: string; + params: unknown[]; + static: unknown; +} +export type TAnySchema = TSchema | TAny | TArray | TBigInt | TBoolean | TConstructor | TDate | TEnum | TFunction | TInteger | TIntersect | TLiteral | TNot | TNull | TNumber | TObject | TPromise | TRecord | TRef | TString | TSymbol | TTemplateLiteral | TThis | TTuple | TUndefined | TUnion | TUint8Array | TUnknown | TVoid; +export type TNumeric = TInteger | TNumber; +export interface NumericOptions extends SchemaOptions { + exclusiveMaximum?: N; + exclusiveMinimum?: N; + maximum?: N; + minimum?: N; + multipleOf?: N; +} +export interface TAny extends TSchema { + [Kind]: 'Any'; + static: any; +} +export interface ArrayOptions extends SchemaOptions { + uniqueItems?: boolean; + minItems?: number; + maxItems?: number; +} +export interface TArray extends TSchema, ArrayOptions { + [Kind]: 'Array'; + static: Static[]; + type: 'array'; + items: T; +} +export interface TBigInt extends TSchema, NumericOptions { + [Kind]: 'BigInt'; + static: bigint; + type: 'null'; + typeOf: 'BigInt'; +} +export interface TBoolean extends TSchema { + [Kind]: 'Boolean'; + static: boolean; + type: 'boolean'; +} +export type TConstructorParameters> = TTuple; +export type TInstanceType> = T['returns']; +export type TCompositeEvaluateArray = { + [K in keyof T]: T[K] extends TSchema ? Static : never; +}; +export type TCompositeArray = { + [K in keyof T]: T[K] extends TObject ? P : {}; +}; +export type TCompositeProperties = Evaluate : I extends object ? I : {}>; +export interface TComposite extends TObject { + [Hint]: 'Composite'; + static: Evaluate>>; + properties: TCompositeProperties>; +} +export type TConstructorParameterArray = [...{ + [K in keyof T]: Static, P>; +}]; +export interface TConstructor extends TSchema { + [Kind]: 'Constructor'; + static: new (...param: TConstructorParameterArray) => Static; + type: 'object'; + instanceOf: 'Constructor'; + parameters: T; + returns: U; +} +export interface DateOptions extends SchemaOptions { + exclusiveMaximumTimestamp?: number; + exclusiveMinimumTimestamp?: number; + maximumTimestamp?: number; + minimumTimestamp?: number; +} +export interface TDate extends TSchema, DateOptions { + [Kind]: 'Date'; + static: Date; + type: 'object'; + instanceOf: 'Date'; +} +export interface TEnumOption { + type: 'number' | 'string'; + const: T; +} +export interface TEnum = Record> extends TSchema { + [Kind]: 'Union'; + static: T[keyof T]; + anyOf: TLiteral[]; +} +export type TExtends = (Static extends Static ? T : U) extends infer O ? UnionToTuple extends [infer X, infer Y] ? TUnion<[Assert, Assert]> : Assert : never; +export type TExcludeTemplateLiteralResult = TString; +export type TExcludeTemplateLiteral = Exclude, Static> extends infer S ? TExcludeTemplateLiteralResult> : never; +export type TExcludeArray = Assert> extends Static ? never : T[K]; +}[number]>, TSchema[]> extends infer R ? TUnionResult> : never; +export type TExclude = T extends TTemplateLiteral ? TExcludeTemplateLiteral : T extends TUnion ? TExcludeArray : T extends U ? TNever : T; +export type TExtractTemplateLiteralResult = TString; +export type TExtractTemplateLiteral = Extract, Static> extends infer S ? TExtractTemplateLiteralResult> : never; +export type TExtractArray = Assert> extends Static ? T[K] : never; +}[number]>, TSchema[]> extends infer R ? TUnionResult> : never; +export type TExtract = T extends TTemplateLiteral ? TExtractTemplateLiteral : T extends TUnion ? TExtractArray : T extends U ? T : T; +export type TFunctionParameters = [...{ + [K in keyof T]: Static, P>; +}]; +export interface TFunction extends TSchema { + [Kind]: 'Function'; + static: (...param: TFunctionParameters) => Static; + type: 'object'; + instanceOf: 'Function'; + parameters: T; + returns: U; +} +export interface TInteger extends TSchema, NumericOptions { + [Kind]: 'Integer'; + static: number; + type: 'integer'; +} +export type TUnevaluatedProperties = undefined | TSchema | boolean; +export interface IntersectOptions extends SchemaOptions { + unevaluatedProperties?: TUnevaluatedProperties; +} +export interface TIntersect extends TSchema, IntersectOptions { + [Kind]: 'Intersect'; + static: TupleToIntersect<{ + [K in keyof T]: Static, this['params']>; + }>; + type?: 'object'; + allOf: [...T]; +} +export type TKeyOfTuple = { + [K in keyof Static]: TLiteral>; +} extends infer U ? UnionToTuple> : never; +export type TKeyOf = (T extends TRecursive ? TKeyOfTuple : T extends TComposite ? TKeyOfTuple : T extends TIntersect ? TKeyOfTuple : T extends TUnion ? TKeyOfTuple : T extends TObject ? TKeyOfTuple : T extends TRecord ? [K] : [ +]) extends infer R ? TUnionResult> : never; +export type TLiteralValue = string | number | boolean; +export interface TLiteral extends TSchema { + [Kind]: 'Literal'; + static: T; + const: T; +} +export interface TNever extends TSchema { + [Kind]: 'Never'; + static: never; + not: {}; +} +export interface TNot extends TSchema { + [Kind]: 'Not'; + static: Static; + allOf: [{ + not: Not; + }, T]; +} +export interface TNull extends TSchema { + [Kind]: 'Null'; + static: null; + type: 'null'; +} +export interface TNumber extends TSchema, NumericOptions { + [Kind]: 'Number'; + static: number; + type: 'number'; +} +export type ReadonlyOptionalPropertyKeys = { + [K in keyof T]: T[K] extends TReadonlyOptional ? K : never; +}[keyof T]; +export type ReadonlyPropertyKeys = { + [K in keyof T]: T[K] extends TReadonly ? K : never; +}[keyof T]; +export type OptionalPropertyKeys = { + [K in keyof T]: T[K] extends TOptional ? K : never; +}[keyof T]; +export type RequiredPropertyKeys = keyof Omit | ReadonlyPropertyKeys | OptionalPropertyKeys>; +export type PropertiesReducer> = Evaluate<(Readonly>>> & Readonly>> & Partial>> & Required>>)>; +export type PropertiesReduce = PropertiesReducer; +}>; +export type TProperties = Record; +export type ObjectProperties = T extends TObject ? U : never; +export type ObjectPropertyKeys = T extends TObject ? keyof U : never; +export type TAdditionalProperties = undefined | TSchema | boolean; +export interface ObjectOptions extends SchemaOptions { + additionalProperties?: TAdditionalProperties; + minProperties?: number; + maxProperties?: number; +} +export interface TObject extends TSchema, ObjectOptions { + [Kind]: 'Object'; + static: PropertiesReduce; + additionalProperties?: TAdditionalProperties; + type: 'object'; + properties: T; + required?: string[]; +} +export type TOmitArray = Assert<{ + [K2 in keyof T]: TOmit, K>; +}, TSchema[]>; +export type TOmitProperties = Evaluate, TProperties>>; +export type TOmit = T extends TRecursive ? TRecursive> : T extends TComposite ? TComposite> : T extends TIntersect ? TIntersect> : T extends TUnion ? TUnion> : T extends TObject ? TObject> : T; +export type TParameters = TTuple; +export type TPartialObjectArray = Assert<{ + [K in keyof T]: TPartial>; +}, TObject[]>; +export type TPartialArray = Assert<{ + [K in keyof T]: TPartial>; +}, TSchema[]>; +export type TPartialProperties = Evaluate ? TReadonlyOptional : T[K] extends TReadonly ? TReadonlyOptional : T[K] extends TOptional ? TOptional : TOptional; +}, TProperties>>; +export type TPartial = T extends TRecursive ? TRecursive> : T extends TComposite ? TComposite> : T extends TIntersect ? TIntersect> : T extends TUnion ? TUnion> : T extends TObject ? TObject> : T; +export type TPickArray = { + [K2 in keyof T]: TPick, K>; +}; +export type TPickProperties = Pick, keyof T>> extends infer R ? ({ + [K in keyof R]: Assert extends TSchema ? R[K] : never; +}) : never; +export type TPick = T extends TRecursive ? TRecursive> : T extends TComposite ? TComposite> : T extends TIntersect ? TIntersect> : T extends TUnion ? TUnion> : T extends TObject ? TObject> : T; +export interface TPromise extends TSchema { + [Kind]: 'Promise'; + static: Promise>; + type: 'object'; + instanceOf: 'Promise'; + item: TSchema; +} +export type RecordTemplateLiteralObjectType = Ensure]: T; +}>>>; +export type RecordTemplateLiteralType = IsTemplateLiteralFinite extends true ? RecordTemplateLiteralObjectType : TRecord; +export type RecordUnionLiteralType[]>, T extends TSchema> = Static extends string ? Ensure]: T; +}>> : never; +export type RecordLiteralType, T extends TSchema> = Ensure>; +export type RecordNumberType = Ensure>; +export type RecordStringType = Ensure>; +export type RecordKey = TUnion[]> | TLiteral | TTemplateLiteral | TInteger | TNumber | TString; +export interface TRecord extends TSchema { + [Kind]: 'Record'; + static: Record, Static>; + type: 'object'; + patternProperties: { + [pattern: string]: T; + }; + additionalProperties: false; +} +export interface TThis extends TSchema { + [Kind]: 'This'; + static: this['params'][0]; + $ref: string; +} +export type TRecursiveReduce = Static]>; +export interface TRecursive extends TSchema { + [Hint]: 'Recursive'; + static: TRecursiveReduce; +} +export interface TRef extends TSchema { + [Kind]: 'Ref'; + static: Static; + $ref: string; +} +export type TReturnType = T['returns']; +export type TRequiredArray = Assert<{ + [K in keyof T]: TRequired>; +}, TSchema[]>; +export type TRequiredProperties = Evaluate ? TReadonly : T[K] extends TReadonly ? TReadonly : T[K] extends TOptional ? U : T[K]; +}, TProperties>>; +export type TRequired = T extends TRecursive ? TRecursive> : T extends TComposite ? TComposite> : T extends TIntersect ? TIntersect> : T extends TUnion ? TUnion> : T extends TObject ? TObject> : T; +export type StringFormatOption = 'date-time' | 'time' | 'date' | 'email' | 'idn-email' | 'hostname' | 'idn-hostname' | 'ipv4' | 'ipv6' | 'uri' | 'uri-reference' | 'iri' | 'uuid' | 'iri-reference' | 'uri-template' | 'json-pointer' | 'relative-json-pointer' | 'regex'; +export interface StringOptions extends SchemaOptions { + minLength?: number; + maxLength?: number; + pattern?: string; + format?: Format; + contentEncoding?: '7bit' | '8bit' | 'binary' | 'quoted-printable' | 'base64'; + contentMediaType?: string; +} +export interface TString extends TSchema, StringOptions { + [Kind]: 'String'; + static: string; + type: 'string'; +} +export type SymbolValue = string | number | undefined; +export interface TSymbol extends TSchema, SchemaOptions { + [Kind]: 'Symbol'; + static: symbol; + type: 'null'; + typeOf: 'Symbol'; +} +export type IsTemplateLiteralFiniteCheck = T extends TTemplateLiteral ? IsTemplateLiteralFiniteArray> : T extends TUnion ? IsTemplateLiteralFiniteArray> : T extends TString ? false : T extends TBoolean ? false : T extends TNumber ? false : T extends TInteger ? false : T extends TBigInt ? false : T extends TLiteral ? true : false; +export type IsTemplateLiteralFiniteArray = T extends [infer L, ...infer R] ? IsTemplateLiteralFiniteCheck extends false ? false : IsTemplateLiteralFiniteArray> : T extends [infer L] ? IsTemplateLiteralFiniteCheck extends false ? false : true : true; +export type IsTemplateLiteralFinite = T extends TTemplateLiteral ? IsTemplateLiteralFiniteArray : false; +export type TTemplateLiteralKind = TUnion | TLiteral | TInteger | TTemplateLiteral | TNumber | TBigInt | TString | TBoolean | TNever; +export type TTemplateLiteralConst = T extends TUnion ? { + [K in keyof U]: TTemplateLiteralUnion, Acc>; +}[number] : T extends TTemplateLiteral ? `${Static}` : T extends TLiteral ? `${U}` : T extends TString ? `${string}` : T extends TNumber ? `${number}` : T extends TBigInt ? `${bigint}` : T extends TBoolean ? `${boolean}` : never; +export type TTemplateLiteralUnion = T extends [infer L, ...infer R] ? `${TTemplateLiteralConst}${TTemplateLiteralUnion, Acc>}` : T extends [infer L] ? `${TTemplateLiteralConst}${Acc}` : Acc; +export interface TTemplateLiteral extends TSchema { + [Kind]: 'TemplateLiteral'; + static: TTemplateLiteralUnion; + type: 'string'; + pattern: string; +} +export type TTupleIntoArray> = T extends TTuple ? Assert : never; +export interface TTuple extends TSchema { + [Kind]: 'Tuple'; + static: { + [K in keyof T]: T[K] extends TSchema ? Static : T[K]; + }; + type: 'array'; + items?: T; + additionalItems?: false; + minItems: number; + maxItems: number; +} +export interface TUndefined extends TSchema { + [Kind]: 'Undefined'; + static: undefined; + type: 'null'; + typeOf: 'Undefined'; +} +export type TUnionOfLiteralArray[]> = { + [K in keyof T]: Assert['const']; +}[number]; +export type TUnionOfLiteral[]>> = TUnionOfLiteralArray; +export type TUnionResult = T extends [] ? TNever : T extends [infer S] ? S : TUnion; +export type TUnionTemplateLiteral> = (string); +export interface TUnion extends TSchema { + [Kind]: 'Union'; + static: { + [K in keyof T]: T[K] extends TSchema ? Static : never; + }[number]; + anyOf: T; +} +export interface Uint8ArrayOptions extends SchemaOptions { + maxByteLength?: number; + minByteLength?: number; +} +export interface TUint8Array extends TSchema, Uint8ArrayOptions { + [Kind]: 'Uint8Array'; + static: Uint8Array; + instanceOf: 'Uint8Array'; + type: 'object'; +} +export interface TUnknown extends TSchema { + [Kind]: 'Unknown'; + static: unknown; +} +export interface UnsafeOptions extends SchemaOptions { + [Kind]?: string; +} +export interface TUnsafe extends TSchema { + [Kind]: string; + static: T; +} +export interface TVoid extends TSchema { + [Kind]: 'Void'; + static: void; + type: 'null'; + typeOf: 'Void'; +} +/** Creates a TypeScript static type from a TypeBox type */ +export type Static = (T & { + params: P; +})['static']; +export type TypeRegistryValidationFunction = (schema: TSchema, value: unknown) => boolean; +/** A registry for user defined types */ +export declare namespace TypeRegistry { + /** Returns the entries in this registry */ + function Entries(): Map>; + /** Clears all user defined types */ + function Clear(): void; + /** Returns true if this registry contains this kind */ + function Has(kind: string): boolean; + /** Sets a validation function for a user defined type */ + function Set(kind: string, func: TypeRegistryValidationFunction): void; + /** Gets a custom validation function for a user defined type */ + function Get(kind: string): TypeRegistryValidationFunction | undefined; +} +export type FormatRegistryValidationFunction = (value: string) => boolean; +/** A registry for user defined string formats */ +export declare namespace FormatRegistry { + /** Returns the entries in this registry */ + function Entries(): Map; + /** Clears all user defined string formats */ + function Clear(): void; + /** Returns true if the user defined string format exists */ + function Has(format: string): boolean; + /** Sets a validation function for a user defined string format */ + function Set(format: string, func: FormatRegistryValidationFunction): void; + /** Gets a validation function for a user defined string format */ + function Get(format: string): FormatRegistryValidationFunction | undefined; +} +export declare class TypeGuardUnknownTypeError extends Error { + readonly schema: unknown; + constructor(schema: unknown); +} +/** Provides functions to test if JavaScript values are TypeBox types */ +export declare namespace TypeGuard { + /** Returns true if the given schema is TAny */ + function TAny(schema: unknown): schema is TAny; + /** Returns true if the given schema is TArray */ + function TArray(schema: unknown): schema is TArray; + /** Returns true if the given schema is TBigInt */ + function TBigInt(schema: unknown): schema is TBigInt; + /** Returns true if the given schema is TBoolean */ + function TBoolean(schema: unknown): schema is TBoolean; + /** Returns true if the given schema is TConstructor */ + function TConstructor(schema: unknown): schema is TConstructor; + /** Returns true if the given schema is TDate */ + function TDate(schema: unknown): schema is TDate; + /** Returns true if the given schema is TFunction */ + function TFunction(schema: unknown): schema is TFunction; + /** Returns true if the given schema is TInteger */ + function TInteger(schema: unknown): schema is TInteger; + /** Returns true if the given schema is TIntersect */ + function TIntersect(schema: unknown): schema is TIntersect; + /** Returns true if the given schema is TKind */ + function TKind(schema: unknown): schema is Record; + /** Returns true if the given schema is TLiteral */ + function TLiteral(schema: unknown): schema is TLiteral; + /** Returns true if the given schema is TNever */ + function TNever(schema: unknown): schema is TNever; + /** Returns true if the given schema is TNot */ + function TNot(schema: unknown): schema is TNot; + /** Returns true if the given schema is TNull */ + function TNull(schema: unknown): schema is TNull; + /** Returns true if the given schema is TNumber */ + function TNumber(schema: unknown): schema is TNumber; + /** Returns true if the given schema is TObject */ + function TObject(schema: unknown): schema is TObject; + /** Returns true if the given schema is TPromise */ + function TPromise(schema: unknown): schema is TPromise; + /** Returns true if the given schema is TRecord */ + function TRecord(schema: unknown): schema is TRecord; + /** Returns true if the given schema is TRef */ + function TRef(schema: unknown): schema is TRef; + /** Returns true if the given schema is TString */ + function TString(schema: unknown): schema is TString; + /** Returns true if the given schema is TSymbol */ + function TSymbol(schema: unknown): schema is TSymbol; + /** Returns true if the given schema is TTemplateLiteral */ + function TTemplateLiteral(schema: unknown): schema is TTemplateLiteral; + /** Returns true if the given schema is TThis */ + function TThis(schema: unknown): schema is TThis; + /** Returns true if the given schema is TTuple */ + function TTuple(schema: unknown): schema is TTuple; + /** Returns true if the given schema is TUndefined */ + function TUndefined(schema: unknown): schema is TUndefined; + /** Returns true if the given schema is TUnion */ + function TUnion(schema: unknown): schema is TUnion; + /** Returns true if the given schema is TUnion[]> */ + function TUnionLiteral(schema: unknown): schema is TUnion[]>; + /** Returns true if the given schema is TUint8Array */ + function TUint8Array(schema: unknown): schema is TUint8Array; + /** Returns true if the given schema is TUnknown */ + function TUnknown(schema: unknown): schema is TUnknown; + /** Returns true if the given schema is a raw TUnsafe */ + function TUnsafe(schema: unknown): schema is TUnsafe; + /** Returns true if the given schema is TVoid */ + function TVoid(schema: unknown): schema is TVoid; + /** Returns true if this schema has the ReadonlyOptional modifier */ + function TReadonlyOptional(schema: T): schema is TReadonlyOptional; + /** Returns true if this schema has the Readonly modifier */ + function TReadonly(schema: T): schema is TReadonly; + /** Returns true if this schema has the Optional modifier */ + function TOptional(schema: T): schema is TOptional; + /** Returns true if the given schema is TSchema */ + function TSchema(schema: unknown): schema is TSchema; +} +/** Fast undefined check used for properties of type undefined */ +export declare namespace ExtendsUndefined { + function Check(schema: TSchema): boolean; +} +export declare enum TypeExtendsResult { + Union = 0, + True = 1, + False = 2 +} +export declare namespace TypeExtends { + function Extends(left: TSchema, right: TSchema): TypeExtendsResult; +} +/** Specialized Clone for Types */ +export declare namespace TypeClone { + /** Clones a type. */ + function Clone(schema: T, options: SchemaOptions): T; +} +export declare namespace ObjectMap { + function Map(schema: TSchema, callback: (object: TObject) => TObject, options: SchemaOptions): T; +} +export declare namespace KeyResolver { + function Resolve(schema: T): string[]; +} +export declare namespace TemplateLiteralPattern { + function Create(kinds: TTemplateLiteralKind[]): string; +} +export declare namespace TemplateLiteralResolver { + function Resolve(template: TTemplateLiteral): TString | TUnion | TLiteral; +} +export declare class TemplateLiteralParserError extends Error { + constructor(message: string); +} +export declare namespace TemplateLiteralParser { + type Expression = And | Or | Const; + type Const = { + type: 'const'; + const: string; + }; + type And = { + type: 'and'; + expr: Expression[]; + }; + type Or = { + type: 'or'; + expr: Expression[]; + }; + /** Parses a pattern and returns an expression tree */ + function Parse(pattern: string): Expression; + /** Parses a pattern and strips forward and trailing ^ and $ */ + function ParseExact(pattern: string): Expression; +} +export declare namespace TemplateLiteralFinite { + function Check(expression: TemplateLiteralParser.Expression): boolean; +} +export declare namespace TemplateLiteralGenerator { + function Generate(expression: TemplateLiteralParser.Expression): IterableIterator; +} +export declare class TypeBuilder { + /** `[Utility]` Creates a schema without `static` and `params` types */ + protected Create(schema: Omit): T; + /** `[Standard]` Omits compositing symbols from this schema */ + Strict(schema: T): T; +} +export declare class StandardTypeBuilder extends TypeBuilder { + /** `[Modifier]` Creates a Optional property */ + Optional(schema: T): TOptional; + /** `[Modifier]` Creates a ReadonlyOptional property */ + ReadonlyOptional(schema: T): TReadonlyOptional; + /** `[Modifier]` Creates a Readonly object or property */ + Readonly(schema: T): TReadonly; + /** `[Standard]` Creates an Any type */ + Any(options?: SchemaOptions): TAny; + /** `[Standard]` Creates an Array type */ + Array(items: T, options?: ArrayOptions): TArray; + /** `[Standard]` Creates a Boolean type */ + Boolean(options?: SchemaOptions): TBoolean; + /** `[Standard]` Creates a Composite object type. */ + Composite(objects: [...T], options?: ObjectOptions): TComposite; + /** `[Standard]` Creates a Enum type */ + Enum>(item: T, options?: SchemaOptions): TEnum; + /** `[Standard]` A conditional type expression that will return the true type if the left type extends the right */ + Extends(left: L, right: R, trueType: T, falseType: U, options?: SchemaOptions): TExtends; + /** `[Standard]` Excludes from the left type any type that is not assignable to the right */ + Exclude(left: L, right: R, options?: SchemaOptions): TExclude; + /** `[Standard]` Extracts from the left type any type that is assignable to the right */ + Extract(left: L, right: R, options?: SchemaOptions): TExtract; + /** `[Standard]` Creates an Integer type */ + Integer(options?: NumericOptions): TInteger; + /** `[Standard]` Creates a Intersect type */ + Intersect(allOf: [], options?: SchemaOptions): TNever; + /** `[Standard]` Creates a Intersect type */ + Intersect(allOf: [...T], options?: SchemaOptions): T[0]; + Intersect(allOf: [...T], options?: IntersectOptions): TIntersect; + /** `[Standard]` Creates a KeyOf type */ + KeyOf(schema: T, options?: SchemaOptions): TKeyOf; + /** `[Standard]` Creates a Literal type */ + Literal(value: T, options?: SchemaOptions): TLiteral; + /** `[Standard]` Creates a Never type */ + Never(options?: SchemaOptions): TNever; + /** `[Standard]` Creates a Not type. The first argument is the disallowed type, the second is the allowed. */ + Not(not: N, schema: T, options?: SchemaOptions): TNot; + /** `[Standard]` Creates a Null type */ + Null(options?: SchemaOptions): TNull; + /** `[Standard]` Creates a Number type */ + Number(options?: NumericOptions): TNumber; + /** `[Standard]` Creates an Object type */ + Object(properties: T, options?: ObjectOptions): TObject; + /** `[Standard]` Creates a mapped type whose keys are omitted from the given type */ + Omit)[]>(schema: T, keys: readonly [...K], options?: SchemaOptions): TOmit; + /** `[Standard]` Creates a mapped type whose keys are omitted from the given type */ + Omit[]>>(schema: T, keys: K, options?: SchemaOptions): TOmit>; + /** `[Standard]` Creates a mapped type whose keys are omitted from the given type */ + Omit>(schema: T, key: K, options?: SchemaOptions): TOmit; + /** `[Standard]` Creates a mapped type whose keys are omitted from the given type */ + Omit(schema: T, key: K, options?: SchemaOptions): TOmit; + /** `[Standard]` Creates a mapped type where all properties are Optional */ + Partial(schema: T, options?: ObjectOptions): TPartial; + /** `[Standard]` Creates a mapped type whose keys are picked from the given type */ + Pick)[]>(schema: T, keys: readonly [...K], options?: SchemaOptions): TPick; + /** `[Standard]` Creates a mapped type whose keys are picked from the given type */ + Pick[]>>(schema: T, keys: K, options?: SchemaOptions): TPick>; + /** `[Standard]` Creates a mapped type whose keys are picked from the given type */ + Pick>(schema: T, key: K, options?: SchemaOptions): TPick; + /** `[Standard]` Creates a mapped type whose keys are picked from the given type */ + Pick(schema: T, key: K, options?: SchemaOptions): TPick; + /** `[Standard]` Creates a Record type */ + Record[]>, T extends TSchema>(key: K, schema: T, options?: ObjectOptions): RecordUnionLiteralType; + /** `[Standard]` Creates a Record type */ + Record, T extends TSchema>(key: K, schema: T, options?: ObjectOptions): RecordLiteralType; + /** `[Standard]` Creates a Record type */ + Record(key: K, schema: T, options?: ObjectOptions): RecordTemplateLiteralType; + /** `[Standard]` Creates a Record type */ + Record(key: K, schema: T, options?: ObjectOptions): RecordNumberType; + /** `[Standard]` Creates a Record type */ + Record(key: K, schema: T, options?: ObjectOptions): RecordStringType; + /** `[Standard]` Creates a Recursive type */ + Recursive(callback: (thisType: TThis) => T, options?: SchemaOptions): TRecursive; + /** `[Standard]` Creates a Ref type. The referenced type must contain a $id */ + Ref(schema: T, options?: SchemaOptions): TRef; + /** `[Standard]` Creates a mapped type where all properties are Required */ + Required(schema: T, options?: SchemaOptions): TRequired; + /** `[Standard]` Creates a String type */ + String(options?: StringOptions): TString; + /** `[Standard]` Creates a template literal type */ + TemplateLiteral(kinds: [...T], options?: SchemaOptions): TTemplateLiteral; + /** `[Standard]` Creates a Tuple type */ + Tuple(items: [...T], options?: SchemaOptions): TTuple; + /** `[Standard]` Creates a Union type */ + Union(anyOf: [], options?: SchemaOptions): TNever; + /** `[Standard]` Creates a Union type */ + Union(anyOf: [...T], options?: SchemaOptions): T[0]; + /** `[Standard]` Creates a Union type */ + Union(anyOf: [...T], options?: SchemaOptions): TUnion; + /** `[Experimental]` Remaps a TemplateLiteral into a Union representation. This function is known to cause TS compiler crashes for finite templates with large generation counts. Use with caution. */ + Union(template: T): TUnionTemplateLiteral; + /** `[Standard]` Creates an Unknown type */ + Unknown(options?: SchemaOptions): TUnknown; + /** `[Standard]` Creates a Unsafe type that infers for the generic argument */ + Unsafe(options?: UnsafeOptions): TUnsafe; +} +export declare class ExtendedTypeBuilder extends StandardTypeBuilder { + /** `[Extended]` Creates a BigInt type */ + BigInt(options?: NumericOptions): TBigInt; + /** `[Extended]` Extracts the ConstructorParameters from the given Constructor type */ + ConstructorParameters>(schema: T, options?: SchemaOptions): TConstructorParameters; + /** `[Extended]` Creates a Constructor type */ + Constructor, U extends TSchema>(parameters: T, returns: U, options?: SchemaOptions): TConstructor, U>; + /** `[Extended]` Creates a Constructor type */ + Constructor(parameters: [...T], returns: U, options?: SchemaOptions): TConstructor; + /** `[Extended]` Creates a Date type */ + Date(options?: DateOptions): TDate; + /** `[Extended]` Creates a Function type */ + Function, U extends TSchema>(parameters: T, returns: U, options?: SchemaOptions): TFunction, U>; + /** `[Extended]` Creates a Function type */ + Function(parameters: [...T], returns: U, options?: SchemaOptions): TFunction; + /** `[Extended]` Extracts the InstanceType from the given Constructor */ + InstanceType>(schema: T, options?: SchemaOptions): TInstanceType; + /** `[Extended]` Extracts the Parameters from the given Function type */ + Parameters>(schema: T, options?: SchemaOptions): TParameters; + /** `[Extended]` Creates a Promise type */ + Promise(item: T, options?: SchemaOptions): TPromise; + /** `[Extended]` Creates a regular expression type */ + RegEx(regex: RegExp, options?: SchemaOptions): TString; + /** `[Extended]` Extracts the ReturnType from the given Function */ + ReturnType>(schema: T, options?: SchemaOptions): TReturnType; + /** `[Extended]` Creates a Symbol type */ + Symbol(options?: SchemaOptions): TSymbol; + /** `[Extended]` Creates a Undefined type */ + Undefined(options?: SchemaOptions): TUndefined; + /** `[Extended]` Creates a Uint8Array type */ + Uint8Array(options?: Uint8ArrayOptions): TUint8Array; + /** `[Extended]` Creates a Void type */ + Void(options?: SchemaOptions): TVoid; +} +/** JSON Schema TypeBuilder with Static Resolution for TypeScript */ +export declare const StandardType: StandardTypeBuilder; +/** JSON Schema TypeBuilder with Static Resolution for TypeScript */ +export declare const Type: ExtendedTypeBuilder; diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/typebox.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/typebox.js new file mode 100644 index 0000000..c8953c3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/typebox.js @@ -0,0 +1,2220 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Type = exports.StandardType = exports.ExtendedTypeBuilder = exports.StandardTypeBuilder = exports.TypeBuilder = exports.TemplateLiteralGenerator = exports.TemplateLiteralFinite = exports.TemplateLiteralParser = exports.TemplateLiteralParserError = exports.TemplateLiteralResolver = exports.TemplateLiteralPattern = exports.KeyResolver = exports.ObjectMap = exports.TypeClone = exports.TypeExtends = exports.TypeExtendsResult = exports.ExtendsUndefined = exports.TypeGuard = exports.TypeGuardUnknownTypeError = exports.FormatRegistry = exports.TypeRegistry = exports.PatternStringExact = exports.PatternNumberExact = exports.PatternBooleanExact = exports.PatternString = exports.PatternNumber = exports.PatternBoolean = exports.Kind = exports.Hint = exports.Modifier = void 0; +// -------------------------------------------------------------------------- +// Symbols +// -------------------------------------------------------------------------- +exports.Modifier = Symbol.for('TypeBox.Modifier'); +exports.Hint = Symbol.for('TypeBox.Hint'); +exports.Kind = Symbol.for('TypeBox.Kind'); +// -------------------------------------------------------------------------- +// Patterns +// -------------------------------------------------------------------------- +exports.PatternBoolean = '(true|false)'; +exports.PatternNumber = '(0|[1-9][0-9]*)'; +exports.PatternString = '(.*)'; +exports.PatternBooleanExact = `^${exports.PatternBoolean}$`; +exports.PatternNumberExact = `^${exports.PatternNumber}$`; +exports.PatternStringExact = `^${exports.PatternString}$`; +/** A registry for user defined types */ +var TypeRegistry; +(function (TypeRegistry) { + const map = new Map(); + /** Returns the entries in this registry */ + function Entries() { + return new Map(map); + } + TypeRegistry.Entries = Entries; + /** Clears all user defined types */ + function Clear() { + return map.clear(); + } + TypeRegistry.Clear = Clear; + /** Returns true if this registry contains this kind */ + function Has(kind) { + return map.has(kind); + } + TypeRegistry.Has = Has; + /** Sets a validation function for a user defined type */ + function Set(kind, func) { + map.set(kind, func); + } + TypeRegistry.Set = Set; + /** Gets a custom validation function for a user defined type */ + function Get(kind) { + return map.get(kind); + } + TypeRegistry.Get = Get; +})(TypeRegistry = exports.TypeRegistry || (exports.TypeRegistry = {})); +/** A registry for user defined string formats */ +var FormatRegistry; +(function (FormatRegistry) { + const map = new Map(); + /** Returns the entries in this registry */ + function Entries() { + return new Map(map); + } + FormatRegistry.Entries = Entries; + /** Clears all user defined string formats */ + function Clear() { + return map.clear(); + } + FormatRegistry.Clear = Clear; + /** Returns true if the user defined string format exists */ + function Has(format) { + return map.has(format); + } + FormatRegistry.Has = Has; + /** Sets a validation function for a user defined string format */ + function Set(format, func) { + map.set(format, func); + } + FormatRegistry.Set = Set; + /** Gets a validation function for a user defined string format */ + function Get(format) { + return map.get(format); + } + FormatRegistry.Get = Get; +})(FormatRegistry = exports.FormatRegistry || (exports.FormatRegistry = {})); +// -------------------------------------------------------------------------- +// TypeGuard +// -------------------------------------------------------------------------- +class TypeGuardUnknownTypeError extends Error { + constructor(schema) { + super('TypeGuard: Unknown type'); + this.schema = schema; + } +} +exports.TypeGuardUnknownTypeError = TypeGuardUnknownTypeError; +/** Provides functions to test if JavaScript values are TypeBox types */ +var TypeGuard; +(function (TypeGuard) { + function IsObject(value) { + return typeof value === 'object' && value !== null && !Array.isArray(value); + } + function IsArray(value) { + return typeof value === 'object' && value !== null && Array.isArray(value); + } + function IsPattern(value) { + try { + new RegExp(value); + return true; + } + catch { + return false; + } + } + function IsControlCharacterFree(value) { + if (typeof value !== 'string') + return false; + for (let i = 0; i < value.length; i++) { + const code = value.charCodeAt(i); + if ((code >= 7 && code <= 13) || code === 27 || code === 127) { + return false; + } + } + return true; + } + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsString(value) { + return typeof value === 'string'; + } + function IsNumber(value) { + return typeof value === 'number' && globalThis.Number.isFinite(value); + } + function IsBoolean(value) { + return typeof value === 'boolean'; + } + function IsOptionalBigInt(value) { + return value === undefined || (value !== undefined && IsBigInt(value)); + } + function IsOptionalNumber(value) { + return value === undefined || (value !== undefined && IsNumber(value)); + } + function IsOptionalBoolean(value) { + return value === undefined || (value !== undefined && IsBoolean(value)); + } + function IsOptionalString(value) { + return value === undefined || (value !== undefined && IsString(value)); + } + function IsOptionalPattern(value) { + return value === undefined || (value !== undefined && IsString(value) && IsControlCharacterFree(value) && IsPattern(value)); + } + function IsOptionalFormat(value) { + return value === undefined || (value !== undefined && IsString(value) && IsControlCharacterFree(value)); + } + function IsOptionalSchema(value) { + return value === undefined || TSchema(value); + } + /** Returns true if the given schema is TAny */ + function TAny(schema) { + return TKind(schema) && schema[exports.Kind] === 'Any' && IsOptionalString(schema.$id); + } + TypeGuard.TAny = TAny; + /** Returns true if the given schema is TArray */ + function TArray(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'Array' && + schema.type === 'array' && + IsOptionalString(schema.$id) && + TSchema(schema.items) && + IsOptionalNumber(schema.minItems) && + IsOptionalNumber(schema.maxItems) && + IsOptionalBoolean(schema.uniqueItems)); + } + TypeGuard.TArray = TArray; + /** Returns true if the given schema is TBigInt */ + function TBigInt(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'BigInt' && + schema.type === 'null' && + schema.typeOf === 'BigInt' && + IsOptionalString(schema.$id) && + IsOptionalBigInt(schema.multipleOf) && + IsOptionalBigInt(schema.minimum) && + IsOptionalBigInt(schema.maximum) && + IsOptionalBigInt(schema.exclusiveMinimum) && + IsOptionalBigInt(schema.exclusiveMaximum)); + } + TypeGuard.TBigInt = TBigInt; + /** Returns true if the given schema is TBoolean */ + function TBoolean(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Boolean' && + schema.type === 'boolean' && + IsOptionalString(schema.$id)); + } + TypeGuard.TBoolean = TBoolean; + /** Returns true if the given schema is TConstructor */ + function TConstructor(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Constructor' && + schema.type === 'object' && + schema.instanceOf === 'Constructor' && + IsOptionalString(schema.$id) && + IsArray(schema.parameters) && + TSchema(schema.returns))) { + return false; + } + for (const parameter of schema.parameters) { + if (!TSchema(parameter)) + return false; + } + return true; + } + TypeGuard.TConstructor = TConstructor; + /** Returns true if the given schema is TDate */ + function TDate(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'Date' && + schema.type === 'object' && + schema.instanceOf === 'Date' && + IsOptionalString(schema.$id) && + IsOptionalNumber(schema.minimumTimestamp) && + IsOptionalNumber(schema.maximumTimestamp) && + IsOptionalNumber(schema.exclusiveMinimumTimestamp) && + IsOptionalNumber(schema.exclusiveMaximumTimestamp)); + } + TypeGuard.TDate = TDate; + /** Returns true if the given schema is TFunction */ + function TFunction(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Function' && + schema.type === 'object' && + schema.instanceOf === 'Function' && + IsOptionalString(schema.$id) && + IsArray(schema.parameters) && + TSchema(schema.returns))) { + return false; + } + for (const parameter of schema.parameters) { + if (!TSchema(parameter)) + return false; + } + return true; + } + TypeGuard.TFunction = TFunction; + /** Returns true if the given schema is TInteger */ + function TInteger(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'Integer' && + schema.type === 'integer' && + IsOptionalString(schema.$id) && + IsOptionalNumber(schema.multipleOf) && + IsOptionalNumber(schema.minimum) && + IsOptionalNumber(schema.maximum) && + IsOptionalNumber(schema.exclusiveMinimum) && + IsOptionalNumber(schema.exclusiveMaximum)); + } + TypeGuard.TInteger = TInteger; + /** Returns true if the given schema is TIntersect */ + function TIntersect(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Intersect' && + IsArray(schema.allOf) && + IsOptionalString(schema.type) && + (IsOptionalBoolean(schema.unevaluatedProperties) || IsOptionalSchema(schema.unevaluatedProperties)) && + IsOptionalString(schema.$id))) { + return false; + } + if ('type' in schema && schema.type !== 'object') { + return false; + } + for (const inner of schema.allOf) { + if (!TSchema(inner)) + return false; + } + return true; + } + TypeGuard.TIntersect = TIntersect; + /** Returns true if the given schema is TKind */ + function TKind(schema) { + return IsObject(schema) && exports.Kind in schema && typeof schema[exports.Kind] === 'string'; // TS 4.1.5: any required for symbol indexer + } + TypeGuard.TKind = TKind; + /** Returns true if the given schema is TLiteral */ + function TLiteral(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Literal' && + IsOptionalString(schema.$id) && + (IsString(schema.const) || + IsNumber(schema.const) || + IsBoolean(schema.const) || + IsBigInt(schema.const))); + } + TypeGuard.TLiteral = TLiteral; + /** Returns true if the given schema is TNever */ + function TNever(schema) { + return TKind(schema) && schema[exports.Kind] === 'Never' && IsObject(schema.not) && globalThis.Object.getOwnPropertyNames(schema.not).length === 0; + } + TypeGuard.TNever = TNever; + /** Returns true if the given schema is TNot */ + function TNot(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Not' && + IsArray(schema.allOf) && + schema.allOf.length === 2 && + IsObject(schema.allOf[0]) && + TSchema(schema.allOf[0].not) && + TSchema(schema.allOf[1])); + } + TypeGuard.TNot = TNot; + /** Returns true if the given schema is TNull */ + function TNull(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Null' && + schema.type === 'null' && + IsOptionalString(schema.$id)); + } + TypeGuard.TNull = TNull; + /** Returns true if the given schema is TNumber */ + function TNumber(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'Number' && + schema.type === 'number' && + IsOptionalString(schema.$id) && + IsOptionalNumber(schema.multipleOf) && + IsOptionalNumber(schema.minimum) && + IsOptionalNumber(schema.maximum) && + IsOptionalNumber(schema.exclusiveMinimum) && + IsOptionalNumber(schema.exclusiveMaximum)); + } + TypeGuard.TNumber = TNumber; + /** Returns true if the given schema is TObject */ + function TObject(schema) { + if (!(TKind(schema) && + schema[exports.Kind] === 'Object' && + schema.type === 'object' && + IsOptionalString(schema.$id) && + IsObject(schema.properties) && + (IsOptionalBoolean(schema.additionalProperties) || IsOptionalSchema(schema.additionalProperties)) && + IsOptionalNumber(schema.minProperties) && + IsOptionalNumber(schema.maxProperties))) { + return false; + } + for (const [key, value] of Object.entries(schema.properties)) { + if (!IsControlCharacterFree(key)) + return false; + if (!TSchema(value)) + return false; + } + return true; + } + TypeGuard.TObject = TObject; + /** Returns true if the given schema is TPromise */ + function TPromise(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Promise' && + schema.type === 'object' && + schema.instanceOf === 'Promise' && + IsOptionalString(schema.$id) && + TSchema(schema.item)); + } + TypeGuard.TPromise = TPromise; + /** Returns true if the given schema is TRecord */ + function TRecord(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Record' && + schema.type === 'object' && + IsOptionalString(schema.$id) && + schema.additionalProperties === false && + IsObject(schema.patternProperties))) { + return false; + } + const keys = Object.keys(schema.patternProperties); + if (keys.length !== 1) { + return false; + } + if (!IsPattern(keys[0])) { + return false; + } + if (!TSchema(schema.patternProperties[keys[0]])) { + return false; + } + return true; + } + TypeGuard.TRecord = TRecord; + /** Returns true if the given schema is TRef */ + function TRef(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Ref' && + IsOptionalString(schema.$id) && + IsString(schema.$ref)); + } + TypeGuard.TRef = TRef; + /** Returns true if the given schema is TString */ + function TString(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'String' && + schema.type === 'string' && + IsOptionalString(schema.$id) && + IsOptionalNumber(schema.minLength) && + IsOptionalNumber(schema.maxLength) && + IsOptionalPattern(schema.pattern) && + IsOptionalFormat(schema.format)); + } + TypeGuard.TString = TString; + /** Returns true if the given schema is TSymbol */ + function TSymbol(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Symbol' && + schema.type === 'null' && + schema.typeOf === 'Symbol' && + IsOptionalString(schema.$id)); + } + TypeGuard.TSymbol = TSymbol; + /** Returns true if the given schema is TTemplateLiteral */ + function TTemplateLiteral(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'TemplateLiteral' && + schema.type === 'string' && + IsString(schema.pattern) && + schema.pattern[0] === '^' && + schema.pattern[schema.pattern.length - 1] === '$'); + } + TypeGuard.TTemplateLiteral = TTemplateLiteral; + /** Returns true if the given schema is TThis */ + function TThis(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'This' && + IsOptionalString(schema.$id) && + IsString(schema.$ref)); + } + TypeGuard.TThis = TThis; + /** Returns true if the given schema is TTuple */ + function TTuple(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Tuple' && + schema.type === 'array' && + IsOptionalString(schema.$id) && + IsNumber(schema.minItems) && + IsNumber(schema.maxItems) && + schema.minItems === schema.maxItems)) { + return false; + } + if (schema.items === undefined && schema.additionalItems === undefined && schema.minItems === 0) { + return true; + } + if (!IsArray(schema.items)) { + return false; + } + for (const inner of schema.items) { + if (!TSchema(inner)) + return false; + } + return true; + } + TypeGuard.TTuple = TTuple; + /** Returns true if the given schema is TUndefined */ + function TUndefined(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Undefined' && + schema.type === 'null' && + schema.typeOf === 'Undefined' && + IsOptionalString(schema.$id)); + } + TypeGuard.TUndefined = TUndefined; + /** Returns true if the given schema is TUnion */ + function TUnion(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Union' && + IsArray(schema.anyOf) && + IsOptionalString(schema.$id))) { + return false; + } + for (const inner of schema.anyOf) { + if (!TSchema(inner)) + return false; + } + return true; + } + TypeGuard.TUnion = TUnion; + /** Returns true if the given schema is TUnion[]> */ + function TUnionLiteral(schema) { + return TUnion(schema) && schema.anyOf.every((schema) => TLiteral(schema) && typeof schema.const === 'string'); + } + TypeGuard.TUnionLiteral = TUnionLiteral; + /** Returns true if the given schema is TUint8Array */ + function TUint8Array(schema) { + return TKind(schema) && schema[exports.Kind] === 'Uint8Array' && schema.type === 'object' && IsOptionalString(schema.$id) && schema.instanceOf === 'Uint8Array' && IsOptionalNumber(schema.minByteLength) && IsOptionalNumber(schema.maxByteLength); + } + TypeGuard.TUint8Array = TUint8Array; + /** Returns true if the given schema is TUnknown */ + function TUnknown(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Unknown' && + IsOptionalString(schema.$id)); + } + TypeGuard.TUnknown = TUnknown; + /** Returns true if the given schema is a raw TUnsafe */ + function TUnsafe(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Unsafe'); + } + TypeGuard.TUnsafe = TUnsafe; + /** Returns true if the given schema is TVoid */ + function TVoid(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Void' && + schema.type === 'null' && + schema.typeOf === 'Void' && + IsOptionalString(schema.$id)); + } + TypeGuard.TVoid = TVoid; + /** Returns true if this schema has the ReadonlyOptional modifier */ + function TReadonlyOptional(schema) { + return IsObject(schema) && schema[exports.Modifier] === 'ReadonlyOptional'; + } + TypeGuard.TReadonlyOptional = TReadonlyOptional; + /** Returns true if this schema has the Readonly modifier */ + function TReadonly(schema) { + return IsObject(schema) && schema[exports.Modifier] === 'Readonly'; + } + TypeGuard.TReadonly = TReadonly; + /** Returns true if this schema has the Optional modifier */ + function TOptional(schema) { + return IsObject(schema) && schema[exports.Modifier] === 'Optional'; + } + TypeGuard.TOptional = TOptional; + /** Returns true if the given schema is TSchema */ + function TSchema(schema) { + return (typeof schema === 'object' && + (TAny(schema) || + TArray(schema) || + TBoolean(schema) || + TBigInt(schema) || + TConstructor(schema) || + TDate(schema) || + TFunction(schema) || + TInteger(schema) || + TIntersect(schema) || + TLiteral(schema) || + TNever(schema) || + TNot(schema) || + TNull(schema) || + TNumber(schema) || + TObject(schema) || + TPromise(schema) || + TRecord(schema) || + TRef(schema) || + TString(schema) || + TSymbol(schema) || + TTemplateLiteral(schema) || + TThis(schema) || + TTuple(schema) || + TUndefined(schema) || + TUnion(schema) || + TUint8Array(schema) || + TUnknown(schema) || + TUnsafe(schema) || + TVoid(schema) || + (TKind(schema) && TypeRegistry.Has(schema[exports.Kind])))); + } + TypeGuard.TSchema = TSchema; +})(TypeGuard = exports.TypeGuard || (exports.TypeGuard = {})); +// -------------------------------------------------------------------------- +// ExtendsUndefined +// -------------------------------------------------------------------------- +/** Fast undefined check used for properties of type undefined */ +var ExtendsUndefined; +(function (ExtendsUndefined) { + function Check(schema) { + if (schema[exports.Kind] === 'Undefined') + return true; + if (schema[exports.Kind] === 'Union') { + const union = schema; + return union.anyOf.some((schema) => Check(schema)); + } + return false; + } + ExtendsUndefined.Check = Check; +})(ExtendsUndefined = exports.ExtendsUndefined || (exports.ExtendsUndefined = {})); +// -------------------------------------------------------------------------- +// TypeExtends +// -------------------------------------------------------------------------- +var TypeExtendsResult; +(function (TypeExtendsResult) { + TypeExtendsResult[TypeExtendsResult["Union"] = 0] = "Union"; + TypeExtendsResult[TypeExtendsResult["True"] = 1] = "True"; + TypeExtendsResult[TypeExtendsResult["False"] = 2] = "False"; +})(TypeExtendsResult = exports.TypeExtendsResult || (exports.TypeExtendsResult = {})); +var TypeExtends; +(function (TypeExtends) { + // -------------------------------------------------------------------------- + // IntoBooleanResult + // -------------------------------------------------------------------------- + function IntoBooleanResult(result) { + return result === TypeExtendsResult.False ? TypeExtendsResult.False : TypeExtendsResult.True; + } + // -------------------------------------------------------------------------- + // Any + // -------------------------------------------------------------------------- + function AnyRight(left, right) { + return TypeExtendsResult.True; + } + function Any(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right) && right.anyOf.some((schema) => TypeGuard.TAny(schema) || TypeGuard.TUnknown(schema))) + return TypeExtendsResult.True; + if (TypeGuard.TUnion(right)) + return TypeExtendsResult.Union; + if (TypeGuard.TUnknown(right)) + return TypeExtendsResult.True; + if (TypeGuard.TAny(right)) + return TypeExtendsResult.True; + return TypeExtendsResult.Union; + } + // -------------------------------------------------------------------------- + // Array + // -------------------------------------------------------------------------- + function ArrayRight(left, right) { + if (TypeGuard.TUnknown(left)) + return TypeExtendsResult.False; + if (TypeGuard.TAny(left)) + return TypeExtendsResult.Union; + if (TypeGuard.TNever(left)) + return TypeExtendsResult.True; + return TypeExtendsResult.False; + } + function Array(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right) && IsObjectArrayLike(right)) + return TypeExtendsResult.True; + if (!TypeGuard.TArray(right)) + return TypeExtendsResult.False; + return IntoBooleanResult(Visit(left.items, right.items)); + } + // -------------------------------------------------------------------------- + // BigInt + // -------------------------------------------------------------------------- + function BigInt(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TBigInt(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Boolean + // -------------------------------------------------------------------------- + function BooleanRight(left, right) { + if (TypeGuard.TLiteral(left) && typeof left.const === 'boolean') + return TypeExtendsResult.True; + return TypeGuard.TBoolean(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Boolean(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TBoolean(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Constructor + // -------------------------------------------------------------------------- + function Constructor(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (!TypeGuard.TConstructor(right)) + return TypeExtendsResult.False; + if (left.parameters.length > right.parameters.length) + return TypeExtendsResult.False; + if (!left.parameters.every((schema, index) => IntoBooleanResult(Visit(right.parameters[index], schema)) === TypeExtendsResult.True)) { + return TypeExtendsResult.False; + } + return IntoBooleanResult(Visit(left.returns, right.returns)); + } + // -------------------------------------------------------------------------- + // Date + // -------------------------------------------------------------------------- + function Date(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TDate(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Function + // -------------------------------------------------------------------------- + function Function(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (!TypeGuard.TFunction(right)) + return TypeExtendsResult.False; + if (left.parameters.length > right.parameters.length) + return TypeExtendsResult.False; + if (!left.parameters.every((schema, index) => IntoBooleanResult(Visit(right.parameters[index], schema)) === TypeExtendsResult.True)) { + return TypeExtendsResult.False; + } + return IntoBooleanResult(Visit(left.returns, right.returns)); + } + // -------------------------------------------------------------------------- + // Integer + // -------------------------------------------------------------------------- + function IntegerRight(left, right) { + if (TypeGuard.TLiteral(left) && typeof left.const === 'number') + return TypeExtendsResult.True; + return TypeGuard.TNumber(left) || TypeGuard.TInteger(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Integer(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TInteger(right) || TypeGuard.TNumber(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Intersect + // -------------------------------------------------------------------------- + function IntersectRight(left, right) { + return right.allOf.every((schema) => Visit(left, schema) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Intersect(left, right) { + return left.allOf.some((schema) => Visit(schema, right) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Literal + // -------------------------------------------------------------------------- + function IsLiteralString(schema) { + return typeof schema.const === 'string'; + } + function IsLiteralNumber(schema) { + return typeof schema.const === 'number'; + } + function IsLiteralBoolean(schema) { + return typeof schema.const === 'boolean'; + } + function Literal(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + if (TypeGuard.TString(right)) + return StringRight(left, right); + if (TypeGuard.TNumber(right)) + return NumberRight(left, right); + if (TypeGuard.TInteger(right)) + return IntegerRight(left, right); + if (TypeGuard.TBoolean(right)) + return BooleanRight(left, right); + return TypeGuard.TLiteral(right) && right.const === left.const ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Never + // -------------------------------------------------------------------------- + function NeverRight(left, right) { + return TypeExtendsResult.False; + } + function Never(left, right) { + return TypeExtendsResult.True; + } + // -------------------------------------------------------------------------- + // Null + // -------------------------------------------------------------------------- + function Null(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TNull(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Number + // -------------------------------------------------------------------------- + function NumberRight(left, right) { + if (TypeGuard.TLiteral(left) && IsLiteralNumber(left)) + return TypeExtendsResult.True; + return TypeGuard.TNumber(left) || TypeGuard.TInteger(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Number(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TInteger(right) || TypeGuard.TNumber(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Object + // -------------------------------------------------------------------------- + function IsObjectPropertyCount(schema, count) { + return globalThis.Object.keys(schema.properties).length === count; + } + function IsObjectStringLike(schema) { + return IsObjectArrayLike(schema); + } + function IsObjectSymbolLike(schema) { + // prettier-ignore + return IsObjectPropertyCount(schema, 0) || (IsObjectPropertyCount(schema, 1) && 'description' in schema.properties && TypeGuard.TUnion(schema.properties.description) && schema.properties.description.anyOf.length === 2 && ((TypeGuard.TString(schema.properties.description.anyOf[0]) && + TypeGuard.TUndefined(schema.properties.description.anyOf[1])) || (TypeGuard.TString(schema.properties.description.anyOf[1]) && + TypeGuard.TUndefined(schema.properties.description.anyOf[0])))); + } + function IsObjectNumberLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectBooleanLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectBigIntLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectDateLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectUint8ArrayLike(schema) { + return IsObjectArrayLike(schema); + } + function IsObjectFunctionLike(schema) { + const length = exports.Type.Number(); + return IsObjectPropertyCount(schema, 0) || (IsObjectPropertyCount(schema, 1) && 'length' in schema.properties && IntoBooleanResult(Visit(schema.properties['length'], length)) === TypeExtendsResult.True); + } + function IsObjectConstructorLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectArrayLike(schema) { + const length = exports.Type.Number(); + return IsObjectPropertyCount(schema, 0) || (IsObjectPropertyCount(schema, 1) && 'length' in schema.properties && IntoBooleanResult(Visit(schema.properties['length'], length)) === TypeExtendsResult.True); + } + function IsObjectPromiseLike(schema) { + const then = exports.Type.Function([exports.Type.Any()], exports.Type.Any()); + return IsObjectPropertyCount(schema, 0) || (IsObjectPropertyCount(schema, 1) && 'then' in schema.properties && IntoBooleanResult(Visit(schema.properties['then'], then)) === TypeExtendsResult.True); + } + // -------------------------------------------------------------------------- + // Property + // -------------------------------------------------------------------------- + function Property(left, right) { + if (Visit(left, right) === TypeExtendsResult.False) + return TypeExtendsResult.False; + if (TypeGuard.TOptional(left) && !TypeGuard.TOptional(right)) + return TypeExtendsResult.False; + return TypeExtendsResult.True; + } + function ObjectRight(left, right) { + if (TypeGuard.TUnknown(left)) + return TypeExtendsResult.False; + if (TypeGuard.TAny(left)) + return TypeExtendsResult.Union; + if (TypeGuard.TNever(left)) + return TypeExtendsResult.True; + if (TypeGuard.TLiteral(left) && IsLiteralString(left) && IsObjectStringLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TLiteral(left) && IsLiteralNumber(left) && IsObjectNumberLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TLiteral(left) && IsLiteralBoolean(left) && IsObjectBooleanLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TSymbol(left) && IsObjectSymbolLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TBigInt(left) && IsObjectBigIntLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TString(left) && IsObjectStringLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TSymbol(left) && IsObjectSymbolLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TNumber(left) && IsObjectNumberLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TInteger(left) && IsObjectNumberLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TBoolean(left) && IsObjectBooleanLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TUint8Array(left) && IsObjectUint8ArrayLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TDate(left) && IsObjectDateLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TConstructor(left) && IsObjectConstructorLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TFunction(left) && IsObjectFunctionLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TRecord(left) && TypeGuard.TString(RecordKey(left))) { + // When expressing a Record with literal key values, the Record is converted into a Object with + // the Hint assigned as `Record`. This is used to invert the extends logic. + return right[exports.Hint] === 'Record' ? TypeExtendsResult.True : TypeExtendsResult.False; + } + if (TypeGuard.TRecord(left) && TypeGuard.TNumber(RecordKey(left))) { + return IsObjectPropertyCount(right, 0) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + return TypeExtendsResult.False; + } + function Object(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + if (!TypeGuard.TObject(right)) + return TypeExtendsResult.False; + for (const key of globalThis.Object.keys(right.properties)) { + if (!(key in left.properties)) + return TypeExtendsResult.False; + if (Property(left.properties[key], right.properties[key]) === TypeExtendsResult.False) { + return TypeExtendsResult.False; + } + } + return TypeExtendsResult.True; + } + // -------------------------------------------------------------------------- + // Promise + // -------------------------------------------------------------------------- + function Promise(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right) && IsObjectPromiseLike(right)) + return TypeExtendsResult.True; + if (!TypeGuard.TPromise(right)) + return TypeExtendsResult.False; + return IntoBooleanResult(Visit(left.item, right.item)); + } + // -------------------------------------------------------------------------- + // Record + // -------------------------------------------------------------------------- + function RecordKey(schema) { + if (exports.PatternNumberExact in schema.patternProperties) + return exports.Type.Number(); + if (exports.PatternStringExact in schema.patternProperties) + return exports.Type.String(); + throw Error('TypeExtends: Cannot get record key'); + } + function RecordValue(schema) { + if (exports.PatternNumberExact in schema.patternProperties) + return schema.patternProperties[exports.PatternNumberExact]; + if (exports.PatternStringExact in schema.patternProperties) + return schema.patternProperties[exports.PatternStringExact]; + throw Error('TypeExtends: Cannot get record value'); + } + function RecordRight(left, right) { + const Key = RecordKey(right); + const Value = RecordValue(right); + if (TypeGuard.TLiteral(left) && IsLiteralString(left) && TypeGuard.TNumber(Key) && IntoBooleanResult(Visit(left, Value)) === TypeExtendsResult.True) + return TypeExtendsResult.True; + if (TypeGuard.TUint8Array(left) && TypeGuard.TNumber(Key)) + return Visit(left, Value); + if (TypeGuard.TString(left) && TypeGuard.TNumber(Key)) + return Visit(left, Value); + if (TypeGuard.TArray(left) && TypeGuard.TNumber(Key)) + return Visit(left, Value); + if (TypeGuard.TObject(left)) { + for (const key of globalThis.Object.keys(left.properties)) { + if (Property(Value, left.properties[key]) === TypeExtendsResult.False) { + return TypeExtendsResult.False; + } + } + return TypeExtendsResult.True; + } + return TypeExtendsResult.False; + } + function Record(left, right) { + const Value = RecordValue(left); + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (!TypeGuard.TRecord(right)) + return TypeExtendsResult.False; + return Visit(Value, RecordValue(right)); + } + // -------------------------------------------------------------------------- + // String + // -------------------------------------------------------------------------- + function StringRight(left, right) { + if (TypeGuard.TLiteral(left) && typeof left.const === 'string') + return TypeExtendsResult.True; + return TypeGuard.TString(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function String(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TString(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Symbol + // -------------------------------------------------------------------------- + function Symbol(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TSymbol(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Tuple + // -------------------------------------------------------------------------- + function TupleRight(left, right) { + if (TypeGuard.TUnknown(left)) + return TypeExtendsResult.False; + if (TypeGuard.TAny(left)) + return TypeExtendsResult.Union; + if (TypeGuard.TNever(left)) + return TypeExtendsResult.True; + return TypeExtendsResult.False; + } + function IsArrayOfTuple(left, right) { + return TypeGuard.TArray(right) && left.items !== undefined && left.items.every((schema) => Visit(schema, right.items) === TypeExtendsResult.True); + } + function Tuple(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right) && IsObjectArrayLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TArray(right) && IsArrayOfTuple(left, right)) + return TypeExtendsResult.True; + if (!TypeGuard.TTuple(right)) + return TypeExtendsResult.False; + if ((left.items === undefined && right.items !== undefined) || (left.items !== undefined && right.items === undefined)) + return TypeExtendsResult.False; + if (left.items === undefined && right.items === undefined) + return TypeExtendsResult.True; + return left.items.every((schema, index) => Visit(schema, right.items[index]) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Uint8Array + // -------------------------------------------------------------------------- + function Uint8Array(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TUint8Array(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Undefined + // -------------------------------------------------------------------------- + function Undefined(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + if (TypeGuard.TVoid(right)) + return VoidRight(left, right); + return TypeGuard.TUndefined(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Union + // -------------------------------------------------------------------------- + function UnionRight(left, right) { + return right.anyOf.some((schema) => Visit(left, schema) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Union(left, right) { + return left.anyOf.every((schema) => Visit(schema, right) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Unknown + // -------------------------------------------------------------------------- + function UnknownRight(left, right) { + return TypeExtendsResult.True; + } + function Unknown(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TString(right)) + return StringRight(left, right); + if (TypeGuard.TNumber(right)) + return NumberRight(left, right); + if (TypeGuard.TInteger(right)) + return IntegerRight(left, right); + if (TypeGuard.TBoolean(right)) + return BooleanRight(left, right); + if (TypeGuard.TArray(right)) + return ArrayRight(left, right); + if (TypeGuard.TTuple(right)) + return TupleRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + return TypeGuard.TUnknown(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Void + // -------------------------------------------------------------------------- + function VoidRight(left, right) { + if (TypeGuard.TUndefined(left)) + return TypeExtendsResult.True; + return TypeGuard.TUndefined(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Void(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + return TypeGuard.TVoid(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Visit(left, right) { + // template union remap + if (TypeGuard.TTemplateLiteral(left)) + return Visit(TemplateLiteralResolver.Resolve(left), right); + if (TypeGuard.TTemplateLiteral(right)) + return Visit(left, TemplateLiteralResolver.Resolve(right)); + // standard extends + if (TypeGuard.TAny(left)) + return Any(left, right); + if (TypeGuard.TArray(left)) + return Array(left, right); + if (TypeGuard.TBigInt(left)) + return BigInt(left, right); + if (TypeGuard.TBoolean(left)) + return Boolean(left, right); + if (TypeGuard.TConstructor(left)) + return Constructor(left, right); + if (TypeGuard.TDate(left)) + return Date(left, right); + if (TypeGuard.TFunction(left)) + return Function(left, right); + if (TypeGuard.TInteger(left)) + return Integer(left, right); + if (TypeGuard.TIntersect(left)) + return Intersect(left, right); + if (TypeGuard.TLiteral(left)) + return Literal(left, right); + if (TypeGuard.TNever(left)) + return Never(left, right); + if (TypeGuard.TNull(left)) + return Null(left, right); + if (TypeGuard.TNumber(left)) + return Number(left, right); + if (TypeGuard.TObject(left)) + return Object(left, right); + if (TypeGuard.TRecord(left)) + return Record(left, right); + if (TypeGuard.TString(left)) + return String(left, right); + if (TypeGuard.TSymbol(left)) + return Symbol(left, right); + if (TypeGuard.TTuple(left)) + return Tuple(left, right); + if (TypeGuard.TPromise(left)) + return Promise(left, right); + if (TypeGuard.TUint8Array(left)) + return Uint8Array(left, right); + if (TypeGuard.TUndefined(left)) + return Undefined(left, right); + if (TypeGuard.TUnion(left)) + return Union(left, right); + if (TypeGuard.TUnknown(left)) + return Unknown(left, right); + if (TypeGuard.TVoid(left)) + return Void(left, right); + throw Error(`TypeExtends: Unknown left type operand '${left[exports.Kind]}'`); + } + function Extends(left, right) { + return Visit(left, right); + } + TypeExtends.Extends = Extends; +})(TypeExtends = exports.TypeExtends || (exports.TypeExtends = {})); +// -------------------------------------------------------------------------- +// TypeClone +// -------------------------------------------------------------------------- +/** Specialized Clone for Types */ +var TypeClone; +(function (TypeClone) { + function IsObject(value) { + return typeof value === 'object' && value !== null; + } + function IsArray(value) { + return globalThis.Array.isArray(value); + } + function Array(value) { + return value.map((value) => Visit(value)); + } + function Object(value) { + const clonedProperties = globalThis.Object.getOwnPropertyNames(value).reduce((acc, key) => { + return { ...acc, [key]: Visit(value[key]) }; + }, {}); + const clonedSymbols = globalThis.Object.getOwnPropertySymbols(value).reduce((acc, key) => { + return { ...acc, [key]: Visit(value[key]) }; + }, {}); + return { ...clonedProperties, ...clonedSymbols }; + } + function Visit(value) { + if (IsArray(value)) + return Array(value); + if (IsObject(value)) + return Object(value); + return value; + } + /** Clones a type. */ + function Clone(schema, options) { + return { ...Visit(schema), ...options }; + } + TypeClone.Clone = Clone; +})(TypeClone = exports.TypeClone || (exports.TypeClone = {})); +// -------------------------------------------------------------------------- +// ObjectMap +// -------------------------------------------------------------------------- +var ObjectMap; +(function (ObjectMap) { + function Intersect(schema, callback) { + // prettier-ignore + return exports.Type.Intersect(schema.allOf.map((inner) => Visit(inner, callback)), { ...schema }); + } + function Union(schema, callback) { + // prettier-ignore + return exports.Type.Union(schema.anyOf.map((inner) => Visit(inner, callback)), { ...schema }); + } + function Object(schema, callback) { + return callback(schema); + } + function Visit(schema, callback) { + // There are cases where users need to map objects with unregistered kinds. Using a TypeGuard here would + // prevent sub schema mapping as unregistered kinds will not pass TSchema checks. This is notable in the + // case of TObject where unregistered property kinds cause the TObject check to fail. As mapping is only + // used for composition, we use explicit checks instead. + if (schema[exports.Kind] === 'Intersect') + return Intersect(schema, callback); + if (schema[exports.Kind] === 'Union') + return Union(schema, callback); + if (schema[exports.Kind] === 'Object') + return Object(schema, callback); + return schema; + } + function Map(schema, callback, options) { + return { ...Visit(TypeClone.Clone(schema, {}), callback), ...options }; + } + ObjectMap.Map = Map; +})(ObjectMap = exports.ObjectMap || (exports.ObjectMap = {})); +// -------------------------------------------------------------------------- +// KeyResolver +// -------------------------------------------------------------------------- +var KeyResolver; +(function (KeyResolver) { + function IsKeyable(schema) { + return TypeGuard.TIntersect(schema) || TypeGuard.TUnion(schema) || (TypeGuard.TObject(schema) && globalThis.Object.getOwnPropertyNames(schema.properties).length > 0); + } + function Intersect(schema) { + return [...schema.allOf.filter((schema) => IsKeyable(schema)).reduce((set, schema) => Visit(schema).map((key) => set.add(key))[0], new Set())]; + } + function Union(schema) { + const sets = schema.anyOf.filter((schema) => IsKeyable(schema)).map((inner) => Visit(inner)); + return [...sets.reduce((set, outer) => outer.map((key) => (sets.every((inner) => inner.includes(key)) ? set.add(key) : set))[0], new Set())]; + } + function Object(schema) { + return globalThis.Object.keys(schema.properties); + } + function Visit(schema) { + if (TypeGuard.TIntersect(schema)) + return Intersect(schema); + if (TypeGuard.TUnion(schema)) + return Union(schema); + if (TypeGuard.TObject(schema)) + return Object(schema); + return []; + } + function Resolve(schema) { + return Visit(schema); + } + KeyResolver.Resolve = Resolve; +})(KeyResolver = exports.KeyResolver || (exports.KeyResolver = {})); +// -------------------------------------------------------------------------- +// TemplateLiteralPattern +// -------------------------------------------------------------------------- +var TemplateLiteralPattern; +(function (TemplateLiteralPattern) { + function Escape(value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + function Visit(schema, acc) { + if (TypeGuard.TTemplateLiteral(schema)) { + const pattern = schema.pattern.slice(1, schema.pattern.length - 1); + return pattern; + } + else if (TypeGuard.TUnion(schema)) { + const tokens = schema.anyOf.map((schema) => Visit(schema, acc)).join('|'); + return `(${tokens})`; + } + else if (TypeGuard.TNumber(schema)) { + return `${acc}${exports.PatternNumber}`; + } + else if (TypeGuard.TInteger(schema)) { + return `${acc}${exports.PatternNumber}`; + } + else if (TypeGuard.TBigInt(schema)) { + return `${acc}${exports.PatternNumber}`; + } + else if (TypeGuard.TString(schema)) { + return `${acc}${exports.PatternString}`; + } + else if (TypeGuard.TLiteral(schema)) { + return `${acc}${Escape(schema.const.toString())}`; + } + else if (TypeGuard.TBoolean(schema)) { + return `${acc}${exports.PatternBoolean}`; + } + else if (TypeGuard.TNever(schema)) { + throw Error('TemplateLiteralPattern: TemplateLiteral cannot operate on types of TNever'); + } + else { + throw Error(`TemplateLiteralPattern: Unexpected Kind '${schema[exports.Kind]}'`); + } + } + function Create(kinds) { + return `^${kinds.map((schema) => Visit(schema, '')).join('')}\$`; + } + TemplateLiteralPattern.Create = Create; +})(TemplateLiteralPattern = exports.TemplateLiteralPattern || (exports.TemplateLiteralPattern = {})); +// -------------------------------------------------------------------------------------- +// TemplateLiteralResolver +// -------------------------------------------------------------------------------------- +var TemplateLiteralResolver; +(function (TemplateLiteralResolver) { + function Resolve(template) { + const expression = TemplateLiteralParser.ParseExact(template.pattern); + if (!TemplateLiteralFinite.Check(expression)) + return exports.Type.String(); + const literals = [...TemplateLiteralGenerator.Generate(expression)].map((value) => exports.Type.Literal(value)); + return exports.Type.Union(literals); + } + TemplateLiteralResolver.Resolve = Resolve; +})(TemplateLiteralResolver = exports.TemplateLiteralResolver || (exports.TemplateLiteralResolver = {})); +// -------------------------------------------------------------------------------------- +// TemplateLiteralParser +// -------------------------------------------------------------------------------------- +class TemplateLiteralParserError extends Error { + constructor(message) { + super(message); + } +} +exports.TemplateLiteralParserError = TemplateLiteralParserError; +var TemplateLiteralParser; +(function (TemplateLiteralParser) { + function IsNonEscaped(pattern, index, char) { + return pattern[index] === char && pattern.charCodeAt(index - 1) !== 92; + } + function IsOpenParen(pattern, index) { + return IsNonEscaped(pattern, index, '('); + } + function IsCloseParen(pattern, index) { + return IsNonEscaped(pattern, index, ')'); + } + function IsSeparator(pattern, index) { + return IsNonEscaped(pattern, index, '|'); + } + function IsGroup(pattern) { + if (!(IsOpenParen(pattern, 0) && IsCloseParen(pattern, pattern.length - 1))) + return false; + let count = 0; + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) + count += 1; + if (IsCloseParen(pattern, index)) + count -= 1; + if (count === 0 && index !== pattern.length - 1) + return false; + } + return true; + } + function InGroup(pattern) { + return pattern.slice(1, pattern.length - 1); + } + function IsPrecedenceOr(pattern) { + let count = 0; + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) + count += 1; + if (IsCloseParen(pattern, index)) + count -= 1; + if (IsSeparator(pattern, index) && count === 0) + return true; + } + return false; + } + function IsPrecedenceAnd(pattern) { + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) + return true; + } + return false; + } + function Or(pattern) { + let [count, start] = [0, 0]; + const expressions = []; + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) + count += 1; + if (IsCloseParen(pattern, index)) + count -= 1; + if (IsSeparator(pattern, index) && count === 0) { + const range = pattern.slice(start, index); + if (range.length > 0) + expressions.push(Parse(range)); + start = index + 1; + } + } + const range = pattern.slice(start); + if (range.length > 0) + expressions.push(Parse(range)); + if (expressions.length === 0) + return { type: 'const', const: '' }; + if (expressions.length === 1) + return expressions[0]; + return { type: 'or', expr: expressions }; + } + function And(pattern) { + function Group(value, index) { + if (!IsOpenParen(value, index)) + throw new TemplateLiteralParserError(`TemplateLiteralParser: Index must point to open parens`); + let count = 0; + for (let scan = index; scan < value.length; scan++) { + if (IsOpenParen(value, scan)) + count += 1; + if (IsCloseParen(value, scan)) + count -= 1; + if (count === 0) + return [index, scan]; + } + throw new TemplateLiteralParserError(`TemplateLiteralParser: Unclosed group parens in expression`); + } + function Range(pattern, index) { + for (let scan = index; scan < pattern.length; scan++) { + if (IsOpenParen(pattern, scan)) + return [index, scan]; + } + return [index, pattern.length]; + } + const expressions = []; + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) { + const [start, end] = Group(pattern, index); + const range = pattern.slice(start, end + 1); + expressions.push(Parse(range)); + index = end; + } + else { + const [start, end] = Range(pattern, index); + const range = pattern.slice(start, end); + if (range.length > 0) + expressions.push(Parse(range)); + index = end - 1; + } + } + if (expressions.length === 0) + return { type: 'const', const: '' }; + if (expressions.length === 1) + return expressions[0]; + return { type: 'and', expr: expressions }; + } + /** Parses a pattern and returns an expression tree */ + function Parse(pattern) { + if (IsGroup(pattern)) + return Parse(InGroup(pattern)); + if (IsPrecedenceOr(pattern)) + return Or(pattern); + if (IsPrecedenceAnd(pattern)) + return And(pattern); + return { type: 'const', const: pattern }; + } + TemplateLiteralParser.Parse = Parse; + /** Parses a pattern and strips forward and trailing ^ and $ */ + function ParseExact(pattern) { + return Parse(pattern.slice(1, pattern.length - 1)); + } + TemplateLiteralParser.ParseExact = ParseExact; +})(TemplateLiteralParser = exports.TemplateLiteralParser || (exports.TemplateLiteralParser = {})); +// -------------------------------------------------------------------------------------- +// TemplateLiteralFinite +// -------------------------------------------------------------------------------------- +var TemplateLiteralFinite; +(function (TemplateLiteralFinite) { + function IsNumber(expression) { + // prettier-ignore + return (expression.type === 'or' && + expression.expr.length === 2 && + expression.expr[0].type === 'const' && + expression.expr[0].const === '0' && + expression.expr[1].type === 'const' && + expression.expr[1].const === '[1-9][0-9]*'); + } + function IsBoolean(expression) { + // prettier-ignore + return (expression.type === 'or' && + expression.expr.length === 2 && + expression.expr[0].type === 'const' && + expression.expr[0].const === 'true' && + expression.expr[1].type === 'const' && + expression.expr[1].const === 'false'); + } + function IsString(expression) { + return expression.type === 'const' && expression.const === '.*'; + } + function Check(expression) { + if (IsBoolean(expression)) + return true; + if (IsNumber(expression) || IsString(expression)) + return false; + if (expression.type === 'and') + return expression.expr.every((expr) => Check(expr)); + if (expression.type === 'or') + return expression.expr.every((expr) => Check(expr)); + if (expression.type === 'const') + return true; + throw Error(`TemplateLiteralFinite: Unknown expression type`); + } + TemplateLiteralFinite.Check = Check; +})(TemplateLiteralFinite = exports.TemplateLiteralFinite || (exports.TemplateLiteralFinite = {})); +// -------------------------------------------------------------------------------------- +// TemplateLiteralGenerator +// -------------------------------------------------------------------------------------- +var TemplateLiteralGenerator; +(function (TemplateLiteralGenerator) { + function* Reduce(buffer) { + if (buffer.length === 1) + return yield* buffer[0]; + for (const left of buffer[0]) { + for (const right of Reduce(buffer.slice(1))) { + yield `${left}${right}`; + } + } + } + function* And(expression) { + return yield* Reduce(expression.expr.map((expr) => [...Generate(expr)])); + } + function* Or(expression) { + for (const expr of expression.expr) + yield* Generate(expr); + } + function* Const(expression) { + return yield expression.const; + } + function* Generate(expression) { + if (expression.type === 'and') + return yield* And(expression); + if (expression.type === 'or') + return yield* Or(expression); + if (expression.type === 'const') + return yield* Const(expression); + throw Error('TemplateLiteralGenerator: Unknown expression'); + } + TemplateLiteralGenerator.Generate = Generate; +})(TemplateLiteralGenerator = exports.TemplateLiteralGenerator || (exports.TemplateLiteralGenerator = {})); +// -------------------------------------------------------------------------- +// TypeOrdinal: Used for auto $id generation +// -------------------------------------------------------------------------- +let TypeOrdinal = 0; +// -------------------------------------------------------------------------- +// TypeBuilder +// -------------------------------------------------------------------------- +class TypeBuilder { + /** `[Utility]` Creates a schema without `static` and `params` types */ + Create(schema) { + return schema; + } + /** `[Standard]` Omits compositing symbols from this schema */ + Strict(schema) { + return JSON.parse(JSON.stringify(schema)); + } +} +exports.TypeBuilder = TypeBuilder; +// -------------------------------------------------------------------------- +// StandardTypeBuilder +// -------------------------------------------------------------------------- +class StandardTypeBuilder extends TypeBuilder { + // ------------------------------------------------------------------------ + // Modifiers + // ------------------------------------------------------------------------ + /** `[Modifier]` Creates a Optional property */ + Optional(schema) { + return { [exports.Modifier]: 'Optional', ...TypeClone.Clone(schema, {}) }; + } + /** `[Modifier]` Creates a ReadonlyOptional property */ + ReadonlyOptional(schema) { + return { [exports.Modifier]: 'ReadonlyOptional', ...TypeClone.Clone(schema, {}) }; + } + /** `[Modifier]` Creates a Readonly object or property */ + Readonly(schema) { + return { [exports.Modifier]: 'Readonly', ...schema }; + } + // ------------------------------------------------------------------------ + // Types + // ------------------------------------------------------------------------ + /** `[Standard]` Creates an Any type */ + Any(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Any' }); + } + /** `[Standard]` Creates an Array type */ + Array(items, options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Array', type: 'array', items: TypeClone.Clone(items, {}) }); + } + /** `[Standard]` Creates a Boolean type */ + Boolean(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Boolean', type: 'boolean' }); + } + /** `[Standard]` Creates a Composite object type. */ + Composite(objects, options) { + const isOptionalAll = (objects, key) => objects.every((object) => !(key in object.properties) || IsOptional(object.properties[key])); + const IsOptional = (schema) => TypeGuard.TOptional(schema) || TypeGuard.TReadonlyOptional(schema); + const [required, optional] = [new Set(), new Set()]; + for (const object of objects) { + for (const key of globalThis.Object.getOwnPropertyNames(object.properties)) { + if (isOptionalAll(objects, key)) + optional.add(key); + } + } + for (const object of objects) { + for (const key of globalThis.Object.getOwnPropertyNames(object.properties)) { + if (!optional.has(key)) + required.add(key); + } + } + const properties = {}; + for (const object of objects) { + for (const [key, schema] of Object.entries(object.properties)) { + const property = TypeClone.Clone(schema, {}); + if (!optional.has(key)) + delete property[exports.Modifier]; + if (key in properties) { + const left = TypeExtends.Extends(properties[key], property) !== TypeExtendsResult.False; + const right = TypeExtends.Extends(property, properties[key]) !== TypeExtendsResult.False; + if (!left && !right) + properties[key] = exports.Type.Never(); + if (!left && right) + properties[key] = property; + } + else { + properties[key] = property; + } + } + } + if (required.size > 0) { + return this.Create({ ...options, [exports.Kind]: 'Object', [exports.Hint]: 'Composite', type: 'object', properties, required: [...required] }); + } + else { + return this.Create({ ...options, [exports.Kind]: 'Object', [exports.Hint]: 'Composite', type: 'object', properties }); + } + } + /** `[Standard]` Creates a Enum type */ + Enum(item, options = {}) { + // prettier-ignore + const values = globalThis.Object.keys(item).filter((key) => isNaN(key)).map((key) => item[key]); + const anyOf = values.map((value) => (typeof value === 'string' ? { [exports.Kind]: 'Literal', type: 'string', const: value } : { [exports.Kind]: 'Literal', type: 'number', const: value })); + return this.Create({ ...options, [exports.Kind]: 'Union', anyOf }); + } + /** `[Standard]` A conditional type expression that will return the true type if the left type extends the right */ + Extends(left, right, trueType, falseType, options = {}) { + switch (TypeExtends.Extends(left, right)) { + case TypeExtendsResult.Union: + return this.Union([TypeClone.Clone(trueType, options), TypeClone.Clone(falseType, options)]); + case TypeExtendsResult.True: + return TypeClone.Clone(trueType, options); + case TypeExtendsResult.False: + return TypeClone.Clone(falseType, options); + } + } + /** `[Standard]` Excludes from the left type any type that is not assignable to the right */ + Exclude(left, right, options = {}) { + if (TypeGuard.TTemplateLiteral(left)) + return this.Exclude(TemplateLiteralResolver.Resolve(left), right, options); + if (TypeGuard.TTemplateLiteral(right)) + return this.Exclude(left, TemplateLiteralResolver.Resolve(right), options); + if (TypeGuard.TUnion(left)) { + const narrowed = left.anyOf.filter((inner) => TypeExtends.Extends(inner, right) === TypeExtendsResult.False); + return (narrowed.length === 1 ? TypeClone.Clone(narrowed[0], options) : this.Union(narrowed, options)); + } + else { + return (TypeExtends.Extends(left, right) !== TypeExtendsResult.False ? this.Never(options) : TypeClone.Clone(left, options)); + } + } + /** `[Standard]` Extracts from the left type any type that is assignable to the right */ + Extract(left, right, options = {}) { + if (TypeGuard.TTemplateLiteral(left)) + return this.Extract(TemplateLiteralResolver.Resolve(left), right, options); + if (TypeGuard.TTemplateLiteral(right)) + return this.Extract(left, TemplateLiteralResolver.Resolve(right), options); + if (TypeGuard.TUnion(left)) { + const narrowed = left.anyOf.filter((inner) => TypeExtends.Extends(inner, right) !== TypeExtendsResult.False); + return (narrowed.length === 1 ? TypeClone.Clone(narrowed[0], options) : this.Union(narrowed, options)); + } + else { + return (TypeExtends.Extends(left, right) !== TypeExtendsResult.False ? TypeClone.Clone(left, options) : this.Never(options)); + } + } + /** `[Standard]` Creates an Integer type */ + Integer(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Integer', type: 'integer' }); + } + Intersect(allOf, options = {}) { + if (allOf.length === 0) + return exports.Type.Never(); + if (allOf.length === 1) + return TypeClone.Clone(allOf[0], options); + const objects = allOf.every((schema) => TypeGuard.TObject(schema)); + const cloned = allOf.map((schema) => TypeClone.Clone(schema, {})); + const clonedUnevaluatedProperties = TypeGuard.TSchema(options.unevaluatedProperties) ? { unevaluatedProperties: TypeClone.Clone(options.unevaluatedProperties, {}) } : {}; + if (options.unevaluatedProperties === false || TypeGuard.TSchema(options.unevaluatedProperties) || objects) { + return this.Create({ ...options, ...clonedUnevaluatedProperties, [exports.Kind]: 'Intersect', type: 'object', allOf: cloned }); + } + else { + return this.Create({ ...options, ...clonedUnevaluatedProperties, [exports.Kind]: 'Intersect', allOf: cloned }); + } + } + /** `[Standard]` Creates a KeyOf type */ + KeyOf(schema, options = {}) { + if (TypeGuard.TRecord(schema)) { + const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0]; + if (pattern === exports.PatternNumberExact) + return this.Number(options); + if (pattern === exports.PatternStringExact) + return this.String(options); + throw Error('StandardTypeBuilder: Unable to resolve key type from Record key pattern'); + } + else { + const resolved = KeyResolver.Resolve(schema); + if (resolved.length === 0) + return this.Never(options); + const literals = resolved.map((key) => this.Literal(key)); + return this.Union(literals, options); + } + } + /** `[Standard]` Creates a Literal type */ + Literal(value, options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Literal', const: value, type: typeof value }); + } + /** `[Standard]` Creates a Never type */ + Never(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Never', not: {} }); + } + /** `[Standard]` Creates a Not type. The first argument is the disallowed type, the second is the allowed. */ + Not(not, schema, options) { + return this.Create({ ...options, [exports.Kind]: 'Not', allOf: [{ not: TypeClone.Clone(not, {}) }, TypeClone.Clone(schema, {})] }); + } + /** `[Standard]` Creates a Null type */ + Null(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Null', type: 'null' }); + } + /** `[Standard]` Creates a Number type */ + Number(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Number', type: 'number' }); + } + /** `[Standard]` Creates an Object type */ + Object(properties, options = {}) { + const propertyKeys = globalThis.Object.getOwnPropertyNames(properties); + const optionalKeys = propertyKeys.filter((key) => TypeGuard.TOptional(properties[key]) || TypeGuard.TReadonlyOptional(properties[key])); + const requiredKeys = propertyKeys.filter((name) => !optionalKeys.includes(name)); + const clonedAdditionalProperties = TypeGuard.TSchema(options.additionalProperties) ? { additionalProperties: TypeClone.Clone(options.additionalProperties, {}) } : {}; + const clonedProperties = propertyKeys.reduce((acc, key) => ({ ...acc, [key]: TypeClone.Clone(properties[key], {}) }), {}); + if (requiredKeys.length > 0) { + return this.Create({ ...options, ...clonedAdditionalProperties, [exports.Kind]: 'Object', type: 'object', properties: clonedProperties, required: requiredKeys }); + } + else { + return this.Create({ ...options, ...clonedAdditionalProperties, [exports.Kind]: 'Object', type: 'object', properties: clonedProperties }); + } + } + Omit(schema, unresolved, options = {}) { + // prettier-ignore + const keys = TypeGuard.TUnionLiteral(unresolved) ? unresolved.anyOf.map((schema) => schema.const) : + TypeGuard.TLiteral(unresolved) ? [unresolved.const] : + TypeGuard.TNever(unresolved) ? [] : + unresolved; + // prettier-ignore + return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => { + if (schema.required) { + schema.required = schema.required.filter((key) => !keys.includes(key)); + if (schema.required.length === 0) + delete schema.required; + } + for (const key of globalThis.Object.keys(schema.properties)) { + if (keys.includes(key)) + delete schema.properties[key]; + } + return this.Create(schema); + }, options); + } + /** `[Standard]` Creates a mapped type where all properties are Optional */ + Partial(schema, options = {}) { + function Apply(schema) { + // prettier-ignore + switch (schema[exports.Modifier]) { + case 'ReadonlyOptional': + schema[exports.Modifier] = 'ReadonlyOptional'; + break; + case 'Readonly': + schema[exports.Modifier] = 'ReadonlyOptional'; + break; + case 'Optional': + schema[exports.Modifier] = 'Optional'; + break; + default: + schema[exports.Modifier] = 'Optional'; + break; + } + } + // prettier-ignore + return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => { + delete schema.required; + globalThis.Object.keys(schema.properties).forEach(key => Apply(schema.properties[key])); + return schema; + }, options); + } + Pick(schema, unresolved, options = {}) { + // prettier-ignore + const keys = TypeGuard.TUnionLiteral(unresolved) ? unresolved.anyOf.map((schema) => schema.const) : + TypeGuard.TLiteral(unresolved) ? [unresolved.const] : + TypeGuard.TNever(unresolved) ? [] : + unresolved; + // prettier-ignore + return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => { + if (schema.required) { + schema.required = schema.required.filter((key) => keys.includes(key)); + if (schema.required.length === 0) + delete schema.required; + } + for (const key of globalThis.Object.keys(schema.properties)) { + if (!keys.includes(key)) + delete schema.properties[key]; + } + return this.Create(schema); + }, options); + } + /** `[Standard]` Creates a Record type */ + Record(key, schema, options = {}) { + if (TypeGuard.TTemplateLiteral(key)) { + const expression = TemplateLiteralParser.ParseExact(key.pattern); + // prettier-ignore + return TemplateLiteralFinite.Check(expression) + ? (this.Object([...TemplateLiteralGenerator.Generate(expression)].reduce((acc, key) => ({ ...acc, [key]: TypeClone.Clone(schema, {}) }), {}), options)) + : this.Create({ ...options, [exports.Kind]: 'Record', type: 'object', patternProperties: { [key.pattern]: TypeClone.Clone(schema, {}) }, additionalProperties: false }); + } + else if (TypeGuard.TUnionLiteral(key)) { + if (key.anyOf.every((schema) => TypeGuard.TLiteral(schema) && (typeof schema.const === 'string' || typeof schema.const === 'number'))) { + const properties = key.anyOf.reduce((acc, literal) => ({ ...acc, [literal.const]: TypeClone.Clone(schema, {}) }), {}); + return this.Object(properties, { ...options, [exports.Hint]: 'Record' }); + } + else + throw Error('TypeBuilder: Record key can only be derived from union literal of number or string'); + } + else if (TypeGuard.TLiteral(key)) { + if (typeof key.const === 'string' || typeof key.const === 'number') { + return this.Object({ [key.const]: TypeClone.Clone(schema, {}) }, options); + } + else + throw Error('TypeBuilder: Record key can only be derived from literals of number or string'); + } + else if (TypeGuard.TInteger(key) || TypeGuard.TNumber(key)) { + const pattern = exports.PatternNumberExact; + return this.Create({ ...options, [exports.Kind]: 'Record', type: 'object', patternProperties: { [pattern]: TypeClone.Clone(schema, {}) }, additionalProperties: false }); + } + else if (TypeGuard.TString(key)) { + const pattern = key.pattern === undefined ? exports.PatternStringExact : key.pattern; + return this.Create({ ...options, [exports.Kind]: 'Record', type: 'object', patternProperties: { [pattern]: TypeClone.Clone(schema, {}) }, additionalProperties: false }); + } + else { + throw Error(`StandardTypeBuilder: Invalid Record Key`); + } + } + /** `[Standard]` Creates a Recursive type */ + Recursive(callback, options = {}) { + if (options.$id === undefined) + options.$id = `T${TypeOrdinal++}`; + const thisType = callback({ [exports.Kind]: 'This', $ref: `${options.$id}` }); + thisType.$id = options.$id; + return this.Create({ ...options, [exports.Hint]: 'Recursive', ...thisType }); + } + /** `[Standard]` Creates a Ref type. The referenced type must contain a $id */ + Ref(schema, options = {}) { + if (schema.$id === undefined) + throw Error('StandardTypeBuilder.Ref: Target type must specify an $id'); + return this.Create({ ...options, [exports.Kind]: 'Ref', $ref: schema.$id }); + } + /** `[Standard]` Creates a mapped type where all properties are Required */ + Required(schema, options = {}) { + function Apply(schema) { + // prettier-ignore + switch (schema[exports.Modifier]) { + case 'ReadonlyOptional': + schema[exports.Modifier] = 'Readonly'; + break; + case 'Readonly': + schema[exports.Modifier] = 'Readonly'; + break; + case 'Optional': + delete schema[exports.Modifier]; + break; + default: + delete schema[exports.Modifier]; + break; + } + } + // prettier-ignore + return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => { + schema.required = globalThis.Object.keys(schema.properties); + globalThis.Object.keys(schema.properties).forEach(key => Apply(schema.properties[key])); + return schema; + }, options); + } + /** `[Standard]` Creates a String type */ + String(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'String', type: 'string' }); + } + /** `[Standard]` Creates a template literal type */ + TemplateLiteral(kinds, options = {}) { + const pattern = TemplateLiteralPattern.Create(kinds); + return this.Create({ ...options, [exports.Kind]: 'TemplateLiteral', type: 'string', pattern }); + } + /** `[Standard]` Creates a Tuple type */ + Tuple(items, options = {}) { + const [additionalItems, minItems, maxItems] = [false, items.length, items.length]; + const clonedItems = items.map((item) => TypeClone.Clone(item, {})); + // prettier-ignore + const schema = (items.length > 0 ? + { ...options, [exports.Kind]: 'Tuple', type: 'array', items: clonedItems, additionalItems, minItems, maxItems } : + { ...options, [exports.Kind]: 'Tuple', type: 'array', minItems, maxItems }); + return this.Create(schema); + } + Union(union, options = {}) { + if (TypeGuard.TTemplateLiteral(union)) { + return TemplateLiteralResolver.Resolve(union); + } + else { + const anyOf = union; + if (anyOf.length === 0) + return this.Never(options); + if (anyOf.length === 1) + return this.Create(TypeClone.Clone(anyOf[0], options)); + const clonedAnyOf = anyOf.map((schema) => TypeClone.Clone(schema, {})); + return this.Create({ ...options, [exports.Kind]: 'Union', anyOf: clonedAnyOf }); + } + } + /** `[Standard]` Creates an Unknown type */ + Unknown(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Unknown' }); + } + /** `[Standard]` Creates a Unsafe type that infers for the generic argument */ + Unsafe(options = {}) { + return this.Create({ ...options, [exports.Kind]: options[exports.Kind] || 'Unsafe' }); + } +} +exports.StandardTypeBuilder = StandardTypeBuilder; +// -------------------------------------------------------------------------- +// ExtendedTypeBuilder +// -------------------------------------------------------------------------- +class ExtendedTypeBuilder extends StandardTypeBuilder { + /** `[Extended]` Creates a BigInt type */ + BigInt(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'BigInt', type: 'null', typeOf: 'BigInt' }); + } + /** `[Extended]` Extracts the ConstructorParameters from the given Constructor type */ + ConstructorParameters(schema, options = {}) { + return this.Tuple([...schema.parameters], { ...options }); + } + Constructor(parameters, returns, options = {}) { + const clonedReturns = TypeClone.Clone(returns, {}); + if (TypeGuard.TTuple(parameters)) { + const clonedParameters = parameters.items === undefined ? [] : parameters.items.map((parameter) => TypeClone.Clone(parameter, {})); + return this.Create({ ...options, [exports.Kind]: 'Constructor', type: 'object', instanceOf: 'Constructor', parameters: clonedParameters, returns: clonedReturns }); + } + else if (globalThis.Array.isArray(parameters)) { + const clonedParameters = parameters.map((parameter) => TypeClone.Clone(parameter, {})); + return this.Create({ ...options, [exports.Kind]: 'Constructor', type: 'object', instanceOf: 'Constructor', parameters: clonedParameters, returns: clonedReturns }); + } + else { + throw new Error('ExtendedTypeBuilder.Constructor: Invalid parameters'); + } + } + /** `[Extended]` Creates a Date type */ + Date(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Date', type: 'object', instanceOf: 'Date' }); + } + Function(parameters, returns, options = {}) { + const clonedReturns = TypeClone.Clone(returns, {}); + if (TypeGuard.TTuple(parameters)) { + const clonedParameters = parameters.items === undefined ? [] : parameters.items.map((parameter) => TypeClone.Clone(parameter, {})); + return this.Create({ ...options, [exports.Kind]: 'Function', type: 'object', instanceOf: 'Function', parameters: clonedParameters, returns: clonedReturns }); + } + else if (globalThis.Array.isArray(parameters)) { + const clonedParameters = parameters.map((parameter) => TypeClone.Clone(parameter, {})); + return this.Create({ ...options, [exports.Kind]: 'Function', type: 'object', instanceOf: 'Function', parameters: clonedParameters, returns: clonedReturns }); + } + else { + throw new Error('ExtendedTypeBuilder.Function: Invalid parameters'); + } + } + /** `[Extended]` Extracts the InstanceType from the given Constructor */ + InstanceType(schema, options = {}) { + return TypeClone.Clone(schema.returns, options); + } + /** `[Extended]` Extracts the Parameters from the given Function type */ + Parameters(schema, options = {}) { + return this.Tuple(schema.parameters, { ...options }); + } + /** `[Extended]` Creates a Promise type */ + Promise(item, options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Promise', type: 'object', instanceOf: 'Promise', item: TypeClone.Clone(item, {}) }); + } + /** `[Extended]` Creates a regular expression type */ + RegEx(regex, options = {}) { + return this.Create({ ...options, [exports.Kind]: 'String', type: 'string', pattern: regex.source }); + } + /** `[Extended]` Extracts the ReturnType from the given Function */ + ReturnType(schema, options = {}) { + return TypeClone.Clone(schema.returns, options); + } + /** `[Extended]` Creates a Symbol type */ + Symbol(options) { + return this.Create({ ...options, [exports.Kind]: 'Symbol', type: 'null', typeOf: 'Symbol' }); + } + /** `[Extended]` Creates a Undefined type */ + Undefined(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Undefined', type: 'null', typeOf: 'Undefined' }); + } + /** `[Extended]` Creates a Uint8Array type */ + Uint8Array(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Uint8Array', type: 'object', instanceOf: 'Uint8Array' }); + } + /** `[Extended]` Creates a Void type */ + Void(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Void', type: 'null', typeOf: 'Void' }); + } +} +exports.ExtendedTypeBuilder = ExtendedTypeBuilder; +/** JSON Schema TypeBuilder with Static Resolution for TypeScript */ +exports.StandardType = new StandardTypeBuilder(); +/** JSON Schema TypeBuilder with Static Resolution for TypeScript */ +exports.Type = new ExtendedTypeBuilder(); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/cast.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/cast.d.ts new file mode 100644 index 0000000..992d9e3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/cast.d.ts @@ -0,0 +1,30 @@ +import * as Types from '../typebox'; +export declare class ValueCastReferenceTypeError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare class ValueCastArrayUniqueItemsTypeError extends Error { + readonly schema: Types.TSchema; + readonly value: unknown; + constructor(schema: Types.TSchema, value: unknown); +} +export declare class ValueCastNeverTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCastRecursiveTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCastUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCastDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare namespace ValueCast { + function Visit(schema: Types.TSchema, references: Types.TSchema[], value: any): any; + function Cast(schema: T, references: Types.TSchema[], value: any): Types.Static; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/cast.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/cast.js new file mode 100644 index 0000000..42fe2e1 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/cast.js @@ -0,0 +1,372 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueCast = exports.ValueCastDereferenceError = exports.ValueCastUnknownTypeError = exports.ValueCastRecursiveTypeError = exports.ValueCastNeverTypeError = exports.ValueCastArrayUniqueItemsTypeError = exports.ValueCastReferenceTypeError = void 0; +const Types = require("../typebox"); +const create_1 = require("./create"); +const check_1 = require("./check"); +const clone_1 = require("./clone"); +// ---------------------------------------------------------------------------------------------- +// Errors +// ---------------------------------------------------------------------------------------------- +class ValueCastReferenceTypeError extends Error { + constructor(schema) { + super(`ValueCast: Cannot locate referenced schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueCastReferenceTypeError = ValueCastReferenceTypeError; +class ValueCastArrayUniqueItemsTypeError extends Error { + constructor(schema, value) { + super('ValueCast: Array cast produced invalid data due to uniqueItems constraint'); + this.schema = schema; + this.value = value; + } +} +exports.ValueCastArrayUniqueItemsTypeError = ValueCastArrayUniqueItemsTypeError; +class ValueCastNeverTypeError extends Error { + constructor(schema) { + super('ValueCast: Never types cannot be cast'); + this.schema = schema; + } +} +exports.ValueCastNeverTypeError = ValueCastNeverTypeError; +class ValueCastRecursiveTypeError extends Error { + constructor(schema) { + super('ValueCast.Recursive: Cannot cast recursive schemas'); + this.schema = schema; + } +} +exports.ValueCastRecursiveTypeError = ValueCastRecursiveTypeError; +class ValueCastUnknownTypeError extends Error { + constructor(schema) { + super('ValueCast: Unknown type'); + this.schema = schema; + } +} +exports.ValueCastUnknownTypeError = ValueCastUnknownTypeError; +class ValueCastDereferenceError extends Error { + constructor(schema) { + super(`ValueCast: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueCastDereferenceError = ValueCastDereferenceError; +// ---------------------------------------------------------------------------------------------- +// The following will score a schema against a value. For objects, the score is the tally of +// points awarded for each property of the value. Property points are (1.0 / propertyCount) +// to prevent large property counts biasing results. Properties that match literal values are +// maximally awarded as literals are typically used as union discriminator fields. +// ---------------------------------------------------------------------------------------------- +var UnionCastCreate; +(function (UnionCastCreate) { + function Score(schema, references, value) { + if (schema[Types.Kind] === 'Object' && typeof value === 'object' && value !== null) { + const object = schema; + const keys = Object.keys(value); + const entries = globalThis.Object.entries(object.properties); + const [point, max] = [1 / entries.length, entries.length]; + return entries.reduce((acc, [key, schema]) => { + const literal = schema[Types.Kind] === 'Literal' && schema.const === value[key] ? max : 0; + const checks = check_1.ValueCheck.Check(schema, references, value[key]) ? point : 0; + const exists = keys.includes(key) ? point : 0; + return acc + (literal + checks + exists); + }, 0); + } + else { + return check_1.ValueCheck.Check(schema, references, value) ? 1 : 0; + } + } + function Select(union, references, value) { + let [select, best] = [union.anyOf[0], 0]; + for (const schema of union.anyOf) { + const score = Score(schema, references, value); + if (score > best) { + select = schema; + best = score; + } + } + return select; + } + function Create(union, references, value) { + if (union.default !== undefined) { + return union.default; + } + else { + const schema = Select(union, references, value); + return ValueCast.Cast(schema, references, value); + } + } + UnionCastCreate.Create = Create; +})(UnionCastCreate || (UnionCastCreate = {})); +var ValueCast; +(function (ValueCast) { + // ---------------------------------------------------------------------------------------------- + // Guards + // ---------------------------------------------------------------------------------------------- + function IsObject(value) { + return typeof value === 'object' && value !== null && !globalThis.Array.isArray(value); + } + function IsArray(value) { + return typeof value === 'object' && globalThis.Array.isArray(value); + } + function IsNumber(value) { + return typeof value === 'number' && !isNaN(value); + } + function IsString(value) { + return typeof value === 'string'; + } + // ---------------------------------------------------------------------------------------------- + // Cast + // ---------------------------------------------------------------------------------------------- + function Any(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Array(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return clone_1.ValueClone.Clone(value); + const created = IsArray(value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + const minimum = IsNumber(schema.minItems) && created.length < schema.minItems ? [...created, ...globalThis.Array.from({ length: schema.minItems - created.length }, () => null)] : created; + const maximum = IsNumber(schema.maxItems) && minimum.length > schema.maxItems ? minimum.slice(0, schema.maxItems) : minimum; + const casted = maximum.map((value) => Visit(schema.items, references, value)); + if (schema.uniqueItems !== true) + return casted; + const unique = [...new Set(casted)]; + if (!check_1.ValueCheck.Check(schema, references, unique)) + throw new ValueCastArrayUniqueItemsTypeError(schema, unique); + return unique; + } + function BigInt(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Boolean(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Constructor(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return create_1.ValueCreate.Create(schema, references); + const required = new Set(schema.returns.required || []); + const result = function () { }; + for (const [key, property] of globalThis.Object.entries(schema.returns.properties)) { + if (!required.has(key) && value.prototype[key] === undefined) + continue; + result.prototype[key] = Visit(property, references, value.prototype[key]); + } + return result; + } + function Date(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Function(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Integer(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Intersect(schema, references, value) { + const created = create_1.ValueCreate.Create(schema, references); + const mapped = IsObject(created) && IsObject(value) ? { ...created, ...value } : value; + return check_1.ValueCheck.Check(schema, references, mapped) ? mapped : create_1.ValueCreate.Create(schema, references); + } + function Literal(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Never(schema, references, value) { + throw new ValueCastNeverTypeError(schema); + } + function Not(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema.allOf[1], references); + } + function Null(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Number(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Object(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return value; + if (value === null || typeof value !== 'object') + return create_1.ValueCreate.Create(schema, references); + const required = new Set(schema.required || []); + const result = {}; + for (const [key, property] of globalThis.Object.entries(schema.properties)) { + if (!required.has(key) && value[key] === undefined) + continue; + result[key] = Visit(property, references, value[key]); + } + // additional schema properties + if (typeof schema.additionalProperties === 'object') { + const propertyNames = globalThis.Object.getOwnPropertyNames(schema.properties); + for (const propertyName of globalThis.Object.getOwnPropertyNames(value)) { + if (propertyNames.includes(propertyName)) + continue; + result[propertyName] = Visit(schema.additionalProperties, references, value[propertyName]); + } + } + return result; + } + function Promise(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Record(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return clone_1.ValueClone.Clone(value); + if (value === null || typeof value !== 'object' || globalThis.Array.isArray(value) || value instanceof globalThis.Date) + return create_1.ValueCreate.Create(schema, references); + const subschemaPropertyName = globalThis.Object.getOwnPropertyNames(schema.patternProperties)[0]; + const subschema = schema.patternProperties[subschemaPropertyName]; + const result = {}; + for (const [propKey, propValue] of globalThis.Object.entries(value)) { + result[propKey] = Visit(subschema, references, propValue); + } + return result; + } + function Ref(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueCastDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function String(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Symbol(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function TemplateLiteral(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function This(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueCastDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function Tuple(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return clone_1.ValueClone.Clone(value); + if (!globalThis.Array.isArray(value)) + return create_1.ValueCreate.Create(schema, references); + if (schema.items === undefined) + return []; + return schema.items.map((schema, index) => Visit(schema, references, value[index])); + } + function Undefined(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Union(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : UnionCastCreate.Create(schema, references, value); + } + function Uint8Array(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Unknown(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Void(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function UserDefined(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Visit(schema, references, value) { + const references_ = IsString(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema[Types.Kind]) { + case 'Any': + return Any(schema_, references_, value); + case 'Array': + return Array(schema_, references_, value); + case 'BigInt': + return BigInt(schema_, references_, value); + case 'Boolean': + return Boolean(schema_, references_, value); + case 'Constructor': + return Constructor(schema_, references_, value); + case 'Date': + return Date(schema_, references_, value); + case 'Function': + return Function(schema_, references_, value); + case 'Integer': + return Integer(schema_, references_, value); + case 'Intersect': + return Intersect(schema_, references_, value); + case 'Literal': + return Literal(schema_, references_, value); + case 'Never': + return Never(schema_, references_, value); + case 'Not': + return Not(schema_, references_, value); + case 'Null': + return Null(schema_, references_, value); + case 'Number': + return Number(schema_, references_, value); + case 'Object': + return Object(schema_, references_, value); + case 'Promise': + return Promise(schema_, references_, value); + case 'Record': + return Record(schema_, references_, value); + case 'Ref': + return Ref(schema_, references_, value); + case 'String': + return String(schema_, references_, value); + case 'Symbol': + return Symbol(schema_, references_, value); + case 'TemplateLiteral': + return TemplateLiteral(schema_, references_, value); + case 'This': + return This(schema_, references_, value); + case 'Tuple': + return Tuple(schema_, references_, value); + case 'Undefined': + return Undefined(schema_, references_, value); + case 'Union': + return Union(schema_, references_, value); + case 'Uint8Array': + return Uint8Array(schema_, references_, value); + case 'Unknown': + return Unknown(schema_, references_, value); + case 'Void': + return Void(schema_, references_, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueCastUnknownTypeError(schema_); + return UserDefined(schema_, references_, value); + } + } + ValueCast.Visit = Visit; + function Cast(schema, references, value) { + return Visit(schema, references, clone_1.ValueClone.Clone(value)); + } + ValueCast.Cast = Cast; +})(ValueCast = exports.ValueCast || (exports.ValueCast = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/check.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/check.d.ts new file mode 100644 index 0000000..ee18d9b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/check.d.ts @@ -0,0 +1,12 @@ +import * as Types from '../typebox'; +export declare class ValueCheckUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCheckDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare namespace ValueCheck { + function Check(schema: T, references: Types.TSchema[], value: any): boolean; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/check.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/check.js new file mode 100644 index 0000000..833aa64 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/check.js @@ -0,0 +1,484 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueCheck = exports.ValueCheckDereferenceError = exports.ValueCheckUnknownTypeError = void 0; +const Types = require("../typebox"); +const index_1 = require("../system/index"); +const hash_1 = require("./hash"); +// ------------------------------------------------------------------------- +// Errors +// ------------------------------------------------------------------------- +class ValueCheckUnknownTypeError extends Error { + constructor(schema) { + super(`ValueCheck: ${schema[Types.Kind] ? `Unknown type '${schema[Types.Kind]}'` : 'Unknown type'}`); + this.schema = schema; + } +} +exports.ValueCheckUnknownTypeError = ValueCheckUnknownTypeError; +class ValueCheckDereferenceError extends Error { + constructor(schema) { + super(`ValueCheck: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueCheckDereferenceError = ValueCheckDereferenceError; +var ValueCheck; +(function (ValueCheck) { + // ---------------------------------------------------------------------- + // Guards + // ---------------------------------------------------------------------- + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsInteger(value) { + return globalThis.Number.isInteger(value); + } + function IsString(value) { + return typeof value === 'string'; + } + function IsDefined(value) { + return value !== undefined; + } + // ---------------------------------------------------------------------- + // Policies + // ---------------------------------------------------------------------- + function IsExactOptionalProperty(value, key) { + return index_1.TypeSystem.ExactOptionalPropertyTypes ? key in value : value[key] !== undefined; + } + function IsObject(value) { + const result = typeof value === 'object' && value !== null; + return index_1.TypeSystem.AllowArrayObjects ? result : result && !globalThis.Array.isArray(value); + } + function IsRecordObject(value) { + return IsObject(value) && !(value instanceof globalThis.Date) && !(value instanceof globalThis.Uint8Array); + } + function IsNumber(value) { + const result = typeof value === 'number'; + return index_1.TypeSystem.AllowNaN ? result : result && globalThis.Number.isFinite(value); + } + function IsVoid(value) { + const result = value === undefined; + return index_1.TypeSystem.AllowVoidNull ? result || value === null : result; + } + // ---------------------------------------------------------------------- + // Types + // ---------------------------------------------------------------------- + function Any(schema, references, value) { + return true; + } + function Array(schema, references, value) { + if (!globalThis.Array.isArray(value)) { + return false; + } + if (IsDefined(schema.minItems) && !(value.length >= schema.minItems)) { + return false; + } + if (IsDefined(schema.maxItems) && !(value.length <= schema.maxItems)) { + return false; + } + // prettier-ignore + if (schema.uniqueItems === true && !((function () { const set = new Set(); for (const element of value) { + const hashed = hash_1.ValueHash.Create(element); + if (set.has(hashed)) { + return false; + } + else { + set.add(hashed); + } + } return true; })())) { + return false; + } + return value.every((value) => Visit(schema.items, references, value)); + } + function BigInt(schema, references, value) { + if (!IsBigInt(value)) { + return false; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === globalThis.BigInt(0))) { + return false; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + return false; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + return false; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + return false; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + return false; + } + return true; + } + function Boolean(schema, references, value) { + return typeof value === 'boolean'; + } + function Constructor(schema, references, value) { + return Visit(schema.returns, references, value.prototype); + } + function Date(schema, references, value) { + if (!(value instanceof globalThis.Date)) { + return false; + } + if (!IsNumber(value.getTime())) { + return false; + } + if (IsDefined(schema.exclusiveMinimumTimestamp) && !(value.getTime() > schema.exclusiveMinimumTimestamp)) { + return false; + } + if (IsDefined(schema.exclusiveMaximumTimestamp) && !(value.getTime() < schema.exclusiveMaximumTimestamp)) { + return false; + } + if (IsDefined(schema.minimumTimestamp) && !(value.getTime() >= schema.minimumTimestamp)) { + return false; + } + if (IsDefined(schema.maximumTimestamp) && !(value.getTime() <= schema.maximumTimestamp)) { + return false; + } + return true; + } + function Function(schema, references, value) { + return typeof value === 'function'; + } + function Integer(schema, references, value) { + if (!IsInteger(value)) { + return false; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === 0)) { + return false; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + return false; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + return false; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + return false; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + return false; + } + return true; + } + function Intersect(schema, references, value) { + if (!schema.allOf.every((schema) => Visit(schema, references, value))) { + return false; + } + else if (schema.unevaluatedProperties === false) { + const schemaKeys = Types.KeyResolver.Resolve(schema); + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + return valueKeys.every((key) => schemaKeys.includes(key)); + } + else if (Types.TypeGuard.TSchema(schema.unevaluatedProperties)) { + const schemaKeys = Types.KeyResolver.Resolve(schema); + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + return valueKeys.every((key) => schemaKeys.includes(key) || Visit(schema.unevaluatedProperties, references, value[key])); + } + else { + return true; + } + } + function Literal(schema, references, value) { + return value === schema.const; + } + function Never(schema, references, value) { + return false; + } + function Not(schema, references, value) { + return !Visit(schema.allOf[0].not, references, value) && Visit(schema.allOf[1], references, value); + } + function Null(schema, references, value) { + return value === null; + } + function Number(schema, references, value) { + if (!IsNumber(value)) { + return false; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === 0)) { + return false; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + return false; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + return false; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + return false; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + return false; + } + return true; + } + function Object(schema, references, value) { + if (!IsObject(value)) { + return false; + } + if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) { + return false; + } + if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) { + return false; + } + const knownKeys = globalThis.Object.getOwnPropertyNames(schema.properties); + for (const knownKey of knownKeys) { + const property = schema.properties[knownKey]; + if (schema.required && schema.required.includes(knownKey)) { + if (!Visit(property, references, value[knownKey])) { + return false; + } + if (Types.ExtendsUndefined.Check(property)) { + return knownKey in value; + } + } + else { + if (IsExactOptionalProperty(value, knownKey) && !Visit(property, references, value[knownKey])) { + return false; + } + } + } + if (schema.additionalProperties === false) { + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + // optimization: value is valid if schemaKey length matches the valueKey length + if (schema.required && schema.required.length === knownKeys.length && valueKeys.length === knownKeys.length) { + return true; + } + else { + return valueKeys.every((valueKey) => knownKeys.includes(valueKey)); + } + } + else if (typeof schema.additionalProperties === 'object') { + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + return valueKeys.every((key) => knownKeys.includes(key) || Visit(schema.additionalProperties, references, value[key])); + } + else { + return true; + } + } + function Promise(schema, references, value) { + return typeof value === 'object' && typeof value.then === 'function'; + } + function Record(schema, references, value) { + if (!IsRecordObject(value)) { + return false; + } + if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) { + return false; + } + if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) { + return false; + } + const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0]; + const regex = new RegExp(keyPattern); + if (!globalThis.Object.getOwnPropertyNames(value).every((key) => regex.test(key))) { + return false; + } + for (const propValue of globalThis.Object.values(value)) { + if (!Visit(valueSchema, references, propValue)) + return false; + } + return true; + } + function Ref(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueCheckDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function String(schema, references, value) { + if (!IsString(value)) { + return false; + } + if (IsDefined(schema.minLength)) { + if (!(value.length >= schema.minLength)) + return false; + } + if (IsDefined(schema.maxLength)) { + if (!(value.length <= schema.maxLength)) + return false; + } + if (IsDefined(schema.pattern)) { + const regex = new RegExp(schema.pattern); + if (!regex.test(value)) + return false; + } + if (IsDefined(schema.format)) { + if (!Types.FormatRegistry.Has(schema.format)) + return false; + const func = Types.FormatRegistry.Get(schema.format); + return func(value); + } + return true; + } + function Symbol(schema, references, value) { + if (!(typeof value === 'symbol')) { + return false; + } + return true; + } + function TemplateLiteral(schema, references, value) { + if (!IsString(value)) { + return false; + } + return new RegExp(schema.pattern).test(value); + } + function This(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueCheckDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function Tuple(schema, references, value) { + if (!globalThis.Array.isArray(value)) { + return false; + } + if (schema.items === undefined && !(value.length === 0)) { + return false; + } + if (!(value.length === schema.maxItems)) { + return false; + } + if (!schema.items) { + return true; + } + for (let i = 0; i < schema.items.length; i++) { + if (!Visit(schema.items[i], references, value[i])) + return false; + } + return true; + } + function Undefined(schema, references, value) { + return value === undefined; + } + function Union(schema, references, value) { + return schema.anyOf.some((inner) => Visit(inner, references, value)); + } + function Uint8Array(schema, references, value) { + if (!(value instanceof globalThis.Uint8Array)) { + return false; + } + if (IsDefined(schema.maxByteLength) && !(value.length <= schema.maxByteLength)) { + return false; + } + if (IsDefined(schema.minByteLength) && !(value.length >= schema.minByteLength)) { + return false; + } + return true; + } + function Unknown(schema, references, value) { + return true; + } + function Void(schema, references, value) { + return IsVoid(value); + } + function UserDefined(schema, references, value) { + if (!Types.TypeRegistry.Has(schema[Types.Kind])) + return false; + const func = Types.TypeRegistry.Get(schema[Types.Kind]); + return func(schema, value); + } + function Visit(schema, references, value) { + const references_ = IsDefined(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema_[Types.Kind]) { + case 'Any': + return Any(schema_, references_, value); + case 'Array': + return Array(schema_, references_, value); + case 'BigInt': + return BigInt(schema_, references_, value); + case 'Boolean': + return Boolean(schema_, references_, value); + case 'Constructor': + return Constructor(schema_, references_, value); + case 'Date': + return Date(schema_, references_, value); + case 'Function': + return Function(schema_, references_, value); + case 'Integer': + return Integer(schema_, references_, value); + case 'Intersect': + return Intersect(schema_, references_, value); + case 'Literal': + return Literal(schema_, references_, value); + case 'Never': + return Never(schema_, references_, value); + case 'Not': + return Not(schema_, references_, value); + case 'Null': + return Null(schema_, references_, value); + case 'Number': + return Number(schema_, references_, value); + case 'Object': + return Object(schema_, references_, value); + case 'Promise': + return Promise(schema_, references_, value); + case 'Record': + return Record(schema_, references_, value); + case 'Ref': + return Ref(schema_, references_, value); + case 'String': + return String(schema_, references_, value); + case 'Symbol': + return Symbol(schema_, references_, value); + case 'TemplateLiteral': + return TemplateLiteral(schema_, references_, value); + case 'This': + return This(schema_, references_, value); + case 'Tuple': + return Tuple(schema_, references_, value); + case 'Undefined': + return Undefined(schema_, references_, value); + case 'Union': + return Union(schema_, references_, value); + case 'Uint8Array': + return Uint8Array(schema_, references_, value); + case 'Unknown': + return Unknown(schema_, references_, value); + case 'Void': + return Void(schema_, references_, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueCheckUnknownTypeError(schema_); + return UserDefined(schema_, references_, value); + } + } + // ------------------------------------------------------------------------- + // Check + // ------------------------------------------------------------------------- + function Check(schema, references, value) { + return Visit(schema, references, value); + } + ValueCheck.Check = Check; +})(ValueCheck = exports.ValueCheck || (exports.ValueCheck = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/clone.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/clone.d.ts new file mode 100644 index 0000000..5ca0adf --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/clone.d.ts @@ -0,0 +1,3 @@ +export declare namespace ValueClone { + function Clone(value: T): T; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/clone.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/clone.js new file mode 100644 index 0000000..75e2685 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/clone.js @@ -0,0 +1,71 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueClone = void 0; +const is_1 = require("./is"); +var ValueClone; +(function (ValueClone) { + function Array(value) { + return value.map((element) => Clone(element)); + } + function Date(value) { + return new globalThis.Date(value.toISOString()); + } + function Object(value) { + const keys = [...globalThis.Object.keys(value), ...globalThis.Object.getOwnPropertySymbols(value)]; + return keys.reduce((acc, key) => ({ ...acc, [key]: Clone(value[key]) }), {}); + } + function TypedArray(value) { + return value.slice(); + } + function Value(value) { + return value; + } + function Clone(value) { + if (is_1.Is.Date(value)) { + return Date(value); + } + else if (is_1.Is.Object(value)) { + return Object(value); + } + else if (is_1.Is.Array(value)) { + return Array(value); + } + else if (is_1.Is.TypedArray(value)) { + return TypedArray(value); + } + else if (is_1.Is.Value(value)) { + return Value(value); + } + else { + throw new Error('ValueClone: Unable to clone value'); + } + } + ValueClone.Clone = Clone; +})(ValueClone = exports.ValueClone || (exports.ValueClone = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/convert.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/convert.d.ts new file mode 100644 index 0000000..99c5d5d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/convert.d.ts @@ -0,0 +1,13 @@ +import * as Types from '../typebox'; +export declare class ValueConvertUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueConvertDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare namespace ValueConvert { + function Visit(schema: Types.TSchema, references: Types.TSchema[], value: any): unknown; + function Convert(schema: T, references: Types.TSchema[], value: any): unknown; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/convert.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/convert.js new file mode 100644 index 0000000..c6a608d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/convert.js @@ -0,0 +1,372 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueConvert = exports.ValueConvertDereferenceError = exports.ValueConvertUnknownTypeError = void 0; +const Types = require("../typebox"); +const clone_1 = require("./clone"); +const check_1 = require("./check"); +// ---------------------------------------------------------------------------------------------- +// Errors +// ---------------------------------------------------------------------------------------------- +class ValueConvertUnknownTypeError extends Error { + constructor(schema) { + super('ValueConvert: Unknown type'); + this.schema = schema; + } +} +exports.ValueConvertUnknownTypeError = ValueConvertUnknownTypeError; +class ValueConvertDereferenceError extends Error { + constructor(schema) { + super(`ValueConvert: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueConvertDereferenceError = ValueConvertDereferenceError; +var ValueConvert; +(function (ValueConvert) { + // ---------------------------------------------------------------------------------------------- + // Guards + // ---------------------------------------------------------------------------------------------- + function IsObject(value) { + return typeof value === 'object' && value !== null && !globalThis.Array.isArray(value); + } + function IsArray(value) { + return typeof value === 'object' && globalThis.Array.isArray(value); + } + function IsDate(value) { + return typeof value === 'object' && value instanceof globalThis.Date; + } + function IsSymbol(value) { + return typeof value === 'symbol'; + } + function IsString(value) { + return typeof value === 'string'; + } + function IsBoolean(value) { + return typeof value === 'boolean'; + } + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsNumber(value) { + return typeof value === 'number' && !isNaN(value); + } + function IsStringNumeric(value) { + return IsString(value) && !isNaN(value) && !isNaN(parseFloat(value)); + } + function IsValueToString(value) { + return IsBigInt(value) || IsBoolean(value) || IsNumber(value); + } + function IsValueTrue(value) { + return value === true || (IsNumber(value) && value === 1) || (IsBigInt(value) && value === globalThis.BigInt('1')) || (IsString(value) && (value.toLowerCase() === 'true' || value === '1')); + } + function IsValueFalse(value) { + return value === false || (IsNumber(value) && value === 0) || (IsBigInt(value) && value === globalThis.BigInt('0')) || (IsString(value) && (value.toLowerCase() === 'false' || value === '0')); + } + function IsTimeStringWithTimeZone(value) { + return IsString(value) && /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i.test(value); + } + function IsTimeStringWithoutTimeZone(value) { + return IsString(value) && /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)?$/i.test(value); + } + function IsDateTimeStringWithTimeZone(value) { + return IsString(value) && /^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i.test(value); + } + function IsDateTimeStringWithoutTimeZone(value) { + return IsString(value) && /^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)?$/i.test(value); + } + function IsDateString(value) { + return IsString(value) && /^\d\d\d\d-[0-1]\d-[0-3]\d$/i.test(value); + } + // ---------------------------------------------------------------------------------------------- + // Convert + // ---------------------------------------------------------------------------------------------- + function TryConvertLiteralString(value, target) { + const conversion = TryConvertString(value); + return conversion === target ? conversion : value; + } + function TryConvertLiteralNumber(value, target) { + const conversion = TryConvertNumber(value); + return conversion === target ? conversion : value; + } + function TryConvertLiteralBoolean(value, target) { + const conversion = TryConvertBoolean(value); + return conversion === target ? conversion : value; + } + function TryConvertLiteral(schema, value) { + if (typeof schema.const === 'string') { + return TryConvertLiteralString(value, schema.const); + } + else if (typeof schema.const === 'number') { + return TryConvertLiteralNumber(value, schema.const); + } + else if (typeof schema.const === 'boolean') { + return TryConvertLiteralBoolean(value, schema.const); + } + else { + return clone_1.ValueClone.Clone(value); + } + } + function TryConvertBoolean(value) { + return IsValueTrue(value) ? true : IsValueFalse(value) ? false : value; + } + function TryConvertBigInt(value) { + return IsStringNumeric(value) ? globalThis.BigInt(parseInt(value)) : IsNumber(value) ? globalThis.BigInt(value | 0) : IsValueFalse(value) ? 0 : IsValueTrue(value) ? 1 : value; + } + function TryConvertString(value) { + return IsValueToString(value) ? value.toString() : value; + } + function TryConvertNumber(value) { + return IsStringNumeric(value) ? parseFloat(value) : IsValueTrue(value) ? 1 : IsValueFalse(value) ? 0 : value; + } + function TryConvertInteger(value) { + return IsStringNumeric(value) ? parseInt(value) : IsNumber(value) ? value | 0 : IsValueTrue(value) ? 1 : IsValueFalse(value) ? 0 : value; + } + function TryConvertNull(value) { + return IsString(value) && value.toLowerCase() === 'null' ? null : value; + } + function TryConvertUndefined(value) { + return IsString(value) && value === 'undefined' ? undefined : value; + } + function TryConvertDate(value) { + // note: this function may return an invalid dates for the regex tests + // above. Invalid dates will however be checked during the casting + // function and will return a epoch date if invalid. Consider better + // string parsing for the iso dates in future revisions. + return IsDate(value) + ? value + : IsNumber(value) + ? new globalThis.Date(value) + : IsValueTrue(value) + ? new globalThis.Date(1) + : IsValueFalse(value) + ? new globalThis.Date(0) + : IsStringNumeric(value) + ? new globalThis.Date(parseInt(value)) + : IsTimeStringWithoutTimeZone(value) + ? new globalThis.Date(`1970-01-01T${value}.000Z`) + : IsTimeStringWithTimeZone(value) + ? new globalThis.Date(`1970-01-01T${value}`) + : IsDateTimeStringWithoutTimeZone(value) + ? new globalThis.Date(`${value}.000Z`) + : IsDateTimeStringWithTimeZone(value) + ? new globalThis.Date(value) + : IsDateString(value) + ? new globalThis.Date(`${value}T00:00:00.000Z`) + : value; + } + // ---------------------------------------------------------------------------------------------- + // Cast + // ---------------------------------------------------------------------------------------------- + function Any(schema, references, value) { + return value; + } + function Array(schema, references, value) { + if (IsArray(value)) { + return value.map((value) => Visit(schema.items, references, value)); + } + return value; + } + function BigInt(schema, references, value) { + return TryConvertBigInt(value); + } + function Boolean(schema, references, value) { + return TryConvertBoolean(value); + } + function Constructor(schema, references, value) { + return clone_1.ValueClone.Clone(value); + } + function Date(schema, references, value) { + return TryConvertDate(value); + } + function Function(schema, references, value) { + return value; + } + function Integer(schema, references, value) { + return TryConvertInteger(value); + } + function Intersect(schema, references, value) { + return value; + } + function Literal(schema, references, value) { + return TryConvertLiteral(schema, value); + } + function Never(schema, references, value) { + return value; + } + function Null(schema, references, value) { + return TryConvertNull(value); + } + function Number(schema, references, value) { + return TryConvertNumber(value); + } + function Object(schema, references, value) { + if (IsObject(value)) + return globalThis.Object.keys(schema.properties).reduce((acc, key) => { + return value[key] !== undefined ? { ...acc, [key]: Visit(schema.properties[key], references, value[key]) } : { ...acc }; + }, value); + return value; + } + function Promise(schema, references, value) { + return value; + } + function Record(schema, references, value) { + const propertyKey = globalThis.Object.getOwnPropertyNames(schema.patternProperties)[0]; + const property = schema.patternProperties[propertyKey]; + const result = {}; + for (const [propKey, propValue] of globalThis.Object.entries(value)) { + result[propKey] = Visit(property, references, propValue); + } + return result; + } + function Ref(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueConvertDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function String(schema, references, value) { + return TryConvertString(value); + } + function Symbol(schema, references, value) { + return value; + } + function TemplateLiteral(schema, references, value) { + return value; + } + function This(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueConvertDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function Tuple(schema, references, value) { + if (IsArray(value) && schema.items !== undefined) { + return value.map((value, index) => { + return index < schema.items.length ? Visit(schema.items[index], references, value) : value; + }); + } + return value; + } + function Undefined(schema, references, value) { + return TryConvertUndefined(value); + } + function Union(schema, references, value) { + for (const subschema of schema.anyOf) { + const converted = Visit(subschema, references, value); + if (check_1.ValueCheck.Check(subschema, references, converted)) { + return converted; + } + } + return value; + } + function Uint8Array(schema, references, value) { + return value; + } + function Unknown(schema, references, value) { + return value; + } + function Void(schema, references, value) { + return value; + } + function UserDefined(schema, references, value) { + return value; + } + function Visit(schema, references, value) { + const references_ = IsString(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema[Types.Kind]) { + case 'Any': + return Any(schema_, references_, value); + case 'Array': + return Array(schema_, references_, value); + case 'BigInt': + return BigInt(schema_, references_, value); + case 'Boolean': + return Boolean(schema_, references_, value); + case 'Constructor': + return Constructor(schema_, references_, value); + case 'Date': + return Date(schema_, references_, value); + case 'Function': + return Function(schema_, references_, value); + case 'Integer': + return Integer(schema_, references_, value); + case 'Intersect': + return Intersect(schema_, references_, value); + case 'Literal': + return Literal(schema_, references_, value); + case 'Never': + return Never(schema_, references_, value); + case 'Null': + return Null(schema_, references_, value); + case 'Number': + return Number(schema_, references_, value); + case 'Object': + return Object(schema_, references_, value); + case 'Promise': + return Promise(schema_, references_, value); + case 'Record': + return Record(schema_, references_, value); + case 'Ref': + return Ref(schema_, references_, value); + case 'String': + return String(schema_, references_, value); + case 'Symbol': + return Symbol(schema_, references_, value); + case 'TemplateLiteral': + return TemplateLiteral(schema_, references_, value); + case 'This': + return This(schema_, references_, value); + case 'Tuple': + return Tuple(schema_, references_, value); + case 'Undefined': + return Undefined(schema_, references_, value); + case 'Union': + return Union(schema_, references_, value); + case 'Uint8Array': + return Uint8Array(schema_, references_, value); + case 'Unknown': + return Unknown(schema_, references_, value); + case 'Void': + return Void(schema_, references_, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueConvertUnknownTypeError(schema_); + return UserDefined(schema_, references_, value); + } + } + ValueConvert.Visit = Visit; + function Convert(schema, references, value) { + return Visit(schema, references, clone_1.ValueClone.Clone(value)); + } + ValueConvert.Convert = Convert; +})(ValueConvert = exports.ValueConvert || (exports.ValueConvert = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/create.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/create.d.ts new file mode 100644 index 0000000..86e1e5e --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/create.d.ts @@ -0,0 +1,26 @@ +import * as Types from '../typebox'; +export declare class ValueCreateUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCreateNeverTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCreateIntersectTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCreateTempateLiteralTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCreateDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare namespace ValueCreate { + /** Creates a value from the given schema. If the schema specifies a default value, then that value is returned. */ + function Visit(schema: Types.TSchema, references: Types.TSchema[]): unknown; + function Create(schema: T, references: Types.TSchema[]): Types.Static; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/create.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/create.js new file mode 100644 index 0000000..42374a8 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/create.js @@ -0,0 +1,480 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueCreate = exports.ValueCreateDereferenceError = exports.ValueCreateTempateLiteralTypeError = exports.ValueCreateIntersectTypeError = exports.ValueCreateNeverTypeError = exports.ValueCreateUnknownTypeError = void 0; +const Types = require("../typebox"); +const check_1 = require("./check"); +// -------------------------------------------------------------------------- +// Errors +// -------------------------------------------------------------------------- +class ValueCreateUnknownTypeError extends Error { + constructor(schema) { + super('ValueCreate: Unknown type'); + this.schema = schema; + } +} +exports.ValueCreateUnknownTypeError = ValueCreateUnknownTypeError; +class ValueCreateNeverTypeError extends Error { + constructor(schema) { + super('ValueCreate: Never types cannot be created'); + this.schema = schema; + } +} +exports.ValueCreateNeverTypeError = ValueCreateNeverTypeError; +class ValueCreateIntersectTypeError extends Error { + constructor(schema) { + super('ValueCreate: Intersect produced invalid value. Consider using a default value.'); + this.schema = schema; + } +} +exports.ValueCreateIntersectTypeError = ValueCreateIntersectTypeError; +class ValueCreateTempateLiteralTypeError extends Error { + constructor(schema) { + super('ValueCreate: Can only create template literal values from patterns that produce finite sequences. Consider using a default value.'); + this.schema = schema; + } +} +exports.ValueCreateTempateLiteralTypeError = ValueCreateTempateLiteralTypeError; +class ValueCreateDereferenceError extends Error { + constructor(schema) { + super(`ValueCreate: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueCreateDereferenceError = ValueCreateDereferenceError; +// -------------------------------------------------------------------------- +// ValueCreate +// -------------------------------------------------------------------------- +var ValueCreate; +(function (ValueCreate) { + // -------------------------------------------------------- + // Guards + // -------------------------------------------------------- + function IsString(value) { + return typeof value === 'string'; + } + // -------------------------------------------------------- + // Types + // -------------------------------------------------------- + function Any(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return {}; + } + } + function Array(schema, references) { + if (schema.uniqueItems === true && schema.default === undefined) { + throw new Error('ValueCreate.Array: Arrays with uniqueItems require a default value'); + } + else if ('default' in schema) { + return schema.default; + } + else if (schema.minItems !== undefined) { + return globalThis.Array.from({ length: schema.minItems }).map((item) => { + return ValueCreate.Create(schema.items, references); + }); + } + else { + return []; + } + } + function BigInt(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return globalThis.BigInt(0); + } + } + function Boolean(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return false; + } + } + function Constructor(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + const value = ValueCreate.Create(schema.returns, references); + if (typeof value === 'object' && !globalThis.Array.isArray(value)) { + return class { + constructor() { + for (const [key, val] of globalThis.Object.entries(value)) { + const self = this; + self[key] = val; + } + } + }; + } + else { + return class { + }; + } + } + } + function Date(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.minimumTimestamp !== undefined) { + return new globalThis.Date(schema.minimumTimestamp); + } + else { + return new globalThis.Date(0); + } + } + function Function(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return () => ValueCreate.Create(schema.returns, references); + } + } + function Integer(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.minimum !== undefined) { + return schema.minimum; + } + else { + return 0; + } + } + function Intersect(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + // Note: The best we can do here is attempt to instance each sub type and apply through object assign. For non-object + // sub types, we just escape the assignment and just return the value. In the latter case, this is typically going to + // be a consequence of an illogical intersection. + const value = schema.allOf.reduce((acc, schema) => { + const next = Visit(schema, references); + return typeof next === 'object' ? { ...acc, ...next } : next; + }, {}); + if (!check_1.ValueCheck.Check(schema, references, value)) + throw new ValueCreateIntersectTypeError(schema); + return value; + } + } + function Literal(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return schema.const; + } + } + function Never(schema, references) { + throw new ValueCreateNeverTypeError(schema); + } + function Not(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return Visit(schema.allOf[1], references); + } + } + function Null(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return null; + } + } + function Number(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.minimum !== undefined) { + return schema.minimum; + } + else { + return 0; + } + } + function Object(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + const required = new Set(schema.required); + return (schema.default || + globalThis.Object.entries(schema.properties).reduce((acc, [key, schema]) => { + return required.has(key) ? { ...acc, [key]: ValueCreate.Create(schema, references) } : { ...acc }; + }, {})); + } + } + function Promise(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return globalThis.Promise.resolve(ValueCreate.Create(schema.item, references)); + } + } + function Record(schema, references) { + const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0]; + if ('default' in schema) { + return schema.default; + } + else if (!(keyPattern === Types.PatternStringExact || keyPattern === Types.PatternNumberExact)) { + const propertyKeys = keyPattern.slice(1, keyPattern.length - 1).split('|'); + return propertyKeys.reduce((acc, key) => { + return { ...acc, [key]: Create(valueSchema, references) }; + }, {}); + } + else { + return {}; + } + } + function Ref(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + const index = references.findIndex((foreign) => foreign.$id === schema.$id); + if (index === -1) + throw new ValueCreateDereferenceError(schema); + const target = references[index]; + return Visit(target, references); + } + } + function String(schema, references) { + if (schema.pattern !== undefined) { + if (!('default' in schema)) { + throw new Error('ValueCreate.String: String types with patterns must specify a default value'); + } + else { + return schema.default; + } + } + else if (schema.format !== undefined) { + if (!('default' in schema)) { + throw new Error('ValueCreate.String: String types with formats must specify a default value'); + } + else { + return schema.default; + } + } + else { + if ('default' in schema) { + return schema.default; + } + else if (schema.minLength !== undefined) { + return globalThis.Array.from({ length: schema.minLength }) + .map(() => '.') + .join(''); + } + else { + return ''; + } + } + } + function Symbol(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if ('value' in schema) { + return globalThis.Symbol.for(schema.value); + } + else { + return globalThis.Symbol(); + } + } + function TemplateLiteral(schema, references) { + if ('default' in schema) { + return schema.default; + } + const expression = Types.TemplateLiteralParser.ParseExact(schema.pattern); + if (!Types.TemplateLiteralFinite.Check(expression)) + throw new ValueCreateTempateLiteralTypeError(schema); + const sequence = Types.TemplateLiteralGenerator.Generate(expression); + return sequence.next().value; + } + function This(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + const index = references.findIndex((foreign) => foreign.$id === schema.$id); + if (index === -1) + throw new ValueCreateDereferenceError(schema); + const target = references[index]; + return Visit(target, references); + } + } + function Tuple(schema, references) { + if ('default' in schema) { + return schema.default; + } + if (schema.items === undefined) { + return []; + } + else { + return globalThis.Array.from({ length: schema.minItems }).map((_, index) => ValueCreate.Create(schema.items[index], references)); + } + } + function Undefined(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return undefined; + } + } + function Union(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.anyOf.length === 0) { + throw new Error('ValueCreate.Union: Cannot create Union with zero variants'); + } + else { + return ValueCreate.Create(schema.anyOf[0], references); + } + } + function Uint8Array(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.minByteLength !== undefined) { + return new globalThis.Uint8Array(schema.minByteLength); + } + else { + return new globalThis.Uint8Array(0); + } + } + function Unknown(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return {}; + } + } + function Void(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return void 0; + } + } + function UserDefined(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + throw new Error('ValueCreate.UserDefined: User defined types must specify a default value'); + } + } + /** Creates a value from the given schema. If the schema specifies a default value, then that value is returned. */ + function Visit(schema, references) { + const references_ = IsString(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema_[Types.Kind]) { + case 'Any': + return Any(schema_, references_); + case 'Array': + return Array(schema_, references_); + case 'BigInt': + return BigInt(schema_, references_); + case 'Boolean': + return Boolean(schema_, references_); + case 'Constructor': + return Constructor(schema_, references_); + case 'Date': + return Date(schema_, references_); + case 'Function': + return Function(schema_, references_); + case 'Integer': + return Integer(schema_, references_); + case 'Intersect': + return Intersect(schema_, references_); + case 'Literal': + return Literal(schema_, references_); + case 'Never': + return Never(schema_, references_); + case 'Not': + return Not(schema_, references_); + case 'Null': + return Null(schema_, references_); + case 'Number': + return Number(schema_, references_); + case 'Object': + return Object(schema_, references_); + case 'Promise': + return Promise(schema_, references_); + case 'Record': + return Record(schema_, references_); + case 'Ref': + return Ref(schema_, references_); + case 'String': + return String(schema_, references_); + case 'Symbol': + return Symbol(schema_, references_); + case 'TemplateLiteral': + return TemplateLiteral(schema_, references_); + case 'This': + return This(schema_, references_); + case 'Tuple': + return Tuple(schema_, references_); + case 'Undefined': + return Undefined(schema_, references_); + case 'Union': + return Union(schema_, references_); + case 'Uint8Array': + return Uint8Array(schema_, references_); + case 'Unknown': + return Unknown(schema_, references_); + case 'Void': + return Void(schema_, references_); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueCreateUnknownTypeError(schema_); + return UserDefined(schema_, references_); + } + } + ValueCreate.Visit = Visit; + function Create(schema, references) { + return Visit(schema, references); + } + ValueCreate.Create = Create; +})(ValueCreate = exports.ValueCreate || (exports.ValueCreate = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/delta.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/delta.d.ts new file mode 100644 index 0000000..3320fac --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/delta.d.ts @@ -0,0 +1,43 @@ +import { Static } from '../typebox'; +export type Insert = Static; +export declare const Insert: import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"insert">; + path: import("../typebox").TString; + value: import("../typebox").TUnknown; +}>; +export type Update = Static; +export declare const Update: import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"update">; + path: import("../typebox").TString; + value: import("../typebox").TUnknown; +}>; +export type Delete = Static; +export declare const Delete: import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"delete">; + path: import("../typebox").TString; +}>; +export type Edit = Static; +export declare const Edit: import("../typebox").TUnion<[import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"insert">; + path: import("../typebox").TString; + value: import("../typebox").TUnknown; +}>, import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"update">; + path: import("../typebox").TString; + value: import("../typebox").TUnknown; +}>, import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"delete">; + path: import("../typebox").TString; +}>]>; +export declare class ValueDeltaObjectWithSymbolKeyError extends Error { + readonly key: unknown; + constructor(key: unknown); +} +export declare class ValueDeltaUnableToDiffUnknownValue extends Error { + readonly value: unknown; + constructor(value: unknown); +} +export declare namespace ValueDelta { + function Diff(current: unknown, next: unknown): Edit[]; + function Patch(current: unknown, edits: Edit[]): T; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/delta.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/delta.js new file mode 100644 index 0000000..89c06a0 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/delta.js @@ -0,0 +1,204 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueDelta = exports.ValueDeltaUnableToDiffUnknownValue = exports.ValueDeltaObjectWithSymbolKeyError = exports.Edit = exports.Delete = exports.Update = exports.Insert = void 0; +const typebox_1 = require("../typebox"); +const is_1 = require("./is"); +const clone_1 = require("./clone"); +const pointer_1 = require("./pointer"); +exports.Insert = typebox_1.Type.Object({ + type: typebox_1.Type.Literal('insert'), + path: typebox_1.Type.String(), + value: typebox_1.Type.Unknown(), +}); +exports.Update = typebox_1.Type.Object({ + type: typebox_1.Type.Literal('update'), + path: typebox_1.Type.String(), + value: typebox_1.Type.Unknown(), +}); +exports.Delete = typebox_1.Type.Object({ + type: typebox_1.Type.Literal('delete'), + path: typebox_1.Type.String(), +}); +exports.Edit = typebox_1.Type.Union([exports.Insert, exports.Update, exports.Delete]); +// --------------------------------------------------------------------- +// Errors +// --------------------------------------------------------------------- +class ValueDeltaObjectWithSymbolKeyError extends Error { + constructor(key) { + super('ValueDelta: Cannot diff objects with symbol keys'); + this.key = key; + } +} +exports.ValueDeltaObjectWithSymbolKeyError = ValueDeltaObjectWithSymbolKeyError; +class ValueDeltaUnableToDiffUnknownValue extends Error { + constructor(value) { + super('ValueDelta: Unable to create diff edits for unknown value'); + this.value = value; + } +} +exports.ValueDeltaUnableToDiffUnknownValue = ValueDeltaUnableToDiffUnknownValue; +// --------------------------------------------------------------------- +// ValueDelta +// --------------------------------------------------------------------- +var ValueDelta; +(function (ValueDelta) { + // --------------------------------------------------------------------- + // Edits + // --------------------------------------------------------------------- + function Update(path, value) { + return { type: 'update', path, value }; + } + function Insert(path, value) { + return { type: 'insert', path, value }; + } + function Delete(path) { + return { type: 'delete', path }; + } + // --------------------------------------------------------------------- + // Diff + // --------------------------------------------------------------------- + function* Object(path, current, next) { + if (!is_1.Is.Object(next)) + return yield Update(path, next); + const currentKeys = [...globalThis.Object.keys(current), ...globalThis.Object.getOwnPropertySymbols(current)]; + const nextKeys = [...globalThis.Object.keys(next), ...globalThis.Object.getOwnPropertySymbols(next)]; + for (const key of currentKeys) { + if (typeof key === 'symbol') + throw new ValueDeltaObjectWithSymbolKeyError(key); + if (next[key] === undefined && nextKeys.includes(key)) + yield Update(`${path}/${String(key)}`, undefined); + } + for (const key of nextKeys) { + if (current[key] === undefined || next[key] === undefined) + continue; + if (typeof key === 'symbol') + throw new ValueDeltaObjectWithSymbolKeyError(key); + yield* Visit(`${path}/${String(key)}`, current[key], next[key]); + } + for (const key of nextKeys) { + if (typeof key === 'symbol') + throw new ValueDeltaObjectWithSymbolKeyError(key); + if (current[key] === undefined) + yield Insert(`${path}/${String(key)}`, next[key]); + } + for (const key of currentKeys.reverse()) { + if (typeof key === 'symbol') + throw new ValueDeltaObjectWithSymbolKeyError(key); + if (next[key] === undefined && !nextKeys.includes(key)) + yield Delete(`${path}/${String(key)}`); + } + } + function* Array(path, current, next) { + if (!is_1.Is.Array(next)) + return yield Update(path, next); + for (let i = 0; i < Math.min(current.length, next.length); i++) { + yield* Visit(`${path}/${i}`, current[i], next[i]); + } + for (let i = 0; i < next.length; i++) { + if (i < current.length) + continue; + yield Insert(`${path}/${i}`, next[i]); + } + for (let i = current.length - 1; i >= 0; i--) { + if (i < next.length) + continue; + yield Delete(`${path}/${i}`); + } + } + function* TypedArray(path, current, next) { + if (!is_1.Is.TypedArray(next) || current.length !== next.length || globalThis.Object.getPrototypeOf(current).constructor.name !== globalThis.Object.getPrototypeOf(next).constructor.name) + return yield Update(path, next); + for (let i = 0; i < Math.min(current.length, next.length); i++) { + yield* Visit(`${path}/${i}`, current[i], next[i]); + } + } + function* Value(path, current, next) { + if (current === next) + return; + yield Update(path, next); + } + function* Visit(path, current, next) { + if (is_1.Is.Object(current)) { + return yield* Object(path, current, next); + } + else if (is_1.Is.Array(current)) { + return yield* Array(path, current, next); + } + else if (is_1.Is.TypedArray(current)) { + return yield* TypedArray(path, current, next); + } + else if (is_1.Is.Value(current)) { + return yield* Value(path, current, next); + } + else { + throw new ValueDeltaUnableToDiffUnknownValue(current); + } + } + function Diff(current, next) { + return [...Visit('', current, next)]; + } + ValueDelta.Diff = Diff; + // --------------------------------------------------------------------- + // Patch + // --------------------------------------------------------------------- + function IsRootUpdate(edits) { + return edits.length > 0 && edits[0].path === '' && edits[0].type === 'update'; + } + function IsIdentity(edits) { + return edits.length === 0; + } + function Patch(current, edits) { + if (IsRootUpdate(edits)) { + return clone_1.ValueClone.Clone(edits[0].value); + } + if (IsIdentity(edits)) { + return clone_1.ValueClone.Clone(current); + } + const clone = clone_1.ValueClone.Clone(current); + for (const edit of edits) { + switch (edit.type) { + case 'insert': { + pointer_1.ValuePointer.Set(clone, edit.path, edit.value); + break; + } + case 'update': { + pointer_1.ValuePointer.Set(clone, edit.path, edit.value); + break; + } + case 'delete': { + pointer_1.ValuePointer.Delete(clone, edit.path); + break; + } + } + } + return clone; + } + ValueDelta.Patch = Patch; +})(ValueDelta = exports.ValueDelta || (exports.ValueDelta = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/equal.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/equal.d.ts new file mode 100644 index 0000000..785c2b8 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/equal.d.ts @@ -0,0 +1,3 @@ +export declare namespace ValueEqual { + function Equal(left: T, right: unknown): right is T; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/equal.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/equal.js new file mode 100644 index 0000000..ed9773b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/equal.js @@ -0,0 +1,80 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueEqual = void 0; +const is_1 = require("./is"); +var ValueEqual; +(function (ValueEqual) { + function Object(left, right) { + if (!is_1.Is.Object(right)) + return false; + const leftKeys = [...globalThis.Object.keys(left), ...globalThis.Object.getOwnPropertySymbols(left)]; + const rightKeys = [...globalThis.Object.keys(right), ...globalThis.Object.getOwnPropertySymbols(right)]; + if (leftKeys.length !== rightKeys.length) + return false; + return leftKeys.every((key) => Equal(left[key], right[key])); + } + function Date(left, right) { + return is_1.Is.Date(right) && left.getTime() === right.getTime(); + } + function Array(left, right) { + if (!is_1.Is.Array(right) || left.length !== right.length) + return false; + return left.every((value, index) => Equal(value, right[index])); + } + function TypedArray(left, right) { + if (!is_1.Is.TypedArray(right) || left.length !== right.length || globalThis.Object.getPrototypeOf(left).constructor.name !== globalThis.Object.getPrototypeOf(right).constructor.name) + return false; + return left.every((value, index) => Equal(value, right[index])); + } + function Value(left, right) { + return left === right; + } + function Equal(left, right) { + if (is_1.Is.Object(left)) { + return Object(left, right); + } + else if (is_1.Is.Date(left)) { + return Date(left, right); + } + else if (is_1.Is.TypedArray(left)) { + return TypedArray(left, right); + } + else if (is_1.Is.Array(left)) { + return Array(left, right); + } + else if (is_1.Is.Value(left)) { + return Value(left, right); + } + else { + throw new Error('ValueEquals: Unable to compare value'); + } + } + ValueEqual.Equal = Equal; +})(ValueEqual = exports.ValueEqual || (exports.ValueEqual = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/hash.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/hash.d.ts new file mode 100644 index 0000000..4c9116b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/hash.d.ts @@ -0,0 +1,8 @@ +export declare class ValueHashError extends Error { + readonly value: unknown; + constructor(value: unknown); +} +export declare namespace ValueHash { + /** Creates a FNV1A-64 non cryptographic hash of the given value */ + function Create(value: unknown): bigint; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/hash.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/hash.js new file mode 100644 index 0000000..9594420 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/hash.js @@ -0,0 +1,208 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/hash + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueHash = exports.ValueHashError = void 0; +class ValueHashError extends Error { + constructor(value) { + super(`Hash: Unable to hash value`); + this.value = value; + } +} +exports.ValueHashError = ValueHashError; +var ValueHash; +(function (ValueHash) { + let ByteMarker; + (function (ByteMarker) { + ByteMarker[ByteMarker["Undefined"] = 0] = "Undefined"; + ByteMarker[ByteMarker["Null"] = 1] = "Null"; + ByteMarker[ByteMarker["Boolean"] = 2] = "Boolean"; + ByteMarker[ByteMarker["Number"] = 3] = "Number"; + ByteMarker[ByteMarker["String"] = 4] = "String"; + ByteMarker[ByteMarker["Object"] = 5] = "Object"; + ByteMarker[ByteMarker["Array"] = 6] = "Array"; + ByteMarker[ByteMarker["Date"] = 7] = "Date"; + ByteMarker[ByteMarker["Uint8Array"] = 8] = "Uint8Array"; + ByteMarker[ByteMarker["Symbol"] = 9] = "Symbol"; + ByteMarker[ByteMarker["BigInt"] = 10] = "BigInt"; + })(ByteMarker || (ByteMarker = {})); + // ---------------------------------------------------- + // State + // ---------------------------------------------------- + let Hash = globalThis.BigInt('14695981039346656037'); + const [Prime, Size] = [globalThis.BigInt('1099511628211'), globalThis.BigInt('2') ** globalThis.BigInt('64')]; + const Bytes = globalThis.Array.from({ length: 256 }).map((_, i) => globalThis.BigInt(i)); + const F64 = new globalThis.Float64Array(1); + const F64In = new globalThis.DataView(F64.buffer); + const F64Out = new globalThis.Uint8Array(F64.buffer); + // ---------------------------------------------------- + // Guards + // ---------------------------------------------------- + function IsDate(value) { + return value instanceof globalThis.Date; + } + function IsUint8Array(value) { + return value instanceof globalThis.Uint8Array; + } + function IsArray(value) { + return globalThis.Array.isArray(value); + } + function IsBoolean(value) { + return typeof value === 'boolean'; + } + function IsNull(value) { + return value === null; + } + function IsNumber(value) { + return typeof value === 'number'; + } + function IsSymbol(value) { + return typeof value === 'symbol'; + } + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsObject(value) { + return typeof value === 'object' && value !== null && !IsArray(value) && !IsDate(value) && !IsUint8Array(value); + } + function IsString(value) { + return typeof value === 'string'; + } + function IsUndefined(value) { + return value === undefined; + } + // ---------------------------------------------------- + // Encoding + // ---------------------------------------------------- + function Array(value) { + FNV1A64(ByteMarker.Array); + for (const item of value) { + Visit(item); + } + } + function Boolean(value) { + FNV1A64(ByteMarker.Boolean); + FNV1A64(value ? 1 : 0); + } + function BigInt(value) { + FNV1A64(ByteMarker.BigInt); + F64In.setBigInt64(0, value); + for (const byte of F64Out) { + FNV1A64(byte); + } + } + function Date(value) { + FNV1A64(ByteMarker.Date); + Visit(value.getTime()); + } + function Null(value) { + FNV1A64(ByteMarker.Null); + } + function Number(value) { + FNV1A64(ByteMarker.Number); + F64In.setFloat64(0, value); + for (const byte of F64Out) { + FNV1A64(byte); + } + } + function Object(value) { + FNV1A64(ByteMarker.Object); + for (const key of globalThis.Object.keys(value).sort()) { + Visit(key); + Visit(value[key]); + } + } + function String(value) { + FNV1A64(ByteMarker.String); + for (let i = 0; i < value.length; i++) { + FNV1A64(value.charCodeAt(i)); + } + } + function Symbol(value) { + FNV1A64(ByteMarker.Symbol); + Visit(value.description); + } + function Uint8Array(value) { + FNV1A64(ByteMarker.Uint8Array); + for (let i = 0; i < value.length; i++) { + FNV1A64(value[i]); + } + } + function Undefined(value) { + return FNV1A64(ByteMarker.Undefined); + } + function Visit(value) { + if (IsArray(value)) { + Array(value); + } + else if (IsBoolean(value)) { + Boolean(value); + } + else if (IsBigInt(value)) { + BigInt(value); + } + else if (IsDate(value)) { + Date(value); + } + else if (IsNull(value)) { + Null(value); + } + else if (IsNumber(value)) { + Number(value); + } + else if (IsObject(value)) { + Object(value); + } + else if (IsString(value)) { + String(value); + } + else if (IsSymbol(value)) { + Symbol(value); + } + else if (IsUint8Array(value)) { + Uint8Array(value); + } + else if (IsUndefined(value)) { + Undefined(value); + } + else { + throw new ValueHashError(value); + } + } + function FNV1A64(byte) { + Hash = Hash ^ Bytes[byte]; + Hash = (Hash * Prime) % Size; + } + /** Creates a FNV1A-64 non cryptographic hash of the given value */ + function Create(value) { + Hash = globalThis.BigInt('14695981039346656037'); + Visit(value); + return Hash; + } + ValueHash.Create = Create; +})(ValueHash = exports.ValueHash || (exports.ValueHash = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/index.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/index.d.ts new file mode 100644 index 0000000..4ad0b77 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/index.d.ts @@ -0,0 +1,6 @@ +export { ValueError, ValueErrorIterator, ValueErrorType } from '../errors/index'; +export { ValueHash } from './hash'; +export { Edit, Insert, Update, Delete } from './delta'; +export { Mutable } from './mutate'; +export * from './pointer'; +export * from './value'; diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/index.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/index.js new file mode 100644 index 0000000..1f21de4 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/index.js @@ -0,0 +1,56 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Delete = exports.Update = exports.Insert = exports.Edit = exports.ValueHash = exports.ValueErrorType = exports.ValueErrorIterator = void 0; +var index_1 = require("../errors/index"); +Object.defineProperty(exports, "ValueErrorIterator", { enumerable: true, get: function () { return index_1.ValueErrorIterator; } }); +Object.defineProperty(exports, "ValueErrorType", { enumerable: true, get: function () { return index_1.ValueErrorType; } }); +var hash_1 = require("./hash"); +Object.defineProperty(exports, "ValueHash", { enumerable: true, get: function () { return hash_1.ValueHash; } }); +var delta_1 = require("./delta"); +Object.defineProperty(exports, "Edit", { enumerable: true, get: function () { return delta_1.Edit; } }); +Object.defineProperty(exports, "Insert", { enumerable: true, get: function () { return delta_1.Insert; } }); +Object.defineProperty(exports, "Update", { enumerable: true, get: function () { return delta_1.Update; } }); +Object.defineProperty(exports, "Delete", { enumerable: true, get: function () { return delta_1.Delete; } }); +__exportStar(require("./pointer"), exports); +__exportStar(require("./value"), exports); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/is.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/is.d.ts new file mode 100644 index 0000000..b78ba9c --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/is.d.ts @@ -0,0 +1,11 @@ +export type ValueType = null | undefined | Function | symbol | bigint | number | boolean | string; +export type ObjectType = Record; +export type TypedArrayType = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array; +export type ArrayType = unknown[]; +export declare namespace Is { + function Object(value: unknown): value is ObjectType; + function Date(value: unknown): value is Date; + function Array(value: unknown): value is ArrayType; + function Value(value: unknown): value is ValueType; + function TypedArray(value: unknown): value is TypedArrayType; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/is.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/is.js new file mode 100644 index 0000000..fbe1ed4 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/is.js @@ -0,0 +1,53 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Is = void 0; +var Is; +(function (Is) { + function Object(value) { + return value !== null && typeof value === 'object' && !globalThis.Array.isArray(value) && !ArrayBuffer.isView(value) && !(value instanceof globalThis.Date); + } + Is.Object = Object; + function Date(value) { + return value instanceof globalThis.Date; + } + Is.Date = Date; + function Array(value) { + return globalThis.Array.isArray(value) && !ArrayBuffer.isView(value); + } + Is.Array = Array; + function Value(value) { + return value === null || value === undefined || typeof value === 'function' || typeof value === 'symbol' || typeof value === 'bigint' || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string'; + } + Is.Value = Value; + function TypedArray(value) { + return ArrayBuffer.isView(value); + } + Is.TypedArray = TypedArray; +})(Is = exports.Is || (exports.Is = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/mutate.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/mutate.d.ts new file mode 100644 index 0000000..e45c07e --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/mutate.d.ts @@ -0,0 +1,13 @@ +export declare class ValueMutateTypeMismatchError extends Error { + constructor(); +} +export declare class ValueMutateInvalidRootMutationError extends Error { + constructor(); +} +export type Mutable = { + [key: string]: unknown; +} | unknown[]; +export declare namespace ValueMutate { + /** Performs a deep mutable value assignment while retaining internal references. */ + function Mutate(current: Mutable, next: Mutable): void; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/mutate.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/mutate.js new file mode 100644 index 0000000..4151596 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/mutate.js @@ -0,0 +1,121 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueMutate = exports.ValueMutateInvalidRootMutationError = exports.ValueMutateTypeMismatchError = void 0; +const is_1 = require("./is"); +const pointer_1 = require("./pointer"); +const clone_1 = require("./clone"); +class ValueMutateTypeMismatchError extends Error { + constructor() { + super('ValueMutate: Cannot assign due type mismatch of assignable values'); + } +} +exports.ValueMutateTypeMismatchError = ValueMutateTypeMismatchError; +class ValueMutateInvalidRootMutationError extends Error { + constructor() { + super('ValueMutate: Only object and array types can be mutated at the root level'); + } +} +exports.ValueMutateInvalidRootMutationError = ValueMutateInvalidRootMutationError; +var ValueMutate; +(function (ValueMutate) { + function Object(root, path, current, next) { + if (!is_1.Is.Object(current)) { + pointer_1.ValuePointer.Set(root, path, clone_1.ValueClone.Clone(next)); + } + else { + const currentKeys = globalThis.Object.keys(current); + const nextKeys = globalThis.Object.keys(next); + for (const currentKey of currentKeys) { + if (!nextKeys.includes(currentKey)) { + delete current[currentKey]; + } + } + for (const nextKey of nextKeys) { + if (!currentKeys.includes(nextKey)) { + current[nextKey] = null; + } + } + for (const nextKey of nextKeys) { + Visit(root, `${path}/${nextKey}`, current[nextKey], next[nextKey]); + } + } + } + function Array(root, path, current, next) { + if (!is_1.Is.Array(current)) { + pointer_1.ValuePointer.Set(root, path, clone_1.ValueClone.Clone(next)); + } + else { + for (let index = 0; index < next.length; index++) { + Visit(root, `${path}/${index}`, current[index], next[index]); + } + current.splice(next.length); + } + } + function TypedArray(root, path, current, next) { + if (is_1.Is.TypedArray(current) && current.length === next.length) { + for (let i = 0; i < current.length; i++) { + current[i] = next[i]; + } + } + else { + pointer_1.ValuePointer.Set(root, path, clone_1.ValueClone.Clone(next)); + } + } + function Value(root, path, current, next) { + if (current === next) + return; + pointer_1.ValuePointer.Set(root, path, next); + } + function Visit(root, path, current, next) { + if (is_1.Is.Array(next)) { + return Array(root, path, current, next); + } + else if (is_1.Is.TypedArray(next)) { + return TypedArray(root, path, current, next); + } + else if (is_1.Is.Object(next)) { + return Object(root, path, current, next); + } + else if (is_1.Is.Value(next)) { + return Value(root, path, current, next); + } + } + /** Performs a deep mutable value assignment while retaining internal references. */ + function Mutate(current, next) { + if (is_1.Is.TypedArray(current) || is_1.Is.Value(current) || is_1.Is.TypedArray(next) || is_1.Is.Value(next)) { + throw new ValueMutateInvalidRootMutationError(); + } + if ((is_1.Is.Object(current) && is_1.Is.Array(next)) || (is_1.Is.Array(current) && is_1.Is.Object(next))) { + throw new ValueMutateTypeMismatchError(); + } + Visit(current, '', current, next); + } + ValueMutate.Mutate = Mutate; +})(ValueMutate = exports.ValueMutate || (exports.ValueMutate = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/pointer.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/pointer.d.ts new file mode 100644 index 0000000..abae1e1 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/pointer.d.ts @@ -0,0 +1,24 @@ +export declare class ValuePointerRootSetError extends Error { + readonly value: unknown; + readonly path: string; + readonly update: unknown; + constructor(value: unknown, path: string, update: unknown); +} +export declare class ValuePointerRootDeleteError extends Error { + readonly value: unknown; + readonly path: string; + constructor(value: unknown, path: string); +} +/** Provides functionality to update values through RFC6901 string pointers */ +export declare namespace ValuePointer { + /** Formats the given pointer into navigable key components */ + function Format(pointer: string): IterableIterator; + /** Sets the value at the given pointer. If the value at the pointer does not exist it is created */ + function Set(value: any, pointer: string, update: unknown): void; + /** Deletes a value at the given pointer */ + function Delete(value: any, pointer: string): void; + /** Returns true if a value exists at the given pointer */ + function Has(value: any, pointer: string): boolean; + /** Gets the value at the given pointer */ + function Get(value: any, pointer: string): any; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/pointer.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/pointer.js new file mode 100644 index 0000000..981be63 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/pointer.js @@ -0,0 +1,142 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValuePointer = exports.ValuePointerRootDeleteError = exports.ValuePointerRootSetError = void 0; +class ValuePointerRootSetError extends Error { + constructor(value, path, update) { + super('ValuePointer: Cannot set root value'); + this.value = value; + this.path = path; + this.update = update; + } +} +exports.ValuePointerRootSetError = ValuePointerRootSetError; +class ValuePointerRootDeleteError extends Error { + constructor(value, path) { + super('ValuePointer: Cannot delete root value'); + this.value = value; + this.path = path; + } +} +exports.ValuePointerRootDeleteError = ValuePointerRootDeleteError; +/** Provides functionality to update values through RFC6901 string pointers */ +var ValuePointer; +(function (ValuePointer) { + function Escape(component) { + return component.indexOf('~') === -1 ? component : component.replace(/~1/g, '/').replace(/~0/g, '~'); + } + /** Formats the given pointer into navigable key components */ + function* Format(pointer) { + if (pointer === '') + return; + let [start, end] = [0, 0]; + for (let i = 0; i < pointer.length; i++) { + const char = pointer.charAt(i); + if (char === '/') { + if (i === 0) { + start = i + 1; + } + else { + end = i; + yield Escape(pointer.slice(start, end)); + start = i + 1; + } + } + else { + end = i; + } + } + yield Escape(pointer.slice(start)); + } + ValuePointer.Format = Format; + /** Sets the value at the given pointer. If the value at the pointer does not exist it is created */ + function Set(value, pointer, update) { + if (pointer === '') + throw new ValuePointerRootSetError(value, pointer, update); + let [owner, next, key] = [null, value, '']; + for (const component of Format(pointer)) { + if (next[component] === undefined) + next[component] = {}; + owner = next; + next = next[component]; + key = component; + } + owner[key] = update; + } + ValuePointer.Set = Set; + /** Deletes a value at the given pointer */ + function Delete(value, pointer) { + if (pointer === '') + throw new ValuePointerRootDeleteError(value, pointer); + let [owner, next, key] = [null, value, '']; + for (const component of Format(pointer)) { + if (next[component] === undefined || next[component] === null) + return; + owner = next; + next = next[component]; + key = component; + } + if (globalThis.Array.isArray(owner)) { + const index = parseInt(key); + owner.splice(index, 1); + } + else { + delete owner[key]; + } + } + ValuePointer.Delete = Delete; + /** Returns true if a value exists at the given pointer */ + function Has(value, pointer) { + if (pointer === '') + return true; + let [owner, next, key] = [null, value, '']; + for (const component of Format(pointer)) { + if (next[component] === undefined) + return false; + owner = next; + next = next[component]; + key = component; + } + return globalThis.Object.getOwnPropertyNames(owner).includes(key); + } + ValuePointer.Has = Has; + /** Gets the value at the given pointer */ + function Get(value, pointer) { + if (pointer === '') + return value; + let current = value; + for (const component of Format(pointer)) { + if (current[component] === undefined) + return undefined; + current = current[component]; + } + return current; + } + ValuePointer.Get = Get; +})(ValuePointer = exports.ValuePointer || (exports.ValuePointer = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/value.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/value.d.ts new file mode 100644 index 0000000..bf8d32f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/value.d.ts @@ -0,0 +1,39 @@ +import * as Types from '../typebox'; +import { ValueErrorIterator } from '../errors/index'; +import { Mutable } from './mutate'; +import { Edit } from './delta'; +/** Provides functions to perform structural updates to JavaScript values */ +export declare namespace Value { + /** Casts a value into a given type. The return value will retain as much information of the original value as possible. Cast will convert string, number, boolean and date values if a reasonable conversion is possible. */ + function Cast(schema: T, references: [...R], value: unknown): Types.Static; + /** Casts a value into a given type. The return value will retain as much information of the original value as possible. Cast will convert string, number, boolean and date values if a reasonable conversion is possible. */ + function Cast(schema: T, value: unknown): Types.Static; + /** Creates a value from the given type */ + function Create(schema: T, references: [...R]): Types.Static; + /** Creates a value from the given type */ + function Create(schema: T): Types.Static; + /** Returns true if the value matches the given type. */ + function Check(schema: T, references: [...R], value: unknown): value is Types.Static; + /** Returns true if the value matches the given type. */ + function Check(schema: T, value: unknown): value is Types.Static; + /** Converts any type mismatched values to their target type if a conversion is possible. */ + function Convert(schema: T, references: [...R], value: unknown): unknown; + /** Converts any type mismatched values to their target type if a conversion is possible. */ + function Convert(schema: T, value: unknown): unknown; + /** Returns a structural clone of the given value */ + function Clone(value: T): T; + /** Returns an iterator for each error in this value. */ + function Errors(schema: T, references: [...R], value: unknown): ValueErrorIterator; + /** Returns an iterator for each error in this value. */ + function Errors(schema: T, value: unknown): ValueErrorIterator; + /** Returns true if left and right values are structurally equal */ + function Equal(left: T, right: unknown): right is T; + /** Returns edits to transform the current value into the next value */ + function Diff(current: unknown, next: unknown): Edit[]; + /** Returns a FNV1A-64 non cryptographic hash of the given value */ + function Hash(value: unknown): bigint; + /** Returns a new value with edits applied to the given value */ + function Patch(current: unknown, edits: Edit[]): T; + /** Performs a deep mutable value assignment while retaining internal references. */ + function Mutate(current: Mutable, next: Mutable): void; +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/value.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/value.js new file mode 100644 index 0000000..e1ab919 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/@sinclair/typebox/value/value.js @@ -0,0 +1,99 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Value = void 0; +const index_1 = require("../errors/index"); +const mutate_1 = require("./mutate"); +const hash_1 = require("./hash"); +const equal_1 = require("./equal"); +const cast_1 = require("./cast"); +const clone_1 = require("./clone"); +const convert_1 = require("./convert"); +const create_1 = require("./create"); +const check_1 = require("./check"); +const delta_1 = require("./delta"); +/** Provides functions to perform structural updates to JavaScript values */ +var Value; +(function (Value) { + function Cast(...args) { + const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]]; + return cast_1.ValueCast.Cast(schema, references, value); + } + Value.Cast = Cast; + function Create(...args) { + const [schema, references] = args.length === 2 ? [args[0], args[1]] : [args[0], []]; + return create_1.ValueCreate.Create(schema, references); + } + Value.Create = Create; + function Check(...args) { + const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]]; + return check_1.ValueCheck.Check(schema, references, value); + } + Value.Check = Check; + function Convert(...args) { + const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]]; + return convert_1.ValueConvert.Convert(schema, references, value); + } + Value.Convert = Convert; + /** Returns a structural clone of the given value */ + function Clone(value) { + return clone_1.ValueClone.Clone(value); + } + Value.Clone = Clone; + function Errors(...args) { + const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]]; + return index_1.ValueErrors.Errors(schema, references, value); + } + Value.Errors = Errors; + /** Returns true if left and right values are structurally equal */ + function Equal(left, right) { + return equal_1.ValueEqual.Equal(left, right); + } + Value.Equal = Equal; + /** Returns edits to transform the current value into the next value */ + function Diff(current, next) { + return delta_1.ValueDelta.Diff(current, next); + } + Value.Diff = Diff; + /** Returns a FNV1A-64 non cryptographic hash of the given value */ + function Hash(value) { + return hash_1.ValueHash.Create(value); + } + Value.Hash = Hash; + /** Returns a new value with edits applied to the given value */ + function Patch(current, edits) { + return delta_1.ValueDelta.Patch(current, edits); + } + Value.Patch = Patch; + /** Performs a deep mutable value assignment while retaining internal references. */ + function Mutate(current, next) { + mutate_1.ValueMutate.Mutate(current, next); + } + Value.Mutate = Mutate; +})(Value = exports.Value || (exports.Value = {})); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/index.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/index.d.ts new file mode 100644 index 0000000..e0170aa --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/index.d.ts @@ -0,0 +1,167 @@ +declare namespace ansiStyles { + interface CSPair { + /** + The ANSI terminal control sequence for starting this style. + */ + readonly open: string; + + /** + The ANSI terminal control sequence for ending this style. + */ + readonly close: string; + } + + interface ColorBase { + /** + The ANSI terminal control sequence for ending this color. + */ + readonly close: string; + + ansi256(code: number): string; + + ansi16m(red: number, green: number, blue: number): string; + } + + interface Modifier { + /** + Resets the current color chain. + */ + readonly reset: CSPair; + + /** + Make text bold. + */ + readonly bold: CSPair; + + /** + Emitting only a small amount of light. + */ + readonly dim: CSPair; + + /** + Make text italic. (Not widely supported) + */ + readonly italic: CSPair; + + /** + Make text underline. (Not widely supported) + */ + readonly underline: CSPair; + + /** + Make text overline. + + Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash. + */ + readonly overline: CSPair; + + /** + Inverse background and foreground colors. + */ + readonly inverse: CSPair; + + /** + Prints the text, but makes it invisible. + */ + readonly hidden: CSPair; + + /** + Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: CSPair; + } + + interface ForegroundColor { + readonly black: CSPair; + readonly red: CSPair; + readonly green: CSPair; + readonly yellow: CSPair; + readonly blue: CSPair; + readonly cyan: CSPair; + readonly magenta: CSPair; + readonly white: CSPair; + + /** + Alias for `blackBright`. + */ + readonly gray: CSPair; + + /** + Alias for `blackBright`. + */ + readonly grey: CSPair; + + readonly blackBright: CSPair; + readonly redBright: CSPair; + readonly greenBright: CSPair; + readonly yellowBright: CSPair; + readonly blueBright: CSPair; + readonly cyanBright: CSPair; + readonly magentaBright: CSPair; + readonly whiteBright: CSPair; + } + + interface BackgroundColor { + readonly bgBlack: CSPair; + readonly bgRed: CSPair; + readonly bgGreen: CSPair; + readonly bgYellow: CSPair; + readonly bgBlue: CSPair; + readonly bgCyan: CSPair; + readonly bgMagenta: CSPair; + readonly bgWhite: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGray: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGrey: CSPair; + + readonly bgBlackBright: CSPair; + readonly bgRedBright: CSPair; + readonly bgGreenBright: CSPair; + readonly bgYellowBright: CSPair; + readonly bgBlueBright: CSPair; + readonly bgCyanBright: CSPair; + readonly bgMagentaBright: CSPair; + readonly bgWhiteBright: CSPair; + } + + interface ConvertColor { + /** + Convert from the RGB color space to the ANSI 256 color space. + + @param red - (`0...255`) + @param green - (`0...255`) + @param blue - (`0...255`) + */ + rgbToAnsi256(red: number, green: number, blue: number): number; + + /** + Convert from the RGB HEX color space to the RGB color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToRgb(hex: string): [red: number, green: number, blue: number]; + + /** + Convert from the RGB HEX color space to the ANSI 256 color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToAnsi256(hex: string): number; + } +} + +declare const ansiStyles: { + readonly modifier: ansiStyles.Modifier; + readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase; + readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase; + readonly codes: ReadonlyMap; +} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier & ansiStyles.ConvertColor; + +export = ansiStyles; diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/index.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/index.js new file mode 100644 index 0000000..a9eac58 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/index.js @@ -0,0 +1,164 @@ +'use strict'; + +const ANSI_BACKGROUND_OFFSET = 10; + +const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`; + +const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + overline: [53, 55], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi256 = wrapAnsi256(); + styles.color.ansi16m = wrapAnsi16m(); + styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET); + styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET); + + // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js + Object.defineProperties(styles, { + rgbToAnsi256: { + value: (red, green, blue) => { + // We use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (red === green && green === blue) { + if (red < 8) { + return 16; + } + + if (red > 248) { + return 231; + } + + return Math.round(((red - 8) / 247) * 24) + 232; + } + + return 16 + + (36 * Math.round(red / 255 * 5)) + + (6 * Math.round(green / 255 * 5)) + + Math.round(blue / 255 * 5); + }, + enumerable: false + }, + hexToRgb: { + value: hex => { + const matches = /(?[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16)); + if (!matches) { + return [0, 0, 0]; + } + + let {colorString} = matches.groups; + + if (colorString.length === 3) { + colorString = colorString.split('').map(character => character + character).join(''); + } + + const integer = Number.parseInt(colorString, 16); + + return [ + (integer >> 16) & 0xFF, + (integer >> 8) & 0xFF, + integer & 0xFF + ]; + }, + enumerable: false + }, + hexToAnsi256: { + value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)), + enumerable: false + } + }); + + return styles; +} + +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/license b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/package.json b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/package.json new file mode 100644 index 0000000..b3c89c9 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/package.json @@ -0,0 +1,52 @@ +{ + "name": "ansi-styles", + "version": "5.2.0", + "description": "ANSI escape codes for styling strings in the terminal", + "license": "MIT", + "repository": "chalk/ansi-styles", + "funding": "https://github.com/chalk/ansi-styles?sponsor=1", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "engines": { + "node": ">=10" + }, + "scripts": { + "test": "xo && ava && tsd", + "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "devDependencies": { + "ava": "^2.4.0", + "svg-term-cli": "^2.1.1", + "tsd": "^0.14.0", + "xo": "^0.37.1" + } +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/readme.md b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/readme.md new file mode 100644 index 0000000..7d12466 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/ansi-styles/readme.md @@ -0,0 +1,144 @@ +# ansi-styles + +> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + + + +## Install + +``` +$ npm install ansi-styles +``` + +## Usage + +```js +const style = require('ansi-styles'); + +console.log(`${style.green.open}Hello world!${style.green.close}`); + + +// Color conversion between 256/truecolor +// NOTE: When converting from truecolor to 256 colors, the original color +// may be degraded to fit the new color palette. This means terminals +// that do not support 16 million colors will best-match the +// original color. +console.log(`${style.color.ansi256(style.rgbToAnsi256(199, 20, 250))}Hello World${style.color.close}`) +console.log(`${style.color.ansi16m(...style.hexToRgb('#abcdef'))}Hello World${style.color.close}`) +``` + +## API + +Each style has an `open` and `close` property. + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(Not widely supported)* +- `underline` +- `overline` *Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash.* +- `inverse` +- `hidden` +- `strikethrough` *(Not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `blackBright` (alias: `gray`, `grey`) +- `redBright` +- `greenBright` +- `yellowBright` +- `blueBright` +- `magentaBright` +- `cyanBright` +- `whiteBright` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` +- `bgBlackBright` (alias: `bgGray`, `bgGrey`) +- `bgRedBright` +- `bgGreenBright` +- `bgYellowBright` +- `bgBlueBright` +- `bgMagentaBright` +- `bgCyanBright` +- `bgWhiteBright` + +## Advanced usage + +By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `style.modifier` +- `style.color` +- `style.bgColor` + +###### Example + +```js +console.log(style.color.green.open); +``` + +Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. + +###### Example + +```js +console.log(style.codes.get(36)); +//=> 39 +``` + +## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) + +`ansi-styles` allows converting between various color formats and ANSI escapes, with support for 256 and 16 million colors. + +The following color spaces from `color-convert` are supported: + +- `rgb` +- `hex` +- `ansi256` + +To use these, call the associated conversion function with the intended output, for example: + +```js +style.color.ansi256(style.rgbToAnsi256(100, 200, 15)); // RGB to 256 color ansi foreground code +style.bgColor.ansi256(style.hexToAnsi256('#C0FFEE')); // HEX to 256 color ansi foreground code + +style.color.ansi16m(100, 200, 15); // RGB to 16 million color foreground code +style.bgColor.ansi16m(...style.hexToRgb('#C0FFEE')); // Hex (RGB) to 16 million color foreground code +``` + +## Related + +- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + +## For enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/LICENSE b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/LICENSE new file mode 100644 index 0000000..743af99 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/LICENSE @@ -0,0 +1,44 @@ +MIT License + +Copyright (c) Pooya Parsa - Daniel Roe + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/README.md b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/README.md new file mode 100644 index 0000000..a2af0fd --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/README.md @@ -0,0 +1,69 @@ +# 🛣️ pathe + +> Universal filesystem path utils + +[![version][npm-v-src]][npm-v-href] +[![downloads][npm-d-src]][npm-d-href] +[![size][size-src]][size-href] + +> **❓ Why** +> +> For [historical reasons](https://docs.microsoft.com/en-us/archive/blogs/larryosterman/why-is-the-dos-path-character), windows followed MS-DOS and using backslash for separating paths rather than slash used for macOS, Linux, and other Posix operating systems. Nowadays, [Windows](https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN) supports both Slash and Backslash for paths. [Node.js's built in `path` module](https://nodejs.org/api/path.html) in the default operation of the path module varies based on the operating system on which a Node.js application is running. Specifically, when running on a Windows operating system, the path module will assume that Windows-style paths are being used. **This makes inconsistent code behavior between Windows and POSIX.** +> Compared to popular [upath](https://github.com/anodynos/upath), pathe is providing **identical exports** of Node.js with normalization on **all operations** and written in modern **ESM/Typescript** and has **no dependency on Node.js**! + +This package is a drop-in replacement of the Node.js's [path module](https://nodejs.org/api/path.html) module and ensures paths are normalized with slash `/` and work in environments including Node.js. + +## 💿 Usage + +Install using npm or yarn: + +```bash +# npm +npm i pathe + +# yarn +yarn add pathe + +# pnpm +pnpm i pathe +``` + +Import: + +```js +// ESM / Typescript +import { resolve } from 'pathe' + +// CommonJS +const { resolve } = require('pathe') +``` + +Read more about path utils from [Node.js documentation](https://nodejs.org/api/path.html) and rest assured behavior is ALWAYS like POSIX regardless of your input paths format and running platform! + +### Extra utilties + +Pathe exports some extra utilities that do not exist in standard Node.js [path module](https://nodejs.org/api/path.html). +In order to use them, you can import from `pathe/utils` subpath: + +```js +import { filename, normalizeAliases, resolveAlias } from 'pathe/utils' +``` + +## License + +MIT. Made with 💖 + +Some code used from Node.js project. See [LICENSE](./LICENSE). + + +[npm-v-src]: https://img.shields.io/npm/v/pathe?style=flat-square +[npm-v-href]: https://npmjs.com/package/pathe + +[npm-d-src]: https://img.shields.io/npm/dm/pathe?style=flat-square +[npm-d-href]: https://npmjs.com/package/pathe + +[github-actions-src]: https://img.shields.io/github/workflow/status/unjs/pathe/ci/main?style=flat-square +[github-actions-href]: https://github.com/unjs/pathe/actions?query=workflow%3Aci + +[size-src]: https://packagephobia.now.sh/badge?p=pathe +[size-href]: https://packagephobia.now.sh/result?p=pathe diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/package.json b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/package.json new file mode 100644 index 0000000..1b14f7d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/package.json @@ -0,0 +1,48 @@ +{ + "name": "pathe", + "version": "1.1.2", + "description": "Universal filesystem path utils", + "repository": "unjs/pathe", + "license": "MIT", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./utils": { + "types": "./dist/utils.d.ts", + "import": "./dist/utils.mjs", + "require": "./dist/utils.cjs" + } + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.ts", + "files": [ + "dist", + "utils.d.ts" + ], + "devDependencies": { + "@types/node": "^20.10.8", + "@vitest/coverage-v8": "^1.1.3", + "changelogen": "^0.5.5", + "eslint": "^8.56.0", + "eslint-config-unjs": "^0.2.1", + "jiti": "^1.21.0", + "prettier": "^3.1.1", + "typescript": "^5.3.3", + "unbuild": "^2.0.0", + "vitest": "^1.1.3" + }, + "packageManager": "pnpm@8.14.0", + "scripts": { + "build": "unbuild", + "dev": "vitest", + "lint": "eslint --ext .ts . && prettier -c src test", + "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test -w", + "release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags", + "test": "pnpm lint && vitest run --coverage", + "test:types": "tsc --noEmit" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/utils.d.ts b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/utils.d.ts new file mode 100644 index 0000000..59cabd3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pathe/utils.d.ts @@ -0,0 +1 @@ +export * from "./dist/utils"; diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/LICENSE b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/LICENSE new file mode 100644 index 0000000..b93be90 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/README.md b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/README.md new file mode 100644 index 0000000..0cc1bcf --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/README.md @@ -0,0 +1,463 @@ +# pretty-format + +Stringify any JavaScript value. + +- Serialize built-in JavaScript types. +- Serialize application-specific data types with built-in or user-defined plugins. + +## Installation + +```sh +$ yarn add pretty-format +``` + +## Usage + +```js +const {format: prettyFormat} = require('pretty-format'); // CommonJS +``` + +```js +import {format as prettyFormat} from 'pretty-format'; // ES2015 modules +``` + +```js +const val = {object: {}}; +val.circularReference = val; +val[Symbol('foo')] = 'foo'; +val.map = new Map([['prop', 'value']]); +val.array = [-0, Infinity, NaN]; + +console.log(prettyFormat(val)); +/* +Object { + "array": Array [ + -0, + Infinity, + NaN, + ], + "circularReference": [Circular], + "map": Map { + "prop" => "value", + }, + "object": Object {}, + Symbol(foo): "foo", +} +*/ +``` + +## Usage with options + +```js +function onClick() {} + +console.log(prettyFormat(onClick)); +/* +[Function onClick] +*/ + +const options = { + printFunctionName: false, +}; +console.log(prettyFormat(onClick, options)); +/* +[Function] +*/ +``` + + +| key | type | default | description | +| :-------------------- | :--------------- | :---------- | :-------------------------------------------------------------------------------------- | +| `callToJSON` | `boolean` | `true` | call `toJSON` method (if it exists) on objects | +| `compareKeys` | `function\|null` | `undefined` | compare function used when sorting object keys, `null` can be used to skip over sorting | +| `escapeRegex` | `boolean` | `false` | escape special characters in regular expressions | +| `escapeString` | `boolean` | `true` | escape special characters in strings | +| `highlight` | `boolean` | `false` | highlight syntax with colors in terminal (some plugins) | +| `indent` | `number` | `2` | spaces in each level of indentation | +| `maxDepth` | `number` | `Infinity` | levels to print in arrays, objects, elements, and so on | +| `maxWidth` | `number` | `Infinity` | number of elements to print in arrays, sets, and so on | +| `min` | `boolean` | `false` | minimize added space: no indentation nor line breaks | +| `plugins` | `array` | `[]` | plugins to serialize application-specific data types | +| `printBasicPrototype` | `boolean` | `false` | print the prototype for plain objects and arrays | +| `printFunctionName` | `boolean` | `true` | include or omit the name of a function | +| `theme` | `object` | | colors to highlight syntax in terminal | + +Property values of `theme` are from [ansi-styles colors](https://github.com/chalk/ansi-styles#colors) + +```js +const DEFAULT_THEME = { + comment: 'gray', + content: 'reset', + prop: 'yellow', + tag: 'cyan', + value: 'green', +}; +``` + +## Usage with plugins + +The `pretty-format` package provides some built-in plugins, including: + +- `ReactElement` for elements from `react` +- `ReactTestComponent` for test objects from `react-test-renderer` + +```js +// CommonJS +const React = require('react'); +const renderer = require('react-test-renderer'); +const {format: prettyFormat, plugins} = require('pretty-format'); + +const {ReactElement, ReactTestComponent} = plugins; +``` + +```js +// ES2015 modules and destructuring assignment +import React from 'react'; +import renderer from 'react-test-renderer'; +import {plugins, format as prettyFormat} from 'pretty-format'; + +const {ReactElement, ReactTestComponent} = plugins; +``` + +```js +const onClick = () => {}; +const element = React.createElement('button', {onClick}, 'Hello World'); + +const formatted1 = prettyFormat(element, { + plugins: [ReactElement], + printFunctionName: false, +}); +const formatted2 = prettyFormat(renderer.create(element).toJSON(), { + plugins: [ReactTestComponent], + printFunctionName: false, +}); +/* + +*/ +``` + +## Usage in Jest + +For snapshot tests, Jest uses `pretty-format` with options that include some of its built-in plugins. For this purpose, plugins are also known as **snapshot serializers**. + +To serialize application-specific data types, you can add modules to `devDependencies` of a project, and then: + +In an **individual** test file, you can add a module as follows. It precedes any modules from Jest configuration. + +```js +import serializer from 'my-serializer-module'; +expect.addSnapshotSerializer(serializer); + +// tests which have `expect(value).toMatchSnapshot()` assertions +``` + +For **all** test files, you can specify modules in Jest configuration. They precede built-in plugins for React, HTML, and Immutable.js data types. For example, in a `package.json` file: + +```json +{ + "jest": { + "snapshotSerializers": ["my-serializer-module"] + } +} +``` + +## Writing plugins + +A plugin is a JavaScript object. + +If `options` has a `plugins` array: for the first plugin whose `test(val)` method returns a truthy value, then `prettyFormat(val, options)` returns the result from either: + +- `serialize(val, …)` method of the **improved** interface (available in **version 21** or later) +- `print(val, …)` method of the **original** interface (if plugin does not have `serialize` method) + +### test + +Write `test` so it can receive `val` argument of any type. To serialize **objects** which have certain properties, then a guarded expression like `val != null && …` or more concise `val && …` prevents the following errors: + +- `TypeError: Cannot read property 'whatever' of null` +- `TypeError: Cannot read property 'whatever' of undefined` + +For example, `test` method of built-in `ReactElement` plugin: + +```js +const elementSymbol = Symbol.for('react.element'); +const test = val => val && val.$$typeof === elementSymbol; +``` + +Pay attention to efficiency in `test` because `pretty-format` calls it often. + +### serialize + +The **improved** interface is available in **version 21** or later. + +Write `serialize` to return a string, given the arguments: + +- `val` which “passed the test” +- unchanging `config` object: derived from `options` +- current `indentation` string: concatenate to `indent` from `config` +- current `depth` number: compare to `maxDepth` from `config` +- current `refs` array: find circular references in objects +- `printer` callback function: serialize children + +### config + + +| key | type | description | +| :------------------ | :--------------- | :-------------------------------------------------------------------------------------- | +| `callToJSON` | `boolean` | call `toJSON` method (if it exists) on objects | +| `compareKeys` | `function\|null` | compare function used when sorting object keys, `null` can be used to skip over sorting | +| `colors` | `Object` | escape codes for colors to highlight syntax | +| `escapeRegex` | `boolean` | escape special characters in regular expressions | +| `escapeString` | `boolean` | escape special characters in strings | +| `indent` | `string` | spaces in each level of indentation | +| `maxDepth` | `number` | levels to print in arrays, objects, elements, and so on | +| `min` | `boolean` | minimize added space: no indentation nor line breaks | +| `plugins` | `array` | plugins to serialize application-specific data types | +| `printFunctionName` | `boolean` | include or omit the name of a function | +| `spacingInner` | `string` | spacing to separate items in a list | +| `spacingOuter` | `string` | spacing to enclose a list of items | + +Each property of `colors` in `config` corresponds to a property of `theme` in `options`: + +- the key is the same (for example, `tag`) +- the value in `colors` is a object with `open` and `close` properties whose values are escape codes from [ansi-styles](https://github.com/chalk/ansi-styles) for the color value in `theme` (for example, `'cyan'`) + +Some properties in `config` are derived from `min` in `options`: + +- `spacingInner` and `spacingOuter` are **newline** if `min` is `false` +- `spacingInner` is **space** and `spacingOuter` is **empty string** if `min` is `true` + +### Example of serialize and test + +This plugin is a pattern you can apply to serialize composite data types. Side note: `pretty-format` does not need a plugin to serialize arrays. + +```js +// We reused more code when we factored out a function for child items +// that is independent of depth, name, and enclosing punctuation (see below). +const SEPARATOR = ','; +function serializeItems(items, config, indentation, depth, refs, printer) { + if (items.length === 0) { + return ''; + } + const indentationItems = indentation + config.indent; + return ( + config.spacingOuter + + items + .map( + item => + indentationItems + + printer(item, config, indentationItems, depth, refs), // callback + ) + .join(SEPARATOR + config.spacingInner) + + (config.min ? '' : SEPARATOR) + // following the last item + config.spacingOuter + + indentation + ); +} + +const plugin = { + test(val) { + return Array.isArray(val); + }, + serialize(array, config, indentation, depth, refs, printer) { + const name = array.constructor.name; + return ++depth > config.maxDepth + ? `[${name}]` + : `${config.min ? '' : `${name} `}[${serializeItems( + array, + config, + indentation, + depth, + refs, + printer, + )}]`; + }, +}; +``` + +```js +const val = { + filter: 'completed', + items: [ + { + text: 'Write test', + completed: true, + }, + { + text: 'Write serialize', + completed: true, + }, + ], +}; +``` + +```js +console.log( + prettyFormat(val, { + plugins: [plugin], + }), +); +/* +Object { + "filter": "completed", + "items": Array [ + Object { + "completed": true, + "text": "Write test", + }, + Object { + "completed": true, + "text": "Write serialize", + }, + ], +} +*/ +``` + +```js +console.log( + prettyFormat(val, { + indent: 4, + plugins: [plugin], + }), +); +/* +Object { + "filter": "completed", + "items": Array [ + Object { + "completed": true, + "text": "Write test", + }, + Object { + "completed": true, + "text": "Write serialize", + }, + ], +} +*/ +``` + +```js +console.log( + prettyFormat(val, { + maxDepth: 1, + plugins: [plugin], + }), +); +/* +Object { + "filter": "completed", + "items": [Array], +} +*/ +``` + +```js +console.log( + prettyFormat(val, { + min: true, + plugins: [plugin], + }), +); +/* +{"filter": "completed", "items": [{"completed": true, "text": "Write test"}, {"completed": true, "text": "Write serialize"}]} +*/ +``` + +### print + +The **original** interface is adequate for plugins: + +- that **do not** depend on options other than `highlight` or `min` +- that **do not** depend on `depth` or `refs` in recursive traversal, and +- if values either + - do **not** require indentation, or + - do **not** occur as children of JavaScript data structures (for example, array) + +Write `print` to return a string, given the arguments: + +- `val` which “passed the test” +- current `printer(valChild)` callback function: serialize children +- current `indenter(lines)` callback function: indent lines at the next level +- unchanging `config` object: derived from `options` +- unchanging `colors` object: derived from `options` + +The 3 properties of `config` are `min` in `options` and: + +- `spacing` and `edgeSpacing` are **newline** if `min` is `false` +- `spacing` is **space** and `edgeSpacing` is **empty string** if `min` is `true` + +Each property of `colors` corresponds to a property of `theme` in `options`: + +- the key is the same (for example, `tag`) +- the value in `colors` is a object with `open` and `close` properties whose values are escape codes from [ansi-styles](https://github.com/chalk/ansi-styles) for the color value in `theme` (for example, `'cyan'`) + +### Example of print and test + +This plugin prints functions with the **number of named arguments** excluding rest argument. + +```js +const plugin = { + print(val) { + return `[Function ${val.name || 'anonymous'} ${val.length}]`; + }, + test(val) { + return typeof val === 'function'; + }, +}; +``` + +```js +const val = { + onClick(event) {}, + render() {}, +}; + +prettyFormat(val, { + plugins: [plugin], +}); +/* +Object { + "onClick": [Function onClick 1], + "render": [Function render 0], +} +*/ + +prettyFormat(val); +/* +Object { + "onClick": [Function onClick], + "render": [Function render], +} +*/ +``` + +This plugin **ignores** the `printFunctionName` option. That limitation of the original `print` interface is a reason to use the improved `serialize` interface, described above. + +```js +prettyFormat(val, { + plugins: [pluginOld], + printFunctionName: false, +}); +/* +Object { + "onClick": [Function onClick 1], + "render": [Function render 0], +} +*/ + +prettyFormat(val, { + printFunctionName: false, +}); +/* +Object { + "onClick": [Function], + "render": [Function], +} +*/ +``` diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/package.json b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/package.json new file mode 100644 index 0000000..23e5fc7 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/pretty-format/package.json @@ -0,0 +1,43 @@ +{ + "name": "pretty-format", + "version": "29.7.0", + "repository": { + "type": "git", + "url": "https://github.com/jestjs/jest.git", + "directory": "packages/pretty-format" + }, + "license": "MIT", + "description": "Stringify any JavaScript value.", + "main": "./build/index.js", + "types": "./build/index.d.ts", + "exports": { + ".": { + "types": "./build/index.d.ts", + "default": "./build/index.js" + }, + "./package.json": "./package.json" + }, + "author": "James Kyle ", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "devDependencies": { + "@types/react": "^17.0.3", + "@types/react-is": "^18.0.0", + "@types/react-test-renderer": "17.0.2", + "immutable": "^4.0.0", + "jest-util": "^29.7.0", + "react": "17.0.2", + "react-dom": "^17.0.1", + "react-test-renderer": "17.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "4e56991693da7cd4c3730dc3579a1dd1403ee630" +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/LICENSE b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/LICENSE new file mode 100644 index 0000000..b96dcb0 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/README.md b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/README.md new file mode 100644 index 0000000..d255977 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/README.md @@ -0,0 +1,104 @@ +# `react-is` + +This package allows you to test arbitrary values and see if they're a particular React element type. + +## Installation + +```sh +# Yarn +yarn add react-is + +# NPM +npm install react-is +``` + +## Usage + +### Determining if a Component is Valid + +```js +import React from "react"; +import * as ReactIs from "react-is"; + +class ClassComponent extends React.Component { + render() { + return React.createElement("div"); + } +} + +const FunctionComponent = () => React.createElement("div"); + +const ForwardRefComponent = React.forwardRef((props, ref) => + React.createElement(Component, { forwardedRef: ref, ...props }) +); + +const Context = React.createContext(false); + +ReactIs.isValidElementType("div"); // true +ReactIs.isValidElementType(ClassComponent); // true +ReactIs.isValidElementType(FunctionComponent); // true +ReactIs.isValidElementType(ForwardRefComponent); // true +ReactIs.isValidElementType(Context.Provider); // true +ReactIs.isValidElementType(Context.Consumer); // true +ReactIs.isValidElementType(React.createFactory("div")); // true +``` + +### Determining an Element's Type + +#### Context + +```js +import React from "react"; +import * as ReactIs from 'react-is'; + +const ThemeContext = React.createContext("blue"); + +ReactIs.isContextConsumer(); // true +ReactIs.isContextProvider(); // true +ReactIs.typeOf() === ReactIs.ContextProvider; // true +ReactIs.typeOf() === ReactIs.ContextConsumer; // true +``` + +#### Element + +```js +import React from "react"; +import * as ReactIs from 'react-is'; + +ReactIs.isElement(
); // true +ReactIs.typeOf(
) === ReactIs.Element; // true +``` + +#### Fragment + +```js +import React from "react"; +import * as ReactIs from 'react-is'; + +ReactIs.isFragment(<>); // true +ReactIs.typeOf(<>) === ReactIs.Fragment; // true +``` + +#### Portal + +```js +import React from "react"; +import ReactDOM from "react-dom"; +import * as ReactIs from 'react-is'; + +const div = document.createElement("div"); +const portal = ReactDOM.createPortal(
, div); + +ReactIs.isPortal(portal); // true +ReactIs.typeOf(portal) === ReactIs.Portal; // true +``` + +#### StrictMode + +```js +import React from "react"; +import * as ReactIs from 'react-is'; + +ReactIs.isStrictMode(); // true +ReactIs.typeOf() === ReactIs.StrictMode; // true +``` diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/cjs/react-is.development.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/cjs/react-is.development.js new file mode 100644 index 0000000..6ed9c03 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/cjs/react-is.development.js @@ -0,0 +1,221 @@ +/** + * @license React + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +if (process.env.NODE_ENV !== "production") { + (function() { +'use strict'; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. +var REACT_ELEMENT_TYPE = Symbol.for('react.element'); +var REACT_PORTAL_TYPE = Symbol.for('react.portal'); +var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); +var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); +var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); +var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); +var REACT_CONTEXT_TYPE = Symbol.for('react.context'); +var REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context'); +var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); +var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); +var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); +var REACT_MEMO_TYPE = Symbol.for('react.memo'); +var REACT_LAZY_TYPE = Symbol.for('react.lazy'); +var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen'); + +// ----------------------------------------------------------------------------- + +var enableScopeAPI = false; // Experimental Create Event Handle API. +var enableCacheElement = false; +var enableTransitionTracing = false; // No known bugs, but needs performance testing + +var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber +// stuff. Intended to enable React core members to more easily debug scheduling +// issues in DEV builds. + +var enableDebugTracing = false; // Track which Fiber(s) schedule render work. + +var REACT_MODULE_REFERENCE; + +{ + REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); +} + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { + return true; + } + } + + return false; +} + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + case REACT_SUSPENSE_LIST_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_SERVER_CONTEXT_TYPE: + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; +var SuspenseList = REACT_SUSPENSE_LIST_TYPE; +var hasWarnedAboutDeprecatedIsAsyncMode = false; +var hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated + +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); + } + } + + return false; +} +function isConcurrentMode(object) { + { + if (!hasWarnedAboutDeprecatedIsConcurrentMode) { + hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); + } + } + + return false; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} +function isSuspenseList(object) { + return typeOf(object) === REACT_SUSPENSE_LIST_TYPE; +} + +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.SuspenseList = SuspenseList; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; +exports.isSuspenseList = isSuspenseList; +exports.isValidElementType = isValidElementType; +exports.typeOf = typeOf; + })(); +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/cjs/react-is.production.min.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/cjs/react-is.production.min.js new file mode 100644 index 0000000..f2322cb --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/cjs/react-is.production.min.js @@ -0,0 +1,14 @@ +/** + * @license React + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +'use strict';var b=Symbol.for("react.element"),c=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),e=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),g=Symbol.for("react.provider"),h=Symbol.for("react.context"),k=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),n=Symbol.for("react.suspense_list"),p=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),t=Symbol.for("react.offscreen"),u;u=Symbol.for("react.module.reference"); +function v(a){if("object"===typeof a&&null!==a){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports.ContextConsumer=h;exports.ContextProvider=g;exports.Element=b;exports.ForwardRef=l;exports.Fragment=d;exports.Lazy=q;exports.Memo=p;exports.Portal=c;exports.Profiler=f;exports.StrictMode=e;exports.Suspense=m; +exports.SuspenseList=n;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return v(a)===h};exports.isContextProvider=function(a){return v(a)===g};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return v(a)===l};exports.isFragment=function(a){return v(a)===d};exports.isLazy=function(a){return v(a)===q};exports.isMemo=function(a){return v(a)===p}; +exports.isPortal=function(a){return v(a)===c};exports.isProfiler=function(a){return v(a)===f};exports.isStrictMode=function(a){return v(a)===e};exports.isSuspense=function(a){return v(a)===m};exports.isSuspenseList=function(a){return v(a)===n}; +exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===d||a===f||a===e||a===m||a===n||a===t||"object"===typeof a&&null!==a&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||void 0!==a.getModuleId)?!0:!1};exports.typeOf=v; diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/index.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/index.js new file mode 100644 index 0000000..3ae098d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/index.js @@ -0,0 +1,7 @@ +'use strict'; + +if (process.env.NODE_ENV === 'production') { + module.exports = require('./cjs/react-is.production.min.js'); +} else { + module.exports = require('./cjs/react-is.development.js'); +} diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/package.json b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/package.json new file mode 100644 index 0000000..12b24a2 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/package.json @@ -0,0 +1,26 @@ +{ + "name": "react-is", + "version": "18.3.1", + "description": "Brand checking of React Elements.", + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/facebook/react.git", + "directory": "packages/react-is" + }, + "keywords": [ + "react" + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/facebook/react/issues" + }, + "homepage": "https://reactjs.org/", + "files": [ + "LICENSE", + "README.md", + "index.js", + "cjs/", + "umd/" + ] +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/umd/react-is.development.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/umd/react-is.development.js new file mode 100644 index 0000000..1257aef --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/umd/react-is.development.js @@ -0,0 +1,220 @@ +/** + * @license React + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.ReactIs = {})); +}(this, (function (exports) { 'use strict'; + + // ATTENTION + // When adding new symbols to this file, + // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' + // The Symbol used to tag the ReactElement-like types. + var REACT_ELEMENT_TYPE = Symbol.for('react.element'); + var REACT_PORTAL_TYPE = Symbol.for('react.portal'); + var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); + var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); + var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); + var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); + var REACT_CONTEXT_TYPE = Symbol.for('react.context'); + var REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context'); + var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); + var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); + var REACT_MEMO_TYPE = Symbol.for('react.memo'); + var REACT_LAZY_TYPE = Symbol.for('react.lazy'); + var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen'); + + // ----------------------------------------------------------------------------- + + var enableScopeAPI = false; // Experimental Create Event Handle API. + var enableCacheElement = false; + var enableTransitionTracing = false; // No known bugs, but needs performance testing + + var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber + // stuff. Intended to enable React core members to more easily debug scheduling + // issues in DEV builds. + + var enableDebugTracing = false; // Track which Fiber(s) schedule render work. + + var REACT_MODULE_REFERENCE; + + { + REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); + } + + function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { + return true; + } + } + + return false; + } + + function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + case REACT_SUSPENSE_LIST_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_SERVER_CONTEXT_TYPE: + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; + } + var ContextConsumer = REACT_CONTEXT_TYPE; + var ContextProvider = REACT_PROVIDER_TYPE; + var Element = REACT_ELEMENT_TYPE; + var ForwardRef = REACT_FORWARD_REF_TYPE; + var Fragment = REACT_FRAGMENT_TYPE; + var Lazy = REACT_LAZY_TYPE; + var Memo = REACT_MEMO_TYPE; + var Portal = REACT_PORTAL_TYPE; + var Profiler = REACT_PROFILER_TYPE; + var StrictMode = REACT_STRICT_MODE_TYPE; + var Suspense = REACT_SUSPENSE_TYPE; + var SuspenseList = REACT_SUSPENSE_LIST_TYPE; + var hasWarnedAboutDeprecatedIsAsyncMode = false; + var hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated + + function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); + } + } + + return false; + } + function isConcurrentMode(object) { + { + if (!hasWarnedAboutDeprecatedIsConcurrentMode) { + hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); + } + } + + return false; + } + function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; + } + function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; + } + function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; + } + function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; + } + function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; + } + function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; + } + function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; + } + function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; + } + function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; + } + function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; + } + function isSuspenseList(object) { + return typeOf(object) === REACT_SUSPENSE_LIST_TYPE; + } + + exports.ContextConsumer = ContextConsumer; + exports.ContextProvider = ContextProvider; + exports.Element = Element; + exports.ForwardRef = ForwardRef; + exports.Fragment = Fragment; + exports.Lazy = Lazy; + exports.Memo = Memo; + exports.Portal = Portal; + exports.Profiler = Profiler; + exports.StrictMode = StrictMode; + exports.Suspense = Suspense; + exports.SuspenseList = SuspenseList; + exports.isAsyncMode = isAsyncMode; + exports.isConcurrentMode = isConcurrentMode; + exports.isContextConsumer = isContextConsumer; + exports.isContextProvider = isContextProvider; + exports.isElement = isElement; + exports.isForwardRef = isForwardRef; + exports.isFragment = isFragment; + exports.isLazy = isLazy; + exports.isMemo = isMemo; + exports.isPortal = isPortal; + exports.isProfiler = isProfiler; + exports.isStrictMode = isStrictMode; + exports.isSuspense = isSuspense; + exports.isSuspenseList = isSuspenseList; + exports.isValidElementType = isValidElementType; + exports.typeOf = typeOf; + +}))); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/umd/react-is.production.min.js b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/umd/react-is.production.min.js new file mode 100644 index 0000000..84a9cde --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/node_modules/react-is/umd/react-is.production.min.js @@ -0,0 +1,15 @@ +/** + * @license React + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +(function(){'use strict';(function(b,c){"object"===typeof exports&&"undefined"!==typeof module?c(exports):"function"===typeof define&&define.amd?define(["exports"],c):(b=b||self,c(b.ReactIs={}))})(this,function(b){function c(a){if("object"===typeof a&&null!==a){var b=a.$$typeof;switch(b){case q:switch(a=a.type,a){case d:case e:case f:case g:case h:return a;default:switch(a=a&&a.$$typeof,a){case t:case k:case l:case m:case n:case p:return a;default:return b}}case r:return b}}}var q=Symbol.for("react.element"), +r=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),f=Symbol.for("react.strict_mode"),e=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),k=Symbol.for("react.context"),t=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),h=Symbol.for("react.suspense_list"),n=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),u=Symbol.for("react.offscreen");var v=Symbol.for("react.module.reference");b.ContextConsumer=k;b.ContextProvider=p;b.Element= +q;b.ForwardRef=l;b.Fragment=d;b.Lazy=m;b.Memo=n;b.Portal=r;b.Profiler=e;b.StrictMode=f;b.Suspense=g;b.SuspenseList=h;b.isAsyncMode=function(a){return!1};b.isConcurrentMode=function(a){return!1};b.isContextConsumer=function(a){return c(a)===k};b.isContextProvider=function(a){return c(a)===p};b.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===q};b.isForwardRef=function(a){return c(a)===l};b.isFragment=function(a){return c(a)===d};b.isLazy=function(a){return c(a)===m};b.isMemo= +function(a){return c(a)===n};b.isPortal=function(a){return c(a)===r};b.isProfiler=function(a){return c(a)===e};b.isStrictMode=function(a){return c(a)===f};b.isSuspense=function(a){return c(a)===g};b.isSuspenseList=function(a){return c(a)===h};b.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===d||a===e||a===f||a===g||a===h||a===u||"object"===typeof a&&null!==a&&(a.$$typeof===m||a.$$typeof===n||a.$$typeof===p||a.$$typeof===k||a.$$typeof===l||a.$$typeof===v||void 0!== +a.getModuleId)?!0:!1};b.typeOf=c}); +})(); diff --git a/sdk/typescript/node_modules/@vitest/snapshot/package.json b/sdk/typescript/node_modules/@vitest/snapshot/package.json new file mode 100644 index 0000000..6c58b56 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/snapshot/package.json @@ -0,0 +1,54 @@ +{ + "name": "@vitest/snapshot", + "type": "module", + "version": "1.6.1", + "description": "Vitest snapshot manager", + "license": "MIT", + "funding": "https://opencollective.com/vitest", + "homepage": "https://github.com/vitest-dev/vitest/tree/main/packages/snapshot#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/snapshot" + }, + "bugs": { + "url": "https://github.com/vitest-dev/vitest/issues" + }, + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./environment": { + "types": "./dist/environment.d.ts", + "default": "./dist/environment.js" + }, + "./manager": { + "types": "./dist/manager.d.ts", + "default": "./dist/manager.js" + }, + "./*": "./*" + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "*.d.ts", + "dist" + ], + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "devDependencies": { + "@types/natural-compare": "^1.4.3", + "natural-compare": "^1.4.0", + "@vitest/utils": "1.6.1" + }, + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/spy/LICENSE b/sdk/typescript/node_modules/@vitest/spy/LICENSE new file mode 100644 index 0000000..5ae481f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/spy/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-Present Vitest Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/spy/README.md b/sdk/typescript/node_modules/@vitest/spy/README.md new file mode 100644 index 0000000..5d23c87 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/spy/README.md @@ -0,0 +1,3 @@ +# @vitest/spy + +Lightweight Jest compatible spy implementation. diff --git a/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/LICENCE b/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/LICENCE new file mode 100644 index 0000000..64143b8 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/LICENCE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Tinylibs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/README.md b/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/README.md new file mode 100644 index 0000000..820d69f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/README.md @@ -0,0 +1,12 @@ + +# tinyspy + +> minimal fork of nanospy, with more features 🕵🏻‍♂️ + +A `10KB` package for minimal and easy testing with no dependencies. +This package was created for having a tiny spy library to use in `vitest`, but it can also be used in `jest` and other test environments. + +_In case you need more tiny libraries like tinypool or tinyspy, please consider submitting an [RFC](https://github.com/tinylibs/rfcs)_ + +## Docs +Read **[full docs](https://github.com/tinylibs/tinyspy#readme)** on GitHub. diff --git a/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/package.json b/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/package.json new file mode 100644 index 0000000..a3bc94f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/spy/node_modules/tinyspy/package.json @@ -0,0 +1,36 @@ +{ + "name": "tinyspy", + "version": "2.2.1", + "type": "module", + "packageManager": "pnpm@8.4.0", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "default": "./dist/index.cjs" + }, + "files": [ + "dist/**" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/tinylibs/tinyspy.git" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/tinylibs/tinyspy/issues" + }, + "homepage": "https://github.com/tinylibs/tinyspy#readme", + "keywords": [ + "spy", + "mock", + "typescript", + "method" + ], + "engines": { + "node": ">=14.0.0" + } +} diff --git a/sdk/typescript/node_modules/@vitest/spy/package.json b/sdk/typescript/node_modules/@vitest/spy/package.json new file mode 100644 index 0000000..8a2b695 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/spy/package.json @@ -0,0 +1,38 @@ +{ + "name": "@vitest/spy", + "type": "module", + "version": "1.6.1", + "description": "Lightweight Jest compatible spy implementation", + "license": "MIT", + "funding": "https://opencollective.com/vitest", + "homepage": "https://github.com/vitest-dev/vitest/tree/main/packages/spy#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/spy" + }, + "bugs": { + "url": "https://github.com/vitest-dev/vitest/issues" + }, + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./*": "./*" + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "dependencies": { + "tinyspy": "^2.2.0" + }, + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/utils/LICENSE b/sdk/typescript/node_modules/@vitest/utils/LICENSE new file mode 100644 index 0000000..5ae481f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-Present Vitest Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/diff.d.ts b/sdk/typescript/node_modules/@vitest/utils/diff.d.ts new file mode 100644 index 0000000..0a66b86 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/diff.d.ts @@ -0,0 +1 @@ +export * from './dist/diff.js' diff --git a/sdk/typescript/node_modules/@vitest/utils/error.d.ts b/sdk/typescript/node_modules/@vitest/utils/error.d.ts new file mode 100644 index 0000000..9329baa --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/error.d.ts @@ -0,0 +1 @@ +export * from './dist/error.js' diff --git a/sdk/typescript/node_modules/@vitest/utils/helpers.d.ts b/sdk/typescript/node_modules/@vitest/utils/helpers.d.ts new file mode 100644 index 0000000..0add1d0 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/helpers.d.ts @@ -0,0 +1 @@ +export * from './dist/helpers.js' diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/LICENSE b/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/LICENSE new file mode 100644 index 0000000..b93be90 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/README.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/README.md new file mode 100644 index 0000000..b2a1d12 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/README.md @@ -0,0 +1,3 @@ +# `@jest/schemas` + +Experimental and currently incomplete module for JSON schemas for [Jest's](https://jestjs.io/) configuration. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/package.json new file mode 100644 index 0000000..db670bf --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@jest/schemas/package.json @@ -0,0 +1,29 @@ +{ + "name": "@jest/schemas", + "version": "29.6.3", + "repository": { + "type": "git", + "url": "https://github.com/jestjs/jest.git", + "directory": "packages/jest-schemas" + }, + "license": "MIT", + "main": "./build/index.js", + "types": "./build/index.d.ts", + "exports": { + ".": { + "types": "./build/index.d.ts", + "default": "./build/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "fb7d95c8af6e0d65a8b65348433d8a0ea0725b5b" +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/compiler.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/compiler.d.ts new file mode 100644 index 0000000..f35f75f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/compiler.d.ts @@ -0,0 +1,35 @@ +import * as Types from '../typebox'; +import { ValueErrorIterator } from '../errors/index'; +export type CheckFunction = (value: unknown) => boolean; +export declare class TypeCheck { + private readonly schema; + private readonly references; + private readonly checkFunc; + private readonly code; + constructor(schema: T, references: Types.TSchema[], checkFunc: CheckFunction, code: string); + /** Returns the generated assertion code used to validate this type. */ + Code(): string; + /** Returns an iterator for each error in this value. */ + Errors(value: unknown): ValueErrorIterator; + /** Returns true if the value matches the compiled type. */ + Check(value: unknown): value is Types.Static; +} +export declare class TypeCompilerUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class TypeCompilerDereferenceError extends Error { + readonly schema: Types.TRef; + constructor(schema: Types.TRef); +} +export declare class TypeCompilerTypeGuardError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +/** Compiles Types for Runtime Type Checking */ +export declare namespace TypeCompiler { + /** Returns the generated assertion code used to validate this type. */ + function Code(schema: T, references?: Types.TSchema[]): string; + /** Compiles the given type for runtime type checking. This compiler only accepts known TypeBox types non-inclusive of unsafe types. */ + function Compile(schema: T, references?: Types.TSchema[]): TypeCheck; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/compiler.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/compiler.js new file mode 100644 index 0000000..b318e7d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/compiler.js @@ -0,0 +1,577 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/compiler + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TypeCompiler = exports.TypeCompilerTypeGuardError = exports.TypeCompilerDereferenceError = exports.TypeCompilerUnknownTypeError = exports.TypeCheck = void 0; +const Types = require("../typebox"); +const index_1 = require("../errors/index"); +const index_2 = require("../system/index"); +const hash_1 = require("../value/hash"); +// ------------------------------------------------------------------- +// TypeCheck +// ------------------------------------------------------------------- +class TypeCheck { + constructor(schema, references, checkFunc, code) { + this.schema = schema; + this.references = references; + this.checkFunc = checkFunc; + this.code = code; + } + /** Returns the generated assertion code used to validate this type. */ + Code() { + return this.code; + } + /** Returns an iterator for each error in this value. */ + Errors(value) { + return index_1.ValueErrors.Errors(this.schema, this.references, value); + } + /** Returns true if the value matches the compiled type. */ + Check(value) { + return this.checkFunc(value); + } +} +exports.TypeCheck = TypeCheck; +// ------------------------------------------------------------------- +// Character +// ------------------------------------------------------------------- +var Character; +(function (Character) { + function DollarSign(code) { + return code === 36; + } + Character.DollarSign = DollarSign; + function IsUnderscore(code) { + return code === 95; + } + Character.IsUnderscore = IsUnderscore; + function IsAlpha(code) { + return (code >= 65 && code <= 90) || (code >= 97 && code <= 122); + } + Character.IsAlpha = IsAlpha; + function IsNumeric(code) { + return code >= 48 && code <= 57; + } + Character.IsNumeric = IsNumeric; +})(Character || (Character = {})); +// ------------------------------------------------------------------- +// MemberExpression +// ------------------------------------------------------------------- +var MemberExpression; +(function (MemberExpression) { + function IsFirstCharacterNumeric(value) { + if (value.length === 0) + return false; + return Character.IsNumeric(value.charCodeAt(0)); + } + function IsAccessor(value) { + if (IsFirstCharacterNumeric(value)) + return false; + for (let i = 0; i < value.length; i++) { + const code = value.charCodeAt(i); + const check = Character.IsAlpha(code) || Character.IsNumeric(code) || Character.DollarSign(code) || Character.IsUnderscore(code); + if (!check) + return false; + } + return true; + } + function EscapeHyphen(key) { + return key.replace(/'/g, "\\'"); + } + function Encode(object, key) { + return IsAccessor(key) ? `${object}.${key}` : `${object}['${EscapeHyphen(key)}']`; + } + MemberExpression.Encode = Encode; +})(MemberExpression || (MemberExpression = {})); +// ------------------------------------------------------------------- +// Identifier +// ------------------------------------------------------------------- +var Identifier; +(function (Identifier) { + function Encode($id) { + const buffer = []; + for (let i = 0; i < $id.length; i++) { + const code = $id.charCodeAt(i); + if (Character.IsNumeric(code) || Character.IsAlpha(code)) { + buffer.push($id.charAt(i)); + } + else { + buffer.push(`_${code}_`); + } + } + return buffer.join('').replace(/__/g, '_'); + } + Identifier.Encode = Encode; +})(Identifier || (Identifier = {})); +// ------------------------------------------------------------------- +// TypeCompiler +// ------------------------------------------------------------------- +class TypeCompilerUnknownTypeError extends Error { + constructor(schema) { + super('TypeCompiler: Unknown type'); + this.schema = schema; + } +} +exports.TypeCompilerUnknownTypeError = TypeCompilerUnknownTypeError; +class TypeCompilerDereferenceError extends Error { + constructor(schema) { + super(`TypeCompiler: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.TypeCompilerDereferenceError = TypeCompilerDereferenceError; +class TypeCompilerTypeGuardError extends Error { + constructor(schema) { + super('TypeCompiler: Preflight validation check failed to guard for the given schema'); + this.schema = schema; + } +} +exports.TypeCompilerTypeGuardError = TypeCompilerTypeGuardError; +/** Compiles Types for Runtime Type Checking */ +var TypeCompiler; +(function (TypeCompiler) { + // ------------------------------------------------------------------- + // Guards + // ------------------------------------------------------------------- + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsNumber(value) { + return typeof value === 'number' && globalThis.Number.isFinite(value); + } + function IsString(value) { + return typeof value === 'string'; + } + // ------------------------------------------------------------------- + // Polices + // ------------------------------------------------------------------- + function IsExactOptionalProperty(value, key, expression) { + return index_2.TypeSystem.ExactOptionalPropertyTypes ? `('${key}' in ${value} ? ${expression} : true)` : `(${MemberExpression.Encode(value, key)} !== undefined ? ${expression} : true)`; + } + function IsObjectCheck(value) { + return !index_2.TypeSystem.AllowArrayObjects ? `(typeof ${value} === 'object' && ${value} !== null && !Array.isArray(${value}))` : `(typeof ${value} === 'object' && ${value} !== null)`; + } + function IsRecordCheck(value) { + return !index_2.TypeSystem.AllowArrayObjects + ? `(typeof ${value} === 'object' && ${value} !== null && !Array.isArray(${value}) && !(${value} instanceof Date) && !(${value} instanceof Uint8Array))` + : `(typeof ${value} === 'object' && ${value} !== null && !(${value} instanceof Date) && !(${value} instanceof Uint8Array))`; + } + function IsNumberCheck(value) { + return !index_2.TypeSystem.AllowNaN ? `(typeof ${value} === 'number' && Number.isFinite(${value}))` : `typeof ${value} === 'number'`; + } + function IsVoidCheck(value) { + return index_2.TypeSystem.AllowVoidNull ? `(${value} === undefined || ${value} === null)` : `${value} === undefined`; + } + // ------------------------------------------------------------------- + // Types + // ------------------------------------------------------------------- + function* Any(schema, references, value) { + yield 'true'; + } + function* Array(schema, references, value) { + const expression = CreateExpression(schema.items, references, 'value'); + yield `Array.isArray(${value}) && ${value}.every(value => ${expression})`; + if (IsNumber(schema.minItems)) + yield `${value}.length >= ${schema.minItems}`; + if (IsNumber(schema.maxItems)) + yield `${value}.length <= ${schema.maxItems}`; + if (schema.uniqueItems === true) + yield `((function() { const set = new Set(); for(const element of ${value}) { const hashed = hash(element); if(set.has(hashed)) { return false } else { set.add(hashed) } } return true })())`; + } + function* BigInt(schema, references, value) { + yield `(typeof ${value} === 'bigint')`; + if (IsBigInt(schema.multipleOf)) + yield `(${value} % BigInt(${schema.multipleOf})) === 0`; + if (IsBigInt(schema.exclusiveMinimum)) + yield `${value} > BigInt(${schema.exclusiveMinimum})`; + if (IsBigInt(schema.exclusiveMaximum)) + yield `${value} < BigInt(${schema.exclusiveMaximum})`; + if (IsBigInt(schema.minimum)) + yield `${value} >= BigInt(${schema.minimum})`; + if (IsBigInt(schema.maximum)) + yield `${value} <= BigInt(${schema.maximum})`; + } + function* Boolean(schema, references, value) { + yield `typeof ${value} === 'boolean'`; + } + function* Constructor(schema, references, value) { + yield* Visit(schema.returns, references, `${value}.prototype`); + } + function* Date(schema, references, value) { + yield `(${value} instanceof Date) && Number.isFinite(${value}.getTime())`; + if (IsNumber(schema.exclusiveMinimumTimestamp)) + yield `${value}.getTime() > ${schema.exclusiveMinimumTimestamp}`; + if (IsNumber(schema.exclusiveMaximumTimestamp)) + yield `${value}.getTime() < ${schema.exclusiveMaximumTimestamp}`; + if (IsNumber(schema.minimumTimestamp)) + yield `${value}.getTime() >= ${schema.minimumTimestamp}`; + if (IsNumber(schema.maximumTimestamp)) + yield `${value}.getTime() <= ${schema.maximumTimestamp}`; + } + function* Function(schema, references, value) { + yield `typeof ${value} === 'function'`; + } + function* Integer(schema, references, value) { + yield `(typeof ${value} === 'number' && Number.isInteger(${value}))`; + if (IsNumber(schema.multipleOf)) + yield `(${value} % ${schema.multipleOf}) === 0`; + if (IsNumber(schema.exclusiveMinimum)) + yield `${value} > ${schema.exclusiveMinimum}`; + if (IsNumber(schema.exclusiveMaximum)) + yield `${value} < ${schema.exclusiveMaximum}`; + if (IsNumber(schema.minimum)) + yield `${value} >= ${schema.minimum}`; + if (IsNumber(schema.maximum)) + yield `${value} <= ${schema.maximum}`; + } + function* Intersect(schema, references, value) { + if (schema.unevaluatedProperties === undefined) { + const expressions = schema.allOf.map((schema) => CreateExpression(schema, references, value)); + yield `${expressions.join(' && ')}`; + } + else if (schema.unevaluatedProperties === false) { + // prettier-ignore + const schemaKeys = Types.KeyResolver.Resolve(schema).map((key) => `'${key}'`).join(', '); + const expressions = schema.allOf.map((schema) => CreateExpression(schema, references, value)); + const expression1 = `Object.getOwnPropertyNames(${value}).every(key => [${schemaKeys}].includes(key))`; + yield `${expressions.join(' && ')} && ${expression1}`; + } + else if (typeof schema.unevaluatedProperties === 'object') { + // prettier-ignore + const schemaKeys = Types.KeyResolver.Resolve(schema).map((key) => `'${key}'`).join(', '); + const expressions = schema.allOf.map((schema) => CreateExpression(schema, references, value)); + const expression1 = CreateExpression(schema.unevaluatedProperties, references, 'value[key]'); + const expression2 = `Object.getOwnPropertyNames(${value}).every(key => [${schemaKeys}].includes(key) || ${expression1})`; + yield `${expressions.join(' && ')} && ${expression2}`; + } + } + function* Literal(schema, references, value) { + if (typeof schema.const === 'number' || typeof schema.const === 'boolean') { + yield `${value} === ${schema.const}`; + } + else { + yield `${value} === '${schema.const}'`; + } + } + function* Never(schema, references, value) { + yield `false`; + } + function* Not(schema, references, value) { + const left = CreateExpression(schema.allOf[0].not, references, value); + const right = CreateExpression(schema.allOf[1], references, value); + yield `!${left} && ${right}`; + } + function* Null(schema, references, value) { + yield `${value} === null`; + } + function* Number(schema, references, value) { + yield IsNumberCheck(value); + if (IsNumber(schema.multipleOf)) + yield `(${value} % ${schema.multipleOf}) === 0`; + if (IsNumber(schema.exclusiveMinimum)) + yield `${value} > ${schema.exclusiveMinimum}`; + if (IsNumber(schema.exclusiveMaximum)) + yield `${value} < ${schema.exclusiveMaximum}`; + if (IsNumber(schema.minimum)) + yield `${value} >= ${schema.minimum}`; + if (IsNumber(schema.maximum)) + yield `${value} <= ${schema.maximum}`; + } + function* Object(schema, references, value) { + yield IsObjectCheck(value); + if (IsNumber(schema.minProperties)) + yield `Object.getOwnPropertyNames(${value}).length >= ${schema.minProperties}`; + if (IsNumber(schema.maxProperties)) + yield `Object.getOwnPropertyNames(${value}).length <= ${schema.maxProperties}`; + const knownKeys = globalThis.Object.getOwnPropertyNames(schema.properties); + for (const knownKey of knownKeys) { + const memberExpression = MemberExpression.Encode(value, knownKey); + const property = schema.properties[knownKey]; + if (schema.required && schema.required.includes(knownKey)) { + yield* Visit(property, references, memberExpression); + if (Types.ExtendsUndefined.Check(property)) + yield `('${knownKey}' in ${value})`; + } + else { + const expression = CreateExpression(property, references, memberExpression); + yield IsExactOptionalProperty(value, knownKey, expression); + } + } + if (schema.additionalProperties === false) { + if (schema.required && schema.required.length === knownKeys.length) { + yield `Object.getOwnPropertyNames(${value}).length === ${knownKeys.length}`; + } + else { + const keys = `[${knownKeys.map((key) => `'${key}'`).join(', ')}]`; + yield `Object.getOwnPropertyNames(${value}).every(key => ${keys}.includes(key))`; + } + } + if (typeof schema.additionalProperties === 'object') { + const expression = CreateExpression(schema.additionalProperties, references, 'value[key]'); + const keys = `[${knownKeys.map((key) => `'${key}'`).join(', ')}]`; + yield `(Object.getOwnPropertyNames(${value}).every(key => ${keys}.includes(key) || ${expression}))`; + } + } + function* Promise(schema, references, value) { + yield `(typeof value === 'object' && typeof ${value}.then === 'function')`; + } + function* Record(schema, references, value) { + yield IsRecordCheck(value); + if (IsNumber(schema.minProperties)) + yield `Object.getOwnPropertyNames(${value}).length >= ${schema.minProperties}`; + if (IsNumber(schema.maxProperties)) + yield `Object.getOwnPropertyNames(${value}).length <= ${schema.maxProperties}`; + const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0]; + const local = PushLocal(`new RegExp(/${keyPattern}/)`); + yield `(Object.getOwnPropertyNames(${value}).every(key => ${local}.test(key)))`; + const expression = CreateExpression(valueSchema, references, 'value'); + yield `Object.values(${value}).every(value => ${expression})`; + } + function* Ref(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new TypeCompilerDereferenceError(schema); + const target = references[index]; + // Reference: If we have seen this reference before we can just yield and return + // the function call. If this isn't the case we defer to visit to generate and + // set the function for subsequent passes. Consider for refactor. + if (state_local_function_names.has(schema.$ref)) + return yield `${CreateFunctionName(schema.$ref)}(${value})`; + yield* Visit(target, references, value); + } + function* String(schema, references, value) { + yield `(typeof ${value} === 'string')`; + if (IsNumber(schema.minLength)) + yield `${value}.length >= ${schema.minLength}`; + if (IsNumber(schema.maxLength)) + yield `${value}.length <= ${schema.maxLength}`; + if (schema.pattern !== undefined) { + const local = PushLocal(`${new RegExp(schema.pattern)};`); + yield `${local}.test(${value})`; + } + if (schema.format !== undefined) { + yield `format('${schema.format}', ${value})`; + } + } + function* Symbol(schema, references, value) { + yield `(typeof ${value} === 'symbol')`; + } + function* TemplateLiteral(schema, references, value) { + yield `(typeof ${value} === 'string')`; + const local = PushLocal(`${new RegExp(schema.pattern)};`); + yield `${local}.test(${value})`; + } + function* This(schema, references, value) { + const func = CreateFunctionName(schema.$ref); + yield `${func}(${value})`; + } + function* Tuple(schema, references, value) { + yield `(Array.isArray(${value}))`; + if (schema.items === undefined) + return yield `${value}.length === 0`; + yield `(${value}.length === ${schema.maxItems})`; + for (let i = 0; i < schema.items.length; i++) { + const expression = CreateExpression(schema.items[i], references, `${value}[${i}]`); + yield `${expression}`; + } + } + function* Undefined(schema, references, value) { + yield `${value} === undefined`; + } + function* Union(schema, references, value) { + const expressions = schema.anyOf.map((schema) => CreateExpression(schema, references, value)); + yield `(${expressions.join(' || ')})`; + } + function* Uint8Array(schema, references, value) { + yield `${value} instanceof Uint8Array`; + if (IsNumber(schema.maxByteLength)) + yield `(${value}.length <= ${schema.maxByteLength})`; + if (IsNumber(schema.minByteLength)) + yield `(${value}.length >= ${schema.minByteLength})`; + } + function* Unknown(schema, references, value) { + yield 'true'; + } + function* Void(schema, references, value) { + yield IsVoidCheck(value); + } + function* UserDefined(schema, references, value) { + const schema_key = `schema_key_${state_remote_custom_types.size}`; + state_remote_custom_types.set(schema_key, schema); + yield `custom('${schema[Types.Kind]}', '${schema_key}', ${value})`; + } + function* Visit(schema, references, value) { + const references_ = IsString(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + // Reference: Referenced schemas can originate from either additional schemas + // or inline in the schema itself. Ideally the recursive path should align to + // reference path. Consider for refactor. + if (IsString(schema.$id) && !state_local_function_names.has(schema.$id)) { + state_local_function_names.add(schema.$id); + const name = CreateFunctionName(schema.$id); + const body = CreateFunction(name, schema, references, 'value'); + PushFunction(body); + yield `${name}(${value})`; + return; + } + switch (schema_[Types.Kind]) { + case 'Any': + return yield* Any(schema_, references_, value); + case 'Array': + return yield* Array(schema_, references_, value); + case 'BigInt': + return yield* BigInt(schema_, references_, value); + case 'Boolean': + return yield* Boolean(schema_, references_, value); + case 'Constructor': + return yield* Constructor(schema_, references_, value); + case 'Date': + return yield* Date(schema_, references_, value); + case 'Function': + return yield* Function(schema_, references_, value); + case 'Integer': + return yield* Integer(schema_, references_, value); + case 'Intersect': + return yield* Intersect(schema_, references_, value); + case 'Literal': + return yield* Literal(schema_, references_, value); + case 'Never': + return yield* Never(schema_, references_, value); + case 'Not': + return yield* Not(schema_, references_, value); + case 'Null': + return yield* Null(schema_, references_, value); + case 'Number': + return yield* Number(schema_, references_, value); + case 'Object': + return yield* Object(schema_, references_, value); + case 'Promise': + return yield* Promise(schema_, references_, value); + case 'Record': + return yield* Record(schema_, references_, value); + case 'Ref': + return yield* Ref(schema_, references_, value); + case 'String': + return yield* String(schema_, references_, value); + case 'Symbol': + return yield* Symbol(schema_, references_, value); + case 'TemplateLiteral': + return yield* TemplateLiteral(schema_, references_, value); + case 'This': + return yield* This(schema_, references_, value); + case 'Tuple': + return yield* Tuple(schema_, references_, value); + case 'Undefined': + return yield* Undefined(schema_, references_, value); + case 'Union': + return yield* Union(schema_, references_, value); + case 'Uint8Array': + return yield* Uint8Array(schema_, references_, value); + case 'Unknown': + return yield* Unknown(schema_, references_, value); + case 'Void': + return yield* Void(schema_, references_, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new TypeCompilerUnknownTypeError(schema); + return yield* UserDefined(schema_, references_, value); + } + } + // ------------------------------------------------------------------- + // Compiler State + // ------------------------------------------------------------------- + const state_local_variables = new Set(); // local variables and functions + const state_local_function_names = new Set(); // local function names used call ref validators + const state_remote_custom_types = new Map(); // remote custom types used during compilation + function ResetCompiler() { + state_local_variables.clear(); + state_local_function_names.clear(); + state_remote_custom_types.clear(); + } + function CreateExpression(schema, references, value) { + return `(${[...Visit(schema, references, value)].join(' && ')})`; + } + function CreateFunctionName($id) { + return `check_${Identifier.Encode($id)}`; + } + function CreateFunction(name, schema, references, value) { + const expression = [...Visit(schema, references, value)].map((condition) => ` ${condition}`).join(' &&\n'); + return `function ${name}(value) {\n return (\n${expression}\n )\n}`; + } + function PushFunction(functionBody) { + state_local_variables.add(functionBody); + } + function PushLocal(expression) { + const local = `local_${state_local_variables.size}`; + state_local_variables.add(`const ${local} = ${expression}`); + return local; + } + function GetLocals() { + return [...state_local_variables.values()]; + } + // ------------------------------------------------------------------- + // Compile + // ------------------------------------------------------------------- + function Build(schema, references) { + ResetCompiler(); + const check = CreateFunction('check', schema, references, 'value'); + const locals = GetLocals(); + return `${locals.join('\n')}\nreturn ${check}`; + } + /** Returns the generated assertion code used to validate this type. */ + function Code(schema, references = []) { + if (!Types.TypeGuard.TSchema(schema)) + throw new TypeCompilerTypeGuardError(schema); + for (const schema of references) + if (!Types.TypeGuard.TSchema(schema)) + throw new TypeCompilerTypeGuardError(schema); + return Build(schema, references); + } + TypeCompiler.Code = Code; + /** Compiles the given type for runtime type checking. This compiler only accepts known TypeBox types non-inclusive of unsafe types. */ + function Compile(schema, references = []) { + const code = Code(schema, references); + const custom_schemas = new Map(state_remote_custom_types); + const compiledFunction = globalThis.Function('custom', 'format', 'hash', code); + const checkFunction = compiledFunction((kind, schema_key, value) => { + if (!Types.TypeRegistry.Has(kind) || !custom_schemas.has(schema_key)) + return false; + const schema = custom_schemas.get(schema_key); + const func = Types.TypeRegistry.Get(kind); + return func(schema, value); + }, (format, value) => { + if (!Types.FormatRegistry.Has(format)) + return false; + const func = Types.FormatRegistry.Get(format); + return func(value); + }, (value) => { + return hash_1.ValueHash.Create(value); + }); + return new TypeCheck(schema, references, checkFunction, code); + } + TypeCompiler.Compile = Compile; +})(TypeCompiler = exports.TypeCompiler || (exports.TypeCompiler = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/index.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/index.d.ts new file mode 100644 index 0000000..4062a62 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/index.d.ts @@ -0,0 +1,2 @@ +export { ValueError, ValueErrorType } from '../errors/index'; +export * from './compiler'; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/index.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/index.js new file mode 100644 index 0000000..7a013c3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/compiler/index.js @@ -0,0 +1,47 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/compiler + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueErrorType = void 0; +var index_1 = require("../errors/index"); +Object.defineProperty(exports, "ValueErrorType", { enumerable: true, get: function () { return index_1.ValueErrorType; } }); +__exportStar(require("./compiler"), exports); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/errors.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/errors.d.ts new file mode 100644 index 0000000..89786c6 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/errors.d.ts @@ -0,0 +1,88 @@ +import * as Types from '../typebox'; +export declare enum ValueErrorType { + Array = 0, + ArrayMinItems = 1, + ArrayMaxItems = 2, + ArrayUniqueItems = 3, + BigInt = 4, + BigIntMultipleOf = 5, + BigIntExclusiveMinimum = 6, + BigIntExclusiveMaximum = 7, + BigIntMinimum = 8, + BigIntMaximum = 9, + Boolean = 10, + Date = 11, + DateExclusiveMinimumTimestamp = 12, + DateExclusiveMaximumTimestamp = 13, + DateMinimumTimestamp = 14, + DateMaximumTimestamp = 15, + Function = 16, + Integer = 17, + IntegerMultipleOf = 18, + IntegerExclusiveMinimum = 19, + IntegerExclusiveMaximum = 20, + IntegerMinimum = 21, + IntegerMaximum = 22, + Intersect = 23, + IntersectUnevaluatedProperties = 24, + Literal = 25, + Never = 26, + Not = 27, + Null = 28, + Number = 29, + NumberMultipleOf = 30, + NumberExclusiveMinimum = 31, + NumberExclusiveMaximum = 32, + NumberMinumum = 33, + NumberMaximum = 34, + Object = 35, + ObjectMinProperties = 36, + ObjectMaxProperties = 37, + ObjectAdditionalProperties = 38, + ObjectRequiredProperties = 39, + Promise = 40, + RecordKeyNumeric = 41, + RecordKeyString = 42, + String = 43, + StringMinLength = 44, + StringMaxLength = 45, + StringPattern = 46, + StringFormatUnknown = 47, + StringFormat = 48, + Symbol = 49, + TupleZeroLength = 50, + TupleLength = 51, + Undefined = 52, + Union = 53, + Uint8Array = 54, + Uint8ArrayMinByteLength = 55, + Uint8ArrayMaxByteLength = 56, + Void = 57, + Custom = 58 +} +export interface ValueError { + type: ValueErrorType; + schema: Types.TSchema; + path: string; + value: unknown; + message: string; +} +export declare class ValueErrorIterator { + private readonly iterator; + constructor(iterator: IterableIterator); + [Symbol.iterator](): IterableIterator; + /** Returns the first value error or undefined if no errors */ + First(): ValueError | undefined; +} +export declare class ValueErrorsUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueErrorsDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +/** Provides functionality to generate a sequence of errors against a TypeBox type. */ +export declare namespace ValueErrors { + function Errors(schema: T, references: Types.TSchema[], value: any): ValueErrorIterator; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/errors.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/errors.js new file mode 100644 index 0000000..4f7210b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/errors.js @@ -0,0 +1,609 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueErrors = exports.ValueErrorsDereferenceError = exports.ValueErrorsUnknownTypeError = exports.ValueErrorIterator = exports.ValueErrorType = void 0; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/errors + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +const Types = require("../typebox"); +const index_1 = require("../system/index"); +const hash_1 = require("../value/hash"); +// ------------------------------------------------------------------- +// ValueErrorType +// ------------------------------------------------------------------- +var ValueErrorType; +(function (ValueErrorType) { + ValueErrorType[ValueErrorType["Array"] = 0] = "Array"; + ValueErrorType[ValueErrorType["ArrayMinItems"] = 1] = "ArrayMinItems"; + ValueErrorType[ValueErrorType["ArrayMaxItems"] = 2] = "ArrayMaxItems"; + ValueErrorType[ValueErrorType["ArrayUniqueItems"] = 3] = "ArrayUniqueItems"; + ValueErrorType[ValueErrorType["BigInt"] = 4] = "BigInt"; + ValueErrorType[ValueErrorType["BigIntMultipleOf"] = 5] = "BigIntMultipleOf"; + ValueErrorType[ValueErrorType["BigIntExclusiveMinimum"] = 6] = "BigIntExclusiveMinimum"; + ValueErrorType[ValueErrorType["BigIntExclusiveMaximum"] = 7] = "BigIntExclusiveMaximum"; + ValueErrorType[ValueErrorType["BigIntMinimum"] = 8] = "BigIntMinimum"; + ValueErrorType[ValueErrorType["BigIntMaximum"] = 9] = "BigIntMaximum"; + ValueErrorType[ValueErrorType["Boolean"] = 10] = "Boolean"; + ValueErrorType[ValueErrorType["Date"] = 11] = "Date"; + ValueErrorType[ValueErrorType["DateExclusiveMinimumTimestamp"] = 12] = "DateExclusiveMinimumTimestamp"; + ValueErrorType[ValueErrorType["DateExclusiveMaximumTimestamp"] = 13] = "DateExclusiveMaximumTimestamp"; + ValueErrorType[ValueErrorType["DateMinimumTimestamp"] = 14] = "DateMinimumTimestamp"; + ValueErrorType[ValueErrorType["DateMaximumTimestamp"] = 15] = "DateMaximumTimestamp"; + ValueErrorType[ValueErrorType["Function"] = 16] = "Function"; + ValueErrorType[ValueErrorType["Integer"] = 17] = "Integer"; + ValueErrorType[ValueErrorType["IntegerMultipleOf"] = 18] = "IntegerMultipleOf"; + ValueErrorType[ValueErrorType["IntegerExclusiveMinimum"] = 19] = "IntegerExclusiveMinimum"; + ValueErrorType[ValueErrorType["IntegerExclusiveMaximum"] = 20] = "IntegerExclusiveMaximum"; + ValueErrorType[ValueErrorType["IntegerMinimum"] = 21] = "IntegerMinimum"; + ValueErrorType[ValueErrorType["IntegerMaximum"] = 22] = "IntegerMaximum"; + ValueErrorType[ValueErrorType["Intersect"] = 23] = "Intersect"; + ValueErrorType[ValueErrorType["IntersectUnevaluatedProperties"] = 24] = "IntersectUnevaluatedProperties"; + ValueErrorType[ValueErrorType["Literal"] = 25] = "Literal"; + ValueErrorType[ValueErrorType["Never"] = 26] = "Never"; + ValueErrorType[ValueErrorType["Not"] = 27] = "Not"; + ValueErrorType[ValueErrorType["Null"] = 28] = "Null"; + ValueErrorType[ValueErrorType["Number"] = 29] = "Number"; + ValueErrorType[ValueErrorType["NumberMultipleOf"] = 30] = "NumberMultipleOf"; + ValueErrorType[ValueErrorType["NumberExclusiveMinimum"] = 31] = "NumberExclusiveMinimum"; + ValueErrorType[ValueErrorType["NumberExclusiveMaximum"] = 32] = "NumberExclusiveMaximum"; + ValueErrorType[ValueErrorType["NumberMinumum"] = 33] = "NumberMinumum"; + ValueErrorType[ValueErrorType["NumberMaximum"] = 34] = "NumberMaximum"; + ValueErrorType[ValueErrorType["Object"] = 35] = "Object"; + ValueErrorType[ValueErrorType["ObjectMinProperties"] = 36] = "ObjectMinProperties"; + ValueErrorType[ValueErrorType["ObjectMaxProperties"] = 37] = "ObjectMaxProperties"; + ValueErrorType[ValueErrorType["ObjectAdditionalProperties"] = 38] = "ObjectAdditionalProperties"; + ValueErrorType[ValueErrorType["ObjectRequiredProperties"] = 39] = "ObjectRequiredProperties"; + ValueErrorType[ValueErrorType["Promise"] = 40] = "Promise"; + ValueErrorType[ValueErrorType["RecordKeyNumeric"] = 41] = "RecordKeyNumeric"; + ValueErrorType[ValueErrorType["RecordKeyString"] = 42] = "RecordKeyString"; + ValueErrorType[ValueErrorType["String"] = 43] = "String"; + ValueErrorType[ValueErrorType["StringMinLength"] = 44] = "StringMinLength"; + ValueErrorType[ValueErrorType["StringMaxLength"] = 45] = "StringMaxLength"; + ValueErrorType[ValueErrorType["StringPattern"] = 46] = "StringPattern"; + ValueErrorType[ValueErrorType["StringFormatUnknown"] = 47] = "StringFormatUnknown"; + ValueErrorType[ValueErrorType["StringFormat"] = 48] = "StringFormat"; + ValueErrorType[ValueErrorType["Symbol"] = 49] = "Symbol"; + ValueErrorType[ValueErrorType["TupleZeroLength"] = 50] = "TupleZeroLength"; + ValueErrorType[ValueErrorType["TupleLength"] = 51] = "TupleLength"; + ValueErrorType[ValueErrorType["Undefined"] = 52] = "Undefined"; + ValueErrorType[ValueErrorType["Union"] = 53] = "Union"; + ValueErrorType[ValueErrorType["Uint8Array"] = 54] = "Uint8Array"; + ValueErrorType[ValueErrorType["Uint8ArrayMinByteLength"] = 55] = "Uint8ArrayMinByteLength"; + ValueErrorType[ValueErrorType["Uint8ArrayMaxByteLength"] = 56] = "Uint8ArrayMaxByteLength"; + ValueErrorType[ValueErrorType["Void"] = 57] = "Void"; + ValueErrorType[ValueErrorType["Custom"] = 58] = "Custom"; +})(ValueErrorType = exports.ValueErrorType || (exports.ValueErrorType = {})); +// ------------------------------------------------------------------- +// ValueErrorIterator +// ------------------------------------------------------------------- +class ValueErrorIterator { + constructor(iterator) { + this.iterator = iterator; + } + [Symbol.iterator]() { + return this.iterator; + } + /** Returns the first value error or undefined if no errors */ + First() { + const next = this.iterator.next(); + return next.done ? undefined : next.value; + } +} +exports.ValueErrorIterator = ValueErrorIterator; +// ------------------------------------------------------------------- +// ValueErrors +// ------------------------------------------------------------------- +class ValueErrorsUnknownTypeError extends Error { + constructor(schema) { + super('ValueErrors: Unknown type'); + this.schema = schema; + } +} +exports.ValueErrorsUnknownTypeError = ValueErrorsUnknownTypeError; +class ValueErrorsDereferenceError extends Error { + constructor(schema) { + super(`ValueErrors: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueErrorsDereferenceError = ValueErrorsDereferenceError; +/** Provides functionality to generate a sequence of errors against a TypeBox type. */ +var ValueErrors; +(function (ValueErrors) { + // ---------------------------------------------------------------------- + // Guards + // ---------------------------------------------------------------------- + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsInteger(value) { + return globalThis.Number.isInteger(value); + } + function IsString(value) { + return typeof value === 'string'; + } + function IsDefined(value) { + return value !== undefined; + } + // ---------------------------------------------------------------------- + // Policies + // ---------------------------------------------------------------------- + function IsExactOptionalProperty(value, key) { + return index_1.TypeSystem.ExactOptionalPropertyTypes ? key in value : value[key] !== undefined; + } + function IsObject(value) { + const result = typeof value === 'object' && value !== null; + return index_1.TypeSystem.AllowArrayObjects ? result : result && !globalThis.Array.isArray(value); + } + function IsRecordObject(value) { + return IsObject(value) && !(value instanceof globalThis.Date) && !(value instanceof globalThis.Uint8Array); + } + function IsNumber(value) { + const result = typeof value === 'number'; + return index_1.TypeSystem.AllowNaN ? result : result && globalThis.Number.isFinite(value); + } + function IsVoid(value) { + const result = value === undefined; + return index_1.TypeSystem.AllowVoidNull ? result || value === null : result; + } + // ---------------------------------------------------------------------- + // Types + // ---------------------------------------------------------------------- + function* Any(schema, references, path, value) { } + function* Array(schema, references, path, value) { + if (!globalThis.Array.isArray(value)) { + return yield { type: ValueErrorType.Array, schema, path, value, message: `Expected array` }; + } + if (IsDefined(schema.minItems) && !(value.length >= schema.minItems)) { + yield { type: ValueErrorType.ArrayMinItems, schema, path, value, message: `Expected array length to be greater or equal to ${schema.minItems}` }; + } + if (IsDefined(schema.maxItems) && !(value.length <= schema.maxItems)) { + yield { type: ValueErrorType.ArrayMinItems, schema, path, value, message: `Expected array length to be less or equal to ${schema.maxItems}` }; + } + // prettier-ignore + if (schema.uniqueItems === true && !((function () { const set = new Set(); for (const element of value) { + const hashed = hash_1.ValueHash.Create(element); + if (set.has(hashed)) { + return false; + } + else { + set.add(hashed); + } + } return true; })())) { + yield { type: ValueErrorType.ArrayUniqueItems, schema, path, value, message: `Expected array elements to be unique` }; + } + for (let i = 0; i < value.length; i++) { + yield* Visit(schema.items, references, `${path}/${i}`, value[i]); + } + } + function* BigInt(schema, references, path, value) { + if (!IsBigInt(value)) { + return yield { type: ValueErrorType.BigInt, schema, path, value, message: `Expected bigint` }; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === globalThis.BigInt(0))) { + yield { type: ValueErrorType.BigIntMultipleOf, schema, path, value, message: `Expected bigint to be a multiple of ${schema.multipleOf}` }; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + yield { type: ValueErrorType.BigIntExclusiveMinimum, schema, path, value, message: `Expected bigint to be greater than ${schema.exclusiveMinimum}` }; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + yield { type: ValueErrorType.BigIntExclusiveMaximum, schema, path, value, message: `Expected bigint to be less than ${schema.exclusiveMaximum}` }; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + yield { type: ValueErrorType.BigIntMinimum, schema, path, value, message: `Expected bigint to be greater or equal to ${schema.minimum}` }; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + yield { type: ValueErrorType.BigIntMaximum, schema, path, value, message: `Expected bigint to be less or equal to ${schema.maximum}` }; + } + } + function* Boolean(schema, references, path, value) { + if (!(typeof value === 'boolean')) { + return yield { type: ValueErrorType.Boolean, schema, path, value, message: `Expected boolean` }; + } + } + function* Constructor(schema, references, path, value) { + yield* Visit(schema.returns, references, path, value.prototype); + } + function* Date(schema, references, path, value) { + if (!(value instanceof globalThis.Date)) { + return yield { type: ValueErrorType.Date, schema, path, value, message: `Expected Date object` }; + } + if (!globalThis.isFinite(value.getTime())) { + return yield { type: ValueErrorType.Date, schema, path, value, message: `Invalid Date` }; + } + if (IsDefined(schema.exclusiveMinimumTimestamp) && !(value.getTime() > schema.exclusiveMinimumTimestamp)) { + yield { type: ValueErrorType.DateExclusiveMinimumTimestamp, schema, path, value, message: `Expected Date timestamp to be greater than ${schema.exclusiveMinimum}` }; + } + if (IsDefined(schema.exclusiveMaximumTimestamp) && !(value.getTime() < schema.exclusiveMaximumTimestamp)) { + yield { type: ValueErrorType.DateExclusiveMaximumTimestamp, schema, path, value, message: `Expected Date timestamp to be less than ${schema.exclusiveMaximum}` }; + } + if (IsDefined(schema.minimumTimestamp) && !(value.getTime() >= schema.minimumTimestamp)) { + yield { type: ValueErrorType.DateMinimumTimestamp, schema, path, value, message: `Expected Date timestamp to be greater or equal to ${schema.minimum}` }; + } + if (IsDefined(schema.maximumTimestamp) && !(value.getTime() <= schema.maximumTimestamp)) { + yield { type: ValueErrorType.DateMaximumTimestamp, schema, path, value, message: `Expected Date timestamp to be less or equal to ${schema.maximum}` }; + } + } + function* Function(schema, references, path, value) { + if (!(typeof value === 'function')) { + return yield { type: ValueErrorType.Function, schema, path, value, message: `Expected function` }; + } + } + function* Integer(schema, references, path, value) { + if (!IsInteger(value)) { + return yield { type: ValueErrorType.Integer, schema, path, value, message: `Expected integer` }; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === 0)) { + yield { type: ValueErrorType.IntegerMultipleOf, schema, path, value, message: `Expected integer to be a multiple of ${schema.multipleOf}` }; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + yield { type: ValueErrorType.IntegerExclusiveMinimum, schema, path, value, message: `Expected integer to be greater than ${schema.exclusiveMinimum}` }; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + yield { type: ValueErrorType.IntegerExclusiveMaximum, schema, path, value, message: `Expected integer to be less than ${schema.exclusiveMaximum}` }; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + yield { type: ValueErrorType.IntegerMinimum, schema, path, value, message: `Expected integer to be greater or equal to ${schema.minimum}` }; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + yield { type: ValueErrorType.IntegerMaximum, schema, path, value, message: `Expected integer to be less or equal to ${schema.maximum}` }; + } + } + function* Intersect(schema, references, path, value) { + for (const subschema of schema.allOf) { + const next = Visit(subschema, references, path, value).next(); + if (!next.done) { + yield next.value; + yield { type: ValueErrorType.Intersect, schema, path, value, message: `Expected all sub schemas to be valid` }; + return; + } + } + if (schema.unevaluatedProperties === false) { + const schemaKeys = Types.KeyResolver.Resolve(schema); + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + for (const valueKey of valueKeys) { + if (!schemaKeys.includes(valueKey)) { + yield { type: ValueErrorType.IntersectUnevaluatedProperties, schema, path: `${path}/${valueKey}`, value, message: `Unexpected property` }; + } + } + } + if (typeof schema.unevaluatedProperties === 'object') { + const schemaKeys = Types.KeyResolver.Resolve(schema); + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + for (const valueKey of valueKeys) { + if (!schemaKeys.includes(valueKey)) { + const next = Visit(schema.unevaluatedProperties, references, `${path}/${valueKey}`, value[valueKey]).next(); + if (!next.done) { + yield next.value; + yield { type: ValueErrorType.IntersectUnevaluatedProperties, schema, path: `${path}/${valueKey}`, value, message: `Invalid additional property` }; + return; + } + } + } + } + } + function* Literal(schema, references, path, value) { + if (!(value === schema.const)) { + const error = typeof schema.const === 'string' ? `'${schema.const}'` : schema.const; + return yield { type: ValueErrorType.Literal, schema, path, value, message: `Expected ${error}` }; + } + } + function* Never(schema, references, path, value) { + yield { type: ValueErrorType.Never, schema, path, value, message: `Value cannot be validated` }; + } + function* Not(schema, references, path, value) { + if (Visit(schema.allOf[0].not, references, path, value).next().done === true) { + yield { type: ValueErrorType.Not, schema, path, value, message: `Value should not validate` }; + } + yield* Visit(schema.allOf[1], references, path, value); + } + function* Null(schema, references, path, value) { + if (!(value === null)) { + return yield { type: ValueErrorType.Null, schema, path, value, message: `Expected null` }; + } + } + function* Number(schema, references, path, value) { + if (!IsNumber(value)) { + return yield { type: ValueErrorType.Number, schema, path, value, message: `Expected number` }; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === 0)) { + yield { type: ValueErrorType.NumberMultipleOf, schema, path, value, message: `Expected number to be a multiple of ${schema.multipleOf}` }; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + yield { type: ValueErrorType.NumberExclusiveMinimum, schema, path, value, message: `Expected number to be greater than ${schema.exclusiveMinimum}` }; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + yield { type: ValueErrorType.NumberExclusiveMaximum, schema, path, value, message: `Expected number to be less than ${schema.exclusiveMaximum}` }; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + yield { type: ValueErrorType.NumberMaximum, schema, path, value, message: `Expected number to be greater or equal to ${schema.minimum}` }; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + yield { type: ValueErrorType.NumberMinumum, schema, path, value, message: `Expected number to be less or equal to ${schema.maximum}` }; + } + } + function* Object(schema, references, path, value) { + if (!IsObject(value)) { + return yield { type: ValueErrorType.Object, schema, path, value, message: `Expected object` }; + } + if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) { + yield { type: ValueErrorType.ObjectMinProperties, schema, path, value, message: `Expected object to have at least ${schema.minProperties} properties` }; + } + if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) { + yield { type: ValueErrorType.ObjectMaxProperties, schema, path, value, message: `Expected object to have less than ${schema.minProperties} properties` }; + } + const requiredKeys = globalThis.Array.isArray(schema.required) ? schema.required : []; + const knownKeys = globalThis.Object.getOwnPropertyNames(schema.properties); + const unknownKeys = globalThis.Object.getOwnPropertyNames(value); + for (const knownKey of knownKeys) { + const property = schema.properties[knownKey]; + if (schema.required && schema.required.includes(knownKey)) { + yield* Visit(property, references, `${path}/${knownKey}`, value[knownKey]); + if (Types.ExtendsUndefined.Check(schema) && !(knownKey in value)) { + yield { type: ValueErrorType.ObjectRequiredProperties, schema: property, path: `${path}/${knownKey}`, value: undefined, message: `Expected required property` }; + } + } + else { + if (IsExactOptionalProperty(value, knownKey)) { + yield* Visit(property, references, `${path}/${knownKey}`, value[knownKey]); + } + } + } + for (const requiredKey of requiredKeys) { + if (unknownKeys.includes(requiredKey)) + continue; + yield { type: ValueErrorType.ObjectRequiredProperties, schema: schema.properties[requiredKey], path: `${path}/${requiredKey}`, value: undefined, message: `Expected required property` }; + } + if (schema.additionalProperties === false) { + for (const valueKey of unknownKeys) { + if (!knownKeys.includes(valueKey)) { + yield { type: ValueErrorType.ObjectAdditionalProperties, schema, path: `${path}/${valueKey}`, value: value[valueKey], message: `Unexpected property` }; + } + } + } + if (typeof schema.additionalProperties === 'object') { + for (const valueKey of unknownKeys) { + if (knownKeys.includes(valueKey)) + continue; + yield* Visit(schema.additionalProperties, references, `${path}/${valueKey}`, value[valueKey]); + } + } + } + function* Promise(schema, references, path, value) { + if (!(typeof value === 'object' && typeof value.then === 'function')) { + yield { type: ValueErrorType.Promise, schema, path, value, message: `Expected Promise` }; + } + } + function* Record(schema, references, path, value) { + if (!IsRecordObject(value)) { + return yield { type: ValueErrorType.Object, schema, path, value, message: `Expected record object` }; + } + if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) { + yield { type: ValueErrorType.ObjectMinProperties, schema, path, value, message: `Expected object to have at least ${schema.minProperties} properties` }; + } + if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) { + yield { type: ValueErrorType.ObjectMaxProperties, schema, path, value, message: `Expected object to have less than ${schema.minProperties} properties` }; + } + const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0]; + const regex = new RegExp(keyPattern); + if (!globalThis.Object.getOwnPropertyNames(value).every((key) => regex.test(key))) { + const numeric = keyPattern === Types.PatternNumberExact; + const type = numeric ? ValueErrorType.RecordKeyNumeric : ValueErrorType.RecordKeyString; + const message = numeric ? 'Expected all object property keys to be numeric' : 'Expected all object property keys to be strings'; + return yield { type, schema, path, value, message }; + } + for (const [propKey, propValue] of globalThis.Object.entries(value)) { + yield* Visit(valueSchema, references, `${path}/${propKey}`, propValue); + } + } + function* Ref(schema, references, path, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueErrorsDereferenceError(schema); + const target = references[index]; + yield* Visit(target, references, path, value); + } + function* String(schema, references, path, value) { + if (!IsString(value)) { + return yield { type: ValueErrorType.String, schema, path, value, message: 'Expected string' }; + } + if (IsDefined(schema.minLength) && !(value.length >= schema.minLength)) { + yield { type: ValueErrorType.StringMinLength, schema, path, value, message: `Expected string length greater or equal to ${schema.minLength}` }; + } + if (IsDefined(schema.maxLength) && !(value.length <= schema.maxLength)) { + yield { type: ValueErrorType.StringMaxLength, schema, path, value, message: `Expected string length less or equal to ${schema.maxLength}` }; + } + if (schema.pattern !== undefined) { + const regex = new RegExp(schema.pattern); + if (!regex.test(value)) { + yield { type: ValueErrorType.StringPattern, schema, path, value, message: `Expected string to match pattern ${schema.pattern}` }; + } + } + if (schema.format !== undefined) { + if (!Types.FormatRegistry.Has(schema.format)) { + yield { type: ValueErrorType.StringFormatUnknown, schema, path, value, message: `Unknown string format '${schema.format}'` }; + } + else { + const format = Types.FormatRegistry.Get(schema.format); + if (!format(value)) { + yield { type: ValueErrorType.StringFormat, schema, path, value, message: `Expected string to match format '${schema.format}'` }; + } + } + } + } + function* Symbol(schema, references, path, value) { + if (!(typeof value === 'symbol')) { + return yield { type: ValueErrorType.Symbol, schema, path, value, message: 'Expected symbol' }; + } + } + function* TemplateLiteral(schema, references, path, value) { + if (!IsString(value)) { + return yield { type: ValueErrorType.String, schema, path, value, message: 'Expected string' }; + } + const regex = new RegExp(schema.pattern); + if (!regex.test(value)) { + yield { type: ValueErrorType.StringPattern, schema, path, value, message: `Expected string to match pattern ${schema.pattern}` }; + } + } + function* This(schema, references, path, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueErrorsDereferenceError(schema); + const target = references[index]; + yield* Visit(target, references, path, value); + } + function* Tuple(schema, references, path, value) { + if (!globalThis.Array.isArray(value)) { + return yield { type: ValueErrorType.Array, schema, path, value, message: 'Expected Array' }; + } + if (schema.items === undefined && !(value.length === 0)) { + return yield { type: ValueErrorType.TupleZeroLength, schema, path, value, message: 'Expected tuple to have 0 elements' }; + } + if (!(value.length === schema.maxItems)) { + yield { type: ValueErrorType.TupleLength, schema, path, value, message: `Expected tuple to have ${schema.maxItems} elements` }; + } + if (!schema.items) { + return; + } + for (let i = 0; i < schema.items.length; i++) { + yield* Visit(schema.items[i], references, `${path}/${i}`, value[i]); + } + } + function* Undefined(schema, references, path, value) { + if (!(value === undefined)) { + yield { type: ValueErrorType.Undefined, schema, path, value, message: `Expected undefined` }; + } + } + function* Union(schema, references, path, value) { + const errors = []; + for (const inner of schema.anyOf) { + const variantErrors = [...Visit(inner, references, path, value)]; + if (variantErrors.length === 0) + return; + errors.push(...variantErrors); + } + if (errors.length > 0) { + yield { type: ValueErrorType.Union, schema, path, value, message: 'Expected value of union' }; + } + for (const error of errors) { + yield error; + } + } + function* Uint8Array(schema, references, path, value) { + if (!(value instanceof globalThis.Uint8Array)) { + return yield { type: ValueErrorType.Uint8Array, schema, path, value, message: `Expected Uint8Array` }; + } + if (IsDefined(schema.maxByteLength) && !(value.length <= schema.maxByteLength)) { + yield { type: ValueErrorType.Uint8ArrayMaxByteLength, schema, path, value, message: `Expected Uint8Array to have a byte length less or equal to ${schema.maxByteLength}` }; + } + if (IsDefined(schema.minByteLength) && !(value.length >= schema.minByteLength)) { + yield { type: ValueErrorType.Uint8ArrayMinByteLength, schema, path, value, message: `Expected Uint8Array to have a byte length greater or equal to ${schema.maxByteLength}` }; + } + } + function* Unknown(schema, references, path, value) { } + function* Void(schema, references, path, value) { + if (!IsVoid(value)) { + return yield { type: ValueErrorType.Void, schema, path, value, message: `Expected void` }; + } + } + function* UserDefined(schema, references, path, value) { + const check = Types.TypeRegistry.Get(schema[Types.Kind]); + if (!check(schema, value)) { + return yield { type: ValueErrorType.Custom, schema, path, value, message: `Expected kind ${schema[Types.Kind]}` }; + } + } + function* Visit(schema, references, path, value) { + const references_ = IsDefined(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema_[Types.Kind]) { + case 'Any': + return yield* Any(schema_, references_, path, value); + case 'Array': + return yield* Array(schema_, references_, path, value); + case 'BigInt': + return yield* BigInt(schema_, references_, path, value); + case 'Boolean': + return yield* Boolean(schema_, references_, path, value); + case 'Constructor': + return yield* Constructor(schema_, references_, path, value); + case 'Date': + return yield* Date(schema_, references_, path, value); + case 'Function': + return yield* Function(schema_, references_, path, value); + case 'Integer': + return yield* Integer(schema_, references_, path, value); + case 'Intersect': + return yield* Intersect(schema_, references_, path, value); + case 'Literal': + return yield* Literal(schema_, references_, path, value); + case 'Never': + return yield* Never(schema_, references_, path, value); + case 'Not': + return yield* Not(schema_, references_, path, value); + case 'Null': + return yield* Null(schema_, references_, path, value); + case 'Number': + return yield* Number(schema_, references_, path, value); + case 'Object': + return yield* Object(schema_, references_, path, value); + case 'Promise': + return yield* Promise(schema_, references_, path, value); + case 'Record': + return yield* Record(schema_, references_, path, value); + case 'Ref': + return yield* Ref(schema_, references_, path, value); + case 'String': + return yield* String(schema_, references_, path, value); + case 'Symbol': + return yield* Symbol(schema_, references_, path, value); + case 'TemplateLiteral': + return yield* TemplateLiteral(schema_, references_, path, value); + case 'This': + return yield* This(schema_, references_, path, value); + case 'Tuple': + return yield* Tuple(schema_, references_, path, value); + case 'Undefined': + return yield* Undefined(schema_, references_, path, value); + case 'Union': + return yield* Union(schema_, references_, path, value); + case 'Uint8Array': + return yield* Uint8Array(schema_, references_, path, value); + case 'Unknown': + return yield* Unknown(schema_, references_, path, value); + case 'Void': + return yield* Void(schema_, references_, path, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueErrorsUnknownTypeError(schema); + return yield* UserDefined(schema_, references_, path, value); + } + } + function Errors(schema, references, value) { + const iterator = Visit(schema, references, '', value); + return new ValueErrorIterator(iterator); + } + ValueErrors.Errors = Errors; +})(ValueErrors = exports.ValueErrors || (exports.ValueErrors = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/index.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/index.d.ts new file mode 100644 index 0000000..f72bc43 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/index.d.ts @@ -0,0 +1 @@ +export * from './errors'; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/index.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/index.js new file mode 100644 index 0000000..9637155 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/errors/index.js @@ -0,0 +1,44 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/errors + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./errors"), exports); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/license b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/license new file mode 100644 index 0000000..08641fd --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/license @@ -0,0 +1,23 @@ +TypeBox: JSON Schema Type Builder with Static Type Resolution for TypeScript + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/package.json new file mode 100644 index 0000000..5d24c50 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/package.json @@ -0,0 +1,49 @@ +{ + "name": "@sinclair/typebox", + "version": "0.27.10", + "description": "JSONSchema Type Builder with Static Type Resolution for TypeScript", + "keywords": [ + "typescript", + "json-schema", + "validate", + "typecheck" + ], + "author": "sinclairzx81", + "license": "MIT", + "main": "./typebox.js", + "types": "./typebox.d.ts", + "exports": { + "./compiler": "./compiler/index.js", + "./errors": "./errors/index.js", + "./system": "./system/index.js", + "./value": "./value/index.js", + ".": "./typebox.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/sinclairzx81/typebox-legacy" + }, + "scripts": { + "clean": "hammer task clean", + "format": "hammer task format", + "start": "hammer task start", + "test": "hammer task test", + "benchmark": "hammer task benchmark", + "build": "hammer task build", + "build:native": "hammer task build_native", + "publish": "hammer task publish" + }, + "devDependencies": { + "@sinclair/hammer": "^0.17.1", + "@typescript/native-preview": "^7.0.0-dev.20260203.1", + "@types/chai": "^4.3.3", + "@types/mocha": "^9.1.1", + "@types/node": "^18.19.130", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "chai": "^4.3.6", + "mocha": "^9.2.2", + "prettier": "^2.7.1", + "typescript": "5.0.2" + } +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/readme.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/readme.md new file mode 100644 index 0000000..c5120a9 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/readme.md @@ -0,0 +1,1424 @@ +
+ +

TypeBox

+ +

JSON Schema Type Builder with Static Type Resolution for TypeScript

+ + + +
+
+ +[![npm version](https://badge.fury.io/js/%40sinclair%2Ftypebox.svg)](https://badge.fury.io/js/%40sinclair%2Ftypebox) +[![Downloads](https://img.shields.io/npm/dm/%40sinclair%2Ftypebox.svg)](https://www.npmjs.com/package/%40sinclair%2Ftypebox) +[![GitHub CI](https://github.com/sinclairzx81/typebox/workflows/GitHub%20CI/badge.svg)](https://github.com/sinclairzx81/typebox/actions) + +
+ + + +## Install + +#### Npm +```bash +$ npm install @sinclair/typebox --save +``` + +#### Deno +```typescript +import { Static, Type } from 'npm:@sinclair/typebox' +``` + +#### Esm + +```typescript +import { Static, Type } from 'https://esm.sh/@sinclair/typebox' +``` + +## Example + +```typescript +import { Static, Type } from '@sinclair/typebox' + +const T = Type.Object({ // const T = { + x: Type.Number(), // type: 'object', + y: Type.Number(), // required: ['x', 'y', 'z'], + z: Type.Number() // properties: { +}) // x: { type: 'number' }, + // y: { type: 'number' }, + // z: { type: 'number' } + // } + // } + +type T = Static // type T = { + // x: number, + // y: number, + // z: number + // } +``` + + + + +## Overview + +TypeBox is a runtime type builder that creates in-memory JSON Schema objects that can be statically inferred as TypeScript types. The schemas produced by this library are designed to match the static type assertion rules of the TypeScript compiler. TypeBox enables one to create a unified type that can be statically checked by TypeScript and runtime asserted using standard JSON Schema validation. + +This library is designed to enable JSON schema to compose with the same flexibility as TypeScript's type system. It can be used as a simple tool to build up complex schemas or integrated into REST or RPC services to help validate data received over the wire. + +License MIT + +## Contents +- [Install](#install) +- [Overview](#overview) +- [Usage](#usage) +- [Types](#types) + - [Standard](#types-standard) + - [Extended](#types-extended) + - [Modifiers](#types-modifiers) + - [Options](#types-options) + - [Generics](#types-generics) + - [References](#types-references) + - [Recursive](#types-recursive) + - [Conditional](#types-conditional) + - [Template Literal](#types-template-literal) + - [Guards](#types-guards) + - [Unsafe](#types-unsafe) + - [Strict](#types-strict) +- [Values](#values) + - [Create](#values-create) + - [Clone](#values-clone) + - [Check](#values-check) + - [Convert](#values-convert) + - [Cast](#values-cast) + - [Equal](#values-equal) + - [Hash](#values-hash) + - [Diff](#values-diff) + - [Patch](#values-patch) + - [Errors](#values-errors) + - [Mutate](#values-mutate) + - [Pointer](#values-pointer) +- [TypeCheck](#typecheck) + - [Ajv](#typecheck-ajv) + - [TypeCompiler](#typecheck-typecompiler) +- [TypeSystem](#typesystem) + - [Types](#typesystem-types) + - [Formats](#typesystem-formats) + - [Policies](#typesystem-policies) +- [Benchmark](#benchmark) + - [Compile](#benchmark-compile) + - [Validate](#benchmark-validate) + - [Compression](#benchmark-compression) +- [Contribute](#contribute) + + + +## Usage + +The following shows general usage. + +```typescript +import { Static, Type } from '@sinclair/typebox' + +//-------------------------------------------------------------------------------------------- +// +// Let's say you have the following type ... +// +//-------------------------------------------------------------------------------------------- + +type T = { + id: string, + name: string, + timestamp: number +} + +//-------------------------------------------------------------------------------------------- +// +// ... you can express this type in the following way. +// +//-------------------------------------------------------------------------------------------- + +const T = Type.Object({ // const T = { + id: Type.String(), // type: 'object', + name: Type.String(), // properties: { + timestamp: Type.Integer() // id: { +}) // type: 'string' + // }, + // name: { + // type: 'string' + // }, + // timestamp: { + // type: 'integer' + // } + // }, + // required: [ + // 'id', + // 'name', + // 'timestamp' + // ] + // } + +//-------------------------------------------------------------------------------------------- +// +// ... then infer back to the original static type this way. +// +//-------------------------------------------------------------------------------------------- + +type T = Static // type T = { + // id: string, + // name: string, + // timestamp: number + // } + +//-------------------------------------------------------------------------------------------- +// +// ... then use the type both as JSON schema and as a TypeScript type. +// +//-------------------------------------------------------------------------------------------- + +import { Value } from '@sinclair/typebox/value' + +function receive(value: T) { // ... as a Static Type + + if(Value.Check(T, value)) { // ... as a JSON Schema + + // ok... + } +} +``` + + + +## Types + +TypeBox types are JSON schema fragments that can be composed into more complex types. Each fragment is structured such that a JSON schema compliant validator can runtime assert a value the same way TypeScript will statically assert a type. TypeBox provides a set of Standard types which are used create JSON schema compliant schematics as well as an Extended type set used to create schematics for constructs native to JavaScript. + + + +### Standard Types + +The following table lists the Standard TypeBox types. These types are fully compatible with the JSON Schema Draft 6 specification. + +```typescript +┌────────────────────────────────┬─────────────────────────────┬────────────────────────────────┐ +│ TypeBox │ TypeScript │ JSON Schema │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Any() │ type T = any │ const T = { } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Unknown() │ type T = unknown │ const T = { } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.String() │ type T = string │ const T = { │ +│ │ │ type: 'string' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Number() │ type T = number │ const T = { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Integer() │ type T = number │ const T = { │ +│ │ │ type: 'integer' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Boolean() │ type T = boolean │ const T = { │ +│ │ │ type: 'boolean' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Null() │ type T = null │ const T = { │ +│ │ │ type: 'null' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Literal(42) │ type T = 42 │ const T = { │ +│ │ │ const: 42, │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Array( │ type T = number[] │ const T = { │ +│ Type.Number() │ │ type: 'array', │ +│ ) │ │ items: { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const T = { │ +│ x: Type.Number(), │ x: number, │ type: 'object', │ +│ y: Type.Number() │ y: number │ required: ['x', 'y'], │ +│ }) │ } │ properties: { │ +│ │ │ x: { │ +│ │ │ type: 'number' │ +│ │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Tuple([ │ type T = [number, number] │ const T = { │ +│ Type.Number(), │ │ type: 'array', │ +│ Type.Number() │ │ items: [{ │ +│ ]) │ │ type: 'number' │ +│ │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ }], │ +│ │ │ additionalItems: false, │ +│ │ │ minItems: 2, │ +│ │ │ maxItems: 2 │ +│ │ │ } │ +│ │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ enum Foo { │ enum Foo { │ const T = { │ +│ A, │ A, │ anyOf: [{ │ +│ B │ B │ type: 'number', │ +│ } │ } │ const: 0 │ +│ │ │ }, { │ +│ const T = Type.Enum(Foo) │ type T = Foo │ type: 'number', │ +│ │ │ const: 1 │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.KeyOf( │ type T = keyof { │ const T = { │ +│ Type.Object({ │ x: number, │ anyOf: [{ │ +│ x: Type.Number(), │ y: number │ type: 'string', │ +│ y: Type.Number() │ } │ const: 'x' │ +│ }) │ │ }, { │ +│ ) │ │ type: 'string', │ +│ │ │ const: 'y' │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Union([ │ type T = string | number │ const T = { │ +│ Type.String(), │ │ anyOf: [{ │ +│ Type.Number() │ │ type: 'string' │ +│ ]) │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Intersect([ │ type T = { │ const T = { │ +│ Type.Object({ │ x: number │ allOf: [{ │ +│ x: Type.Number() │ } & { │ type: 'object', │ +│ }), │ y: number │ required: ['x'], │ +│ Type.Object({ │ } │ properties: { │ +│ y: Type.Number() │ │ x: { │ +│ ]) │ │ type: 'number' │ +│ ]) │ │ } │ +│ │ │ } │ +│ │ │ }, { │ +│ │ │ type: 'object', | +│ │ │ required: ['y'], │ +│ │ │ properties: { │ +│ │ │ y: { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Composite([ │ type I = { │ const T = { │ +│ Type.Object({ │ x: number │ type: 'object', │ +│ x: Type.Number() │ } & { │ required: ['x', 'y'], │ +│ }), │ y: number │ properties: { │ +│ Type.Object({ │ } │ x: { │ +│ y: Type.Number() │ │ type: 'number' │ +│ }) │ type T = { │ }, │ +│ ]) │ [K in keyof I]: I[K] │ y: { │ +│ │ } │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Never() │ type T = never │ const T = { │ +│ │ │ not: {} │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Not( | type T = string │ const T = { │ +| Type.Union([ │ │ allOf: [{ │ +│ Type.Literal('x'), │ │ not: { │ +│ Type.Literal('y'), │ │ anyOf: [ │ +│ Type.Literal('z') │ │ { const: 'x' }, │ +│ ]), │ │ { const: 'y' }, │ +│ Type.String() │ │ { const: 'z' } │ +│ ) │ │ ] │ +│ │ │ } │ +│ │ │ }, { │ +│ │ │ type: 'string' │ +│ │ │ }] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Extends( │ type T = │ const T = { │ +│ Type.String(), │ string extends number │ const: false, │ +│ Type.Number(), │ true : false │ type: 'boolean' │ +│ Type.Literal(true), │ │ } │ +│ Type.Literal(false) │ │ │ +│ ) │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Extract( │ type T = Extract< │ const T = { │ +│ Type.Union([ │ string | number, │ type: 'string' │ +│ Type.String(), │ string │ } │ +│ Type.Number(), │ > │ │ +│ ]), │ │ │ +│ Type.String() │ │ │ +│ ) │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Exclude( │ type T = Exclude< │ const T = { │ +│ Type.Union([ │ string | number, │ type: 'number' │ +│ Type.String(), │ string │ } │ +│ Type.Number(), │ > │ │ +│ ]), │ │ │ +│ Type.String() │ │ │ +│ ) │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const U = Type.Union([ │ type U = 'open' | 'close' │ const T = { │ +│ Type.Literal('open'), │ │ type: 'string', │ +│ Type.Literal('close') │ type T = `on${U}` │ pattern: '^on(open|close)$' │ +│ ]) │ │ } │ +│ │ │ │ +│ const T = Type │ │ │ +│ .TemplateLiteral([ │ │ │ +│ Type.Literal('on'), │ │ │ +│ U │ │ │ +│ ]) │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Record( │ type T = Record< │ const T = { │ +│ Type.String(), │ string, │ type: 'object', │ +│ Type.Number() │ number │ patternProperties: { │ +│ ) │ > │ '^.*$': { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Partial( │ type T = Partial<{ │ const T = { │ +│ Type.Object({ │ x: number, │ type: 'object', │ +│ x: Type.Number(), │ y: number │ properties: { │ +│ y: Type.Number() | }> │ x: { │ +│ }) │ │ type: 'number' │ +│ ) │ │ }, │ +│ │ │ y: { │ +│ │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Required( │ type T = Required<{ │ const T = { │ +│ Type.Object({ │ x?: number, │ type: 'object', │ +│ x: Type.Optional( │ y?: number │ required: ['x', 'y'], │ +│ Type.Number() | }> │ properties: { │ +│ ), │ │ x: { │ +│ y: Type.Optional( │ │ type: 'number' │ +│ Type.Number() │ │ }, │ +│ ) │ │ y: { │ +│ }) │ │ type: 'number' │ +│ ) │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Pick( │ type T = Pick<{ │ const T = { │ +│ Type.Object({ │ x: number, │ type: 'object', │ +│ x: Type.Number(), │ y: number │ required: ['x'], │ +│ y: Type.Number() │ }, 'x'> │ properties: { │ +│ }), ['x'] | │ x: { │ +│ ) │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Omit( │ type T = Omit<{ │ const T = { │ +│ Type.Object({ │ x: number, │ type: 'object', │ +│ x: Type.Number(), │ y: number │ required: ['y'], │ +│ y: Type.Number() │ }, 'x'> │ properties: { │ +│ }), ['x'] | │ y: { │ +│ ) │ │ type: 'number' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const R = { │ +│ x: Type.Number(), │ x: number, │ $ref: 'T' │ +│ y: Type.Number() │ y: number │ } │ +│ }, { $id: 'T' }) | } │ │ +│ │ │ │ +│ const R = Type.Ref(T) │ type R = T │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +└────────────────────────────────┴─────────────────────────────┴────────────────────────────────┘ +``` + + + +### Extended Types + +TypeBox provides several extended types that can be used to produce schematics for common JavaScript constructs. These types can not be used with standard JSON schema validators; but are useful to help frame schematics for RPC interfaces that may receive JSON validated data. Extended types are prefixed with the `[Extended]` doc comment for convenience. The following table lists the supported types. + +```typescript +┌────────────────────────────────┬─────────────────────────────┬────────────────────────────────┐ +│ TypeBox │ TypeScript │ Extended Schema │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Constructor([ │ type T = new ( │ const T = { │ +│ Type.String(), │ arg0: string, │ type: 'object', │ +│ Type.Number() │ arg1: number │ instanceOf: 'Constructor', │ +│ ], Type.Boolean()) │ ) => boolean │ parameters: [{ │ +│ │ │ type: 'string' │ +│ │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ }], │ +│ │ │ return: { │ +│ │ │ type: 'boolean' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Function([ │ type T = ( │ const T = { │ +| Type.String(), │ arg0: string, │ type : 'object', │ +│ Type.Number() │ arg1: number │ instanceOf: 'Function', │ +│ ], Type.Boolean()) │ ) => boolean │ parameters: [{ │ +│ │ │ type: 'string' │ +│ │ │ }, { │ +│ │ │ type: 'number' │ +│ │ │ }], │ +│ │ │ return: { │ +│ │ │ type: 'boolean' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Promise( │ type T = Promise │ const T = { │ +│ Type.String() │ │ type: 'object', │ +│ ) │ │ instanceOf: 'Promise', │ +│ │ │ item: { │ +│ │ │ type: 'string' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Uint8Array() │ type T = Uint8Array │ const T = { │ +│ │ │ type: 'object', │ +│ │ │ instanceOf: 'Uint8Array' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Date() │ type T = Date │ const T = { │ +│ │ │ type: 'object', │ +│ │ │ instanceOf: 'Date' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Undefined() │ type T = undefined │ const T = { │ +│ │ │ type: 'null', │ +│ │ │ typeOf: 'Undefined' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.RegEx(/foo/) │ type T = string │ const T = { │ +│ │ │ type: 'string', │ +│ │ │ pattern: 'foo' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Symbol() │ type T = symbol │ const T = { │ +│ │ │ type: 'null', │ +│ │ │ typeOf: 'Symbol' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.BigInt() │ type T = bigint │ const T = { │ +│ │ │ type: 'null', │ +│ │ │ typeOf: 'BigInt' │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Void() │ type T = void │ const T = { │ +│ │ │ type: 'null' │ +│ │ │ typeOf: 'Void' │ +│ │ │ } │ +│ │ │ │ +└────────────────────────────────┴─────────────────────────────┴────────────────────────────────┘ +``` + + + +### Modifiers + +TypeBox provides modifiers that allow schema properties to be statically inferred as `readonly` or `optional`. The following table shows the supported modifiers and how they map between TypeScript and JSON Schema. + +```typescript +┌────────────────────────────────┬─────────────────────────────┬────────────────────────────────┐ +│ TypeBox │ TypeScript │ JSON Schema │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const T = { │ +│ name: Type.Optional( │ name?: string │ type: 'object', │ +│ Type.String() │ } │ properties: { │ +│ ) │ │ name: { │ +│ }) │ │ type: 'string' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const T = { │ +│ name: Type.Readonly( │ readonly name: string │ type: 'object', │ +│ Type.String() │ } │ properties: { │ +│ ) │ │ name: { │ +│ }) │ │ type: 'string' │ +│ │ │ } │ +│ │ │ }, │ +│ │ │ required: ['name'] │ +│ │ │ } │ +│ │ │ │ +├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤ +│ const T = Type.Object({ │ type T = { │ const T = { │ +│ name: Type.ReadonlyOptional( │ readonly name?: string │ type: 'object', │ +│ Type.String() │ } │ properties: { │ +│ ) │ │ name: { │ +│ }) │ │ type: 'string' │ +│ │ │ } │ +│ │ │ } │ +│ │ │ } │ +│ │ │ │ +└────────────────────────────────┴─────────────────────────────┴────────────────────────────────┘ +``` + + + +### Options + +You can pass JSON Schema options on the last argument of any type. Option hints specific to each type are provided for convenience. + +```typescript +// String must be an email +const T = Type.String({ // const T = { + format: 'email' // type: 'string', +}) // format: 'email' + // } + +// Mumber must be a multiple of 2 +const T = Type.Number({ // const T = { + multipleOf: 2 // type: 'number', +}) // multipleOf: 2 + // } + +// Array must have at least 5 integer values +const T = Type.Array(Type.Integer(), { // const T = { + minItems: 5 // type: 'array', +}) // minItems: 5, + // items: { + // type: 'integer' + // } + // } + +``` + + + +### Generic Types + +Generic types can be created with generic functions constrained to type `TSchema`. The following creates a generic `Vector` type. + +```typescript +import { Type, Static, TSchema } from '@sinclair/typebox' + +const Vector = (t: T) => Type.Object({ x: t, y: t, z: t }) + +const NumberVector = Vector(Type.Number()) // const NumberVector = { + // type: 'object', + // required: ['x', 'y', 'z'], + // properties: { + // x: { type: 'number' }, + // y: { type: 'number' }, + // z: { type: 'number' } + // } + // } + +type NumberVector = Static // type NumberVector = { + // x: number, + // y: number, + // z: number + // } + +const BooleanVector = Vector(Type.Boolean()) // const BooleanVector = { + // type: 'object', + // required: ['x', 'y', 'z'], + // properties: { + // x: { type: 'boolean' }, + // y: { type: 'boolean' }, + // z: { type: 'boolean' } + // } + // } + +type BooleanVector = Static // type BooleanVector = { + // x: boolean, + // y: boolean, + // z: boolean + // } +``` + +The following creates a generic `Nullable` type. + +```typescript +const Nullable = (schema: T) => Type.Union([schema, Type.Null()]) + +const T = Nullable(Type.String()) // const T = { + // anyOf: [ + // { type: 'string' }, + // { type: 'null' } + // ] + // } + +type T = Static // type T = string | null +``` + + + +### Reference Types + +Reference types are supported with `Type.Ref`. The target type must specify a valid `$id`. + +```typescript +const T = Type.String({ $id: 'T' }) // const T = { + // $id: 'T', + // type: 'string' + // } + +const R = Type.Ref(T) // const R = { + // $ref: 'T' + // } +``` + + + +### Recursive Types + +Recursive types are supported with `Type.Recursive` + +```typescript +const Node = Type.Recursive(Node => Type.Object({ // const Node = { + id: Type.String(), // $id: 'Node', + nodes: Type.Array(Node) // type: 'object', +}), { $id: 'Node' }) // properties: { + // id: { + // type: 'string' + // }, + // nodes: { + // type: 'array', + // items: { + // $ref: 'Node' + // } + // } + // }, + // required: [ + // 'id', + // 'nodes' + // ] + // } + +type Node = Static // type Node = { + // id: string + // nodes: Node[] + // } + +function test(node: Node) { + const id = node.nodes[0].nodes[0].id // id is string +} +``` + + + +### Conditional Types + +Conditional types are supported with `Type.Extends`, `Type.Exclude` and `Type.Extract` + +```typescript +// TypeScript + +type T0 = string extends number ? true : false // type T0 = false + +type T1 = Extract // type T1 = number + +type T2 = Exclude // type T2 = string + +// TypeBox + +const T0 = Type.Extends(Type.String(), Type.Number(), Type.Literal(true), Type.Literal(false)) + +const T1 = Type.Extract(Type.Union([Type.String(), Type.Number()]), Type.Number()) + +const T2 = Type.Exclude(Type.Union([Type.String(), Type.Number()]), Type.Number()) + + +type T0 = Static // type T0 = false + +type T1 = Static // type T1 = number + +type T2 = Static // type T2 = string +``` + + + +### Template Literal Types + +Template Literal types are supported with `Type.TemplateLiteral` + +```typescript +// TypeScript + +type T = `option${'A'|'B'}` // type T = 'optionA' | 'optionB' + +type R = Record // type R = { + // optionA: string + // optionB: string + // } + +// TypeBox + +const T = Type.TemplateLiteral([ // const T = { + Type.Literal('option'), // pattern: '^option(A|B)$', + Type.Union([ // type: 'string' + Type.Literal('A'), // } + Type.Literal('B') + ]) +]) + +const R = Type.Record(T, Type.String()) // const R = { + // type: 'object', + // required: ['optionA', 'optionB'], + // properties: { + // optionA: { + // type: 'string' + // }, + // optionB: { + // type: 'string' + // } + // } + // } + +type T = Static // type T = 'optionA' | 'optionB' + +type R = Static // type R = { + // optionA: string + // optionB: string + // } +``` + + + +### Unsafe + +Use `Type.Unsafe` to create custom schematics with user defined inference rules. + +```typescript +const T = Type.Unsafe({ type: 'number' }) // const T = { + // type: 'number' + // } + +type T = Static // type T = string +``` + +The `Type.Unsafe` type can be useful to express specific OpenAPI schema representations. + +```typescript +import { Type, Static, TSchema } from '@sinclair/typebox' + +// Nullable + +function Nullable(schema: T) { + return Type.Unsafe | null>({ ...schema, nullable: true }) +} + +const T = Nullable(Type.String()) // const T = { + // type: 'string', + // nullable: true + // } + +type T = Static // type T = string | null + +// StringEnum + +function StringEnum(values: [...T]) { + return Type.Unsafe({ type: 'string', enum: values }) +} + +const T = StringEnum(['A', 'B', 'C']) // const T = { + // enum: ['A', 'B', 'C'] + // } + +type T = Static // type T = 'A' | 'B' | 'C' +``` + + + +### Guards + +TypeBox provides a `TypeGuard` module that can be used for reflection and asserting values as types. + +```typescript +import { Type, TypeGuard } from '@sinclair/typebox' + +const T = Type.String() + +if(TypeGuard.TString(T)) { + + // T is TString +} +``` + + + +### Strict + +TypeBox schemas contain the `Kind` and `Modifier` symbol properties. These properties are used for type composition and reflection. These properties are not strictly valid JSON schema; so in some cases it may be desirable to omit them. TypeBox provides a `Type.Strict` function that will omit these properties if necessary. + +```typescript +const T = Type.Object({ // const T = { + name: Type.Optional(Type.String()) // [Kind]: 'Object', +}) // type: 'object', + // properties: { + // name: { + // [Kind]: 'String', + // type: 'string', + // [Modifier]: 'Optional' + // } + // } + // } + +const U = Type.Strict(T) // const U = { + // type: 'object', + // properties: { + // name: { + // type: 'string' + // } + // } + // } +``` + + + +## Values + +TypeBox provides an optional utility module that can be used to perform common operations on JavaScript values. This module includes functionality to create, check and cast values from types as well as check equality, clone, diff and patch JavaScript values. This module is provided via optional import. + +```typescript +import { Value } from '@sinclair/typebox/value' +``` + + + +### Create + +Use the Create function to create a value from a type. TypeBox will use default values if specified. + +```typescript +const T = Type.Object({ x: Type.Number(), y: Type.Number({ default: 42 }) }) + +const A = Value.Create(T) // const A = { x: 0, y: 42 } +``` + + + +### Clone + +Use the Clone function to deeply clone a value + +```typescript +const A = Value.Clone({ x: 1, y: 2, z: 3 }) // const A = { x: 1, y: 2, z: 3 } +``` + + + +### Check + +Use the Check function to type check a value + +```typescript +const T = Type.Object({ x: Type.Number() }) + +const R = Value.Check(T, { x: 1 }) // const R = true +``` + + + +### Convert + +Use the Convert function to convert a value into its target type if a reasonable conversion is possible. + +```typescript +const T = Type.Object({ x: Type.Number() }) + +const R1 = Value.Convert(T, { x: '3.14' }) // const R1 = { x: 3.14 } + +const R2 = Value.Convert(T, { x: 'not a number' }) // const R2 = { x: 'not a number' } +``` + + + +### Cast + +Use the Cast function to cast a value into a type. The cast function will retain as much information as possible from the original value. + +```typescript +const T = Type.Object({ x: Type.Number(), y: Type.Number() }, { additionalProperties: false }) + +const X = Value.Cast(T, null) // const X = { x: 0, y: 0 } + +const Y = Value.Cast(T, { x: 1 }) // const Y = { x: 1, y: 0 } + +const Z = Value.Cast(T, { x: 1, y: 2, z: 3 }) // const Z = { x: 1, y: 2 } +``` + + + +### Equal + +Use the Equal function to deeply check for value equality. + +```typescript +const R = Value.Equal( // const R = true + { x: 1, y: 2, z: 3 }, + { x: 1, y: 2, z: 3 } +) +``` + + + +### Hash + +Use the Hash function to create a [FNV1A-64](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) non cryptographic hash of a value. + +```typescript +const A = Value.Hash({ x: 1, y: 2, z: 3 }) // const A = 2910466848807138541n + +const B = Value.Hash({ x: 1, y: 4, z: 3 }) // const B = 1418369778807423581n +``` + + + +### Diff + +Use the Diff function to produce a sequence of edits to transform one value into another. + +```typescript +const E = Value.Diff( // const E = [ + { x: 1, y: 2, z: 3 }, // { type: 'update', path: '/y', value: 4 }, + { y: 4, z: 5, w: 6 } // { type: 'update', path: '/z', value: 5 }, +) // { type: 'insert', path: '/w', value: 6 }, + // { type: 'delete', path: '/x' } + // ] +``` + + + +### Patch + +Use the Patch function to apply edits + +```typescript +const A = { x: 1, y: 2 } + +const B = { x: 3 } + +const E = Value.Diff(A, B) // const E = [ + // { type: 'update', path: '/x', value: 3 }, + // { type: 'delete', path: '/y' } + // ] + +const C = Value.Patch(A, E) // const C = { x: 3 } +``` + + + +### Errors + +Use the Errors function enumerate validation errors. + +```typescript +const T = Type.Object({ x: Type.Number(), y: Type.Number() }) + +const R = [...Value.Errors(T, { x: '42' })] // const R = [{ + // schema: { type: 'number' }, + // path: '/x', + // value: '42', + // message: 'Expected number' + // }, { + // schema: { type: 'number' }, + // path: '/y', + // value: undefined, + // message: 'Expected number' + // }] +``` + + + +### Mutate + +Use the Mutate function to perform a deep mutable value assignment while retaining internal references. + +```typescript +const Y = { z: 1 } // const Y = { z: 1 } + +const X = { y: Y } // const X = { y: { z: 1 } } + +const A = { x: X } // const A = { x: { y: { z: 1 } } } + + +Value.Mutate(A, { x: { y: { z: 2 } } }) // const A' = { x: { y: { z: 2 } } } + +const R0 = A.x.y.z === 2 // const R0 = 2 + +const R1 = A.x.y === Y // const R1 = true + +const R2 = A.x === X // const R2 = true +``` + + + +### Pointer + +Use ValuePointer to perform mutable updates on existing values using [RFC6901](https://www.rfc-editor.org/rfc/rfc6901) JSON Pointers. + +```typescript +import { ValuePointer } from '@sinclair/typebox/value' + +const A = { x: 0, y: 0, z: 0 } + +ValuePointer.Set(A, '/x', 1) // const A' = { x: 1, y: 0, z: 0 } + +ValuePointer.Set(A, '/y', 1) // const A' = { x: 1, y: 1, z: 0 } + +ValuePointer.Set(A, '/z', 1) // const A' = { x: 1, y: 1, z: 1 } +``` + + + +## TypeCheck + +TypeBox types target JSON Schema draft 6 so are compatible with any validator that supports this specification. TypeBox also provides a built in type checking compiler designed specifically for high performance compilation and value assertion. + +The following sections detail using Ajv and TypeBox's compiler infrastructure. + + + +## Ajv + +The following shows the recommended setup for Ajv. + +```bash +$ npm install ajv ajv-formats --save +``` + +```typescript +import { Type } from '@sinclair/typebox' +import addFormats from 'ajv-formats' +import Ajv from 'ajv' + +const ajv = addFormats(new Ajv({}), [ + 'date-time', + 'time', + 'date', + 'email', + 'hostname', + 'ipv4', + 'ipv6', + 'uri', + 'uri-reference', + 'uuid', + 'uri-template', + 'json-pointer', + 'relative-json-pointer', + 'regex' +]) + +const C = ajv.compile(Type.Object({ + x: Type.Number(), + y: Type.Number(), + z: Type.Number() +})) + +const R = C({ x: 1, y: 2, z: 3 }) // const R = true +``` + + + +### TypeCompiler + +The TypeBox TypeCompiler is a high performance JIT compiler that transforms TypeBox types into optimized JavaScript validation routines. The compiler is tuned for fast compilation as well as fast value assertion. It is designed to serve as a validation backend that can be integrated into larger applications; but can also be used as a general purpose validator. + +The TypeCompiler is provided as an optional import. + +```typescript +import { TypeCompiler } from '@sinclair/typebox/compiler' +``` + +Use the `Compile(...)` function to compile a type. + +```typescript +const C = TypeCompiler.Compile(Type.Object({ // const C: TypeCheck> + +const R = C.Check({ x: 1, y: 2, z: 3 }) // const R = true +``` + +Use the `Errors(...)` function to produce diagnostic errors for a value. The `Errors(...)` function will return an iterator that if enumerated; will perform an exhaustive check across the entire value and yield any error found. For performance, this function should only be called after failed `Check(...)`. Applications may also choose to yield only the first value to avoid exhaustive error generation. + +```typescript +const C = TypeCompiler.Compile(Type.Object({ // const C: TypeCheck> + +const value = { } + +const errors = [...C.Errors(value)] // const errors = [{ + // schema: { type: 'number' }, + // path: '/x', + // value: undefined, + // message: 'Expected number' + // }, { + // schema: { type: 'number' }, + // path: '/y', + // value: undefined, + // message: 'Expected number' + // }, { + // schema: { type: 'number' }, + // path: '/z', + // value: undefined, + // message: 'Expected number' + // }] +``` + +Compiled routines can be inspected with the `.Code()` function. + +```typescript +const C = TypeCompiler.Compile(Type.String()) // const C: TypeCheck + +console.log(C.Code()) // return function check(value) { + // return ( + // (typeof value === 'string') + // ) + // } +``` + + + +## TypeSystem + +The TypeBox TypeSystem module provides functionality to define types above and beyond the Standard and Extended type sets as well as control various assertion polices. Configurations made to the TypeSystem module are observed by both `TypeCompiler` and `Value` modules. + +The TypeSystem module is provided as an optional import. + +```typescript +import { TypeSystem } from '@sinclair/typebox/system' +``` + + + +### Types + +Use the `Type(...)` function to create a custom type. This function will return a type factory function that can be used to construct the type. The following creates a Point type. + +```typescript +type PointOptions = { } // The Type Options + +type PointType = { x: number, y: number } // The Static Type + +const Point = TypeSystem.Type('Point', (options, value) => { + return ( + typeof value === 'object' && value !== null && + typeof value.x === 'number' && + typeof value.y === 'number' + ) +}) + +const T = Point() + +type T = Static // type T = { x: number, y: number } + +const R = Value.Check(T, { x: 1, y: 2 }) // const R = true +``` + + + +### Formats + +Use the `Format(...)` function to create a custom string format. The following creates a format that checks for lowercase strings. + +```typescript +TypeSystem.Format('lowercase', value => value === value.toLowerCase()) // format should be lowercase + +const T = Type.String({ format: 'lowercase' }) + +const A = Value.Check(T, 'Hello') // const A = false + +const B = Value.Check(T, 'hello') // const B = true +``` + + + +### Policies + +TypeBox validates using JSON Schema assertion policies by default. It is possible to override these policies and have TypeBox assert using TypeScript policies. The following overrides are available. + +```typescript +// Allow arrays to validate as object types (default is false) +// +// const A: {} = [] - allowed in TS + +TypeSystem.AllowArrayObjects = true + +// Allow numeric values to be NaN or + or - Infinity (default is false) +// +// const A: number = NaN - allowed in TS + +TypeSystem.AllowNaN = true +``` + + + +## Benchmark + +This project maintains a set of benchmarks that measure Ajv, Value and TypeCompiler compilation and validation performance. These benchmarks can be run locally by cloning this repository and running `npm run benchmark`. The results below show for Ajv version 8.12.0. + +For additional comparative benchmarks, please refer to [typescript-runtime-type-benchmarks](https://moltar.github.io/typescript-runtime-type-benchmarks/). + + + +### Compile + +This benchmark measures compilation performance for varying types. You can review this benchmark [here](https://github.com/sinclairzx81/typebox/blob/master/benchmark/measurement/module/compile.ts). + +```typescript +┌────────────────────────────┬────────────┬──────────────┬──────────────┬──────────────┐ +│ (index) │ Iterations │ Ajv │ TypeCompiler │ Performance │ +├────────────────────────────┼────────────┼──────────────┼──────────────┼──────────────┤ +│ Literal_String │ 1000 │ ' 257 ms' │ ' 8 ms' │ ' 32.13 x' │ +│ Literal_Number │ 1000 │ ' 203 ms' │ ' 4 ms' │ ' 50.75 x' │ +│ Literal_Boolean │ 1000 │ ' 183 ms' │ ' 4 ms' │ ' 45.75 x' │ +│ Primitive_Number │ 1000 │ ' 174 ms' │ ' 8 ms' │ ' 21.75 x' │ +│ Primitive_String │ 1000 │ ' 158 ms' │ ' 9 ms' │ ' 17.56 x' │ +│ Primitive_String_Pattern │ 1000 │ ' 213 ms' │ ' 13 ms' │ ' 16.38 x' │ +│ Primitive_Boolean │ 1000 │ ' 136 ms' │ ' 6 ms' │ ' 22.67 x' │ +│ Primitive_Null │ 1000 │ ' 144 ms' │ ' 6 ms' │ ' 24.00 x' │ +│ Object_Unconstrained │ 1000 │ ' 1176 ms' │ ' 38 ms' │ ' 30.95 x' │ +│ Object_Constrained │ 1000 │ ' 1181 ms' │ ' 31 ms' │ ' 38.10 x' │ +│ Object_Vector3 │ 1000 │ ' 387 ms' │ ' 8 ms' │ ' 48.38 x' │ +│ Object_Box3D │ 1000 │ ' 1693 ms' │ ' 25 ms' │ ' 67.72 x' │ +│ Tuple_Primitive │ 1000 │ ' 470 ms' │ ' 15 ms' │ ' 31.33 x' │ +│ Tuple_Object │ 1000 │ ' 1206 ms' │ ' 17 ms' │ ' 70.94 x' │ +│ Composite_Intersect │ 1000 │ ' 567 ms' │ ' 20 ms' │ ' 28.35 x' │ +│ Composite_Union │ 1000 │ ' 515 ms' │ ' 21 ms' │ ' 24.52 x' │ +│ Math_Vector4 │ 1000 │ ' 787 ms' │ ' 10 ms' │ ' 78.70 x' │ +│ Math_Matrix4 │ 1000 │ ' 386 ms' │ ' 8 ms' │ ' 48.25 x' │ +│ Array_Primitive_Number │ 1000 │ ' 349 ms' │ ' 7 ms' │ ' 49.86 x' │ +│ Array_Primitive_String │ 1000 │ ' 336 ms' │ ' 4 ms' │ ' 84.00 x' │ +│ Array_Primitive_Boolean │ 1000 │ ' 284 ms' │ ' 3 ms' │ ' 94.67 x' │ +│ Array_Object_Unconstrained │ 1000 │ ' 1704 ms' │ ' 19 ms' │ ' 89.68 x' │ +│ Array_Object_Constrained │ 1000 │ ' 1456 ms' │ ' 18 ms' │ ' 80.89 x' │ +│ Array_Tuple_Primitive │ 1000 │ ' 792 ms' │ ' 15 ms' │ ' 52.80 x' │ +│ Array_Tuple_Object │ 1000 │ ' 1552 ms' │ ' 17 ms' │ ' 91.29 x' │ +│ Array_Composite_Intersect │ 1000 │ ' 744 ms' │ ' 18 ms' │ ' 41.33 x' │ +│ Array_Composite_Union │ 1000 │ ' 783 ms' │ ' 15 ms' │ ' 52.20 x' │ +│ Array_Math_Vector4 │ 1000 │ ' 1093 ms' │ ' 14 ms' │ ' 78.07 x' │ +│ Array_Math_Matrix4 │ 1000 │ ' 684 ms' │ ' 6 ms' │ ' 114.00 x' │ +└────────────────────────────┴────────────┴──────────────┴──────────────┴──────────────┘ +``` + + + +### Validate + +This benchmark measures validation performance for varying types. You can review this benchmark [here](https://github.com/sinclairzx81/typebox/blob/master/benchmark/measurement/module/check.ts). + +```typescript +┌────────────────────────────┬────────────┬──────────────┬──────────────┬──────────────┬──────────────┐ +│ (index) │ Iterations │ ValueCheck │ Ajv │ TypeCompiler │ Performance │ +├────────────────────────────┼────────────┼──────────────┼──────────────┼──────────────┼──────────────┤ +│ Literal_String │ 1000000 │ ' 27 ms' │ ' 6 ms' │ ' 5 ms' │ ' 1.20 x' │ +│ Literal_Number │ 1000000 │ ' 23 ms' │ ' 21 ms' │ ' 11 ms' │ ' 1.91 x' │ +│ Literal_Boolean │ 1000000 │ ' 21 ms' │ ' 20 ms' │ ' 10 ms' │ ' 2.00 x' │ +│ Primitive_Number │ 1000000 │ ' 26 ms' │ ' 19 ms' │ ' 11 ms' │ ' 1.73 x' │ +│ Primitive_String │ 1000000 │ ' 25 ms' │ ' 19 ms' │ ' 10 ms' │ ' 1.90 x' │ +│ Primitive_String_Pattern │ 1000000 │ ' 155 ms' │ ' 49 ms' │ ' 43 ms' │ ' 1.14 x' │ +│ Primitive_Boolean │ 1000000 │ ' 23 ms' │ ' 19 ms' │ ' 10 ms' │ ' 1.90 x' │ +│ Primitive_Null │ 1000000 │ ' 24 ms' │ ' 19 ms' │ ' 10 ms' │ ' 1.90 x' │ +│ Object_Unconstrained │ 1000000 │ ' 804 ms' │ ' 35 ms' │ ' 28 ms' │ ' 1.25 x' │ +│ Object_Constrained │ 1000000 │ ' 1041 ms' │ ' 55 ms' │ ' 41 ms' │ ' 1.34 x' │ +│ Object_Vector3 │ 1000000 │ ' 380 ms' │ ' 26 ms' │ ' 20 ms' │ ' 1.30 x' │ +│ Object_Box3D │ 1000000 │ ' 1785 ms' │ ' 65 ms' │ ' 52 ms' │ ' 1.25 x' │ +│ Object_Recursive │ 1000000 │ ' 4984 ms' │ ' 396 ms' │ ' 114 ms' │ ' 3.47 x' │ +│ Tuple_Primitive │ 1000000 │ ' 168 ms' │ ' 24 ms' │ ' 16 ms' │ ' 1.50 x' │ +│ Tuple_Object │ 1000000 │ ' 673 ms' │ ' 30 ms' │ ' 26 ms' │ ' 1.15 x' │ +│ Composite_Intersect │ 1000000 │ ' 751 ms' │ ' 28 ms' │ ' 20 ms' │ ' 1.40 x' │ +│ Composite_Union │ 1000000 │ ' 489 ms' │ ' 24 ms' │ ' 16 ms' │ ' 1.50 x' │ +│ Math_Vector4 │ 1000000 │ ' 259 ms' │ ' 23 ms' │ ' 13 ms' │ ' 1.77 x' │ +│ Math_Matrix4 │ 1000000 │ ' 1002 ms' │ ' 40 ms' │ ' 30 ms' │ ' 1.33 x' │ +│ Array_Primitive_Number │ 1000000 │ ' 252 ms' │ ' 22 ms' │ ' 15 ms' │ ' 1.47 x' │ +│ Array_Primitive_String │ 1000000 │ ' 227 ms' │ ' 22 ms' │ ' 18 ms' │ ' 1.22 x' │ +│ Array_Primitive_Boolean │ 1000000 │ ' 150 ms' │ ' 23 ms' │ ' 22 ms' │ ' 1.05 x' │ +│ Array_Object_Unconstrained │ 1000000 │ ' 4754 ms' │ ' 71 ms' │ ' 64 ms' │ ' 1.11 x' │ +│ Array_Object_Constrained │ 1000000 │ ' 4787 ms' │ ' 142 ms' │ ' 123 ms' │ ' 1.15 x' │ +│ Array_Object_Recursive │ 1000000 │ ' 19088 ms' │ ' 1735 ms' │ ' 314 ms' │ ' 5.53 x' │ +│ Array_Tuple_Primitive │ 1000000 │ ' 650 ms' │ ' 41 ms' │ ' 31 ms' │ ' 1.32 x' │ +│ Array_Tuple_Object │ 1000000 │ ' 2770 ms' │ ' 67 ms' │ ' 55 ms' │ ' 1.22 x' │ +│ Array_Composite_Intersect │ 1000000 │ ' 2693 ms' │ ' 50 ms' │ ' 39 ms' │ ' 1.28 x' │ +│ Array_Composite_Union │ 1000000 │ ' 1982 ms' │ ' 72 ms' │ ' 33 ms' │ ' 2.18 x' │ +│ Array_Math_Vector4 │ 1000000 │ ' 1068 ms' │ ' 40 ms' │ ' 26 ms' │ ' 1.54 x' │ +│ Array_Math_Matrix4 │ 1000000 │ ' 4609 ms' │ ' 115 ms' │ ' 88 ms' │ ' 1.31 x' │ +└────────────────────────────┴────────────┴──────────────┴──────────────┴──────────────┴──────────────┘ +``` + + + +### Compression + +The following table lists esbuild compiled and minified sizes for each TypeBox module. + +```typescript +┌──────────────────────┬────────────┬────────────┬─────────────┐ +│ (index) │ Compiled │ Minified │ Compression │ +├──────────────────────┼────────────┼────────────┼─────────────┤ +│ typebox/compiler │ '124.3 kb' │ ' 55.7 kb' │ '2.23 x' │ +│ typebox/errors │ '107.8 kb' │ ' 47.9 kb' │ '2.25 x' │ +│ typebox/system │ ' 73.3 kb' │ ' 30.2 kb' │ '2.43 x' │ +│ typebox/value │ '170.7 kb' │ ' 74.2 kb' │ '2.30 x' │ +│ typebox │ ' 72.0 kb' │ ' 29.7 kb' │ '2.43 x' │ +└──────────────────────┴────────────┴────────────┴─────────────┘ +``` + + + +## Contribute + +TypeBox is open to community contribution. Please ensure you submit an open issue before submitting your pull request. The TypeBox project preferences open community discussion prior to accepting new features. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/index.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/index.d.ts new file mode 100644 index 0000000..4b58cda --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/index.d.ts @@ -0,0 +1 @@ +export * from './system'; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/index.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/index.js new file mode 100644 index 0000000..3c5107f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/index.js @@ -0,0 +1,44 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/system + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./system"), exports); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/system.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/system.d.ts new file mode 100644 index 0000000..4308454 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/system.d.ts @@ -0,0 +1,26 @@ +import * as Types from '../typebox'; +export declare class TypeSystemDuplicateTypeKind extends Error { + constructor(kind: string); +} +export declare class TypeSystemDuplicateFormat extends Error { + constructor(kind: string); +} +/** Creates user defined types and formats and provides overrides for value checking behaviours */ +export declare namespace TypeSystem { + /** Sets whether TypeBox should assert optional properties using the TypeScript `exactOptionalPropertyTypes` assertion policy. The default is `false` */ + let ExactOptionalPropertyTypes: boolean; + /** Sets whether arrays should be treated as a kind of objects. The default is `false` */ + let AllowArrayObjects: boolean; + /** Sets whether `NaN` or `Infinity` should be treated as valid numeric values. The default is `false` */ + let AllowNaN: boolean; + /** Sets whether `null` should validate for void types. The default is `false` */ + let AllowVoidNull: boolean; + /** Creates a new type */ + function Type(kind: string, check: (options: Options, value: unknown) => boolean): (options?: Partial) => Types.TUnsafe; + /** Creates a new string format */ + function Format(format: F, check: (value: string) => boolean): F; + /** @deprecated Use `TypeSystem.Type()` instead. */ + function CreateType(kind: string, check: (options: Options, value: unknown) => boolean): (options?: Partial) => Types.TUnsafe; + /** @deprecated Use `TypeSystem.Format()` instead. */ + function CreateFormat(format: F, check: (value: string) => boolean): F; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/system.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/system.js new file mode 100644 index 0000000..44911a4 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/system/system.js @@ -0,0 +1,90 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/system + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TypeSystem = exports.TypeSystemDuplicateFormat = exports.TypeSystemDuplicateTypeKind = void 0; +const Types = require("../typebox"); +class TypeSystemDuplicateTypeKind extends Error { + constructor(kind) { + super(`Duplicate type kind '${kind}' detected`); + } +} +exports.TypeSystemDuplicateTypeKind = TypeSystemDuplicateTypeKind; +class TypeSystemDuplicateFormat extends Error { + constructor(kind) { + super(`Duplicate string format '${kind}' detected`); + } +} +exports.TypeSystemDuplicateFormat = TypeSystemDuplicateFormat; +/** Creates user defined types and formats and provides overrides for value checking behaviours */ +var TypeSystem; +(function (TypeSystem) { + // ------------------------------------------------------------------------ + // Assertion Policies + // ------------------------------------------------------------------------ + /** Sets whether TypeBox should assert optional properties using the TypeScript `exactOptionalPropertyTypes` assertion policy. The default is `false` */ + TypeSystem.ExactOptionalPropertyTypes = false; + /** Sets whether arrays should be treated as a kind of objects. The default is `false` */ + TypeSystem.AllowArrayObjects = false; + /** Sets whether `NaN` or `Infinity` should be treated as valid numeric values. The default is `false` */ + TypeSystem.AllowNaN = false; + /** Sets whether `null` should validate for void types. The default is `false` */ + TypeSystem.AllowVoidNull = false; + // ------------------------------------------------------------------------ + // String Formats and Types + // ------------------------------------------------------------------------ + /** Creates a new type */ + function Type(kind, check) { + if (Types.TypeRegistry.Has(kind)) + throw new TypeSystemDuplicateTypeKind(kind); + Types.TypeRegistry.Set(kind, check); + return (options = {}) => Types.Type.Unsafe({ ...options, [Types.Kind]: kind }); + } + TypeSystem.Type = Type; + /** Creates a new string format */ + function Format(format, check) { + if (Types.FormatRegistry.Has(format)) + throw new TypeSystemDuplicateFormat(format); + Types.FormatRegistry.Set(format, check); + return format; + } + TypeSystem.Format = Format; + // ------------------------------------------------------------------------ + // Deprecated + // ------------------------------------------------------------------------ + /** @deprecated Use `TypeSystem.Type()` instead. */ + function CreateType(kind, check) { + return Type(kind, check); + } + TypeSystem.CreateType = CreateType; + /** @deprecated Use `TypeSystem.Format()` instead. */ + function CreateFormat(format, check) { + return Format(format, check); + } + TypeSystem.CreateFormat = CreateFormat; +})(TypeSystem = exports.TypeSystem || (exports.TypeSystem = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/typebox.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/typebox.d.ts new file mode 100644 index 0000000..9581b4a --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/typebox.d.ts @@ -0,0 +1,717 @@ +export declare const Modifier: unique symbol; +export declare const Hint: unique symbol; +export declare const Kind: unique symbol; +export declare const PatternBoolean = "(true|false)"; +export declare const PatternNumber = "(0|[1-9][0-9]*)"; +export declare const PatternString = "(.*)"; +export declare const PatternBooleanExact: string; +export declare const PatternNumberExact: string; +export declare const PatternStringExact: string; +export type TupleToIntersect = T extends [infer I] ? I : T extends [infer I, ...infer R] ? I & TupleToIntersect : never; +export type TupleToUnion = { + [K in keyof T]: T[K]; +}[number]; +export type UnionToIntersect = (U extends unknown ? (arg: U) => 0 : never) extends (arg: infer I) => 0 ? I : never; +export type UnionLast = UnionToIntersect 0 : never> extends (x: infer L) => 0 ? L : never; +export type UnionToTuple> = [U] extends [never] ? [] : [...UnionToTuple>, L]; +export type Assert = T extends E ? T : never; +export type Evaluate = T extends infer O ? { + [K in keyof O]: O[K]; +} : never; +export type Ensure = T extends infer U ? U : never; +export type TModifier = TReadonlyOptional | TOptional | TReadonly; +export type TReadonly = T & { + [Modifier]: 'Readonly'; +}; +export type TOptional = T & { + [Modifier]: 'Optional'; +}; +export type TReadonlyOptional = T & { + [Modifier]: 'ReadonlyOptional'; +}; +export interface SchemaOptions { + $schema?: string; + /** Id for this schema */ + $id?: string; + /** Title of this schema */ + title?: string; + /** Description of this schema */ + description?: string; + /** Default value for this schema */ + default?: any; + /** Example values matching this schema */ + examples?: any; + [prop: string]: any; +} +export interface TKind { + [Kind]: string; +} +export interface TSchema extends SchemaOptions, TKind { + [Modifier]?: string; + [Hint]?: string; + params: unknown[]; + static: unknown; +} +export type TAnySchema = TSchema | TAny | TArray | TBigInt | TBoolean | TConstructor | TDate | TEnum | TFunction | TInteger | TIntersect | TLiteral | TNot | TNull | TNumber | TObject | TPromise | TRecord | TRef | TString | TSymbol | TTemplateLiteral | TThis | TTuple | TUndefined | TUnion | TUint8Array | TUnknown | TVoid; +export type TNumeric = TInteger | TNumber; +export interface NumericOptions extends SchemaOptions { + exclusiveMaximum?: N; + exclusiveMinimum?: N; + maximum?: N; + minimum?: N; + multipleOf?: N; +} +export interface TAny extends TSchema { + [Kind]: 'Any'; + static: any; +} +export interface ArrayOptions extends SchemaOptions { + uniqueItems?: boolean; + minItems?: number; + maxItems?: number; +} +export interface TArray extends TSchema, ArrayOptions { + [Kind]: 'Array'; + static: Static[]; + type: 'array'; + items: T; +} +export interface TBigInt extends TSchema, NumericOptions { + [Kind]: 'BigInt'; + static: bigint; + type: 'null'; + typeOf: 'BigInt'; +} +export interface TBoolean extends TSchema { + [Kind]: 'Boolean'; + static: boolean; + type: 'boolean'; +} +export type TConstructorParameters> = TTuple; +export type TInstanceType> = T['returns']; +export type TCompositeEvaluateArray = { + [K in keyof T]: T[K] extends TSchema ? Static : never; +}; +export type TCompositeArray = { + [K in keyof T]: T[K] extends TObject ? P : {}; +}; +export type TCompositeProperties = Evaluate : I extends object ? I : {}>; +export interface TComposite extends TObject { + [Hint]: 'Composite'; + static: Evaluate>>; + properties: TCompositeProperties>; +} +export type TConstructorParameterArray = [...{ + [K in keyof T]: Static, P>; +}]; +export interface TConstructor extends TSchema { + [Kind]: 'Constructor'; + static: new (...param: TConstructorParameterArray) => Static; + type: 'object'; + instanceOf: 'Constructor'; + parameters: T; + returns: U; +} +export interface DateOptions extends SchemaOptions { + exclusiveMaximumTimestamp?: number; + exclusiveMinimumTimestamp?: number; + maximumTimestamp?: number; + minimumTimestamp?: number; +} +export interface TDate extends TSchema, DateOptions { + [Kind]: 'Date'; + static: Date; + type: 'object'; + instanceOf: 'Date'; +} +export interface TEnumOption { + type: 'number' | 'string'; + const: T; +} +export interface TEnum = Record> extends TSchema { + [Kind]: 'Union'; + static: T[keyof T]; + anyOf: TLiteral[]; +} +export type TExtends = (Static extends Static ? T : U) extends infer O ? UnionToTuple extends [infer X, infer Y] ? TUnion<[Assert, Assert]> : Assert : never; +export type TExcludeTemplateLiteralResult = TString; +export type TExcludeTemplateLiteral = Exclude, Static> extends infer S ? TExcludeTemplateLiteralResult> : never; +export type TExcludeArray = Assert> extends Static ? never : T[K]; +}[number]>, TSchema[]> extends infer R ? TUnionResult> : never; +export type TExclude = T extends TTemplateLiteral ? TExcludeTemplateLiteral : T extends TUnion ? TExcludeArray : T extends U ? TNever : T; +export type TExtractTemplateLiteralResult = TString; +export type TExtractTemplateLiteral = Extract, Static> extends infer S ? TExtractTemplateLiteralResult> : never; +export type TExtractArray = Assert> extends Static ? T[K] : never; +}[number]>, TSchema[]> extends infer R ? TUnionResult> : never; +export type TExtract = T extends TTemplateLiteral ? TExtractTemplateLiteral : T extends TUnion ? TExtractArray : T extends U ? T : T; +export type TFunctionParameters = [...{ + [K in keyof T]: Static, P>; +}]; +export interface TFunction extends TSchema { + [Kind]: 'Function'; + static: (...param: TFunctionParameters) => Static; + type: 'object'; + instanceOf: 'Function'; + parameters: T; + returns: U; +} +export interface TInteger extends TSchema, NumericOptions { + [Kind]: 'Integer'; + static: number; + type: 'integer'; +} +export type TUnevaluatedProperties = undefined | TSchema | boolean; +export interface IntersectOptions extends SchemaOptions { + unevaluatedProperties?: TUnevaluatedProperties; +} +export interface TIntersect extends TSchema, IntersectOptions { + [Kind]: 'Intersect'; + static: TupleToIntersect<{ + [K in keyof T]: Static, this['params']>; + }>; + type?: 'object'; + allOf: [...T]; +} +export type TKeyOfTuple = { + [K in keyof Static]: TLiteral>; +} extends infer U ? UnionToTuple> : never; +export type TKeyOf = (T extends TRecursive ? TKeyOfTuple : T extends TComposite ? TKeyOfTuple : T extends TIntersect ? TKeyOfTuple : T extends TUnion ? TKeyOfTuple : T extends TObject ? TKeyOfTuple : T extends TRecord ? [K] : [ +]) extends infer R ? TUnionResult> : never; +export type TLiteralValue = string | number | boolean; +export interface TLiteral extends TSchema { + [Kind]: 'Literal'; + static: T; + const: T; +} +export interface TNever extends TSchema { + [Kind]: 'Never'; + static: never; + not: {}; +} +export interface TNot extends TSchema { + [Kind]: 'Not'; + static: Static; + allOf: [{ + not: Not; + }, T]; +} +export interface TNull extends TSchema { + [Kind]: 'Null'; + static: null; + type: 'null'; +} +export interface TNumber extends TSchema, NumericOptions { + [Kind]: 'Number'; + static: number; + type: 'number'; +} +export type ReadonlyOptionalPropertyKeys = { + [K in keyof T]: T[K] extends TReadonlyOptional ? K : never; +}[keyof T]; +export type ReadonlyPropertyKeys = { + [K in keyof T]: T[K] extends TReadonly ? K : never; +}[keyof T]; +export type OptionalPropertyKeys = { + [K in keyof T]: T[K] extends TOptional ? K : never; +}[keyof T]; +export type RequiredPropertyKeys = keyof Omit | ReadonlyPropertyKeys | OptionalPropertyKeys>; +export type PropertiesReducer> = Evaluate<(Readonly>>> & Readonly>> & Partial>> & Required>>)>; +export type PropertiesReduce = PropertiesReducer; +}>; +export type TProperties = Record; +export type ObjectProperties = T extends TObject ? U : never; +export type ObjectPropertyKeys = T extends TObject ? keyof U : never; +export type TAdditionalProperties = undefined | TSchema | boolean; +export interface ObjectOptions extends SchemaOptions { + additionalProperties?: TAdditionalProperties; + minProperties?: number; + maxProperties?: number; +} +export interface TObject extends TSchema, ObjectOptions { + [Kind]: 'Object'; + static: PropertiesReduce; + additionalProperties?: TAdditionalProperties; + type: 'object'; + properties: T; + required?: string[]; +} +export type TOmitArray = Assert<{ + [K2 in keyof T]: TOmit, K>; +}, TSchema[]>; +export type TOmitProperties = Evaluate, TProperties>>; +export type TOmit = T extends TRecursive ? TRecursive> : T extends TComposite ? TComposite> : T extends TIntersect ? TIntersect> : T extends TUnion ? TUnion> : T extends TObject ? TObject> : T; +export type TParameters = TTuple; +export type TPartialObjectArray = Assert<{ + [K in keyof T]: TPartial>; +}, TObject[]>; +export type TPartialArray = Assert<{ + [K in keyof T]: TPartial>; +}, TSchema[]>; +export type TPartialProperties = Evaluate ? TReadonlyOptional : T[K] extends TReadonly ? TReadonlyOptional : T[K] extends TOptional ? TOptional : TOptional; +}, TProperties>>; +export type TPartial = T extends TRecursive ? TRecursive> : T extends TComposite ? TComposite> : T extends TIntersect ? TIntersect> : T extends TUnion ? TUnion> : T extends TObject ? TObject> : T; +export type TPickArray = { + [K2 in keyof T]: TPick, K>; +}; +export type TPickProperties = Pick, keyof T>> extends infer R ? ({ + [K in keyof R]: Assert extends TSchema ? R[K] : never; +}) : never; +export type TPick = T extends TRecursive ? TRecursive> : T extends TComposite ? TComposite> : T extends TIntersect ? TIntersect> : T extends TUnion ? TUnion> : T extends TObject ? TObject> : T; +export interface TPromise extends TSchema { + [Kind]: 'Promise'; + static: Promise>; + type: 'object'; + instanceOf: 'Promise'; + item: TSchema; +} +export type RecordTemplateLiteralObjectType = Ensure]: T; +}>>>; +export type RecordTemplateLiteralType = IsTemplateLiteralFinite extends true ? RecordTemplateLiteralObjectType : TRecord; +export type RecordUnionLiteralType[]>, T extends TSchema> = Static extends string ? Ensure]: T; +}>> : never; +export type RecordLiteralType, T extends TSchema> = Ensure>; +export type RecordNumberType = Ensure>; +export type RecordStringType = Ensure>; +export type RecordKey = TUnion[]> | TLiteral | TTemplateLiteral | TInteger | TNumber | TString; +export interface TRecord extends TSchema { + [Kind]: 'Record'; + static: Record, Static>; + type: 'object'; + patternProperties: { + [pattern: string]: T; + }; + additionalProperties: false; +} +export interface TThis extends TSchema { + [Kind]: 'This'; + static: this['params'][0]; + $ref: string; +} +export type TRecursiveReduce = Static]>; +export interface TRecursive extends TSchema { + [Hint]: 'Recursive'; + static: TRecursiveReduce; +} +export interface TRef extends TSchema { + [Kind]: 'Ref'; + static: Static; + $ref: string; +} +export type TReturnType = T['returns']; +export type TRequiredArray = Assert<{ + [K in keyof T]: TRequired>; +}, TSchema[]>; +export type TRequiredProperties = Evaluate ? TReadonly : T[K] extends TReadonly ? TReadonly : T[K] extends TOptional ? U : T[K]; +}, TProperties>>; +export type TRequired = T extends TRecursive ? TRecursive> : T extends TComposite ? TComposite> : T extends TIntersect ? TIntersect> : T extends TUnion ? TUnion> : T extends TObject ? TObject> : T; +export type StringFormatOption = 'date-time' | 'time' | 'date' | 'email' | 'idn-email' | 'hostname' | 'idn-hostname' | 'ipv4' | 'ipv6' | 'uri' | 'uri-reference' | 'iri' | 'uuid' | 'iri-reference' | 'uri-template' | 'json-pointer' | 'relative-json-pointer' | 'regex'; +export interface StringOptions extends SchemaOptions { + minLength?: number; + maxLength?: number; + pattern?: string; + format?: Format; + contentEncoding?: '7bit' | '8bit' | 'binary' | 'quoted-printable' | 'base64'; + contentMediaType?: string; +} +export interface TString extends TSchema, StringOptions { + [Kind]: 'String'; + static: string; + type: 'string'; +} +export type SymbolValue = string | number | undefined; +export interface TSymbol extends TSchema, SchemaOptions { + [Kind]: 'Symbol'; + static: symbol; + type: 'null'; + typeOf: 'Symbol'; +} +export type IsTemplateLiteralFiniteCheck = T extends TTemplateLiteral ? IsTemplateLiteralFiniteArray> : T extends TUnion ? IsTemplateLiteralFiniteArray> : T extends TString ? false : T extends TBoolean ? false : T extends TNumber ? false : T extends TInteger ? false : T extends TBigInt ? false : T extends TLiteral ? true : false; +export type IsTemplateLiteralFiniteArray = T extends [infer L, ...infer R] ? IsTemplateLiteralFiniteCheck extends false ? false : IsTemplateLiteralFiniteArray> : T extends [infer L] ? IsTemplateLiteralFiniteCheck extends false ? false : true : true; +export type IsTemplateLiteralFinite = T extends TTemplateLiteral ? IsTemplateLiteralFiniteArray : false; +export type TTemplateLiteralKind = TUnion | TLiteral | TInteger | TTemplateLiteral | TNumber | TBigInt | TString | TBoolean | TNever; +export type TTemplateLiteralConst = T extends TUnion ? { + [K in keyof U]: TTemplateLiteralUnion, Acc>; +}[number] : T extends TTemplateLiteral ? `${Static}` : T extends TLiteral ? `${U}` : T extends TString ? `${string}` : T extends TNumber ? `${number}` : T extends TBigInt ? `${bigint}` : T extends TBoolean ? `${boolean}` : never; +export type TTemplateLiteralUnion = T extends [infer L, ...infer R] ? `${TTemplateLiteralConst}${TTemplateLiteralUnion, Acc>}` : T extends [infer L] ? `${TTemplateLiteralConst}${Acc}` : Acc; +export interface TTemplateLiteral extends TSchema { + [Kind]: 'TemplateLiteral'; + static: TTemplateLiteralUnion; + type: 'string'; + pattern: string; +} +export type TTupleIntoArray> = T extends TTuple ? Assert : never; +export interface TTuple extends TSchema { + [Kind]: 'Tuple'; + static: { + [K in keyof T]: T[K] extends TSchema ? Static : T[K]; + }; + type: 'array'; + items?: T; + additionalItems?: false; + minItems: number; + maxItems: number; +} +export interface TUndefined extends TSchema { + [Kind]: 'Undefined'; + static: undefined; + type: 'null'; + typeOf: 'Undefined'; +} +export type TUnionOfLiteralArray[]> = { + [K in keyof T]: Assert['const']; +}[number]; +export type TUnionOfLiteral[]>> = TUnionOfLiteralArray; +export type TUnionResult = T extends [] ? TNever : T extends [infer S] ? S : TUnion; +export type TUnionTemplateLiteral> = (string); +export interface TUnion extends TSchema { + [Kind]: 'Union'; + static: { + [K in keyof T]: T[K] extends TSchema ? Static : never; + }[number]; + anyOf: T; +} +export interface Uint8ArrayOptions extends SchemaOptions { + maxByteLength?: number; + minByteLength?: number; +} +export interface TUint8Array extends TSchema, Uint8ArrayOptions { + [Kind]: 'Uint8Array'; + static: Uint8Array; + instanceOf: 'Uint8Array'; + type: 'object'; +} +export interface TUnknown extends TSchema { + [Kind]: 'Unknown'; + static: unknown; +} +export interface UnsafeOptions extends SchemaOptions { + [Kind]?: string; +} +export interface TUnsafe extends TSchema { + [Kind]: string; + static: T; +} +export interface TVoid extends TSchema { + [Kind]: 'Void'; + static: void; + type: 'null'; + typeOf: 'Void'; +} +/** Creates a TypeScript static type from a TypeBox type */ +export type Static = (T & { + params: P; +})['static']; +export type TypeRegistryValidationFunction = (schema: TSchema, value: unknown) => boolean; +/** A registry for user defined types */ +export declare namespace TypeRegistry { + /** Returns the entries in this registry */ + function Entries(): Map>; + /** Clears all user defined types */ + function Clear(): void; + /** Returns true if this registry contains this kind */ + function Has(kind: string): boolean; + /** Sets a validation function for a user defined type */ + function Set(kind: string, func: TypeRegistryValidationFunction): void; + /** Gets a custom validation function for a user defined type */ + function Get(kind: string): TypeRegistryValidationFunction | undefined; +} +export type FormatRegistryValidationFunction = (value: string) => boolean; +/** A registry for user defined string formats */ +export declare namespace FormatRegistry { + /** Returns the entries in this registry */ + function Entries(): Map; + /** Clears all user defined string formats */ + function Clear(): void; + /** Returns true if the user defined string format exists */ + function Has(format: string): boolean; + /** Sets a validation function for a user defined string format */ + function Set(format: string, func: FormatRegistryValidationFunction): void; + /** Gets a validation function for a user defined string format */ + function Get(format: string): FormatRegistryValidationFunction | undefined; +} +export declare class TypeGuardUnknownTypeError extends Error { + readonly schema: unknown; + constructor(schema: unknown); +} +/** Provides functions to test if JavaScript values are TypeBox types */ +export declare namespace TypeGuard { + /** Returns true if the given schema is TAny */ + function TAny(schema: unknown): schema is TAny; + /** Returns true if the given schema is TArray */ + function TArray(schema: unknown): schema is TArray; + /** Returns true if the given schema is TBigInt */ + function TBigInt(schema: unknown): schema is TBigInt; + /** Returns true if the given schema is TBoolean */ + function TBoolean(schema: unknown): schema is TBoolean; + /** Returns true if the given schema is TConstructor */ + function TConstructor(schema: unknown): schema is TConstructor; + /** Returns true if the given schema is TDate */ + function TDate(schema: unknown): schema is TDate; + /** Returns true if the given schema is TFunction */ + function TFunction(schema: unknown): schema is TFunction; + /** Returns true if the given schema is TInteger */ + function TInteger(schema: unknown): schema is TInteger; + /** Returns true if the given schema is TIntersect */ + function TIntersect(schema: unknown): schema is TIntersect; + /** Returns true if the given schema is TKind */ + function TKind(schema: unknown): schema is Record; + /** Returns true if the given schema is TLiteral */ + function TLiteral(schema: unknown): schema is TLiteral; + /** Returns true if the given schema is TNever */ + function TNever(schema: unknown): schema is TNever; + /** Returns true if the given schema is TNot */ + function TNot(schema: unknown): schema is TNot; + /** Returns true if the given schema is TNull */ + function TNull(schema: unknown): schema is TNull; + /** Returns true if the given schema is TNumber */ + function TNumber(schema: unknown): schema is TNumber; + /** Returns true if the given schema is TObject */ + function TObject(schema: unknown): schema is TObject; + /** Returns true if the given schema is TPromise */ + function TPromise(schema: unknown): schema is TPromise; + /** Returns true if the given schema is TRecord */ + function TRecord(schema: unknown): schema is TRecord; + /** Returns true if the given schema is TRef */ + function TRef(schema: unknown): schema is TRef; + /** Returns true if the given schema is TString */ + function TString(schema: unknown): schema is TString; + /** Returns true if the given schema is TSymbol */ + function TSymbol(schema: unknown): schema is TSymbol; + /** Returns true if the given schema is TTemplateLiteral */ + function TTemplateLiteral(schema: unknown): schema is TTemplateLiteral; + /** Returns true if the given schema is TThis */ + function TThis(schema: unknown): schema is TThis; + /** Returns true if the given schema is TTuple */ + function TTuple(schema: unknown): schema is TTuple; + /** Returns true if the given schema is TUndefined */ + function TUndefined(schema: unknown): schema is TUndefined; + /** Returns true if the given schema is TUnion */ + function TUnion(schema: unknown): schema is TUnion; + /** Returns true if the given schema is TUnion[]> */ + function TUnionLiteral(schema: unknown): schema is TUnion[]>; + /** Returns true if the given schema is TUint8Array */ + function TUint8Array(schema: unknown): schema is TUint8Array; + /** Returns true if the given schema is TUnknown */ + function TUnknown(schema: unknown): schema is TUnknown; + /** Returns true if the given schema is a raw TUnsafe */ + function TUnsafe(schema: unknown): schema is TUnsafe; + /** Returns true if the given schema is TVoid */ + function TVoid(schema: unknown): schema is TVoid; + /** Returns true if this schema has the ReadonlyOptional modifier */ + function TReadonlyOptional(schema: T): schema is TReadonlyOptional; + /** Returns true if this schema has the Readonly modifier */ + function TReadonly(schema: T): schema is TReadonly; + /** Returns true if this schema has the Optional modifier */ + function TOptional(schema: T): schema is TOptional; + /** Returns true if the given schema is TSchema */ + function TSchema(schema: unknown): schema is TSchema; +} +/** Fast undefined check used for properties of type undefined */ +export declare namespace ExtendsUndefined { + function Check(schema: TSchema): boolean; +} +export declare enum TypeExtendsResult { + Union = 0, + True = 1, + False = 2 +} +export declare namespace TypeExtends { + function Extends(left: TSchema, right: TSchema): TypeExtendsResult; +} +/** Specialized Clone for Types */ +export declare namespace TypeClone { + /** Clones a type. */ + function Clone(schema: T, options: SchemaOptions): T; +} +export declare namespace ObjectMap { + function Map(schema: TSchema, callback: (object: TObject) => TObject, options: SchemaOptions): T; +} +export declare namespace KeyResolver { + function Resolve(schema: T): string[]; +} +export declare namespace TemplateLiteralPattern { + function Create(kinds: TTemplateLiteralKind[]): string; +} +export declare namespace TemplateLiteralResolver { + function Resolve(template: TTemplateLiteral): TString | TUnion | TLiteral; +} +export declare class TemplateLiteralParserError extends Error { + constructor(message: string); +} +export declare namespace TemplateLiteralParser { + type Expression = And | Or | Const; + type Const = { + type: 'const'; + const: string; + }; + type And = { + type: 'and'; + expr: Expression[]; + }; + type Or = { + type: 'or'; + expr: Expression[]; + }; + /** Parses a pattern and returns an expression tree */ + function Parse(pattern: string): Expression; + /** Parses a pattern and strips forward and trailing ^ and $ */ + function ParseExact(pattern: string): Expression; +} +export declare namespace TemplateLiteralFinite { + function Check(expression: TemplateLiteralParser.Expression): boolean; +} +export declare namespace TemplateLiteralGenerator { + function Generate(expression: TemplateLiteralParser.Expression): IterableIterator; +} +export declare class TypeBuilder { + /** `[Utility]` Creates a schema without `static` and `params` types */ + protected Create(schema: Omit): T; + /** `[Standard]` Omits compositing symbols from this schema */ + Strict(schema: T): T; +} +export declare class StandardTypeBuilder extends TypeBuilder { + /** `[Modifier]` Creates a Optional property */ + Optional(schema: T): TOptional; + /** `[Modifier]` Creates a ReadonlyOptional property */ + ReadonlyOptional(schema: T): TReadonlyOptional; + /** `[Modifier]` Creates a Readonly object or property */ + Readonly(schema: T): TReadonly; + /** `[Standard]` Creates an Any type */ + Any(options?: SchemaOptions): TAny; + /** `[Standard]` Creates an Array type */ + Array(items: T, options?: ArrayOptions): TArray; + /** `[Standard]` Creates a Boolean type */ + Boolean(options?: SchemaOptions): TBoolean; + /** `[Standard]` Creates a Composite object type. */ + Composite(objects: [...T], options?: ObjectOptions): TComposite; + /** `[Standard]` Creates a Enum type */ + Enum>(item: T, options?: SchemaOptions): TEnum; + /** `[Standard]` A conditional type expression that will return the true type if the left type extends the right */ + Extends(left: L, right: R, trueType: T, falseType: U, options?: SchemaOptions): TExtends; + /** `[Standard]` Excludes from the left type any type that is not assignable to the right */ + Exclude(left: L, right: R, options?: SchemaOptions): TExclude; + /** `[Standard]` Extracts from the left type any type that is assignable to the right */ + Extract(left: L, right: R, options?: SchemaOptions): TExtract; + /** `[Standard]` Creates an Integer type */ + Integer(options?: NumericOptions): TInteger; + /** `[Standard]` Creates a Intersect type */ + Intersect(allOf: [], options?: SchemaOptions): TNever; + /** `[Standard]` Creates a Intersect type */ + Intersect(allOf: [...T], options?: SchemaOptions): T[0]; + Intersect(allOf: [...T], options?: IntersectOptions): TIntersect; + /** `[Standard]` Creates a KeyOf type */ + KeyOf(schema: T, options?: SchemaOptions): TKeyOf; + /** `[Standard]` Creates a Literal type */ + Literal(value: T, options?: SchemaOptions): TLiteral; + /** `[Standard]` Creates a Never type */ + Never(options?: SchemaOptions): TNever; + /** `[Standard]` Creates a Not type. The first argument is the disallowed type, the second is the allowed. */ + Not(not: N, schema: T, options?: SchemaOptions): TNot; + /** `[Standard]` Creates a Null type */ + Null(options?: SchemaOptions): TNull; + /** `[Standard]` Creates a Number type */ + Number(options?: NumericOptions): TNumber; + /** `[Standard]` Creates an Object type */ + Object(properties: T, options?: ObjectOptions): TObject; + /** `[Standard]` Creates a mapped type whose keys are omitted from the given type */ + Omit)[]>(schema: T, keys: readonly [...K], options?: SchemaOptions): TOmit; + /** `[Standard]` Creates a mapped type whose keys are omitted from the given type */ + Omit[]>>(schema: T, keys: K, options?: SchemaOptions): TOmit>; + /** `[Standard]` Creates a mapped type whose keys are omitted from the given type */ + Omit>(schema: T, key: K, options?: SchemaOptions): TOmit; + /** `[Standard]` Creates a mapped type whose keys are omitted from the given type */ + Omit(schema: T, key: K, options?: SchemaOptions): TOmit; + /** `[Standard]` Creates a mapped type where all properties are Optional */ + Partial(schema: T, options?: ObjectOptions): TPartial; + /** `[Standard]` Creates a mapped type whose keys are picked from the given type */ + Pick)[]>(schema: T, keys: readonly [...K], options?: SchemaOptions): TPick; + /** `[Standard]` Creates a mapped type whose keys are picked from the given type */ + Pick[]>>(schema: T, keys: K, options?: SchemaOptions): TPick>; + /** `[Standard]` Creates a mapped type whose keys are picked from the given type */ + Pick>(schema: T, key: K, options?: SchemaOptions): TPick; + /** `[Standard]` Creates a mapped type whose keys are picked from the given type */ + Pick(schema: T, key: K, options?: SchemaOptions): TPick; + /** `[Standard]` Creates a Record type */ + Record[]>, T extends TSchema>(key: K, schema: T, options?: ObjectOptions): RecordUnionLiteralType; + /** `[Standard]` Creates a Record type */ + Record, T extends TSchema>(key: K, schema: T, options?: ObjectOptions): RecordLiteralType; + /** `[Standard]` Creates a Record type */ + Record(key: K, schema: T, options?: ObjectOptions): RecordTemplateLiteralType; + /** `[Standard]` Creates a Record type */ + Record(key: K, schema: T, options?: ObjectOptions): RecordNumberType; + /** `[Standard]` Creates a Record type */ + Record(key: K, schema: T, options?: ObjectOptions): RecordStringType; + /** `[Standard]` Creates a Recursive type */ + Recursive(callback: (thisType: TThis) => T, options?: SchemaOptions): TRecursive; + /** `[Standard]` Creates a Ref type. The referenced type must contain a $id */ + Ref(schema: T, options?: SchemaOptions): TRef; + /** `[Standard]` Creates a mapped type where all properties are Required */ + Required(schema: T, options?: SchemaOptions): TRequired; + /** `[Standard]` Creates a String type */ + String(options?: StringOptions): TString; + /** `[Standard]` Creates a template literal type */ + TemplateLiteral(kinds: [...T], options?: SchemaOptions): TTemplateLiteral; + /** `[Standard]` Creates a Tuple type */ + Tuple(items: [...T], options?: SchemaOptions): TTuple; + /** `[Standard]` Creates a Union type */ + Union(anyOf: [], options?: SchemaOptions): TNever; + /** `[Standard]` Creates a Union type */ + Union(anyOf: [...T], options?: SchemaOptions): T[0]; + /** `[Standard]` Creates a Union type */ + Union(anyOf: [...T], options?: SchemaOptions): TUnion; + /** `[Experimental]` Remaps a TemplateLiteral into a Union representation. This function is known to cause TS compiler crashes for finite templates with large generation counts. Use with caution. */ + Union(template: T): TUnionTemplateLiteral; + /** `[Standard]` Creates an Unknown type */ + Unknown(options?: SchemaOptions): TUnknown; + /** `[Standard]` Creates a Unsafe type that infers for the generic argument */ + Unsafe(options?: UnsafeOptions): TUnsafe; +} +export declare class ExtendedTypeBuilder extends StandardTypeBuilder { + /** `[Extended]` Creates a BigInt type */ + BigInt(options?: NumericOptions): TBigInt; + /** `[Extended]` Extracts the ConstructorParameters from the given Constructor type */ + ConstructorParameters>(schema: T, options?: SchemaOptions): TConstructorParameters; + /** `[Extended]` Creates a Constructor type */ + Constructor, U extends TSchema>(parameters: T, returns: U, options?: SchemaOptions): TConstructor, U>; + /** `[Extended]` Creates a Constructor type */ + Constructor(parameters: [...T], returns: U, options?: SchemaOptions): TConstructor; + /** `[Extended]` Creates a Date type */ + Date(options?: DateOptions): TDate; + /** `[Extended]` Creates a Function type */ + Function, U extends TSchema>(parameters: T, returns: U, options?: SchemaOptions): TFunction, U>; + /** `[Extended]` Creates a Function type */ + Function(parameters: [...T], returns: U, options?: SchemaOptions): TFunction; + /** `[Extended]` Extracts the InstanceType from the given Constructor */ + InstanceType>(schema: T, options?: SchemaOptions): TInstanceType; + /** `[Extended]` Extracts the Parameters from the given Function type */ + Parameters>(schema: T, options?: SchemaOptions): TParameters; + /** `[Extended]` Creates a Promise type */ + Promise(item: T, options?: SchemaOptions): TPromise; + /** `[Extended]` Creates a regular expression type */ + RegEx(regex: RegExp, options?: SchemaOptions): TString; + /** `[Extended]` Extracts the ReturnType from the given Function */ + ReturnType>(schema: T, options?: SchemaOptions): TReturnType; + /** `[Extended]` Creates a Symbol type */ + Symbol(options?: SchemaOptions): TSymbol; + /** `[Extended]` Creates a Undefined type */ + Undefined(options?: SchemaOptions): TUndefined; + /** `[Extended]` Creates a Uint8Array type */ + Uint8Array(options?: Uint8ArrayOptions): TUint8Array; + /** `[Extended]` Creates a Void type */ + Void(options?: SchemaOptions): TVoid; +} +/** JSON Schema TypeBuilder with Static Resolution for TypeScript */ +export declare const StandardType: StandardTypeBuilder; +/** JSON Schema TypeBuilder with Static Resolution for TypeScript */ +export declare const Type: ExtendedTypeBuilder; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/typebox.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/typebox.js new file mode 100644 index 0000000..c8953c3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/typebox.js @@ -0,0 +1,2220 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Type = exports.StandardType = exports.ExtendedTypeBuilder = exports.StandardTypeBuilder = exports.TypeBuilder = exports.TemplateLiteralGenerator = exports.TemplateLiteralFinite = exports.TemplateLiteralParser = exports.TemplateLiteralParserError = exports.TemplateLiteralResolver = exports.TemplateLiteralPattern = exports.KeyResolver = exports.ObjectMap = exports.TypeClone = exports.TypeExtends = exports.TypeExtendsResult = exports.ExtendsUndefined = exports.TypeGuard = exports.TypeGuardUnknownTypeError = exports.FormatRegistry = exports.TypeRegistry = exports.PatternStringExact = exports.PatternNumberExact = exports.PatternBooleanExact = exports.PatternString = exports.PatternNumber = exports.PatternBoolean = exports.Kind = exports.Hint = exports.Modifier = void 0; +// -------------------------------------------------------------------------- +// Symbols +// -------------------------------------------------------------------------- +exports.Modifier = Symbol.for('TypeBox.Modifier'); +exports.Hint = Symbol.for('TypeBox.Hint'); +exports.Kind = Symbol.for('TypeBox.Kind'); +// -------------------------------------------------------------------------- +// Patterns +// -------------------------------------------------------------------------- +exports.PatternBoolean = '(true|false)'; +exports.PatternNumber = '(0|[1-9][0-9]*)'; +exports.PatternString = '(.*)'; +exports.PatternBooleanExact = `^${exports.PatternBoolean}$`; +exports.PatternNumberExact = `^${exports.PatternNumber}$`; +exports.PatternStringExact = `^${exports.PatternString}$`; +/** A registry for user defined types */ +var TypeRegistry; +(function (TypeRegistry) { + const map = new Map(); + /** Returns the entries in this registry */ + function Entries() { + return new Map(map); + } + TypeRegistry.Entries = Entries; + /** Clears all user defined types */ + function Clear() { + return map.clear(); + } + TypeRegistry.Clear = Clear; + /** Returns true if this registry contains this kind */ + function Has(kind) { + return map.has(kind); + } + TypeRegistry.Has = Has; + /** Sets a validation function for a user defined type */ + function Set(kind, func) { + map.set(kind, func); + } + TypeRegistry.Set = Set; + /** Gets a custom validation function for a user defined type */ + function Get(kind) { + return map.get(kind); + } + TypeRegistry.Get = Get; +})(TypeRegistry = exports.TypeRegistry || (exports.TypeRegistry = {})); +/** A registry for user defined string formats */ +var FormatRegistry; +(function (FormatRegistry) { + const map = new Map(); + /** Returns the entries in this registry */ + function Entries() { + return new Map(map); + } + FormatRegistry.Entries = Entries; + /** Clears all user defined string formats */ + function Clear() { + return map.clear(); + } + FormatRegistry.Clear = Clear; + /** Returns true if the user defined string format exists */ + function Has(format) { + return map.has(format); + } + FormatRegistry.Has = Has; + /** Sets a validation function for a user defined string format */ + function Set(format, func) { + map.set(format, func); + } + FormatRegistry.Set = Set; + /** Gets a validation function for a user defined string format */ + function Get(format) { + return map.get(format); + } + FormatRegistry.Get = Get; +})(FormatRegistry = exports.FormatRegistry || (exports.FormatRegistry = {})); +// -------------------------------------------------------------------------- +// TypeGuard +// -------------------------------------------------------------------------- +class TypeGuardUnknownTypeError extends Error { + constructor(schema) { + super('TypeGuard: Unknown type'); + this.schema = schema; + } +} +exports.TypeGuardUnknownTypeError = TypeGuardUnknownTypeError; +/** Provides functions to test if JavaScript values are TypeBox types */ +var TypeGuard; +(function (TypeGuard) { + function IsObject(value) { + return typeof value === 'object' && value !== null && !Array.isArray(value); + } + function IsArray(value) { + return typeof value === 'object' && value !== null && Array.isArray(value); + } + function IsPattern(value) { + try { + new RegExp(value); + return true; + } + catch { + return false; + } + } + function IsControlCharacterFree(value) { + if (typeof value !== 'string') + return false; + for (let i = 0; i < value.length; i++) { + const code = value.charCodeAt(i); + if ((code >= 7 && code <= 13) || code === 27 || code === 127) { + return false; + } + } + return true; + } + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsString(value) { + return typeof value === 'string'; + } + function IsNumber(value) { + return typeof value === 'number' && globalThis.Number.isFinite(value); + } + function IsBoolean(value) { + return typeof value === 'boolean'; + } + function IsOptionalBigInt(value) { + return value === undefined || (value !== undefined && IsBigInt(value)); + } + function IsOptionalNumber(value) { + return value === undefined || (value !== undefined && IsNumber(value)); + } + function IsOptionalBoolean(value) { + return value === undefined || (value !== undefined && IsBoolean(value)); + } + function IsOptionalString(value) { + return value === undefined || (value !== undefined && IsString(value)); + } + function IsOptionalPattern(value) { + return value === undefined || (value !== undefined && IsString(value) && IsControlCharacterFree(value) && IsPattern(value)); + } + function IsOptionalFormat(value) { + return value === undefined || (value !== undefined && IsString(value) && IsControlCharacterFree(value)); + } + function IsOptionalSchema(value) { + return value === undefined || TSchema(value); + } + /** Returns true if the given schema is TAny */ + function TAny(schema) { + return TKind(schema) && schema[exports.Kind] === 'Any' && IsOptionalString(schema.$id); + } + TypeGuard.TAny = TAny; + /** Returns true if the given schema is TArray */ + function TArray(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'Array' && + schema.type === 'array' && + IsOptionalString(schema.$id) && + TSchema(schema.items) && + IsOptionalNumber(schema.minItems) && + IsOptionalNumber(schema.maxItems) && + IsOptionalBoolean(schema.uniqueItems)); + } + TypeGuard.TArray = TArray; + /** Returns true if the given schema is TBigInt */ + function TBigInt(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'BigInt' && + schema.type === 'null' && + schema.typeOf === 'BigInt' && + IsOptionalString(schema.$id) && + IsOptionalBigInt(schema.multipleOf) && + IsOptionalBigInt(schema.minimum) && + IsOptionalBigInt(schema.maximum) && + IsOptionalBigInt(schema.exclusiveMinimum) && + IsOptionalBigInt(schema.exclusiveMaximum)); + } + TypeGuard.TBigInt = TBigInt; + /** Returns true if the given schema is TBoolean */ + function TBoolean(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Boolean' && + schema.type === 'boolean' && + IsOptionalString(schema.$id)); + } + TypeGuard.TBoolean = TBoolean; + /** Returns true if the given schema is TConstructor */ + function TConstructor(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Constructor' && + schema.type === 'object' && + schema.instanceOf === 'Constructor' && + IsOptionalString(schema.$id) && + IsArray(schema.parameters) && + TSchema(schema.returns))) { + return false; + } + for (const parameter of schema.parameters) { + if (!TSchema(parameter)) + return false; + } + return true; + } + TypeGuard.TConstructor = TConstructor; + /** Returns true if the given schema is TDate */ + function TDate(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'Date' && + schema.type === 'object' && + schema.instanceOf === 'Date' && + IsOptionalString(schema.$id) && + IsOptionalNumber(schema.minimumTimestamp) && + IsOptionalNumber(schema.maximumTimestamp) && + IsOptionalNumber(schema.exclusiveMinimumTimestamp) && + IsOptionalNumber(schema.exclusiveMaximumTimestamp)); + } + TypeGuard.TDate = TDate; + /** Returns true if the given schema is TFunction */ + function TFunction(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Function' && + schema.type === 'object' && + schema.instanceOf === 'Function' && + IsOptionalString(schema.$id) && + IsArray(schema.parameters) && + TSchema(schema.returns))) { + return false; + } + for (const parameter of schema.parameters) { + if (!TSchema(parameter)) + return false; + } + return true; + } + TypeGuard.TFunction = TFunction; + /** Returns true if the given schema is TInteger */ + function TInteger(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'Integer' && + schema.type === 'integer' && + IsOptionalString(schema.$id) && + IsOptionalNumber(schema.multipleOf) && + IsOptionalNumber(schema.minimum) && + IsOptionalNumber(schema.maximum) && + IsOptionalNumber(schema.exclusiveMinimum) && + IsOptionalNumber(schema.exclusiveMaximum)); + } + TypeGuard.TInteger = TInteger; + /** Returns true if the given schema is TIntersect */ + function TIntersect(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Intersect' && + IsArray(schema.allOf) && + IsOptionalString(schema.type) && + (IsOptionalBoolean(schema.unevaluatedProperties) || IsOptionalSchema(schema.unevaluatedProperties)) && + IsOptionalString(schema.$id))) { + return false; + } + if ('type' in schema && schema.type !== 'object') { + return false; + } + for (const inner of schema.allOf) { + if (!TSchema(inner)) + return false; + } + return true; + } + TypeGuard.TIntersect = TIntersect; + /** Returns true if the given schema is TKind */ + function TKind(schema) { + return IsObject(schema) && exports.Kind in schema && typeof schema[exports.Kind] === 'string'; // TS 4.1.5: any required for symbol indexer + } + TypeGuard.TKind = TKind; + /** Returns true if the given schema is TLiteral */ + function TLiteral(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Literal' && + IsOptionalString(schema.$id) && + (IsString(schema.const) || + IsNumber(schema.const) || + IsBoolean(schema.const) || + IsBigInt(schema.const))); + } + TypeGuard.TLiteral = TLiteral; + /** Returns true if the given schema is TNever */ + function TNever(schema) { + return TKind(schema) && schema[exports.Kind] === 'Never' && IsObject(schema.not) && globalThis.Object.getOwnPropertyNames(schema.not).length === 0; + } + TypeGuard.TNever = TNever; + /** Returns true if the given schema is TNot */ + function TNot(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Not' && + IsArray(schema.allOf) && + schema.allOf.length === 2 && + IsObject(schema.allOf[0]) && + TSchema(schema.allOf[0].not) && + TSchema(schema.allOf[1])); + } + TypeGuard.TNot = TNot; + /** Returns true if the given schema is TNull */ + function TNull(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Null' && + schema.type === 'null' && + IsOptionalString(schema.$id)); + } + TypeGuard.TNull = TNull; + /** Returns true if the given schema is TNumber */ + function TNumber(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'Number' && + schema.type === 'number' && + IsOptionalString(schema.$id) && + IsOptionalNumber(schema.multipleOf) && + IsOptionalNumber(schema.minimum) && + IsOptionalNumber(schema.maximum) && + IsOptionalNumber(schema.exclusiveMinimum) && + IsOptionalNumber(schema.exclusiveMaximum)); + } + TypeGuard.TNumber = TNumber; + /** Returns true if the given schema is TObject */ + function TObject(schema) { + if (!(TKind(schema) && + schema[exports.Kind] === 'Object' && + schema.type === 'object' && + IsOptionalString(schema.$id) && + IsObject(schema.properties) && + (IsOptionalBoolean(schema.additionalProperties) || IsOptionalSchema(schema.additionalProperties)) && + IsOptionalNumber(schema.minProperties) && + IsOptionalNumber(schema.maxProperties))) { + return false; + } + for (const [key, value] of Object.entries(schema.properties)) { + if (!IsControlCharacterFree(key)) + return false; + if (!TSchema(value)) + return false; + } + return true; + } + TypeGuard.TObject = TObject; + /** Returns true if the given schema is TPromise */ + function TPromise(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Promise' && + schema.type === 'object' && + schema.instanceOf === 'Promise' && + IsOptionalString(schema.$id) && + TSchema(schema.item)); + } + TypeGuard.TPromise = TPromise; + /** Returns true if the given schema is TRecord */ + function TRecord(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Record' && + schema.type === 'object' && + IsOptionalString(schema.$id) && + schema.additionalProperties === false && + IsObject(schema.patternProperties))) { + return false; + } + const keys = Object.keys(schema.patternProperties); + if (keys.length !== 1) { + return false; + } + if (!IsPattern(keys[0])) { + return false; + } + if (!TSchema(schema.patternProperties[keys[0]])) { + return false; + } + return true; + } + TypeGuard.TRecord = TRecord; + /** Returns true if the given schema is TRef */ + function TRef(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Ref' && + IsOptionalString(schema.$id) && + IsString(schema.$ref)); + } + TypeGuard.TRef = TRef; + /** Returns true if the given schema is TString */ + function TString(schema) { + return (TKind(schema) && + schema[exports.Kind] === 'String' && + schema.type === 'string' && + IsOptionalString(schema.$id) && + IsOptionalNumber(schema.minLength) && + IsOptionalNumber(schema.maxLength) && + IsOptionalPattern(schema.pattern) && + IsOptionalFormat(schema.format)); + } + TypeGuard.TString = TString; + /** Returns true if the given schema is TSymbol */ + function TSymbol(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Symbol' && + schema.type === 'null' && + schema.typeOf === 'Symbol' && + IsOptionalString(schema.$id)); + } + TypeGuard.TSymbol = TSymbol; + /** Returns true if the given schema is TTemplateLiteral */ + function TTemplateLiteral(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'TemplateLiteral' && + schema.type === 'string' && + IsString(schema.pattern) && + schema.pattern[0] === '^' && + schema.pattern[schema.pattern.length - 1] === '$'); + } + TypeGuard.TTemplateLiteral = TTemplateLiteral; + /** Returns true if the given schema is TThis */ + function TThis(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'This' && + IsOptionalString(schema.$id) && + IsString(schema.$ref)); + } + TypeGuard.TThis = TThis; + /** Returns true if the given schema is TTuple */ + function TTuple(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Tuple' && + schema.type === 'array' && + IsOptionalString(schema.$id) && + IsNumber(schema.minItems) && + IsNumber(schema.maxItems) && + schema.minItems === schema.maxItems)) { + return false; + } + if (schema.items === undefined && schema.additionalItems === undefined && schema.minItems === 0) { + return true; + } + if (!IsArray(schema.items)) { + return false; + } + for (const inner of schema.items) { + if (!TSchema(inner)) + return false; + } + return true; + } + TypeGuard.TTuple = TTuple; + /** Returns true if the given schema is TUndefined */ + function TUndefined(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Undefined' && + schema.type === 'null' && + schema.typeOf === 'Undefined' && + IsOptionalString(schema.$id)); + } + TypeGuard.TUndefined = TUndefined; + /** Returns true if the given schema is TUnion */ + function TUnion(schema) { + // prettier-ignore + if (!(TKind(schema) && + schema[exports.Kind] === 'Union' && + IsArray(schema.anyOf) && + IsOptionalString(schema.$id))) { + return false; + } + for (const inner of schema.anyOf) { + if (!TSchema(inner)) + return false; + } + return true; + } + TypeGuard.TUnion = TUnion; + /** Returns true if the given schema is TUnion[]> */ + function TUnionLiteral(schema) { + return TUnion(schema) && schema.anyOf.every((schema) => TLiteral(schema) && typeof schema.const === 'string'); + } + TypeGuard.TUnionLiteral = TUnionLiteral; + /** Returns true if the given schema is TUint8Array */ + function TUint8Array(schema) { + return TKind(schema) && schema[exports.Kind] === 'Uint8Array' && schema.type === 'object' && IsOptionalString(schema.$id) && schema.instanceOf === 'Uint8Array' && IsOptionalNumber(schema.minByteLength) && IsOptionalNumber(schema.maxByteLength); + } + TypeGuard.TUint8Array = TUint8Array; + /** Returns true if the given schema is TUnknown */ + function TUnknown(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Unknown' && + IsOptionalString(schema.$id)); + } + TypeGuard.TUnknown = TUnknown; + /** Returns true if the given schema is a raw TUnsafe */ + function TUnsafe(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Unsafe'); + } + TypeGuard.TUnsafe = TUnsafe; + /** Returns true if the given schema is TVoid */ + function TVoid(schema) { + // prettier-ignore + return (TKind(schema) && + schema[exports.Kind] === 'Void' && + schema.type === 'null' && + schema.typeOf === 'Void' && + IsOptionalString(schema.$id)); + } + TypeGuard.TVoid = TVoid; + /** Returns true if this schema has the ReadonlyOptional modifier */ + function TReadonlyOptional(schema) { + return IsObject(schema) && schema[exports.Modifier] === 'ReadonlyOptional'; + } + TypeGuard.TReadonlyOptional = TReadonlyOptional; + /** Returns true if this schema has the Readonly modifier */ + function TReadonly(schema) { + return IsObject(schema) && schema[exports.Modifier] === 'Readonly'; + } + TypeGuard.TReadonly = TReadonly; + /** Returns true if this schema has the Optional modifier */ + function TOptional(schema) { + return IsObject(schema) && schema[exports.Modifier] === 'Optional'; + } + TypeGuard.TOptional = TOptional; + /** Returns true if the given schema is TSchema */ + function TSchema(schema) { + return (typeof schema === 'object' && + (TAny(schema) || + TArray(schema) || + TBoolean(schema) || + TBigInt(schema) || + TConstructor(schema) || + TDate(schema) || + TFunction(schema) || + TInteger(schema) || + TIntersect(schema) || + TLiteral(schema) || + TNever(schema) || + TNot(schema) || + TNull(schema) || + TNumber(schema) || + TObject(schema) || + TPromise(schema) || + TRecord(schema) || + TRef(schema) || + TString(schema) || + TSymbol(schema) || + TTemplateLiteral(schema) || + TThis(schema) || + TTuple(schema) || + TUndefined(schema) || + TUnion(schema) || + TUint8Array(schema) || + TUnknown(schema) || + TUnsafe(schema) || + TVoid(schema) || + (TKind(schema) && TypeRegistry.Has(schema[exports.Kind])))); + } + TypeGuard.TSchema = TSchema; +})(TypeGuard = exports.TypeGuard || (exports.TypeGuard = {})); +// -------------------------------------------------------------------------- +// ExtendsUndefined +// -------------------------------------------------------------------------- +/** Fast undefined check used for properties of type undefined */ +var ExtendsUndefined; +(function (ExtendsUndefined) { + function Check(schema) { + if (schema[exports.Kind] === 'Undefined') + return true; + if (schema[exports.Kind] === 'Union') { + const union = schema; + return union.anyOf.some((schema) => Check(schema)); + } + return false; + } + ExtendsUndefined.Check = Check; +})(ExtendsUndefined = exports.ExtendsUndefined || (exports.ExtendsUndefined = {})); +// -------------------------------------------------------------------------- +// TypeExtends +// -------------------------------------------------------------------------- +var TypeExtendsResult; +(function (TypeExtendsResult) { + TypeExtendsResult[TypeExtendsResult["Union"] = 0] = "Union"; + TypeExtendsResult[TypeExtendsResult["True"] = 1] = "True"; + TypeExtendsResult[TypeExtendsResult["False"] = 2] = "False"; +})(TypeExtendsResult = exports.TypeExtendsResult || (exports.TypeExtendsResult = {})); +var TypeExtends; +(function (TypeExtends) { + // -------------------------------------------------------------------------- + // IntoBooleanResult + // -------------------------------------------------------------------------- + function IntoBooleanResult(result) { + return result === TypeExtendsResult.False ? TypeExtendsResult.False : TypeExtendsResult.True; + } + // -------------------------------------------------------------------------- + // Any + // -------------------------------------------------------------------------- + function AnyRight(left, right) { + return TypeExtendsResult.True; + } + function Any(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right) && right.anyOf.some((schema) => TypeGuard.TAny(schema) || TypeGuard.TUnknown(schema))) + return TypeExtendsResult.True; + if (TypeGuard.TUnion(right)) + return TypeExtendsResult.Union; + if (TypeGuard.TUnknown(right)) + return TypeExtendsResult.True; + if (TypeGuard.TAny(right)) + return TypeExtendsResult.True; + return TypeExtendsResult.Union; + } + // -------------------------------------------------------------------------- + // Array + // -------------------------------------------------------------------------- + function ArrayRight(left, right) { + if (TypeGuard.TUnknown(left)) + return TypeExtendsResult.False; + if (TypeGuard.TAny(left)) + return TypeExtendsResult.Union; + if (TypeGuard.TNever(left)) + return TypeExtendsResult.True; + return TypeExtendsResult.False; + } + function Array(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right) && IsObjectArrayLike(right)) + return TypeExtendsResult.True; + if (!TypeGuard.TArray(right)) + return TypeExtendsResult.False; + return IntoBooleanResult(Visit(left.items, right.items)); + } + // -------------------------------------------------------------------------- + // BigInt + // -------------------------------------------------------------------------- + function BigInt(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TBigInt(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Boolean + // -------------------------------------------------------------------------- + function BooleanRight(left, right) { + if (TypeGuard.TLiteral(left) && typeof left.const === 'boolean') + return TypeExtendsResult.True; + return TypeGuard.TBoolean(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Boolean(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TBoolean(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Constructor + // -------------------------------------------------------------------------- + function Constructor(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (!TypeGuard.TConstructor(right)) + return TypeExtendsResult.False; + if (left.parameters.length > right.parameters.length) + return TypeExtendsResult.False; + if (!left.parameters.every((schema, index) => IntoBooleanResult(Visit(right.parameters[index], schema)) === TypeExtendsResult.True)) { + return TypeExtendsResult.False; + } + return IntoBooleanResult(Visit(left.returns, right.returns)); + } + // -------------------------------------------------------------------------- + // Date + // -------------------------------------------------------------------------- + function Date(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TDate(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Function + // -------------------------------------------------------------------------- + function Function(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (!TypeGuard.TFunction(right)) + return TypeExtendsResult.False; + if (left.parameters.length > right.parameters.length) + return TypeExtendsResult.False; + if (!left.parameters.every((schema, index) => IntoBooleanResult(Visit(right.parameters[index], schema)) === TypeExtendsResult.True)) { + return TypeExtendsResult.False; + } + return IntoBooleanResult(Visit(left.returns, right.returns)); + } + // -------------------------------------------------------------------------- + // Integer + // -------------------------------------------------------------------------- + function IntegerRight(left, right) { + if (TypeGuard.TLiteral(left) && typeof left.const === 'number') + return TypeExtendsResult.True; + return TypeGuard.TNumber(left) || TypeGuard.TInteger(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Integer(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TInteger(right) || TypeGuard.TNumber(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Intersect + // -------------------------------------------------------------------------- + function IntersectRight(left, right) { + return right.allOf.every((schema) => Visit(left, schema) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Intersect(left, right) { + return left.allOf.some((schema) => Visit(schema, right) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Literal + // -------------------------------------------------------------------------- + function IsLiteralString(schema) { + return typeof schema.const === 'string'; + } + function IsLiteralNumber(schema) { + return typeof schema.const === 'number'; + } + function IsLiteralBoolean(schema) { + return typeof schema.const === 'boolean'; + } + function Literal(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + if (TypeGuard.TString(right)) + return StringRight(left, right); + if (TypeGuard.TNumber(right)) + return NumberRight(left, right); + if (TypeGuard.TInteger(right)) + return IntegerRight(left, right); + if (TypeGuard.TBoolean(right)) + return BooleanRight(left, right); + return TypeGuard.TLiteral(right) && right.const === left.const ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Never + // -------------------------------------------------------------------------- + function NeverRight(left, right) { + return TypeExtendsResult.False; + } + function Never(left, right) { + return TypeExtendsResult.True; + } + // -------------------------------------------------------------------------- + // Null + // -------------------------------------------------------------------------- + function Null(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TNull(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Number + // -------------------------------------------------------------------------- + function NumberRight(left, right) { + if (TypeGuard.TLiteral(left) && IsLiteralNumber(left)) + return TypeExtendsResult.True; + return TypeGuard.TNumber(left) || TypeGuard.TInteger(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Number(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TInteger(right) || TypeGuard.TNumber(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Object + // -------------------------------------------------------------------------- + function IsObjectPropertyCount(schema, count) { + return globalThis.Object.keys(schema.properties).length === count; + } + function IsObjectStringLike(schema) { + return IsObjectArrayLike(schema); + } + function IsObjectSymbolLike(schema) { + // prettier-ignore + return IsObjectPropertyCount(schema, 0) || (IsObjectPropertyCount(schema, 1) && 'description' in schema.properties && TypeGuard.TUnion(schema.properties.description) && schema.properties.description.anyOf.length === 2 && ((TypeGuard.TString(schema.properties.description.anyOf[0]) && + TypeGuard.TUndefined(schema.properties.description.anyOf[1])) || (TypeGuard.TString(schema.properties.description.anyOf[1]) && + TypeGuard.TUndefined(schema.properties.description.anyOf[0])))); + } + function IsObjectNumberLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectBooleanLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectBigIntLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectDateLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectUint8ArrayLike(schema) { + return IsObjectArrayLike(schema); + } + function IsObjectFunctionLike(schema) { + const length = exports.Type.Number(); + return IsObjectPropertyCount(schema, 0) || (IsObjectPropertyCount(schema, 1) && 'length' in schema.properties && IntoBooleanResult(Visit(schema.properties['length'], length)) === TypeExtendsResult.True); + } + function IsObjectConstructorLike(schema) { + return IsObjectPropertyCount(schema, 0); + } + function IsObjectArrayLike(schema) { + const length = exports.Type.Number(); + return IsObjectPropertyCount(schema, 0) || (IsObjectPropertyCount(schema, 1) && 'length' in schema.properties && IntoBooleanResult(Visit(schema.properties['length'], length)) === TypeExtendsResult.True); + } + function IsObjectPromiseLike(schema) { + const then = exports.Type.Function([exports.Type.Any()], exports.Type.Any()); + return IsObjectPropertyCount(schema, 0) || (IsObjectPropertyCount(schema, 1) && 'then' in schema.properties && IntoBooleanResult(Visit(schema.properties['then'], then)) === TypeExtendsResult.True); + } + // -------------------------------------------------------------------------- + // Property + // -------------------------------------------------------------------------- + function Property(left, right) { + if (Visit(left, right) === TypeExtendsResult.False) + return TypeExtendsResult.False; + if (TypeGuard.TOptional(left) && !TypeGuard.TOptional(right)) + return TypeExtendsResult.False; + return TypeExtendsResult.True; + } + function ObjectRight(left, right) { + if (TypeGuard.TUnknown(left)) + return TypeExtendsResult.False; + if (TypeGuard.TAny(left)) + return TypeExtendsResult.Union; + if (TypeGuard.TNever(left)) + return TypeExtendsResult.True; + if (TypeGuard.TLiteral(left) && IsLiteralString(left) && IsObjectStringLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TLiteral(left) && IsLiteralNumber(left) && IsObjectNumberLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TLiteral(left) && IsLiteralBoolean(left) && IsObjectBooleanLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TSymbol(left) && IsObjectSymbolLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TBigInt(left) && IsObjectBigIntLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TString(left) && IsObjectStringLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TSymbol(left) && IsObjectSymbolLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TNumber(left) && IsObjectNumberLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TInteger(left) && IsObjectNumberLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TBoolean(left) && IsObjectBooleanLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TUint8Array(left) && IsObjectUint8ArrayLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TDate(left) && IsObjectDateLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TConstructor(left) && IsObjectConstructorLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TFunction(left) && IsObjectFunctionLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TRecord(left) && TypeGuard.TString(RecordKey(left))) { + // When expressing a Record with literal key values, the Record is converted into a Object with + // the Hint assigned as `Record`. This is used to invert the extends logic. + return right[exports.Hint] === 'Record' ? TypeExtendsResult.True : TypeExtendsResult.False; + } + if (TypeGuard.TRecord(left) && TypeGuard.TNumber(RecordKey(left))) { + return IsObjectPropertyCount(right, 0) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + return TypeExtendsResult.False; + } + function Object(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + if (!TypeGuard.TObject(right)) + return TypeExtendsResult.False; + for (const key of globalThis.Object.keys(right.properties)) { + if (!(key in left.properties)) + return TypeExtendsResult.False; + if (Property(left.properties[key], right.properties[key]) === TypeExtendsResult.False) { + return TypeExtendsResult.False; + } + } + return TypeExtendsResult.True; + } + // -------------------------------------------------------------------------- + // Promise + // -------------------------------------------------------------------------- + function Promise(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right) && IsObjectPromiseLike(right)) + return TypeExtendsResult.True; + if (!TypeGuard.TPromise(right)) + return TypeExtendsResult.False; + return IntoBooleanResult(Visit(left.item, right.item)); + } + // -------------------------------------------------------------------------- + // Record + // -------------------------------------------------------------------------- + function RecordKey(schema) { + if (exports.PatternNumberExact in schema.patternProperties) + return exports.Type.Number(); + if (exports.PatternStringExact in schema.patternProperties) + return exports.Type.String(); + throw Error('TypeExtends: Cannot get record key'); + } + function RecordValue(schema) { + if (exports.PatternNumberExact in schema.patternProperties) + return schema.patternProperties[exports.PatternNumberExact]; + if (exports.PatternStringExact in schema.patternProperties) + return schema.patternProperties[exports.PatternStringExact]; + throw Error('TypeExtends: Cannot get record value'); + } + function RecordRight(left, right) { + const Key = RecordKey(right); + const Value = RecordValue(right); + if (TypeGuard.TLiteral(left) && IsLiteralString(left) && TypeGuard.TNumber(Key) && IntoBooleanResult(Visit(left, Value)) === TypeExtendsResult.True) + return TypeExtendsResult.True; + if (TypeGuard.TUint8Array(left) && TypeGuard.TNumber(Key)) + return Visit(left, Value); + if (TypeGuard.TString(left) && TypeGuard.TNumber(Key)) + return Visit(left, Value); + if (TypeGuard.TArray(left) && TypeGuard.TNumber(Key)) + return Visit(left, Value); + if (TypeGuard.TObject(left)) { + for (const key of globalThis.Object.keys(left.properties)) { + if (Property(Value, left.properties[key]) === TypeExtendsResult.False) { + return TypeExtendsResult.False; + } + } + return TypeExtendsResult.True; + } + return TypeExtendsResult.False; + } + function Record(left, right) { + const Value = RecordValue(left); + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (!TypeGuard.TRecord(right)) + return TypeExtendsResult.False; + return Visit(Value, RecordValue(right)); + } + // -------------------------------------------------------------------------- + // String + // -------------------------------------------------------------------------- + function StringRight(left, right) { + if (TypeGuard.TLiteral(left) && typeof left.const === 'string') + return TypeExtendsResult.True; + return TypeGuard.TString(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function String(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TString(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Symbol + // -------------------------------------------------------------------------- + function Symbol(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TSymbol(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Tuple + // -------------------------------------------------------------------------- + function TupleRight(left, right) { + if (TypeGuard.TUnknown(left)) + return TypeExtendsResult.False; + if (TypeGuard.TAny(left)) + return TypeExtendsResult.Union; + if (TypeGuard.TNever(left)) + return TypeExtendsResult.True; + return TypeExtendsResult.False; + } + function IsArrayOfTuple(left, right) { + return TypeGuard.TArray(right) && left.items !== undefined && left.items.every((schema) => Visit(schema, right.items) === TypeExtendsResult.True); + } + function Tuple(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right) && IsObjectArrayLike(right)) + return TypeExtendsResult.True; + if (TypeGuard.TArray(right) && IsArrayOfTuple(left, right)) + return TypeExtendsResult.True; + if (!TypeGuard.TTuple(right)) + return TypeExtendsResult.False; + if ((left.items === undefined && right.items !== undefined) || (left.items !== undefined && right.items === undefined)) + return TypeExtendsResult.False; + if (left.items === undefined && right.items === undefined) + return TypeExtendsResult.True; + return left.items.every((schema, index) => Visit(schema, right.items[index]) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Uint8Array + // -------------------------------------------------------------------------- + function Uint8Array(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + return TypeGuard.TUint8Array(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Undefined + // -------------------------------------------------------------------------- + function Undefined(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TNever(right)) + return NeverRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + if (TypeGuard.TRecord(right)) + return RecordRight(left, right); + if (TypeGuard.TVoid(right)) + return VoidRight(left, right); + return TypeGuard.TUndefined(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Union + // -------------------------------------------------------------------------- + function UnionRight(left, right) { + return right.anyOf.some((schema) => Visit(left, schema) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Union(left, right) { + return left.anyOf.every((schema) => Visit(schema, right) === TypeExtendsResult.True) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Unknown + // -------------------------------------------------------------------------- + function UnknownRight(left, right) { + return TypeExtendsResult.True; + } + function Unknown(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TString(right)) + return StringRight(left, right); + if (TypeGuard.TNumber(right)) + return NumberRight(left, right); + if (TypeGuard.TInteger(right)) + return IntegerRight(left, right); + if (TypeGuard.TBoolean(right)) + return BooleanRight(left, right); + if (TypeGuard.TArray(right)) + return ArrayRight(left, right); + if (TypeGuard.TTuple(right)) + return TupleRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + return TypeGuard.TUnknown(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + // -------------------------------------------------------------------------- + // Void + // -------------------------------------------------------------------------- + function VoidRight(left, right) { + if (TypeGuard.TUndefined(left)) + return TypeExtendsResult.True; + return TypeGuard.TUndefined(left) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Void(left, right) { + if (TypeGuard.TIntersect(right)) + return IntersectRight(left, right); + if (TypeGuard.TUnion(right)) + return UnionRight(left, right); + if (TypeGuard.TUnknown(right)) + return UnknownRight(left, right); + if (TypeGuard.TAny(right)) + return AnyRight(left, right); + if (TypeGuard.TObject(right)) + return ObjectRight(left, right); + return TypeGuard.TVoid(right) ? TypeExtendsResult.True : TypeExtendsResult.False; + } + function Visit(left, right) { + // template union remap + if (TypeGuard.TTemplateLiteral(left)) + return Visit(TemplateLiteralResolver.Resolve(left), right); + if (TypeGuard.TTemplateLiteral(right)) + return Visit(left, TemplateLiteralResolver.Resolve(right)); + // standard extends + if (TypeGuard.TAny(left)) + return Any(left, right); + if (TypeGuard.TArray(left)) + return Array(left, right); + if (TypeGuard.TBigInt(left)) + return BigInt(left, right); + if (TypeGuard.TBoolean(left)) + return Boolean(left, right); + if (TypeGuard.TConstructor(left)) + return Constructor(left, right); + if (TypeGuard.TDate(left)) + return Date(left, right); + if (TypeGuard.TFunction(left)) + return Function(left, right); + if (TypeGuard.TInteger(left)) + return Integer(left, right); + if (TypeGuard.TIntersect(left)) + return Intersect(left, right); + if (TypeGuard.TLiteral(left)) + return Literal(left, right); + if (TypeGuard.TNever(left)) + return Never(left, right); + if (TypeGuard.TNull(left)) + return Null(left, right); + if (TypeGuard.TNumber(left)) + return Number(left, right); + if (TypeGuard.TObject(left)) + return Object(left, right); + if (TypeGuard.TRecord(left)) + return Record(left, right); + if (TypeGuard.TString(left)) + return String(left, right); + if (TypeGuard.TSymbol(left)) + return Symbol(left, right); + if (TypeGuard.TTuple(left)) + return Tuple(left, right); + if (TypeGuard.TPromise(left)) + return Promise(left, right); + if (TypeGuard.TUint8Array(left)) + return Uint8Array(left, right); + if (TypeGuard.TUndefined(left)) + return Undefined(left, right); + if (TypeGuard.TUnion(left)) + return Union(left, right); + if (TypeGuard.TUnknown(left)) + return Unknown(left, right); + if (TypeGuard.TVoid(left)) + return Void(left, right); + throw Error(`TypeExtends: Unknown left type operand '${left[exports.Kind]}'`); + } + function Extends(left, right) { + return Visit(left, right); + } + TypeExtends.Extends = Extends; +})(TypeExtends = exports.TypeExtends || (exports.TypeExtends = {})); +// -------------------------------------------------------------------------- +// TypeClone +// -------------------------------------------------------------------------- +/** Specialized Clone for Types */ +var TypeClone; +(function (TypeClone) { + function IsObject(value) { + return typeof value === 'object' && value !== null; + } + function IsArray(value) { + return globalThis.Array.isArray(value); + } + function Array(value) { + return value.map((value) => Visit(value)); + } + function Object(value) { + const clonedProperties = globalThis.Object.getOwnPropertyNames(value).reduce((acc, key) => { + return { ...acc, [key]: Visit(value[key]) }; + }, {}); + const clonedSymbols = globalThis.Object.getOwnPropertySymbols(value).reduce((acc, key) => { + return { ...acc, [key]: Visit(value[key]) }; + }, {}); + return { ...clonedProperties, ...clonedSymbols }; + } + function Visit(value) { + if (IsArray(value)) + return Array(value); + if (IsObject(value)) + return Object(value); + return value; + } + /** Clones a type. */ + function Clone(schema, options) { + return { ...Visit(schema), ...options }; + } + TypeClone.Clone = Clone; +})(TypeClone = exports.TypeClone || (exports.TypeClone = {})); +// -------------------------------------------------------------------------- +// ObjectMap +// -------------------------------------------------------------------------- +var ObjectMap; +(function (ObjectMap) { + function Intersect(schema, callback) { + // prettier-ignore + return exports.Type.Intersect(schema.allOf.map((inner) => Visit(inner, callback)), { ...schema }); + } + function Union(schema, callback) { + // prettier-ignore + return exports.Type.Union(schema.anyOf.map((inner) => Visit(inner, callback)), { ...schema }); + } + function Object(schema, callback) { + return callback(schema); + } + function Visit(schema, callback) { + // There are cases where users need to map objects with unregistered kinds. Using a TypeGuard here would + // prevent sub schema mapping as unregistered kinds will not pass TSchema checks. This is notable in the + // case of TObject where unregistered property kinds cause the TObject check to fail. As mapping is only + // used for composition, we use explicit checks instead. + if (schema[exports.Kind] === 'Intersect') + return Intersect(schema, callback); + if (schema[exports.Kind] === 'Union') + return Union(schema, callback); + if (schema[exports.Kind] === 'Object') + return Object(schema, callback); + return schema; + } + function Map(schema, callback, options) { + return { ...Visit(TypeClone.Clone(schema, {}), callback), ...options }; + } + ObjectMap.Map = Map; +})(ObjectMap = exports.ObjectMap || (exports.ObjectMap = {})); +// -------------------------------------------------------------------------- +// KeyResolver +// -------------------------------------------------------------------------- +var KeyResolver; +(function (KeyResolver) { + function IsKeyable(schema) { + return TypeGuard.TIntersect(schema) || TypeGuard.TUnion(schema) || (TypeGuard.TObject(schema) && globalThis.Object.getOwnPropertyNames(schema.properties).length > 0); + } + function Intersect(schema) { + return [...schema.allOf.filter((schema) => IsKeyable(schema)).reduce((set, schema) => Visit(schema).map((key) => set.add(key))[0], new Set())]; + } + function Union(schema) { + const sets = schema.anyOf.filter((schema) => IsKeyable(schema)).map((inner) => Visit(inner)); + return [...sets.reduce((set, outer) => outer.map((key) => (sets.every((inner) => inner.includes(key)) ? set.add(key) : set))[0], new Set())]; + } + function Object(schema) { + return globalThis.Object.keys(schema.properties); + } + function Visit(schema) { + if (TypeGuard.TIntersect(schema)) + return Intersect(schema); + if (TypeGuard.TUnion(schema)) + return Union(schema); + if (TypeGuard.TObject(schema)) + return Object(schema); + return []; + } + function Resolve(schema) { + return Visit(schema); + } + KeyResolver.Resolve = Resolve; +})(KeyResolver = exports.KeyResolver || (exports.KeyResolver = {})); +// -------------------------------------------------------------------------- +// TemplateLiteralPattern +// -------------------------------------------------------------------------- +var TemplateLiteralPattern; +(function (TemplateLiteralPattern) { + function Escape(value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + function Visit(schema, acc) { + if (TypeGuard.TTemplateLiteral(schema)) { + const pattern = schema.pattern.slice(1, schema.pattern.length - 1); + return pattern; + } + else if (TypeGuard.TUnion(schema)) { + const tokens = schema.anyOf.map((schema) => Visit(schema, acc)).join('|'); + return `(${tokens})`; + } + else if (TypeGuard.TNumber(schema)) { + return `${acc}${exports.PatternNumber}`; + } + else if (TypeGuard.TInteger(schema)) { + return `${acc}${exports.PatternNumber}`; + } + else if (TypeGuard.TBigInt(schema)) { + return `${acc}${exports.PatternNumber}`; + } + else if (TypeGuard.TString(schema)) { + return `${acc}${exports.PatternString}`; + } + else if (TypeGuard.TLiteral(schema)) { + return `${acc}${Escape(schema.const.toString())}`; + } + else if (TypeGuard.TBoolean(schema)) { + return `${acc}${exports.PatternBoolean}`; + } + else if (TypeGuard.TNever(schema)) { + throw Error('TemplateLiteralPattern: TemplateLiteral cannot operate on types of TNever'); + } + else { + throw Error(`TemplateLiteralPattern: Unexpected Kind '${schema[exports.Kind]}'`); + } + } + function Create(kinds) { + return `^${kinds.map((schema) => Visit(schema, '')).join('')}\$`; + } + TemplateLiteralPattern.Create = Create; +})(TemplateLiteralPattern = exports.TemplateLiteralPattern || (exports.TemplateLiteralPattern = {})); +// -------------------------------------------------------------------------------------- +// TemplateLiteralResolver +// -------------------------------------------------------------------------------------- +var TemplateLiteralResolver; +(function (TemplateLiteralResolver) { + function Resolve(template) { + const expression = TemplateLiteralParser.ParseExact(template.pattern); + if (!TemplateLiteralFinite.Check(expression)) + return exports.Type.String(); + const literals = [...TemplateLiteralGenerator.Generate(expression)].map((value) => exports.Type.Literal(value)); + return exports.Type.Union(literals); + } + TemplateLiteralResolver.Resolve = Resolve; +})(TemplateLiteralResolver = exports.TemplateLiteralResolver || (exports.TemplateLiteralResolver = {})); +// -------------------------------------------------------------------------------------- +// TemplateLiteralParser +// -------------------------------------------------------------------------------------- +class TemplateLiteralParserError extends Error { + constructor(message) { + super(message); + } +} +exports.TemplateLiteralParserError = TemplateLiteralParserError; +var TemplateLiteralParser; +(function (TemplateLiteralParser) { + function IsNonEscaped(pattern, index, char) { + return pattern[index] === char && pattern.charCodeAt(index - 1) !== 92; + } + function IsOpenParen(pattern, index) { + return IsNonEscaped(pattern, index, '('); + } + function IsCloseParen(pattern, index) { + return IsNonEscaped(pattern, index, ')'); + } + function IsSeparator(pattern, index) { + return IsNonEscaped(pattern, index, '|'); + } + function IsGroup(pattern) { + if (!(IsOpenParen(pattern, 0) && IsCloseParen(pattern, pattern.length - 1))) + return false; + let count = 0; + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) + count += 1; + if (IsCloseParen(pattern, index)) + count -= 1; + if (count === 0 && index !== pattern.length - 1) + return false; + } + return true; + } + function InGroup(pattern) { + return pattern.slice(1, pattern.length - 1); + } + function IsPrecedenceOr(pattern) { + let count = 0; + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) + count += 1; + if (IsCloseParen(pattern, index)) + count -= 1; + if (IsSeparator(pattern, index) && count === 0) + return true; + } + return false; + } + function IsPrecedenceAnd(pattern) { + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) + return true; + } + return false; + } + function Or(pattern) { + let [count, start] = [0, 0]; + const expressions = []; + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) + count += 1; + if (IsCloseParen(pattern, index)) + count -= 1; + if (IsSeparator(pattern, index) && count === 0) { + const range = pattern.slice(start, index); + if (range.length > 0) + expressions.push(Parse(range)); + start = index + 1; + } + } + const range = pattern.slice(start); + if (range.length > 0) + expressions.push(Parse(range)); + if (expressions.length === 0) + return { type: 'const', const: '' }; + if (expressions.length === 1) + return expressions[0]; + return { type: 'or', expr: expressions }; + } + function And(pattern) { + function Group(value, index) { + if (!IsOpenParen(value, index)) + throw new TemplateLiteralParserError(`TemplateLiteralParser: Index must point to open parens`); + let count = 0; + for (let scan = index; scan < value.length; scan++) { + if (IsOpenParen(value, scan)) + count += 1; + if (IsCloseParen(value, scan)) + count -= 1; + if (count === 0) + return [index, scan]; + } + throw new TemplateLiteralParserError(`TemplateLiteralParser: Unclosed group parens in expression`); + } + function Range(pattern, index) { + for (let scan = index; scan < pattern.length; scan++) { + if (IsOpenParen(pattern, scan)) + return [index, scan]; + } + return [index, pattern.length]; + } + const expressions = []; + for (let index = 0; index < pattern.length; index++) { + if (IsOpenParen(pattern, index)) { + const [start, end] = Group(pattern, index); + const range = pattern.slice(start, end + 1); + expressions.push(Parse(range)); + index = end; + } + else { + const [start, end] = Range(pattern, index); + const range = pattern.slice(start, end); + if (range.length > 0) + expressions.push(Parse(range)); + index = end - 1; + } + } + if (expressions.length === 0) + return { type: 'const', const: '' }; + if (expressions.length === 1) + return expressions[0]; + return { type: 'and', expr: expressions }; + } + /** Parses a pattern and returns an expression tree */ + function Parse(pattern) { + if (IsGroup(pattern)) + return Parse(InGroup(pattern)); + if (IsPrecedenceOr(pattern)) + return Or(pattern); + if (IsPrecedenceAnd(pattern)) + return And(pattern); + return { type: 'const', const: pattern }; + } + TemplateLiteralParser.Parse = Parse; + /** Parses a pattern and strips forward and trailing ^ and $ */ + function ParseExact(pattern) { + return Parse(pattern.slice(1, pattern.length - 1)); + } + TemplateLiteralParser.ParseExact = ParseExact; +})(TemplateLiteralParser = exports.TemplateLiteralParser || (exports.TemplateLiteralParser = {})); +// -------------------------------------------------------------------------------------- +// TemplateLiteralFinite +// -------------------------------------------------------------------------------------- +var TemplateLiteralFinite; +(function (TemplateLiteralFinite) { + function IsNumber(expression) { + // prettier-ignore + return (expression.type === 'or' && + expression.expr.length === 2 && + expression.expr[0].type === 'const' && + expression.expr[0].const === '0' && + expression.expr[1].type === 'const' && + expression.expr[1].const === '[1-9][0-9]*'); + } + function IsBoolean(expression) { + // prettier-ignore + return (expression.type === 'or' && + expression.expr.length === 2 && + expression.expr[0].type === 'const' && + expression.expr[0].const === 'true' && + expression.expr[1].type === 'const' && + expression.expr[1].const === 'false'); + } + function IsString(expression) { + return expression.type === 'const' && expression.const === '.*'; + } + function Check(expression) { + if (IsBoolean(expression)) + return true; + if (IsNumber(expression) || IsString(expression)) + return false; + if (expression.type === 'and') + return expression.expr.every((expr) => Check(expr)); + if (expression.type === 'or') + return expression.expr.every((expr) => Check(expr)); + if (expression.type === 'const') + return true; + throw Error(`TemplateLiteralFinite: Unknown expression type`); + } + TemplateLiteralFinite.Check = Check; +})(TemplateLiteralFinite = exports.TemplateLiteralFinite || (exports.TemplateLiteralFinite = {})); +// -------------------------------------------------------------------------------------- +// TemplateLiteralGenerator +// -------------------------------------------------------------------------------------- +var TemplateLiteralGenerator; +(function (TemplateLiteralGenerator) { + function* Reduce(buffer) { + if (buffer.length === 1) + return yield* buffer[0]; + for (const left of buffer[0]) { + for (const right of Reduce(buffer.slice(1))) { + yield `${left}${right}`; + } + } + } + function* And(expression) { + return yield* Reduce(expression.expr.map((expr) => [...Generate(expr)])); + } + function* Or(expression) { + for (const expr of expression.expr) + yield* Generate(expr); + } + function* Const(expression) { + return yield expression.const; + } + function* Generate(expression) { + if (expression.type === 'and') + return yield* And(expression); + if (expression.type === 'or') + return yield* Or(expression); + if (expression.type === 'const') + return yield* Const(expression); + throw Error('TemplateLiteralGenerator: Unknown expression'); + } + TemplateLiteralGenerator.Generate = Generate; +})(TemplateLiteralGenerator = exports.TemplateLiteralGenerator || (exports.TemplateLiteralGenerator = {})); +// -------------------------------------------------------------------------- +// TypeOrdinal: Used for auto $id generation +// -------------------------------------------------------------------------- +let TypeOrdinal = 0; +// -------------------------------------------------------------------------- +// TypeBuilder +// -------------------------------------------------------------------------- +class TypeBuilder { + /** `[Utility]` Creates a schema without `static` and `params` types */ + Create(schema) { + return schema; + } + /** `[Standard]` Omits compositing symbols from this schema */ + Strict(schema) { + return JSON.parse(JSON.stringify(schema)); + } +} +exports.TypeBuilder = TypeBuilder; +// -------------------------------------------------------------------------- +// StandardTypeBuilder +// -------------------------------------------------------------------------- +class StandardTypeBuilder extends TypeBuilder { + // ------------------------------------------------------------------------ + // Modifiers + // ------------------------------------------------------------------------ + /** `[Modifier]` Creates a Optional property */ + Optional(schema) { + return { [exports.Modifier]: 'Optional', ...TypeClone.Clone(schema, {}) }; + } + /** `[Modifier]` Creates a ReadonlyOptional property */ + ReadonlyOptional(schema) { + return { [exports.Modifier]: 'ReadonlyOptional', ...TypeClone.Clone(schema, {}) }; + } + /** `[Modifier]` Creates a Readonly object or property */ + Readonly(schema) { + return { [exports.Modifier]: 'Readonly', ...schema }; + } + // ------------------------------------------------------------------------ + // Types + // ------------------------------------------------------------------------ + /** `[Standard]` Creates an Any type */ + Any(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Any' }); + } + /** `[Standard]` Creates an Array type */ + Array(items, options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Array', type: 'array', items: TypeClone.Clone(items, {}) }); + } + /** `[Standard]` Creates a Boolean type */ + Boolean(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Boolean', type: 'boolean' }); + } + /** `[Standard]` Creates a Composite object type. */ + Composite(objects, options) { + const isOptionalAll = (objects, key) => objects.every((object) => !(key in object.properties) || IsOptional(object.properties[key])); + const IsOptional = (schema) => TypeGuard.TOptional(schema) || TypeGuard.TReadonlyOptional(schema); + const [required, optional] = [new Set(), new Set()]; + for (const object of objects) { + for (const key of globalThis.Object.getOwnPropertyNames(object.properties)) { + if (isOptionalAll(objects, key)) + optional.add(key); + } + } + for (const object of objects) { + for (const key of globalThis.Object.getOwnPropertyNames(object.properties)) { + if (!optional.has(key)) + required.add(key); + } + } + const properties = {}; + for (const object of objects) { + for (const [key, schema] of Object.entries(object.properties)) { + const property = TypeClone.Clone(schema, {}); + if (!optional.has(key)) + delete property[exports.Modifier]; + if (key in properties) { + const left = TypeExtends.Extends(properties[key], property) !== TypeExtendsResult.False; + const right = TypeExtends.Extends(property, properties[key]) !== TypeExtendsResult.False; + if (!left && !right) + properties[key] = exports.Type.Never(); + if (!left && right) + properties[key] = property; + } + else { + properties[key] = property; + } + } + } + if (required.size > 0) { + return this.Create({ ...options, [exports.Kind]: 'Object', [exports.Hint]: 'Composite', type: 'object', properties, required: [...required] }); + } + else { + return this.Create({ ...options, [exports.Kind]: 'Object', [exports.Hint]: 'Composite', type: 'object', properties }); + } + } + /** `[Standard]` Creates a Enum type */ + Enum(item, options = {}) { + // prettier-ignore + const values = globalThis.Object.keys(item).filter((key) => isNaN(key)).map((key) => item[key]); + const anyOf = values.map((value) => (typeof value === 'string' ? { [exports.Kind]: 'Literal', type: 'string', const: value } : { [exports.Kind]: 'Literal', type: 'number', const: value })); + return this.Create({ ...options, [exports.Kind]: 'Union', anyOf }); + } + /** `[Standard]` A conditional type expression that will return the true type if the left type extends the right */ + Extends(left, right, trueType, falseType, options = {}) { + switch (TypeExtends.Extends(left, right)) { + case TypeExtendsResult.Union: + return this.Union([TypeClone.Clone(trueType, options), TypeClone.Clone(falseType, options)]); + case TypeExtendsResult.True: + return TypeClone.Clone(trueType, options); + case TypeExtendsResult.False: + return TypeClone.Clone(falseType, options); + } + } + /** `[Standard]` Excludes from the left type any type that is not assignable to the right */ + Exclude(left, right, options = {}) { + if (TypeGuard.TTemplateLiteral(left)) + return this.Exclude(TemplateLiteralResolver.Resolve(left), right, options); + if (TypeGuard.TTemplateLiteral(right)) + return this.Exclude(left, TemplateLiteralResolver.Resolve(right), options); + if (TypeGuard.TUnion(left)) { + const narrowed = left.anyOf.filter((inner) => TypeExtends.Extends(inner, right) === TypeExtendsResult.False); + return (narrowed.length === 1 ? TypeClone.Clone(narrowed[0], options) : this.Union(narrowed, options)); + } + else { + return (TypeExtends.Extends(left, right) !== TypeExtendsResult.False ? this.Never(options) : TypeClone.Clone(left, options)); + } + } + /** `[Standard]` Extracts from the left type any type that is assignable to the right */ + Extract(left, right, options = {}) { + if (TypeGuard.TTemplateLiteral(left)) + return this.Extract(TemplateLiteralResolver.Resolve(left), right, options); + if (TypeGuard.TTemplateLiteral(right)) + return this.Extract(left, TemplateLiteralResolver.Resolve(right), options); + if (TypeGuard.TUnion(left)) { + const narrowed = left.anyOf.filter((inner) => TypeExtends.Extends(inner, right) !== TypeExtendsResult.False); + return (narrowed.length === 1 ? TypeClone.Clone(narrowed[0], options) : this.Union(narrowed, options)); + } + else { + return (TypeExtends.Extends(left, right) !== TypeExtendsResult.False ? TypeClone.Clone(left, options) : this.Never(options)); + } + } + /** `[Standard]` Creates an Integer type */ + Integer(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Integer', type: 'integer' }); + } + Intersect(allOf, options = {}) { + if (allOf.length === 0) + return exports.Type.Never(); + if (allOf.length === 1) + return TypeClone.Clone(allOf[0], options); + const objects = allOf.every((schema) => TypeGuard.TObject(schema)); + const cloned = allOf.map((schema) => TypeClone.Clone(schema, {})); + const clonedUnevaluatedProperties = TypeGuard.TSchema(options.unevaluatedProperties) ? { unevaluatedProperties: TypeClone.Clone(options.unevaluatedProperties, {}) } : {}; + if (options.unevaluatedProperties === false || TypeGuard.TSchema(options.unevaluatedProperties) || objects) { + return this.Create({ ...options, ...clonedUnevaluatedProperties, [exports.Kind]: 'Intersect', type: 'object', allOf: cloned }); + } + else { + return this.Create({ ...options, ...clonedUnevaluatedProperties, [exports.Kind]: 'Intersect', allOf: cloned }); + } + } + /** `[Standard]` Creates a KeyOf type */ + KeyOf(schema, options = {}) { + if (TypeGuard.TRecord(schema)) { + const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0]; + if (pattern === exports.PatternNumberExact) + return this.Number(options); + if (pattern === exports.PatternStringExact) + return this.String(options); + throw Error('StandardTypeBuilder: Unable to resolve key type from Record key pattern'); + } + else { + const resolved = KeyResolver.Resolve(schema); + if (resolved.length === 0) + return this.Never(options); + const literals = resolved.map((key) => this.Literal(key)); + return this.Union(literals, options); + } + } + /** `[Standard]` Creates a Literal type */ + Literal(value, options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Literal', const: value, type: typeof value }); + } + /** `[Standard]` Creates a Never type */ + Never(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Never', not: {} }); + } + /** `[Standard]` Creates a Not type. The first argument is the disallowed type, the second is the allowed. */ + Not(not, schema, options) { + return this.Create({ ...options, [exports.Kind]: 'Not', allOf: [{ not: TypeClone.Clone(not, {}) }, TypeClone.Clone(schema, {})] }); + } + /** `[Standard]` Creates a Null type */ + Null(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Null', type: 'null' }); + } + /** `[Standard]` Creates a Number type */ + Number(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Number', type: 'number' }); + } + /** `[Standard]` Creates an Object type */ + Object(properties, options = {}) { + const propertyKeys = globalThis.Object.getOwnPropertyNames(properties); + const optionalKeys = propertyKeys.filter((key) => TypeGuard.TOptional(properties[key]) || TypeGuard.TReadonlyOptional(properties[key])); + const requiredKeys = propertyKeys.filter((name) => !optionalKeys.includes(name)); + const clonedAdditionalProperties = TypeGuard.TSchema(options.additionalProperties) ? { additionalProperties: TypeClone.Clone(options.additionalProperties, {}) } : {}; + const clonedProperties = propertyKeys.reduce((acc, key) => ({ ...acc, [key]: TypeClone.Clone(properties[key], {}) }), {}); + if (requiredKeys.length > 0) { + return this.Create({ ...options, ...clonedAdditionalProperties, [exports.Kind]: 'Object', type: 'object', properties: clonedProperties, required: requiredKeys }); + } + else { + return this.Create({ ...options, ...clonedAdditionalProperties, [exports.Kind]: 'Object', type: 'object', properties: clonedProperties }); + } + } + Omit(schema, unresolved, options = {}) { + // prettier-ignore + const keys = TypeGuard.TUnionLiteral(unresolved) ? unresolved.anyOf.map((schema) => schema.const) : + TypeGuard.TLiteral(unresolved) ? [unresolved.const] : + TypeGuard.TNever(unresolved) ? [] : + unresolved; + // prettier-ignore + return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => { + if (schema.required) { + schema.required = schema.required.filter((key) => !keys.includes(key)); + if (schema.required.length === 0) + delete schema.required; + } + for (const key of globalThis.Object.keys(schema.properties)) { + if (keys.includes(key)) + delete schema.properties[key]; + } + return this.Create(schema); + }, options); + } + /** `[Standard]` Creates a mapped type where all properties are Optional */ + Partial(schema, options = {}) { + function Apply(schema) { + // prettier-ignore + switch (schema[exports.Modifier]) { + case 'ReadonlyOptional': + schema[exports.Modifier] = 'ReadonlyOptional'; + break; + case 'Readonly': + schema[exports.Modifier] = 'ReadonlyOptional'; + break; + case 'Optional': + schema[exports.Modifier] = 'Optional'; + break; + default: + schema[exports.Modifier] = 'Optional'; + break; + } + } + // prettier-ignore + return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => { + delete schema.required; + globalThis.Object.keys(schema.properties).forEach(key => Apply(schema.properties[key])); + return schema; + }, options); + } + Pick(schema, unresolved, options = {}) { + // prettier-ignore + const keys = TypeGuard.TUnionLiteral(unresolved) ? unresolved.anyOf.map((schema) => schema.const) : + TypeGuard.TLiteral(unresolved) ? [unresolved.const] : + TypeGuard.TNever(unresolved) ? [] : + unresolved; + // prettier-ignore + return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => { + if (schema.required) { + schema.required = schema.required.filter((key) => keys.includes(key)); + if (schema.required.length === 0) + delete schema.required; + } + for (const key of globalThis.Object.keys(schema.properties)) { + if (!keys.includes(key)) + delete schema.properties[key]; + } + return this.Create(schema); + }, options); + } + /** `[Standard]` Creates a Record type */ + Record(key, schema, options = {}) { + if (TypeGuard.TTemplateLiteral(key)) { + const expression = TemplateLiteralParser.ParseExact(key.pattern); + // prettier-ignore + return TemplateLiteralFinite.Check(expression) + ? (this.Object([...TemplateLiteralGenerator.Generate(expression)].reduce((acc, key) => ({ ...acc, [key]: TypeClone.Clone(schema, {}) }), {}), options)) + : this.Create({ ...options, [exports.Kind]: 'Record', type: 'object', patternProperties: { [key.pattern]: TypeClone.Clone(schema, {}) }, additionalProperties: false }); + } + else if (TypeGuard.TUnionLiteral(key)) { + if (key.anyOf.every((schema) => TypeGuard.TLiteral(schema) && (typeof schema.const === 'string' || typeof schema.const === 'number'))) { + const properties = key.anyOf.reduce((acc, literal) => ({ ...acc, [literal.const]: TypeClone.Clone(schema, {}) }), {}); + return this.Object(properties, { ...options, [exports.Hint]: 'Record' }); + } + else + throw Error('TypeBuilder: Record key can only be derived from union literal of number or string'); + } + else if (TypeGuard.TLiteral(key)) { + if (typeof key.const === 'string' || typeof key.const === 'number') { + return this.Object({ [key.const]: TypeClone.Clone(schema, {}) }, options); + } + else + throw Error('TypeBuilder: Record key can only be derived from literals of number or string'); + } + else if (TypeGuard.TInteger(key) || TypeGuard.TNumber(key)) { + const pattern = exports.PatternNumberExact; + return this.Create({ ...options, [exports.Kind]: 'Record', type: 'object', patternProperties: { [pattern]: TypeClone.Clone(schema, {}) }, additionalProperties: false }); + } + else if (TypeGuard.TString(key)) { + const pattern = key.pattern === undefined ? exports.PatternStringExact : key.pattern; + return this.Create({ ...options, [exports.Kind]: 'Record', type: 'object', patternProperties: { [pattern]: TypeClone.Clone(schema, {}) }, additionalProperties: false }); + } + else { + throw Error(`StandardTypeBuilder: Invalid Record Key`); + } + } + /** `[Standard]` Creates a Recursive type */ + Recursive(callback, options = {}) { + if (options.$id === undefined) + options.$id = `T${TypeOrdinal++}`; + const thisType = callback({ [exports.Kind]: 'This', $ref: `${options.$id}` }); + thisType.$id = options.$id; + return this.Create({ ...options, [exports.Hint]: 'Recursive', ...thisType }); + } + /** `[Standard]` Creates a Ref type. The referenced type must contain a $id */ + Ref(schema, options = {}) { + if (schema.$id === undefined) + throw Error('StandardTypeBuilder.Ref: Target type must specify an $id'); + return this.Create({ ...options, [exports.Kind]: 'Ref', $ref: schema.$id }); + } + /** `[Standard]` Creates a mapped type where all properties are Required */ + Required(schema, options = {}) { + function Apply(schema) { + // prettier-ignore + switch (schema[exports.Modifier]) { + case 'ReadonlyOptional': + schema[exports.Modifier] = 'Readonly'; + break; + case 'Readonly': + schema[exports.Modifier] = 'Readonly'; + break; + case 'Optional': + delete schema[exports.Modifier]; + break; + default: + delete schema[exports.Modifier]; + break; + } + } + // prettier-ignore + return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => { + schema.required = globalThis.Object.keys(schema.properties); + globalThis.Object.keys(schema.properties).forEach(key => Apply(schema.properties[key])); + return schema; + }, options); + } + /** `[Standard]` Creates a String type */ + String(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'String', type: 'string' }); + } + /** `[Standard]` Creates a template literal type */ + TemplateLiteral(kinds, options = {}) { + const pattern = TemplateLiteralPattern.Create(kinds); + return this.Create({ ...options, [exports.Kind]: 'TemplateLiteral', type: 'string', pattern }); + } + /** `[Standard]` Creates a Tuple type */ + Tuple(items, options = {}) { + const [additionalItems, minItems, maxItems] = [false, items.length, items.length]; + const clonedItems = items.map((item) => TypeClone.Clone(item, {})); + // prettier-ignore + const schema = (items.length > 0 ? + { ...options, [exports.Kind]: 'Tuple', type: 'array', items: clonedItems, additionalItems, minItems, maxItems } : + { ...options, [exports.Kind]: 'Tuple', type: 'array', minItems, maxItems }); + return this.Create(schema); + } + Union(union, options = {}) { + if (TypeGuard.TTemplateLiteral(union)) { + return TemplateLiteralResolver.Resolve(union); + } + else { + const anyOf = union; + if (anyOf.length === 0) + return this.Never(options); + if (anyOf.length === 1) + return this.Create(TypeClone.Clone(anyOf[0], options)); + const clonedAnyOf = anyOf.map((schema) => TypeClone.Clone(schema, {})); + return this.Create({ ...options, [exports.Kind]: 'Union', anyOf: clonedAnyOf }); + } + } + /** `[Standard]` Creates an Unknown type */ + Unknown(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Unknown' }); + } + /** `[Standard]` Creates a Unsafe type that infers for the generic argument */ + Unsafe(options = {}) { + return this.Create({ ...options, [exports.Kind]: options[exports.Kind] || 'Unsafe' }); + } +} +exports.StandardTypeBuilder = StandardTypeBuilder; +// -------------------------------------------------------------------------- +// ExtendedTypeBuilder +// -------------------------------------------------------------------------- +class ExtendedTypeBuilder extends StandardTypeBuilder { + /** `[Extended]` Creates a BigInt type */ + BigInt(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'BigInt', type: 'null', typeOf: 'BigInt' }); + } + /** `[Extended]` Extracts the ConstructorParameters from the given Constructor type */ + ConstructorParameters(schema, options = {}) { + return this.Tuple([...schema.parameters], { ...options }); + } + Constructor(parameters, returns, options = {}) { + const clonedReturns = TypeClone.Clone(returns, {}); + if (TypeGuard.TTuple(parameters)) { + const clonedParameters = parameters.items === undefined ? [] : parameters.items.map((parameter) => TypeClone.Clone(parameter, {})); + return this.Create({ ...options, [exports.Kind]: 'Constructor', type: 'object', instanceOf: 'Constructor', parameters: clonedParameters, returns: clonedReturns }); + } + else if (globalThis.Array.isArray(parameters)) { + const clonedParameters = parameters.map((parameter) => TypeClone.Clone(parameter, {})); + return this.Create({ ...options, [exports.Kind]: 'Constructor', type: 'object', instanceOf: 'Constructor', parameters: clonedParameters, returns: clonedReturns }); + } + else { + throw new Error('ExtendedTypeBuilder.Constructor: Invalid parameters'); + } + } + /** `[Extended]` Creates a Date type */ + Date(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Date', type: 'object', instanceOf: 'Date' }); + } + Function(parameters, returns, options = {}) { + const clonedReturns = TypeClone.Clone(returns, {}); + if (TypeGuard.TTuple(parameters)) { + const clonedParameters = parameters.items === undefined ? [] : parameters.items.map((parameter) => TypeClone.Clone(parameter, {})); + return this.Create({ ...options, [exports.Kind]: 'Function', type: 'object', instanceOf: 'Function', parameters: clonedParameters, returns: clonedReturns }); + } + else if (globalThis.Array.isArray(parameters)) { + const clonedParameters = parameters.map((parameter) => TypeClone.Clone(parameter, {})); + return this.Create({ ...options, [exports.Kind]: 'Function', type: 'object', instanceOf: 'Function', parameters: clonedParameters, returns: clonedReturns }); + } + else { + throw new Error('ExtendedTypeBuilder.Function: Invalid parameters'); + } + } + /** `[Extended]` Extracts the InstanceType from the given Constructor */ + InstanceType(schema, options = {}) { + return TypeClone.Clone(schema.returns, options); + } + /** `[Extended]` Extracts the Parameters from the given Function type */ + Parameters(schema, options = {}) { + return this.Tuple(schema.parameters, { ...options }); + } + /** `[Extended]` Creates a Promise type */ + Promise(item, options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Promise', type: 'object', instanceOf: 'Promise', item: TypeClone.Clone(item, {}) }); + } + /** `[Extended]` Creates a regular expression type */ + RegEx(regex, options = {}) { + return this.Create({ ...options, [exports.Kind]: 'String', type: 'string', pattern: regex.source }); + } + /** `[Extended]` Extracts the ReturnType from the given Function */ + ReturnType(schema, options = {}) { + return TypeClone.Clone(schema.returns, options); + } + /** `[Extended]` Creates a Symbol type */ + Symbol(options) { + return this.Create({ ...options, [exports.Kind]: 'Symbol', type: 'null', typeOf: 'Symbol' }); + } + /** `[Extended]` Creates a Undefined type */ + Undefined(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Undefined', type: 'null', typeOf: 'Undefined' }); + } + /** `[Extended]` Creates a Uint8Array type */ + Uint8Array(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Uint8Array', type: 'object', instanceOf: 'Uint8Array' }); + } + /** `[Extended]` Creates a Void type */ + Void(options = {}) { + return this.Create({ ...options, [exports.Kind]: 'Void', type: 'null', typeOf: 'Void' }); + } +} +exports.ExtendedTypeBuilder = ExtendedTypeBuilder; +/** JSON Schema TypeBuilder with Static Resolution for TypeScript */ +exports.StandardType = new StandardTypeBuilder(); +/** JSON Schema TypeBuilder with Static Resolution for TypeScript */ +exports.Type = new ExtendedTypeBuilder(); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/cast.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/cast.d.ts new file mode 100644 index 0000000..992d9e3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/cast.d.ts @@ -0,0 +1,30 @@ +import * as Types from '../typebox'; +export declare class ValueCastReferenceTypeError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare class ValueCastArrayUniqueItemsTypeError extends Error { + readonly schema: Types.TSchema; + readonly value: unknown; + constructor(schema: Types.TSchema, value: unknown); +} +export declare class ValueCastNeverTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCastRecursiveTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCastUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCastDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare namespace ValueCast { + function Visit(schema: Types.TSchema, references: Types.TSchema[], value: any): any; + function Cast(schema: T, references: Types.TSchema[], value: any): Types.Static; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/cast.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/cast.js new file mode 100644 index 0000000..42fe2e1 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/cast.js @@ -0,0 +1,372 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueCast = exports.ValueCastDereferenceError = exports.ValueCastUnknownTypeError = exports.ValueCastRecursiveTypeError = exports.ValueCastNeverTypeError = exports.ValueCastArrayUniqueItemsTypeError = exports.ValueCastReferenceTypeError = void 0; +const Types = require("../typebox"); +const create_1 = require("./create"); +const check_1 = require("./check"); +const clone_1 = require("./clone"); +// ---------------------------------------------------------------------------------------------- +// Errors +// ---------------------------------------------------------------------------------------------- +class ValueCastReferenceTypeError extends Error { + constructor(schema) { + super(`ValueCast: Cannot locate referenced schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueCastReferenceTypeError = ValueCastReferenceTypeError; +class ValueCastArrayUniqueItemsTypeError extends Error { + constructor(schema, value) { + super('ValueCast: Array cast produced invalid data due to uniqueItems constraint'); + this.schema = schema; + this.value = value; + } +} +exports.ValueCastArrayUniqueItemsTypeError = ValueCastArrayUniqueItemsTypeError; +class ValueCastNeverTypeError extends Error { + constructor(schema) { + super('ValueCast: Never types cannot be cast'); + this.schema = schema; + } +} +exports.ValueCastNeverTypeError = ValueCastNeverTypeError; +class ValueCastRecursiveTypeError extends Error { + constructor(schema) { + super('ValueCast.Recursive: Cannot cast recursive schemas'); + this.schema = schema; + } +} +exports.ValueCastRecursiveTypeError = ValueCastRecursiveTypeError; +class ValueCastUnknownTypeError extends Error { + constructor(schema) { + super('ValueCast: Unknown type'); + this.schema = schema; + } +} +exports.ValueCastUnknownTypeError = ValueCastUnknownTypeError; +class ValueCastDereferenceError extends Error { + constructor(schema) { + super(`ValueCast: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueCastDereferenceError = ValueCastDereferenceError; +// ---------------------------------------------------------------------------------------------- +// The following will score a schema against a value. For objects, the score is the tally of +// points awarded for each property of the value. Property points are (1.0 / propertyCount) +// to prevent large property counts biasing results. Properties that match literal values are +// maximally awarded as literals are typically used as union discriminator fields. +// ---------------------------------------------------------------------------------------------- +var UnionCastCreate; +(function (UnionCastCreate) { + function Score(schema, references, value) { + if (schema[Types.Kind] === 'Object' && typeof value === 'object' && value !== null) { + const object = schema; + const keys = Object.keys(value); + const entries = globalThis.Object.entries(object.properties); + const [point, max] = [1 / entries.length, entries.length]; + return entries.reduce((acc, [key, schema]) => { + const literal = schema[Types.Kind] === 'Literal' && schema.const === value[key] ? max : 0; + const checks = check_1.ValueCheck.Check(schema, references, value[key]) ? point : 0; + const exists = keys.includes(key) ? point : 0; + return acc + (literal + checks + exists); + }, 0); + } + else { + return check_1.ValueCheck.Check(schema, references, value) ? 1 : 0; + } + } + function Select(union, references, value) { + let [select, best] = [union.anyOf[0], 0]; + for (const schema of union.anyOf) { + const score = Score(schema, references, value); + if (score > best) { + select = schema; + best = score; + } + } + return select; + } + function Create(union, references, value) { + if (union.default !== undefined) { + return union.default; + } + else { + const schema = Select(union, references, value); + return ValueCast.Cast(schema, references, value); + } + } + UnionCastCreate.Create = Create; +})(UnionCastCreate || (UnionCastCreate = {})); +var ValueCast; +(function (ValueCast) { + // ---------------------------------------------------------------------------------------------- + // Guards + // ---------------------------------------------------------------------------------------------- + function IsObject(value) { + return typeof value === 'object' && value !== null && !globalThis.Array.isArray(value); + } + function IsArray(value) { + return typeof value === 'object' && globalThis.Array.isArray(value); + } + function IsNumber(value) { + return typeof value === 'number' && !isNaN(value); + } + function IsString(value) { + return typeof value === 'string'; + } + // ---------------------------------------------------------------------------------------------- + // Cast + // ---------------------------------------------------------------------------------------------- + function Any(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Array(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return clone_1.ValueClone.Clone(value); + const created = IsArray(value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + const minimum = IsNumber(schema.minItems) && created.length < schema.minItems ? [...created, ...globalThis.Array.from({ length: schema.minItems - created.length }, () => null)] : created; + const maximum = IsNumber(schema.maxItems) && minimum.length > schema.maxItems ? minimum.slice(0, schema.maxItems) : minimum; + const casted = maximum.map((value) => Visit(schema.items, references, value)); + if (schema.uniqueItems !== true) + return casted; + const unique = [...new Set(casted)]; + if (!check_1.ValueCheck.Check(schema, references, unique)) + throw new ValueCastArrayUniqueItemsTypeError(schema, unique); + return unique; + } + function BigInt(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Boolean(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Constructor(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return create_1.ValueCreate.Create(schema, references); + const required = new Set(schema.returns.required || []); + const result = function () { }; + for (const [key, property] of globalThis.Object.entries(schema.returns.properties)) { + if (!required.has(key) && value.prototype[key] === undefined) + continue; + result.prototype[key] = Visit(property, references, value.prototype[key]); + } + return result; + } + function Date(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Function(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Integer(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Intersect(schema, references, value) { + const created = create_1.ValueCreate.Create(schema, references); + const mapped = IsObject(created) && IsObject(value) ? { ...created, ...value } : value; + return check_1.ValueCheck.Check(schema, references, mapped) ? mapped : create_1.ValueCreate.Create(schema, references); + } + function Literal(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Never(schema, references, value) { + throw new ValueCastNeverTypeError(schema); + } + function Not(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema.allOf[1], references); + } + function Null(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Number(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Object(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return value; + if (value === null || typeof value !== 'object') + return create_1.ValueCreate.Create(schema, references); + const required = new Set(schema.required || []); + const result = {}; + for (const [key, property] of globalThis.Object.entries(schema.properties)) { + if (!required.has(key) && value[key] === undefined) + continue; + result[key] = Visit(property, references, value[key]); + } + // additional schema properties + if (typeof schema.additionalProperties === 'object') { + const propertyNames = globalThis.Object.getOwnPropertyNames(schema.properties); + for (const propertyName of globalThis.Object.getOwnPropertyNames(value)) { + if (propertyNames.includes(propertyName)) + continue; + result[propertyName] = Visit(schema.additionalProperties, references, value[propertyName]); + } + } + return result; + } + function Promise(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Record(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return clone_1.ValueClone.Clone(value); + if (value === null || typeof value !== 'object' || globalThis.Array.isArray(value) || value instanceof globalThis.Date) + return create_1.ValueCreate.Create(schema, references); + const subschemaPropertyName = globalThis.Object.getOwnPropertyNames(schema.patternProperties)[0]; + const subschema = schema.patternProperties[subschemaPropertyName]; + const result = {}; + for (const [propKey, propValue] of globalThis.Object.entries(value)) { + result[propKey] = Visit(subschema, references, propValue); + } + return result; + } + function Ref(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueCastDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function String(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references); + } + function Symbol(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function TemplateLiteral(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function This(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueCastDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function Tuple(schema, references, value) { + if (check_1.ValueCheck.Check(schema, references, value)) + return clone_1.ValueClone.Clone(value); + if (!globalThis.Array.isArray(value)) + return create_1.ValueCreate.Create(schema, references); + if (schema.items === undefined) + return []; + return schema.items.map((schema, index) => Visit(schema, references, value[index])); + } + function Undefined(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Union(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : UnionCastCreate.Create(schema, references, value); + } + function Uint8Array(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Unknown(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Void(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function UserDefined(schema, references, value) { + return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references); + } + function Visit(schema, references, value) { + const references_ = IsString(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema[Types.Kind]) { + case 'Any': + return Any(schema_, references_, value); + case 'Array': + return Array(schema_, references_, value); + case 'BigInt': + return BigInt(schema_, references_, value); + case 'Boolean': + return Boolean(schema_, references_, value); + case 'Constructor': + return Constructor(schema_, references_, value); + case 'Date': + return Date(schema_, references_, value); + case 'Function': + return Function(schema_, references_, value); + case 'Integer': + return Integer(schema_, references_, value); + case 'Intersect': + return Intersect(schema_, references_, value); + case 'Literal': + return Literal(schema_, references_, value); + case 'Never': + return Never(schema_, references_, value); + case 'Not': + return Not(schema_, references_, value); + case 'Null': + return Null(schema_, references_, value); + case 'Number': + return Number(schema_, references_, value); + case 'Object': + return Object(schema_, references_, value); + case 'Promise': + return Promise(schema_, references_, value); + case 'Record': + return Record(schema_, references_, value); + case 'Ref': + return Ref(schema_, references_, value); + case 'String': + return String(schema_, references_, value); + case 'Symbol': + return Symbol(schema_, references_, value); + case 'TemplateLiteral': + return TemplateLiteral(schema_, references_, value); + case 'This': + return This(schema_, references_, value); + case 'Tuple': + return Tuple(schema_, references_, value); + case 'Undefined': + return Undefined(schema_, references_, value); + case 'Union': + return Union(schema_, references_, value); + case 'Uint8Array': + return Uint8Array(schema_, references_, value); + case 'Unknown': + return Unknown(schema_, references_, value); + case 'Void': + return Void(schema_, references_, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueCastUnknownTypeError(schema_); + return UserDefined(schema_, references_, value); + } + } + ValueCast.Visit = Visit; + function Cast(schema, references, value) { + return Visit(schema, references, clone_1.ValueClone.Clone(value)); + } + ValueCast.Cast = Cast; +})(ValueCast = exports.ValueCast || (exports.ValueCast = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/check.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/check.d.ts new file mode 100644 index 0000000..ee18d9b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/check.d.ts @@ -0,0 +1,12 @@ +import * as Types from '../typebox'; +export declare class ValueCheckUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCheckDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare namespace ValueCheck { + function Check(schema: T, references: Types.TSchema[], value: any): boolean; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/check.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/check.js new file mode 100644 index 0000000..833aa64 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/check.js @@ -0,0 +1,484 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueCheck = exports.ValueCheckDereferenceError = exports.ValueCheckUnknownTypeError = void 0; +const Types = require("../typebox"); +const index_1 = require("../system/index"); +const hash_1 = require("./hash"); +// ------------------------------------------------------------------------- +// Errors +// ------------------------------------------------------------------------- +class ValueCheckUnknownTypeError extends Error { + constructor(schema) { + super(`ValueCheck: ${schema[Types.Kind] ? `Unknown type '${schema[Types.Kind]}'` : 'Unknown type'}`); + this.schema = schema; + } +} +exports.ValueCheckUnknownTypeError = ValueCheckUnknownTypeError; +class ValueCheckDereferenceError extends Error { + constructor(schema) { + super(`ValueCheck: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueCheckDereferenceError = ValueCheckDereferenceError; +var ValueCheck; +(function (ValueCheck) { + // ---------------------------------------------------------------------- + // Guards + // ---------------------------------------------------------------------- + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsInteger(value) { + return globalThis.Number.isInteger(value); + } + function IsString(value) { + return typeof value === 'string'; + } + function IsDefined(value) { + return value !== undefined; + } + // ---------------------------------------------------------------------- + // Policies + // ---------------------------------------------------------------------- + function IsExactOptionalProperty(value, key) { + return index_1.TypeSystem.ExactOptionalPropertyTypes ? key in value : value[key] !== undefined; + } + function IsObject(value) { + const result = typeof value === 'object' && value !== null; + return index_1.TypeSystem.AllowArrayObjects ? result : result && !globalThis.Array.isArray(value); + } + function IsRecordObject(value) { + return IsObject(value) && !(value instanceof globalThis.Date) && !(value instanceof globalThis.Uint8Array); + } + function IsNumber(value) { + const result = typeof value === 'number'; + return index_1.TypeSystem.AllowNaN ? result : result && globalThis.Number.isFinite(value); + } + function IsVoid(value) { + const result = value === undefined; + return index_1.TypeSystem.AllowVoidNull ? result || value === null : result; + } + // ---------------------------------------------------------------------- + // Types + // ---------------------------------------------------------------------- + function Any(schema, references, value) { + return true; + } + function Array(schema, references, value) { + if (!globalThis.Array.isArray(value)) { + return false; + } + if (IsDefined(schema.minItems) && !(value.length >= schema.minItems)) { + return false; + } + if (IsDefined(schema.maxItems) && !(value.length <= schema.maxItems)) { + return false; + } + // prettier-ignore + if (schema.uniqueItems === true && !((function () { const set = new Set(); for (const element of value) { + const hashed = hash_1.ValueHash.Create(element); + if (set.has(hashed)) { + return false; + } + else { + set.add(hashed); + } + } return true; })())) { + return false; + } + return value.every((value) => Visit(schema.items, references, value)); + } + function BigInt(schema, references, value) { + if (!IsBigInt(value)) { + return false; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === globalThis.BigInt(0))) { + return false; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + return false; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + return false; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + return false; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + return false; + } + return true; + } + function Boolean(schema, references, value) { + return typeof value === 'boolean'; + } + function Constructor(schema, references, value) { + return Visit(schema.returns, references, value.prototype); + } + function Date(schema, references, value) { + if (!(value instanceof globalThis.Date)) { + return false; + } + if (!IsNumber(value.getTime())) { + return false; + } + if (IsDefined(schema.exclusiveMinimumTimestamp) && !(value.getTime() > schema.exclusiveMinimumTimestamp)) { + return false; + } + if (IsDefined(schema.exclusiveMaximumTimestamp) && !(value.getTime() < schema.exclusiveMaximumTimestamp)) { + return false; + } + if (IsDefined(schema.minimumTimestamp) && !(value.getTime() >= schema.minimumTimestamp)) { + return false; + } + if (IsDefined(schema.maximumTimestamp) && !(value.getTime() <= schema.maximumTimestamp)) { + return false; + } + return true; + } + function Function(schema, references, value) { + return typeof value === 'function'; + } + function Integer(schema, references, value) { + if (!IsInteger(value)) { + return false; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === 0)) { + return false; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + return false; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + return false; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + return false; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + return false; + } + return true; + } + function Intersect(schema, references, value) { + if (!schema.allOf.every((schema) => Visit(schema, references, value))) { + return false; + } + else if (schema.unevaluatedProperties === false) { + const schemaKeys = Types.KeyResolver.Resolve(schema); + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + return valueKeys.every((key) => schemaKeys.includes(key)); + } + else if (Types.TypeGuard.TSchema(schema.unevaluatedProperties)) { + const schemaKeys = Types.KeyResolver.Resolve(schema); + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + return valueKeys.every((key) => schemaKeys.includes(key) || Visit(schema.unevaluatedProperties, references, value[key])); + } + else { + return true; + } + } + function Literal(schema, references, value) { + return value === schema.const; + } + function Never(schema, references, value) { + return false; + } + function Not(schema, references, value) { + return !Visit(schema.allOf[0].not, references, value) && Visit(schema.allOf[1], references, value); + } + function Null(schema, references, value) { + return value === null; + } + function Number(schema, references, value) { + if (!IsNumber(value)) { + return false; + } + if (IsDefined(schema.multipleOf) && !(value % schema.multipleOf === 0)) { + return false; + } + if (IsDefined(schema.exclusiveMinimum) && !(value > schema.exclusiveMinimum)) { + return false; + } + if (IsDefined(schema.exclusiveMaximum) && !(value < schema.exclusiveMaximum)) { + return false; + } + if (IsDefined(schema.minimum) && !(value >= schema.minimum)) { + return false; + } + if (IsDefined(schema.maximum) && !(value <= schema.maximum)) { + return false; + } + return true; + } + function Object(schema, references, value) { + if (!IsObject(value)) { + return false; + } + if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) { + return false; + } + if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) { + return false; + } + const knownKeys = globalThis.Object.getOwnPropertyNames(schema.properties); + for (const knownKey of knownKeys) { + const property = schema.properties[knownKey]; + if (schema.required && schema.required.includes(knownKey)) { + if (!Visit(property, references, value[knownKey])) { + return false; + } + if (Types.ExtendsUndefined.Check(property)) { + return knownKey in value; + } + } + else { + if (IsExactOptionalProperty(value, knownKey) && !Visit(property, references, value[knownKey])) { + return false; + } + } + } + if (schema.additionalProperties === false) { + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + // optimization: value is valid if schemaKey length matches the valueKey length + if (schema.required && schema.required.length === knownKeys.length && valueKeys.length === knownKeys.length) { + return true; + } + else { + return valueKeys.every((valueKey) => knownKeys.includes(valueKey)); + } + } + else if (typeof schema.additionalProperties === 'object') { + const valueKeys = globalThis.Object.getOwnPropertyNames(value); + return valueKeys.every((key) => knownKeys.includes(key) || Visit(schema.additionalProperties, references, value[key])); + } + else { + return true; + } + } + function Promise(schema, references, value) { + return typeof value === 'object' && typeof value.then === 'function'; + } + function Record(schema, references, value) { + if (!IsRecordObject(value)) { + return false; + } + if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) { + return false; + } + if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) { + return false; + } + const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0]; + const regex = new RegExp(keyPattern); + if (!globalThis.Object.getOwnPropertyNames(value).every((key) => regex.test(key))) { + return false; + } + for (const propValue of globalThis.Object.values(value)) { + if (!Visit(valueSchema, references, propValue)) + return false; + } + return true; + } + function Ref(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueCheckDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function String(schema, references, value) { + if (!IsString(value)) { + return false; + } + if (IsDefined(schema.minLength)) { + if (!(value.length >= schema.minLength)) + return false; + } + if (IsDefined(schema.maxLength)) { + if (!(value.length <= schema.maxLength)) + return false; + } + if (IsDefined(schema.pattern)) { + const regex = new RegExp(schema.pattern); + if (!regex.test(value)) + return false; + } + if (IsDefined(schema.format)) { + if (!Types.FormatRegistry.Has(schema.format)) + return false; + const func = Types.FormatRegistry.Get(schema.format); + return func(value); + } + return true; + } + function Symbol(schema, references, value) { + if (!(typeof value === 'symbol')) { + return false; + } + return true; + } + function TemplateLiteral(schema, references, value) { + if (!IsString(value)) { + return false; + } + return new RegExp(schema.pattern).test(value); + } + function This(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueCheckDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function Tuple(schema, references, value) { + if (!globalThis.Array.isArray(value)) { + return false; + } + if (schema.items === undefined && !(value.length === 0)) { + return false; + } + if (!(value.length === schema.maxItems)) { + return false; + } + if (!schema.items) { + return true; + } + for (let i = 0; i < schema.items.length; i++) { + if (!Visit(schema.items[i], references, value[i])) + return false; + } + return true; + } + function Undefined(schema, references, value) { + return value === undefined; + } + function Union(schema, references, value) { + return schema.anyOf.some((inner) => Visit(inner, references, value)); + } + function Uint8Array(schema, references, value) { + if (!(value instanceof globalThis.Uint8Array)) { + return false; + } + if (IsDefined(schema.maxByteLength) && !(value.length <= schema.maxByteLength)) { + return false; + } + if (IsDefined(schema.minByteLength) && !(value.length >= schema.minByteLength)) { + return false; + } + return true; + } + function Unknown(schema, references, value) { + return true; + } + function Void(schema, references, value) { + return IsVoid(value); + } + function UserDefined(schema, references, value) { + if (!Types.TypeRegistry.Has(schema[Types.Kind])) + return false; + const func = Types.TypeRegistry.Get(schema[Types.Kind]); + return func(schema, value); + } + function Visit(schema, references, value) { + const references_ = IsDefined(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema_[Types.Kind]) { + case 'Any': + return Any(schema_, references_, value); + case 'Array': + return Array(schema_, references_, value); + case 'BigInt': + return BigInt(schema_, references_, value); + case 'Boolean': + return Boolean(schema_, references_, value); + case 'Constructor': + return Constructor(schema_, references_, value); + case 'Date': + return Date(schema_, references_, value); + case 'Function': + return Function(schema_, references_, value); + case 'Integer': + return Integer(schema_, references_, value); + case 'Intersect': + return Intersect(schema_, references_, value); + case 'Literal': + return Literal(schema_, references_, value); + case 'Never': + return Never(schema_, references_, value); + case 'Not': + return Not(schema_, references_, value); + case 'Null': + return Null(schema_, references_, value); + case 'Number': + return Number(schema_, references_, value); + case 'Object': + return Object(schema_, references_, value); + case 'Promise': + return Promise(schema_, references_, value); + case 'Record': + return Record(schema_, references_, value); + case 'Ref': + return Ref(schema_, references_, value); + case 'String': + return String(schema_, references_, value); + case 'Symbol': + return Symbol(schema_, references_, value); + case 'TemplateLiteral': + return TemplateLiteral(schema_, references_, value); + case 'This': + return This(schema_, references_, value); + case 'Tuple': + return Tuple(schema_, references_, value); + case 'Undefined': + return Undefined(schema_, references_, value); + case 'Union': + return Union(schema_, references_, value); + case 'Uint8Array': + return Uint8Array(schema_, references_, value); + case 'Unknown': + return Unknown(schema_, references_, value); + case 'Void': + return Void(schema_, references_, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueCheckUnknownTypeError(schema_); + return UserDefined(schema_, references_, value); + } + } + // ------------------------------------------------------------------------- + // Check + // ------------------------------------------------------------------------- + function Check(schema, references, value) { + return Visit(schema, references, value); + } + ValueCheck.Check = Check; +})(ValueCheck = exports.ValueCheck || (exports.ValueCheck = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/clone.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/clone.d.ts new file mode 100644 index 0000000..5ca0adf --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/clone.d.ts @@ -0,0 +1,3 @@ +export declare namespace ValueClone { + function Clone(value: T): T; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/clone.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/clone.js new file mode 100644 index 0000000..75e2685 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/clone.js @@ -0,0 +1,71 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueClone = void 0; +const is_1 = require("./is"); +var ValueClone; +(function (ValueClone) { + function Array(value) { + return value.map((element) => Clone(element)); + } + function Date(value) { + return new globalThis.Date(value.toISOString()); + } + function Object(value) { + const keys = [...globalThis.Object.keys(value), ...globalThis.Object.getOwnPropertySymbols(value)]; + return keys.reduce((acc, key) => ({ ...acc, [key]: Clone(value[key]) }), {}); + } + function TypedArray(value) { + return value.slice(); + } + function Value(value) { + return value; + } + function Clone(value) { + if (is_1.Is.Date(value)) { + return Date(value); + } + else if (is_1.Is.Object(value)) { + return Object(value); + } + else if (is_1.Is.Array(value)) { + return Array(value); + } + else if (is_1.Is.TypedArray(value)) { + return TypedArray(value); + } + else if (is_1.Is.Value(value)) { + return Value(value); + } + else { + throw new Error('ValueClone: Unable to clone value'); + } + } + ValueClone.Clone = Clone; +})(ValueClone = exports.ValueClone || (exports.ValueClone = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/convert.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/convert.d.ts new file mode 100644 index 0000000..99c5d5d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/convert.d.ts @@ -0,0 +1,13 @@ +import * as Types from '../typebox'; +export declare class ValueConvertUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueConvertDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare namespace ValueConvert { + function Visit(schema: Types.TSchema, references: Types.TSchema[], value: any): unknown; + function Convert(schema: T, references: Types.TSchema[], value: any): unknown; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/convert.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/convert.js new file mode 100644 index 0000000..c6a608d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/convert.js @@ -0,0 +1,372 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueConvert = exports.ValueConvertDereferenceError = exports.ValueConvertUnknownTypeError = void 0; +const Types = require("../typebox"); +const clone_1 = require("./clone"); +const check_1 = require("./check"); +// ---------------------------------------------------------------------------------------------- +// Errors +// ---------------------------------------------------------------------------------------------- +class ValueConvertUnknownTypeError extends Error { + constructor(schema) { + super('ValueConvert: Unknown type'); + this.schema = schema; + } +} +exports.ValueConvertUnknownTypeError = ValueConvertUnknownTypeError; +class ValueConvertDereferenceError extends Error { + constructor(schema) { + super(`ValueConvert: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueConvertDereferenceError = ValueConvertDereferenceError; +var ValueConvert; +(function (ValueConvert) { + // ---------------------------------------------------------------------------------------------- + // Guards + // ---------------------------------------------------------------------------------------------- + function IsObject(value) { + return typeof value === 'object' && value !== null && !globalThis.Array.isArray(value); + } + function IsArray(value) { + return typeof value === 'object' && globalThis.Array.isArray(value); + } + function IsDate(value) { + return typeof value === 'object' && value instanceof globalThis.Date; + } + function IsSymbol(value) { + return typeof value === 'symbol'; + } + function IsString(value) { + return typeof value === 'string'; + } + function IsBoolean(value) { + return typeof value === 'boolean'; + } + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsNumber(value) { + return typeof value === 'number' && !isNaN(value); + } + function IsStringNumeric(value) { + return IsString(value) && !isNaN(value) && !isNaN(parseFloat(value)); + } + function IsValueToString(value) { + return IsBigInt(value) || IsBoolean(value) || IsNumber(value); + } + function IsValueTrue(value) { + return value === true || (IsNumber(value) && value === 1) || (IsBigInt(value) && value === globalThis.BigInt('1')) || (IsString(value) && (value.toLowerCase() === 'true' || value === '1')); + } + function IsValueFalse(value) { + return value === false || (IsNumber(value) && value === 0) || (IsBigInt(value) && value === globalThis.BigInt('0')) || (IsString(value) && (value.toLowerCase() === 'false' || value === '0')); + } + function IsTimeStringWithTimeZone(value) { + return IsString(value) && /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i.test(value); + } + function IsTimeStringWithoutTimeZone(value) { + return IsString(value) && /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)?$/i.test(value); + } + function IsDateTimeStringWithTimeZone(value) { + return IsString(value) && /^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i.test(value); + } + function IsDateTimeStringWithoutTimeZone(value) { + return IsString(value) && /^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)?$/i.test(value); + } + function IsDateString(value) { + return IsString(value) && /^\d\d\d\d-[0-1]\d-[0-3]\d$/i.test(value); + } + // ---------------------------------------------------------------------------------------------- + // Convert + // ---------------------------------------------------------------------------------------------- + function TryConvertLiteralString(value, target) { + const conversion = TryConvertString(value); + return conversion === target ? conversion : value; + } + function TryConvertLiteralNumber(value, target) { + const conversion = TryConvertNumber(value); + return conversion === target ? conversion : value; + } + function TryConvertLiteralBoolean(value, target) { + const conversion = TryConvertBoolean(value); + return conversion === target ? conversion : value; + } + function TryConvertLiteral(schema, value) { + if (typeof schema.const === 'string') { + return TryConvertLiteralString(value, schema.const); + } + else if (typeof schema.const === 'number') { + return TryConvertLiteralNumber(value, schema.const); + } + else if (typeof schema.const === 'boolean') { + return TryConvertLiteralBoolean(value, schema.const); + } + else { + return clone_1.ValueClone.Clone(value); + } + } + function TryConvertBoolean(value) { + return IsValueTrue(value) ? true : IsValueFalse(value) ? false : value; + } + function TryConvertBigInt(value) { + return IsStringNumeric(value) ? globalThis.BigInt(parseInt(value)) : IsNumber(value) ? globalThis.BigInt(value | 0) : IsValueFalse(value) ? 0 : IsValueTrue(value) ? 1 : value; + } + function TryConvertString(value) { + return IsValueToString(value) ? value.toString() : value; + } + function TryConvertNumber(value) { + return IsStringNumeric(value) ? parseFloat(value) : IsValueTrue(value) ? 1 : IsValueFalse(value) ? 0 : value; + } + function TryConvertInteger(value) { + return IsStringNumeric(value) ? parseInt(value) : IsNumber(value) ? value | 0 : IsValueTrue(value) ? 1 : IsValueFalse(value) ? 0 : value; + } + function TryConvertNull(value) { + return IsString(value) && value.toLowerCase() === 'null' ? null : value; + } + function TryConvertUndefined(value) { + return IsString(value) && value === 'undefined' ? undefined : value; + } + function TryConvertDate(value) { + // note: this function may return an invalid dates for the regex tests + // above. Invalid dates will however be checked during the casting + // function and will return a epoch date if invalid. Consider better + // string parsing for the iso dates in future revisions. + return IsDate(value) + ? value + : IsNumber(value) + ? new globalThis.Date(value) + : IsValueTrue(value) + ? new globalThis.Date(1) + : IsValueFalse(value) + ? new globalThis.Date(0) + : IsStringNumeric(value) + ? new globalThis.Date(parseInt(value)) + : IsTimeStringWithoutTimeZone(value) + ? new globalThis.Date(`1970-01-01T${value}.000Z`) + : IsTimeStringWithTimeZone(value) + ? new globalThis.Date(`1970-01-01T${value}`) + : IsDateTimeStringWithoutTimeZone(value) + ? new globalThis.Date(`${value}.000Z`) + : IsDateTimeStringWithTimeZone(value) + ? new globalThis.Date(value) + : IsDateString(value) + ? new globalThis.Date(`${value}T00:00:00.000Z`) + : value; + } + // ---------------------------------------------------------------------------------------------- + // Cast + // ---------------------------------------------------------------------------------------------- + function Any(schema, references, value) { + return value; + } + function Array(schema, references, value) { + if (IsArray(value)) { + return value.map((value) => Visit(schema.items, references, value)); + } + return value; + } + function BigInt(schema, references, value) { + return TryConvertBigInt(value); + } + function Boolean(schema, references, value) { + return TryConvertBoolean(value); + } + function Constructor(schema, references, value) { + return clone_1.ValueClone.Clone(value); + } + function Date(schema, references, value) { + return TryConvertDate(value); + } + function Function(schema, references, value) { + return value; + } + function Integer(schema, references, value) { + return TryConvertInteger(value); + } + function Intersect(schema, references, value) { + return value; + } + function Literal(schema, references, value) { + return TryConvertLiteral(schema, value); + } + function Never(schema, references, value) { + return value; + } + function Null(schema, references, value) { + return TryConvertNull(value); + } + function Number(schema, references, value) { + return TryConvertNumber(value); + } + function Object(schema, references, value) { + if (IsObject(value)) + return globalThis.Object.keys(schema.properties).reduce((acc, key) => { + return value[key] !== undefined ? { ...acc, [key]: Visit(schema.properties[key], references, value[key]) } : { ...acc }; + }, value); + return value; + } + function Promise(schema, references, value) { + return value; + } + function Record(schema, references, value) { + const propertyKey = globalThis.Object.getOwnPropertyNames(schema.patternProperties)[0]; + const property = schema.patternProperties[propertyKey]; + const result = {}; + for (const [propKey, propValue] of globalThis.Object.entries(value)) { + result[propKey] = Visit(property, references, propValue); + } + return result; + } + function Ref(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueConvertDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function String(schema, references, value) { + return TryConvertString(value); + } + function Symbol(schema, references, value) { + return value; + } + function TemplateLiteral(schema, references, value) { + return value; + } + function This(schema, references, value) { + const index = references.findIndex((foreign) => foreign.$id === schema.$ref); + if (index === -1) + throw new ValueConvertDereferenceError(schema); + const target = references[index]; + return Visit(target, references, value); + } + function Tuple(schema, references, value) { + if (IsArray(value) && schema.items !== undefined) { + return value.map((value, index) => { + return index < schema.items.length ? Visit(schema.items[index], references, value) : value; + }); + } + return value; + } + function Undefined(schema, references, value) { + return TryConvertUndefined(value); + } + function Union(schema, references, value) { + for (const subschema of schema.anyOf) { + const converted = Visit(subschema, references, value); + if (check_1.ValueCheck.Check(subschema, references, converted)) { + return converted; + } + } + return value; + } + function Uint8Array(schema, references, value) { + return value; + } + function Unknown(schema, references, value) { + return value; + } + function Void(schema, references, value) { + return value; + } + function UserDefined(schema, references, value) { + return value; + } + function Visit(schema, references, value) { + const references_ = IsString(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema[Types.Kind]) { + case 'Any': + return Any(schema_, references_, value); + case 'Array': + return Array(schema_, references_, value); + case 'BigInt': + return BigInt(schema_, references_, value); + case 'Boolean': + return Boolean(schema_, references_, value); + case 'Constructor': + return Constructor(schema_, references_, value); + case 'Date': + return Date(schema_, references_, value); + case 'Function': + return Function(schema_, references_, value); + case 'Integer': + return Integer(schema_, references_, value); + case 'Intersect': + return Intersect(schema_, references_, value); + case 'Literal': + return Literal(schema_, references_, value); + case 'Never': + return Never(schema_, references_, value); + case 'Null': + return Null(schema_, references_, value); + case 'Number': + return Number(schema_, references_, value); + case 'Object': + return Object(schema_, references_, value); + case 'Promise': + return Promise(schema_, references_, value); + case 'Record': + return Record(schema_, references_, value); + case 'Ref': + return Ref(schema_, references_, value); + case 'String': + return String(schema_, references_, value); + case 'Symbol': + return Symbol(schema_, references_, value); + case 'TemplateLiteral': + return TemplateLiteral(schema_, references_, value); + case 'This': + return This(schema_, references_, value); + case 'Tuple': + return Tuple(schema_, references_, value); + case 'Undefined': + return Undefined(schema_, references_, value); + case 'Union': + return Union(schema_, references_, value); + case 'Uint8Array': + return Uint8Array(schema_, references_, value); + case 'Unknown': + return Unknown(schema_, references_, value); + case 'Void': + return Void(schema_, references_, value); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueConvertUnknownTypeError(schema_); + return UserDefined(schema_, references_, value); + } + } + ValueConvert.Visit = Visit; + function Convert(schema, references, value) { + return Visit(schema, references, clone_1.ValueClone.Clone(value)); + } + ValueConvert.Convert = Convert; +})(ValueConvert = exports.ValueConvert || (exports.ValueConvert = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/create.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/create.d.ts new file mode 100644 index 0000000..86e1e5e --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/create.d.ts @@ -0,0 +1,26 @@ +import * as Types from '../typebox'; +export declare class ValueCreateUnknownTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCreateNeverTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCreateIntersectTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCreateTempateLiteralTypeError extends Error { + readonly schema: Types.TSchema; + constructor(schema: Types.TSchema); +} +export declare class ValueCreateDereferenceError extends Error { + readonly schema: Types.TRef | Types.TThis; + constructor(schema: Types.TRef | Types.TThis); +} +export declare namespace ValueCreate { + /** Creates a value from the given schema. If the schema specifies a default value, then that value is returned. */ + function Visit(schema: Types.TSchema, references: Types.TSchema[]): unknown; + function Create(schema: T, references: Types.TSchema[]): Types.Static; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/create.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/create.js new file mode 100644 index 0000000..42374a8 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/create.js @@ -0,0 +1,480 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueCreate = exports.ValueCreateDereferenceError = exports.ValueCreateTempateLiteralTypeError = exports.ValueCreateIntersectTypeError = exports.ValueCreateNeverTypeError = exports.ValueCreateUnknownTypeError = void 0; +const Types = require("../typebox"); +const check_1 = require("./check"); +// -------------------------------------------------------------------------- +// Errors +// -------------------------------------------------------------------------- +class ValueCreateUnknownTypeError extends Error { + constructor(schema) { + super('ValueCreate: Unknown type'); + this.schema = schema; + } +} +exports.ValueCreateUnknownTypeError = ValueCreateUnknownTypeError; +class ValueCreateNeverTypeError extends Error { + constructor(schema) { + super('ValueCreate: Never types cannot be created'); + this.schema = schema; + } +} +exports.ValueCreateNeverTypeError = ValueCreateNeverTypeError; +class ValueCreateIntersectTypeError extends Error { + constructor(schema) { + super('ValueCreate: Intersect produced invalid value. Consider using a default value.'); + this.schema = schema; + } +} +exports.ValueCreateIntersectTypeError = ValueCreateIntersectTypeError; +class ValueCreateTempateLiteralTypeError extends Error { + constructor(schema) { + super('ValueCreate: Can only create template literal values from patterns that produce finite sequences. Consider using a default value.'); + this.schema = schema; + } +} +exports.ValueCreateTempateLiteralTypeError = ValueCreateTempateLiteralTypeError; +class ValueCreateDereferenceError extends Error { + constructor(schema) { + super(`ValueCreate: Unable to dereference schema with $id '${schema.$ref}'`); + this.schema = schema; + } +} +exports.ValueCreateDereferenceError = ValueCreateDereferenceError; +// -------------------------------------------------------------------------- +// ValueCreate +// -------------------------------------------------------------------------- +var ValueCreate; +(function (ValueCreate) { + // -------------------------------------------------------- + // Guards + // -------------------------------------------------------- + function IsString(value) { + return typeof value === 'string'; + } + // -------------------------------------------------------- + // Types + // -------------------------------------------------------- + function Any(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return {}; + } + } + function Array(schema, references) { + if (schema.uniqueItems === true && schema.default === undefined) { + throw new Error('ValueCreate.Array: Arrays with uniqueItems require a default value'); + } + else if ('default' in schema) { + return schema.default; + } + else if (schema.minItems !== undefined) { + return globalThis.Array.from({ length: schema.minItems }).map((item) => { + return ValueCreate.Create(schema.items, references); + }); + } + else { + return []; + } + } + function BigInt(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return globalThis.BigInt(0); + } + } + function Boolean(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return false; + } + } + function Constructor(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + const value = ValueCreate.Create(schema.returns, references); + if (typeof value === 'object' && !globalThis.Array.isArray(value)) { + return class { + constructor() { + for (const [key, val] of globalThis.Object.entries(value)) { + const self = this; + self[key] = val; + } + } + }; + } + else { + return class { + }; + } + } + } + function Date(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.minimumTimestamp !== undefined) { + return new globalThis.Date(schema.minimumTimestamp); + } + else { + return new globalThis.Date(0); + } + } + function Function(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return () => ValueCreate.Create(schema.returns, references); + } + } + function Integer(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.minimum !== undefined) { + return schema.minimum; + } + else { + return 0; + } + } + function Intersect(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + // Note: The best we can do here is attempt to instance each sub type and apply through object assign. For non-object + // sub types, we just escape the assignment and just return the value. In the latter case, this is typically going to + // be a consequence of an illogical intersection. + const value = schema.allOf.reduce((acc, schema) => { + const next = Visit(schema, references); + return typeof next === 'object' ? { ...acc, ...next } : next; + }, {}); + if (!check_1.ValueCheck.Check(schema, references, value)) + throw new ValueCreateIntersectTypeError(schema); + return value; + } + } + function Literal(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return schema.const; + } + } + function Never(schema, references) { + throw new ValueCreateNeverTypeError(schema); + } + function Not(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return Visit(schema.allOf[1], references); + } + } + function Null(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return null; + } + } + function Number(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.minimum !== undefined) { + return schema.minimum; + } + else { + return 0; + } + } + function Object(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + const required = new Set(schema.required); + return (schema.default || + globalThis.Object.entries(schema.properties).reduce((acc, [key, schema]) => { + return required.has(key) ? { ...acc, [key]: ValueCreate.Create(schema, references) } : { ...acc }; + }, {})); + } + } + function Promise(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return globalThis.Promise.resolve(ValueCreate.Create(schema.item, references)); + } + } + function Record(schema, references) { + const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0]; + if ('default' in schema) { + return schema.default; + } + else if (!(keyPattern === Types.PatternStringExact || keyPattern === Types.PatternNumberExact)) { + const propertyKeys = keyPattern.slice(1, keyPattern.length - 1).split('|'); + return propertyKeys.reduce((acc, key) => { + return { ...acc, [key]: Create(valueSchema, references) }; + }, {}); + } + else { + return {}; + } + } + function Ref(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + const index = references.findIndex((foreign) => foreign.$id === schema.$id); + if (index === -1) + throw new ValueCreateDereferenceError(schema); + const target = references[index]; + return Visit(target, references); + } + } + function String(schema, references) { + if (schema.pattern !== undefined) { + if (!('default' in schema)) { + throw new Error('ValueCreate.String: String types with patterns must specify a default value'); + } + else { + return schema.default; + } + } + else if (schema.format !== undefined) { + if (!('default' in schema)) { + throw new Error('ValueCreate.String: String types with formats must specify a default value'); + } + else { + return schema.default; + } + } + else { + if ('default' in schema) { + return schema.default; + } + else if (schema.minLength !== undefined) { + return globalThis.Array.from({ length: schema.minLength }) + .map(() => '.') + .join(''); + } + else { + return ''; + } + } + } + function Symbol(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if ('value' in schema) { + return globalThis.Symbol.for(schema.value); + } + else { + return globalThis.Symbol(); + } + } + function TemplateLiteral(schema, references) { + if ('default' in schema) { + return schema.default; + } + const expression = Types.TemplateLiteralParser.ParseExact(schema.pattern); + if (!Types.TemplateLiteralFinite.Check(expression)) + throw new ValueCreateTempateLiteralTypeError(schema); + const sequence = Types.TemplateLiteralGenerator.Generate(expression); + return sequence.next().value; + } + function This(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + const index = references.findIndex((foreign) => foreign.$id === schema.$id); + if (index === -1) + throw new ValueCreateDereferenceError(schema); + const target = references[index]; + return Visit(target, references); + } + } + function Tuple(schema, references) { + if ('default' in schema) { + return schema.default; + } + if (schema.items === undefined) { + return []; + } + else { + return globalThis.Array.from({ length: schema.minItems }).map((_, index) => ValueCreate.Create(schema.items[index], references)); + } + } + function Undefined(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return undefined; + } + } + function Union(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.anyOf.length === 0) { + throw new Error('ValueCreate.Union: Cannot create Union with zero variants'); + } + else { + return ValueCreate.Create(schema.anyOf[0], references); + } + } + function Uint8Array(schema, references) { + if ('default' in schema) { + return schema.default; + } + else if (schema.minByteLength !== undefined) { + return new globalThis.Uint8Array(schema.minByteLength); + } + else { + return new globalThis.Uint8Array(0); + } + } + function Unknown(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return {}; + } + } + function Void(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + return void 0; + } + } + function UserDefined(schema, references) { + if ('default' in schema) { + return schema.default; + } + else { + throw new Error('ValueCreate.UserDefined: User defined types must specify a default value'); + } + } + /** Creates a value from the given schema. If the schema specifies a default value, then that value is returned. */ + function Visit(schema, references) { + const references_ = IsString(schema.$id) ? [...references, schema] : references; + const schema_ = schema; + switch (schema_[Types.Kind]) { + case 'Any': + return Any(schema_, references_); + case 'Array': + return Array(schema_, references_); + case 'BigInt': + return BigInt(schema_, references_); + case 'Boolean': + return Boolean(schema_, references_); + case 'Constructor': + return Constructor(schema_, references_); + case 'Date': + return Date(schema_, references_); + case 'Function': + return Function(schema_, references_); + case 'Integer': + return Integer(schema_, references_); + case 'Intersect': + return Intersect(schema_, references_); + case 'Literal': + return Literal(schema_, references_); + case 'Never': + return Never(schema_, references_); + case 'Not': + return Not(schema_, references_); + case 'Null': + return Null(schema_, references_); + case 'Number': + return Number(schema_, references_); + case 'Object': + return Object(schema_, references_); + case 'Promise': + return Promise(schema_, references_); + case 'Record': + return Record(schema_, references_); + case 'Ref': + return Ref(schema_, references_); + case 'String': + return String(schema_, references_); + case 'Symbol': + return Symbol(schema_, references_); + case 'TemplateLiteral': + return TemplateLiteral(schema_, references_); + case 'This': + return This(schema_, references_); + case 'Tuple': + return Tuple(schema_, references_); + case 'Undefined': + return Undefined(schema_, references_); + case 'Union': + return Union(schema_, references_); + case 'Uint8Array': + return Uint8Array(schema_, references_); + case 'Unknown': + return Unknown(schema_, references_); + case 'Void': + return Void(schema_, references_); + default: + if (!Types.TypeRegistry.Has(schema_[Types.Kind])) + throw new ValueCreateUnknownTypeError(schema_); + return UserDefined(schema_, references_); + } + } + ValueCreate.Visit = Visit; + function Create(schema, references) { + return Visit(schema, references); + } + ValueCreate.Create = Create; +})(ValueCreate = exports.ValueCreate || (exports.ValueCreate = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/delta.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/delta.d.ts new file mode 100644 index 0000000..3320fac --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/delta.d.ts @@ -0,0 +1,43 @@ +import { Static } from '../typebox'; +export type Insert = Static; +export declare const Insert: import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"insert">; + path: import("../typebox").TString; + value: import("../typebox").TUnknown; +}>; +export type Update = Static; +export declare const Update: import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"update">; + path: import("../typebox").TString; + value: import("../typebox").TUnknown; +}>; +export type Delete = Static; +export declare const Delete: import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"delete">; + path: import("../typebox").TString; +}>; +export type Edit = Static; +export declare const Edit: import("../typebox").TUnion<[import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"insert">; + path: import("../typebox").TString; + value: import("../typebox").TUnknown; +}>, import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"update">; + path: import("../typebox").TString; + value: import("../typebox").TUnknown; +}>, import("../typebox").TObject<{ + type: import("../typebox").TLiteral<"delete">; + path: import("../typebox").TString; +}>]>; +export declare class ValueDeltaObjectWithSymbolKeyError extends Error { + readonly key: unknown; + constructor(key: unknown); +} +export declare class ValueDeltaUnableToDiffUnknownValue extends Error { + readonly value: unknown; + constructor(value: unknown); +} +export declare namespace ValueDelta { + function Diff(current: unknown, next: unknown): Edit[]; + function Patch(current: unknown, edits: Edit[]): T; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/delta.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/delta.js new file mode 100644 index 0000000..89c06a0 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/delta.js @@ -0,0 +1,204 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueDelta = exports.ValueDeltaUnableToDiffUnknownValue = exports.ValueDeltaObjectWithSymbolKeyError = exports.Edit = exports.Delete = exports.Update = exports.Insert = void 0; +const typebox_1 = require("../typebox"); +const is_1 = require("./is"); +const clone_1 = require("./clone"); +const pointer_1 = require("./pointer"); +exports.Insert = typebox_1.Type.Object({ + type: typebox_1.Type.Literal('insert'), + path: typebox_1.Type.String(), + value: typebox_1.Type.Unknown(), +}); +exports.Update = typebox_1.Type.Object({ + type: typebox_1.Type.Literal('update'), + path: typebox_1.Type.String(), + value: typebox_1.Type.Unknown(), +}); +exports.Delete = typebox_1.Type.Object({ + type: typebox_1.Type.Literal('delete'), + path: typebox_1.Type.String(), +}); +exports.Edit = typebox_1.Type.Union([exports.Insert, exports.Update, exports.Delete]); +// --------------------------------------------------------------------- +// Errors +// --------------------------------------------------------------------- +class ValueDeltaObjectWithSymbolKeyError extends Error { + constructor(key) { + super('ValueDelta: Cannot diff objects with symbol keys'); + this.key = key; + } +} +exports.ValueDeltaObjectWithSymbolKeyError = ValueDeltaObjectWithSymbolKeyError; +class ValueDeltaUnableToDiffUnknownValue extends Error { + constructor(value) { + super('ValueDelta: Unable to create diff edits for unknown value'); + this.value = value; + } +} +exports.ValueDeltaUnableToDiffUnknownValue = ValueDeltaUnableToDiffUnknownValue; +// --------------------------------------------------------------------- +// ValueDelta +// --------------------------------------------------------------------- +var ValueDelta; +(function (ValueDelta) { + // --------------------------------------------------------------------- + // Edits + // --------------------------------------------------------------------- + function Update(path, value) { + return { type: 'update', path, value }; + } + function Insert(path, value) { + return { type: 'insert', path, value }; + } + function Delete(path) { + return { type: 'delete', path }; + } + // --------------------------------------------------------------------- + // Diff + // --------------------------------------------------------------------- + function* Object(path, current, next) { + if (!is_1.Is.Object(next)) + return yield Update(path, next); + const currentKeys = [...globalThis.Object.keys(current), ...globalThis.Object.getOwnPropertySymbols(current)]; + const nextKeys = [...globalThis.Object.keys(next), ...globalThis.Object.getOwnPropertySymbols(next)]; + for (const key of currentKeys) { + if (typeof key === 'symbol') + throw new ValueDeltaObjectWithSymbolKeyError(key); + if (next[key] === undefined && nextKeys.includes(key)) + yield Update(`${path}/${String(key)}`, undefined); + } + for (const key of nextKeys) { + if (current[key] === undefined || next[key] === undefined) + continue; + if (typeof key === 'symbol') + throw new ValueDeltaObjectWithSymbolKeyError(key); + yield* Visit(`${path}/${String(key)}`, current[key], next[key]); + } + for (const key of nextKeys) { + if (typeof key === 'symbol') + throw new ValueDeltaObjectWithSymbolKeyError(key); + if (current[key] === undefined) + yield Insert(`${path}/${String(key)}`, next[key]); + } + for (const key of currentKeys.reverse()) { + if (typeof key === 'symbol') + throw new ValueDeltaObjectWithSymbolKeyError(key); + if (next[key] === undefined && !nextKeys.includes(key)) + yield Delete(`${path}/${String(key)}`); + } + } + function* Array(path, current, next) { + if (!is_1.Is.Array(next)) + return yield Update(path, next); + for (let i = 0; i < Math.min(current.length, next.length); i++) { + yield* Visit(`${path}/${i}`, current[i], next[i]); + } + for (let i = 0; i < next.length; i++) { + if (i < current.length) + continue; + yield Insert(`${path}/${i}`, next[i]); + } + for (let i = current.length - 1; i >= 0; i--) { + if (i < next.length) + continue; + yield Delete(`${path}/${i}`); + } + } + function* TypedArray(path, current, next) { + if (!is_1.Is.TypedArray(next) || current.length !== next.length || globalThis.Object.getPrototypeOf(current).constructor.name !== globalThis.Object.getPrototypeOf(next).constructor.name) + return yield Update(path, next); + for (let i = 0; i < Math.min(current.length, next.length); i++) { + yield* Visit(`${path}/${i}`, current[i], next[i]); + } + } + function* Value(path, current, next) { + if (current === next) + return; + yield Update(path, next); + } + function* Visit(path, current, next) { + if (is_1.Is.Object(current)) { + return yield* Object(path, current, next); + } + else if (is_1.Is.Array(current)) { + return yield* Array(path, current, next); + } + else if (is_1.Is.TypedArray(current)) { + return yield* TypedArray(path, current, next); + } + else if (is_1.Is.Value(current)) { + return yield* Value(path, current, next); + } + else { + throw new ValueDeltaUnableToDiffUnknownValue(current); + } + } + function Diff(current, next) { + return [...Visit('', current, next)]; + } + ValueDelta.Diff = Diff; + // --------------------------------------------------------------------- + // Patch + // --------------------------------------------------------------------- + function IsRootUpdate(edits) { + return edits.length > 0 && edits[0].path === '' && edits[0].type === 'update'; + } + function IsIdentity(edits) { + return edits.length === 0; + } + function Patch(current, edits) { + if (IsRootUpdate(edits)) { + return clone_1.ValueClone.Clone(edits[0].value); + } + if (IsIdentity(edits)) { + return clone_1.ValueClone.Clone(current); + } + const clone = clone_1.ValueClone.Clone(current); + for (const edit of edits) { + switch (edit.type) { + case 'insert': { + pointer_1.ValuePointer.Set(clone, edit.path, edit.value); + break; + } + case 'update': { + pointer_1.ValuePointer.Set(clone, edit.path, edit.value); + break; + } + case 'delete': { + pointer_1.ValuePointer.Delete(clone, edit.path); + break; + } + } + } + return clone; + } + ValueDelta.Patch = Patch; +})(ValueDelta = exports.ValueDelta || (exports.ValueDelta = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/equal.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/equal.d.ts new file mode 100644 index 0000000..785c2b8 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/equal.d.ts @@ -0,0 +1,3 @@ +export declare namespace ValueEqual { + function Equal(left: T, right: unknown): right is T; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/equal.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/equal.js new file mode 100644 index 0000000..ed9773b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/equal.js @@ -0,0 +1,80 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueEqual = void 0; +const is_1 = require("./is"); +var ValueEqual; +(function (ValueEqual) { + function Object(left, right) { + if (!is_1.Is.Object(right)) + return false; + const leftKeys = [...globalThis.Object.keys(left), ...globalThis.Object.getOwnPropertySymbols(left)]; + const rightKeys = [...globalThis.Object.keys(right), ...globalThis.Object.getOwnPropertySymbols(right)]; + if (leftKeys.length !== rightKeys.length) + return false; + return leftKeys.every((key) => Equal(left[key], right[key])); + } + function Date(left, right) { + return is_1.Is.Date(right) && left.getTime() === right.getTime(); + } + function Array(left, right) { + if (!is_1.Is.Array(right) || left.length !== right.length) + return false; + return left.every((value, index) => Equal(value, right[index])); + } + function TypedArray(left, right) { + if (!is_1.Is.TypedArray(right) || left.length !== right.length || globalThis.Object.getPrototypeOf(left).constructor.name !== globalThis.Object.getPrototypeOf(right).constructor.name) + return false; + return left.every((value, index) => Equal(value, right[index])); + } + function Value(left, right) { + return left === right; + } + function Equal(left, right) { + if (is_1.Is.Object(left)) { + return Object(left, right); + } + else if (is_1.Is.Date(left)) { + return Date(left, right); + } + else if (is_1.Is.TypedArray(left)) { + return TypedArray(left, right); + } + else if (is_1.Is.Array(left)) { + return Array(left, right); + } + else if (is_1.Is.Value(left)) { + return Value(left, right); + } + else { + throw new Error('ValueEquals: Unable to compare value'); + } + } + ValueEqual.Equal = Equal; +})(ValueEqual = exports.ValueEqual || (exports.ValueEqual = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/hash.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/hash.d.ts new file mode 100644 index 0000000..4c9116b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/hash.d.ts @@ -0,0 +1,8 @@ +export declare class ValueHashError extends Error { + readonly value: unknown; + constructor(value: unknown); +} +export declare namespace ValueHash { + /** Creates a FNV1A-64 non cryptographic hash of the given value */ + function Create(value: unknown): bigint; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/hash.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/hash.js new file mode 100644 index 0000000..9594420 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/hash.js @@ -0,0 +1,208 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/hash + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueHash = exports.ValueHashError = void 0; +class ValueHashError extends Error { + constructor(value) { + super(`Hash: Unable to hash value`); + this.value = value; + } +} +exports.ValueHashError = ValueHashError; +var ValueHash; +(function (ValueHash) { + let ByteMarker; + (function (ByteMarker) { + ByteMarker[ByteMarker["Undefined"] = 0] = "Undefined"; + ByteMarker[ByteMarker["Null"] = 1] = "Null"; + ByteMarker[ByteMarker["Boolean"] = 2] = "Boolean"; + ByteMarker[ByteMarker["Number"] = 3] = "Number"; + ByteMarker[ByteMarker["String"] = 4] = "String"; + ByteMarker[ByteMarker["Object"] = 5] = "Object"; + ByteMarker[ByteMarker["Array"] = 6] = "Array"; + ByteMarker[ByteMarker["Date"] = 7] = "Date"; + ByteMarker[ByteMarker["Uint8Array"] = 8] = "Uint8Array"; + ByteMarker[ByteMarker["Symbol"] = 9] = "Symbol"; + ByteMarker[ByteMarker["BigInt"] = 10] = "BigInt"; + })(ByteMarker || (ByteMarker = {})); + // ---------------------------------------------------- + // State + // ---------------------------------------------------- + let Hash = globalThis.BigInt('14695981039346656037'); + const [Prime, Size] = [globalThis.BigInt('1099511628211'), globalThis.BigInt('2') ** globalThis.BigInt('64')]; + const Bytes = globalThis.Array.from({ length: 256 }).map((_, i) => globalThis.BigInt(i)); + const F64 = new globalThis.Float64Array(1); + const F64In = new globalThis.DataView(F64.buffer); + const F64Out = new globalThis.Uint8Array(F64.buffer); + // ---------------------------------------------------- + // Guards + // ---------------------------------------------------- + function IsDate(value) { + return value instanceof globalThis.Date; + } + function IsUint8Array(value) { + return value instanceof globalThis.Uint8Array; + } + function IsArray(value) { + return globalThis.Array.isArray(value); + } + function IsBoolean(value) { + return typeof value === 'boolean'; + } + function IsNull(value) { + return value === null; + } + function IsNumber(value) { + return typeof value === 'number'; + } + function IsSymbol(value) { + return typeof value === 'symbol'; + } + function IsBigInt(value) { + return typeof value === 'bigint'; + } + function IsObject(value) { + return typeof value === 'object' && value !== null && !IsArray(value) && !IsDate(value) && !IsUint8Array(value); + } + function IsString(value) { + return typeof value === 'string'; + } + function IsUndefined(value) { + return value === undefined; + } + // ---------------------------------------------------- + // Encoding + // ---------------------------------------------------- + function Array(value) { + FNV1A64(ByteMarker.Array); + for (const item of value) { + Visit(item); + } + } + function Boolean(value) { + FNV1A64(ByteMarker.Boolean); + FNV1A64(value ? 1 : 0); + } + function BigInt(value) { + FNV1A64(ByteMarker.BigInt); + F64In.setBigInt64(0, value); + for (const byte of F64Out) { + FNV1A64(byte); + } + } + function Date(value) { + FNV1A64(ByteMarker.Date); + Visit(value.getTime()); + } + function Null(value) { + FNV1A64(ByteMarker.Null); + } + function Number(value) { + FNV1A64(ByteMarker.Number); + F64In.setFloat64(0, value); + for (const byte of F64Out) { + FNV1A64(byte); + } + } + function Object(value) { + FNV1A64(ByteMarker.Object); + for (const key of globalThis.Object.keys(value).sort()) { + Visit(key); + Visit(value[key]); + } + } + function String(value) { + FNV1A64(ByteMarker.String); + for (let i = 0; i < value.length; i++) { + FNV1A64(value.charCodeAt(i)); + } + } + function Symbol(value) { + FNV1A64(ByteMarker.Symbol); + Visit(value.description); + } + function Uint8Array(value) { + FNV1A64(ByteMarker.Uint8Array); + for (let i = 0; i < value.length; i++) { + FNV1A64(value[i]); + } + } + function Undefined(value) { + return FNV1A64(ByteMarker.Undefined); + } + function Visit(value) { + if (IsArray(value)) { + Array(value); + } + else if (IsBoolean(value)) { + Boolean(value); + } + else if (IsBigInt(value)) { + BigInt(value); + } + else if (IsDate(value)) { + Date(value); + } + else if (IsNull(value)) { + Null(value); + } + else if (IsNumber(value)) { + Number(value); + } + else if (IsObject(value)) { + Object(value); + } + else if (IsString(value)) { + String(value); + } + else if (IsSymbol(value)) { + Symbol(value); + } + else if (IsUint8Array(value)) { + Uint8Array(value); + } + else if (IsUndefined(value)) { + Undefined(value); + } + else { + throw new ValueHashError(value); + } + } + function FNV1A64(byte) { + Hash = Hash ^ Bytes[byte]; + Hash = (Hash * Prime) % Size; + } + /** Creates a FNV1A-64 non cryptographic hash of the given value */ + function Create(value) { + Hash = globalThis.BigInt('14695981039346656037'); + Visit(value); + return Hash; + } + ValueHash.Create = Create; +})(ValueHash = exports.ValueHash || (exports.ValueHash = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/index.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/index.d.ts new file mode 100644 index 0000000..4ad0b77 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/index.d.ts @@ -0,0 +1,6 @@ +export { ValueError, ValueErrorIterator, ValueErrorType } from '../errors/index'; +export { ValueHash } from './hash'; +export { Edit, Insert, Update, Delete } from './delta'; +export { Mutable } from './mutate'; +export * from './pointer'; +export * from './value'; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/index.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/index.js new file mode 100644 index 0000000..1f21de4 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/index.js @@ -0,0 +1,56 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Delete = exports.Update = exports.Insert = exports.Edit = exports.ValueHash = exports.ValueErrorType = exports.ValueErrorIterator = void 0; +var index_1 = require("../errors/index"); +Object.defineProperty(exports, "ValueErrorIterator", { enumerable: true, get: function () { return index_1.ValueErrorIterator; } }); +Object.defineProperty(exports, "ValueErrorType", { enumerable: true, get: function () { return index_1.ValueErrorType; } }); +var hash_1 = require("./hash"); +Object.defineProperty(exports, "ValueHash", { enumerable: true, get: function () { return hash_1.ValueHash; } }); +var delta_1 = require("./delta"); +Object.defineProperty(exports, "Edit", { enumerable: true, get: function () { return delta_1.Edit; } }); +Object.defineProperty(exports, "Insert", { enumerable: true, get: function () { return delta_1.Insert; } }); +Object.defineProperty(exports, "Update", { enumerable: true, get: function () { return delta_1.Update; } }); +Object.defineProperty(exports, "Delete", { enumerable: true, get: function () { return delta_1.Delete; } }); +__exportStar(require("./pointer"), exports); +__exportStar(require("./value"), exports); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/is.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/is.d.ts new file mode 100644 index 0000000..b78ba9c --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/is.d.ts @@ -0,0 +1,11 @@ +export type ValueType = null | undefined | Function | symbol | bigint | number | boolean | string; +export type ObjectType = Record; +export type TypedArrayType = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array; +export type ArrayType = unknown[]; +export declare namespace Is { + function Object(value: unknown): value is ObjectType; + function Date(value: unknown): value is Date; + function Array(value: unknown): value is ArrayType; + function Value(value: unknown): value is ValueType; + function TypedArray(value: unknown): value is TypedArrayType; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/is.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/is.js new file mode 100644 index 0000000..fbe1ed4 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/is.js @@ -0,0 +1,53 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Is = void 0; +var Is; +(function (Is) { + function Object(value) { + return value !== null && typeof value === 'object' && !globalThis.Array.isArray(value) && !ArrayBuffer.isView(value) && !(value instanceof globalThis.Date); + } + Is.Object = Object; + function Date(value) { + return value instanceof globalThis.Date; + } + Is.Date = Date; + function Array(value) { + return globalThis.Array.isArray(value) && !ArrayBuffer.isView(value); + } + Is.Array = Array; + function Value(value) { + return value === null || value === undefined || typeof value === 'function' || typeof value === 'symbol' || typeof value === 'bigint' || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string'; + } + Is.Value = Value; + function TypedArray(value) { + return ArrayBuffer.isView(value); + } + Is.TypedArray = TypedArray; +})(Is = exports.Is || (exports.Is = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/mutate.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/mutate.d.ts new file mode 100644 index 0000000..e45c07e --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/mutate.d.ts @@ -0,0 +1,13 @@ +export declare class ValueMutateTypeMismatchError extends Error { + constructor(); +} +export declare class ValueMutateInvalidRootMutationError extends Error { + constructor(); +} +export type Mutable = { + [key: string]: unknown; +} | unknown[]; +export declare namespace ValueMutate { + /** Performs a deep mutable value assignment while retaining internal references. */ + function Mutate(current: Mutable, next: Mutable): void; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/mutate.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/mutate.js new file mode 100644 index 0000000..4151596 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/mutate.js @@ -0,0 +1,121 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValueMutate = exports.ValueMutateInvalidRootMutationError = exports.ValueMutateTypeMismatchError = void 0; +const is_1 = require("./is"); +const pointer_1 = require("./pointer"); +const clone_1 = require("./clone"); +class ValueMutateTypeMismatchError extends Error { + constructor() { + super('ValueMutate: Cannot assign due type mismatch of assignable values'); + } +} +exports.ValueMutateTypeMismatchError = ValueMutateTypeMismatchError; +class ValueMutateInvalidRootMutationError extends Error { + constructor() { + super('ValueMutate: Only object and array types can be mutated at the root level'); + } +} +exports.ValueMutateInvalidRootMutationError = ValueMutateInvalidRootMutationError; +var ValueMutate; +(function (ValueMutate) { + function Object(root, path, current, next) { + if (!is_1.Is.Object(current)) { + pointer_1.ValuePointer.Set(root, path, clone_1.ValueClone.Clone(next)); + } + else { + const currentKeys = globalThis.Object.keys(current); + const nextKeys = globalThis.Object.keys(next); + for (const currentKey of currentKeys) { + if (!nextKeys.includes(currentKey)) { + delete current[currentKey]; + } + } + for (const nextKey of nextKeys) { + if (!currentKeys.includes(nextKey)) { + current[nextKey] = null; + } + } + for (const nextKey of nextKeys) { + Visit(root, `${path}/${nextKey}`, current[nextKey], next[nextKey]); + } + } + } + function Array(root, path, current, next) { + if (!is_1.Is.Array(current)) { + pointer_1.ValuePointer.Set(root, path, clone_1.ValueClone.Clone(next)); + } + else { + for (let index = 0; index < next.length; index++) { + Visit(root, `${path}/${index}`, current[index], next[index]); + } + current.splice(next.length); + } + } + function TypedArray(root, path, current, next) { + if (is_1.Is.TypedArray(current) && current.length === next.length) { + for (let i = 0; i < current.length; i++) { + current[i] = next[i]; + } + } + else { + pointer_1.ValuePointer.Set(root, path, clone_1.ValueClone.Clone(next)); + } + } + function Value(root, path, current, next) { + if (current === next) + return; + pointer_1.ValuePointer.Set(root, path, next); + } + function Visit(root, path, current, next) { + if (is_1.Is.Array(next)) { + return Array(root, path, current, next); + } + else if (is_1.Is.TypedArray(next)) { + return TypedArray(root, path, current, next); + } + else if (is_1.Is.Object(next)) { + return Object(root, path, current, next); + } + else if (is_1.Is.Value(next)) { + return Value(root, path, current, next); + } + } + /** Performs a deep mutable value assignment while retaining internal references. */ + function Mutate(current, next) { + if (is_1.Is.TypedArray(current) || is_1.Is.Value(current) || is_1.Is.TypedArray(next) || is_1.Is.Value(next)) { + throw new ValueMutateInvalidRootMutationError(); + } + if ((is_1.Is.Object(current) && is_1.Is.Array(next)) || (is_1.Is.Array(current) && is_1.Is.Object(next))) { + throw new ValueMutateTypeMismatchError(); + } + Visit(current, '', current, next); + } + ValueMutate.Mutate = Mutate; +})(ValueMutate = exports.ValueMutate || (exports.ValueMutate = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/pointer.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/pointer.d.ts new file mode 100644 index 0000000..abae1e1 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/pointer.d.ts @@ -0,0 +1,24 @@ +export declare class ValuePointerRootSetError extends Error { + readonly value: unknown; + readonly path: string; + readonly update: unknown; + constructor(value: unknown, path: string, update: unknown); +} +export declare class ValuePointerRootDeleteError extends Error { + readonly value: unknown; + readonly path: string; + constructor(value: unknown, path: string); +} +/** Provides functionality to update values through RFC6901 string pointers */ +export declare namespace ValuePointer { + /** Formats the given pointer into navigable key components */ + function Format(pointer: string): IterableIterator; + /** Sets the value at the given pointer. If the value at the pointer does not exist it is created */ + function Set(value: any, pointer: string, update: unknown): void; + /** Deletes a value at the given pointer */ + function Delete(value: any, pointer: string): void; + /** Returns true if a value exists at the given pointer */ + function Has(value: any, pointer: string): boolean; + /** Gets the value at the given pointer */ + function Get(value: any, pointer: string): any; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/pointer.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/pointer.js new file mode 100644 index 0000000..981be63 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/pointer.js @@ -0,0 +1,142 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ValuePointer = exports.ValuePointerRootDeleteError = exports.ValuePointerRootSetError = void 0; +class ValuePointerRootSetError extends Error { + constructor(value, path, update) { + super('ValuePointer: Cannot set root value'); + this.value = value; + this.path = path; + this.update = update; + } +} +exports.ValuePointerRootSetError = ValuePointerRootSetError; +class ValuePointerRootDeleteError extends Error { + constructor(value, path) { + super('ValuePointer: Cannot delete root value'); + this.value = value; + this.path = path; + } +} +exports.ValuePointerRootDeleteError = ValuePointerRootDeleteError; +/** Provides functionality to update values through RFC6901 string pointers */ +var ValuePointer; +(function (ValuePointer) { + function Escape(component) { + return component.indexOf('~') === -1 ? component : component.replace(/~1/g, '/').replace(/~0/g, '~'); + } + /** Formats the given pointer into navigable key components */ + function* Format(pointer) { + if (pointer === '') + return; + let [start, end] = [0, 0]; + for (let i = 0; i < pointer.length; i++) { + const char = pointer.charAt(i); + if (char === '/') { + if (i === 0) { + start = i + 1; + } + else { + end = i; + yield Escape(pointer.slice(start, end)); + start = i + 1; + } + } + else { + end = i; + } + } + yield Escape(pointer.slice(start)); + } + ValuePointer.Format = Format; + /** Sets the value at the given pointer. If the value at the pointer does not exist it is created */ + function Set(value, pointer, update) { + if (pointer === '') + throw new ValuePointerRootSetError(value, pointer, update); + let [owner, next, key] = [null, value, '']; + for (const component of Format(pointer)) { + if (next[component] === undefined) + next[component] = {}; + owner = next; + next = next[component]; + key = component; + } + owner[key] = update; + } + ValuePointer.Set = Set; + /** Deletes a value at the given pointer */ + function Delete(value, pointer) { + if (pointer === '') + throw new ValuePointerRootDeleteError(value, pointer); + let [owner, next, key] = [null, value, '']; + for (const component of Format(pointer)) { + if (next[component] === undefined || next[component] === null) + return; + owner = next; + next = next[component]; + key = component; + } + if (globalThis.Array.isArray(owner)) { + const index = parseInt(key); + owner.splice(index, 1); + } + else { + delete owner[key]; + } + } + ValuePointer.Delete = Delete; + /** Returns true if a value exists at the given pointer */ + function Has(value, pointer) { + if (pointer === '') + return true; + let [owner, next, key] = [null, value, '']; + for (const component of Format(pointer)) { + if (next[component] === undefined) + return false; + owner = next; + next = next[component]; + key = component; + } + return globalThis.Object.getOwnPropertyNames(owner).includes(key); + } + ValuePointer.Has = Has; + /** Gets the value at the given pointer */ + function Get(value, pointer) { + if (pointer === '') + return value; + let current = value; + for (const component of Format(pointer)) { + if (current[component] === undefined) + return undefined; + current = current[component]; + } + return current; + } + ValuePointer.Get = Get; +})(ValuePointer = exports.ValuePointer || (exports.ValuePointer = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/value.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/value.d.ts new file mode 100644 index 0000000..bf8d32f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/value.d.ts @@ -0,0 +1,39 @@ +import * as Types from '../typebox'; +import { ValueErrorIterator } from '../errors/index'; +import { Mutable } from './mutate'; +import { Edit } from './delta'; +/** Provides functions to perform structural updates to JavaScript values */ +export declare namespace Value { + /** Casts a value into a given type. The return value will retain as much information of the original value as possible. Cast will convert string, number, boolean and date values if a reasonable conversion is possible. */ + function Cast(schema: T, references: [...R], value: unknown): Types.Static; + /** Casts a value into a given type. The return value will retain as much information of the original value as possible. Cast will convert string, number, boolean and date values if a reasonable conversion is possible. */ + function Cast(schema: T, value: unknown): Types.Static; + /** Creates a value from the given type */ + function Create(schema: T, references: [...R]): Types.Static; + /** Creates a value from the given type */ + function Create(schema: T): Types.Static; + /** Returns true if the value matches the given type. */ + function Check(schema: T, references: [...R], value: unknown): value is Types.Static; + /** Returns true if the value matches the given type. */ + function Check(schema: T, value: unknown): value is Types.Static; + /** Converts any type mismatched values to their target type if a conversion is possible. */ + function Convert(schema: T, references: [...R], value: unknown): unknown; + /** Converts any type mismatched values to their target type if a conversion is possible. */ + function Convert(schema: T, value: unknown): unknown; + /** Returns a structural clone of the given value */ + function Clone(value: T): T; + /** Returns an iterator for each error in this value. */ + function Errors(schema: T, references: [...R], value: unknown): ValueErrorIterator; + /** Returns an iterator for each error in this value. */ + function Errors(schema: T, value: unknown): ValueErrorIterator; + /** Returns true if left and right values are structurally equal */ + function Equal(left: T, right: unknown): right is T; + /** Returns edits to transform the current value into the next value */ + function Diff(current: unknown, next: unknown): Edit[]; + /** Returns a FNV1A-64 non cryptographic hash of the given value */ + function Hash(value: unknown): bigint; + /** Returns a new value with edits applied to the given value */ + function Patch(current: unknown, edits: Edit[]): T; + /** Performs a deep mutable value assignment while retaining internal references. */ + function Mutate(current: Mutable, next: Mutable): void; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/value.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/value.js new file mode 100644 index 0000000..e1ab919 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@sinclair/typebox/value/value.js @@ -0,0 +1,99 @@ +"use strict"; +/*-------------------------------------------------------------------------- + +@sinclair/typebox/value + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Value = void 0; +const index_1 = require("../errors/index"); +const mutate_1 = require("./mutate"); +const hash_1 = require("./hash"); +const equal_1 = require("./equal"); +const cast_1 = require("./cast"); +const clone_1 = require("./clone"); +const convert_1 = require("./convert"); +const create_1 = require("./create"); +const check_1 = require("./check"); +const delta_1 = require("./delta"); +/** Provides functions to perform structural updates to JavaScript values */ +var Value; +(function (Value) { + function Cast(...args) { + const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]]; + return cast_1.ValueCast.Cast(schema, references, value); + } + Value.Cast = Cast; + function Create(...args) { + const [schema, references] = args.length === 2 ? [args[0], args[1]] : [args[0], []]; + return create_1.ValueCreate.Create(schema, references); + } + Value.Create = Create; + function Check(...args) { + const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]]; + return check_1.ValueCheck.Check(schema, references, value); + } + Value.Check = Check; + function Convert(...args) { + const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]]; + return convert_1.ValueConvert.Convert(schema, references, value); + } + Value.Convert = Convert; + /** Returns a structural clone of the given value */ + function Clone(value) { + return clone_1.ValueClone.Clone(value); + } + Value.Clone = Clone; + function Errors(...args) { + const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]]; + return index_1.ValueErrors.Errors(schema, references, value); + } + Value.Errors = Errors; + /** Returns true if left and right values are structurally equal */ + function Equal(left, right) { + return equal_1.ValueEqual.Equal(left, right); + } + Value.Equal = Equal; + /** Returns edits to transform the current value into the next value */ + function Diff(current, next) { + return delta_1.ValueDelta.Diff(current, next); + } + Value.Diff = Diff; + /** Returns a FNV1A-64 non cryptographic hash of the given value */ + function Hash(value) { + return hash_1.ValueHash.Create(value); + } + Value.Hash = Hash; + /** Returns a new value with edits applied to the given value */ + function Patch(current, edits) { + return delta_1.ValueDelta.Patch(current, edits); + } + Value.Patch = Patch; + /** Performs a deep mutable value assignment while retaining internal references. */ + function Mutate(current, next) { + mutate_1.ValueMutate.Mutate(current, next); + } + Value.Mutate = Mutate; +})(Value = exports.Value || (exports.Value = {})); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/LICENSE b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/README.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/README.md new file mode 100644 index 0000000..2af760b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/estree` + +# Summary +This package contains type definitions for estree (https://github.com/estree/estree). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree. + +### Additional Details + * Last updated: Fri, 06 Jun 2025 00:04:33 GMT + * Dependencies: none + +# Credits +These definitions were written by [RReverser](https://github.com/RReverser). diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/flow.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/flow.d.ts new file mode 100644 index 0000000..9d001a9 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/flow.d.ts @@ -0,0 +1,167 @@ +declare namespace ESTree { + interface FlowTypeAnnotation extends Node {} + + interface FlowBaseTypeAnnotation extends FlowTypeAnnotation {} + + interface FlowLiteralTypeAnnotation extends FlowTypeAnnotation, Literal {} + + interface FlowDeclaration extends Declaration {} + + interface AnyTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface ArrayTypeAnnotation extends FlowTypeAnnotation { + elementType: FlowTypeAnnotation; + } + + interface BooleanLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface BooleanTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface ClassImplements extends Node { + id: Identifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface ClassProperty { + key: Expression; + value?: Expression | null; + typeAnnotation?: TypeAnnotation | null; + computed: boolean; + static: boolean; + } + + interface DeclareClass extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + body: ObjectTypeAnnotation; + extends: InterfaceExtends[]; + } + + interface DeclareFunction extends FlowDeclaration { + id: Identifier; + } + + interface DeclareModule extends FlowDeclaration { + id: Literal | Identifier; + body: BlockStatement; + } + + interface DeclareVariable extends FlowDeclaration { + id: Identifier; + } + + interface FunctionTypeAnnotation extends FlowTypeAnnotation { + params: FunctionTypeParam[]; + returnType: FlowTypeAnnotation; + rest?: FunctionTypeParam | null; + typeParameters?: TypeParameterDeclaration | null; + } + + interface FunctionTypeParam { + name: Identifier; + typeAnnotation: FlowTypeAnnotation; + optional: boolean; + } + + interface GenericTypeAnnotation extends FlowTypeAnnotation { + id: Identifier | QualifiedTypeIdentifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface InterfaceExtends extends Node { + id: Identifier | QualifiedTypeIdentifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface InterfaceDeclaration extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + extends: InterfaceExtends[]; + body: ObjectTypeAnnotation; + } + + interface IntersectionTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface MixedTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface NullableTypeAnnotation extends FlowTypeAnnotation { + typeAnnotation: TypeAnnotation; + } + + interface NumberLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface NumberTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface StringLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface StringTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface TupleTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface TypeofTypeAnnotation extends FlowTypeAnnotation { + argument: FlowTypeAnnotation; + } + + interface TypeAlias extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + right: FlowTypeAnnotation; + } + + interface TypeAnnotation extends Node { + typeAnnotation: FlowTypeAnnotation; + } + + interface TypeCastExpression extends Expression { + expression: Expression; + typeAnnotation: TypeAnnotation; + } + + interface TypeParameterDeclaration extends Node { + params: Identifier[]; + } + + interface TypeParameterInstantiation extends Node { + params: FlowTypeAnnotation[]; + } + + interface ObjectTypeAnnotation extends FlowTypeAnnotation { + properties: ObjectTypeProperty[]; + indexers: ObjectTypeIndexer[]; + callProperties: ObjectTypeCallProperty[]; + } + + interface ObjectTypeCallProperty extends Node { + value: FunctionTypeAnnotation; + static: boolean; + } + + interface ObjectTypeIndexer extends Node { + id: Identifier; + key: FlowTypeAnnotation; + value: FlowTypeAnnotation; + static: boolean; + } + + interface ObjectTypeProperty extends Node { + key: Expression; + value: FlowTypeAnnotation; + optional: boolean; + static: boolean; + } + + interface QualifiedTypeIdentifier extends Node { + qualification: Identifier | QualifiedTypeIdentifier; + id: Identifier; + } + + interface UnionTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface VoidTypeAnnotation extends FlowBaseTypeAnnotation {} +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/index.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/index.d.ts new file mode 100644 index 0000000..2bc66fb --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/index.d.ts @@ -0,0 +1,694 @@ +// This definition file follows a somewhat unusual format. ESTree allows +// runtime type checks based on the `type` parameter. In order to explain this +// to typescript we want to use discriminated union types: +// https://github.com/Microsoft/TypeScript/pull/9163 +// +// For ESTree this is a bit tricky because the high level interfaces like +// Node or Function are pulling double duty. We want to pass common fields down +// to the interfaces that extend them (like Identifier or +// ArrowFunctionExpression), but you can't extend a type union or enforce +// common fields on them. So we've split the high level interfaces into two +// types, a base type which passes down inherited fields, and a type union of +// all types which extend the base type. Only the type union is exported, and +// the union is how other types refer to the collection of inheriting types. +// +// This makes the definitions file here somewhat more difficult to maintain, +// but it has the notable advantage of making ESTree much easier to use as +// an end user. + +export interface BaseNodeWithoutComments { + // Every leaf interface that extends BaseNode must specify a type property. + // The type property should be a string literal. For example, Identifier + // has: `type: "Identifier"` + type: string; + loc?: SourceLocation | null | undefined; + range?: [number, number] | undefined; +} + +export interface BaseNode extends BaseNodeWithoutComments { + leadingComments?: Comment[] | undefined; + trailingComments?: Comment[] | undefined; +} + +export interface NodeMap { + AssignmentProperty: AssignmentProperty; + CatchClause: CatchClause; + Class: Class; + ClassBody: ClassBody; + Expression: Expression; + Function: Function; + Identifier: Identifier; + Literal: Literal; + MethodDefinition: MethodDefinition; + ModuleDeclaration: ModuleDeclaration; + ModuleSpecifier: ModuleSpecifier; + Pattern: Pattern; + PrivateIdentifier: PrivateIdentifier; + Program: Program; + Property: Property; + PropertyDefinition: PropertyDefinition; + SpreadElement: SpreadElement; + Statement: Statement; + Super: Super; + SwitchCase: SwitchCase; + TemplateElement: TemplateElement; + VariableDeclarator: VariableDeclarator; +} + +export type Node = NodeMap[keyof NodeMap]; + +export interface Comment extends BaseNodeWithoutComments { + type: "Line" | "Block"; + value: string; +} + +export interface SourceLocation { + source?: string | null | undefined; + start: Position; + end: Position; +} + +export interface Position { + /** >= 1 */ + line: number; + /** >= 0 */ + column: number; +} + +export interface Program extends BaseNode { + type: "Program"; + sourceType: "script" | "module"; + body: Array; + comments?: Comment[] | undefined; +} + +export interface Directive extends BaseNode { + type: "ExpressionStatement"; + expression: Literal; + directive: string; +} + +export interface BaseFunction extends BaseNode { + params: Pattern[]; + generator?: boolean | undefined; + async?: boolean | undefined; + // The body is either BlockStatement or Expression because arrow functions + // can have a body that's either. FunctionDeclarations and + // FunctionExpressions have only BlockStatement bodies. + body: BlockStatement | Expression; +} + +export type Function = FunctionDeclaration | FunctionExpression | ArrowFunctionExpression; + +export type Statement = + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | Declaration; + +export interface BaseStatement extends BaseNode {} + +export interface EmptyStatement extends BaseStatement { + type: "EmptyStatement"; +} + +export interface BlockStatement extends BaseStatement { + type: "BlockStatement"; + body: Statement[]; + innerComments?: Comment[] | undefined; +} + +export interface StaticBlock extends Omit { + type: "StaticBlock"; +} + +export interface ExpressionStatement extends BaseStatement { + type: "ExpressionStatement"; + expression: Expression; +} + +export interface IfStatement extends BaseStatement { + type: "IfStatement"; + test: Expression; + consequent: Statement; + alternate?: Statement | null | undefined; +} + +export interface LabeledStatement extends BaseStatement { + type: "LabeledStatement"; + label: Identifier; + body: Statement; +} + +export interface BreakStatement extends BaseStatement { + type: "BreakStatement"; + label?: Identifier | null | undefined; +} + +export interface ContinueStatement extends BaseStatement { + type: "ContinueStatement"; + label?: Identifier | null | undefined; +} + +export interface WithStatement extends BaseStatement { + type: "WithStatement"; + object: Expression; + body: Statement; +} + +export interface SwitchStatement extends BaseStatement { + type: "SwitchStatement"; + discriminant: Expression; + cases: SwitchCase[]; +} + +export interface ReturnStatement extends BaseStatement { + type: "ReturnStatement"; + argument?: Expression | null | undefined; +} + +export interface ThrowStatement extends BaseStatement { + type: "ThrowStatement"; + argument: Expression; +} + +export interface TryStatement extends BaseStatement { + type: "TryStatement"; + block: BlockStatement; + handler?: CatchClause | null | undefined; + finalizer?: BlockStatement | null | undefined; +} + +export interface WhileStatement extends BaseStatement { + type: "WhileStatement"; + test: Expression; + body: Statement; +} + +export interface DoWhileStatement extends BaseStatement { + type: "DoWhileStatement"; + body: Statement; + test: Expression; +} + +export interface ForStatement extends BaseStatement { + type: "ForStatement"; + init?: VariableDeclaration | Expression | null | undefined; + test?: Expression | null | undefined; + update?: Expression | null | undefined; + body: Statement; +} + +export interface BaseForXStatement extends BaseStatement { + left: VariableDeclaration | Pattern; + right: Expression; + body: Statement; +} + +export interface ForInStatement extends BaseForXStatement { + type: "ForInStatement"; +} + +export interface DebuggerStatement extends BaseStatement { + type: "DebuggerStatement"; +} + +export type Declaration = FunctionDeclaration | VariableDeclaration | ClassDeclaration; + +export interface BaseDeclaration extends BaseStatement {} + +export interface MaybeNamedFunctionDeclaration extends BaseFunction, BaseDeclaration { + type: "FunctionDeclaration"; + /** It is null when a function declaration is a part of the `export default function` statement */ + id: Identifier | null; + body: BlockStatement; +} + +export interface FunctionDeclaration extends MaybeNamedFunctionDeclaration { + id: Identifier; +} + +export interface VariableDeclaration extends BaseDeclaration { + type: "VariableDeclaration"; + declarations: VariableDeclarator[]; + kind: "var" | "let" | "const" | "using" | "await using"; +} + +export interface VariableDeclarator extends BaseNode { + type: "VariableDeclarator"; + id: Pattern; + init?: Expression | null | undefined; +} + +export interface ExpressionMap { + ArrayExpression: ArrayExpression; + ArrowFunctionExpression: ArrowFunctionExpression; + AssignmentExpression: AssignmentExpression; + AwaitExpression: AwaitExpression; + BinaryExpression: BinaryExpression; + CallExpression: CallExpression; + ChainExpression: ChainExpression; + ClassExpression: ClassExpression; + ConditionalExpression: ConditionalExpression; + FunctionExpression: FunctionExpression; + Identifier: Identifier; + ImportExpression: ImportExpression; + Literal: Literal; + LogicalExpression: LogicalExpression; + MemberExpression: MemberExpression; + MetaProperty: MetaProperty; + NewExpression: NewExpression; + ObjectExpression: ObjectExpression; + SequenceExpression: SequenceExpression; + TaggedTemplateExpression: TaggedTemplateExpression; + TemplateLiteral: TemplateLiteral; + ThisExpression: ThisExpression; + UnaryExpression: UnaryExpression; + UpdateExpression: UpdateExpression; + YieldExpression: YieldExpression; +} + +export type Expression = ExpressionMap[keyof ExpressionMap]; + +export interface BaseExpression extends BaseNode {} + +export type ChainElement = SimpleCallExpression | MemberExpression; + +export interface ChainExpression extends BaseExpression { + type: "ChainExpression"; + expression: ChainElement; +} + +export interface ThisExpression extends BaseExpression { + type: "ThisExpression"; +} + +export interface ArrayExpression extends BaseExpression { + type: "ArrayExpression"; + elements: Array; +} + +export interface ObjectExpression extends BaseExpression { + type: "ObjectExpression"; + properties: Array; +} + +export interface PrivateIdentifier extends BaseNode { + type: "PrivateIdentifier"; + name: string; +} + +export interface Property extends BaseNode { + type: "Property"; + key: Expression | PrivateIdentifier; + value: Expression | Pattern; // Could be an AssignmentProperty + kind: "init" | "get" | "set"; + method: boolean; + shorthand: boolean; + computed: boolean; +} + +export interface PropertyDefinition extends BaseNode { + type: "PropertyDefinition"; + key: Expression | PrivateIdentifier; + value?: Expression | null | undefined; + computed: boolean; + static: boolean; +} + +export interface FunctionExpression extends BaseFunction, BaseExpression { + id?: Identifier | null | undefined; + type: "FunctionExpression"; + body: BlockStatement; +} + +export interface SequenceExpression extends BaseExpression { + type: "SequenceExpression"; + expressions: Expression[]; +} + +export interface UnaryExpression extends BaseExpression { + type: "UnaryExpression"; + operator: UnaryOperator; + prefix: true; + argument: Expression; +} + +export interface BinaryExpression extends BaseExpression { + type: "BinaryExpression"; + operator: BinaryOperator; + left: Expression | PrivateIdentifier; + right: Expression; +} + +export interface AssignmentExpression extends BaseExpression { + type: "AssignmentExpression"; + operator: AssignmentOperator; + left: Pattern | MemberExpression; + right: Expression; +} + +export interface UpdateExpression extends BaseExpression { + type: "UpdateExpression"; + operator: UpdateOperator; + argument: Expression; + prefix: boolean; +} + +export interface LogicalExpression extends BaseExpression { + type: "LogicalExpression"; + operator: LogicalOperator; + left: Expression; + right: Expression; +} + +export interface ConditionalExpression extends BaseExpression { + type: "ConditionalExpression"; + test: Expression; + alternate: Expression; + consequent: Expression; +} + +export interface BaseCallExpression extends BaseExpression { + callee: Expression | Super; + arguments: Array; +} +export type CallExpression = SimpleCallExpression | NewExpression; + +export interface SimpleCallExpression extends BaseCallExpression { + type: "CallExpression"; + optional: boolean; +} + +export interface NewExpression extends BaseCallExpression { + type: "NewExpression"; +} + +export interface MemberExpression extends BaseExpression, BasePattern { + type: "MemberExpression"; + object: Expression | Super; + property: Expression | PrivateIdentifier; + computed: boolean; + optional: boolean; +} + +export type Pattern = Identifier | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | MemberExpression; + +export interface BasePattern extends BaseNode {} + +export interface SwitchCase extends BaseNode { + type: "SwitchCase"; + test?: Expression | null | undefined; + consequent: Statement[]; +} + +export interface CatchClause extends BaseNode { + type: "CatchClause"; + param: Pattern | null; + body: BlockStatement; +} + +export interface Identifier extends BaseNode, BaseExpression, BasePattern { + type: "Identifier"; + name: string; +} + +export type Literal = SimpleLiteral | RegExpLiteral | BigIntLiteral; + +export interface SimpleLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value: string | boolean | number | null; + raw?: string | undefined; +} + +export interface RegExpLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value?: RegExp | null | undefined; + regex: { + pattern: string; + flags: string; + }; + raw?: string | undefined; +} + +export interface BigIntLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value?: bigint | null | undefined; + bigint: string; + raw?: string | undefined; +} + +export type UnaryOperator = "-" | "+" | "!" | "~" | "typeof" | "void" | "delete"; + +export type BinaryOperator = + | "==" + | "!=" + | "===" + | "!==" + | "<" + | "<=" + | ">" + | ">=" + | "<<" + | ">>" + | ">>>" + | "+" + | "-" + | "*" + | "/" + | "%" + | "**" + | "|" + | "^" + | "&" + | "in" + | "instanceof"; + +export type LogicalOperator = "||" | "&&" | "??"; + +export type AssignmentOperator = + | "=" + | "+=" + | "-=" + | "*=" + | "/=" + | "%=" + | "**=" + | "<<=" + | ">>=" + | ">>>=" + | "|=" + | "^=" + | "&=" + | "||=" + | "&&=" + | "??="; + +export type UpdateOperator = "++" | "--"; + +export interface ForOfStatement extends BaseForXStatement { + type: "ForOfStatement"; + await: boolean; +} + +export interface Super extends BaseNode { + type: "Super"; +} + +export interface SpreadElement extends BaseNode { + type: "SpreadElement"; + argument: Expression; +} + +export interface ArrowFunctionExpression extends BaseExpression, BaseFunction { + type: "ArrowFunctionExpression"; + expression: boolean; + body: BlockStatement | Expression; +} + +export interface YieldExpression extends BaseExpression { + type: "YieldExpression"; + argument?: Expression | null | undefined; + delegate: boolean; +} + +export interface TemplateLiteral extends BaseExpression { + type: "TemplateLiteral"; + quasis: TemplateElement[]; + expressions: Expression[]; +} + +export interface TaggedTemplateExpression extends BaseExpression { + type: "TaggedTemplateExpression"; + tag: Expression; + quasi: TemplateLiteral; +} + +export interface TemplateElement extends BaseNode { + type: "TemplateElement"; + tail: boolean; + value: { + /** It is null when the template literal is tagged and the text has an invalid escape (e.g. - tag`\unicode and \u{55}`) */ + cooked?: string | null | undefined; + raw: string; + }; +} + +export interface AssignmentProperty extends Property { + value: Pattern; + kind: "init"; + method: boolean; // false +} + +export interface ObjectPattern extends BasePattern { + type: "ObjectPattern"; + properties: Array; +} + +export interface ArrayPattern extends BasePattern { + type: "ArrayPattern"; + elements: Array; +} + +export interface RestElement extends BasePattern { + type: "RestElement"; + argument: Pattern; +} + +export interface AssignmentPattern extends BasePattern { + type: "AssignmentPattern"; + left: Pattern; + right: Expression; +} + +export type Class = ClassDeclaration | ClassExpression; +export interface BaseClass extends BaseNode { + superClass?: Expression | null | undefined; + body: ClassBody; +} + +export interface ClassBody extends BaseNode { + type: "ClassBody"; + body: Array; +} + +export interface MethodDefinition extends BaseNode { + type: "MethodDefinition"; + key: Expression | PrivateIdentifier; + value: FunctionExpression; + kind: "constructor" | "method" | "get" | "set"; + computed: boolean; + static: boolean; +} + +export interface MaybeNamedClassDeclaration extends BaseClass, BaseDeclaration { + type: "ClassDeclaration"; + /** It is null when a class declaration is a part of the `export default class` statement */ + id: Identifier | null; +} + +export interface ClassDeclaration extends MaybeNamedClassDeclaration { + id: Identifier; +} + +export interface ClassExpression extends BaseClass, BaseExpression { + type: "ClassExpression"; + id?: Identifier | null | undefined; +} + +export interface MetaProperty extends BaseExpression { + type: "MetaProperty"; + meta: Identifier; + property: Identifier; +} + +export type ModuleDeclaration = + | ImportDeclaration + | ExportNamedDeclaration + | ExportDefaultDeclaration + | ExportAllDeclaration; +export interface BaseModuleDeclaration extends BaseNode {} + +export type ModuleSpecifier = ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier; +export interface BaseModuleSpecifier extends BaseNode { + local: Identifier; +} + +export interface ImportDeclaration extends BaseModuleDeclaration { + type: "ImportDeclaration"; + specifiers: Array; + attributes: ImportAttribute[]; + source: Literal; +} + +export interface ImportSpecifier extends BaseModuleSpecifier { + type: "ImportSpecifier"; + imported: Identifier | Literal; +} + +export interface ImportAttribute extends BaseNode { + type: "ImportAttribute"; + key: Identifier | Literal; + value: Literal; +} + +export interface ImportExpression extends BaseExpression { + type: "ImportExpression"; + source: Expression; + options?: Expression | null | undefined; +} + +export interface ImportDefaultSpecifier extends BaseModuleSpecifier { + type: "ImportDefaultSpecifier"; +} + +export interface ImportNamespaceSpecifier extends BaseModuleSpecifier { + type: "ImportNamespaceSpecifier"; +} + +export interface ExportNamedDeclaration extends BaseModuleDeclaration { + type: "ExportNamedDeclaration"; + declaration?: Declaration | null | undefined; + specifiers: ExportSpecifier[]; + attributes: ImportAttribute[]; + source?: Literal | null | undefined; +} + +export interface ExportSpecifier extends Omit { + type: "ExportSpecifier"; + local: Identifier | Literal; + exported: Identifier | Literal; +} + +export interface ExportDefaultDeclaration extends BaseModuleDeclaration { + type: "ExportDefaultDeclaration"; + declaration: MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration | Expression; +} + +export interface ExportAllDeclaration extends BaseModuleDeclaration { + type: "ExportAllDeclaration"; + exported: Identifier | Literal | null; + attributes: ImportAttribute[]; + source: Literal; +} + +export interface AwaitExpression extends BaseExpression { + type: "AwaitExpression"; + argument: Expression; +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/package.json new file mode 100644 index 0000000..68c0782 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/@types/estree/package.json @@ -0,0 +1,27 @@ +{ + "name": "@types/estree", + "version": "1.0.8", + "description": "TypeScript definitions for estree", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree", + "license": "MIT", + "contributors": [ + { + "name": "RReverser", + "githubUsername": "RReverser", + "url": "https://github.com/RReverser" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/estree" + }, + "scripts": {}, + "dependencies": {}, + "peerDependencies": {}, + "typesPublisherContentHash": "7a167b6e4a4d9f6e9a2cb9fd3fc45c885f89cbdeb44b3e5961bb057a45c082fd", + "typeScriptVersion": "5.1", + "nonNpm": true +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/index.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/index.d.ts new file mode 100644 index 0000000..e0170aa --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/index.d.ts @@ -0,0 +1,167 @@ +declare namespace ansiStyles { + interface CSPair { + /** + The ANSI terminal control sequence for starting this style. + */ + readonly open: string; + + /** + The ANSI terminal control sequence for ending this style. + */ + readonly close: string; + } + + interface ColorBase { + /** + The ANSI terminal control sequence for ending this color. + */ + readonly close: string; + + ansi256(code: number): string; + + ansi16m(red: number, green: number, blue: number): string; + } + + interface Modifier { + /** + Resets the current color chain. + */ + readonly reset: CSPair; + + /** + Make text bold. + */ + readonly bold: CSPair; + + /** + Emitting only a small amount of light. + */ + readonly dim: CSPair; + + /** + Make text italic. (Not widely supported) + */ + readonly italic: CSPair; + + /** + Make text underline. (Not widely supported) + */ + readonly underline: CSPair; + + /** + Make text overline. + + Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash. + */ + readonly overline: CSPair; + + /** + Inverse background and foreground colors. + */ + readonly inverse: CSPair; + + /** + Prints the text, but makes it invisible. + */ + readonly hidden: CSPair; + + /** + Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: CSPair; + } + + interface ForegroundColor { + readonly black: CSPair; + readonly red: CSPair; + readonly green: CSPair; + readonly yellow: CSPair; + readonly blue: CSPair; + readonly cyan: CSPair; + readonly magenta: CSPair; + readonly white: CSPair; + + /** + Alias for `blackBright`. + */ + readonly gray: CSPair; + + /** + Alias for `blackBright`. + */ + readonly grey: CSPair; + + readonly blackBright: CSPair; + readonly redBright: CSPair; + readonly greenBright: CSPair; + readonly yellowBright: CSPair; + readonly blueBright: CSPair; + readonly cyanBright: CSPair; + readonly magentaBright: CSPair; + readonly whiteBright: CSPair; + } + + interface BackgroundColor { + readonly bgBlack: CSPair; + readonly bgRed: CSPair; + readonly bgGreen: CSPair; + readonly bgYellow: CSPair; + readonly bgBlue: CSPair; + readonly bgCyan: CSPair; + readonly bgMagenta: CSPair; + readonly bgWhite: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGray: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGrey: CSPair; + + readonly bgBlackBright: CSPair; + readonly bgRedBright: CSPair; + readonly bgGreenBright: CSPair; + readonly bgYellowBright: CSPair; + readonly bgBlueBright: CSPair; + readonly bgCyanBright: CSPair; + readonly bgMagentaBright: CSPair; + readonly bgWhiteBright: CSPair; + } + + interface ConvertColor { + /** + Convert from the RGB color space to the ANSI 256 color space. + + @param red - (`0...255`) + @param green - (`0...255`) + @param blue - (`0...255`) + */ + rgbToAnsi256(red: number, green: number, blue: number): number; + + /** + Convert from the RGB HEX color space to the RGB color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToRgb(hex: string): [red: number, green: number, blue: number]; + + /** + Convert from the RGB HEX color space to the ANSI 256 color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToAnsi256(hex: string): number; + } +} + +declare const ansiStyles: { + readonly modifier: ansiStyles.Modifier; + readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase; + readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase; + readonly codes: ReadonlyMap; +} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier & ansiStyles.ConvertColor; + +export = ansiStyles; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/index.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/index.js new file mode 100644 index 0000000..a9eac58 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/index.js @@ -0,0 +1,164 @@ +'use strict'; + +const ANSI_BACKGROUND_OFFSET = 10; + +const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`; + +const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + overline: [53, 55], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi256 = wrapAnsi256(); + styles.color.ansi16m = wrapAnsi16m(); + styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET); + styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET); + + // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js + Object.defineProperties(styles, { + rgbToAnsi256: { + value: (red, green, blue) => { + // We use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (red === green && green === blue) { + if (red < 8) { + return 16; + } + + if (red > 248) { + return 231; + } + + return Math.round(((red - 8) / 247) * 24) + 232; + } + + return 16 + + (36 * Math.round(red / 255 * 5)) + + (6 * Math.round(green / 255 * 5)) + + Math.round(blue / 255 * 5); + }, + enumerable: false + }, + hexToRgb: { + value: hex => { + const matches = /(?[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16)); + if (!matches) { + return [0, 0, 0]; + } + + let {colorString} = matches.groups; + + if (colorString.length === 3) { + colorString = colorString.split('').map(character => character + character).join(''); + } + + const integer = Number.parseInt(colorString, 16); + + return [ + (integer >> 16) & 0xFF, + (integer >> 8) & 0xFF, + integer & 0xFF + ]; + }, + enumerable: false + }, + hexToAnsi256: { + value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)), + enumerable: false + } + }); + + return styles; +} + +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/license b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/package.json new file mode 100644 index 0000000..b3c89c9 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/package.json @@ -0,0 +1,52 @@ +{ + "name": "ansi-styles", + "version": "5.2.0", + "description": "ANSI escape codes for styling strings in the terminal", + "license": "MIT", + "repository": "chalk/ansi-styles", + "funding": "https://github.com/chalk/ansi-styles?sponsor=1", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "engines": { + "node": ">=10" + }, + "scripts": { + "test": "xo && ava && tsd", + "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "devDependencies": { + "ava": "^2.4.0", + "svg-term-cli": "^2.1.1", + "tsd": "^0.14.0", + "xo": "^0.37.1" + } +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/readme.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/readme.md new file mode 100644 index 0000000..7d12466 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/ansi-styles/readme.md @@ -0,0 +1,144 @@ +# ansi-styles + +> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + + + +## Install + +``` +$ npm install ansi-styles +``` + +## Usage + +```js +const style = require('ansi-styles'); + +console.log(`${style.green.open}Hello world!${style.green.close}`); + + +// Color conversion between 256/truecolor +// NOTE: When converting from truecolor to 256 colors, the original color +// may be degraded to fit the new color palette. This means terminals +// that do not support 16 million colors will best-match the +// original color. +console.log(`${style.color.ansi256(style.rgbToAnsi256(199, 20, 250))}Hello World${style.color.close}`) +console.log(`${style.color.ansi16m(...style.hexToRgb('#abcdef'))}Hello World${style.color.close}`) +``` + +## API + +Each style has an `open` and `close` property. + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(Not widely supported)* +- `underline` +- `overline` *Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash.* +- `inverse` +- `hidden` +- `strikethrough` *(Not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `blackBright` (alias: `gray`, `grey`) +- `redBright` +- `greenBright` +- `yellowBright` +- `blueBright` +- `magentaBright` +- `cyanBright` +- `whiteBright` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` +- `bgBlackBright` (alias: `bgGray`, `bgGrey`) +- `bgRedBright` +- `bgGreenBright` +- `bgYellowBright` +- `bgBlueBright` +- `bgMagentaBright` +- `bgCyanBright` +- `bgWhiteBright` + +## Advanced usage + +By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `style.modifier` +- `style.color` +- `style.bgColor` + +###### Example + +```js +console.log(style.color.green.open); +``` + +Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. + +###### Example + +```js +console.log(style.codes.get(36)); +//=> 39 +``` + +## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) + +`ansi-styles` allows converting between various color formats and ANSI escapes, with support for 256 and 16 million colors. + +The following color spaces from `color-convert` are supported: + +- `rgb` +- `hex` +- `ansi256` + +To use these, call the associated conversion function with the intended output, for example: + +```js +style.color.ansi256(style.rgbToAnsi256(100, 200, 15)); // RGB to 256 color ansi foreground code +style.bgColor.ansi256(style.hexToAnsi256('#C0FFEE')); // HEX to 256 color ansi foreground code + +style.color.ansi16m(100, 200, 15); // RGB to 16 million color foreground code +style.bgColor.ansi16m(...style.hexToRgb('#C0FFEE')); // Hex (RGB) to 16 million color foreground code +``` + +## Related + +- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + +## For enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/LICENSE b/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/LICENSE new file mode 100644 index 0000000..b93be90 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/README.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/README.md new file mode 100644 index 0000000..fd5b99b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/README.md @@ -0,0 +1,404 @@ +# diff-sequences + +Compare items in two sequences to find a **longest common subsequence**. + +The items not in common are the items to delete or insert in a **shortest edit script**. + +To maximize flexibility and minimize memory, you write **callback** functions as configuration: + +**Input** function `isCommon(aIndex, bIndex)` compares items at indexes in the sequences and returns a truthy/falsey value. This package might call your function more than once for some pairs of indexes. + +- Because your function encapsulates **comparison**, this package can compare items according to `===` operator, `Object.is` method, or other criterion. +- Because your function encapsulates **sequences**, this package can find differences in arrays, strings, or other data. + +**Output** function `foundSubsequence(nCommon, aCommon, bCommon)` receives the number of adjacent items and starting indexes of each common subsequence. If sequences do not have common items, then this package does not call your function. + +If N is the sum of lengths of sequences and L is length of a longest common subsequence, then D = N – 2L is the number of **differences** in the corresponding shortest edit script. + +[_An O(ND) Difference Algorithm and Its Variations_](http://xmailserver.org/diff2.pdf) by Eugene W. Myers is fast when sequences have **few** differences. + +This package implements the **linear space** variation with optimizations so it is fast even when sequences have **many** differences. + +## Usage + +To add this package as a dependency of a project, do either of the following: + +- `npm install diff-sequences` +- `yarn add diff-sequences` + +To use `diff` as the name of the default export from this package, do either of the following: + +- `var diff = require('diff-sequences').default; // CommonJS modules` +- `import diff from 'diff-sequences'; // ECMAScript modules` + +Call `diff` with the **lengths** of sequences and your **callback** functions: + +```js +const a = ['a', 'b', 'c', 'a', 'b', 'b', 'a']; +const b = ['c', 'b', 'a', 'b', 'a', 'c']; + +function isCommon(aIndex, bIndex) { + return a[aIndex] === b[bIndex]; +} +function foundSubsequence(nCommon, aCommon, bCommon) { + // see examples +} + +diff(a.length, b.length, isCommon, foundSubsequence); +``` + +## Example of longest common subsequence + +Some sequences (for example, `a` and `b` in the example of usage) have more than one longest common subsequence. + +This package finds the following common items: + +| comparisons of common items | values | output arguments | +| :------------------------------- | :--------- | --------------------------: | +| `a[2] === b[0]` | `'c'` | `foundSubsequence(1, 2, 0)` | +| `a[4] === b[1]` | `'b'` | `foundSubsequence(1, 4, 1)` | +| `a[5] === b[3] && a[6] === b[4]` | `'b', 'a'` | `foundSubsequence(2, 5, 3)` | + +The “edit graph” analogy in the Myers paper shows the following common items: + +| comparisons of common items | values | +| :------------------------------- | :--------- | +| `a[2] === b[0]` | `'c'` | +| `a[3] === b[2] && a[4] === b[3]` | `'a', 'b'` | +| `a[6] === b[4]` | `'a'` | + +Various packages which implement the Myers algorithm will **always agree** on the **length** of a longest common subsequence, but might **sometimes disagree** on which **items** are in it. + +## Example of callback functions to count common items + +```js +// Return length of longest common subsequence according to === operator. +function countCommonItems(a, b) { + let n = 0; + function isCommon(aIndex, bIndex) { + return a[aIndex] === b[bIndex]; + } + function foundSubsequence(nCommon) { + n += nCommon; + } + + diff(a.length, b.length, isCommon, foundSubsequence); + + return n; +} + +const commonLength = countCommonItems( + ['a', 'b', 'c', 'a', 'b', 'b', 'a'], + ['c', 'b', 'a', 'b', 'a', 'c'], +); +``` + +| category of items | expression | value | +| :----------------- | ------------------------: | ----: | +| in common | `commonLength` | `4` | +| to delete from `a` | `a.length - commonLength` | `3` | +| to insert from `b` | `b.length - commonLength` | `2` | + +If the length difference `b.length - a.length` is: + +- negative: its absolute value is the minimum number of items to **delete** from `a` +- positive: it is the minimum number of items to **insert** from `b` +- zero: there is an **equal** number of items to delete from `a` and insert from `b` +- non-zero: there is an equal number of **additional** items to delete from `a` and insert from `b` + +In this example, `6 - 7` is: + +- negative: `1` is the minimum number of items to **delete** from `a` +- non-zero: `2` is the number of **additional** items to delete from `a` and insert from `b` + +## Example of callback functions to find common items + +```js +// Return array of items in longest common subsequence according to Object.is method. +const findCommonItems = (a, b) => { + const array = []; + diff( + a.length, + b.length, + (aIndex, bIndex) => Object.is(a[aIndex], b[bIndex]), + (nCommon, aCommon) => { + for (; nCommon !== 0; nCommon -= 1, aCommon += 1) { + array.push(a[aCommon]); + } + }, + ); + return array; +}; + +const commonItems = findCommonItems( + ['a', 'b', 'c', 'a', 'b', 'b', 'a'], + ['c', 'b', 'a', 'b', 'a', 'c'], +); +``` + +| `i` | `commonItems[i]` | `aIndex` | +| --: | :--------------- | -------: | +| `0` | `'c'` | `2` | +| `1` | `'b'` | `4` | +| `2` | `'b'` | `5` | +| `3` | `'a'` | `6` | + +## Example of callback functions to diff index intervals + +Instead of slicing array-like objects, you can adjust indexes in your callback functions. + +```js +// Diff index intervals that are half open [start, end) like array slice method. +const diffIndexIntervals = (a, aStart, aEnd, b, bStart, bEnd) => { + // Validate: 0 <= aStart and aStart <= aEnd and aEnd <= a.length + // Validate: 0 <= bStart and bStart <= bEnd and bEnd <= b.length + + diff( + aEnd - aStart, + bEnd - bStart, + (aIndex, bIndex) => Object.is(a[aStart + aIndex], b[bStart + bIndex]), + (nCommon, aCommon, bCommon) => { + // aStart + aCommon, bStart + bCommon + }, + ); + + // After the last common subsequence, do any remaining work. +}; +``` + +## Example of callback functions to emulate diff command + +Linux or Unix has a `diff` command to compare files line by line. Its output is a **shortest edit script**: + +- **c**hange adjacent lines from the first file to lines from the second file +- **d**elete lines from the first file +- **a**ppend or insert lines from the second file + +```js +// Given zero-based half-open range [start, end) of array indexes, +// return one-based closed range [start + 1, end] as string. +const getRange = (start, end) => + start + 1 === end ? `${start + 1}` : `${start + 1},${end}`; + +// Given index intervals of lines to delete or insert, or both, or neither, +// push formatted diff lines onto array. +const pushDelIns = (aLines, aIndex, aEnd, bLines, bIndex, bEnd, array) => { + const deleteLines = aIndex !== aEnd; + const insertLines = bIndex !== bEnd; + const changeLines = deleteLines && insertLines; + if (changeLines) { + array.push(`${getRange(aIndex, aEnd)}c${getRange(bIndex, bEnd)}`); + } else if (deleteLines) { + array.push(`${getRange(aIndex, aEnd)}d${String(bIndex)}`); + } else if (insertLines) { + array.push(`${String(aIndex)}a${getRange(bIndex, bEnd)}`); + } else { + return; + } + + for (; aIndex !== aEnd; aIndex += 1) { + array.push(`< ${aLines[aIndex]}`); // delete is less than + } + + if (changeLines) { + array.push('---'); + } + + for (; bIndex !== bEnd; bIndex += 1) { + array.push(`> ${bLines[bIndex]}`); // insert is greater than + } +}; + +// Given content of two files, return emulated output of diff utility. +const findShortestEditScript = (a, b) => { + const aLines = a.split('\n'); + const bLines = b.split('\n'); + const aLength = aLines.length; + const bLength = bLines.length; + + const isCommon = (aIndex, bIndex) => aLines[aIndex] === bLines[bIndex]; + + let aIndex = 0; + let bIndex = 0; + const array = []; + const foundSubsequence = (nCommon, aCommon, bCommon) => { + pushDelIns(aLines, aIndex, aCommon, bLines, bIndex, bCommon, array); + aIndex = aCommon + nCommon; // number of lines compared in a + bIndex = bCommon + nCommon; // number of lines compared in b + }; + + diff(aLength, bLength, isCommon, foundSubsequence); + + // After the last common subsequence, push remaining change lines. + pushDelIns(aLines, aIndex, aLength, bLines, bIndex, bLength, array); + + return array.length === 0 ? '' : `${array.join('\n')}\n`; +}; +``` + +## Example of callback functions to format diff lines + +Here is simplified code to format **changed and unchanged lines** in expected and received values after a test fails in Jest: + +```js +// Format diff with minus or plus for change lines and space for common lines. +const formatDiffLines = (a, b) => { + // Jest depends on pretty-format package to serialize objects as strings. + // Unindented for comparison to avoid distracting differences: + const aLinesUn = format(a, {indent: 0 /*, other options*/}).split('\n'); + const bLinesUn = format(b, {indent: 0 /*, other options*/}).split('\n'); + // Indented to display changed and unchanged lines: + const aLinesIn = format(a, {indent: 2 /*, other options*/}).split('\n'); + const bLinesIn = format(b, {indent: 2 /*, other options*/}).split('\n'); + + const aLength = aLinesIn.length; // Validate: aLinesUn.length === aLength + const bLength = bLinesIn.length; // Validate: bLinesUn.length === bLength + + const isCommon = (aIndex, bIndex) => aLinesUn[aIndex] === bLinesUn[bIndex]; + + // Only because the GitHub Flavored Markdown doc collapses adjacent spaces, + // this example code and the following table represent spaces as middle dots. + let aIndex = 0; + let bIndex = 0; + const array = []; + const foundSubsequence = (nCommon, aCommon, bCommon) => { + for (; aIndex !== aCommon; aIndex += 1) { + array.push(`-·${aLinesIn[aIndex]}`); // delete is minus + } + for (; bIndex !== bCommon; bIndex += 1) { + array.push(`+·${bLinesIn[bIndex]}`); // insert is plus + } + for (; nCommon !== 0; nCommon -= 1, aIndex += 1, bIndex += 1) { + // For common lines, received indentation seems more intuitive. + array.push(`··${bLinesIn[bIndex]}`); // common is space + } + }; + + diff(aLength, bLength, isCommon, foundSubsequence); + + // After the last common subsequence, push remaining change lines. + for (; aIndex !== aLength; aIndex += 1) { + array.push(`-·${aLinesIn[aIndex]}`); + } + for (; bIndex !== bLength; bIndex += 1) { + array.push(`+·${bLinesIn[bIndex]}`); + } + + return array; +}; + +const expected = { + searching: '', + sorting: { + ascending: true, + fieldKey: 'what', + }, +}; +const received = { + searching: '', + sorting: [ + { + descending: false, + fieldKey: 'what', + }, + ], +}; + +const diffLines = formatDiffLines(expected, received); +``` + +If N is the sum of lengths of sequences and L is length of a longest common subsequence, then N – L is length of an array of diff lines. In this example, N is 7 + 9, L is 5, and N – L is 11. + +| `i` | `diffLines[i]` | `aIndex` | `bIndex` | +| ---: | :--------------------------------- | -------: | -------: | +| `0` | `'··Object {'` | `0` | `0` | +| `1` | `'····"searching": "",'` | `1` | `1` | +| `2` | `'-···"sorting": Object {'` | `2` | | +| `3` | `'-·····"ascending": true,'` | `3` | | +| `4` | `'+·····"sorting": Array ['` | | `2` | +| `5` | `'+·······Object {'` | | `3` | +| `6` | `'+·········"descending": false,'` | | `4` | +| `7` | `'··········"fieldKey": "what",'` | `4` | `5` | +| `8` | `'········},'` | `5` | `6` | +| `9` | `'+·····],'` | | `7` | +| `10` | `'··}'` | `6` | `8` | + +## Example of callback functions to find diff items + +Here is simplified code to find changed and unchanged substrings **within adjacent changed lines** in expected and received values after a test fails in Jest: + +```js +// Return diff items for strings (compatible with diff-match-patch package). +const findDiffItems = (a, b) => { + const isCommon = (aIndex, bIndex) => a[aIndex] === b[bIndex]; + + let aIndex = 0; + let bIndex = 0; + const array = []; + const foundSubsequence = (nCommon, aCommon, bCommon) => { + if (aIndex !== aCommon) { + array.push([-1, a.slice(aIndex, aCommon)]); // delete is -1 + } + if (bIndex !== bCommon) { + array.push([1, b.slice(bIndex, bCommon)]); // insert is 1 + } + + aIndex = aCommon + nCommon; // number of characters compared in a + bIndex = bCommon + nCommon; // number of characters compared in b + array.push([0, a.slice(aCommon, aIndex)]); // common is 0 + }; + + diff(a.length, b.length, isCommon, foundSubsequence); + + // After the last common subsequence, push remaining change items. + if (aIndex !== a.length) { + array.push([-1, a.slice(aIndex)]); + } + if (bIndex !== b.length) { + array.push([1, b.slice(bIndex)]); + } + + return array; +}; + +const expectedDeleted = ['"sorting": Object {', '"ascending": true,'].join( + '\n', +); +const receivedInserted = [ + '"sorting": Array [', + 'Object {', + '"descending": false,', +].join('\n'); + +const diffItems = findDiffItems(expectedDeleted, receivedInserted); +``` + +| `i` | `diffItems[i][0]` | `diffItems[i][1]` | +| --: | ----------------: | :---------------- | +| `0` | `0` | `'"sorting": '` | +| `1` | `1` | `'Array [\n'` | +| `2` | `0` | `'Object {\n"'` | +| `3` | `-1` | `'a'` | +| `4` | `1` | `'de'` | +| `5` | `0` | `'scending": '` | +| `6` | `-1` | `'tru'` | +| `7` | `1` | `'fals'` | +| `8` | `0` | `'e,'` | + +The length difference `b.length - a.length` is equal to the sum of `diffItems[i][0]` values times `diffItems[i][1]` lengths. In this example, the difference `48 - 38` is equal to the sum `10`. + +| category of diff item | `[0]` | `[1]` lengths | subtotal | +| :-------------------- | ----: | -----------------: | -------: | +| in common | `0` | `11 + 10 + 11 + 2` | `0` | +| to delete from `a` | `–1` | `1 + 3` | `-4` | +| to insert from `b` | `1` | `8 + 2 + 4` | `14` | + +Instead of formatting the changed substrings with escape codes for colors in the `foundSubsequence` function to save memory, this example spends memory to **gain flexibility** before formatting, so a separate heuristic algorithm might modify the generic array of diff items to show changes more clearly: + +| `i` | `diffItems[i][0]` | `diffItems[i][1]` | +| --: | ----------------: | :---------------- | +| `6` | `-1` | `'true'` | +| `7` | `1` | `'false'` | +| `8` | `0` | `','` | + +For expected and received strings of serialized data, the result of finding changed **lines**, and then finding changed **substrings** within adjacent changed lines (as in the preceding two examples) sometimes displays the changes in a more intuitive way than the result of finding changed substrings, and then splitting them into changed and unchanged lines. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/package.json new file mode 100644 index 0000000..0324bab --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/diff-sequences/package.json @@ -0,0 +1,39 @@ +{ + "name": "diff-sequences", + "version": "29.6.3", + "repository": { + "type": "git", + "url": "https://github.com/jestjs/jest.git", + "directory": "packages/diff-sequences" + }, + "license": "MIT", + "description": "Compare items in two sequences to find a longest common subsequence", + "keywords": [ + "fast", + "linear", + "space", + "callback", + "diff" + ], + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "main": "./build/index.js", + "types": "./build/index.d.ts", + "exports": { + ".": { + "types": "./build/index.d.ts", + "default": "./build/index.js" + }, + "./package.json": "./package.json" + }, + "devDependencies": { + "@fast-check/jest": "^1.3.0", + "benchmark": "^2.1.4", + "diff": "^5.0.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "fb7d95c8af6e0d65a8b65348433d8a0ea0725b5b" +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/LICENSE b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/LICENSE new file mode 100644 index 0000000..63b6209 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2015-20 [these people](https://github.com/Rich-Harris/estree-walker/graphs/contributors) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/README.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/README.md new file mode 100644 index 0000000..d739d1b --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/README.md @@ -0,0 +1,48 @@ +# estree-walker + +Simple utility for walking an [ESTree](https://github.com/estree/estree)-compliant AST, such as one generated by [acorn](https://github.com/marijnh/acorn). + + +## Installation + +```bash +npm i estree-walker +``` + + +## Usage + +```js +var walk = require('estree-walker').walk; +var acorn = require('acorn'); + +ast = acorn.parse(sourceCode, options); // https://github.com/acornjs/acorn + +walk(ast, { + enter(node, parent, prop, index) { + // some code happens + }, + leave(node, parent, prop, index) { + // some code happens + } +}); +``` + +Inside the `enter` function, calling `this.skip()` will prevent the node's children being walked, or the `leave` function (which is optional) being called. + +Call `this.replace(new_node)` in either `enter` or `leave` to replace the current node with a new one. + +Call `this.remove()` in either `enter` or `leave` to remove the current node. + +## Why not use estraverse? + +The ESTree spec is evolving to accommodate ES6/7. I've had a couple of experiences where [estraverse](https://github.com/estools/estraverse) was unable to handle an AST generated by recent versions of acorn, because it hard-codes visitor keys. + +estree-walker, by contrast, simply enumerates a node's properties to find child nodes (and child lists of nodes), and is therefore resistant to spec changes. It's also much smaller. (The performance, if you're wondering, is basically identical.) + +None of which should be taken as criticism of estraverse, which has more features and has been battle-tested in many more situations, and for which I'm very grateful. + + +## License + +MIT diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/package.json new file mode 100644 index 0000000..c9f54ed --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/package.json @@ -0,0 +1,38 @@ +{ + "name": "estree-walker", + "description": "Traverse an ESTree-compliant AST", + "version": "3.0.3", + "private": false, + "author": "Rich Harris", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/Rich-Harris/estree-walker" + }, + "type": "module", + "module": "./src/index.js", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./types/index.d.ts", + "import": "./src/index.js" + } + }, + "types": "types/index.d.ts", + "scripts": { + "prepublishOnly": "tsc && npm test", + "test": "uvu test" + }, + "dependencies": { + "@types/estree": "^1.0.0" + }, + "devDependencies": { + "typescript": "^4.9.0", + "uvu": "^0.5.1" + }, + "files": [ + "src", + "types", + "README.md" + ] +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/async.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/async.js new file mode 100644 index 0000000..f068c71 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/async.js @@ -0,0 +1,152 @@ +import { WalkerBase } from './walker.js'; + +/** + * @typedef { import('estree').Node} Node + * @typedef { import('./walker.js').WalkerContext} WalkerContext + * @typedef {( + * this: WalkerContext, + * node: Node, + * parent: Node | null, + * key: string | number | symbol | null | undefined, + * index: number | null | undefined + * ) => Promise} AsyncHandler + */ + +export class AsyncWalker extends WalkerBase { + /** + * + * @param {AsyncHandler} [enter] + * @param {AsyncHandler} [leave] + */ + constructor(enter, leave) { + super(); + + /** @type {boolean} */ + this.should_skip = false; + + /** @type {boolean} */ + this.should_remove = false; + + /** @type {Node | null} */ + this.replacement = null; + + /** @type {WalkerContext} */ + this.context = { + skip: () => (this.should_skip = true), + remove: () => (this.should_remove = true), + replace: (node) => (this.replacement = node) + }; + + /** @type {AsyncHandler | undefined} */ + this.enter = enter; + + /** @type {AsyncHandler | undefined} */ + this.leave = leave; + } + + /** + * @template {Node} Parent + * @param {Node} node + * @param {Parent | null} parent + * @param {keyof Parent} [prop] + * @param {number | null} [index] + * @returns {Promise} + */ + async visit(node, parent, prop, index) { + if (node) { + if (this.enter) { + const _should_skip = this.should_skip; + const _should_remove = this.should_remove; + const _replacement = this.replacement; + this.should_skip = false; + this.should_remove = false; + this.replacement = null; + + await this.enter.call(this.context, node, parent, prop, index); + + if (this.replacement) { + node = this.replacement; + this.replace(parent, prop, index, node); + } + + if (this.should_remove) { + this.remove(parent, prop, index); + } + + const skipped = this.should_skip; + const removed = this.should_remove; + + this.should_skip = _should_skip; + this.should_remove = _should_remove; + this.replacement = _replacement; + + if (skipped) return node; + if (removed) return null; + } + + /** @type {keyof Node} */ + let key; + + for (key in node) { + /** @type {unknown} */ + const value = node[key]; + + if (value && typeof value === 'object') { + if (Array.isArray(value)) { + const nodes = /** @type {Array} */ (value); + for (let i = 0; i < nodes.length; i += 1) { + const item = nodes[i]; + if (isNode(item)) { + if (!(await this.visit(item, node, key, i))) { + // removed + i--; + } + } + } + } else if (isNode(value)) { + await this.visit(value, node, key, null); + } + } + } + + if (this.leave) { + const _replacement = this.replacement; + const _should_remove = this.should_remove; + this.replacement = null; + this.should_remove = false; + + await this.leave.call(this.context, node, parent, prop, index); + + if (this.replacement) { + node = this.replacement; + this.replace(parent, prop, index, node); + } + + if (this.should_remove) { + this.remove(parent, prop, index); + } + + const removed = this.should_remove; + + this.replacement = _replacement; + this.should_remove = _should_remove; + + if (removed) return null; + } + } + + return node; + } +} + +/** + * Ducktype a node. + * + * @param {unknown} value + * @returns {value is Node} + */ +function isNode(value) { + return ( + value !== null && typeof value === 'object' && 'type' in value && typeof value.type === 'string' + ); +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/index.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/index.js new file mode 100644 index 0000000..933ea4f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/index.js @@ -0,0 +1,34 @@ +import { SyncWalker } from './sync.js'; +import { AsyncWalker } from './async.js'; + +/** + * @typedef {import('estree').Node} Node + * @typedef {import('./sync.js').SyncHandler} SyncHandler + * @typedef {import('./async.js').AsyncHandler} AsyncHandler + */ + +/** + * @param {Node} ast + * @param {{ + * enter?: SyncHandler + * leave?: SyncHandler + * }} walker + * @returns {Node | null} + */ +export function walk(ast, { enter, leave }) { + const instance = new SyncWalker(enter, leave); + return instance.visit(ast, null); +} + +/** + * @param {Node} ast + * @param {{ + * enter?: AsyncHandler + * leave?: AsyncHandler + * }} walker + * @returns {Promise} + */ +export async function asyncWalk(ast, { enter, leave }) { + const instance = new AsyncWalker(enter, leave); + return await instance.visit(ast, null); +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/sync.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/sync.js new file mode 100644 index 0000000..171fb36 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/sync.js @@ -0,0 +1,152 @@ +import { WalkerBase } from './walker.js'; + +/** + * @typedef { import('estree').Node} Node + * @typedef { import('./walker.js').WalkerContext} WalkerContext + * @typedef {( + * this: WalkerContext, + * node: Node, + * parent: Node | null, + * key: string | number | symbol | null | undefined, + * index: number | null | undefined + * ) => void} SyncHandler + */ + +export class SyncWalker extends WalkerBase { + /** + * + * @param {SyncHandler} [enter] + * @param {SyncHandler} [leave] + */ + constructor(enter, leave) { + super(); + + /** @type {boolean} */ + this.should_skip = false; + + /** @type {boolean} */ + this.should_remove = false; + + /** @type {Node | null} */ + this.replacement = null; + + /** @type {WalkerContext} */ + this.context = { + skip: () => (this.should_skip = true), + remove: () => (this.should_remove = true), + replace: (node) => (this.replacement = node) + }; + + /** @type {SyncHandler | undefined} */ + this.enter = enter; + + /** @type {SyncHandler | undefined} */ + this.leave = leave; + } + + /** + * @template {Node} Parent + * @param {Node} node + * @param {Parent | null} parent + * @param {keyof Parent} [prop] + * @param {number | null} [index] + * @returns {Node | null} + */ + visit(node, parent, prop, index) { + if (node) { + if (this.enter) { + const _should_skip = this.should_skip; + const _should_remove = this.should_remove; + const _replacement = this.replacement; + this.should_skip = false; + this.should_remove = false; + this.replacement = null; + + this.enter.call(this.context, node, parent, prop, index); + + if (this.replacement) { + node = this.replacement; + this.replace(parent, prop, index, node); + } + + if (this.should_remove) { + this.remove(parent, prop, index); + } + + const skipped = this.should_skip; + const removed = this.should_remove; + + this.should_skip = _should_skip; + this.should_remove = _should_remove; + this.replacement = _replacement; + + if (skipped) return node; + if (removed) return null; + } + + /** @type {keyof Node} */ + let key; + + for (key in node) { + /** @type {unknown} */ + const value = node[key]; + + if (value && typeof value === 'object') { + if (Array.isArray(value)) { + const nodes = /** @type {Array} */ (value); + for (let i = 0; i < nodes.length; i += 1) { + const item = nodes[i]; + if (isNode(item)) { + if (!this.visit(item, node, key, i)) { + // removed + i--; + } + } + } + } else if (isNode(value)) { + this.visit(value, node, key, null); + } + } + } + + if (this.leave) { + const _replacement = this.replacement; + const _should_remove = this.should_remove; + this.replacement = null; + this.should_remove = false; + + this.leave.call(this.context, node, parent, prop, index); + + if (this.replacement) { + node = this.replacement; + this.replace(parent, prop, index, node); + } + + if (this.should_remove) { + this.remove(parent, prop, index); + } + + const removed = this.should_remove; + + this.replacement = _replacement; + this.should_remove = _should_remove; + + if (removed) return null; + } + } + + return node; + } +} + +/** + * Ducktype a node. + * + * @param {unknown} value + * @returns {value is Node} + */ +function isNode(value) { + return ( + value !== null && typeof value === 'object' && 'type' in value && typeof value.type === 'string' + ); +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/walker.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/walker.js new file mode 100644 index 0000000..6dc6bd7 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/src/walker.js @@ -0,0 +1,61 @@ +/** + * @typedef { import('estree').Node} Node + * @typedef {{ + * skip: () => void; + * remove: () => void; + * replace: (node: Node) => void; + * }} WalkerContext + */ + +export class WalkerBase { + constructor() { + /** @type {boolean} */ + this.should_skip = false; + + /** @type {boolean} */ + this.should_remove = false; + + /** @type {Node | null} */ + this.replacement = null; + + /** @type {WalkerContext} */ + this.context = { + skip: () => (this.should_skip = true), + remove: () => (this.should_remove = true), + replace: (node) => (this.replacement = node) + }; + } + + /** + * @template {Node} Parent + * @param {Parent | null | undefined} parent + * @param {keyof Parent | null | undefined} prop + * @param {number | null | undefined} index + * @param {Node} node + */ + replace(parent, prop, index, node) { + if (parent && prop) { + if (index != null) { + /** @type {Array} */ (parent[prop])[index] = node; + } else { + /** @type {Node} */ (parent[prop]) = node; + } + } + } + + /** + * @template {Node} Parent + * @param {Parent | null | undefined} parent + * @param {keyof Parent | null | undefined} prop + * @param {number | null | undefined} index + */ + remove(parent, prop, index) { + if (parent && prop) { + if (index !== null && index !== undefined) { + /** @type {Array} */ (parent[prop]).splice(index, 1); + } else { + delete parent[prop]; + } + } + } +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/async.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/async.d.ts new file mode 100644 index 0000000..db0825a --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/async.d.ts @@ -0,0 +1,36 @@ +/** + * @typedef { import('estree').Node} Node + * @typedef { import('./walker.js').WalkerContext} WalkerContext + * @typedef {( + * this: WalkerContext, + * node: Node, + * parent: Node | null, + * key: string | number | symbol | null | undefined, + * index: number | null | undefined + * ) => Promise} AsyncHandler + */ +export class AsyncWalker extends WalkerBase { + /** + * + * @param {AsyncHandler} [enter] + * @param {AsyncHandler} [leave] + */ + constructor(enter?: AsyncHandler | undefined, leave?: AsyncHandler | undefined); + /** @type {AsyncHandler | undefined} */ + enter: AsyncHandler | undefined; + /** @type {AsyncHandler | undefined} */ + leave: AsyncHandler | undefined; + /** + * @template {Node} Parent + * @param {Node} node + * @param {Parent | null} parent + * @param {keyof Parent} [prop] + * @param {number | null} [index] + * @returns {Promise} + */ + visit(node: Node, parent: Parent | null, prop?: keyof Parent | undefined, index?: number | null | undefined): Promise; +} +export type Node = import('estree').Node; +export type WalkerContext = import('./walker.js').WalkerContext; +export type AsyncHandler = (this: WalkerContext, node: Node, parent: Node | null, key: string | number | symbol | null | undefined, index: number | null | undefined) => Promise; +import { WalkerBase } from "./walker.js"; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/index.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/index.d.ts new file mode 100644 index 0000000..c25afed --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/index.d.ts @@ -0,0 +1,32 @@ +/** + * @typedef {import('estree').Node} Node + * @typedef {import('./sync.js').SyncHandler} SyncHandler + * @typedef {import('./async.js').AsyncHandler} AsyncHandler + */ +/** + * @param {Node} ast + * @param {{ + * enter?: SyncHandler + * leave?: SyncHandler + * }} walker + * @returns {Node | null} + */ +export function walk(ast: Node, { enter, leave }: { + enter?: SyncHandler; + leave?: SyncHandler; +}): Node | null; +/** + * @param {Node} ast + * @param {{ + * enter?: AsyncHandler + * leave?: AsyncHandler + * }} walker + * @returns {Promise} + */ +export function asyncWalk(ast: Node, { enter, leave }: { + enter?: AsyncHandler; + leave?: AsyncHandler; +}): Promise; +export type Node = import('estree').Node; +export type SyncHandler = import('./sync.js').SyncHandler; +export type AsyncHandler = import('./async.js').AsyncHandler; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/sync.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/sync.d.ts new file mode 100644 index 0000000..3612b7f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/sync.d.ts @@ -0,0 +1,36 @@ +/** + * @typedef { import('estree').Node} Node + * @typedef { import('./walker.js').WalkerContext} WalkerContext + * @typedef {( + * this: WalkerContext, + * node: Node, + * parent: Node | null, + * key: string | number | symbol | null | undefined, + * index: number | null | undefined + * ) => void} SyncHandler + */ +export class SyncWalker extends WalkerBase { + /** + * + * @param {SyncHandler} [enter] + * @param {SyncHandler} [leave] + */ + constructor(enter?: SyncHandler | undefined, leave?: SyncHandler | undefined); + /** @type {SyncHandler | undefined} */ + enter: SyncHandler | undefined; + /** @type {SyncHandler | undefined} */ + leave: SyncHandler | undefined; + /** + * @template {Node} Parent + * @param {Node} node + * @param {Parent | null} parent + * @param {keyof Parent} [prop] + * @param {number | null} [index] + * @returns {Node | null} + */ + visit(node: Node, parent: Parent | null, prop?: keyof Parent | undefined, index?: number | null | undefined): Node | null; +} +export type Node = import('estree').Node; +export type WalkerContext = import('./walker.js').WalkerContext; +export type SyncHandler = (this: WalkerContext, node: Node, parent: Node | null, key: string | number | symbol | null | undefined, index: number | null | undefined) => void; +import { WalkerBase } from "./walker.js"; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/walker.d.ts b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/walker.d.ts new file mode 100644 index 0000000..a3fa29c --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/estree-walker/types/walker.d.ts @@ -0,0 +1,39 @@ +/** + * @typedef { import('estree').Node} Node + * @typedef {{ + * skip: () => void; + * remove: () => void; + * replace: (node: Node) => void; + * }} WalkerContext + */ +export class WalkerBase { + /** @type {boolean} */ + should_skip: boolean; + /** @type {boolean} */ + should_remove: boolean; + /** @type {Node | null} */ + replacement: Node | null; + /** @type {WalkerContext} */ + context: WalkerContext; + /** + * @template {Node} Parent + * @param {Parent | null | undefined} parent + * @param {keyof Parent | null | undefined} prop + * @param {number | null | undefined} index + * @param {Node} node + */ + replace(parent: Parent | null | undefined, prop: keyof Parent | null | undefined, index: number | null | undefined, node: Node): void; + /** + * @template {Node} Parent + * @param {Parent | null | undefined} parent + * @param {keyof Parent | null | undefined} prop + * @param {number | null | undefined} index + */ + remove(parent: Parent_1 | null | undefined, prop: keyof Parent_1 | null | undefined, index: number | null | undefined): void; +} +export type Node = import('estree').Node; +export type WalkerContext = { + skip: () => void; + remove: () => void; + replace: (node: Node) => void; +}; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/LICENSE b/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/LICENSE new file mode 100644 index 0000000..7ea799f --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013 Jake Luer (http://alogicalparadox.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/README.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/README.md new file mode 100644 index 0000000..e908416 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/README.md @@ -0,0 +1,123 @@ +

+ + ChaiJS +
+ get-func-name +
+

+ +

+ Utility for getting a function's name for node and the browser. +

+ +

+ + license:mit + + + tag:? + + + build:? + + + coverage:? + + + npm:? + + + dependencies:? + + + devDependencies:? + +
+ + Selenium Test Status + +
+ + Join the Slack chat + + + Join the Gitter chat + +

+ +## What is get-func-name? + +This is a module to retrieve a function's name securely and consistently both in NodeJS and the browser. + +## Installation + +### Node.js + +`get-func-name` is available on [npm](http://npmjs.org). To install it, type: + + $ npm install get-func-name + +### Browsers + +You can also use it within the browser; install via npm and use the `get-func-name.js` file found within the download. For example: + +```html + +``` + +## Usage + +The module `get-func-name` exports the following method: + +* `getFuncName(fn)` - Returns the name of a function. + +```js +var getFuncName = require('get-func-name'); +``` + +#### .getFuncName(fun) + +```js +var getFuncName = require('get-func-name'); + +var unknownFunction = function myCoolFunction(word) { + return word + 'is cool'; +}; + +var anonymousFunction = (function () { + return function () {}; +}()); + +getFuncName(unknownFunction) // 'myCoolFunction' +getFuncName(anonymousFunction) // '' +``` diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/get-func-name.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/get-func-name.js new file mode 100644 index 0000000..0070ed4 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/get-func-name.js @@ -0,0 +1 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i + * MIT Licensed + */ + +/** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + +var toString = Function.prototype.toString; +var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; +var maxFunctionSourceLength = 512; +function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // eslint-disable-next-line prefer-reflect + var functionSource = toString.call(aFunc); + // To avoid unconstrained resource consumption due to pathalogically large function names, + // we limit the available return value to be less than 512 characters. + if (functionSource.indexOf('(') > maxFunctionSourceLength) { + return name; + } + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = functionSource.match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; +} + +module.exports = getFuncName; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/package.json new file mode 100644 index 0000000..0eb8838 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/get-func-name/package.json @@ -0,0 +1,85 @@ +{ + "name": "get-func-name", + "version": "2.0.2", + "description": "Utility for getting a function's name for node and the browser", + "keywords": [ + "get-func-name", + "chai util" + ], + "license": "MIT", + "author": "Jake Luer (http://alogicalparadox.com)", + "contributors": [ + "Keith Cirkel (https://github.com/keithamus)", + "Lucas Fernandes da Costa (https://github.com/lucasfcosta)", + "Grant Snodgrass (https://github.com/meeber)", + "Lucas Vieira (https://github.com/vieiralucas)", + "Aleksey Shvayka (https://github.com/shvaikalesh)" + ], + "files": [ + "index.js", + "get-func-name.js" + ], + "main": "./index.js", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/chaijs/get-func-name.git" + }, + "scripts": { + "build": "browserify --bare $npm_package_main --standalone getFuncName -o get-func-name.js", + "lint": "eslint --ignore-path .gitignore .", + "prepublish": "npm run build", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "pretest": "npm run lint", + "test": "npm run test:node && npm run test:browser && npm run upload-coverage", + "test:browser": "karma start --singleRun=true", + "test:node": "istanbul cover _mocha", + "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0" + }, + "config": { + "ghooks": { + "commit-msg": "validate-commit-msg" + } + }, + "eslintConfig": { + "extends": [ + "strict/es5" + ], + "env": { + "es6": true + }, + "globals": { + "HTMLElement": false + }, + "rules": { + "complexity": 0, + "max-statements": 0 + } + }, + "dependencies": {}, + "devDependencies": { + "browserify": "^13.0.0", + "browserify-istanbul": "^2.0.0", + "coveralls": "2.11.14", + "eslint": "^2.4.0", + "eslint-config-strict": "^9.1.0", + "eslint-plugin-filenames": "^1.1.0", + "ghooks": "^1.0.1", + "istanbul": "^0.4.2", + "karma": "^1.3.0", + "karma-browserify": "^5.0.2", + "karma-coverage": "^1.1.1", + "karma-mocha": "^1.2.0", + "karma-phantomjs-launcher": "^1.0.0", + "karma-sauce-launcher": "^1.0.0", + "lcov-result-merger": "^1.0.2", + "mocha": "^3.1.2", + "phantomjs-prebuilt": "^2.1.5", + "semantic-release": "^4.3.5", + "simple-assert": "^1.0.0", + "travis-after-all": "^1.4.4", + "validate-commit-msg": "^2.3.1" + }, + "engines": { + "node": "*" + } +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/CHANGELOG.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/CHANGELOG.md new file mode 100644 index 0000000..11799db --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/CHANGELOG.md @@ -0,0 +1,5 @@ + +0.0.1 / 2013-12-17 +================== + + * Initial port from chai.js diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/LICENSE b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/LICENSE new file mode 100644 index 0000000..b0c8a5a --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/LICENSE @@ -0,0 +1,9 @@ +(The MIT License) + +Copyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/README.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/README.md new file mode 100644 index 0000000..44f61d3 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/README.md @@ -0,0 +1,63 @@ +![npm](https://img.shields.io/npm/v/loupe?logo=npm) +![Build](https://github.com/chaijs/loupe/workflows/Build/badge.svg?branch=master) +![Codecov branch](https://img.shields.io/codecov/c/github/chaijs/loupe/master?logo=codecov) + +# What is loupe? + +Loupe turns the object you give it into a string. It's similar to Node.js' `util.inspect()` function, but it works cross platform, in most modern browsers as well as Node. + +## Installation + +### Node.js + +`loupe` is available on [npm](http://npmjs.org). To install it, type: + + $ npm install loupe + +### Browsers + +You can also use it within the browser; install via npm and use the `loupe.js` file found within the download. For example: + +```html + +``` + +## Usage + +``` js +const { inspect } = require('loupe'); +``` + +```js +inspect({ foo: 'bar' }); // => "{ foo: 'bar' }" +inspect(1); // => '1' +inspect('foo'); // => "'foo'" +inspect([ 1, 2, 3 ]); // => '[ 1, 2, 3 ]' +inspect(/Test/g); // => '/Test/g' + +// ... +``` + +## Tests + +```bash +$ npm test +``` + +Coverage: + +```bash +$ npm run upload-coverage +``` + +## License + +(The MIT License) + +Copyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/index.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/index.js new file mode 100644 index 0000000..01e0b3c --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/index.js @@ -0,0 +1,219 @@ +/* ! + * loupe + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +import inspectArray from './lib/array' +import inspectTypedArray from './lib/typedarray' +import inspectDate from './lib/date' +import inspectFunction from './lib/function' +import inspectMap from './lib/map' +import inspectNumber from './lib/number' +import inspectBigInt from './lib/bigint' +import inspectRegExp from './lib/regexp' +import inspectSet from './lib/set' +import inspectString from './lib/string' +import inspectSymbol from './lib/symbol' +import inspectPromise from './lib/promise' +import inspectClass from './lib/class' +import inspectObject from './lib/object' +import inspectArguments from './lib/arguments' +import inspectError from './lib/error' +import inspectHTMLElement, { inspectHTMLCollection } from './lib/html' + +import { normaliseOptions } from './lib/helpers' + +const symbolsSupported = typeof Symbol === 'function' && typeof Symbol.for === 'function' +const chaiInspect = symbolsSupported ? Symbol.for('chai/inspect') : '@@chai/inspect' +let nodeInspect = false +try { + // eslint-disable-next-line global-require + const nodeUtil = require('util') + nodeInspect = nodeUtil.inspect ? nodeUtil.inspect.custom : false +} catch (noNodeInspect) { + nodeInspect = false +} + +function FakeMap() { + // eslint-disable-next-line prefer-template + this.key = 'chai/loupe__' + Math.random() + Date.now() +} +FakeMap.prototype = { + // eslint-disable-next-line object-shorthand + get: function get(key) { + return key[this.key] + }, + // eslint-disable-next-line object-shorthand + has: function has(key) { + return this.key in key + }, + // eslint-disable-next-line object-shorthand + set: function set(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this.key, { + // eslint-disable-next-line object-shorthand + value: value, + configurable: true, + }) + } + }, +} +const constructorMap = new (typeof WeakMap === 'function' ? WeakMap : FakeMap)() +const stringTagMap = {} +const baseTypesMap = { + undefined: (value, options) => options.stylize('undefined', 'undefined'), + null: (value, options) => options.stylize(null, 'null'), + + boolean: (value, options) => options.stylize(value, 'boolean'), + Boolean: (value, options) => options.stylize(value, 'boolean'), + + number: inspectNumber, + Number: inspectNumber, + + bigint: inspectBigInt, + BigInt: inspectBigInt, + + string: inspectString, + String: inspectString, + + function: inspectFunction, + Function: inspectFunction, + + symbol: inspectSymbol, + // A Symbol polyfill will return `Symbol` not `symbol` from typedetect + Symbol: inspectSymbol, + + Array: inspectArray, + Date: inspectDate, + Map: inspectMap, + Set: inspectSet, + RegExp: inspectRegExp, + Promise: inspectPromise, + + // WeakSet, WeakMap are totally opaque to us + WeakSet: (value, options) => options.stylize('WeakSet{…}', 'special'), + WeakMap: (value, options) => options.stylize('WeakMap{…}', 'special'), + + Arguments: inspectArguments, + Int8Array: inspectTypedArray, + Uint8Array: inspectTypedArray, + Uint8ClampedArray: inspectTypedArray, + Int16Array: inspectTypedArray, + Uint16Array: inspectTypedArray, + Int32Array: inspectTypedArray, + Uint32Array: inspectTypedArray, + Float32Array: inspectTypedArray, + Float64Array: inspectTypedArray, + + Generator: () => '', + DataView: () => '', + ArrayBuffer: () => '', + + Error: inspectError, + + HTMLCollection: inspectHTMLCollection, + NodeList: inspectHTMLCollection, +} + +// eslint-disable-next-line complexity +const inspectCustom = (value, options, type) => { + if (chaiInspect in value && typeof value[chaiInspect] === 'function') { + return value[chaiInspect](options) + } + + if (nodeInspect && nodeInspect in value && typeof value[nodeInspect] === 'function') { + return value[nodeInspect](options.depth, options) + } + + if ('inspect' in value && typeof value.inspect === 'function') { + return value.inspect(options.depth, options) + } + + if ('constructor' in value && constructorMap.has(value.constructor)) { + return constructorMap.get(value.constructor)(value, options) + } + + if (stringTagMap[type]) { + return stringTagMap[type](value, options) + } + + return '' +} + +const toString = Object.prototype.toString + +// eslint-disable-next-line complexity +export function inspect(value, options) { + options = normaliseOptions(options) + options.inspect = inspect + const { customInspect } = options + let type = value === null ? 'null' : typeof value + if (type === 'object') { + type = toString.call(value).slice(8, -1) + } + + // If it is a base value that we already support, then use Loupe's inspector + if (baseTypesMap[type]) { + return baseTypesMap[type](value, options) + } + + // If `options.customInspect` is set to true then try to use the custom inspector + if (customInspect && value) { + const output = inspectCustom(value, options, type) + if (output) { + if (typeof output === 'string') return output + return inspect(output, options) + } + } + + const proto = value ? Object.getPrototypeOf(value) : false + // If it's a plain Object then use Loupe's inspector + if (proto === Object.prototype || proto === null) { + return inspectObject(value, options) + } + + // Specifically account for HTMLElements + // eslint-disable-next-line no-undef + if (value && typeof HTMLElement === 'function' && value instanceof HTMLElement) { + return inspectHTMLElement(value, options) + } + + if ('constructor' in value) { + // If it is a class, inspect it like an object but add the constructor name + if (value.constructor !== Object) { + return inspectClass(value, options) + } + + // If it is an object with an anonymous prototype, display it as an object. + return inspectObject(value, options) + } + + // last chance to check if it's an object + if (value === Object(value)) { + return inspectObject(value, options) + } + + // We have run out of options! Just stringify the value + return options.stylize(String(value), type) +} + +export function registerConstructor(constructor, inspector) { + if (constructorMap.has(constructor)) { + return false + } + constructorMap.set(constructor, inspector) + return true +} + +export function registerStringTag(stringTag, inspector) { + if (stringTag in stringTagMap) { + return false + } + stringTagMap[stringTag] = inspector + return true +} + +export const custom = chaiInspect + +export default inspect diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/loupe.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/loupe.js new file mode 100644 index 0000000..5e1c239 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/loupe.js @@ -0,0 +1,891 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.loupe = {})); +}(this, (function (exports) { 'use strict'; + + function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArrayLimit(arr, i) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var ansiColors = { + bold: ['1', '22'], + dim: ['2', '22'], + italic: ['3', '23'], + underline: ['4', '24'], + // 5 & 6 are blinking + inverse: ['7', '27'], + hidden: ['8', '28'], + strike: ['9', '29'], + // 10-20 are fonts + // 21-29 are resets for 1-9 + black: ['30', '39'], + red: ['31', '39'], + green: ['32', '39'], + yellow: ['33', '39'], + blue: ['34', '39'], + magenta: ['35', '39'], + cyan: ['36', '39'], + white: ['37', '39'], + brightblack: ['30;1', '39'], + brightred: ['31;1', '39'], + brightgreen: ['32;1', '39'], + brightyellow: ['33;1', '39'], + brightblue: ['34;1', '39'], + brightmagenta: ['35;1', '39'], + brightcyan: ['36;1', '39'], + brightwhite: ['37;1', '39'], + grey: ['90', '39'] + }; + var styles = { + special: 'cyan', + number: 'yellow', + bigint: 'yellow', + boolean: 'yellow', + undefined: 'grey', + null: 'bold', + string: 'green', + symbol: 'green', + date: 'magenta', + regexp: 'red' + }; + var truncator = '…'; + + function colorise(value, styleType) { + var color = ansiColors[styles[styleType]] || ansiColors[styleType]; + + if (!color) { + return String(value); + } + + return "\x1B[".concat(color[0], "m").concat(String(value), "\x1B[").concat(color[1], "m"); + } + + function normaliseOptions() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$showHidden = _ref.showHidden, + showHidden = _ref$showHidden === void 0 ? false : _ref$showHidden, + _ref$depth = _ref.depth, + depth = _ref$depth === void 0 ? 2 : _ref$depth, + _ref$colors = _ref.colors, + colors = _ref$colors === void 0 ? false : _ref$colors, + _ref$customInspect = _ref.customInspect, + customInspect = _ref$customInspect === void 0 ? true : _ref$customInspect, + _ref$showProxy = _ref.showProxy, + showProxy = _ref$showProxy === void 0 ? false : _ref$showProxy, + _ref$maxArrayLength = _ref.maxArrayLength, + maxArrayLength = _ref$maxArrayLength === void 0 ? Infinity : _ref$maxArrayLength, + _ref$breakLength = _ref.breakLength, + breakLength = _ref$breakLength === void 0 ? Infinity : _ref$breakLength, + _ref$seen = _ref.seen, + seen = _ref$seen === void 0 ? [] : _ref$seen, + _ref$truncate = _ref.truncate, + truncate = _ref$truncate === void 0 ? Infinity : _ref$truncate, + _ref$stylize = _ref.stylize, + stylize = _ref$stylize === void 0 ? String : _ref$stylize; + + var options = { + showHidden: Boolean(showHidden), + depth: Number(depth), + colors: Boolean(colors), + customInspect: Boolean(customInspect), + showProxy: Boolean(showProxy), + maxArrayLength: Number(maxArrayLength), + breakLength: Number(breakLength), + truncate: Number(truncate), + seen: seen, + stylize: stylize + }; + + if (options.colors) { + options.stylize = colorise; + } + + return options; + } + function truncate(string, length) { + var tail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : truncator; + string = String(string); + var tailLength = tail.length; + var stringLength = string.length; + + if (tailLength > length && stringLength > tailLength) { + return tail; + } + + if (stringLength > length && stringLength > tailLength) { + return "".concat(string.slice(0, length - tailLength)).concat(tail); + } + + return string; + } // eslint-disable-next-line complexity + + function inspectList(list, options, inspectItem) { + var separator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ', '; + inspectItem = inspectItem || options.inspect; + var size = list.length; + if (size === 0) return ''; + var originalLength = options.truncate; + var output = ''; + var peek = ''; + var truncated = ''; + + for (var i = 0; i < size; i += 1) { + var last = i + 1 === list.length; + var secondToLast = i + 2 === list.length; + truncated = "".concat(truncator, "(").concat(list.length - i, ")"); + var value = list[i]; // If there is more than one remaining we need to account for a separator of `, ` + + options.truncate = originalLength - output.length - (last ? 0 : separator.length); + var string = peek || inspectItem(value, options) + (last ? '' : separator); + var nextLength = output.length + string.length; + var truncatedLength = nextLength + truncated.length; // If this is the last element, and adding it would + // take us over length, but adding the truncator wouldn't - then break now + + if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) { + break; + } // If this isn't the last or second to last element to scan, + // but the string is already over length then break here + + + if (!last && !secondToLast && truncatedLength > originalLength) { + break; + } // Peek at the next string to determine if we should + // break early before adding this item to the output + + + peek = last ? '' : inspectItem(list[i + 1], options) + (secondToLast ? '' : separator); // If we have one element left, but this element and + // the next takes over length, the break early + + if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) { + break; + } + + output += string; // If the next element takes us to length - + // but there are more after that, then we should truncate now + + if (!last && !secondToLast && nextLength + peek.length >= originalLength) { + truncated = "".concat(truncator, "(").concat(list.length - i - 1, ")"); + break; + } + + truncated = ''; + } + + return "".concat(output).concat(truncated); + } + + function quoteComplexKey(key) { + if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) { + return key; + } + + return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"); + } + + function inspectProperty(_ref2, options) { + var _ref3 = _slicedToArray(_ref2, 2), + key = _ref3[0], + value = _ref3[1]; + + options.truncate -= 2; + + if (typeof key === 'string') { + key = quoteComplexKey(key); + } else if (typeof key !== 'number') { + key = "[".concat(options.inspect(key, options), "]"); + } + + options.truncate -= key.length; + value = options.inspect(value, options); + return "".concat(key, ": ").concat(value); + } + + function inspectArray(array, options) { + // Object.keys will always output the Array indices first, so we can slice by + // `array.length` to get non-index properties + var nonIndexProperties = Object.keys(array).slice(array.length); + if (!array.length && !nonIndexProperties.length) return '[]'; + options.truncate -= 4; + var listContents = inspectList(array, options); + options.truncate -= listContents.length; + var propertyContents = ''; + + if (nonIndexProperties.length) { + propertyContents = inspectList(nonIndexProperties.map(function (key) { + return [key, array[key]]; + }), options, inspectProperty); + } + + return "[ ".concat(listContents).concat(propertyContents ? ", ".concat(propertyContents) : '', " ]"); + } + + /* ! + * Chai - getFuncName utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + + /** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + + var toString = Function.prototype.toString; + var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; + var maxFunctionSourceLength = 512; + function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // eslint-disable-next-line prefer-reflect + var functionSource = toString.call(aFunc); + // To avoid unconstrained resource consumption due to pathalogically large function names, + // we limit the available return value to be less than 512 characters. + if (functionSource.indexOf('(') > maxFunctionSourceLength) { + return name; + } + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = functionSource.match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; + } + + var getFuncName_1 = getFuncName; + + var getArrayName = function getArrayName(array) { + // We need to special case Node.js' Buffers, which report to be Uint8Array + if (typeof Buffer === 'function' && array instanceof Buffer) { + return 'Buffer'; + } + + if (array[Symbol.toStringTag]) { + return array[Symbol.toStringTag]; + } + + return getFuncName_1(array.constructor); + }; + + function inspectTypedArray(array, options) { + var name = getArrayName(array); + options.truncate -= name.length + 4; // Object.keys will always output the Array indices first, so we can slice by + // `array.length` to get non-index properties + + var nonIndexProperties = Object.keys(array).slice(array.length); + if (!array.length && !nonIndexProperties.length) return "".concat(name, "[]"); // As we know TypedArrays only contain Unsigned Integers, we can skip inspecting each one and simply + // stylise the toString() value of them + + var output = ''; + + for (var i = 0; i < array.length; i++) { + var string = "".concat(options.stylize(truncate(array[i], options.truncate), 'number')).concat(i === array.length - 1 ? '' : ', '); + options.truncate -= string.length; + + if (array[i] !== array.length && options.truncate <= 3) { + output += "".concat(truncator, "(").concat(array.length - array[i] + 1, ")"); + break; + } + + output += string; + } + + var propertyContents = ''; + + if (nonIndexProperties.length) { + propertyContents = inspectList(nonIndexProperties.map(function (key) { + return [key, array[key]]; + }), options, inspectProperty); + } + + return "".concat(name, "[ ").concat(output).concat(propertyContents ? ", ".concat(propertyContents) : '', " ]"); + } + + function inspectDate(dateObject, options) { + var stringRepresentation = dateObject.toJSON(); + + if (stringRepresentation === null) { + return 'Invalid Date'; + } + + var split = stringRepresentation.split('T'); + var date = split[0]; // If we need to - truncate the time portion, but never the date + + return options.stylize("".concat(date, "T").concat(truncate(split[1], options.truncate - date.length - 1)), 'date'); + } + + function inspectFunction(func, options) { + var name = getFuncName_1(func); + + if (!name) { + return options.stylize('[Function]', 'special'); + } + + return options.stylize("[Function ".concat(truncate(name, options.truncate - 11), "]"), 'special'); + } + + function inspectMapEntry(_ref, options) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + options.truncate -= 4; + key = options.inspect(key, options); + options.truncate -= key.length; + value = options.inspect(value, options); + return "".concat(key, " => ").concat(value); + } // IE11 doesn't support `map.entries()` + + + function mapToEntries(map) { + var entries = []; + map.forEach(function (value, key) { + entries.push([key, value]); + }); + return entries; + } + + function inspectMap(map, options) { + var size = map.size - 1; + + if (size <= 0) { + return 'Map{}'; + } + + options.truncate -= 7; + return "Map{ ".concat(inspectList(mapToEntries(map), options, inspectMapEntry), " }"); + } + + var isNaN = Number.isNaN || function (i) { + return i !== i; + }; // eslint-disable-line no-self-compare + + + function inspectNumber(number, options) { + if (isNaN(number)) { + return options.stylize('NaN', 'number'); + } + + if (number === Infinity) { + return options.stylize('Infinity', 'number'); + } + + if (number === -Infinity) { + return options.stylize('-Infinity', 'number'); + } + + if (number === 0) { + return options.stylize(1 / number === Infinity ? '+0' : '-0', 'number'); + } + + return options.stylize(truncate(number, options.truncate), 'number'); + } + + function inspectBigInt(number, options) { + var nums = truncate(number.toString(), options.truncate - 1); + if (nums !== truncator) nums += 'n'; + return options.stylize(nums, 'bigint'); + } + + function inspectRegExp(value, options) { + var flags = value.toString().split('/')[2]; + var sourceLength = options.truncate - (2 + flags.length); + var source = value.source; + return options.stylize("/".concat(truncate(source, sourceLength), "/").concat(flags), 'regexp'); + } + + function arrayFromSet(set) { + var values = []; + set.forEach(function (value) { + values.push(value); + }); + return values; + } + + function inspectSet(set, options) { + if (set.size === 0) return 'Set{}'; + options.truncate -= 7; + return "Set{ ".concat(inspectList(arrayFromSet(set), options), " }"); + } + + var stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5" + "\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", 'g'); + var escapeCharacters = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + "'": "\\'", + '\\': '\\\\' + }; + var hex = 16; + var unicodeLength = 4; + + function escape(char) { + return escapeCharacters[char] || "\\u".concat("0000".concat(char.charCodeAt(0).toString(hex)).slice(-unicodeLength)); + } + + function inspectString(string, options) { + if (stringEscapeChars.test(string)) { + string = string.replace(stringEscapeChars, escape); + } + + return options.stylize("'".concat(truncate(string, options.truncate - 2), "'"), 'string'); + } + + function inspectSymbol(value) { + if ('description' in Symbol.prototype) { + return value.description ? "Symbol(".concat(value.description, ")") : 'Symbol()'; + } + + return value.toString(); + } + + var getPromiseValue = function getPromiseValue() { + return 'Promise{…}'; + }; + + try { + var _process$binding = process.binding('util'), + getPromiseDetails = _process$binding.getPromiseDetails, + kPending = _process$binding.kPending, + kRejected = _process$binding.kRejected; + + if (Array.isArray(getPromiseDetails(Promise.resolve()))) { + getPromiseValue = function getPromiseValue(value, options) { + var _getPromiseDetails = getPromiseDetails(value), + _getPromiseDetails2 = _slicedToArray(_getPromiseDetails, 2), + state = _getPromiseDetails2[0], + innerValue = _getPromiseDetails2[1]; + + if (state === kPending) { + return 'Promise{}'; + } + + return "Promise".concat(state === kRejected ? '!' : '', "{").concat(options.inspect(innerValue, options), "}"); + }; + } + } catch (notNode) { + /* ignore */ + } + + var inspectPromise = getPromiseValue; + + function inspectObject(object, options) { + var properties = Object.getOwnPropertyNames(object); + var symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : []; + + if (properties.length === 0 && symbols.length === 0) { + return '{}'; + } + + options.truncate -= 4; + options.seen = options.seen || []; + + if (options.seen.indexOf(object) >= 0) { + return '[Circular]'; + } + + options.seen.push(object); + var propertyContents = inspectList(properties.map(function (key) { + return [key, object[key]]; + }), options, inspectProperty); + var symbolContents = inspectList(symbols.map(function (key) { + return [key, object[key]]; + }), options, inspectProperty); + options.seen.pop(); + var sep = ''; + + if (propertyContents && symbolContents) { + sep = ', '; + } + + return "{ ".concat(propertyContents).concat(sep).concat(symbolContents, " }"); + } + + var toStringTag = typeof Symbol !== 'undefined' && Symbol.toStringTag ? Symbol.toStringTag : false; + function inspectClass(value, options) { + var name = ''; + + if (toStringTag && toStringTag in value) { + name = value[toStringTag]; + } + + name = name || getFuncName_1(value.constructor); // Babel transforms anonymous classes to the name `_class` + + if (!name || name === '_class') { + name = ''; + } + + options.truncate -= name.length; + return "".concat(name).concat(inspectObject(value, options)); + } + + function inspectArguments(args, options) { + if (args.length === 0) return 'Arguments[]'; + options.truncate -= 13; + return "Arguments[ ".concat(inspectList(args, options), " ]"); + } + + var errorKeys = ['stack', 'line', 'column', 'name', 'message', 'fileName', 'lineNumber', 'columnNumber', 'number', 'description']; + function inspectObject$1(error, options) { + var properties = Object.getOwnPropertyNames(error).filter(function (key) { + return errorKeys.indexOf(key) === -1; + }); + var name = error.name; + options.truncate -= name.length; + var message = ''; + + if (typeof error.message === 'string') { + message = truncate(error.message, options.truncate); + } else { + properties.unshift('message'); + } + + message = message ? ": ".concat(message) : ''; + options.truncate -= message.length + 5; + var propertyContents = inspectList(properties.map(function (key) { + return [key, error[key]]; + }), options, inspectProperty); + return "".concat(name).concat(message).concat(propertyContents ? " { ".concat(propertyContents, " }") : ''); + } + + function inspectAttribute(_ref, options) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + options.truncate -= 3; + + if (!value) { + return "".concat(options.stylize(key, 'yellow')); + } + + return "".concat(options.stylize(key, 'yellow'), "=").concat(options.stylize("\"".concat(value, "\""), 'string')); + } + function inspectHTMLCollection(collection, options) { + // eslint-disable-next-line no-use-before-define + return inspectList(collection, options, inspectHTML, '\n'); + } + function inspectHTML(element, options) { + var properties = element.getAttributeNames(); + var name = element.tagName.toLowerCase(); + var head = options.stylize("<".concat(name), 'special'); + var headClose = options.stylize(">", 'special'); + var tail = options.stylize(""), 'special'); + options.truncate -= name.length * 2 + 5; + var propertyContents = ''; + + if (properties.length > 0) { + propertyContents += ' '; + propertyContents += inspectList(properties.map(function (key) { + return [key, element.getAttribute(key)]; + }), options, inspectAttribute, ' '); + } + + options.truncate -= propertyContents.length; + var truncate = options.truncate; + var children = inspectHTMLCollection(element.children, options); + + if (children && children.length > truncate) { + children = "".concat(truncator, "(").concat(element.children.length, ")"); + } + + return "".concat(head).concat(propertyContents).concat(headClose).concat(children).concat(tail); + } + + var symbolsSupported = typeof Symbol === 'function' && typeof Symbol.for === 'function'; + var chaiInspect = symbolsSupported ? Symbol.for('chai/inspect') : '@@chai/inspect'; + var nodeInspect = false; + + try { + // eslint-disable-next-line global-require + var nodeUtil = require('util'); + + nodeInspect = nodeUtil.inspect ? nodeUtil.inspect.custom : false; + } catch (noNodeInspect) { + nodeInspect = false; + } + + function FakeMap() { + // eslint-disable-next-line prefer-template + this.key = 'chai/loupe__' + Math.random() + Date.now(); + } + + FakeMap.prototype = { + // eslint-disable-next-line object-shorthand + get: function get(key) { + return key[this.key]; + }, + // eslint-disable-next-line object-shorthand + has: function has(key) { + return this.key in key; + }, + // eslint-disable-next-line object-shorthand + set: function set(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this.key, { + // eslint-disable-next-line object-shorthand + value: value, + configurable: true + }); + } + } + }; + var constructorMap = new (typeof WeakMap === 'function' ? WeakMap : FakeMap)(); + var stringTagMap = {}; + var baseTypesMap = { + undefined: function undefined$1(value, options) { + return options.stylize('undefined', 'undefined'); + }, + null: function _null(value, options) { + return options.stylize(null, 'null'); + }, + boolean: function boolean(value, options) { + return options.stylize(value, 'boolean'); + }, + Boolean: function Boolean(value, options) { + return options.stylize(value, 'boolean'); + }, + number: inspectNumber, + Number: inspectNumber, + bigint: inspectBigInt, + BigInt: inspectBigInt, + string: inspectString, + String: inspectString, + function: inspectFunction, + Function: inspectFunction, + symbol: inspectSymbol, + // A Symbol polyfill will return `Symbol` not `symbol` from typedetect + Symbol: inspectSymbol, + Array: inspectArray, + Date: inspectDate, + Map: inspectMap, + Set: inspectSet, + RegExp: inspectRegExp, + Promise: inspectPromise, + // WeakSet, WeakMap are totally opaque to us + WeakSet: function WeakSet(value, options) { + return options.stylize('WeakSet{…}', 'special'); + }, + WeakMap: function WeakMap(value, options) { + return options.stylize('WeakMap{…}', 'special'); + }, + Arguments: inspectArguments, + Int8Array: inspectTypedArray, + Uint8Array: inspectTypedArray, + Uint8ClampedArray: inspectTypedArray, + Int16Array: inspectTypedArray, + Uint16Array: inspectTypedArray, + Int32Array: inspectTypedArray, + Uint32Array: inspectTypedArray, + Float32Array: inspectTypedArray, + Float64Array: inspectTypedArray, + Generator: function Generator() { + return ''; + }, + DataView: function DataView() { + return ''; + }, + ArrayBuffer: function ArrayBuffer() { + return ''; + }, + Error: inspectObject$1, + HTMLCollection: inspectHTMLCollection, + NodeList: inspectHTMLCollection + }; // eslint-disable-next-line complexity + + var inspectCustom = function inspectCustom(value, options, type) { + if (chaiInspect in value && typeof value[chaiInspect] === 'function') { + return value[chaiInspect](options); + } + + if (nodeInspect && nodeInspect in value && typeof value[nodeInspect] === 'function') { + return value[nodeInspect](options.depth, options); + } + + if ('inspect' in value && typeof value.inspect === 'function') { + return value.inspect(options.depth, options); + } + + if ('constructor' in value && constructorMap.has(value.constructor)) { + return constructorMap.get(value.constructor)(value, options); + } + + if (stringTagMap[type]) { + return stringTagMap[type](value, options); + } + + return ''; + }; + + var toString$1 = Object.prototype.toString; // eslint-disable-next-line complexity + + function inspect(value, options) { + options = normaliseOptions(options); + options.inspect = inspect; + var _options = options, + customInspect = _options.customInspect; + var type = value === null ? 'null' : _typeof(value); + + if (type === 'object') { + type = toString$1.call(value).slice(8, -1); + } // If it is a base value that we already support, then use Loupe's inspector + + + if (baseTypesMap[type]) { + return baseTypesMap[type](value, options); + } // If `options.customInspect` is set to true then try to use the custom inspector + + + if (customInspect && value) { + var output = inspectCustom(value, options, type); + + if (output) { + if (typeof output === 'string') return output; + return inspect(output, options); + } + } + + var proto = value ? Object.getPrototypeOf(value) : false; // If it's a plain Object then use Loupe's inspector + + if (proto === Object.prototype || proto === null) { + return inspectObject(value, options); + } // Specifically account for HTMLElements + // eslint-disable-next-line no-undef + + + if (value && typeof HTMLElement === 'function' && value instanceof HTMLElement) { + return inspectHTML(value, options); + } + + if ('constructor' in value) { + // If it is a class, inspect it like an object but add the constructor name + if (value.constructor !== Object) { + return inspectClass(value, options); + } // If it is an object with an anonymous prototype, display it as an object. + + + return inspectObject(value, options); + } // last chance to check if it's an object + + + if (value === Object(value)) { + return inspectObject(value, options); + } // We have run out of options! Just stringify the value + + + return options.stylize(String(value), type); + } + function registerConstructor(constructor, inspector) { + if (constructorMap.has(constructor)) { + return false; + } + + constructorMap.set(constructor, inspector); + return true; + } + function registerStringTag(stringTag, inspector) { + if (stringTag in stringTagMap) { + return false; + } + + stringTagMap[stringTag] = inspector; + return true; + } + var custom = chaiInspect; + + exports.custom = custom; + exports.default = inspect; + exports.inspect = inspect; + exports.registerConstructor = registerConstructor; + exports.registerStringTag = registerStringTag; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/package.json new file mode 100644 index 0000000..ae185c8 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/loupe/package.json @@ -0,0 +1,141 @@ +{ + "name": "loupe", + "version": "2.3.7", + "description": "Inspect utility for Node.js and browsers", + "homepage": "https://github.com/chaijs/loupe", + "license": "MIT", + "author": "Veselin Todorov ", + "contributors": [ + "Keith Cirkel (https://github.com/keithamus)" + ], + "main": "./loupe.js", + "module": "./index.js", + "browser": { + "./index.js": "./loupe.js", + "util": false + }, + "repository": { + "type": "git", + "url": "https://github.com/chaijs/loupe" + }, + "files": [ + "loupe.js", + "index.js", + "lib/*" + ], + "scripts": { + "bench": "node -r esm bench", + "commit-msg": "commitlint -x angular", + "lint": "eslint --ignore-path .gitignore .", + "prepare": "rollup -c rollup.conf.js", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "test": "npm run test:node && npm run test:browser", + "pretest:browser": "npm run prepare", + "test:browser": "karma start --singleRun=true", + "posttest:browser": "npm run upload-coverage", + "test:node": "nyc mocha -r esm", + "posttest:node": "nyc report --report-dir \"coverage/node-$(node --version)\" --reporter=lcovonly && npm run upload-coverage", + "upload-coverage": "codecov" + }, + "eslintConfig": { + "root": true, + "parserOptions": { + "ecmaVersion": 2020 + }, + "env": { + "es6": true + }, + "plugins": [ + "filenames", + "prettier" + ], + "extends": [ + "strict/es6" + ], + "rules": { + "comma-dangle": "off", + "func-style": "off", + "no-magic-numbers": "off", + "class-methods-use-this": "off", + "array-bracket-spacing": "off", + "array-element-newline": "off", + "space-before-function-paren": "off", + "arrow-parens": "off", + "template-curly-spacing": "off", + "quotes": "off", + "generator-star-spacing": "off", + "prefer-destructuring": "off", + "no-mixed-operators": "off", + "id-blacklist": "off", + "curly": "off", + "semi": [ + "error", + "never" + ], + "prettier/prettier": [ + "error", + { + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "avoid", + "bracketSpacing": true + } + ] + } + }, + "prettier": { + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "avoid", + "bracketSpacing": true + }, + "dependencies": { + "get-func-name": "^2.0.1" + }, + "devDependencies": { + "@babel/core": "^7.12.10", + "@babel/preset-env": "^7.12.11", + "@commitlint/cli": "^11.0.0", + "@rollup/plugin-commonjs": "^17.0.0", + "@rollup/plugin-node-resolve": "^11.1.0", + "benchmark": "^2.1.4", + "chai": "^4.2.0", + "codecov": "^3.8.1", + "commitlint-config-angular": "^11.0.0", + "core-js": "^3.8.3", + "cross-env": "^7.0.3", + "eslint": "^7.18.0", + "eslint-config-strict": "^14.0.1", + "eslint-plugin-filenames": "^1.3.2", + "eslint-plugin-prettier": "^3.3.1", + "esm": "^3.2.25", + "husky": "^4.3.8", + "karma": "^5.2.3", + "karma-chrome-launcher": "^3.1.0", + "karma-coverage": "^2.0.3", + "karma-edge-launcher": "^0.4.2", + "karma-firefox-launcher": "^2.1.0", + "karma-ie-launcher": "^1.0.0", + "karma-mocha": "^2.0.1", + "karma-opera-launcher": "^1.0.0", + "karma-safari-launcher": "^1.0.0", + "karma-safaritechpreview-launcher": "^2.0.2", + "karma-sauce-launcher": "^4.3.4", + "mocha": "^8.2.1", + "nyc": "^15.1.0", + "prettier": "^2.2.1", + "rollup": "^2.37.1", + "rollup-plugin-babel": "^4.4.0", + "rollup-plugin-istanbul": "^3.0.0", + "semantic-release": "^17.3.6", + "simple-assert": "^1.0.0" + } +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/LICENSE b/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/LICENSE new file mode 100644 index 0000000..b93be90 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/README.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/README.md new file mode 100644 index 0000000..0cc1bcf --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/README.md @@ -0,0 +1,463 @@ +# pretty-format + +Stringify any JavaScript value. + +- Serialize built-in JavaScript types. +- Serialize application-specific data types with built-in or user-defined plugins. + +## Installation + +```sh +$ yarn add pretty-format +``` + +## Usage + +```js +const {format: prettyFormat} = require('pretty-format'); // CommonJS +``` + +```js +import {format as prettyFormat} from 'pretty-format'; // ES2015 modules +``` + +```js +const val = {object: {}}; +val.circularReference = val; +val[Symbol('foo')] = 'foo'; +val.map = new Map([['prop', 'value']]); +val.array = [-0, Infinity, NaN]; + +console.log(prettyFormat(val)); +/* +Object { + "array": Array [ + -0, + Infinity, + NaN, + ], + "circularReference": [Circular], + "map": Map { + "prop" => "value", + }, + "object": Object {}, + Symbol(foo): "foo", +} +*/ +``` + +## Usage with options + +```js +function onClick() {} + +console.log(prettyFormat(onClick)); +/* +[Function onClick] +*/ + +const options = { + printFunctionName: false, +}; +console.log(prettyFormat(onClick, options)); +/* +[Function] +*/ +``` + + +| key | type | default | description | +| :-------------------- | :--------------- | :---------- | :-------------------------------------------------------------------------------------- | +| `callToJSON` | `boolean` | `true` | call `toJSON` method (if it exists) on objects | +| `compareKeys` | `function\|null` | `undefined` | compare function used when sorting object keys, `null` can be used to skip over sorting | +| `escapeRegex` | `boolean` | `false` | escape special characters in regular expressions | +| `escapeString` | `boolean` | `true` | escape special characters in strings | +| `highlight` | `boolean` | `false` | highlight syntax with colors in terminal (some plugins) | +| `indent` | `number` | `2` | spaces in each level of indentation | +| `maxDepth` | `number` | `Infinity` | levels to print in arrays, objects, elements, and so on | +| `maxWidth` | `number` | `Infinity` | number of elements to print in arrays, sets, and so on | +| `min` | `boolean` | `false` | minimize added space: no indentation nor line breaks | +| `plugins` | `array` | `[]` | plugins to serialize application-specific data types | +| `printBasicPrototype` | `boolean` | `false` | print the prototype for plain objects and arrays | +| `printFunctionName` | `boolean` | `true` | include or omit the name of a function | +| `theme` | `object` | | colors to highlight syntax in terminal | + +Property values of `theme` are from [ansi-styles colors](https://github.com/chalk/ansi-styles#colors) + +```js +const DEFAULT_THEME = { + comment: 'gray', + content: 'reset', + prop: 'yellow', + tag: 'cyan', + value: 'green', +}; +``` + +## Usage with plugins + +The `pretty-format` package provides some built-in plugins, including: + +- `ReactElement` for elements from `react` +- `ReactTestComponent` for test objects from `react-test-renderer` + +```js +// CommonJS +const React = require('react'); +const renderer = require('react-test-renderer'); +const {format: prettyFormat, plugins} = require('pretty-format'); + +const {ReactElement, ReactTestComponent} = plugins; +``` + +```js +// ES2015 modules and destructuring assignment +import React from 'react'; +import renderer from 'react-test-renderer'; +import {plugins, format as prettyFormat} from 'pretty-format'; + +const {ReactElement, ReactTestComponent} = plugins; +``` + +```js +const onClick = () => {}; +const element = React.createElement('button', {onClick}, 'Hello World'); + +const formatted1 = prettyFormat(element, { + plugins: [ReactElement], + printFunctionName: false, +}); +const formatted2 = prettyFormat(renderer.create(element).toJSON(), { + plugins: [ReactTestComponent], + printFunctionName: false, +}); +/* + +*/ +``` + +## Usage in Jest + +For snapshot tests, Jest uses `pretty-format` with options that include some of its built-in plugins. For this purpose, plugins are also known as **snapshot serializers**. + +To serialize application-specific data types, you can add modules to `devDependencies` of a project, and then: + +In an **individual** test file, you can add a module as follows. It precedes any modules from Jest configuration. + +```js +import serializer from 'my-serializer-module'; +expect.addSnapshotSerializer(serializer); + +// tests which have `expect(value).toMatchSnapshot()` assertions +``` + +For **all** test files, you can specify modules in Jest configuration. They precede built-in plugins for React, HTML, and Immutable.js data types. For example, in a `package.json` file: + +```json +{ + "jest": { + "snapshotSerializers": ["my-serializer-module"] + } +} +``` + +## Writing plugins + +A plugin is a JavaScript object. + +If `options` has a `plugins` array: for the first plugin whose `test(val)` method returns a truthy value, then `prettyFormat(val, options)` returns the result from either: + +- `serialize(val, …)` method of the **improved** interface (available in **version 21** or later) +- `print(val, …)` method of the **original** interface (if plugin does not have `serialize` method) + +### test + +Write `test` so it can receive `val` argument of any type. To serialize **objects** which have certain properties, then a guarded expression like `val != null && …` or more concise `val && …` prevents the following errors: + +- `TypeError: Cannot read property 'whatever' of null` +- `TypeError: Cannot read property 'whatever' of undefined` + +For example, `test` method of built-in `ReactElement` plugin: + +```js +const elementSymbol = Symbol.for('react.element'); +const test = val => val && val.$$typeof === elementSymbol; +``` + +Pay attention to efficiency in `test` because `pretty-format` calls it often. + +### serialize + +The **improved** interface is available in **version 21** or later. + +Write `serialize` to return a string, given the arguments: + +- `val` which “passed the test” +- unchanging `config` object: derived from `options` +- current `indentation` string: concatenate to `indent` from `config` +- current `depth` number: compare to `maxDepth` from `config` +- current `refs` array: find circular references in objects +- `printer` callback function: serialize children + +### config + + +| key | type | description | +| :------------------ | :--------------- | :-------------------------------------------------------------------------------------- | +| `callToJSON` | `boolean` | call `toJSON` method (if it exists) on objects | +| `compareKeys` | `function\|null` | compare function used when sorting object keys, `null` can be used to skip over sorting | +| `colors` | `Object` | escape codes for colors to highlight syntax | +| `escapeRegex` | `boolean` | escape special characters in regular expressions | +| `escapeString` | `boolean` | escape special characters in strings | +| `indent` | `string` | spaces in each level of indentation | +| `maxDepth` | `number` | levels to print in arrays, objects, elements, and so on | +| `min` | `boolean` | minimize added space: no indentation nor line breaks | +| `plugins` | `array` | plugins to serialize application-specific data types | +| `printFunctionName` | `boolean` | include or omit the name of a function | +| `spacingInner` | `string` | spacing to separate items in a list | +| `spacingOuter` | `string` | spacing to enclose a list of items | + +Each property of `colors` in `config` corresponds to a property of `theme` in `options`: + +- the key is the same (for example, `tag`) +- the value in `colors` is a object with `open` and `close` properties whose values are escape codes from [ansi-styles](https://github.com/chalk/ansi-styles) for the color value in `theme` (for example, `'cyan'`) + +Some properties in `config` are derived from `min` in `options`: + +- `spacingInner` and `spacingOuter` are **newline** if `min` is `false` +- `spacingInner` is **space** and `spacingOuter` is **empty string** if `min` is `true` + +### Example of serialize and test + +This plugin is a pattern you can apply to serialize composite data types. Side note: `pretty-format` does not need a plugin to serialize arrays. + +```js +// We reused more code when we factored out a function for child items +// that is independent of depth, name, and enclosing punctuation (see below). +const SEPARATOR = ','; +function serializeItems(items, config, indentation, depth, refs, printer) { + if (items.length === 0) { + return ''; + } + const indentationItems = indentation + config.indent; + return ( + config.spacingOuter + + items + .map( + item => + indentationItems + + printer(item, config, indentationItems, depth, refs), // callback + ) + .join(SEPARATOR + config.spacingInner) + + (config.min ? '' : SEPARATOR) + // following the last item + config.spacingOuter + + indentation + ); +} + +const plugin = { + test(val) { + return Array.isArray(val); + }, + serialize(array, config, indentation, depth, refs, printer) { + const name = array.constructor.name; + return ++depth > config.maxDepth + ? `[${name}]` + : `${config.min ? '' : `${name} `}[${serializeItems( + array, + config, + indentation, + depth, + refs, + printer, + )}]`; + }, +}; +``` + +```js +const val = { + filter: 'completed', + items: [ + { + text: 'Write test', + completed: true, + }, + { + text: 'Write serialize', + completed: true, + }, + ], +}; +``` + +```js +console.log( + prettyFormat(val, { + plugins: [plugin], + }), +); +/* +Object { + "filter": "completed", + "items": Array [ + Object { + "completed": true, + "text": "Write test", + }, + Object { + "completed": true, + "text": "Write serialize", + }, + ], +} +*/ +``` + +```js +console.log( + prettyFormat(val, { + indent: 4, + plugins: [plugin], + }), +); +/* +Object { + "filter": "completed", + "items": Array [ + Object { + "completed": true, + "text": "Write test", + }, + Object { + "completed": true, + "text": "Write serialize", + }, + ], +} +*/ +``` + +```js +console.log( + prettyFormat(val, { + maxDepth: 1, + plugins: [plugin], + }), +); +/* +Object { + "filter": "completed", + "items": [Array], +} +*/ +``` + +```js +console.log( + prettyFormat(val, { + min: true, + plugins: [plugin], + }), +); +/* +{"filter": "completed", "items": [{"completed": true, "text": "Write test"}, {"completed": true, "text": "Write serialize"}]} +*/ +``` + +### print + +The **original** interface is adequate for plugins: + +- that **do not** depend on options other than `highlight` or `min` +- that **do not** depend on `depth` or `refs` in recursive traversal, and +- if values either + - do **not** require indentation, or + - do **not** occur as children of JavaScript data structures (for example, array) + +Write `print` to return a string, given the arguments: + +- `val` which “passed the test” +- current `printer(valChild)` callback function: serialize children +- current `indenter(lines)` callback function: indent lines at the next level +- unchanging `config` object: derived from `options` +- unchanging `colors` object: derived from `options` + +The 3 properties of `config` are `min` in `options` and: + +- `spacing` and `edgeSpacing` are **newline** if `min` is `false` +- `spacing` is **space** and `edgeSpacing` is **empty string** if `min` is `true` + +Each property of `colors` corresponds to a property of `theme` in `options`: + +- the key is the same (for example, `tag`) +- the value in `colors` is a object with `open` and `close` properties whose values are escape codes from [ansi-styles](https://github.com/chalk/ansi-styles) for the color value in `theme` (for example, `'cyan'`) + +### Example of print and test + +This plugin prints functions with the **number of named arguments** excluding rest argument. + +```js +const plugin = { + print(val) { + return `[Function ${val.name || 'anonymous'} ${val.length}]`; + }, + test(val) { + return typeof val === 'function'; + }, +}; +``` + +```js +const val = { + onClick(event) {}, + render() {}, +}; + +prettyFormat(val, { + plugins: [plugin], +}); +/* +Object { + "onClick": [Function onClick 1], + "render": [Function render 0], +} +*/ + +prettyFormat(val); +/* +Object { + "onClick": [Function onClick], + "render": [Function render], +} +*/ +``` + +This plugin **ignores** the `printFunctionName` option. That limitation of the original `print` interface is a reason to use the improved `serialize` interface, described above. + +```js +prettyFormat(val, { + plugins: [pluginOld], + printFunctionName: false, +}); +/* +Object { + "onClick": [Function onClick 1], + "render": [Function render 0], +} +*/ + +prettyFormat(val, { + printFunctionName: false, +}); +/* +Object { + "onClick": [Function], + "render": [Function], +} +*/ +``` diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/package.json new file mode 100644 index 0000000..23e5fc7 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/pretty-format/package.json @@ -0,0 +1,43 @@ +{ + "name": "pretty-format", + "version": "29.7.0", + "repository": { + "type": "git", + "url": "https://github.com/jestjs/jest.git", + "directory": "packages/pretty-format" + }, + "license": "MIT", + "description": "Stringify any JavaScript value.", + "main": "./build/index.js", + "types": "./build/index.d.ts", + "exports": { + ".": { + "types": "./build/index.d.ts", + "default": "./build/index.js" + }, + "./package.json": "./package.json" + }, + "author": "James Kyle ", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "devDependencies": { + "@types/react": "^17.0.3", + "@types/react-is": "^18.0.0", + "@types/react-test-renderer": "17.0.2", + "immutable": "^4.0.0", + "jest-util": "^29.7.0", + "react": "17.0.2", + "react-dom": "^17.0.1", + "react-test-renderer": "17.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "4e56991693da7cd4c3730dc3579a1dd1403ee630" +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/LICENSE b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/LICENSE new file mode 100644 index 0000000..b96dcb0 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/README.md b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/README.md new file mode 100644 index 0000000..d255977 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/README.md @@ -0,0 +1,104 @@ +# `react-is` + +This package allows you to test arbitrary values and see if they're a particular React element type. + +## Installation + +```sh +# Yarn +yarn add react-is + +# NPM +npm install react-is +``` + +## Usage + +### Determining if a Component is Valid + +```js +import React from "react"; +import * as ReactIs from "react-is"; + +class ClassComponent extends React.Component { + render() { + return React.createElement("div"); + } +} + +const FunctionComponent = () => React.createElement("div"); + +const ForwardRefComponent = React.forwardRef((props, ref) => + React.createElement(Component, { forwardedRef: ref, ...props }) +); + +const Context = React.createContext(false); + +ReactIs.isValidElementType("div"); // true +ReactIs.isValidElementType(ClassComponent); // true +ReactIs.isValidElementType(FunctionComponent); // true +ReactIs.isValidElementType(ForwardRefComponent); // true +ReactIs.isValidElementType(Context.Provider); // true +ReactIs.isValidElementType(Context.Consumer); // true +ReactIs.isValidElementType(React.createFactory("div")); // true +``` + +### Determining an Element's Type + +#### Context + +```js +import React from "react"; +import * as ReactIs from 'react-is'; + +const ThemeContext = React.createContext("blue"); + +ReactIs.isContextConsumer(); // true +ReactIs.isContextProvider(); // true +ReactIs.typeOf() === ReactIs.ContextProvider; // true +ReactIs.typeOf() === ReactIs.ContextConsumer; // true +``` + +#### Element + +```js +import React from "react"; +import * as ReactIs from 'react-is'; + +ReactIs.isElement(
); // true +ReactIs.typeOf(
) === ReactIs.Element; // true +``` + +#### Fragment + +```js +import React from "react"; +import * as ReactIs from 'react-is'; + +ReactIs.isFragment(<>); // true +ReactIs.typeOf(<>) === ReactIs.Fragment; // true +``` + +#### Portal + +```js +import React from "react"; +import ReactDOM from "react-dom"; +import * as ReactIs from 'react-is'; + +const div = document.createElement("div"); +const portal = ReactDOM.createPortal(
, div); + +ReactIs.isPortal(portal); // true +ReactIs.typeOf(portal) === ReactIs.Portal; // true +``` + +#### StrictMode + +```js +import React from "react"; +import * as ReactIs from 'react-is'; + +ReactIs.isStrictMode(); // true +ReactIs.typeOf() === ReactIs.StrictMode; // true +``` diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/cjs/react-is.development.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/cjs/react-is.development.js new file mode 100644 index 0000000..6ed9c03 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/cjs/react-is.development.js @@ -0,0 +1,221 @@ +/** + * @license React + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +if (process.env.NODE_ENV !== "production") { + (function() { +'use strict'; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. +var REACT_ELEMENT_TYPE = Symbol.for('react.element'); +var REACT_PORTAL_TYPE = Symbol.for('react.portal'); +var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); +var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); +var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); +var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); +var REACT_CONTEXT_TYPE = Symbol.for('react.context'); +var REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context'); +var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); +var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); +var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); +var REACT_MEMO_TYPE = Symbol.for('react.memo'); +var REACT_LAZY_TYPE = Symbol.for('react.lazy'); +var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen'); + +// ----------------------------------------------------------------------------- + +var enableScopeAPI = false; // Experimental Create Event Handle API. +var enableCacheElement = false; +var enableTransitionTracing = false; // No known bugs, but needs performance testing + +var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber +// stuff. Intended to enable React core members to more easily debug scheduling +// issues in DEV builds. + +var enableDebugTracing = false; // Track which Fiber(s) schedule render work. + +var REACT_MODULE_REFERENCE; + +{ + REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); +} + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { + return true; + } + } + + return false; +} + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + case REACT_SUSPENSE_LIST_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_SERVER_CONTEXT_TYPE: + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; +var SuspenseList = REACT_SUSPENSE_LIST_TYPE; +var hasWarnedAboutDeprecatedIsAsyncMode = false; +var hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated + +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); + } + } + + return false; +} +function isConcurrentMode(object) { + { + if (!hasWarnedAboutDeprecatedIsConcurrentMode) { + hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); + } + } + + return false; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} +function isSuspenseList(object) { + return typeOf(object) === REACT_SUSPENSE_LIST_TYPE; +} + +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.SuspenseList = SuspenseList; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; +exports.isSuspenseList = isSuspenseList; +exports.isValidElementType = isValidElementType; +exports.typeOf = typeOf; + })(); +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/cjs/react-is.production.min.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/cjs/react-is.production.min.js new file mode 100644 index 0000000..f2322cb --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/cjs/react-is.production.min.js @@ -0,0 +1,14 @@ +/** + * @license React + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +'use strict';var b=Symbol.for("react.element"),c=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),e=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),g=Symbol.for("react.provider"),h=Symbol.for("react.context"),k=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),n=Symbol.for("react.suspense_list"),p=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),t=Symbol.for("react.offscreen"),u;u=Symbol.for("react.module.reference"); +function v(a){if("object"===typeof a&&null!==a){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports.ContextConsumer=h;exports.ContextProvider=g;exports.Element=b;exports.ForwardRef=l;exports.Fragment=d;exports.Lazy=q;exports.Memo=p;exports.Portal=c;exports.Profiler=f;exports.StrictMode=e;exports.Suspense=m; +exports.SuspenseList=n;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return v(a)===h};exports.isContextProvider=function(a){return v(a)===g};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return v(a)===l};exports.isFragment=function(a){return v(a)===d};exports.isLazy=function(a){return v(a)===q};exports.isMemo=function(a){return v(a)===p}; +exports.isPortal=function(a){return v(a)===c};exports.isProfiler=function(a){return v(a)===f};exports.isStrictMode=function(a){return v(a)===e};exports.isSuspense=function(a){return v(a)===m};exports.isSuspenseList=function(a){return v(a)===n}; +exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===d||a===f||a===e||a===m||a===n||a===t||"object"===typeof a&&null!==a&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||void 0!==a.getModuleId)?!0:!1};exports.typeOf=v; diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/index.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/index.js new file mode 100644 index 0000000..3ae098d --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/index.js @@ -0,0 +1,7 @@ +'use strict'; + +if (process.env.NODE_ENV === 'production') { + module.exports = require('./cjs/react-is.production.min.js'); +} else { + module.exports = require('./cjs/react-is.development.js'); +} diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/package.json b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/package.json new file mode 100644 index 0000000..12b24a2 --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/package.json @@ -0,0 +1,26 @@ +{ + "name": "react-is", + "version": "18.3.1", + "description": "Brand checking of React Elements.", + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/facebook/react.git", + "directory": "packages/react-is" + }, + "keywords": [ + "react" + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/facebook/react/issues" + }, + "homepage": "https://reactjs.org/", + "files": [ + "LICENSE", + "README.md", + "index.js", + "cjs/", + "umd/" + ] +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/umd/react-is.development.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/umd/react-is.development.js new file mode 100644 index 0000000..1257aef --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/umd/react-is.development.js @@ -0,0 +1,220 @@ +/** + * @license React + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.ReactIs = {})); +}(this, (function (exports) { 'use strict'; + + // ATTENTION + // When adding new symbols to this file, + // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' + // The Symbol used to tag the ReactElement-like types. + var REACT_ELEMENT_TYPE = Symbol.for('react.element'); + var REACT_PORTAL_TYPE = Symbol.for('react.portal'); + var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); + var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); + var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); + var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); + var REACT_CONTEXT_TYPE = Symbol.for('react.context'); + var REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context'); + var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); + var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); + var REACT_MEMO_TYPE = Symbol.for('react.memo'); + var REACT_LAZY_TYPE = Symbol.for('react.lazy'); + var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen'); + + // ----------------------------------------------------------------------------- + + var enableScopeAPI = false; // Experimental Create Event Handle API. + var enableCacheElement = false; + var enableTransitionTracing = false; // No known bugs, but needs performance testing + + var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber + // stuff. Intended to enable React core members to more easily debug scheduling + // issues in DEV builds. + + var enableDebugTracing = false; // Track which Fiber(s) schedule render work. + + var REACT_MODULE_REFERENCE; + + { + REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); + } + + function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { + return true; + } + } + + return false; + } + + function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + case REACT_SUSPENSE_LIST_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_SERVER_CONTEXT_TYPE: + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; + } + var ContextConsumer = REACT_CONTEXT_TYPE; + var ContextProvider = REACT_PROVIDER_TYPE; + var Element = REACT_ELEMENT_TYPE; + var ForwardRef = REACT_FORWARD_REF_TYPE; + var Fragment = REACT_FRAGMENT_TYPE; + var Lazy = REACT_LAZY_TYPE; + var Memo = REACT_MEMO_TYPE; + var Portal = REACT_PORTAL_TYPE; + var Profiler = REACT_PROFILER_TYPE; + var StrictMode = REACT_STRICT_MODE_TYPE; + var Suspense = REACT_SUSPENSE_TYPE; + var SuspenseList = REACT_SUSPENSE_LIST_TYPE; + var hasWarnedAboutDeprecatedIsAsyncMode = false; + var hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated + + function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); + } + } + + return false; + } + function isConcurrentMode(object) { + { + if (!hasWarnedAboutDeprecatedIsConcurrentMode) { + hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); + } + } + + return false; + } + function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; + } + function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; + } + function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; + } + function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; + } + function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; + } + function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; + } + function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; + } + function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; + } + function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; + } + function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; + } + function isSuspenseList(object) { + return typeOf(object) === REACT_SUSPENSE_LIST_TYPE; + } + + exports.ContextConsumer = ContextConsumer; + exports.ContextProvider = ContextProvider; + exports.Element = Element; + exports.ForwardRef = ForwardRef; + exports.Fragment = Fragment; + exports.Lazy = Lazy; + exports.Memo = Memo; + exports.Portal = Portal; + exports.Profiler = Profiler; + exports.StrictMode = StrictMode; + exports.Suspense = Suspense; + exports.SuspenseList = SuspenseList; + exports.isAsyncMode = isAsyncMode; + exports.isConcurrentMode = isConcurrentMode; + exports.isContextConsumer = isContextConsumer; + exports.isContextProvider = isContextProvider; + exports.isElement = isElement; + exports.isForwardRef = isForwardRef; + exports.isFragment = isFragment; + exports.isLazy = isLazy; + exports.isMemo = isMemo; + exports.isPortal = isPortal; + exports.isProfiler = isProfiler; + exports.isStrictMode = isStrictMode; + exports.isSuspense = isSuspense; + exports.isSuspenseList = isSuspenseList; + exports.isValidElementType = isValidElementType; + exports.typeOf = typeOf; + +}))); diff --git a/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/umd/react-is.production.min.js b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/umd/react-is.production.min.js new file mode 100644 index 0000000..84a9cde --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/node_modules/react-is/umd/react-is.production.min.js @@ -0,0 +1,15 @@ +/** + * @license React + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +(function(){'use strict';(function(b,c){"object"===typeof exports&&"undefined"!==typeof module?c(exports):"function"===typeof define&&define.amd?define(["exports"],c):(b=b||self,c(b.ReactIs={}))})(this,function(b){function c(a){if("object"===typeof a&&null!==a){var b=a.$$typeof;switch(b){case q:switch(a=a.type,a){case d:case e:case f:case g:case h:return a;default:switch(a=a&&a.$$typeof,a){case t:case k:case l:case m:case n:case p:return a;default:return b}}case r:return b}}}var q=Symbol.for("react.element"), +r=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),f=Symbol.for("react.strict_mode"),e=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),k=Symbol.for("react.context"),t=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),h=Symbol.for("react.suspense_list"),n=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),u=Symbol.for("react.offscreen");var v=Symbol.for("react.module.reference");b.ContextConsumer=k;b.ContextProvider=p;b.Element= +q;b.ForwardRef=l;b.Fragment=d;b.Lazy=m;b.Memo=n;b.Portal=r;b.Profiler=e;b.StrictMode=f;b.Suspense=g;b.SuspenseList=h;b.isAsyncMode=function(a){return!1};b.isConcurrentMode=function(a){return!1};b.isContextConsumer=function(a){return c(a)===k};b.isContextProvider=function(a){return c(a)===p};b.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===q};b.isForwardRef=function(a){return c(a)===l};b.isFragment=function(a){return c(a)===d};b.isLazy=function(a){return c(a)===m};b.isMemo= +function(a){return c(a)===n};b.isPortal=function(a){return c(a)===r};b.isProfiler=function(a){return c(a)===e};b.isStrictMode=function(a){return c(a)===f};b.isSuspense=function(a){return c(a)===g};b.isSuspenseList=function(a){return c(a)===h};b.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===d||a===e||a===f||a===g||a===h||a===u||"object"===typeof a&&null!==a&&(a.$$typeof===m||a.$$typeof===n||a.$$typeof===p||a.$$typeof===k||a.$$typeof===l||a.$$typeof===v||void 0!== +a.getModuleId)?!0:!1};b.typeOf=c}); +})(); diff --git a/sdk/typescript/node_modules/@vitest/utils/package.json b/sdk/typescript/node_modules/@vitest/utils/package.json new file mode 100644 index 0000000..91492cb --- /dev/null +++ b/sdk/typescript/node_modules/@vitest/utils/package.json @@ -0,0 +1,74 @@ +{ + "name": "@vitest/utils", + "type": "module", + "version": "1.6.1", + "description": "Shared Vitest utility functions", + "license": "MIT", + "funding": "https://opencollective.com/vitest", + "homepage": "https://github.com/vitest-dev/vitest/tree/main/packages/utils#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/utils" + }, + "bugs": { + "url": "https://github.com/vitest-dev/vitest/issues" + }, + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./diff": { + "types": "./dist/diff.d.ts", + "default": "./dist/diff.js" + }, + "./ast": { + "types": "./dist/ast.d.ts", + "default": "./dist/ast.js" + }, + "./error": { + "types": "./dist/error.d.ts", + "default": "./dist/error.js" + }, + "./helpers": { + "types": "./dist/helpers.d.ts", + "default": "./dist/helpers.js" + }, + "./source-map": { + "types": "./dist/source-map.d.ts", + "default": "./dist/source-map.js" + }, + "./*": "./*" + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "source-map": [ + "dist/source-map.d.ts" + ] + } + }, + "files": [ + "*.d.ts", + "dist" + ], + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "devDependencies": { + "@jridgewell/trace-mapping": "^0.3.22", + "@types/estree": "^1.0.5", + "tinyhighlight": "^0.3.2" + }, + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/acorn-walk/CHANGELOG.md b/sdk/typescript/node_modules/acorn-walk/CHANGELOG.md new file mode 100644 index 0000000..de4168f --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/CHANGELOG.md @@ -0,0 +1,209 @@ +## 8.3.5 (2026-02-19) + +### Bug fixes + +Emit a more informative error message when trying to walk a node type that has no walker function. + +Specify callbacks in types to receive `AnyNode` type, so that they can be narrowed more easily. + +Support import attributes. + +## 8.3.4 (2024-09-09) + +### Bug fixes + +Walk SwitchCase nodes as separate nodes. + +## 8.3.3 (2024-01-11) + +### Bug fixes + +Make acorn a dependency because acorn-walk uses the types from that package. + +## 8.3.2 (2024-01-11) + +### Bug fixes + +Add missing type for `findNodeBefore`. + +## 8.3.1 (2023-12-06) + +### Bug fixes + +Add `Function` and `Class` to the `AggregateType` type, so that they can be used in walkers without raising a type error. + +Visitor functions are now called in such a way that their `this` refers to the object they are part of. + +## 8.3.0 (2023-10-26) + +### New features + +Use a set of new, much more precise, TypeScript types. + +## 8.2.0 (2021-09-06) + +### New features + +Add support for walking ES2022 class static blocks. + +## 8.1.1 (2021-06-29) + +### Bug fixes + +Include `base` in the type declarations. + +## 8.1.0 (2021-04-24) + +### New features + +Support node types for class fields and private methods. + +## 8.0.2 (2021-01-25) + +### Bug fixes + +Adjust package.json to work with Node 12.16.0 and 13.0-13.6. + +## 8.0.0 (2021-01-05) + +### Bug fixes + +Fix a bug where `full` and `fullAncestor` would skip nodes with overridden types. + +## 8.0.0 (2020-08-12) + +### New features + +The package can now be loaded directly as an ECMAScript module in node 13+. + +## 7.2.0 (2020-06-17) + +### New features + +Support optional chaining and nullish coalescing. + +Support `import.meta`. + +Add support for `export * as ns from "source"`. + +## 7.1.1 (2020-02-13) + +### Bug fixes + +Clean up the type definitions to actually work well with the main parser. + +## 7.1.0 (2020-02-11) + +### New features + +Add a TypeScript definition file for the library. + +## 7.0.0 (2017-08-12) + +### New features + +Support walking `ImportExpression` nodes. + +## 6.2.0 (2017-07-04) + +### New features + +Add support for `Import` nodes. + +## 6.1.0 (2018-09-28) + +### New features + +The walker now walks `TemplateElement` nodes. + +## 6.0.1 (2018-09-14) + +### Bug fixes + +Fix bad "main" field in package.json. + +## 6.0.0 (2018-09-14) + +### Breaking changes + +This is now a separate package, `acorn-walk`, rather than part of the main `acorn` package. + +The `ScopeBody` and `ScopeExpression` meta-node-types are no longer supported. + +## 5.7.1 (2018-06-15) + +### Bug fixes + +Make sure the walker and bin files are rebuilt on release (the previous release didn't get the up-to-date versions). + +## 5.7.0 (2018-06-15) + +### Bug fixes + +Fix crash in walker when walking a binding-less catch node. + +## 5.6.2 (2018-06-05) + +### Bug fixes + +In the walker, go back to allowing the `baseVisitor` argument to be null to default to the default base everywhere. + +## 5.6.1 (2018-06-01) + +### Bug fixes + +Fix regression when passing `null` as fourth argument to `walk.recursive`. + +## 5.6.0 (2018-05-31) + +### Bug fixes + +Fix a bug in the walker that caused a crash when walking an object pattern spread. + +## 5.5.1 (2018-03-06) + +### Bug fixes + +Fix regression in walker causing property values in object patterns to be walked as expressions. + +## 5.5.0 (2018-02-27) + +### Bug fixes + +Support object spread in the AST walker. + +## 5.4.1 (2018-02-02) + +### Bug fixes + +5.4.0 somehow accidentally included an old version of walk.js. + +## 5.2.0 (2017-10-30) + +### Bug fixes + +The `full` and `fullAncestor` walkers no longer visit nodes multiple times. + +## 5.1.0 (2017-07-05) + +### New features + +New walker functions `full` and `fullAncestor`. + +## 3.2.0 (2016-06-07) + +### New features + +Make it possible to use `visit.ancestor` with a walk state. + +## 3.1.0 (2016-04-18) + +### New features + +The walker now allows defining handlers for `CatchClause` nodes. + +## 2.5.2 (2015-10-27) + +### Fixes + +Fix bug where the walker walked an exported `let` statement as an expression. diff --git a/sdk/typescript/node_modules/acorn-walk/LICENSE b/sdk/typescript/node_modules/acorn-walk/LICENSE new file mode 100644 index 0000000..d6be6db --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (C) 2012-2020 by various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/acorn-walk/README.md b/sdk/typescript/node_modules/acorn-walk/README.md new file mode 100644 index 0000000..eaec57f --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/README.md @@ -0,0 +1,124 @@ +# Acorn AST walker + +An abstract syntax tree walker for the +[ESTree](https://github.com/estree/estree) format. + +## Community + +Acorn is open source software released under an +[MIT license](https://github.com/acornjs/acorn/blob/master/acorn-walk/LICENSE). + +You are welcome to +[report bugs](https://github.com/acornjs/acorn/issues) or create pull +requests on [github](https://github.com/acornjs/acorn). + +## Installation + +The easiest way to install acorn is from [`npm`](https://www.npmjs.com/): + +```sh +npm install acorn-walk +``` + +Alternately, you can download the source and build acorn yourself: + +```sh +git clone https://github.com/acornjs/acorn.git +cd acorn +npm install +``` + +## Interface + +An algorithm for recursing through a syntax tree is stored as an +object, with a property for each tree node type holding a function +that will recurse through such a node. There are several ways to run +such a walker. + +**simple**`(node, visitors, base, state)` does a 'simple' walk over a +tree. `node` should be the AST node to walk, and `visitors` an object +with properties whose names correspond to node types in the [ESTree +spec](https://github.com/estree/estree). The properties should contain +functions that will be called with the node object and, if applicable +the state at that point. The last two arguments are optional. `base` +is a walker algorithm, and `state` is a start state. The default +walker will simply visit all statements and expressions and not +produce a meaningful state. (An example of a use of state is to track +scope at each point in the tree.) + +```js +import * as acorn from "acorn" +import * as walk from "acorn-walk" + +walk.simple(acorn.parse("let x = 10"), { + Literal(node) { + console.log(`Found a literal: ${node.value}`) + } +}) +``` + +**ancestor**`(node, visitors, base, state)` does a 'simple' walk over +a tree, building up an array of ancestor nodes (including the current node) +and passing the array to the callbacks as a third parameter. + +```js +import * as acorn from "acorn" +import * as walk from "acorn-walk" + +walk.ancestor(acorn.parse("foo('hi')"), { + Literal(_node, _state, ancestors) { + console.log("This literal's ancestors are:", ancestors.map(n => n.type)) + } +}) +``` + +**recursive**`(node, state, functions, base)` does a 'recursive' +walk, where the walker functions are responsible for continuing the +walk on the child nodes of their target node. `state` is the start +state, and `functions` should contain an object that maps node types +to walker functions. Such functions are called with `(node, state, c)` +arguments, and can cause the walk to continue on a sub-node by calling +the `c` argument on it with `(node, state)` arguments. The optional +`base` argument provides the fallback walker functions for node types +that aren't handled in the `functions` object. If not given, the +default walkers will be used. + +**make**`(functions, base)` builds a new walker object by using the +walker functions in `functions` and filling in the missing ones by +taking defaults from `base`. + +**full**`(node, callback, base, state)` does a 'full' walk over a +tree, calling the callback with the arguments (node, state, type) for +each node + +**fullAncestor**`(node, callback, base, state)` does a 'full' walk +over a tree, building up an array of ancestor nodes (including the +current node) and passing the array to the callbacks as a third +parameter. + +```js +import * as acorn from "acorn" +import * as walk from "acorn-walk" + +walk.full(acorn.parse("1 + 1"), node => { + console.log(`There's a ${node.type} node at ${node.ch}`) +}) +``` + +**findNodeAt**`(node, start, end, test, base, state)` tries to locate +a node in a tree at the given start and/or end offsets, which +satisfies the predicate `test`. `start` and `end` can be either `null` +(as wildcard) or a number. `test` may be a string (indicating a node +type) or a function that takes `(nodeType, node)` arguments and +returns a boolean indicating whether this node is interesting. `base` +and `state` are optional, and can be used to specify a custom walker. +Nodes are tested from inner to outer, so if two nodes match the +boundaries, the inner one will be preferred. + +**findNodeAround**`(node, pos, test, base, state)` is a lot like +`findNodeAt`, but will match any node that exists 'around' (spanning) +the given position. + +**findNodeAfter**`(node, pos, test, base, state)` is similar to +`findNodeAround`, but will match all nodes *after* the given position +(testing outer nodes before inner nodes). diff --git a/sdk/typescript/node_modules/acorn-walk/node_modules/.bin/acorn b/sdk/typescript/node_modules/acorn-walk/node_modules/.bin/acorn new file mode 120000 index 0000000..cf76760 --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/node_modules/.bin/acorn @@ -0,0 +1 @@ +../acorn/bin/acorn \ No newline at end of file diff --git a/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/CHANGELOG.md b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/CHANGELOG.md new file mode 100644 index 0000000..d18759a --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/CHANGELOG.md @@ -0,0 +1,972 @@ +## 8.16.0 (2026-02-19) + +### New features + +The `sourceType` option can now be set to `"commonjs"` to have the parser treat the top level scope as a function scope. + +Add support for Unicode 17. + +### Bug fixes + +Don't recognize `await using` as contextual keywords when followed directly by a backslash. + +Fix an issue where the parser would allow `return` statements in `static` blocks when `allowReturnOutsideFunction` was enabled. + +Properly reject `using` declarations that appear directly in `switch` or `for` head scopes. + +Fix some corner case issues in the recognition of `using` syntax. + +## 8.15.0 (2025-06-08) + +### New features + +Support `using` and `await using` syntax. + +The `AnyNode` type is now defined in such a way that plugins can extend it. + +### Bug fixes + +Fix an issue where the `bigint` property of literal nodes for non-decimal bigints had the wrong format. + +The `acorn` CLI tool no longer crashes when emitting a tree that contains a bigint. + +## 8.14.1 (2025-03-05) + +### Bug fixes + +Fix an issue where `await` expressions in class field initializers were inappropriately allowed. + +Properly allow await inside an async arrow function inside a class field initializer. + +Mention the source file name in syntax error messages when given. + +Properly add an empty `attributes` property to every form of `ExportNamedDeclaration`. + +## 8.14.0 (2024-10-27) + +### New features + +Support ES2025 import attributes. + +Support ES2025 RegExp modifiers. + +### Bug fixes + +Support some missing Unicode properties. + +## 8.13.0 (2024-10-16) + +### New features + +Upgrade to Unicode 16.0. + +## 8.12.1 (2024-07-03) + +### Bug fixes + +Fix a regression that caused Acorn to no longer run on Node versions <8.10. + +## 8.12.0 (2024-06-14) + +### New features + +Support ES2025 duplicate capture group names in regular expressions. + +### Bug fixes + +Include `VariableDeclarator` in the `AnyNode` type so that walker objects can refer to it without getting a type error. + +Properly raise a parse error for invalid `for`/`of` statements using `async` as binding name. + +Properly recognize \"use strict\" when preceded by a string with an escaped newline. + +Mark the `Parser` constructor as protected, not private, so plugins can extend it without type errors. + +Fix a bug where some invalid `delete` expressions were let through when the operand was parenthesized and `preserveParens` was enabled. + +Properly normalize line endings in raw strings of invalid template tokens. + +Properly track line numbers for escaped newlines in strings. + +Fix a bug that broke line number accounting after a template literal with invalid escape sequences. + +## 8.11.3 (2023-12-29) + +### Bug fixes + +Add `Function` and `Class` to the `AggregateType` type, so that they can be used in walkers without raising a type error. + +Make sure `onToken` get an `import` keyword token when parsing `import.meta`. + +Fix a bug where `.loc.start` could be undefined for `new.target` `meta` nodes. + +## 8.11.2 (2023-10-27) + +### Bug fixes + +Fix a bug that caused regular expressions after colon tokens to not be properly tokenized in some circumstances. + +## 8.11.1 (2023-10-26) + +### Bug fixes + +Fix a regression where `onToken` would receive 'name' tokens for 'new' keyword tokens. + +## 8.11.0 (2023-10-26) + +### Bug fixes + +Fix an issue where tokenizing (without parsing) an object literal with a property named `class` or `function` could, in some circumstance, put the tokenizer into an invalid state. + +Fix an issue where a slash after a call to a propery named the same as some keywords would be tokenized as a regular expression. + +### New features + +Upgrade to Unicode 15.1. + +Use a set of new, much more precise, TypeScript types. + +## 8.10.0 (2023-07-05) + +### New features + +Add a `checkPrivateFields` option that disables strict checking of private property use. + +## 8.9.0 (2023-06-16) + +### Bug fixes + +Forbid dynamic import after `new`, even when part of a member expression. + +### New features + +Add Unicode properties for ES2023. + +Add support for the `v` flag to regular expressions. + +## 8.8.2 (2023-01-23) + +### Bug fixes + +Fix a bug that caused `allowHashBang` to be set to false when not provided, even with `ecmaVersion >= 14`. + +Fix an exception when passing no option object to `parse` or `new Parser`. + +Fix incorrect parse error on `if (0) let\n[astral identifier char]`. + +## 8.8.1 (2022-10-24) + +### Bug fixes + +Make type for `Comment` compatible with estree types. + +## 8.8.0 (2022-07-21) + +### Bug fixes + +Allow parentheses around spread args in destructuring object assignment. + +Fix an issue where the tree contained `directive` properties in when parsing with a language version that doesn't support them. + +### New features + +Support hashbang comments by default in ECMAScript 2023 and later. + +## 8.7.1 (2021-04-26) + +### Bug fixes + +Stop handling `"use strict"` directives in ECMAScript versions before 5. + +Fix an issue where duplicate quoted export names in `export *` syntax were incorrectly checked. + +Add missing type for `tokTypes`. + +## 8.7.0 (2021-12-27) + +### New features + +Support quoted export names. + +Upgrade to Unicode 14. + +Add support for Unicode 13 properties in regular expressions. + +### Bug fixes + +Use a loop to find line breaks, because the existing regexp search would overrun the end of the searched range and waste a lot of time in minified code. + +## 8.6.0 (2021-11-18) + +### Bug fixes + +Fix a bug where an object literal with multiple `__proto__` properties would incorrectly be accepted if a later property value held an assigment. + +### New features + +Support class private fields with the `in` operator. + +## 8.5.0 (2021-09-06) + +### Bug fixes + +Improve context-dependent tokenization in a number of corner cases. + +Fix location tracking after a 0x2028 or 0x2029 character in a string literal (which before did not increase the line number). + +Fix an issue where arrow function bodies in for loop context would inappropriately consume `in` operators. + +Fix wrong end locations stored on SequenceExpression nodes. + +Implement restriction that `for`/`of` loop LHS can't start with `let`. + +### New features + +Add support for ES2022 class static blocks. + +Allow multiple input files to be passed to the CLI tool. + +## 8.4.1 (2021-06-24) + +### Bug fixes + +Fix a bug where `allowAwaitOutsideFunction` would allow `await` in class field initializers, and setting `ecmaVersion` to 13 or higher would allow top-level await in non-module sources. + +## 8.4.0 (2021-06-11) + +### New features + +A new option, `allowSuperOutsideMethod`, can be used to suppress the error when `super` is used in the wrong context. + +## 8.3.0 (2021-05-31) + +### New features + +Default `allowAwaitOutsideFunction` to true for ECMAScript 2022 an higher. + +Add support for the `d` ([indices](https://github.com/tc39/proposal-regexp-match-indices)) regexp flag. + +## 8.2.4 (2021-05-04) + +### Bug fixes + +Fix spec conformity in corner case 'for await (async of ...)'. + +## 8.2.3 (2021-05-04) + +### Bug fixes + +Fix an issue where the library couldn't parse 'for (async of ...)'. + +Fix a bug in UTF-16 decoding that would read characters incorrectly in some circumstances. + +## 8.2.2 (2021-04-29) + +### Bug fixes + +Fix a bug where a class field initialized to an async arrow function wouldn't allow await inside it. Same issue existed for generator arrow functions with yield. + +## 8.2.1 (2021-04-24) + +### Bug fixes + +Fix a regression introduced in 8.2.0 where static or async class methods with keyword names fail to parse. + +## 8.2.0 (2021-04-24) + +### New features + +Add support for ES2022 class fields and private methods. + +## 8.1.1 (2021-04-12) + +### Various + +Stop shipping source maps in the NPM package. + +## 8.1.0 (2021-03-09) + +### Bug fixes + +Fix a spurious error in nested destructuring arrays. + +### New features + +Expose `allowAwaitOutsideFunction` in CLI interface. + +Make `allowImportExportAnywhere` also apply to `import.meta`. + +## 8.0.5 (2021-01-25) + +### Bug fixes + +Adjust package.json to work with Node 12.16.0 and 13.0-13.6. + +## 8.0.4 (2020-10-05) + +### Bug fixes + +Make `await x ** y` an error, following the spec. + +Fix potentially exponential regular expression. + +## 8.0.3 (2020-10-02) + +### Bug fixes + +Fix a wasteful loop during `Parser` creation when setting `ecmaVersion` to `"latest"`. + +## 8.0.2 (2020-09-30) + +### Bug fixes + +Make the TypeScript types reflect the current allowed values for `ecmaVersion`. + +Fix another regexp/division tokenizer issue. + +## 8.0.1 (2020-08-12) + +### Bug fixes + +Provide the correct value in the `version` export. + +## 8.0.0 (2020-08-12) + +### Bug fixes + +Disallow expressions like `(a = b) = c`. + +Make non-octal escape sequences a syntax error in strict mode. + +### New features + +The package can now be loaded directly as an ECMAScript module in node 13+. + +Update to the set of Unicode properties from ES2021. + +### Breaking changes + +The `ecmaVersion` option is now required. For the moment, omitting it will still work with a warning, but that will change in a future release. + +Some changes to method signatures that may be used by plugins. + +## 7.4.0 (2020-08-03) + +### New features + +Add support for logical assignment operators. + +Add support for numeric separators. + +## 7.3.1 (2020-06-11) + +### Bug fixes + +Make the string in the `version` export match the actual library version. + +## 7.3.0 (2020-06-11) + +### Bug fixes + +Fix a bug that caused parsing of object patterns with a property named `set` that had a default value to fail. + +### New features + +Add support for optional chaining (`?.`). + +## 7.2.0 (2020-05-09) + +### Bug fixes + +Fix precedence issue in parsing of async arrow functions. + +### New features + +Add support for nullish coalescing. + +Add support for `import.meta`. + +Support `export * as ...` syntax. + +Upgrade to Unicode 13. + +## 6.4.1 (2020-03-09) + +### Bug fixes + +More carefully check for valid UTF16 surrogate pairs in regexp validator. + +## 7.1.1 (2020-03-01) + +### Bug fixes + +Treat `\8` and `\9` as invalid escapes in template strings. + +Allow unicode escapes in property names that are keywords. + +Don't error on an exponential operator expression as argument to `await`. + +More carefully check for valid UTF16 surrogate pairs in regexp validator. + +## 7.1.0 (2019-09-24) + +### Bug fixes + +Disallow trailing object literal commas when ecmaVersion is less than 5. + +### New features + +Add a static `acorn` property to the `Parser` class that contains the entire module interface, to allow plugins to access the instance of the library that they are acting on. + +## 7.0.0 (2019-08-13) + +### Breaking changes + +Changes the node format for dynamic imports to use the `ImportExpression` node type, as defined in [ESTree](https://github.com/estree/estree/blob/master/es2020.md#importexpression). + +Makes 10 (ES2019) the default value for the `ecmaVersion` option. + +## 6.3.0 (2019-08-12) + +### New features + +`sourceType: "module"` can now be used even when `ecmaVersion` is less than 6, to parse module-style code that otherwise conforms to an older standard. + +## 6.2.1 (2019-07-21) + +### Bug fixes + +Fix bug causing Acorn to treat some characters as identifier characters that shouldn't be treated as such. + +Fix issue where setting the `allowReserved` option to `"never"` allowed reserved words in some circumstances. + +## 6.2.0 (2019-07-04) + +### Bug fixes + +Improve valid assignment checking in `for`/`in` and `for`/`of` loops. + +Disallow binding `let` in patterns. + +### New features + +Support bigint syntax with `ecmaVersion` >= 11. + +Support dynamic `import` syntax with `ecmaVersion` >= 11. + +Upgrade to Unicode version 12. + +## 6.1.1 (2019-02-27) + +### Bug fixes + +Fix bug that caused parsing default exports of with names to fail. + +## 6.1.0 (2019-02-08) + +### Bug fixes + +Fix scope checking when redefining a `var` as a lexical binding. + +### New features + +Split up `parseSubscripts` to use an internal `parseSubscript` method to make it easier to extend with plugins. + +## 6.0.7 (2019-02-04) + +### Bug fixes + +Check that exported bindings are defined. + +Don't treat `\u180e` as a whitespace character. + +Check for duplicate parameter names in methods. + +Don't allow shorthand properties when they are generators or async methods. + +Forbid binding `await` in async arrow function's parameter list. + +## 6.0.6 (2019-01-30) + +### Bug fixes + +The content of class declarations and expressions is now always parsed in strict mode. + +Don't allow `let` or `const` to bind the variable name `let`. + +Treat class declarations as lexical. + +Don't allow a generator function declaration as the sole body of an `if` or `else`. + +Ignore `"use strict"` when after an empty statement. + +Allow string line continuations with special line terminator characters. + +Treat `for` bodies as part of the `for` scope when checking for conflicting bindings. + +Fix bug with parsing `yield` in a `for` loop initializer. + +Implement special cases around scope checking for functions. + +## 6.0.5 (2019-01-02) + +### Bug fixes + +Fix TypeScript type for `Parser.extend` and add `allowAwaitOutsideFunction` to options type. + +Don't treat `let` as a keyword when the next token is `{` on the next line. + +Fix bug that broke checking for parentheses around an object pattern in a destructuring assignment when `preserveParens` was on. + +## 6.0.4 (2018-11-05) + +### Bug fixes + +Further improvements to tokenizing regular expressions in corner cases. + +## 6.0.3 (2018-11-04) + +### Bug fixes + +Fix bug in tokenizing an expression-less return followed by a function followed by a regular expression. + +Remove stray symlink in the package tarball. + +## 6.0.2 (2018-09-26) + +### Bug fixes + +Fix bug where default expressions could fail to parse inside an object destructuring assignment expression. + +## 6.0.1 (2018-09-14) + +### Bug fixes + +Fix wrong value in `version` export. + +## 6.0.0 (2018-09-14) + +### Bug fixes + +Better handle variable-redefinition checks for catch bindings and functions directly under if statements. + +Forbid `new.target` in top-level arrow functions. + +Fix issue with parsing a regexp after `yield` in some contexts. + +### New features + +The package now comes with TypeScript definitions. + +### Breaking changes + +The default value of the `ecmaVersion` option is now 9 (2018). + +Plugins work differently, and will have to be rewritten to work with this version. + +The loose parser and walker have been moved into separate packages (`acorn-loose` and `acorn-walk`). + +## 5.7.3 (2018-09-10) + +### Bug fixes + +Fix failure to tokenize regexps after expressions like `x.of`. + +Better error message for unterminated template literals. + +## 5.7.2 (2018-08-24) + +### Bug fixes + +Properly handle `allowAwaitOutsideFunction` in for statements. + +Treat function declarations at the top level of modules like let bindings. + +Don't allow async function declarations as the only statement under a label. + +## 5.7.0 (2018-06-15) + +### New features + +Upgraded to Unicode 11. + +## 5.6.0 (2018-05-31) + +### New features + +Allow U+2028 and U+2029 in string when ECMAVersion >= 10. + +Allow binding-less catch statements when ECMAVersion >= 10. + +Add `allowAwaitOutsideFunction` option for parsing top-level `await`. + +## 5.5.3 (2018-03-08) + +### Bug fixes + +A _second_ republish of the code in 5.5.1, this time with yarn, to hopefully get valid timestamps. + +## 5.5.2 (2018-03-08) + +### Bug fixes + +A republish of the code in 5.5.1 in an attempt to solve an issue with the file timestamps in the npm package being 0. + +## 5.5.1 (2018-03-06) + +### Bug fixes + +Fix misleading error message for octal escapes in template strings. + +## 5.5.0 (2018-02-27) + +### New features + +The identifier character categorization is now based on Unicode version 10. + +Acorn will now validate the content of regular expressions, including new ES9 features. + +## 5.4.0 (2018-02-01) + +### Bug fixes + +Disallow duplicate or escaped flags on regular expressions. + +Disallow octal escapes in strings in strict mode. + +### New features + +Add support for async iteration. + +Add support for object spread and rest. + +## 5.3.0 (2017-12-28) + +### Bug fixes + +Fix parsing of floating point literals with leading zeroes in loose mode. + +Allow duplicate property names in object patterns. + +Don't allow static class methods named `prototype`. + +Disallow async functions directly under `if` or `else`. + +Parse right-hand-side of `for`/`of` as an assignment expression. + +Stricter parsing of `for`/`in`. + +Don't allow unicode escapes in contextual keywords. + +### New features + +Parsing class members was factored into smaller methods to allow plugins to hook into it. + +## 5.2.1 (2017-10-30) + +### Bug fixes + +Fix a token context corruption bug. + +## 5.2.0 (2017-10-30) + +### Bug fixes + +Fix token context tracking for `class` and `function` in property-name position. + +Make sure `%*` isn't parsed as a valid operator. + +Allow shorthand properties `get` and `set` to be followed by default values. + +Disallow `super` when not in callee or object position. + +### New features + +Support [`directive` property](https://github.com/estree/estree/compare/b3de58c9997504d6fba04b72f76e6dd1619ee4eb...1da8e603237144f44710360f8feb7a9977e905e0) on directive expression statements. + +## 5.1.2 (2017-09-04) + +### Bug fixes + +Disable parsing of legacy HTML-style comments in modules. + +Fix parsing of async methods whose names are keywords. + +## 5.1.1 (2017-07-06) + +### Bug fixes + +Fix problem with disambiguating regexp and division after a class. + +## 5.1.0 (2017-07-05) + +### Bug fixes + +Fix tokenizing of regexps in an object-desctructuring `for`/`of` loop and after `yield`. + +Parse zero-prefixed numbers with non-octal digits as decimal. + +Allow object/array patterns in rest parameters. + +Don't error when `yield` is used as a property name. + +Allow `async` as a shorthand object property. + +### New features + +Implement the [template literal revision proposal](https://github.com/tc39/proposal-template-literal-revision) for ES9. + +## 5.0.3 (2017-04-01) + +### Bug fixes + +Fix spurious duplicate variable definition errors for named functions. + +## 5.0.2 (2017-03-30) + +### Bug fixes + +A binary operator after a parenthesized arrow expression is no longer incorrectly treated as an error. + +## 5.0.0 (2017-03-28) + +### Bug fixes + +Raise an error for duplicated lexical bindings. + +Fix spurious error when an assignement expression occurred after a spread expression. + +Accept regular expressions after `of` (in `for`/`of`), `yield` (in a generator), and braced arrow functions. + +Allow labels in front or `var` declarations, even in strict mode. + +### Breaking changes + +Parse declarations following `export default` as declaration nodes, not expressions. This means that class and function declarations nodes can now have `null` as their `id`. + +## 4.0.11 (2017-02-07) + +### Bug fixes + +Allow all forms of member expressions to be parenthesized as lvalue. + +## 4.0.10 (2017-02-07) + +### Bug fixes + +Don't expect semicolons after default-exported functions or classes, even when they are expressions. + +Check for use of `'use strict'` directives in non-simple parameter functions, even when already in strict mode. + +## 4.0.9 (2017-02-06) + +### Bug fixes + +Fix incorrect error raised for parenthesized simple assignment targets, so that `(x) = 1` parses again. + +## 4.0.8 (2017-02-03) + +### Bug fixes + +Solve spurious parenthesized pattern errors by temporarily erring on the side of accepting programs that our delayed errors don't handle correctly yet. + +## 4.0.7 (2017-02-02) + +### Bug fixes + +Accept invalidly rejected code like `(x).y = 2` again. + +Don't raise an error when a function _inside_ strict code has a non-simple parameter list. + +## 4.0.6 (2017-02-02) + +### Bug fixes + +Fix exponential behavior (manifesting itself as a complete hang for even relatively small source files) introduced by the new 'use strict' check. + +## 4.0.5 (2017-02-02) + +### Bug fixes + +Disallow parenthesized pattern expressions. + +Allow keywords as export names. + +Don't allow the `async` keyword to be parenthesized. + +Properly raise an error when a keyword contains a character escape. + +Allow `"use strict"` to appear after other string literal expressions. + +Disallow labeled declarations. + +## 4.0.4 (2016-12-19) + +### Bug fixes + +Fix crash when `export` was followed by a keyword that can't be +exported. + +## 4.0.3 (2016-08-16) + +### Bug fixes + +Allow regular function declarations inside single-statement `if` branches in loose mode. Forbid them entirely in strict mode. + +Properly parse properties named `async` in ES2017 mode. + +Fix bug where reserved words were broken in ES2017 mode. + +## 4.0.2 (2016-08-11) + +### Bug fixes + +Don't ignore period or 'e' characters after octal numbers. + +Fix broken parsing for call expressions in default parameter values of arrow functions. + +## 4.0.1 (2016-08-08) + +### Bug fixes + +Fix false positives in duplicated export name errors. + +## 4.0.0 (2016-08-07) + +### Breaking changes + +The default `ecmaVersion` option value is now 7. + +A number of internal method signatures changed, so plugins might need to be updated. + +### Bug fixes + +The parser now raises errors on duplicated export names. + +`arguments` and `eval` can now be used in shorthand properties. + +Duplicate parameter names in non-simple argument lists now always produce an error. + +### New features + +The `ecmaVersion` option now also accepts year-style version numbers +(2015, etc). + +Support for `async`/`await` syntax when `ecmaVersion` is >= 8. + +Support for trailing commas in call expressions when `ecmaVersion` is >= 8. + +## 3.3.0 (2016-07-25) + +### Bug fixes + +Fix bug in tokenizing of regexp operator after a function declaration. + +Fix parser crash when parsing an array pattern with a hole. + +### New features + +Implement check against complex argument lists in functions that enable strict mode in ES7. + +## 3.2.0 (2016-06-07) + +### Bug fixes + +Improve handling of lack of unicode regexp support in host +environment. + +Properly reject shorthand properties whose name is a keyword. + +### New features + +Visitors created with `visit.make` now have their base as _prototype_, rather than copying properties into a fresh object. + +## 3.1.0 (2016-04-18) + +### Bug fixes + +Properly tokenize the division operator directly after a function expression. + +Allow trailing comma in destructuring arrays. + +## 3.0.4 (2016-02-25) + +### Fixes + +Allow update expressions as left-hand-side of the ES7 exponential operator. + +## 3.0.2 (2016-02-10) + +### Fixes + +Fix bug that accidentally made `undefined` a reserved word when parsing ES7. + +## 3.0.0 (2016-02-10) + +### Breaking changes + +The default value of the `ecmaVersion` option is now 6 (used to be 5). + +Support for comprehension syntax (which was dropped from the draft spec) has been removed. + +### Fixes + +`let` and `yield` are now “contextual keywords”, meaning you can mostly use them as identifiers in ES5 non-strict code. + +A parenthesized class or function expression after `export default` is now parsed correctly. + +### New features + +When `ecmaVersion` is set to 7, Acorn will parse the exponentiation operator (`**`). + +The identifier character ranges are now based on Unicode 8.0.0. + +Plugins can now override the `raiseRecoverable` method to override the way non-critical errors are handled. + +## 2.7.0 (2016-01-04) + +### Fixes + +Stop allowing rest parameters in setters. + +Disallow `y` rexexp flag in ES5. + +Disallow `\00` and `\000` escapes in strict mode. + +Raise an error when an import name is a reserved word. + +## 2.6.2 (2015-11-10) + +### Fixes + +Don't crash when no options object is passed. + +## 2.6.0 (2015-11-09) + +### Fixes + +Add `await` as a reserved word in module sources. + +Disallow `yield` in a parameter default value for a generator. + +Forbid using a comma after a rest pattern in an array destructuring. + +### New features + +Support parsing stdin in command-line tool. + +## 2.5.0 (2015-10-27) + +### Fixes + +Fix tokenizer support in the command-line tool. + +Stop allowing `new.target` outside of functions. + +Remove legacy `guard` and `guardedHandler` properties from try nodes. + +Stop allowing multiple `__proto__` properties on an object literal in strict mode. + +Don't allow rest parameters to be non-identifier patterns. + +Check for duplicate paramter names in arrow functions. diff --git a/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/LICENSE b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/LICENSE new file mode 100644 index 0000000..9d71cc6 --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (C) 2012-2022 by various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/README.md b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/README.md new file mode 100644 index 0000000..962de02 --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/README.md @@ -0,0 +1,301 @@ +# Acorn + +A tiny, fast JavaScript parser written in JavaScript. + +## Community + +Acorn is open source software released under an +[MIT license](https://github.com/acornjs/acorn/blob/master/acorn/LICENSE). + +You are welcome to +[report bugs](https://github.com/acornjs/acorn/issues) or create pull +requests on [github](https://github.com/acornjs/acorn). + +## Installation + +The easiest way to install acorn is from [`npm`](https://www.npmjs.com/): + +```sh +npm install acorn +``` + +Alternately, you can download the source and build acorn yourself: + +```sh +git clone https://github.com/acornjs/acorn.git +cd acorn +npm install +``` +## Importing acorn + +ESM as well as CommonJS is supported for all 3: `acorn`, `acorn-walk` and `acorn-loose`. + +ESM example for `acorn`: + +```js +import * as acorn from "acorn" +``` + +CommonJS example for `acorn`: + +```js +let acorn = require("acorn") +``` + +ESM is preferred, as it allows better editor auto-completions by offering TypeScript support. +For this reason, following examples will use ESM imports. + +## Interface + +**parse**`(input, options)` is the main interface to the library. The +`input` parameter is a string, `options` must be an object setting +some of the options listed below. The return value will be an abstract +syntax tree object as specified by the [ESTree +spec](https://github.com/estree/estree). + +```javascript +import * as acorn from "acorn" +console.log(acorn.parse("1 + 1", {ecmaVersion: 2020})) +``` + +When encountering a syntax error, the parser will raise a +`SyntaxError` object with a meaningful message. The error object will +have a `pos` property that indicates the string offset at which the +error occurred, and a `loc` object that contains a `{line, column}` +object referring to that same position. + +Options are provided by in a second argument, which should be an +object containing any of these fields (only `ecmaVersion` is +required): + +- **ecmaVersion**: Indicates the ECMAScript version to parse. Can be a + number, either in year (`2022`) or plain version number (`6`) form, + or `"latest"` (the latest the library supports). This influences + support for strict mode, the set of reserved words, and support for + new syntax features. + + **NOTE**: Only 'stage 4' (finalized) ECMAScript features are being + implemented by Acorn. Other proposed new features must be + implemented through plugins. + +- **sourceType**: Indicate the mode the code should be parsed in. Can be + either `"script"`, `"module"` or `"commonjs"`. This influences global strict mode + and parsing of `import` and `export` declarations. + + **NOTE**: If set to `"module"`, then static `import` / `export` syntax + will be valid, even if `ecmaVersion` is less than 6. If set to `"commonjs"`, + it is the same as `"script"` except that the top-level scope behaves like a function. + +- **onInsertedSemicolon**: If given a callback, that callback will be + called whenever a missing semicolon is inserted by the parser. The + callback will be given the character offset of the point where the + semicolon is inserted as argument, and if `locations` is on, also a + `{line, column}` object representing this position. + +- **onTrailingComma**: Like `onInsertedSemicolon`, but for trailing + commas. + +- **allowReserved**: If `false`, using a reserved word will generate + an error. Defaults to `true` for `ecmaVersion` 3, `false` for higher + versions. When given the value `"never"`, reserved words and + keywords can also not be used as property names (as in Internet + Explorer's old parser). + +- **allowReturnOutsideFunction**: By default, a return statement at + the top level raises an error. Set this to `true` to accept such + code. + +- **allowImportExportEverywhere**: By default, `import` and `export` + declarations can only appear at a program's top level. Setting this + option to `true` allows them anywhere where a statement is allowed, + and also allows `import.meta` expressions to appear in scripts + (when `sourceType` is not `"module"`). + +- **allowAwaitOutsideFunction**: If `false`, `await` expressions can + only appear inside `async` functions. Defaults to `true` in modules + for `ecmaVersion` 2022 and later, `false` for lower versions. + Setting this option to `true` allows to have top-level `await` + expressions. They are still not allowed in non-`async` functions, + though. Setting this option to `true` is not allowed when `sourceType: "commonjs"`. + +- **allowSuperOutsideMethod**: By default, `super` outside a method + raises an error. Set this to `true` to accept such code. + +- **allowHashBang**: When this is enabled, if the code starts with the + characters `#!` (as in a shellscript), the first line will be + treated as a comment. Defaults to true when `ecmaVersion` >= 2023. + +- **checkPrivateFields**: By default, the parser will verify that + private properties are only used in places where they are valid and + have been declared. Set this to false to turn such checks off. + +- **locations**: When `true`, each node has a `loc` object attached + with `start` and `end` subobjects, each of which contains the + one-based line and zero-based column numbers in `{line, column}` + form. Default is `false`. + +- **onToken**: If a function is passed for this option, each found + token will be passed in same format as tokens returned from + `tokenizer().getToken()`. + + If array is passed, each found token is pushed to it. + + Note that you are not allowed to call the parser from the + callback—that will corrupt its internal state. + +- **onComment**: If a function is passed for this option, whenever a + comment is encountered the function will be called with the + following parameters: + + - `block`: `true` if the comment is a block comment, false if it + is a line comment. + - `text`: The content of the comment. + - `start`: Character offset of the start of the comment. + - `end`: Character offset of the end of the comment. + + When the `locations` options is on, the `{line, column}` locations + of the comment’s start and end are passed as two additional + parameters. + + If array is passed for this option, each found comment is pushed + to it as object in Esprima format: + + ```javascript + { + "type": "Line" | "Block", + "value": "comment text", + "start": Number, + "end": Number, + // If `locations` option is on: + "loc": { + "start": {line: Number, column: Number} + "end": {line: Number, column: Number} + }, + // If `ranges` option is on: + "range": [Number, Number] + } + ``` + + Note that you are not allowed to call the parser from the + callback—that will corrupt its internal state. + +- **ranges**: Nodes have their start and end characters offsets + recorded in `start` and `end` properties (directly on the node, + rather than the `loc` object, which holds line/column data. To also + add a + [semi-standardized](https://bugzilla.mozilla.org/show_bug.cgi?id=745678) + `range` property holding a `[start, end]` array with the same + numbers, set the `ranges` option to `true`. + +- **program**: It is possible to parse multiple files into a single + AST by passing the tree produced by parsing the first file as the + `program` option in subsequent parses. This will add the toplevel + forms of the parsed file to the "Program" (top) node of an existing + parse tree. + +- **sourceFile**: When the `locations` option is `true`, you can pass + this option to add a `source` attribute in every node’s `loc` + object. Note that the contents of this option are not examined or + processed in any way; you are free to use whatever format you + choose. + +- **directSourceFile**: Like `sourceFile`, but a `sourceFile` property + will be added (regardless of the `location` option) directly to the + nodes, rather than the `loc` object. + +- **preserveParens**: If this option is `true`, parenthesized expressions + are represented by (non-standard) `ParenthesizedExpression` nodes + that have a single `expression` property containing the expression + inside parentheses. + +**parseExpressionAt**`(input, offset, options)` will parse a single +expression in a string, and return its AST. It will not complain if +there is more of the string left after the expression. + +**tokenizer**`(input, options)` returns an object with a `getToken` +method that can be called repeatedly to get the next token, a `{start, +end, type, value}` object (with added `loc` property when the +`locations` option is enabled and `range` property when the `ranges` +option is enabled). When the token's type is `tokTypes.eof`, you +should stop calling the method, since it will keep returning that same +token forever. + +Note that tokenizing JavaScript without parsing it is, in modern +versions of the language, not really possible due to the way syntax is +overloaded in ways that can only be disambiguated by the parse +context. This package applies a bunch of heuristics to try and do a +reasonable job, but you are advised to use `parse` with the `onToken` +option instead of this. + +In ES6 environment, returned result can be used as any other +protocol-compliant iterable: + +```javascript +for (let token of acorn.tokenizer(str)) { + // iterate over the tokens +} + +// transform code to array of tokens: +var tokens = [...acorn.tokenizer(str)] +``` + +**tokTypes** holds an object mapping names to the token type objects +that end up in the `type` properties of tokens. + +**getLineInfo**`(input, offset)` can be used to get a `{line, +column}` object for a given program string and offset. + +### The `Parser` class + +Instances of the **`Parser`** class contain all the state and logic +that drives a parse. It has static methods `parse`, +`parseExpressionAt`, and `tokenizer` that match the top-level +functions by the same name. + +When extending the parser with plugins, you need to call these methods +on the extended version of the class. To extend a parser with plugins, +you can use its static `extend` method. + +```javascript +var acorn = require("acorn") +var jsx = require("acorn-jsx") +var JSXParser = acorn.Parser.extend(jsx()) +JSXParser.parse("foo()", {ecmaVersion: 2020}) +``` + +The `extend` method takes any number of plugin values, and returns a +new `Parser` class that includes the extra parser logic provided by +the plugins. + +## Command line interface + +The `bin/acorn` utility can be used to parse a file from the command +line. It accepts as arguments its input file and the following +options: + +- `--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|--ecma10`: Sets the ECMAScript version + to parse. Default is version 9. + +- `--module`: Sets the parsing mode to `"module"`. Is set to `"script"` otherwise. + +- `--locations`: Attaches a "loc" object to each node with "start" and + "end" subobjects, each of which contains the one-based line and + zero-based column numbers in `{line, column}` form. + +- `--allow-hash-bang`: If the code starts with the characters #! (as + in a shellscript), the first line will be treated as a comment. + +- `--allow-await-outside-function`: Allows top-level `await` expressions. + See the `allowAwaitOutsideFunction` option for more information. + +- `--compact`: No whitespace is used in the AST output. + +- `--silent`: Do not output the AST, just return the exit status. + +- `--help`: Print the usage information and quit. + +The utility spits out the syntax tree as JSON data. + +## Existing plugins + + - [`acorn-jsx`](https://github.com/RReverser/acorn-jsx): Parse [Facebook JSX syntax extensions](https://github.com/facebook/jsx) diff --git a/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/bin/acorn b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/bin/acorn new file mode 100644 index 0000000..3ef3c12 --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/bin/acorn @@ -0,0 +1,4 @@ +#!/usr/bin/env node +"use strict" + +require("../dist/bin.js") diff --git a/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/package.json b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/package.json new file mode 100644 index 0000000..7f4d170 --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/node_modules/acorn/package.json @@ -0,0 +1,50 @@ +{ + "name": "acorn", + "description": "ECMAScript parser", + "homepage": "https://github.com/acornjs/acorn", + "main": "dist/acorn.js", + "types": "dist/acorn.d.ts", + "module": "dist/acorn.mjs", + "exports": { + ".": [ + { + "import": "./dist/acorn.mjs", + "require": "./dist/acorn.js", + "default": "./dist/acorn.js" + }, + "./dist/acorn.js" + ], + "./package.json": "./package.json" + }, + "version": "8.16.0", + "engines": { + "node": ">=0.4.0" + }, + "maintainers": [ + { + "name": "Marijn Haverbeke", + "email": "marijnh@gmail.com", + "web": "https://marijnhaverbeke.nl" + }, + { + "name": "Ingvar Stepanyan", + "email": "me@rreverser.com", + "web": "https://rreverser.com/" + }, + { + "name": "Adrian Heine", + "web": "http://adrianheine.de" + } + ], + "repository": { + "type": "git", + "url": "git+https://github.com/acornjs/acorn.git" + }, + "license": "MIT", + "scripts": { + "prepare": "cd ..; npm run build:main" + }, + "bin": { + "acorn": "bin/acorn" + } +} diff --git a/sdk/typescript/node_modules/acorn-walk/package.json b/sdk/typescript/node_modules/acorn-walk/package.json new file mode 100644 index 0000000..362add8 --- /dev/null +++ b/sdk/typescript/node_modules/acorn-walk/package.json @@ -0,0 +1,50 @@ +{ + "name": "acorn-walk", + "description": "ECMAScript (ESTree) AST walker", + "homepage": "https://github.com/acornjs/acorn", + "main": "dist/walk.js", + "types": "dist/walk.d.ts", + "module": "dist/walk.mjs", + "exports": { + ".": [ + { + "import": "./dist/walk.mjs", + "require": "./dist/walk.js", + "default": "./dist/walk.js" + }, + "./dist/walk.js" + ], + "./package.json": "./package.json" + }, + "version": "8.3.5", + "engines": { + "node": ">=0.4.0" + }, + "dependencies": { + "acorn": "^8.11.0" + }, + "maintainers": [ + { + "name": "Marijn Haverbeke", + "email": "marijnh@gmail.com", + "web": "https://marijnhaverbeke.nl" + }, + { + "name": "Ingvar Stepanyan", + "email": "me@rreverser.com", + "web": "https://rreverser.com/" + }, + { + "name": "Adrian Heine", + "web": "http://adrianheine.de" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/acornjs/acorn.git" + }, + "scripts": { + "prepare": "cd ..; npm run build:walk" + }, + "license": "MIT" +} diff --git a/sdk/typescript/node_modules/bundle-require/LICENSE b/sdk/typescript/node_modules/bundle-require/LICENSE new file mode 100644 index 0000000..3e7275a --- /dev/null +++ b/sdk/typescript/node_modules/bundle-require/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2021 EGOIST (https://github.com/sponsors/egoist) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE diff --git a/sdk/typescript/node_modules/bundle-require/README.md b/sdk/typescript/node_modules/bundle-require/README.md new file mode 100644 index 0000000..2ef3697 --- /dev/null +++ b/sdk/typescript/node_modules/bundle-require/README.md @@ -0,0 +1,55 @@ +**💛 You can help the author become a full-time open-source maintainer by [sponsoring him on GitHub](https://github.com/sponsors/egoist).** + +--- + +# bundle-require + +[![npm version](https://badgen.net/npm/v/bundle-require)](https://npm.im/bundle-require) [![npm downloads](https://badgen.net/npm/dm/bundle-require)](https://npm.im/bundle-require) [![jsDocs.io](https://img.shields.io/badge/jsDocs.io-reference-blue)](https://www.jsdocs.io/package/bundle-require) + +## Use Case + +Projects like [Vite](https://vitejs.dev) need to load config files provided by the user, but you can't do it with just `require()` because it's not necessarily a CommonJS module, it could also be a `.mjs` or even be written in TypeScript, and that's where the `bundle-require` package comes in, it loads the config file regardless what module format it is. + +## How it works + +- Bundle your file with esbuild, `node_modules` are excluded because it's problematic to try to bundle it + - `__filename`, `__dirname` and `import.meta.url` are replaced with source file's value instead of the one from the temporary output file +- Output file in `esm` format if possible (for `.ts`, `.js` input files) +- Load output file with `import()` if possible +- Return the loaded module and its dependencies (imported files) + +## Install + +```bash +npm i bundle-require esbuild +``` + +`esbuild` is a peer dependency. + +## Usage + +```ts +import { bundleRequire } from 'bundle-require' + +const { mod } = await bundleRequire({ + filepath: './project/vite.config.ts', +}) +``` + +## API + +https://www.jsdocs.io/package/bundle-require + +## Projects Using bundle-require + +Projects that use **bundle-require**: + +- [VuePress](https://github.com/vuejs/vuepress): :memo: Minimalistic Vue-powered static site generator. + +## Sponsors + +[![sponsors](https://sponsors-images.egoist.dev/sponsors.svg)](https://github.com/sponsors/egoist) + +## License + +MIT © [EGOIST](https://github.com/sponsors/egoist) diff --git a/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/LICENSE b/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/LICENSE new file mode 100644 index 0000000..3e7275a --- /dev/null +++ b/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2021 EGOIST (https://github.com/sponsors/egoist) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE diff --git a/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/README.md b/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/README.md new file mode 100644 index 0000000..3a2098d --- /dev/null +++ b/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/README.md @@ -0,0 +1,44 @@ +**💛 You can help the author become a full-time open-source maintainer by [sponsoring him on GitHub](https://github.com/sponsors/egoist).** + +--- + +# load-tsconfig + +[![npm version](https://badgen.net/npm/v/load-tsconfig)](https://npm.im/load-tsconfig) [![npm downloads](https://badgen.net/npm/dm/load-tsconfig)](https://npm.im/load-tsconfig) + +> Load `tsconfig.json`, light-weight and dependency-free. + +## Install + +```bash +npm i load-tsconfig +``` + +## Usage + +```ts +import { loadTsConfig } from "load-tsconfig" + +const loaded = loadTsConfig(".") + +// loaded is null when no tsconfig is found, or: +// loaded.path -> the path to the tsconfig file +// loaded.data -> the merged tsconfig +// loaded.files -> all discovered tsconfig files (via "extends") +``` + +By default it loads `./tsconfig.json`, but you can use a custom filename: + +```ts +loadTsConfig(".", "tsconfig.build.json") +``` + +Full type documentation: https://paka.dev/npm/load-tsconfig + +## Sponsors + +[![sponsors](https://sponsors-images.egoist.sh/sponsors.svg)](https://github.com/sponsors/egoist) + +## License + +MIT © [EGOIST](https://github.com/sponsors/egoist) diff --git a/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/package.json b/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/package.json new file mode 100644 index 0000000..45895e2 --- /dev/null +++ b/sdk/typescript/node_modules/bundle-require/node_modules/load-tsconfig/package.json @@ -0,0 +1,39 @@ +{ + "name": "load-tsconfig", + "version": "0.2.5", + "description": "Load tsconfig.json", + "publishConfig": { + "access": "public" + }, + "files": [ + "dist" + ], + "type": "module", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "default": "./dist/index.cjs" + } + }, + "scripts": { + "build-fast": "tsup src/index.ts --format esm,cjs --target node12.20.0", + "build": "pnpm build-fast --dts-resolve", + "test": "npm run build-fast && vitest run", + "prepublishOnly": "pnpm build" + }, + "license": "MIT", + "devDependencies": { + "@egoist/prettier-config": "1.0.0", + "@types/node": "18.15.3", + "kanpai": "0.11.0", + "prettier": "2.8.4", + "strip-json-comments": "5.0.0", + "tsup": "6.6.3", + "typescript": "5.0.2", + "vitest": "0.29.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } +} diff --git a/sdk/typescript/node_modules/bundle-require/package.json b/sdk/typescript/node_modules/bundle-require/package.json new file mode 100644 index 0000000..e817cab --- /dev/null +++ b/sdk/typescript/node_modules/bundle-require/package.json @@ -0,0 +1,44 @@ +{ + "name": "bundle-require", + "version": "5.1.0", + "description": "bundle and require a file", + "publishConfig": { + "access": "public" + }, + "files": [ + "dist" + ], + "type": "module", + "main": "./dist/index.js", + "exports": { + ".": { + "import": "./dist/index.js", + "default": "./dist/index.cjs" + } + }, + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsup src/index.ts --format esm,cjs --dts-resolve --target node12.20.0", + "test": "npm run build && vitest run", + "prepublishOnly": "npm run build" + }, + "license": "MIT", + "devDependencies": { + "@egoist/prettier-config": "1.0.0", + "@types/node": "18.11.18", + "esbuild": "0.18.20", + "prettier": "2.8.3", + "tsup": "6.5.0", + "typescript": "4.9.5", + "vitest": "0.28.3" + }, + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "peerDependencies": { + "esbuild": ">=0.18" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } +} diff --git a/sdk/typescript/node_modules/cac/LICENSE b/sdk/typescript/node_modules/cac/LICENSE new file mode 100644 index 0000000..0fa9bb5 --- /dev/null +++ b/sdk/typescript/node_modules/cac/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) EGOIST <0x142857@gmail.com> (https://github.com/egoist) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/cac/README.md b/sdk/typescript/node_modules/cac/README.md new file mode 100644 index 0000000..3fd3d16 --- /dev/null +++ b/sdk/typescript/node_modules/cac/README.md @@ -0,0 +1,536 @@ +2017-07-26 9 27 05 + +[![NPM version](https://img.shields.io/npm/v/cac.svg?style=flat)](https://npmjs.com/package/cac) [![NPM downloads](https://img.shields.io/npm/dm/cac.svg?style=flat)](https://npmjs.com/package/cac) [![CircleCI](https://circleci.com/gh/cacjs/cac/tree/master.svg?style=shield)](https://circleci.com/gh/cacjs/cac/tree/master) [![Codecov](https://badgen.net/codecov/c/github/cacjs/cac/master)](https://codecov.io/gh/cacjs/cac) [![donate](https://img.shields.io/badge/$-donate-ff69b4.svg?maxAge=2592000&style=flat)](https://github.com/egoist/donate) [![chat](https://img.shields.io/badge/chat-on%20discord-7289DA.svg?style=flat)](https://chat.egoist.moe) [![install size](https://badgen.net/packagephobia/install/cac)](https://packagephobia.now.sh/result?p=cac) + +## Introduction + +**C**ommand **A**nd **C**onquer is a JavaScript library for building CLI apps. + +## Features + +- **Super light-weight**: No dependency, just a single file. +- **Easy to learn**. There're only 4 APIs you need to learn for building simple CLIs: `cli.option` `cli.version` `cli.help` `cli.parse`. +- **Yet so powerful**. Enable features like default command, git-like subcommands, validation for required arguments and options, variadic arguments, dot-nested options, automated help message generation and so on. +- **Developer friendly**. Written in TypeScript. + +## Table of Contents + + + +- [Install](#install) +- [Usage](#usage) + - [Simple Parsing](#simple-parsing) + - [Display Help Message and Version](#display-help-message-and-version) + - [Command-specific Options](#command-specific-options) + - [Dash in option names](#dash-in-option-names) + - [Brackets](#brackets) + - [Negated Options](#negated-options) + - [Variadic Arguments](#variadic-arguments) + - [Dot-nested Options](#dot-nested-options) + - [Default Command](#default-command) + - [Supply an array as option value](#supply-an-array-as-option-value) + - [Error Handling](#error-handling) + - [With TypeScript](#with-typescript) + - [With Deno](#with-deno) +- [Projects Using CAC](#projects-using-cac) +- [References](#references) + - [CLI Instance](#cli-instance) + - [cac(name?)](#cacname) + - [cli.command(name, description, config?)](#clicommandname-description-config) + - [cli.option(name, description, config?)](#clioptionname-description-config) + - [cli.parse(argv?)](#cliparseargv) + - [cli.version(version, customFlags?)](#cliversionversion-customflags) + - [cli.help(callback?)](#clihelpcallback) + - [cli.outputHelp()](#clioutputhelp) + - [cli.usage(text)](#cliusagetext) + - [Command Instance](#command-instance) + - [command.option()](#commandoption) + - [command.action(callback)](#commandactioncallback) + - [command.alias(name)](#commandaliasname) + - [command.allowUnknownOptions()](#commandallowunknownoptions) + - [command.example(example)](#commandexampleexample) + - [command.usage(text)](#commandusagetext) + - [Events](#events) +- [FAQ](#faq) + - [How is the name written and pronounced?](#how-is-the-name-written-and-pronounced) + - [Why not use Commander.js?](#why-not-use-commanderjs) +- [Project Stats](#project-stats) +- [Contributing](#contributing) +- [Author](#author) + + + +## Install + +```bash +yarn add cac +``` + +## Usage + +### Simple Parsing + +Use CAC as simple argument parser: + +```js +// examples/basic-usage.js +const cli = require('cac')() + +cli.option('--type ', 'Choose a project type', { + default: 'node', +}) + +const parsed = cli.parse() + +console.log(JSON.stringify(parsed, null, 2)) +``` + +2018-11-26 12 28 03 + +### Display Help Message and Version + +```js +// examples/help.js +const cli = require('cac')() + +cli.option('--type [type]', 'Choose a project type', { + default: 'node', +}) +cli.option('--name ', 'Provide your name') + +cli.command('lint [...files]', 'Lint files').action((files, options) => { + console.log(files, options) +}) + +// Display help message when `-h` or `--help` appears +cli.help() +// Display version number when `-v` or `--version` appears +// It's also used in help message +cli.version('0.0.0') + +cli.parse() +``` + +2018-11-25 8 21 14 + +### Command-specific Options + +You can attach options to a command. + +```js +const cli = require('cac')() + +cli + .command('rm ', 'Remove a dir') + .option('-r, --recursive', 'Remove recursively') + .action((dir, options) => { + console.log('remove ' + dir + (options.recursive ? ' recursively' : '')) + }) + +cli.help() + +cli.parse() +``` + +A command's options are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated. If you really want to use unknown options, use [`command.allowUnknownOptions`](#commandallowunknownoptions). + +command options + +### Dash in option names + +Options in kebab-case should be referenced in camelCase in your code: + +```js +cli + .command('dev', 'Start dev server') + .option('--clear-screen', 'Clear screen') + .action((options) => { + console.log(options.clearScreen) + }) +``` + +In fact `--clear-screen` and `--clearScreen` are both mapped to `options.clearScreen`. + +### Brackets + +When using brackets in command name, angled brackets indicate required command arguments, while square bracket indicate optional arguments. + +When using brackets in option name, angled brackets indicate that a string / number value is required, while square bracket indicate that the value can also be `true`. + +```js +const cli = require('cac')() + +cli + .command('deploy ', 'Deploy a folder to AWS') + .option('--scale [level]', 'Scaling level') + .action((folder, options) => { + // ... + }) + +cli + .command('build [project]', 'Build a project') + .option('--out ', 'Output directory') + .action((folder, options) => { + // ... + }) + +cli.parse() +``` + +### Negated Options + +To allow an option whose value is `false`, you need to manually specify a negated option: + +```js +cli + .command('build [project]', 'Build a project') + .option('--no-config', 'Disable config file') + .option('--config ', 'Use a custom config file') +``` + +This will let CAC set the default value of `config` to true, and you can use `--no-config` flag to set it to `false`. + +### Variadic Arguments + +The last argument of a command can be variadic, and only the last argument. To make an argument variadic you have to add `...` to the start of argument name, just like the rest operator in JavaScript. Here is an example: + +```js +const cli = require('cac')() + +cli + .command('build [...otherFiles]', 'Build your app') + .option('--foo', 'Foo option') + .action((entry, otherFiles, options) => { + console.log(entry) + console.log(otherFiles) + console.log(options) + }) + +cli.help() + +cli.parse() +``` + +2018-11-25 8 25 30 + +### Dot-nested Options + +Dot-nested options will be merged into a single option. + +```js +const cli = require('cac')() + +cli + .command('build', 'desc') + .option('--env ', 'Set envs') + .example('--env.API_SECRET xxx') + .action((options) => { + console.log(options) + }) + +cli.help() + +cli.parse() +``` + +2018-11-25 9 37 53 + +### Default Command + +Register a command that will be used when no other command is matched. + +```js +const cli = require('cac')() + +cli + // Simply omit the command name, just brackets + .command('[...files]', 'Build files') + .option('--minimize', 'Minimize output') + .action((files, options) => { + console.log(files) + console.log(options.minimize) + }) + +cli.parse() +``` + +### Supply an array as option value + +```bash +node cli.js --include project-a +# The parsed options will be: +# { include: 'project-a' } + +node cli.js --include project-a --include project-b +# The parsed options will be: +# { include: ['project-a', 'project-b'] } +``` + +### Error Handling + +To handle command errors globally: + +```js +try { + // Parse CLI args without running the command + cli.parse(process.argv, { run: false }) + // Run the command yourself + // You only need `await` when your command action returns a Promise + await cli.runMatchedCommand() +} catch (error) { + // Handle error here.. + // e.g. + // console.error(error.stack) + // process.exit(1) +} +``` + +### With TypeScript + +First you need `@types/node` to be installed as a dev dependency in your project: + +```bash +yarn add @types/node --dev +``` + +Then everything just works out of the box: + +```js +const { cac } = require('cac') +// OR ES modules +import { cac } from 'cac' +``` + +### With Deno + +```ts +import { cac } from 'https://unpkg.com/cac/mod.ts' + +const cli = cac('my-program') +``` + +## Projects Using CAC + +Projects that use **CAC**: + +- [VuePress](https://github.com/vuejs/vuepress): :memo: Minimalistic Vue-powered static site generator. +- [SAO](https://github.com/egoist/sao): ⚔️ Futuristic scaffolding tool. +- [DocPad](https://github.com/docpad/docpad): 🏹 Powerful Static Site Generator. +- [Poi](https://github.com/egoist/poi): ⚡️ Delightful web development. +- [bili](https://github.com/egoist/bili): 🥂 Schweizer Armeemesser for bundling JavaScript libraries. +- [Lad](https://github.com/ladjs/lad): 👦 Lad scaffolds a Koa webapp and API framework for Node.js. +- [Lass](https://github.com/lassjs/lass): 💁🏻 Scaffold a modern package boilerplate for Node.js. +- [Foy](https://github.com/zaaack/foy): 🏗 A lightweight and modern task runner and build tool for general purpose. +- [Vuese](https://github.com/vuese/vuese): 🤗 One-stop solution for vue component documentation. +- [NUT](https://github.com/nut-project/nut): 🌰 A framework born for microfrontends +- Feel free to add yours here... + +## References + +**💁 Check out [the generated docs](https://cac-api-doc.egoist.sh/classes/_cac_.cac.html) from source code if you want a more in-depth API references.** + +Below is a brief overview. + +### CLI Instance + +CLI instance is created by invoking the `cac` function: + +```js +const cac = require('cac') +const cli = cac() +``` + +#### cac(name?) + +Create a CLI instance, optionally specify the program name which will be used to display in help and version message. When not set we use the basename of `argv[1]`. + +#### cli.command(name, description, config?) + +- Type: `(name: string, description: string) => Command` + +Create a command instance. + +The option also accepts a third argument `config` for additional command config: + +- `config.allowUnknownOptions`: `boolean` Allow unknown options in this command. +- `config.ignoreOptionDefaultValue`: `boolean` Don't use the options's default value in parsed options, only display them in help message. + +#### cli.option(name, description, config?) + +- Type: `(name: string, description: string, config?: OptionConfig) => CLI` + +Add a global option. + +The option also accepts a third argument `config` for additional option config: + +- `config.default`: Default value for the option. +- `config.type`: `any[]` When set to `[]`, the option value returns an array type. You can also use a conversion function such as `[String]`, which will invoke the option value with `String`. + +#### cli.parse(argv?) + +- Type: `(argv = process.argv) => ParsedArgv` + +```ts +interface ParsedArgv { + args: string[] + options: { + [k: string]: any + } +} +``` + +When this method is called, `cli.rawArgs` `cli.args` `cli.options` `cli.matchedCommand` will also be available. + +#### cli.version(version, customFlags?) + +- Type: `(version: string, customFlags = '-v, --version') => CLI` + +Output version number when `-v, --version` flag appears. + +#### cli.help(callback?) + +- Type: `(callback?: HelpCallback) => CLI` + +Output help message when `-h, --help` flag appears. + +Optional `callback` allows post-processing of help text before it is displayed: + +```ts +type HelpCallback = (sections: HelpSection[]) => void + +interface HelpSection { + title?: string + body: string +} +``` + +#### cli.outputHelp() + +- Type: `() => CLI` + +Output help message. + +#### cli.usage(text) + +- Type: `(text: string) => CLI` + +Add a global usage text. This is not used by sub-commands. + +### Command Instance + +Command instance is created by invoking the `cli.command` method: + +```js +const command = cli.command('build [...files]', 'Build given files') +``` + +#### command.option() + +Basically the same as `cli.option` but this adds the option to specific command. + +#### command.action(callback) + +- Type: `(callback: ActionCallback) => Command` + +Use a callback function as the command action when the command matches user inputs. + +```ts +type ActionCallback = ( + // Parsed CLI args + // The last arg will be an array if it's a variadic argument + ...args: string | string[] | number | number[] + // Parsed CLI options + options: Options +) => any + +interface Options { + [k: string]: any +} +``` + +#### command.alias(name) + +- Type: `(name: string) => Command` + +Add an alias name to this command, the `name` here can't contain brackets. + +#### command.allowUnknownOptions() + +- Type: `() => Command` + +Allow unknown options in this command, by default CAC will log an error when unknown options are used. + +#### command.example(example) + +- Type: `(example: CommandExample) => Command` + +Add an example which will be displayed at the end of help message. + +```ts +type CommandExample = ((name: string) => string) | string +``` + +#### command.usage(text) + +- Type: `(text: string) => Command` + +Add a usage text for this command. + +### Events + +Listen to commands: + +```js +// Listen to the `foo` command +cli.on('command:foo', () => { + // Do something +}) + +// Listen to the default command +cli.on('command:!', () => { + // Do something +}) + +// Listen to unknown commands +cli.on('command:*', () => { + console.error('Invalid command: %s', cli.args.join(' ')) + process.exit(1) +}) +``` + +## FAQ + +### How is the name written and pronounced? + +CAC, or cac, pronounced `C-A-C`. + +This project is dedicated to our lovely C.C. sama. Maybe CAC stands for C&C as well :P + + + +### Why not use Commander.js? + +CAC is very similar to Commander.js, while the latter does not support dot nested options, i.e. something like `--env.API_SECRET foo`. Besides, you can't use unknown options in Commander.js either. + +_And maybe more..._ + +Basically I made CAC to fulfill my own needs for building CLI apps like [Poi](https://poi.js.org), [SAO](https://sao.vercel.app) and all my CLI apps. It's small, simple but powerful :P + +## Project Stats + +![Alt](https://repobeats.axiom.co/api/embed/58caf6203631bcdb9bbe22f0728a0af1683dc0bb.svg 'Repobeats analytics image') + +## Contributing + +1. Fork it! +2. Create your feature branch: `git checkout -b my-new-feature` +3. Commit your changes: `git commit -am 'Add some feature'` +4. Push to the branch: `git push origin my-new-feature` +5. Submit a pull request :D + +## Author + +**CAC** © [EGOIST](https://github.com/egoist), Released under the [MIT](./LICENSE) License.
+Authored and maintained by egoist with help from contributors ([list](https://github.com/cacjs/cac/contributors)). + +> [Website](https://egoist.sh) · GitHub [@egoist](https://github.com/egoist) · Twitter [@\_egoistlily](https://twitter.com/_egoistlily) diff --git a/sdk/typescript/node_modules/cac/deno/CAC.ts b/sdk/typescript/node_modules/cac/deno/CAC.ts new file mode 100644 index 0000000..0ced3b1 --- /dev/null +++ b/sdk/typescript/node_modules/cac/deno/CAC.ts @@ -0,0 +1,331 @@ +import { EventEmitter } from "https://deno.land/std@0.114.0/node/events.ts"; +import mri from "https://cdn.skypack.dev/mri"; +import Command, { GlobalCommand, CommandConfig, HelpCallback, CommandExample } from "./Command.ts"; +import { OptionConfig } from "./Option.ts"; +import { getMriOptions, setDotProp, setByType, getFileName, camelcaseOptionName } from "./utils.ts"; +import { processArgs } from "./deno.ts"; +interface ParsedArgv { + args: ReadonlyArray; + options: { + [k: string]: any; + }; +} + +class CAC extends EventEmitter { + /** The program name to display in help and version message */ + name: string; + commands: Command[]; + globalCommand: GlobalCommand; + matchedCommand?: Command; + matchedCommandName?: string; + /** + * Raw CLI arguments + */ + + rawArgs: string[]; + /** + * Parsed CLI arguments + */ + + args: ParsedArgv['args']; + /** + * Parsed CLI options, camelCased + */ + + options: ParsedArgv['options']; + showHelpOnExit?: boolean; + showVersionOnExit?: boolean; + /** + * @param name The program name to display in help and version message + */ + + constructor(name = '') { + super(); + this.name = name; + this.commands = []; + this.rawArgs = []; + this.args = []; + this.options = {}; + this.globalCommand = new GlobalCommand(this); + this.globalCommand.usage(' [options]'); + } + /** + * Add a global usage text. + * + * This is not used by sub-commands. + */ + + + usage(text: string) { + this.globalCommand.usage(text); + return this; + } + /** + * Add a sub-command + */ + + + command(rawName: string, description?: string, config?: CommandConfig) { + const command = new Command(rawName, description || '', config, this); + command.globalCommand = this.globalCommand; + this.commands.push(command); + return command; + } + /** + * Add a global CLI option. + * + * Which is also applied to sub-commands. + */ + + + option(rawName: string, description: string, config?: OptionConfig) { + this.globalCommand.option(rawName, description, config); + return this; + } + /** + * Show help message when `-h, --help` flags appear. + * + */ + + + help(callback?: HelpCallback) { + this.globalCommand.option('-h, --help', 'Display this message'); + this.globalCommand.helpCallback = callback; + this.showHelpOnExit = true; + return this; + } + /** + * Show version number when `-v, --version` flags appear. + * + */ + + + version(version: string, customFlags = '-v, --version') { + this.globalCommand.version(version, customFlags); + this.showVersionOnExit = true; + return this; + } + /** + * Add a global example. + * + * This example added here will not be used by sub-commands. + */ + + + example(example: CommandExample) { + this.globalCommand.example(example); + return this; + } + /** + * Output the corresponding help message + * When a sub-command is matched, output the help message for the command + * Otherwise output the global one. + * + */ + + + outputHelp() { + if (this.matchedCommand) { + this.matchedCommand.outputHelp(); + } else { + this.globalCommand.outputHelp(); + } + } + /** + * Output the version number. + * + */ + + + outputVersion() { + this.globalCommand.outputVersion(); + } + + private setParsedInfo({ + args, + options + }: ParsedArgv, matchedCommand?: Command, matchedCommandName?: string) { + this.args = args; + this.options = options; + + if (matchedCommand) { + this.matchedCommand = matchedCommand; + } + + if (matchedCommandName) { + this.matchedCommandName = matchedCommandName; + } + + return this; + } + + unsetMatchedCommand() { + this.matchedCommand = undefined; + this.matchedCommandName = undefined; + } + /** + * Parse argv + */ + + + parse(argv = processArgs, { + /** Whether to run the action for matched command */ + run = true + } = {}): ParsedArgv { + this.rawArgs = argv; + + if (!this.name) { + this.name = argv[1] ? getFileName(argv[1]) : 'cli'; + } + + let shouldParse = true; // Search sub-commands + + for (const command of this.commands) { + const parsed = this.mri(argv.slice(2), command); + const commandName = parsed.args[0]; + + if (command.isMatched(commandName)) { + shouldParse = false; + const parsedInfo = { ...parsed, + args: parsed.args.slice(1) + }; + this.setParsedInfo(parsedInfo, command, commandName); + this.emit(`command:${commandName}`, command); + } + } + + if (shouldParse) { + // Search the default command + for (const command of this.commands) { + if (command.name === '') { + shouldParse = false; + const parsed = this.mri(argv.slice(2), command); + this.setParsedInfo(parsed, command); + this.emit(`command:!`, command); + } + } + } + + if (shouldParse) { + const parsed = this.mri(argv.slice(2)); + this.setParsedInfo(parsed); + } + + if (this.options.help && this.showHelpOnExit) { + this.outputHelp(); + run = false; + this.unsetMatchedCommand(); + } + + if (this.options.version && this.showVersionOnExit && this.matchedCommandName == null) { + this.outputVersion(); + run = false; + this.unsetMatchedCommand(); + } + + const parsedArgv = { + args: this.args, + options: this.options + }; + + if (run) { + this.runMatchedCommand(); + } + + if (!this.matchedCommand && this.args[0]) { + this.emit('command:*'); + } + + return parsedArgv; + } + + private mri(argv: string[], + /** Matched command */ + command?: Command): ParsedArgv { + // All added options + const cliOptions = [...this.globalCommand.options, ...(command ? command.options : [])]; + const mriOptions = getMriOptions(cliOptions); // Extract everything after `--` since mri doesn't support it + + let argsAfterDoubleDashes: string[] = []; + const doubleDashesIndex = argv.indexOf('--'); + + if (doubleDashesIndex > -1) { + argsAfterDoubleDashes = argv.slice(doubleDashesIndex + 1); + argv = argv.slice(0, doubleDashesIndex); + } + + let parsed = mri(argv, mriOptions); + parsed = Object.keys(parsed).reduce((res, name) => { + return { ...res, + [camelcaseOptionName(name)]: parsed[name] + }; + }, { + _: [] + }); + const args = parsed._; + const options: { + [k: string]: any; + } = { + '--': argsAfterDoubleDashes + }; // Set option default value + + const ignoreDefault = command && command.config.ignoreOptionDefaultValue ? command.config.ignoreOptionDefaultValue : this.globalCommand.config.ignoreOptionDefaultValue; + let transforms = Object.create(null); + + for (const cliOption of cliOptions) { + if (!ignoreDefault && cliOption.config.default !== undefined) { + for (const name of cliOption.names) { + options[name] = cliOption.config.default; + } + } // If options type is defined + + + if (Array.isArray(cliOption.config.type)) { + if (transforms[cliOption.name] === undefined) { + transforms[cliOption.name] = Object.create(null); + transforms[cliOption.name]['shouldTransform'] = true; + transforms[cliOption.name]['transformFunction'] = cliOption.config.type[0]; + } + } + } // Set option values (support dot-nested property name) + + + for (const key of Object.keys(parsed)) { + if (key !== '_') { + const keys = key.split('.'); + setDotProp(options, keys, parsed[key]); + setByType(options, transforms); + } + } + + return { + args, + options + }; + } + + runMatchedCommand() { + const { + args, + options, + matchedCommand: command + } = this; + if (!command || !command.commandAction) return; + command.checkUnknownOptions(); + command.checkOptionValue(); + command.checkRequiredArgs(); + const actionArgs: any[] = []; + command.args.forEach((arg, index) => { + if (arg.variadic) { + actionArgs.push(args.slice(index)); + } else { + actionArgs.push(args[index]); + } + }); + actionArgs.push(options); + return command.commandAction.apply(this, actionArgs); + } + +} + +export default CAC; \ No newline at end of file diff --git a/sdk/typescript/node_modules/cac/deno/Command.ts b/sdk/typescript/node_modules/cac/deno/Command.ts new file mode 100644 index 0000000..3fd04a0 --- /dev/null +++ b/sdk/typescript/node_modules/cac/deno/Command.ts @@ -0,0 +1,269 @@ +import CAC from "./CAC.ts"; +import Option, { OptionConfig } from "./Option.ts"; +import { removeBrackets, findAllBrackets, findLongest, padRight, CACError } from "./utils.ts"; +import { platformInfo } from "./deno.ts"; +interface CommandArg { + required: boolean; + value: string; + variadic: boolean; +} +interface HelpSection { + title?: string; + body: string; +} +interface CommandConfig { + allowUnknownOptions?: boolean; + ignoreOptionDefaultValue?: boolean; +} +type HelpCallback = (sections: HelpSection[]) => void | HelpSection[]; +type CommandExample = ((bin: string) => string) | string; + +class Command { + options: Option[]; + aliasNames: string[]; + /* Parsed command name */ + + name: string; + args: CommandArg[]; + commandAction?: (...args: any[]) => any; + usageText?: string; + versionNumber?: string; + examples: CommandExample[]; + helpCallback?: HelpCallback; + globalCommand?: GlobalCommand; + + constructor(public rawName: string, public description: string, public config: CommandConfig = {}, public cli: CAC) { + this.options = []; + this.aliasNames = []; + this.name = removeBrackets(rawName); + this.args = findAllBrackets(rawName); + this.examples = []; + } + + usage(text: string) { + this.usageText = text; + return this; + } + + allowUnknownOptions() { + this.config.allowUnknownOptions = true; + return this; + } + + ignoreOptionDefaultValue() { + this.config.ignoreOptionDefaultValue = true; + return this; + } + + version(version: string, customFlags = '-v, --version') { + this.versionNumber = version; + this.option(customFlags, 'Display version number'); + return this; + } + + example(example: CommandExample) { + this.examples.push(example); + return this; + } + /** + * Add a option for this command + * @param rawName Raw option name(s) + * @param description Option description + * @param config Option config + */ + + + option(rawName: string, description: string, config?: OptionConfig) { + const option = new Option(rawName, description, config); + this.options.push(option); + return this; + } + + alias(name: string) { + this.aliasNames.push(name); + return this; + } + + action(callback: (...args: any[]) => any) { + this.commandAction = callback; + return this; + } + /** + * Check if a command name is matched by this command + * @param name Command name + */ + + + isMatched(name: string) { + return this.name === name || this.aliasNames.includes(name); + } + + get isDefaultCommand() { + return this.name === '' || this.aliasNames.includes('!'); + } + + get isGlobalCommand(): boolean { + return this instanceof GlobalCommand; + } + /** + * Check if an option is registered in this command + * @param name Option name + */ + + + hasOption(name: string) { + name = name.split('.')[0]; + return this.options.find(option => { + return option.names.includes(name); + }); + } + + outputHelp() { + const { + name, + commands + } = this.cli; + const { + versionNumber, + options: globalOptions, + helpCallback + } = this.cli.globalCommand; + let sections: HelpSection[] = [{ + body: `${name}${versionNumber ? `/${versionNumber}` : ''}` + }]; + sections.push({ + title: 'Usage', + body: ` $ ${name} ${this.usageText || this.rawName}` + }); + const showCommands = (this.isGlobalCommand || this.isDefaultCommand) && commands.length > 0; + + if (showCommands) { + const longestCommandName = findLongest(commands.map(command => command.rawName)); + sections.push({ + title: 'Commands', + body: commands.map(command => { + return ` ${padRight(command.rawName, longestCommandName.length)} ${command.description}`; + }).join('\n') + }); + sections.push({ + title: `For more info, run any command with the \`--help\` flag`, + body: commands.map(command => ` $ ${name}${command.name === '' ? '' : ` ${command.name}`} --help`).join('\n') + }); + } + + let options = this.isGlobalCommand ? globalOptions : [...this.options, ...(globalOptions || [])]; + + if (!this.isGlobalCommand && !this.isDefaultCommand) { + options = options.filter(option => option.name !== 'version'); + } + + if (options.length > 0) { + const longestOptionName = findLongest(options.map(option => option.rawName)); + sections.push({ + title: 'Options', + body: options.map(option => { + return ` ${padRight(option.rawName, longestOptionName.length)} ${option.description} ${option.config.default === undefined ? '' : `(default: ${option.config.default})`}`; + }).join('\n') + }); + } + + if (this.examples.length > 0) { + sections.push({ + title: 'Examples', + body: this.examples.map(example => { + if (typeof example === 'function') { + return example(name); + } + + return example; + }).join('\n') + }); + } + + if (helpCallback) { + sections = helpCallback(sections) || sections; + } + + console.log(sections.map(section => { + return section.title ? `${section.title}:\n${section.body}` : section.body; + }).join('\n\n')); + } + + outputVersion() { + const { + name + } = this.cli; + const { + versionNumber + } = this.cli.globalCommand; + + if (versionNumber) { + console.log(`${name}/${versionNumber} ${platformInfo}`); + } + } + + checkRequiredArgs() { + const minimalArgsCount = this.args.filter(arg => arg.required).length; + + if (this.cli.args.length < minimalArgsCount) { + throw new CACError(`missing required args for command \`${this.rawName}\``); + } + } + /** + * Check if the parsed options contain any unknown options + * + * Exit and output error when true + */ + + + checkUnknownOptions() { + const { + options, + globalCommand + } = this.cli; + + if (!this.config.allowUnknownOptions) { + for (const name of Object.keys(options)) { + if (name !== '--' && !this.hasOption(name) && !globalCommand.hasOption(name)) { + throw new CACError(`Unknown option \`${name.length > 1 ? `--${name}` : `-${name}`}\``); + } + } + } + } + /** + * Check if the required string-type options exist + */ + + + checkOptionValue() { + const { + options: parsedOptions, + globalCommand + } = this.cli; + const options = [...globalCommand.options, ...this.options]; + + for (const option of options) { + const value = parsedOptions[option.name.split('.')[0]]; // Check required option value + + if (option.required) { + const hasNegated = options.some(o => o.negated && o.names.includes(option.name)); + + if (value === true || value === false && !hasNegated) { + throw new CACError(`option \`${option.rawName}\` value is missing`); + } + } + } + } + +} + +class GlobalCommand extends Command { + constructor(cli: CAC) { + super('@@global@@', '', {}, cli); + } + +} + +export type { HelpCallback, CommandExample, CommandConfig }; +export { GlobalCommand }; +export default Command; \ No newline at end of file diff --git a/sdk/typescript/node_modules/cac/deno/Option.ts b/sdk/typescript/node_modules/cac/deno/Option.ts new file mode 100644 index 0000000..ee7ed2d --- /dev/null +++ b/sdk/typescript/node_modules/cac/deno/Option.ts @@ -0,0 +1,52 @@ +import { removeBrackets, camelcaseOptionName } from "./utils.ts"; +interface OptionConfig { + default?: any; + type?: any[]; +} +export default class Option { + /** Option name */ + name: string; + /** Option name and aliases */ + + names: string[]; + isBoolean?: boolean; // `required` will be a boolean for options with brackets + + required?: boolean; + config: OptionConfig; + negated: boolean; + + constructor(public rawName: string, public description: string, config?: OptionConfig) { + this.config = Object.assign({}, config); // You may use cli.option('--env.* [value]', 'desc') to denote a dot-nested option + + rawName = rawName.replace(/\.\*/g, ''); + this.negated = false; + this.names = removeBrackets(rawName).split(',').map((v: string) => { + let name = v.trim().replace(/^-{1,2}/, ''); + + if (name.startsWith('no-')) { + this.negated = true; + name = name.replace(/^no-/, ''); + } + + return camelcaseOptionName(name); + }).sort((a, b) => a.length > b.length ? 1 : -1); // Sort names + // Use the longest name (last one) as actual option name + + this.name = this.names[this.names.length - 1]; + + if (this.negated && this.config.default == null) { + this.config.default = true; + } + + if (rawName.includes('<')) { + this.required = true; + } else if (rawName.includes('[')) { + this.required = false; + } else { + // No arg needed, it's boolean flag + this.isBoolean = true; + } + } + +} +export type { OptionConfig }; \ No newline at end of file diff --git a/sdk/typescript/node_modules/cac/deno/deno.ts b/sdk/typescript/node_modules/cac/deno/deno.ts new file mode 100644 index 0000000..2f8e7d9 --- /dev/null +++ b/sdk/typescript/node_modules/cac/deno/deno.ts @@ -0,0 +1,4 @@ +// Ignore the TypeScript errors +// Since this file will only be used in Deno runtime +export const processArgs = ['deno', 'cli'].concat(Deno.args); +export const platformInfo = `${Deno.build.os}-${Deno.build.arch} deno-${Deno.version.deno}`; \ No newline at end of file diff --git a/sdk/typescript/node_modules/cac/deno/index.ts b/sdk/typescript/node_modules/cac/deno/index.ts new file mode 100644 index 0000000..55aa29b --- /dev/null +++ b/sdk/typescript/node_modules/cac/deno/index.ts @@ -0,0 +1,10 @@ +import CAC from "./CAC.ts"; +import Command from "./Command.ts"; +/** + * @param name The program name to display in help and version message + */ + +const cac = (name = '') => new CAC(name); + +export default cac; +export { cac, CAC, Command }; \ No newline at end of file diff --git a/sdk/typescript/node_modules/cac/deno/utils.ts b/sdk/typescript/node_modules/cac/deno/utils.ts new file mode 100644 index 0000000..d75847b --- /dev/null +++ b/sdk/typescript/node_modules/cac/deno/utils.ts @@ -0,0 +1,145 @@ +import Option from "./Option.ts"; +export const removeBrackets = (v: string) => v.replace(/[<[].+/, '').trim(); +export const findAllBrackets = (v: string) => { + const ANGLED_BRACKET_RE_GLOBAL = /<([^>]+)>/g; + const SQUARE_BRACKET_RE_GLOBAL = /\[([^\]]+)\]/g; + const res = []; + + const parse = (match: string[]) => { + let variadic = false; + let value = match[1]; + + if (value.startsWith('...')) { + value = value.slice(3); + variadic = true; + } + + return { + required: match[0].startsWith('<'), + value, + variadic + }; + }; + + let angledMatch; + + while (angledMatch = ANGLED_BRACKET_RE_GLOBAL.exec(v)) { + res.push(parse(angledMatch)); + } + + let squareMatch; + + while (squareMatch = SQUARE_BRACKET_RE_GLOBAL.exec(v)) { + res.push(parse(squareMatch)); + } + + return res; +}; +interface MriOptions { + alias: { + [k: string]: string[]; + }; + boolean: string[]; +} +export const getMriOptions = (options: Option[]) => { + const result: MriOptions = { + alias: {}, + boolean: [] + }; + + for (const [index, option] of options.entries()) { + // We do not set default values in mri options + // Since its type (typeof) will be used to cast parsed arguments. + // Which mean `--foo foo` will be parsed as `{foo: true}` if we have `{default:{foo: true}}` + // Set alias + if (option.names.length > 1) { + result.alias[option.names[0]] = option.names.slice(1); + } // Set boolean + + + if (option.isBoolean) { + if (option.negated) { + // For negated option + // We only set it to `boolean` type when there's no string-type option with the same name + const hasStringTypeOption = options.some((o, i) => { + return i !== index && o.names.some(name => option.names.includes(name)) && typeof o.required === 'boolean'; + }); + + if (!hasStringTypeOption) { + result.boolean.push(option.names[0]); + } + } else { + result.boolean.push(option.names[0]); + } + } + } + + return result; +}; +export const findLongest = (arr: string[]) => { + return arr.sort((a, b) => { + return a.length > b.length ? -1 : 1; + })[0]; +}; +export const padRight = (str: string, length: number) => { + return str.length >= length ? str : `${str}${' '.repeat(length - str.length)}`; +}; +export const camelcase = (input: string) => { + return input.replace(/([a-z])-([a-z])/g, (_, p1, p2) => { + return p1 + p2.toUpperCase(); + }); +}; +export const setDotProp = (obj: { + [k: string]: any; +}, keys: string[], val: any) => { + let i = 0; + let length = keys.length; + let t = obj; + let x; + + for (; i < length; ++i) { + x = t[keys[i]]; + t = t[keys[i]] = i === length - 1 ? val : x != null ? x : !!~keys[i + 1].indexOf('.') || !(+keys[i + 1] > -1) ? {} : []; + } +}; +export const setByType = (obj: { + [k: string]: any; +}, transforms: { + [k: string]: any; +}) => { + for (const key of Object.keys(transforms)) { + const transform = transforms[key]; + + if (transform.shouldTransform) { + obj[key] = Array.prototype.concat.call([], obj[key]); + + if (typeof transform.transformFunction === 'function') { + obj[key] = obj[key].map(transform.transformFunction); + } + } + } +}; +export const getFileName = (input: string) => { + const m = /([^\\\/]+)$/.exec(input); + return m ? m[1] : ''; +}; +export const camelcaseOptionName = (name: string) => { + // Camelcase the option name + // Don't camelcase anything after the dot `.` + return name.split('.').map((v, i) => { + return i === 0 ? camelcase(v) : v; + }).join('.'); +}; +export class CACError extends Error { + constructor(message: string) { + super(message); + this.name = this.constructor.name; + + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = new Error(message).stack; + } + } + +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/cac/index-compat.js b/sdk/typescript/node_modules/cac/index-compat.js new file mode 100644 index 0000000..6b8a78d --- /dev/null +++ b/sdk/typescript/node_modules/cac/index-compat.js @@ -0,0 +1,11 @@ +const { cac, CAC, Command } = require('./dist/index') + +// For backwards compatibility +module.exports = cac + +Object.assign(module.exports, { + default: cac, + cac, + CAC, + Command, +}) diff --git a/sdk/typescript/node_modules/cac/mod.js b/sdk/typescript/node_modules/cac/mod.js new file mode 100644 index 0000000..9d0e894 --- /dev/null +++ b/sdk/typescript/node_modules/cac/mod.js @@ -0,0 +1,2 @@ +// Deno users should use mod.ts instead +export * from './deno/index.ts' \ No newline at end of file diff --git a/sdk/typescript/node_modules/cac/mod.ts b/sdk/typescript/node_modules/cac/mod.ts new file mode 100644 index 0000000..8fac7d9 --- /dev/null +++ b/sdk/typescript/node_modules/cac/mod.ts @@ -0,0 +1,2 @@ +// For Deno +export * from './deno/index.ts' diff --git a/sdk/typescript/node_modules/cac/package.json b/sdk/typescript/node_modules/cac/package.json new file mode 100644 index 0000000..2306bf3 --- /dev/null +++ b/sdk/typescript/node_modules/cac/package.json @@ -0,0 +1,104 @@ +{ + "name": "cac", + "version": "6.7.14", + "description": "Simple yet powerful framework for building command-line apps.", + "repository": { + "url": "egoist/cac", + "type": "git" + }, + "main": "index-compat.js", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./index-compat.js" + }, + "./package.json": "./package.json", + "./*": "./*" + }, + "files": [ + "dist", + "!**/__test__/**", + "/mod.js", + "/mod.ts", + "/deno", + "/index-compat.js" + ], + "scripts": { + "test": "jest", + "test:cov": "jest --coverage", + "build:deno": "node -r sucrase/register scripts/build-deno.ts", + "build:node": "rollup -c", + "build": "yarn build:deno && yarn build:node", + "toc": "markdown-toc -i README.md", + "prepublishOnly": "npm run build && cp mod.js mod.mjs", + "docs:api": "typedoc --out api-doc --readme none --exclude \"**/__test__/**\" --theme minimal" + }, + "author": "egoist <0x142857@gmail.com>", + "license": "MIT", + "devDependencies": { + "@babel/core": "^7.12.10", + "@babel/plugin-syntax-typescript": "^7.12.1", + "@rollup/plugin-commonjs": "^17.0.0", + "@rollup/plugin-node-resolve": "^11.0.0", + "@types/fs-extra": "^9.0.5", + "@types/jest": "^26.0.19", + "@types/mri": "^1.1.0", + "cz-conventional-changelog": "^2.1.0", + "esbuild": "^0.8.21", + "eslint-config-rem": "^3.0.0", + "execa": "^5.0.0", + "fs-extra": "^9.0.1", + "globby": "^11.0.1", + "husky": "^1.2.0", + "jest": "^24.9.0", + "lint-staged": "^8.1.0", + "markdown-toc": "^1.2.0", + "mri": "^1.1.6", + "prettier": "^2.2.1", + "rollup": "^2.34.2", + "rollup-plugin-dts": "^2.0.1", + "rollup-plugin-esbuild": "^2.6.1", + "semantic-release": "^17.3.0", + "sucrase": "^3.16.0", + "ts-jest": "^26.4.4", + "ts-node": "^9.1.1", + "typedoc": "^0.19.2", + "typescript": "^4.1.2" + }, + "engines": { + "node": ">=8" + }, + "release": { + "branch": "master" + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } + }, + "lint-staged": { + "linters": { + "*.{js,json,ts}": [ + "prettier --write", + "git add" + ], + "*.md": [ + "markdown-toc -i", + "prettier --write", + "git add" + ] + }, + "ignore": [ + "dist/**", + "mod.js" + ] + }, + "husky": { + "hooks": { + "pre-commit": "npm t && lint-staged" + } + } +} diff --git a/sdk/typescript/node_modules/chai/CODEOWNERS b/sdk/typescript/node_modules/chai/CODEOWNERS new file mode 100644 index 0000000..ea74b66 --- /dev/null +++ b/sdk/typescript/node_modules/chai/CODEOWNERS @@ -0,0 +1 @@ +* @chaijs/chai diff --git a/sdk/typescript/node_modules/chai/CODE_OF_CONDUCT.md b/sdk/typescript/node_modules/chai/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..074addc --- /dev/null +++ b/sdk/typescript/node_modules/chai/CODE_OF_CONDUCT.md @@ -0,0 +1,58 @@ +# Contributor Code of Conduct + +> Read in: [Español](http://contributor-covenant.org/version/1/3/0/es/) | +[Français](http://contributor-covenant.org/version/1/3/0/fr/) | +[Italiano](http://contributor-covenant.org/version/1/3/0/it/) | +[Magyar](http://contributor-covenant.org/version/1/3/0/hu/) | +[Polskie](http://contributor-covenant.org/version/1/3/0/pl/) | +[Português](http://contributor-covenant.org/version/1/3/0/pt/) | +[Português do Brasil](http://contributor-covenant.org/version/1/3/0/pt_br/) + +As contributors and maintainers of this project, and in the interest of +fostering an open and welcoming community, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating +documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, such as physical or electronic + addresses, without explicit permission +* Other unethical or unprofessional conduct + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +By adopting this Code of Conduct, project maintainers commit themselves to +fairly and consistently applying these principles to every aspect of managing +this project. Project maintainers who do not follow or enforce the Code of +Conduct may be permanently removed from the project team. + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting a project maintainer at chaijs@keithcirkel.co.uk. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. Maintainers are +obligated to maintain confidentiality with regard to the reporter of an +incident. + + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.3.0, available at +[http://contributor-covenant.org/version/1/3/0/][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/3/0/ diff --git a/sdk/typescript/node_modules/chai/CONTRIBUTING.md b/sdk/typescript/node_modules/chai/CONTRIBUTING.md new file mode 100644 index 0000000..258766e --- /dev/null +++ b/sdk/typescript/node_modules/chai/CONTRIBUTING.md @@ -0,0 +1,212 @@ +# Chai Contribution Guidelines + +We like to encourage you to contribute to the Chai.js repository. This should be as easy as possible for you but there are a few things to consider when contributing. The following guidelines for contribution should be followed if you want to submit a pull request or open an issue. + +Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue or assessing patches and features. + +#### Table of Contents + +- [TLDR;](#tldr) +- [Contributing](#contributing) + - [Bug Reports](#bugs) + - [Feature Requests](#features) + - [Pull Requests](#pull-requests) +- [Releasing](#releasing) +- [Support](#support) + - [Resources](#resources) + - [Core Contributors](#contributors) + + +## TLDR; + +- Creating an Issue or Pull Request requires a [GitHub](http://github.com) account. +- Issue reports should be **clear**, **concise** and **reproducible**. Check to see if your issue has already been resolved in the [master]() branch or already reported in Chai's [GitHub Issue Tracker](https://github.com/chaijs/chai/issues). +- In general, avoid submitting PRs for new Assertions without asking core contributors first. More than likely it would be better implemented as a plugin. +- Additional support is available via the [Google Group](http://groups.google.com/group/chaijs) or on irc.freenode.net#chaijs. +- **IMPORTANT**: By submitting a patch, you agree to allow the project owner to license your work under the same license as that used by the project. + + + + +## Contributing + +The issue tracker is the preferred channel for [bug reports](#bugs), +[feature requests](#features) and [submitting pull +requests](#pull-requests), but please respect the following restrictions: + +* Please **do not** use the issue tracker for personal support requests (use + [Google Group](https://groups.google.com/forum/#!forum/chaijs) or IRC). +* Please **do not** derail or troll issues. Keep the discussion on topic and + respect the opinions of others + + +### Bug Reports + +A bug is a **demonstrable problem** that is caused by the code in the repository. + +Guidelines for bug reports: + +1. **Use the GitHub issue search** — check if the issue has already been reported. +2. **Check if the issue has been fixed** — try to reproduce it using the latest `master` or development branch in the repository. +3. **Isolate the problem** — create a test case to demonstrate your issue. Provide either a repo, gist, or code sample to demonstrate you problem. + +A good bug report shouldn't leave others needing to chase you up for more information. Please try to be as detailed as possible in your report. What is your environment? What steps will reproduce the issue? What browser(s) and/or Node.js versions experience the problem? What would you expect to be the outcome? All these details will help people to fix any potential bugs. + +Example: + +> Short and descriptive example bug report title +> +> A summary of the issue and the browser/OS environment in which it occurs. If suitable, include the steps required to reproduce the bug. +> +> 1. This is the first step +> 2. This is the second step +> 3. Further steps, etc. +> +> `` - a link to the reduced test case OR +> ```js +> expect(a).to.equal('a'); +> // code sample +> ``` +> +> Any other information you want to share that is relevant to the issue being reported. This might include the lines of code that you have identified as causing the bug, and potential solutions (and your opinions on their merits). + + +### Feature Requests + +Feature requests are welcome. But take a moment to find out whether your idea fits with the scope and aims of the project. It's up to *you* to make a strong case to convince the project's developers of the merits of this feature. Please provide as much detail and context as possible. + +Furthermore, since Chai.js has a [robust plugin API](http://chaijs.com/guide/plugins/), we encourage you to publish **new Assertions** as plugins. If your feature is an enhancement to an **existing Assertion**, please propose your changes as an issue prior to opening a pull request. If the core Chai.js contributors feel your plugin would be better suited as a core assertion, they will invite you to open a PR in [chaijs/chai](https://github.com/chaijs/chai). + + +### Pull Requests + +- PRs for new core-assertions are advised against. +- PRs for core-assertion bug fixes are always welcome. +- PRs for enhancing the interfaces are always welcome. +- PRs that increase test coverage are always welcome. +- PRs are scrutinized for coding-style. + +Good pull requests - patches, improvements, new features - are a fantastic help. They should remain focused in scope and avoid containing unrelated commits. + +**Please ask first** before embarking on any significant pull request (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that the project's developers might not want to merge into the project. + +Please adhere to the coding conventions used throughout a project (indentation, accurate comments, etc.) and any other requirements (such as test coverage). + +Follow this process if you'd like your work considered for inclusion in the project: + +1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, and configure the remotes: + +```bash +# Clone your fork of the repo into the current directory +git clone https://github.com// +# Navigate to the newly cloned directory +cd +# Assign the original repo to a remote called "upstream" +git remote add upstream https://github.com// +``` + +2. If you cloned a while ago, get the latest changes from upstream: + +```bash +git checkout +git pull upstream +``` + +3. Create a new topic branch (off the main project development branch) to contain your feature, change, or fix: + +```bash +git checkout -b +``` + +4. Commit your changes in logical chunks. Use Git's [interactive rebase](https://help.github.com/articles/interactive-rebase) feature to tidy up your commits before making them public. + +5. Run you code to make sure it works. If you're still having problems please try to run `make clean` and then test your code again. + +```bash +npm test +# when finished running tests... +git checkout chai.js +``` + +6. Locally merge (or rebase) the upstream development branch into your topic branch: + +```bash +git pull [--rebase] upstream +``` + +7. Push your topic branch up to your fork: + +```bash +git push origin +``` + +8. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) with a clear title and description. + +**IMPORTANT**: By submitting a patch, you agree to allow the project owner to license your work under the same license as that used by the project. + + +## Releasing + +Releases can be **prepared** by anyone with access to the code. + +Simply run `make release-major`, `make release-minor`, or `make-release-patch` +and it will automatically do the following: + + - Build chai.js + - Bump the version numbers across the project + - Make a commit within git + +All you need to do is push the commit up and make a pull request, one of the core contributors will merge it and publish a release. + +### Publishing a Release + +Anyone who is a core contributor (see the [Core Contributors Heading in the Readme](https://github.com/chaijs/chai#core-contributors)) can publish a release: + +1. Go to the [Releases page on Github](https://github.com/chaijs/chai/releases) +2. Hit "Draft a new release" (if you can't see this, you're not a core contributor!) +3. Write human-friendly Release Notes based on changelog. + - The release title is "x.x.x / YYYY-MM-DD" (where x.x.x is the version number) + - If breaking changes, write migration tutorial(s) and reasoning. + - Callouts for community contributions (PRs) with links to PR and contributing user. + - Callouts for other fixes made by core contributors with links to issue. +4. Hit "Save Draft" and get other core contributors to check your work, or alternatively hit "Publish release" +5. That's it! + + +## Support + + +### Resources + +For most of the documentation you are going to want to visit [ChaiJS.com](http://chaijs.com). + +- [Getting Started Guide](http://chaijs.com/guide/) +- [API Reference](http://chaijs.com/api/) +- [Plugins](http://chaijs.com/plugins/) + +Or finally, you may find a core-contributor or like-minded developer in any of our support channels. + +- IRC: irc.freenode.org #chaijs +- [Mailing List / Google Group](https://groups.google.com/forum/#!forum/chaijs) + + +### Core Contributors + +Feel free to reach out to any of the core-contributors with you questions or concerns. We will do our best to respond in a timely manner. + +- Jake Luer + - GH: [@logicalparadox](https://github.com/logicalparadox) + - TW: [@jakeluer](http://twitter.com/jakeluer) + - IRC: logicalparadox +- Veselin Todorov + - GH: [@vesln](https://github.com/vesln/) + - TW: [@vesln](http://twitter.com/vesln) + - IRC: vesln +- Keith Cirkel + - GH: [@keithamus](https://github.com/keithamus) + - TW: [@keithamus](http://twitter.com/keithamus) + - IRC: keithamus +- Lucas Fernandes da Costa + - GH: [@lucasfcosta](https://github.com/lucasfcosta) + - TW: [@lfernandescosta](https://twitter.com/lfernandescosta) + - IRC: lucasfcosta diff --git a/sdk/typescript/node_modules/chai/History.md b/sdk/typescript/node_modules/chai/History.md new file mode 100644 index 0000000..5b5ae7b --- /dev/null +++ b/sdk/typescript/node_modules/chai/History.md @@ -0,0 +1,1059 @@ +### Note + +As of 3.0.0, the History.md file has been deprecated. [Please refer to the full +commit logs available on GitHub](https://github.com/chaijs/chai/commits). + +--- + +2.3.0 / 2015-04-26 +================== + + * Merge pull request #423 from ehntoo/patch-1 + * Merge pull request #422 from ljharb/fix_descriptor_tests + * Fix a small bug in the .null assertion docs + * Use a regex to account for property ordering issues across engines. + * Add `make test-firefox` + * Merge pull request #417 from astorije/astorije/minimalist-typo + * Remove trailing whitespaces + * Fix super minor typo in an example + * Merge pull request #408 from ljharb/enumerableProperty + * Add `ownPropertyDescriptor` assertion. + +2.2.0 / 2015-03-26 +================== + + * Merge pull request #405 from chaijs/deep-escape-doc-tweaks + * Tweak documentation on `.deep` flag. + * Merge pull request #402 from umireon/escaping-dot-should-be-taken + * Documentation of escaping in `.deep` flag. + * take regular expression apart + * Feature: backslash-escaping in `.deep.property` + * Escaping dot should be taken in deep property + +2.1.2 / 2015-03-15 +================== + + * Merge pull request #396 from chaijs/add-keith-cirkel-contributing-md + * Add Keith Cirkel to CONTRIBUTING.md + * Merge pull request #395 from cjqed/386-assert-operator-no-eval + * No longer using eval on assert operator #386 + * Merge pull request #389 from chaijs/update-git-summary + * Update `git summary` in README + +2.1.1 / 2015-03-04 +================== + + * Merge pull request #385 from eldritch-fossicker/master + * updates to reflect code style preference from @keithamus + * fix indexing into array with deep propery + * Merge pull request #382 from astorije/patch-2 + * Merge pull request #383 from gurdiga/config-doc-wording-improvement + * config.truncateThreshold docs: simpler wording + * Add missing docstring for showDiff argument of assert + * Merge pull request #381 from astorije/patch-1 + * Add a minor precision that empty asserts on strings too. + * Merge pull request #379 from dcneiner/should-primitive-fix + * Primitives now use valueOf in shouldGetter + +2.1.0 / 2015-02-23 +================== + + * Merge pull request #374 from jmm/v2.0.1 + * Increment version to 2.0.1. + * Merge pull request #365 from chaijs/fix-travis + * Fix travis.yml deploy + * Merge pull request #356 from Soviut/master + * documented fail methods for expect and should interfaces + * fail method added directly to expect + +2.0.0 / 2015-02-09 +================== + + * Merge pull request #361 from gregglind/b265-keys-object + * fix #359. Add `.keys(object)` + * Merge pull request #359 from gregglind/b359-unexpected-keys-sort + * Fix #359 keys() sorts input unexpectedly + * contrib: publish release strategy and travis npm creds #337 + * Merge pull request #357 from danilovaz/master + * Update copyright date + * Merge pull request #349 from toastynerd/add-which-chain-method + * add the which chain method as per issue #347 + * Merge pull request #333 from cmpolis/change-assertions + * more `by` cleanup + * cleaned out `.by` for #333 + * Merge pull request #335 from DingoEatingFuzz/expose-util + * Expose chai util through the chai object + * cleanup (per notes on pr #333) + * updated `change` to work w/ non-number values + tests + * Merge pull request #334 from hurrymaplelad/patch-1 + * Typo, the flag is called 'contains' with an 's' + * updated assertion interface with `change` (#330) + * added `change`,`increase`,`decrease` assertions (#330) + * assert tests for `change`,`increase`,`decrease` + * expect/should tests for `change`,`increase`,`decrease` + * Merge pull request #328 from lo1tuma/issue-327 + * Add includes and contains alias (fixes #327) + * Merge pull request #325 from chasenlehara/overwriteChainableMethodDocs + * Fix docs for overwriteChainableMethod parameters + * Merge pull request #317 from jasonkarns/patch-2 + * Merge pull request #318 from jasonkarns/patch-3 + * Merge pull request #316 from jasonkarns/patch-1 + * typos in docs + * minor docs typo + * update docs: getAllFlags -> transferFlags + * Merge pull request #313 from cjqed/254-expect-any-all + * Added the all and any flags for keys assertion, with all being the default behavior + * Merge pull request #312 from cjqed/291-assert-same-deep-members + * Changed public comment of sameDeepMemebers to be more clear + * Fixes issue #291, adds assert.sameDeepMembers + * Merge pull request #311 from cjqed/305-above-below-on-assert + * Merge pull request #308 from prodatakey/hasproperty + * Issue #305 fixed, added assert.isAbove and assert.isBelow + * Fix typo + * More unit tests for new utility functions + * Refactor common functionality, document, test + * Refactor if statement out + * Small unit test fix + * Handle array indexing terminating paths + * Merge pull request #309 from ericdouglas/iterableEqual-couting-once + * couting variables just once + * Fix properties with `undefined` value pass property assertion + * Merge pull request #306 from chaijs/revert-297-noopchainfunc + * Revert "Allows writing lint-friendly tests" + +1.10.0 / 2014-11-10 +================== + + * Merge pull request #297 from prodatakey/noopchainfunc + * Merge pull request #300 from julienw/299-fix-getMessage-test + * Fix #299: the test is defining global variables + * Add a couple more unit tests + * Add unit tests for chained terminating property asserts + * Revise documentation wording + * Add docs for function style NOOP asserts + * Make the NOOP function a shared constant + * Merge pull request #298 from dasilvacontin/negativeZeroLogging + * why not more assertions + * added test for inspecting `-0` + * a more readable/simple condition statement, as pointed out by @keithamus + * added check for logging negative zero + * Change test to not trigger argument bug + * Allows writing lint-friendly tests + * readme: update contributors for 1.9.2 + +1.9.2 / 2014-09-29 +================== + + * Merge pull request #268 from charlierudolph/cr-lazyMessages + * Merge pull request #269 from charlierudolph/cr-codeCleanup + * Merge pull request #277 from charlierudolph/fix-doc + * Merge pull request #279 from mohayonao/fix-closeTo + * Merge pull request #292 from boneskull/mocha + * resolves #255: upgrade mocha + * Merge pull request #289 from charlierudolph/cr-dryUpCode + * Dry up code + * Merge pull request #275 from DrRataplan/master + * assert: .closeTo() verify value's type before assertion + * Rewrite pretty-printing HTML elements to prevent throwing internal errors Fixes errors occuring when using a non-native DOM implementation + * Fix assert documentation + * Remove unused argument + * Allow messages to be functions + * Merge pull request #267 from shinnn/master + * Use SVG badge + * Merge pull request #264 from cjthompson/keys_diff + * Show diff for keys assertion + +1.9.1 / 2014-03-19 +================== + + * deps update + * util: [getActual] select actual logic now allows undefined for actual. Closes #183 + * docs: [config] make public, express param type + * Merge pull request #251 from romario333/threshold3 + * Fix issue #166 - configurable threshold in objDisplay. + * Move configuration options to config.js. + * Merge pull request #233 from Empeeric/master + * Merge pull request #244 from leider/fix_for_contains + * Merge pull request #247 from didoarellano/typo-fixes + * Fix typos + * Merge pull request #245 from lfac-pt/patch-1 + * Update `exports.version` to 1.9.0 + * aborting loop on finding + * declaring variable only once + * additional test finds incomplete implementation + * simplified code + * fixing #239 (without changing chai.js) + * ssfi as it should be + * Merge pull request #228 from duncanbeevers/deep_members + * Deep equality check for collection membership + +1.9.0 / 2014-01-29 +================== + + * docs: add contributing.md #238 + * assert: .throws() returns thrown error. Closes #185 + * Merge pull request #232 from laconbass/assert-throws + * assert: .fail() parameter mismatch. Closes #206 + * Merge branch 'karma-fixes' + * Add karma phantomjs launcher + * Use latest karma and sauce launcher + * Karma tweaks + * Merge pull request #230 from jkroso/include + * Merge pull request #237 from chaijs/coverage + * Add coverage to npmignore + * Remove lib-cov from test-travisci dependents + * Remove the not longer needed lcov reporter + * Test coverage with istanbul + * Remove jscoverage + * Remove coveralls + * Merge pull request #226 from duncanbeevers/add_has + * Avoid error instantiation if possible on assert.throws + * Merge pull request #231 from duncanbeevers/update_copyright_year + * Update Copyright notices to 2014 + * handle negation correctly + * add failing test case + * support `{a:1,b:2}.should.include({a:1})` + * Merge pull request #224 from vbardales/master + * Add `has` to language chains + * Merge pull request #219 from demands/overwrite_chainable + * return error on throw method to chain on error properties, possibly different from message + * util: store chainable behavior in a __methods object on ctx + * util: code style fix + * util: add overwriteChainableMethod utility (for #215) + * Merge pull request #217 from demands/test_cleanup + * test: make it possible to run utilities tests with --watch + * makefile: change location of karma-runner bin script + * Merge pull request #202 from andreineculau/patch-2 + * test: add tests for throwing custom errors + * Merge pull request #201 from andreineculau/patch-1 + * test: updated for the new assertion errors + * core: improve message for assertion errors (throw assertion) + +1.8.1 / 2013-10-10 +================== + + * pkg: update deep-eql version + +1.8.0 / 2013-09-18 +================== + + * test: [sauce] add a few more browsers + * Merge branch 'refactor/deep-equal' + * util: remove embedded deep equal utility + * util: replace embedded deep equal with external module + * Merge branch 'feature/karma' + * docs: add sauce badge to readme [ci skip] + * test: [sauce] use karma@canary to prevent timeouts + * travis: only run on node 0.10 + * test: [karma] use karma phantomjs runner + * Merge pull request #181 from tricknotes/fix-highlight + * Fix highlight for example code + +1.7.2 / 2013-06-27 +================== + + * coverage: add coveralls badge + * test: [coveralls] add coveralls api integration. testing travis-ci integration + * Merge branch 'master' of github.com:chaijs/chai + * Merge branch 'feature/bower' + * Merge pull request #180 from tricknotes/modify-method-title + * Merge pull request #179 from tricknotes/highlight-code-example + * Modify method title to include argument name + * Fix to highlight code example + * bower: granular ignores + +1.7.1 / 2013-06-24 +================== + + * Merge branch 'feature/bower'. #175 + * bower: add json file + * build: browser + +1.7.0 / 2013-06-17 +================== + + * error: remove internal assertion error constructor + * core: [assertion-error] replace internal assertion error with dep + * deps: add chaijs/assertion-error@1.0.0 + * docs: fix typo in source file. #174 + * Merge pull request #174 from piecioshka/master + * typo + * Merge branch 'master' of github.com:chaijs/chai + * pkg: lock mocha/mocha-phantomjs versions (for now) + * Merge pull request #173 from chaijs/inspect-fix + * Fix `utils.inspect` with custom object-returning inspect()s. + * Merge pull request #171 from Bartvds/master + * replaced tabs with 2 spaces + * added assert.notOk() + * Merge pull request #169 from katsgeorgeek/topics/master + * Fix comparison objects. + +1.6.1 / 2013-06-05 +================== + + * Merge pull request #168 from katsgeorgeek/topics/master + * Add test for different RegExp flags. + * Add test for regexp comparison. + * Downgrade mocha version for fix running Phantom tests. + * Fix comparison equality of two regexps. + * Merge pull request #161 from brandonpayton/master + * Fix documented name for assert interfaces isDefined method + +1.6.0 / 2013-04-29 +================== + + * build: browser + * assert: [(not)include] throw on incompatible haystack. Closes #142 + * assert: [notInclude] add assert.notInclude. Closes #158 + * browser build + * makefile: force browser build on browser-test + * makefile: use component for browser build + * core: [assertions] remove extraneous comments + * Merge branch 'master' of github.com:chaijs/chai + * test: [assert] deep equal ordering + * Merge pull request #153 from NickHeiner/array-assertions + * giving members a no-flag assertion + * Code review comments - changing syntax + * Code review comments + * Adding members and memberEquals assertions for checking for subsets and set equality. Implements chaijs/chai#148. + * Merge pull request #140 from RubenVerborgh/function-prototype + * Restore the `call` and `apply` methods of Function when adding a chainable method. + * readme: 2013 + * notes: migration notes for deep equal changes + * test: for ever err() there must be a passing version + +1.5.0 / 2013-02-03 +================== + + * docs: add Release Notes for non-gitlog summary of changes. + * lib: update copyright to 2013 + * Merge branch 'refactor/travis' + * makefile: remove test-component for full test run + * pkg: script test now runs make test so travis will test browser + * browser: build + * tests: refactor some tests to support new objDisplay output + * test: [bootstrap] normalize boostrap across all test scenarios + * assertions: refactor some assertions to use objDisplay instead of inspect + * util: [objDisplay] normalize output of functions + * makefile: refactor for full build scenarios + * component: fix build bug where missing util:type file + * assertions: [throw] code cleanup + * Merge branch 'refactor/typeDetection' + * browser: build + * makefile: chai.js is .PHONY so it builds every time + * test: [expect] add arguments type detection test + * core/assertions: [type] (a/an) refactor to use type detection utility + * util: add cross-browser type detection utility + * Merge branch 'feature/component' + * browser: build + * component: add component.json file + * makefile: refactor for fine grain control of testing scenarios + * test: add mochaPhantomJS support and component test file + * deps: add component and mocha-phantomjs for browser testing + * ignore: update ignore files for component support + * travis: run for all branches + * Merge branch 'feature/showDiff' + * test: [Assertion] configruable showDiff flag. Closes #132 + * lib: [Assertion] add configurable showDiff flag. #132 + * Merge branch 'feature/saucelabs' + * Merge branch 'master' into feature/saucelabs + * browser: build + * support: add mocha cloud runner, client, and html test page + * test: [saucelabs] add auth placeholder + * deps: add mocha-cloud + * Merge pull request #136 from whatthejeff/message_fix + * Merge pull request #138 from timnew/master + * Fix issue #137, test message existence by using message!=null rather than using message + * Fixed backwards negation messages. + * Merge pull request #133 from RubenVerborgh/throw + * Functions throwing strings can reliably be tested. + * Merge pull request #131 from RubenVerborgh/proto + * Cache whether __proto__ is supported. + * Use __proto__ if available. + * Determine the property names to exclude beforehand. + * Merge pull request #126 from RubenVerborgh/eqls + * Add alias eqls for eql. + * Use inherited enumerable properties in deep equality comparison. + * Show inherited properties when inspecting an object. + * Add new getProperties and getEnumerableProperties utils. + * showDiff: force true for equal and eql + +1.4.2 / 2012-12-21 +================== + + * browser build: (object diff support when used with mocha) #106 + * test: [display] array test for mocha object diff + * browser: no longer need different AssertionError constructor + +1.4.1 / 2012-12-21 +================== + + * showDiff: force diff for equal and eql. #106 + * test: [expect] type null. #122 + * Merge pull request #115 from eshao/fix-assert-Throw + * FIX: assert.Throw checks error type/message + * TST: assert.Throw should check error type/message + +1.4.0 / 2012-11-29 +================== + + * pre-release browser build + * clean up index.js to not check for cov, revert package.json to use index.js + * convert tests to use new bootstrap + * refactor testing bootstrap + * use spaces (not tabs). Clean up #114 + * Merge pull request #114 from trantorLiu/master + * Add most() (alias: lte) and least() (alias: gte) to the API with new chainers "at" and "of". + * Change `main` to ./lib/chai. Fixes #28. + * Merge pull request #104 from connec/deep_equals_circular_references_ + * Merge pull request #109 from nnarhinen/patch-1 + * Check for 'actual' type + * Added support for circular references when checking deep (in)equality. + +1.3.0 / 2012-10-01 +================== + + * browser build w/ folio >= 0.3.4. Closes #99 + * add back buffer test for deep equal + * do not write flags to assertion.prototype + * remove buffer test from expect + * browser build + * improve documentation of custom error messages + * Merge branch 'master' of git://github.com/Liffft/chai into Liffft-master + * browser build + * improved buffer deep equal checking + * mocha is npm test command + * Cleaning up the js style… + * expect tests now include message pass-through + * packaging up browser-side changes… + * Increasing Throws error message verbosity + * Should syntax: piping message through + * Make globalShould test work in browser too. + * Add a setter for `Object.prototype.should`. Closes #86. + +1.2.0 / 2012-08-07 +================== + + * Merge branch 'feature/errmsg' + * browser build + * comment updates for utilities + * tweak objDislay to only kick in if object inspection is too long + * Merge branch 'master' into feature/errmsg + * add display sample for error message refactor + * first draft of error message refactor. #93 + * add `closeTo` assertion to `assert` interface. Closes #89. + * update folio build for better require.js handling. Closes #85 + * Merge pull request #92 from paulmillr/topics/add-dom-checks + * Add check for DOM objects. + * browser build + * Merge branch 'master' of github.com:chaijs/chai + * bug - getActual not defaulting to assertion subject + * Merge pull request #88 from pwnall/master + * Don't inspect() assertion arguments if the assertion passes. + +1.1.1 / 2012-07-09 +================== + + * improve commonjs support on browser build + * Merge pull request #83 from tkazec/equals + * Document .equals + * Add .equals as an alias of .equal + * remove unused browser prefix/suffix + * Merge branch 'feature/folio-build' + * browser build + * using folio to compile + * clean up makefile + * early folio 0.3.x support + +1.1.0 / 2012-06-26 +================== + + * browser build + * Disable "Assertion.includeStack is false" test in IE. + * Use `utils.getName` for all function inspections. + * Merge pull request #80 from kilianc/closeTo + * fixes #79 + * browser build + * expand docs to indicate change of subject for chaining. Closes #78 + * add `that` chain noop + * Merge branch 'bug/74' + * comments on how to property use `length` as chain. Closes #74 + * tests for length as chainable property. #74 + * add support for `length` as chainable prop/method. + * Merge branch 'bug/77' + * tests for getPathValue when working with nested arrays. Closes #77 + * add getPathValue support for nested arrays + * browser build + * fix bug for missing browser utils + * compile tool aware of new folder layout + * Merge branch 'refactor/1dot1' + * move core assertions to own file and refactor all using utils + * rearrange folder structure + +1.0.4 / 2012-06-03 +================== + + * Merge pull request #68 from fizker/itself + * Added itself chain. + * simplify error inspections for cross browser compatibility + * fix safari `addChainableMethod` errors. Closes #69 + +1.0.3 / 2012-05-27 +================== + + * Point Travis badge to the right place. + * Make error message for eql/deep.equal more clear. + * Fix .not.deep.equal. + * contributors list + +1.0.2 / 2012-05-26 +================== + + * Merge pull request #67 from chaijs/chaining-and-flags + * Browser build. + * Use `addChainableMethod` to get away from `__proto__` manipulation. + * New `addChainableMethod` utility. + * Replace `getAllFlags` with `transferFlags` utility. + * browser build + * test - get all flags + * utility - get all flags + * Add .mailmap to .npmignore. + * Add a .mailmap file to fix my name in shortlogs. + +1.0.1 / 2012-05-18 +================== + + * browser build + * Fixing "an" vs. "a" grammar in type assertions. + * Uniformize `assert` interface inline docs. + * Don't use `instanceof` for `assert.isArray`. + * Add `deep` flag for equality and property value. + * Merge pull request #64 from chaijs/assertion-docs + * Uniformize assertion inline docs. + * Add npm-debug.log to .gitignore. + * no reserved words as actuals. #62 + +1.0.0 / 2012-05-15 +================== + + * readme cleanup + * browser build + * utility comments + * removed docs + * update to package.json + * docs build + * comments / docs updates + * plugins app cleanup + * Merge pull request #61 from joliss/doc + * Fix and improve documentation of assert.equal and friends + * browser build + * doc checkpoint - texture + * Update chai-jquery link + * Use defined return value of Assertion extension functions + * Update utility docs + +1.0.0-rc3 / 2012-05-09 +================== + + * Merge branch 'feature/rc3' + * docs update + * browser build + * assert test conformity for minor refactor api + * assert minor refactor + * update util tests for new add/overwrite prop/method format + * added chai.Assertion.add/overwrite prop/method for plugin toolbox + * add/overwrite prop/method don't make assumptions about context + * doc test suite + * docs don't need coverage + * refactor all simple chains into one forEach loop, for clean documentation + * updated npm ignore + * remove old docs + * docs checkpoint - guide styled + * Merge pull request #59 from joliss/doc + * Document how to run the test suite + * don't need to rebuild docs to view + * dep update + * docs checkpoint - api section + * comment updates for docs + * new doc site checkpoint - plugin directory! + * Merge pull request #57 from kossnocorp/patch-1 + * Fix typo: devDependancies → devDependencies + * Using message flag in `getMessage` util instead of old `msg` property. + * Adding self to package.json contributors. + * `getMessage` shouldn't choke on null/omitted messages. + * `return this` not necessary in example. + * `return this` not necessary in example. + * Sinon–Chai has a dash + * updated plugins list for docs + +1.0.0-rc2 / 2012-05-06 +================== + + * Merge branch 'feature/test-cov' + * browser build + * missing assert tests for ownProperty + * appropriate assert equivalent for expect.to.have.property(key, val) + * reset AssertionError to include full stack + * test for plugin utilities + * overwrite Property and Method now ensure chain + * version notes in readme + +1.0.0-rc1 / 2012-05-04 +================== + + * browser build (rc1) + * assert match/notMatch tests + * assert interface - notMatch, ownProperty, notOwnProperty, ownPropertyVal, ownPropertyNotVal + * cleaner should interface export. + * added chai.Assertion.prototype._obj (getter) for quick access to object flag + * moved almostEqual / almostDeepEqual to stats plugin + * added mocha.opts + * Add test for `utils.addMethod` + * Fix a typo + * Add test for `utils.overwriteMethod` + * Fix a typo + * Browser build + * Add undefined assertion + * Add null assertion + * Fix an issue with `mocha --watch` + * travis no longer tests on node 0.4.x + * removing unnecissary carbon dep + * Merge branch 'feature/plugins-app' + * docs build + * templates for docs express app for plugin directory + * express app for plugin and static serving + * added web server deps + * Merge pull request #54 from josher19/master + * Remove old test.assert code + * Use util.inspect instead of inspect for deepAlmostEqual and almostEqual + * browser build + * Added almostEqual and deepAlmostEqual to assert test suite. + * bug - context determinants for utils + * dec=0 means rounding, so assert.deepAlmostEqual({pi: 3.1416}, {pi: 3}, 0) is true + * wrong travis link + * readme updates for version information + * travis tests 0.5.x branch as well + * [bug] util `addProperty` not correctly exporting + * read me version notes + * browser build 1.0.0alpha1 + * not using reserved words in internal assertions. #52 + * version tick + * clean up redundant tests + * Merge branch 'refs/heads/0.6.x' + * update version tag in package 1.0.0alpha1 + * browser build + * added utility tests to browser specs + * beginning utility testing + * updated utility comments + * utility - overwriteMethod + * utility - overwriteProperty + * utility - addMethod + * utility - addProperty + * missing ; + * contributors list update + * Merge branch 'refs/heads/0.6.x-docs' into 0.6.x + * Added guide link to docs. WIP + * Include/contain are now both properties and methods + * Add an alias annotation + * Remove usless function wrapper + * Fix a typo + * A/an are now both properties and methods + * [docs] new site homepage layout / color checkpoint + * Ignore IE-specific error properties. + * Fixing order of error message test. + * New cross-browser `getName` util. + * Fixing up `AssertionError` inheritance. + * backup docs + * Add doctypes + * [bug] was still using `constructor.name` in `throw` assertion + * [bug] flag Object.create(null) instead of new Object + * [test] browser build + * [refactor] all usage of Assertion.prototype.assert now uses template tags and flags + * [refactor] remove Assertion.prototype.inspect for testable object inspection + * [refactor] object to test is now stored in flag, with ssfi and custom message + * [bug] flag util - don't return on `set` + * [docs] comments for getMessage utility + * [feature] getMessage + * [feature] testing utilities + * [refactor] flag doesn't require `call` + * Make order of source files well-defined + * Added support for throw(errorInstance). + * Use a foolproof method of grabbing an error's name. + * Removed constructor.name check from throw. + * disabled stackTrack configuration tests until api is stable again + * first version of line displayed error for node js (unstable) + * refactor core Assertion to use flag utility for negation + * added flag utility + * tests for assert interface negatives. Closed #42 + * added assertion negatives that were missing. #42 + * Support for expected and actual parameters in assert-style error object + * chai as promised - readme + * Added assert.fail. Closes #40 + * better error message for assert.operator. Closes #39 + * [refactor] Assertion#property to use getPathValue property + * added getPathValue utility helper + * removed todo about browser build + * version notes + * version bumb 0.6.0 + * browser build + * [refactor] browser compile function to replace with `require('./error')' with 'require('./browser/error')' + * [feature] browser uses different error.js + * [refactor] error without chai.fail + * Assertion & interfaces use new utils helper export + * [refactor] primary export for new plugin util usage + * added util index.js helper + * added 2012 to copyright headers + * Added DeepEqual assertions + +0.5.3 / 2012-04-21 +================== + + * Merge branch 'refs/heads/jgonera-oldbrowsers' + * browser build + * fixed reserved names for old browsers in interface/assert + * fixed reserved names for old browsers in interface/should + * fixed: chai.js no longer contains fail() + * fixed reserved names for old browsers in Assertion + * Merge pull request #49 from joliss/build-order + * Make order of source files well-defined + * Merge pull request #43 from zzen/patch-1 + * Support for expected and actual parameters in assert-style error object + * chai as promised - readme + +0.5.2 / 2012-03-21 +================== + + * browser build + * Merge branch 'feature/assert-fail' + * Added assert.fail. Closes #40 + * Merge branch 'bug/operator-msg' + * better error message for assert.operator. Closes #39 + * version notes + +0.5.1 / 2012-03-14 +================== + + * chai.fail no longer exists + * Merge branch 'feature/assertdefined' + * Added asset#isDefined. Closes #37. + * dev docs update for Assertion#assert + +0.5.0 / 2012-03-07 +================== + + * [bug] on inspect of reg on n 0.4.12 + * Merge branch 'bug/33-throws' + * Merge pull request #35 from logicalparadox/empty-object + * browser build + * updated #throw docs + * Assertion#throw `should` tests updated + * Assertion#throw `expect` tests + * Should interface supports multiple throw parameters + * Update Assertion#throw to support strings and type checks. + * Add more tests for `empty` in `should`. + * Add more tests for `empty` in `expect`. + * Merge branch 'master' into empty-object + * don't switch act/exp + * Merge pull request #34 from logicalparadox/assert-operator + * Update the compiled verison. + * Add `assert.operator`. + * Notes on messages. #22 + * browser build + * have been test + * below tests + * Merge branch 'feature/actexp' + * browser build + * remove unnecessary fail export + * full support for actual/expected where relevant + * Assertion.assert support expected value + * clean up error + * Update the compiled version. + * Add object & sane arguments support to `Assertion#empty`. + +0.4.2 / 2012-02-28 +================== + + * fix for `process` not available in browser when used via browserify. Closes #28 + * Merge pull request #31 from joliss/doc + * Document that "should" works in browsers other than IE + * Merge pull request #30 from logicalparadox/assert-tests + * Update the browser version of chai. + * Update `assert.doesNotThrow` test in order to check the use case when type is a string. + * Add test for `assert.ifError`. + * Falsey -> falsy. + * Full coverage for `assert.throws` and `assert.doesNotThrow`. + * Add test for `assert.doesNotThrow`. + * Add test for `assert.throws`. + * Add test for `assert.length`. + * Add test for `assert.include`. + * Add test for `assert.isBoolean`. + * Fix the implementation of `assert.isNumber`. + * Add test for `assert.isNumber`. + * Add test for `assert.isString`. + * Add test for `assert.isArray`. + * Add test for `assert.isUndefined`. + * Add test for `assert.isNotNull`. + * Fix `assert.isNotNull` implementation. + * Fix `assert.isNull` implementation. + * Add test for `assert.isNull`. + * Add test for `assert.notDeepEqual`. + * Add test for `assert.deepEqual`. + * Add test for `assert.notStrictEqual`. + * Add test for `assert.strictEqual`. + * Add test for `assert.notEqual`. + +0.4.1 / 2012-02-26 +================== + + * Merge pull request #27 from logicalparadox/type-fix + * Update the browser version. + * Add should tests for type checks. + * Add function type check test. + * Add more type checks tests. + * Add test for `new Number` type check. + * Fix type of actual checks. + +0.4.0 / 2012-02-25 +================== + + * docs and readme for upcoming 0.4.0 + * docs generated + * putting coverage and tests for docs in docs/out/support + * make docs + * makefile copy necessary resources for tests in docs + * rename configuration test + * Merge pull request #21 from logicalparadox/close-to + * Update the browser version. + * Update `closeTo()` docs. + * Add `Assertion.closeTo()` method. + * Add `.closeTo()` should test. + * Add `.closeTo()` expect test. + * Merge pull request #20 from logicalparadox/satisfy + * Update the browser version. + * `..` -> `()` in `.satisfy()` should test. + * Update example for `.satisfy()`. + * Update the compiled browser version. + * Add `Assertion.satisfy()` method. + * Add `.satisfy()` should test. + * Add `.satisfy()` expect test. + * Merge pull request #19 from logicalparadox/respond-to + * Update the compiled browser version. + * Add `respondTo` Assertion. + * Add `respondTo` should test. + * Add `respondTo` expect test. + * Merge branch 'feature/coverage' + * mocha coverage support + * doc contributors + * README contributors + +0.3.4 / 2012-02-23 +================== + + * inline comment typos for #15 + * Merge branch 'refs/heads/jeffbski-configErrorStackCompat' + * includeStack documentation for all interfaces + * suite name more generic + * Update test to be compatible with browsers that do not support err.stack + * udpated compiled chai.js and added to browser tests + * Allow inclusion of stack trace for Assert error messages to be configurable + * docs sharing buttons + * sinon-chai link + * doc updates + * read me updates include plugins + +0.3.3 / 2012-02-12 +================== + + * Merge pull request #14 from jfirebaugh/configurable_properties + * Make Assertion.prototype properties configurable + +0.3.2 / 2012-02-10 +================== + + * codex version + * docs + * docs cleanup + +0.3.1 / 2012-02-07 +================== + + * node 0.4.x compat + +0.3.0 / 2012-02-07 +================== + + * Merge branch 'feature/03x' + * browser build + * remove html/json/headers testign + * regex error.message testing + * tests for using plugins + * Merge pull request #11 from domenic/master + * Make `chai.use` a no-op if the function has already been used. + +0.2.4 / 2012-02-02 +================== + + * added in past tense switch for `been` + +0.2.3 / 2012-02-01 +================== + + * try that again + +0.2.2 / 2012-02-01 +================== + + * added `been` (past of `be`) alias + +0.2.1 / 2012-01-29 +================== + + * added Throw, with a capital T, as an alias to `throw` (#7) + +0.2.0 / 2012-01-26 +================== + + * update gitignore for vim *.swp + * Merge branch 'feature/plugins' + * browser build + * interfaces now work with use + * simple .use function. See #9. + * readme notice on browser compat + +0.1.7 / 2012-01-25 +================== + + * added assert tests to browser test runner + * browser update + * `should` interface patch for primitives support in FF + * fix isObject() Thanks @milewise + * travis only on branch `master` + * add instanceof alias `instanceOf`. #6 + * some tests for assert module + +0.1.6 / 2012-01-02 +================== + + * commenting for assert interface + * updated codex dep + +0.1.5 / 2012-01-02 +================== + + * browser tests pass + * type in should.not.equal + * test for should (not) exist + * added should.exist and should.not.exist + * browser uses tdd + * convert tests to tdd + +0.1.4 / 2011-12-26 +================== + + * browser lib update for new assert interface compatiblitiy + * inspect typos + * added strict equal + negatives and ifError + * interface assert had doesNotThrow + * added should tests to browser + * new expect empty tests + * should test browser compat + * Fix typo for instanceof docs. Closes #3 [ci skip] + +0.1.3 / 2011-12-18 +================== + + * much cleaner reporting string on error. + +0.1.2 / 2011-12-18 +================== + + * [docs] for upcoming 0.1.2 + * browser version built with pre/suffix … all tests passing + * make / compile now use prefix/suffix correctly + * code clean + * prefix/suffix to wrap browser output to prevent conflicts with other `require` methods. + * Merge branch 'feature/should4xcompatibility' + * compile for browser tests.. all pass + * added header/status/html/json + * throw tests + * should.throw & should.not.throw shortcuts + * improved `throw` type detection and messaging + * contain is now `include` … keys modifier is now `contain` + * removed object() test + * removed #respondTo + * Merge branch 'bug/2' + * replaced __defineGetter__ with defineProperty for all uses + * [docs] change mp tracking code + * docs site updated with assert (TDD) interface + * updated doc comments for assert interface + +0.1.1 / 2011-12-16 +================== + + * docs ready for upcoming 0.1.1 + * readme image fixed [ci skip] + * more readme tweaks [ci skip] + * réadmet image fixed [ci skip] + * documentation + * codex locked in version 0.0.5 + * more comments to assertions for docs + * assertions fully commented, browser library updated + * adding codex as doc dependancy + * prepping for docs + * assertion component completely commented for documentation + * added exist test + * var expect outside of browser if check + * added keywords to package.json + +0.1.0 / 2011-12-15 +================== + + * failing on purpose successful .. back to normal + * testing travis failure + * assert#arguments getter + * readme typo + * updated README + * added travis and npmignore + * copyright notices … think i got them all + * moved expect interface to own file for consistency + * assert ui deepEqual + * browser tests expect (all working) + * browser version built + * chai.fail (should ui) + * expect tests browser compatible + * tests for should and expect (all pass) + * moved fail to primary export + * should compatibility testing + * within, greaterThan, object, keys, + * Aliases + * Assertion#property now correctly works with negate and undefined values + * error message language matches should + * Assertion#respondTo + * Assertion now uses inspect util + * git ignore node modules + * should is exported + * AssertionError __proto__ from Error.prototype + * add should interface for should.js compatibility + * moved eql to until folder and added inspect from (joyent/node) + * added mocha for testing + * browser build for current api + * multiple .property assertions + * added deep equal from node + +0.0.2 / 2011-12-07 +================== + + * cleaner output on error + * improved exists detection + * package remnant artifact + * empty deep equal + * test browser build + * assertion cleanup + * client compile script + * makefile + * most of the basic assertions + * allow no parameters to assertion error + * name change + * assertion error instance + * main exports: assert() & expect() + * initialize diff --git a/sdk/typescript/node_modules/chai/LICENSE b/sdk/typescript/node_modules/chai/LICENSE new file mode 100644 index 0000000..eedbe23 --- /dev/null +++ b/sdk/typescript/node_modules/chai/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Chai.js Assertion Library + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/README.md b/sdk/typescript/node_modules/chai/README.md new file mode 100644 index 0000000..78e4d2d --- /dev/null +++ b/sdk/typescript/node_modules/chai/README.md @@ -0,0 +1,212 @@ +

+ + ChaiJS + +
+ chai +

+ +

+ Chai is a BDD / TDD assertion library for node and the browser that can be delightfully paired with any javascript testing framework. +

+ +

+ + license:mit + + + tag:? + + + node:? + +
+ + Selenium Test Status + +
+ + downloads:? + + + build:? + + + coverage:? + + + devDependencies:? + +
+ + Join the Slack chat + + + Join the Gitter chat + + + OpenCollective Backers + +

+ +For more information or to download plugins, view the [documentation](http://chaijs.com). + +## What is Chai? + +Chai is an _assertion library_, similar to Node's built-in `assert`. It makes testing much easier by giving you lots of assertions you can run against your code. + +## Installation + +### Node.js + +`chai` is available on [npm](http://npmjs.org). To install it, type: + + $ npm install --save-dev chai + +### Browsers + +You can also use it within the browser; install via npm and use the `chai.js` file found within the download. For example: + +```html + +``` + +## Usage + +Import the library in your code, and then pick one of the styles you'd like to use - either `assert`, `expect` or `should`: + +```js +var chai = require('chai'); +var assert = chai.assert; // Using Assert style +var expect = chai.expect; // Using Expect style +var should = chai.should(); // Using Should style +``` + +### Pre-Native Modules Usage (_registers the chai testing style globally_) + +```js +require('chai/register-assert'); // Using Assert style +require('chai/register-expect'); // Using Expect style +require('chai/register-should'); // Using Should style +``` + +### Pre-Native Modules Usage (_as local variables_) + +```js +const { assert } = require('chai'); // Using Assert style +const { expect } = require('chai'); // Using Expect style +const { should } = require('chai'); // Using Should style +should(); // Modifies `Object.prototype` + +const { expect, use } = require('chai'); // Creates local variables `expect` and `use`; useful for plugin use +``` + +### Native Modules Usage (_registers the chai testing style globally_) + +```js +import 'chai/register-assert'; // Using Assert style +import 'chai/register-expect'; // Using Expect style +import 'chai/register-should'; // Using Should style +``` + +### Native Modules Usage (_local import only_) + +```js +import { assert } from 'chai'; // Using Assert style +import { expect } from 'chai'; // Using Expect style +import { should } from 'chai'; // Using Should style +should(); // Modifies `Object.prototype` +``` + +### Usage with Mocha + +```bash +mocha spec.js -r chai/register-assert # Using Assert style +mocha spec.js -r chai/register-expect # Using Expect style +mocha spec.js -r chai/register-should # Using Should style +``` + +[Read more about these styles in our docs](http://chaijs.com/guide/styles/). + +## Plugins + +Chai offers a robust Plugin architecture for extending Chai's assertions and interfaces. + +- Need a plugin? View the [official plugin list](http://chaijs.com/plugins). +- Want to build a plugin? Read the [plugin api documentation](http://chaijs.com/guide/plugins/). +- Have a plugin and want it listed? Simply add the following keywords to your package.json: + - `chai-plugin` + - `browser` if your plugin works in the browser as well as Node.js + - `browser-only` if your plugin does not work with Node.js + +### Related Projects + +- [chaijs / chai-docs](https://github.com/chaijs/chai-docs): The chaijs.com website source code. +- [chaijs / assertion-error](https://github.com/chaijs/assertion-error): Custom `Error` constructor thrown upon an assertion failing. +- [chaijs / deep-eql](https://github.com/chaijs/deep-eql): Improved deep equality testing for Node.js and the browser. +- [chaijs / type-detect](https://github.com/chaijs/type-detect): Improved typeof detection for Node.js and the browser. +- [chaijs / check-error](https://github.com/chaijs/check-error): Error comparison and information related utility for Node.js and the browser. +- [chaijs / loupe](https://github.com/chaijs/loupe): Inspect utility for Node.js and browsers. +- [chaijs / pathval](https://github.com/chaijs/pathval): Object value retrieval given a string path. +- [chaijs / get-func-name](https://github.com/chaijs/get-func-name): Utility for getting a function's name for node and the browser. + +### Contributing + +Thank you very much for considering to contribute! + +Please make sure you follow our [Code Of Conduct](https://github.com/chaijs/chai/blob/master/CODE_OF_CONDUCT.md) and we also strongly recommend reading our [Contributing Guide](https://github.com/chaijs/chai/blob/master/CONTRIBUTING.md). + +Here are a few issues other contributors frequently ran into when opening pull requests: + +- Please do not commit changes to the `chai.js` build. We do it once per release. +- Before pushing your commits, please make sure you [rebase](https://github.com/chaijs/chai/blob/master/CONTRIBUTING.md#pull-requests) them. + +### Contributors + +Please see the full +[Contributors Graph](https://github.com/chaijs/chai/graphs/contributors) for our +list of contributors. + +### Core Contributors + +Feel free to reach out to any of the core contributors with your questions or +concerns. We will do our best to respond in a timely manner. + +[![Jake Luer](https://avatars3.githubusercontent.com/u/58988?v=3&s=50)](https://github.com/logicalparadox) +[![Veselin Todorov](https://avatars3.githubusercontent.com/u/330048?v=3&s=50)](https://github.com/vesln) +[![Keith Cirkel](https://avatars3.githubusercontent.com/u/118266?v=3&s=50)](https://github.com/keithamus) +[![Lucas Fernandes da Costa](https://avatars3.githubusercontent.com/u/6868147?v=3&s=50)](https://github.com/lucasfcosta) +[![Grant Snodgrass](https://avatars3.githubusercontent.com/u/17260989?v=3&s=50)](https://github.com/meeber) diff --git a/sdk/typescript/node_modules/chai/ReleaseNotes.md b/sdk/typescript/node_modules/chai/ReleaseNotes.md new file mode 100644 index 0000000..2a80d5c --- /dev/null +++ b/sdk/typescript/node_modules/chai/ReleaseNotes.md @@ -0,0 +1,737 @@ +# Release Notes + +## Note + +As of 3.0.0, the ReleaseNotes.md file has been deprecated. [Please refer to the release notes available on Github](https://github.com/chaijs/chai/releases). Or +[the release notes on the chaijs.com website](https://chaijs.com/releases). + +--- + +## 2.3.0 / 2015-04-26 + +Added `ownPropertyDescriptor` assertion: + +```js +expect('test').to.have.ownPropertyDescriptor('length'); +expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 }); +expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 }); +expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false); +expect('test').ownPropertyDescriptor('length').to.have.keys('value'); +``` + +### Community Contributions + +#### Code Features & Fixes + + * [#408](https://github.com/chaijs/chai/pull/408) Add `ownPropertyDescriptor` + assertion. + By [@ljharb](https://github.com/ljharb) + * [#422](https://github.com/chaijs/chai/pull/422) Improve ownPropertyDescriptor + tests. + By [@ljharb](https://github.com/ljharb) + +#### Documentation fixes + + * [#417](https://github.com/chaijs/chai/pull/417) Fix documentation typo + By [@astorije](https://github.com/astorije) + * [#423](https://github.com/chaijs/chai/pull/423) Fix inconsistency in docs. + By [@ehntoo](https://github.com/ehntoo) + + +## 2.2.0 / 2015-03-26 + +Deep property strings can now be escaped using `\\` - for example: + +```js +var deepCss = { '.link': { '[target]': 42 }}; +expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42) +``` + +### Community Contributions + +#### Code Features & Fixes + + * [#402](https://github.com/chaijs/chai/pull/402) Allow escaping of deep + property keys. + By [@umireon](https://github.com/umireon) + +#### Documentation fixes + + * [#405](https://github.com/chaijs/chai/pull/405) Tweak documentation around + deep property escaping. + By [@keithamus](https://github.com/keithamus) + + +## 2.1.2 / 2015-03-15 + +A minor bug fix. No new features. + +### Community Contributions + +#### Code Features & Fixes + + * [#395](https://github.com/chaijs/chai/pull/395) Fix eval-related bugs with + assert.operator ([#386](https://github.com/chaijs/chai/pull/386)). + By [@cjqed](https://github.com/cjqed) + +## 2.1.1 / 2015-03-04 + +Two minor bugfixes. No new features. + +### Community Contributions + +#### Code Features & Fixes + + * [#385](https://github.com/chaijs/chai/pull/385) Fix a bug (also described in + [#387](https://github.com/chaijs/chai/pull/385)) where `deep.property` would not work with single + key names. By [@eldritch-fossicker](https://github.com/eldritch-fossicker) + * [#379](https://github.com/chaijs/chai/pull/379) Fix bug where tools which overwrite + primitive prototypes, such as Babel or core-js would fail. + By [@dcneiner](https://github.com/dcneiner) + +#### Documentation fixes + + * [#382](https://github.com/chaijs/chai/pull/382) Add doc for showDiff argument in assert. + By [@astorije](https://github.com/astorije) + * [#383](https://github.com/chaijs/chai/pull/383) Improve wording for truncateTreshold docs + By [@gurdiga](https://github.com/gurdiga) + * [#381](https://github.com/chaijs/chai/pull/381) Improve wording for assert.empty docs + By [@astorije](https://github.com/astorije) + +## 2.1.0 / 2015-02-23 + +Small release; fixes an issue where the Chai lib was incorrectly reporting the +version number. + +Adds new `should.fail()` and `expect.fail()` methods, which are convinience +methods to throw Assertion Errors. + +### Community Contributions + +#### Code Features & Fixes + + * [#356](https://github.com/chaijs/chai/pull/356) Add should.fail(), expect.fail(). By [@Soviut](https://github.com/Soviut) + * [#374](https://github.com/chaijs/chai/pull/374) Increment version. By [@jmm](https://github.com/jmm) + +## 2.0.0 / 2015-02-09 + +Unfortunately with 1.10.0 - compatibility broke with older versions because of +the `addChainableNoop`. This change has been reverted. + +Any plugins using `addChainableNoop` should cease to do so. + +Any developers wishing for this behaviour can use [dirty-chai](https://www.npmjs.com/package/dirty-chai) +by [@joshperry](https://github.com/joshperry) + +### Community Contributions + +#### Code Features & Fixes + + * [#361](https://github.com/chaijs/chai/pull/361) `.keys()` now accepts Objects, extracting keys from them. By [@gregglind](https://github.com/gregglind) + * [#359](https://github.com/chaijs/chai/pull/359) `.keys()` no longer mutates passed arrays. By [@gregglind](https://github.com/gregglind) + * [#349](https://github.com/chaijs/chai/pull/349) Add a new chainable keyword - `.which`. By [@toastynerd](https://github.com/toastynerd) + * [#333](https://github.com/chaijs/chai/pull/333) Add `.change`, `.increase` and `.decrease` assertions. By [@cmpolis](https://github.com/cmpolis) + * [#335](https://github.com/chaijs/chai/pull/335) `chai.util` is now exposed [@DingoEatingFuzz](https://github.com/DingoEatingFuzz) + * [#328](https://github.com/chaijs/chai/pull/328) Add `.includes` and `.contains` aliases (for `.include` and `.contain`). By [@lo1tuma](https://github.com/lo1tuma) + * [#313](https://github.com/chaijs/chai/pull/313) Add `.any.keys()` and `.all.keys()` qualifiers. By [@cjqed](https://github.com/cjqed) + * [#312](https://github.com/chaijs/chai/pull/312) Add `assert.sameDeepMembers()`. By [@cjqed](https://github.com/cjqed) + * [#311](https://github.com/chaijs/chai/pull/311) Add `assert.isAbove()` and `assert.isBelow()`. By [@cjqed](https://github.com/cjqed) + * [#308](https://github.com/chaijs/chai/pull/308) `property` and `deep.property` now pass if a value is set to `undefined`. By [@prodatakey](https://github.com/prodatakey) + * [#309](https://github.com/chaijs/chai/pull/309) optimize deep equal in Arrays. By [@ericdouglas](https://github.com/ericdouglas) + * [#306](https://github.com/chaijs/chai/pull/306) revert #297 - allowing lint-friendly tests. By [@keithamus](https://github.com/keithamus) + +#### Documentation fixes + + * [#357](https://github.com/chaijs/chai/pull/357) Copyright year updated in docs. By [@danilovaz](https://github.com/danilovaz) + * [#325](https://github.com/chaijs/chai/pull/325) Fix documentation for overwriteChainableMethod. By [@chasenlehara](https://github.com/chasenlehara) + * [#334](https://github.com/chaijs/chai/pull/334) Typo fix. By [@hurrymaplelad](https://github.com/hurrymaplelad) + * [#317](https://github.com/chaijs/chai/pull/317) Typo fix. By [@jasonkarns](https://github.com/jasonkarns) + * [#318](https://github.com/chaijs/chai/pull/318) Typo fix. By [@jasonkarns](https://github.com/jasonkarns) + * [#316](https://github.com/chaijs/chai/pull/316) Typo fix. By [@jasonkarns](https://github.com/jasonkarns) + + +## 1.10.0 / 2014-11-10 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - No changes required +- **Plugin Developers:** + - Review `addChainableNoop` notes below. +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### Noop Function for Terminating Assertion Properties + +The following assertions can now also be used in the function-call form: + +* ok +* true +* false +* null +* undefined +* exist +* empty +* arguments +* Arguments + +The above list of assertions are property getters that assert immediately on +access. Because of that, they were written to be used by terminating the assertion +chain with a property access. + +```js +expect(true).to.be.true; +foo.should.be.ok; +``` + +This syntax is definitely aesthetically pleasing but, if you are linting your +test code, your linter will complain with an error something like "Expected an +assignment or function call and instead saw an expression." Since the linter +doesn't know about the property getter it assumes this line has no side-effects, +and throws a warning in case you made a mistake. + +Squelching these errors is not a good solution as test code is getting to be +just as important as, if not more than, production code. Catching syntactical +errors in tests using static analysis is a great tool to help make sure that your +tests are well-defined and free of typos. + +A better option was to provide a function-call form for these assertions so that +the code's intent is more clear and the linters stop complaining about something +looking off. This form is added in addition to the existing property access form +and does not impact existing test code. + +```js +expect(true).to.be.true(); +foo.should.be.ok(); +``` + +These forms can also be mixed in any way, these are all functionally identical: + +```js +expect(true).to.be.true.and.not.false(); +expect(true).to.be.true().and.not.false; +expect(true).to.be.true.and.not.false; +``` + +#### Plugin Authors + +If you would like to provide this function-call form for your terminating assertion +properties, there is a new function to register these types of asserts. Instead +of using `addProperty` to register terminating assertions, simply use `addChainableNoop` +instead; the arguments to both are identical. The latter will make the assertion +available in both the attribute and function-call forms and should have no impact +on existing users of your plugin. + +### Community Contributions + +- [#297](https://github.com/chaijs/chai/pull/297) Allow writing lint-friendly tests. [@joshperry](https://github.com/joshperry) +- [#298](https://github.com/chaijs/chai/pull/298) Add check for logging `-0`. [@dasilvacontin](https://github.com/dasilvacontin) +- [#300](https://github.com/chaijs/chai/pull/300) Fix #299: the test is defining global variables [@julienw](https://github.com/julienw) + +Thank you to all who took time to contribute! + +## 1.9.2 / 2014-09-29 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - No changes required +- **Plugin Developers:** + - No changes required +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### Community Contributions + +- [#264](https://github.com/chaijs/chai/pull/264) Show diff for keys assertions [@cjthompson](https://github.com/cjthompson) +- [#267](https://github.com/chaijs/chai/pull/267) Use SVG badges [@shinnn](https://github.com/shinnn) +- [#268](https://github.com/chaijs/chai/pull/268) Allow messages to be functions (sinon-compat) [@charlierudolph](https://github.com/charlierudolph) +- [#269](https://github.com/chaijs/chai/pull/269) Remove unused argument for #lengthOf [@charlierudolph](https://github.com/charlierudolph) +- [#275](https://github.com/chaijs/chai/pull/275) Rewrite pretty-printing HTML elements to prevent throwing internal errors [@DrRataplan](https://github.com/DrRataplan) +- [#277](https://github.com/chaijs/chai/pull/277) Fix assert documentation for #sameMembers [@charlierudolph](https://github.com/charlierudolph) +- [#279](https://github.com/chaijs/chai/pull/279) closeTo should check value's type before assertion [@mohayonao](https://github.com/mohayonao) +- [#289](https://github.com/chaijs/chai/pull/289) satisfy is called twice [@charlierudolph](https://github.com/charlierudolph) +- [#292](https://github.com/chaijs/chai/pull/292) resolve conflicts with node-webkit and global usage [@boneskull](https://github.com/boneskull) + +Thank you to all who took time to contribute! + +## 1.9.1 / 2014-03-19 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - Migrate configuration options to new interface. (see notes) +- **Plugin Developers:** + - No changes required +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### Configuration + +There have been requests for changes and additions to the configuration mechanisms +and their impact in the Chai architecture. As such, we have decoupled the +configuration from the `Assertion` constructor. This not only allows for centralized +configuration, but will allow us to shift the responsibility from the `Assertion` +constructor to the `assert` interface in future releases. + +These changes have been implemented in a non-breaking way, but a depretiation +warning will be presented to users until they migrate. The old config method will +be removed in either `v1.11.0` or `v2.0.0`, whichever comes first. + +#### Quick Migration + +```js +// change this: +chai.Assertion.includeStack = true; +chai.Assertion.showDiff = false; + +// ... to this: +chai.config.includeStack = true; +chai.config.showDiff = false; +``` + +#### All Config Options + +##### config.includeStack + +- **@param** _{Boolean}_ +- **@default** `false` + +User configurable property, influences whether stack trace is included in +Assertion error message. Default of `false` suppresses stack trace in the error +message. + +##### config.showDiff + +- **@param** _{Boolean}_ +- **@default** `true` + +User configurable property, influences whether or not the `showDiff` flag +should be included in the thrown AssertionErrors. `false` will always be `false`; +`true` will be true when the assertion has requested a diff be shown. + +##### config.truncateThreshold **(NEW)** + +- **@param** _{Number}_ +- **@default** `40` + +User configurable property, sets length threshold for actual and expected values +in assertion errors. If this threshold is exceeded, the value is truncated. + +Set it to zero if you want to disable truncating altogether. + +```js +chai.config.truncateThreshold = 0; // disable truncating +``` + +### Community Contributions + +- [#228](https://github.com/chaijs/chai/pull/228) Deep equality check for memebers. [@duncanbeevers](https://github.com/duncanbeevers) +- [#247](https://github.com/chaijs/chai/pull/247) Proofreading. [@didorellano](https://github.com/didoarellano) +- [#244](https://github.com/chaijs/chai/pull/244) Fix `contain`/`include` 1.9.0 regression. [@leider](https://github.com/leider) +- [#233](https://github.com/chaijs/chai/pull/233) Improvements to `ssfi` for `assert` interface. [@refack](https://github.com/refack) +- [#251](https://github.com/chaijs/chai/pull/251) New config option: object display threshold. [@romario333](https://github.com/romario333) + +Thank you to all who took time to contribute! + +### Other Bug Fixes + +- [#183](https://github.com/chaijs/chai/issues/183) Allow `undefined` for actual. (internal api) +- Update Karam(+plugins)/Istanbul to most recent versions. + +## 1.9.0 / 2014-01-29 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - No changes required +- **Plugin Developers:** + - Review [#219](https://github.com/chaijs/chai/pull/219). +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### Community Contributions + +- [#202](https://github.com/chaijs/chai/pull/201) Improve error message for .throw(). [@andreineculau](https://github.com/andreineculau) +- [#217](https://github.com/chaijs/chai/pull/217) Chai tests can be run with `--watch`. [@demands](https://github.com/demands) +- [#219](https://github.com/chaijs/chai/pull/219) Add overwriteChainableMethod utility. [@demands](https://github.com/demands) +- [#224](https://github.com/chaijs/chai/pull/224) Return error on throw method to chain on error properties. [@vbardales](https://github.com/vbardales) +- [#226](https://github.com/chaijs/chai/pull/226) Add `has` to language chains. [@duncanbeevers](https://github.com/duncanbeevers) +- [#230](https://github.com/chaijs/chai/pull/230) Support `{a:1,b:2}.should.include({a:1})` [@jkroso](https://github.com/jkroso) +- [#231](https://github.com/chaijs/chai/pull/231) Update Copyright notices to 2014 [@duncanbeevers](https://github.com/duncanbeevers) +- [#232](https://github.com/chaijs/chai/pull/232) Avoid error instantiation if possible on assert.throws. [@laconbass](https://github.com/laconbass) + +Thank you to all who took time to contribute! + +### Other Bug Fixes + +- [#225](https://github.com/chaijs/chai/pull/225) Improved AMD wrapper provided by upstream `component(1)`. +- [#185](https://github.com/chaijs/chai/issues/185) `assert.throws()` returns thrown error for further assertions. +- [#237](https://github.com/chaijs/chai/pull/237) Remove coveralls/jscoverage, include istanbul coverage report in travis test. +- Update Karma and Sauce runner versions for consistent CI results. No more karma@canary. + +## 1.8.1 / 2013-10-10 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - Refresh `node_modules` folder for updated dependencies. +- **Plugin Developers:** + - No changes required +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### Browserify + +This is a small patch that updates the dependency tree so browserify users can install +chai. (Remove conditional requires) + +## 1.8.0 / 2013-09-18 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - See `deep.equal` notes. +- **Plugin Developers:** + - No changes required +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### Deep Equals + +This version of Chai focused on a overhaul to the deep equal utility. The code for this +tool has been removed from the core lib and can now be found at: +[chai / deep-eql](https://github.com/chaijs/deep-eql). As stated in previous releases, +this is part of a larger initiative to provide transparency, independent testing, and coverage for +some of the more complicated internal tools. + +For the most part `.deep.equal` will behave the same as it has. However, in order to provide a +consistent ruleset across all types being tested, the following changes have been made and _might_ +require changes to your tests. + +**1.** Strict equality for non-traversable nodes according to [egal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + +_Previously:_ Non-traversable equal via `===`. + +```js +expect(NaN).to.deep.equal(NaN); +expect(-0).to.not.deep.equal(+0); +``` + +**2.** Arguments are not Arrays (and all types must be equal): + +_Previously:_ Some crazy nonsense that led to empty arrays deep equaling empty objects deep equaling dates. + +```js +expect(arguments).to.not.deep.equal([]); +expect(Array.prototype.slice.call(arguments)).to.deep.equal([]); +``` + +- [#156](https://github.com/chaijs/chai/issues/156) Empty object is eql to empty array +- [#192](https://github.com/chaijs/chai/issues/192) empty object is eql to a Date object +- [#194](https://github.com/chaijs/chai/issues/194) refactor deep-equal utility + +### CI and Browser Testing + +Chai now runs the browser CI suite using [Karma](http://karma-runner.github.io/) directed at +[SauceLabs](https://saucelabs.com/). This means we get to know where our browser support stands... +and we get a cool badge: + +[![Selenium Test Status](https://saucelabs.com/browser-matrix/logicalparadox.svg)](https://saucelabs.com/u/logicalparadox) + +Look for the list of browsers/versions to expand over the coming releases. + +- [#195](https://github.com/chaijs/chai/issues/195) karma test framework + +## 1.7.2 / 2013-06-27 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - No changes required. +- **Plugin Developers:** + - No changes required +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### Coverage Reporting + +Coverage reporting has always been available for core-developers but the data has never been published +for our end users. In our ongoing effort to improve accountability this data will now be published via +the [coveralls.io](https://coveralls.io/) service. A badge has been added to the README and the full report +can be viewed online at the [chai coveralls project](https://coveralls.io/r/chaijs/chai). Furthermore, PRs +will receive automated messages indicating how their PR impacts test coverage. This service is tied to TravisCI. + +### Other Fixes + +- [#175](https://github.com/chaijs/chai/issues/175) Add `bower.json`. (Fix ignore all) + +## 1.7.1 / 2013-06-24 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - No changes required. +- **Plugin Developers:** + - No changes required +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### Official Bower Support + +Support has been added for the Bower Package Manager ([bower.io])(http://bower.io/). Though +Chai could be installed via Bower in the past, this update adds official support via the `bower.json` +specification file. + +- [#175](https://github.com/chaijs/chai/issues/175) Add `bower.json`. + +## 1.7.0 / 2013-06-17 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - No changes required. +- **Plugin Developers:** + - Review AssertionError update notice. +- **Core Contributors:** + - Refresh `node_modules` folder for updated dependencies. + +### AssertionError Update Notice + +Chai now uses [chaijs/assertion-error](https://github.com/chaijs/assertion-error) instead an internal +constructor. This will allow for further iteration/experimentation of the AssertionError constructor +independant of Chai. Future plans include stack parsing for callsite support. + +This update constructor has a different constructor param signature that conforms more with the standard +`Error` object. If your plugin throws and `AssertionError` directly you will need to update your plugin +with the new signature. + +```js +var AssertionError = require('chai').AssertionError; + +/** + * previous + * + * @param {Object} options + */ + +throw new AssertionError({ + message: 'An assertion error occurred' + , actual: actual + , expect: expect + , startStackFunction: arguments.callee + , showStack: true +}); + +/** + * new + * + * @param {String} message + * @param {Object} options + * @param {Function} start stack function + */ + +throw new AssertionError('An assertion error occurred', { + actual: actual + , expect: expect + , showStack: true +}, arguments.callee); + +// other signatures +throw new AssertionError('An assertion error occurred'); +throw new AssertionError('An assertion error occurred', null, arguments.callee); +``` + +#### External Dependencies + +This is the first non-developement dependency for Chai. As Chai continues to evolve we will begin adding +more; the next will likely be improved type detection and deep equality. With Chai's userbase continually growing +there is an higher need for accountability and documentation. External dependencies will allow us to iterate and +test on features independent from our interfaces. + +Note: The browser packaged version `chai.js` will ALWAYS contain all dependencies needed to run Chai. + +### Community Contributions + +- [#169](https://github.com/chaijs/chai/pull/169) Fix deep equal comparison for Date/Regexp types. [@katsgeorgeek](https://github.com/katsgeorgeek) +- [#171](https://github.com/chaijs/chai/pull/171) Add `assert.notOk()`. [@Bartvds](https://github.com/Bartvds) +- [#173](https://github.com/chaijs/chai/pull/173) Fix `inspect` utility. [@domenic](https://github.com/domenic) + +Thank you to all who took the time to contribute! + +## 1.6.1 / 2013-06-05 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - No changes required. +- **Plugin Developers:** + - No changes required. +- **Core Contributors:** + - Refresh `node_modules` folder for updated developement dependencies. + +### Deep Equality + +Regular Expressions are now tested as part of all deep equality assertions. In previous versions +they silently passed for all scenarios. Thanks to [@katsgeorgeek](https://github.com/katsgeorgeek) for the contribution. + +### Community Contributions + +- [#161](https://github.com/chaijs/chai/pull/161) Fix documented name for assert interface's isDefined method. [@brandonpayton](https://github.com/brandonpayton) +- [#168](https://github.com/chaijs/chai/pull/168) Fix comparison equality of two regexps for when using deep equality. [@katsgeorgeek](https://github.com/katsgeorgeek) + +Thank you to all who took the time to contribute! + +### Additional Notes + +- Mocha has been locked at version `1.8.x` to ensure `mocha-phantomjs` compatibility. + +## 1.6.0 / 2013-04-29 + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - No changes required. +- **Plugin Developers:** + - No changes required. +- **Core Contributors:** + - Refresh `node_modules` folder for updated developement dependencies. + +### New Assertions + +#### Array Members Inclusion + +Asserts that the target is a superset of `set`, or that the target and `set` have the same members. +Order is not taken into account. Thanks to [@NickHeiner](https://github.com/NickHeiner) for the contribution. + +```js +// (expect/should) full set +expect([4, 2]).to.have.members([2, 4]); +expect([5, 2]).to.not.have.members([5, 2, 1]); + +// (expect/should) inclusion +expect([1, 2, 3]).to.include.members([3, 2]); +expect([1, 2, 3]).to.not.include.members([3, 2, 8]); + +// (assert) full set +assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); + +// (assert) inclusion +assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members'); + +``` + +#### Non-inclusion for Assert Interface + +Most `assert` functions have a negative version, like `instanceOf()` has a corresponding `notInstaceOf()`. +However `include()` did not have a corresponding `notInclude()`. This has been added. + +```js +assert.notInclude([ 1, 2, 3 ], 8); +assert.notInclude('foobar', 'baz'); +``` + +### Community Contributions + +- [#140](https://github.com/chaijs/chai/pull/140) Restore `call`/`apply` methods for plugin interface. [@RubenVerborgh](https://github.com/RubenVerborgh) +- [#148](https://github.com/chaijs/chai/issues/148)/[#153](https://github.com/chaijs/chai/pull/153) Add `members` and `include.members` assertions. [#NickHeiner](https://github.com/NickHeiner) + +Thank you to all who took time to contribute! + +### Other Bug Fixes + +- [#142](https://github.com/chaijs/chai/issues/142) `assert#include` will no longer silently pass on wrong-type haystack. +- [#158](https://github.com/chaijs/chai/issues/158) `assert#notInclude` has been added. +- Travis-CI now tests Node.js `v0.10.x`. Support for `v0.6.x` has been removed. `v0.8.x` is still tested as before. + +## 1.5.0 / 2013-02-03 + +### Migration Requirements + +The following changes are required if you are upgrading from the previous version: + +- **Users:** + - _Update [2013-02-04]:_ Some users may notice a small subset of deep equality assertions will no longer pass. This is the result of + [#120](https://github.com/chaijs/chai/issues/120), an improvement to our deep equality algorithm. Users will need to revise their assertions + to be more granular should this occur. Further information: [#139](https://github.com/chaijs/chai/issues/139). +- **Plugin Developers:** + - No changes required. +- **Core Contributors:** + - Refresh `node_modules` folder for updated developement dependencies. + +### Community Contributions + +- [#126](https://github.com/chaijs/chai/pull/126): Add `eqls` alias for `eql`. [@RubenVerborgh](https://github.com/RubenVerborgh) +- [#127](https://github.com/chaijs/chai/issues/127): Performance refactor for chainable methods. [@RubenVerborgh](https://github.com/RubenVerborgh) +- [#133](https://github.com/chaijs/chai/pull/133): Assertion `.throw` support for primitives. [@RubenVerborgh](https://github.com/RubenVerborgh) +- [#137](https://github.com/chaijs/chai/issues/137): Assertion `.throw` support for empty messages. [@timnew](https://github.com/timnew) +- [#136](https://github.com/chaijs/chai/pull/136): Fix backward negation messages when using `.above()` and `.below()`. [@whatthejeff](https://github.com/whatthejeff) + +Thank you to all who took time to contribute! + +### Other Bug Fixes + +- Improve type detection of `.a()`/`.an()` to work in cross-browser scenarios. +- [#116](https://github.com/chaijs/chai/issues/116): `.throw()` has cleaner display of errors when WebKit browsers. +- [#120](https://github.com/chaijs/chai/issues/120): `.eql()` now works to compare dom nodes in browsers. + + +### Usage Updates + +#### For Users + +**1. Component Support:** Chai now included the proper configuration to be installed as a +[component](https://github.com/component/component). Component users are encouraged to consult +[chaijs.com](http://chaijs.com) for the latest version number as using the master branch +does not gaurantee stability. + +```js +// relevant component.json + devDependencies: { + "chaijs/chai": "1.5.0" + } +``` + +Alternatively, bleeding-edge is available: + + $ component install chaijs/chai + +**2. Configurable showDiff:** Some test runners (such as [mocha](http://visionmedia.github.com/mocha/)) +include support for showing the diff of strings and objects when an equality error occurs. Chai has +already included support for this, however some users may not prefer this display behavior. To revert to +no diff display, the following configuration is available: + +```js +chai.Assertion.showDiff = false; // diff output disabled +chai.Assertion.showDiff = true; // default, diff output enabled +``` + +#### For Plugin Developers + +**1. New Utility - type**: The new utility `.type()` is available as a better implementation of `typeof` +that can be used cross-browser. It handles the inconsistencies of Array, `null`, and `undefined` detection. + +- **@param** _{Mixed}_ object to detect type of +- **@return** _{String}_ object type + +```js +chai.use(function (c, utils) { + // some examples + utils.type({}); // 'object' + utils.type(null); // `null' + utils.type(undefined); // `undefined` + utils.type([]); // `array` +}); +``` + +#### For Core Contributors + +**1. Browser Testing**: Browser testing of the `./chai.js` file is now available in the command line +via PhantomJS. `make test` and Travis-CI will now also rebuild and test `./chai.js`. Consequently, all +pull requests will now be browser tested in this way. + +_Note: Contributors opening pull requests should still NOT include the browser build._ + +**2. SauceLabs Testing**: Early SauceLab support has been enabled with the file `./support/mocha-cloud.js`. +Those interested in trying it out should create a free [Open Sauce](https://saucelabs.com/signup/plan) account +and include their credentials in `./test/auth/sauce.json`. diff --git a/sdk/typescript/node_modules/chai/bower.json b/sdk/typescript/node_modules/chai/bower.json new file mode 100644 index 0000000..af2ee02 --- /dev/null +++ b/sdk/typescript/node_modules/chai/bower.json @@ -0,0 +1,26 @@ +{ + "name": "chai", + "description": "BDD/TDD assertion library for node.js and the browser. Test framework agnostic.", + "license": "MIT", + "keywords": [ + "test", + "assertion", + "assert", + "testing", + "chai" + ], + "main": "chai.js", + "ignore": [ + "build", + "components", + "lib", + "node_modules", + "support", + "test", + "index.js", + "Makefile", + ".*" + ], + "dependencies": {}, + "devDependencies": {} +} diff --git a/sdk/typescript/node_modules/chai/chai.js b/sdk/typescript/node_modules/chai/chai.js new file mode 100644 index 0000000..3763e16 --- /dev/null +++ b/sdk/typescript/node_modules/chai/chai.js @@ -0,0 +1,11300 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.chai = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i + * MIT Licensed + */ + +var used = []; + +/*! + * Chai version + */ + +exports.version = '4.3.8'; + +/*! + * Assertion Error + */ + +exports.AssertionError = require('assertion-error'); + +/*! + * Utils for plugins (not exported) + */ + +var util = require('./chai/utils'); + +/** + * # .use(function) + * + * Provides a way to extend the internals of Chai. + * + * @param {Function} + * @returns {this} for chaining + * @api public + */ + +exports.use = function (fn) { + if (!~used.indexOf(fn)) { + fn(exports, util); + used.push(fn); + } + + return exports; +}; + +/*! + * Utility Functions + */ + +exports.util = util; + +/*! + * Configuration + */ + +var config = require('./chai/config'); +exports.config = config; + +/*! + * Primary `Assertion` prototype + */ + +var assertion = require('./chai/assertion'); +exports.use(assertion); + +/*! + * Core Assertions + */ + +var core = require('./chai/core/assertions'); +exports.use(core); + +/*! + * Expect interface + */ + +var expect = require('./chai/interface/expect'); +exports.use(expect); + +/*! + * Should interface + */ + +var should = require('./chai/interface/should'); +exports.use(should); + +/*! + * Assert interface + */ + +var assert = require('./chai/interface/assert'); +exports.use(assert); + +},{"./chai/assertion":3,"./chai/config":4,"./chai/core/assertions":5,"./chai/interface/assert":6,"./chai/interface/expect":7,"./chai/interface/should":8,"./chai/utils":22,"assertion-error":33}],3:[function(require,module,exports){ +/*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +var config = require('./config'); + +module.exports = function (_chai, util) { + /*! + * Module dependencies. + */ + + var AssertionError = _chai.AssertionError + , flag = util.flag; + + /*! + * Module export. + */ + + _chai.Assertion = Assertion; + + /*! + * Assertion Constructor + * + * Creates object for chaining. + * + * `Assertion` objects contain metadata in the form of flags. Three flags can + * be assigned during instantiation by passing arguments to this constructor: + * + * - `object`: This flag contains the target of the assertion. For example, in + * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will + * contain `numKittens` so that the `equal` assertion can reference it when + * needed. + * + * - `message`: This flag contains an optional custom error message to be + * prepended to the error message that's generated by the assertion when it + * fails. + * + * - `ssfi`: This flag stands for "start stack function indicator". It + * contains a function reference that serves as the starting point for + * removing frames from the stack trace of the error that's created by the + * assertion when it fails. The goal is to provide a cleaner stack trace to + * end users by removing Chai's internal functions. Note that it only works + * in environments that support `Error.captureStackTrace`, and only when + * `Chai.config.includeStack` hasn't been set to `false`. + * + * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag + * should retain its current value, even as assertions are chained off of + * this object. This is usually set to `true` when creating a new assertion + * from within another assertion. It's also temporarily set to `true` before + * an overwritten assertion gets called by the overwriting assertion. + * + * - `eql`: This flag contains the deepEqual function to be used by the assertion. + * + * @param {Mixed} obj target of the assertion + * @param {String} msg (optional) custom error message + * @param {Function} ssfi (optional) starting point for removing stack frames + * @param {Boolean} lockSsfi (optional) whether or not the ssfi flag is locked + * @api private + */ + + function Assertion (obj, msg, ssfi, lockSsfi) { + flag(this, 'ssfi', ssfi || Assertion); + flag(this, 'lockSsfi', lockSsfi); + flag(this, 'object', obj); + flag(this, 'message', msg); + flag(this, 'eql', config.deepEqual || util.eql); + + return util.proxify(this); + } + + Object.defineProperty(Assertion, 'includeStack', { + get: function() { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + return config.includeStack; + }, + set: function(value) { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + config.includeStack = value; + } + }); + + Object.defineProperty(Assertion, 'showDiff', { + get: function() { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + return config.showDiff; + }, + set: function(value) { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + config.showDiff = value; + } + }); + + Assertion.addProperty = function (name, fn) { + util.addProperty(this.prototype, name, fn); + }; + + Assertion.addMethod = function (name, fn) { + util.addMethod(this.prototype, name, fn); + }; + + Assertion.addChainableMethod = function (name, fn, chainingBehavior) { + util.addChainableMethod(this.prototype, name, fn, chainingBehavior); + }; + + Assertion.overwriteProperty = function (name, fn) { + util.overwriteProperty(this.prototype, name, fn); + }; + + Assertion.overwriteMethod = function (name, fn) { + util.overwriteMethod(this.prototype, name, fn); + }; + + Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { + util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); + }; + + /** + * ### .assert(expression, message, negateMessage, expected, actual, showDiff) + * + * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. + * + * @name assert + * @param {Philosophical} expression to be tested + * @param {String|Function} message or function that returns message to display if expression fails + * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails + * @param {Mixed} expected value (remember to check for negation) + * @param {Mixed} actual (optional) will default to `this.obj` + * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails + * @api private + */ + + Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) { + var ok = util.test(this, arguments); + if (false !== showDiff) showDiff = true; + if (undefined === expected && undefined === _actual) showDiff = false; + if (true !== config.showDiff) showDiff = false; + + if (!ok) { + msg = util.getMessage(this, arguments); + var actual = util.getActual(this, arguments); + var assertionErrorObjectProperties = { + actual: actual + , expected: expected + , showDiff: showDiff + }; + + var operator = util.getOperator(this, arguments); + if (operator) { + assertionErrorObjectProperties.operator = operator; + } + + throw new AssertionError( + msg, + assertionErrorObjectProperties, + (config.includeStack) ? this.assert : flag(this, 'ssfi')); + } + }; + + /*! + * ### ._obj + * + * Quick reference to stored `actual` value for plugin developers. + * + * @api private + */ + + Object.defineProperty(Assertion.prototype, '_obj', + { get: function () { + return flag(this, 'object'); + } + , set: function (val) { + flag(this, 'object', val); + } + }); +}; + +},{"./config":4}],4:[function(require,module,exports){ +module.exports = { + + /** + * ### config.includeStack + * + * User configurable property, influences whether stack trace + * is included in Assertion error message. Default of false + * suppresses stack trace in the error message. + * + * chai.config.includeStack = true; // enable stack on error + * + * @param {Boolean} + * @api public + */ + + includeStack: false, + + /** + * ### config.showDiff + * + * User configurable property, influences whether or not + * the `showDiff` flag should be included in the thrown + * AssertionErrors. `false` will always be `false`; `true` + * will be true when the assertion has requested a diff + * be shown. + * + * @param {Boolean} + * @api public + */ + + showDiff: true, + + /** + * ### config.truncateThreshold + * + * User configurable property, sets length threshold for actual and + * expected values in assertion errors. If this threshold is exceeded, for + * example for large data structures, the value is replaced with something + * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`. + * + * Set it to zero if you want to disable truncating altogether. + * + * This is especially userful when doing assertions on arrays: having this + * set to a reasonable large value makes the failure messages readily + * inspectable. + * + * chai.config.truncateThreshold = 0; // disable truncating + * + * @param {Number} + * @api public + */ + + truncateThreshold: 40, + + /** + * ### config.useProxy + * + * User configurable property, defines if chai will use a Proxy to throw + * an error when a non-existent property is read, which protects users + * from typos when using property-based assertions. + * + * Set it to false if you want to disable this feature. + * + * chai.config.useProxy = false; // disable use of Proxy + * + * This feature is automatically disabled regardless of this config value + * in environments that don't support proxies. + * + * @param {Boolean} + * @api public + */ + + useProxy: true, + + /** + * ### config.proxyExcludedKeys + * + * User configurable property, defines which properties should be ignored + * instead of throwing an error if they do not exist on the assertion. + * This is only applied if the environment Chai is running in supports proxies and + * if the `useProxy` configuration setting is enabled. + * By default, `then` and `inspect` will not throw an error if they do not exist on the + * assertion object because the `.inspect` property is read by `util.inspect` (for example, when + * using `console.log` on the assertion object) and `.then` is necessary for promise type-checking. + * + * // By default these keys will not throw an error if they do not exist on the assertion object + * chai.config.proxyExcludedKeys = ['then', 'inspect']; + * + * @param {Array} + * @api public + */ + + proxyExcludedKeys: ['then', 'catch', 'inspect', 'toJSON'], + + /** + * ### config.deepEqual + * + * User configurable property, defines which a custom function to use for deepEqual + * comparisons. + * By default, the function used is the one from the `deep-eql` package without custom comparator. + * + * // use a custom comparator + * chai.config.deepEqual = (expected, actual) => { + * return chai.util.eql(expected, actual, { + * comparator: (expected, actual) => { + * // for non number comparison, use the default behavior + * if(typeof expected !== 'number') return null; + * // allow a difference of 10 between compared numbers + * return typeof actual === 'number' && Math.abs(actual - expected) < 10 + * } + * }) + * }; + * + * @param {Function} + * @api public + */ + + deepEqual: null + +}; + +},{}],5:[function(require,module,exports){ +/*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, _) { + var Assertion = chai.Assertion + , AssertionError = chai.AssertionError + , flag = _.flag; + + /** + * ### Language Chains + * + * The following are provided as chainable getters to improve the readability + * of your assertions. + * + * **Chains** + * + * - to + * - be + * - been + * - is + * - that + * - which + * - and + * - has + * - have + * - with + * - at + * - of + * - same + * - but + * - does + * - still + * - also + * + * @name language chains + * @namespace BDD + * @api public + */ + + [ 'to', 'be', 'been', 'is' + , 'and', 'has', 'have', 'with' + , 'that', 'which', 'at', 'of' + , 'same', 'but', 'does', 'still', "also" ].forEach(function (chain) { + Assertion.addProperty(chain); + }); + + /** + * ### .not + * + * Negates all assertions that follow in the chain. + * + * expect(function () {}).to.not.throw(); + * expect({a: 1}).to.not.have.property('b'); + * expect([1, 2]).to.be.an('array').that.does.not.include(3); + * + * Just because you can negate any assertion with `.not` doesn't mean you + * should. With great power comes great responsibility. It's often best to + * assert that the one expected output was produced, rather than asserting + * that one of countless unexpected outputs wasn't produced. See individual + * assertions for specific guidance. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.equal(1); // Not recommended + * + * @name not + * @namespace BDD + * @api public + */ + + Assertion.addProperty('not', function () { + flag(this, 'negate', true); + }); + + /** + * ### .deep + * + * Causes all `.equal`, `.include`, `.members`, `.keys`, and `.property` + * assertions that follow in the chain to use deep equality instead of strict + * (`===`) equality. See the `deep-eql` project page for info on the deep + * equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) equals `{a: 1}` + * expect({a: 1}).to.deep.equal({a: 1}); + * expect({a: 1}).to.not.equal({a: 1}); + * + * // Target array deeply (but not strictly) includes `{a: 1}` + * expect([{a: 1}]).to.deep.include({a: 1}); + * expect([{a: 1}]).to.not.include({a: 1}); + * + * // Target object deeply (but not strictly) includes `x: {a: 1}` + * expect({x: {a: 1}}).to.deep.include({x: {a: 1}}); + * expect({x: {a: 1}}).to.not.include({x: {a: 1}}); + * + * // Target array deeply (but not strictly) has member `{a: 1}` + * expect([{a: 1}]).to.have.deep.members([{a: 1}]); + * expect([{a: 1}]).to.not.have.members([{a: 1}]); + * + * // Target set deeply (but not strictly) has key `{a: 1}` + * expect(new Set([{a: 1}])).to.have.deep.keys([{a: 1}]); + * expect(new Set([{a: 1}])).to.not.have.keys([{a: 1}]); + * + * // Target object deeply (but not strictly) has property `x: {a: 1}` + * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1}); + * expect({x: {a: 1}}).to.not.have.property('x', {a: 1}); + * + * @name deep + * @namespace BDD + * @api public + */ + + Assertion.addProperty('deep', function () { + flag(this, 'deep', true); + }); + + /** + * ### .nested + * + * Enables dot- and bracket-notation in all `.property` and `.include` + * assertions that follow in the chain. + * + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]'); + * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'}); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]'); + * expect({'.a': {'[b]': 'x'}}).to.nested.include({'\\.a.\\[b\\]': 'x'}); + * + * `.nested` cannot be combined with `.own`. + * + * @name nested + * @namespace BDD + * @api public + */ + + Assertion.addProperty('nested', function () { + flag(this, 'nested', true); + }); + + /** + * ### .own + * + * Causes all `.property` and `.include` assertions that follow in the chain + * to ignore inherited properties. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.have.own.property('a'); + * expect({a: 1}).to.have.property('b'); + * expect({a: 1}).to.not.have.own.property('b'); + * + * expect({a: 1}).to.own.include({a: 1}); + * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2}); + * + * `.own` cannot be combined with `.nested`. + * + * @name own + * @namespace BDD + * @api public + */ + + Assertion.addProperty('own', function () { + flag(this, 'own', true); + }); + + /** + * ### .ordered + * + * Causes all `.members` assertions that follow in the chain to require that + * members be in the same order. + * + * expect([1, 2]).to.have.ordered.members([1, 2]) + * .but.not.have.ordered.members([2, 1]); + * + * When `.include` and `.ordered` are combined, the ordering begins at the + * start of both arrays. + * + * expect([1, 2, 3]).to.include.ordered.members([1, 2]) + * .but.not.include.ordered.members([2, 3]); + * + * @name ordered + * @namespace BDD + * @api public + */ + + Assertion.addProperty('ordered', function () { + flag(this, 'ordered', true); + }); + + /** + * ### .any + * + * Causes all `.keys` assertions that follow in the chain to only require that + * the target have at least one of the given keys. This is the opposite of + * `.all`, which requires that the target have all of the given keys. + * + * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd'); + * + * See the `.keys` doc for guidance on when to use `.any` or `.all`. + * + * @name any + * @namespace BDD + * @api public + */ + + Assertion.addProperty('any', function () { + flag(this, 'any', true); + flag(this, 'all', false); + }); + + /** + * ### .all + * + * Causes all `.keys` assertions that follow in the chain to require that the + * target have all of the given keys. This is the opposite of `.any`, which + * only requires that the target have at least one of the given keys. + * + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * + * Note that `.all` is used by default when neither `.all` nor `.any` are + * added earlier in the chain. However, it's often best to add `.all` anyway + * because it improves readability. + * + * See the `.keys` doc for guidance on when to use `.any` or `.all`. + * + * @name all + * @namespace BDD + * @api public + */ + + Assertion.addProperty('all', function () { + flag(this, 'all', true); + flag(this, 'any', false); + }); + + /** + * ### .a(type[, msg]) + * + * Asserts that the target's type is equal to the given string `type`. Types + * are case insensitive. See the `type-detect` project page for info on the + * type detection algorithm: https://github.com/chaijs/type-detect. + * + * expect('foo').to.be.a('string'); + * expect({a: 1}).to.be.an('object'); + * expect(null).to.be.a('null'); + * expect(undefined).to.be.an('undefined'); + * expect(new Error).to.be.an('error'); + * expect(Promise.resolve()).to.be.a('promise'); + * expect(new Float32Array).to.be.a('float32array'); + * expect(Symbol()).to.be.a('symbol'); + * + * `.a` supports objects that have a custom type set via `Symbol.toStringTag`. + * + * var myObj = { + * [Symbol.toStringTag]: 'myCustomType' + * }; + * + * expect(myObj).to.be.a('myCustomType').but.not.an('object'); + * + * It's often best to use `.a` to check a target's type before making more + * assertions on the same target. That way, you avoid unexpected behavior from + * any assertion that does different things based on the target's type. + * + * expect([1, 2, 3]).to.be.an('array').that.includes(2); + * expect([]).to.be.an('array').that.is.empty; + * + * Add `.not` earlier in the chain to negate `.a`. However, it's often best to + * assert that the target is the expected type, rather than asserting that it + * isn't one of many unexpected types. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.an('array'); // Not recommended + * + * `.a` accepts an optional `msg` argument which is a custom error message to + * show when the assertion fails. The message can also be given as the second + * argument to `expect`. + * + * expect(1).to.be.a('string', 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.a('string'); + * + * `.a` can also be used as a language chain to improve the readability of + * your assertions. + * + * expect({b: 2}).to.have.a.property('b'); + * + * The alias `.an` can be used interchangeably with `.a`. + * + * @name a + * @alias an + * @param {String} type + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function an (type, msg) { + if (msg) flag(this, 'message', msg); + type = type.toLowerCase(); + var obj = flag(this, 'object') + , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a '; + + this.assert( + type === _.type(obj).toLowerCase() + , 'expected #{this} to be ' + article + type + , 'expected #{this} not to be ' + article + type + ); + } + + Assertion.addChainableMethod('an', an); + Assertion.addChainableMethod('a', an); + + /** + * ### .include(val[, msg]) + * + * When the target is a string, `.include` asserts that the given string `val` + * is a substring of the target. + * + * expect('foobar').to.include('foo'); + * + * When the target is an array, `.include` asserts that the given `val` is a + * member of the target. + * + * expect([1, 2, 3]).to.include(2); + * + * When the target is an object, `.include` asserts that the given object + * `val`'s properties are a subset of the target's properties. + * + * expect({a: 1, b: 2, c: 3}).to.include({a: 1, b: 2}); + * + * When the target is a Set or WeakSet, `.include` asserts that the given `val` is a + * member of the target. SameValueZero equality algorithm is used. + * + * expect(new Set([1, 2])).to.include(2); + * + * When the target is a Map, `.include` asserts that the given `val` is one of + * the values of the target. SameValueZero equality algorithm is used. + * + * expect(new Map([['a', 1], ['b', 2]])).to.include(2); + * + * Because `.include` does different things based on the target's type, it's + * important to check the target's type before using `.include`. See the `.a` + * doc for info on testing a target's type. + * + * expect([1, 2, 3]).to.be.an('array').that.includes(2); + * + * By default, strict (`===`) equality is used to compare array members and + * object properties. Add `.deep` earlier in the chain to use deep equality + * instead (WeakSet targets are not supported). See the `deep-eql` project + * page for info on the deep equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target array deeply (but not strictly) includes `{a: 1}` + * expect([{a: 1}]).to.deep.include({a: 1}); + * expect([{a: 1}]).to.not.include({a: 1}); + * + * // Target object deeply (but not strictly) includes `x: {a: 1}` + * expect({x: {a: 1}}).to.deep.include({x: {a: 1}}); + * expect({x: {a: 1}}).to.not.include({x: {a: 1}}); + * + * By default, all of the target's properties are searched when working with + * objects. This includes properties that are inherited and/or non-enumerable. + * Add `.own` earlier in the chain to exclude the target's inherited + * properties from the search. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.own.include({a: 1}); + * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2}); + * + * Note that a target object is always only searched for `val`'s own + * enumerable properties. + * + * `.deep` and `.own` can be combined. + * + * expect({a: {b: 2}}).to.deep.own.include({a: {b: 2}}); + * + * Add `.nested` earlier in the chain to enable dot- and bracket-notation when + * referencing nested properties. + * + * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'}); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 2}}).to.nested.include({'\\.a.\\[b\\]': 2}); + * + * `.deep` and `.nested` can be combined. + * + * expect({a: {b: [{c: 3}]}}).to.deep.nested.include({'a.b[0]': {c: 3}}); + * + * `.own` and `.nested` cannot be combined. + * + * Add `.not` earlier in the chain to negate `.include`. + * + * expect('foobar').to.not.include('taco'); + * expect([1, 2, 3]).to.not.include(4); + * + * However, it's dangerous to negate `.include` when the target is an object. + * The problem is that it creates uncertain expectations by asserting that the + * target object doesn't have all of `val`'s key/value pairs but may or may + * not have some of them. It's often best to identify the exact output that's + * expected, and then write an assertion that only accepts that exact output. + * + * When the target object isn't even expected to have `val`'s keys, it's + * often best to assert exactly that. + * + * expect({c: 3}).to.not.have.any.keys('a', 'b'); // Recommended + * expect({c: 3}).to.not.include({a: 1, b: 2}); // Not recommended + * + * When the target object is expected to have `val`'s keys, it's often best to + * assert that each of the properties has its expected value, rather than + * asserting that each property doesn't have one of many unexpected values. + * + * expect({a: 3, b: 4}).to.include({a: 3, b: 4}); // Recommended + * expect({a: 3, b: 4}).to.not.include({a: 1, b: 2}); // Not recommended + * + * `.include` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2, 3]).to.include(4, 'nooo why fail??'); + * expect([1, 2, 3], 'nooo why fail??').to.include(4); + * + * `.include` can also be used as a language chain, causing all `.members` and + * `.keys` assertions that follow in the chain to require the target to be a + * superset of the expected set, rather than an identical set. Note that + * `.members` ignores duplicates in the subset when `.include` is added. + * + * // Target object's keys are a superset of ['a', 'b'] but not identical + * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b'); + * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b'); + * + * // Target array is a superset of [1, 2] but not identical + * expect([1, 2, 3]).to.include.members([1, 2]); + * expect([1, 2, 3]).to.not.have.members([1, 2]); + * + * // Duplicates in the subset are ignored + * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]); + * + * Note that adding `.any` earlier in the chain causes the `.keys` assertion + * to ignore `.include`. + * + * // Both assertions are identical + * expect({a: 1}).to.include.any.keys('a', 'b'); + * expect({a: 1}).to.have.any.keys('a', 'b'); + * + * The aliases `.includes`, `.contain`, and `.contains` can be used + * interchangeably with `.include`. + * + * @name include + * @alias contain + * @alias includes + * @alias contains + * @param {Mixed} val + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function SameValueZero(a, b) { + return (_.isNaN(a) && _.isNaN(b)) || a === b; + } + + function includeChainingBehavior () { + flag(this, 'contains', true); + } + + function include (val, msg) { + if (msg) flag(this, 'message', msg); + + var obj = flag(this, 'object') + , objType = _.type(obj).toLowerCase() + , flagMsg = flag(this, 'message') + , negate = flag(this, 'negate') + , ssfi = flag(this, 'ssfi') + , isDeep = flag(this, 'deep') + , descriptor = isDeep ? 'deep ' : '' + , isEql = isDeep ? flag(this, 'eql') : SameValueZero; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + var included = false; + + switch (objType) { + case 'string': + included = obj.indexOf(val) !== -1; + break; + + case 'weakset': + if (isDeep) { + throw new AssertionError( + flagMsg + 'unable to use .deep.include with WeakSet', + undefined, + ssfi + ); + } + + included = obj.has(val); + break; + + case 'map': + obj.forEach(function (item) { + included = included || isEql(item, val); + }); + break; + + case 'set': + if (isDeep) { + obj.forEach(function (item) { + included = included || isEql(item, val); + }); + } else { + included = obj.has(val); + } + break; + + case 'array': + if (isDeep) { + included = obj.some(function (item) { + return isEql(item, val); + }) + } else { + included = obj.indexOf(val) !== -1; + } + break; + + default: + // This block is for asserting a subset of properties in an object. + // `_.expectTypes` isn't used here because `.include` should work with + // objects with a custom `@@toStringTag`. + if (val !== Object(val)) { + throw new AssertionError( + flagMsg + 'the given combination of arguments (' + + objType + ' and ' + + _.type(val).toLowerCase() + ')' + + ' is invalid for this assertion. ' + + 'You can use an array, a map, an object, a set, a string, ' + + 'or a weakset instead of a ' + + _.type(val).toLowerCase(), + undefined, + ssfi + ); + } + + var props = Object.keys(val) + , firstErr = null + , numErrs = 0; + + props.forEach(function (prop) { + var propAssertion = new Assertion(obj); + _.transferFlags(this, propAssertion, true); + flag(propAssertion, 'lockSsfi', true); + + if (!negate || props.length === 1) { + propAssertion.property(prop, val[prop]); + return; + } + + try { + propAssertion.property(prop, val[prop]); + } catch (err) { + if (!_.checkError.compatibleConstructor(err, AssertionError)) { + throw err; + } + if (firstErr === null) firstErr = err; + numErrs++; + } + }, this); + + // When validating .not.include with multiple properties, we only want + // to throw an assertion error if all of the properties are included, + // in which case we throw the first property assertion error that we + // encountered. + if (negate && props.length > 1 && numErrs === props.length) { + throw firstErr; + } + return; + } + + // Assert inclusion in collection or substring in a string. + this.assert( + included + , 'expected #{this} to ' + descriptor + 'include ' + _.inspect(val) + , 'expected #{this} to not ' + descriptor + 'include ' + _.inspect(val)); + } + + Assertion.addChainableMethod('include', include, includeChainingBehavior); + Assertion.addChainableMethod('contain', include, includeChainingBehavior); + Assertion.addChainableMethod('contains', include, includeChainingBehavior); + Assertion.addChainableMethod('includes', include, includeChainingBehavior); + + /** + * ### .ok + * + * Asserts that the target is a truthy value (considered `true` in boolean context). + * However, it's often best to assert that the target is strictly (`===`) or + * deeply equal to its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.ok; // Not recommended + * + * expect(true).to.be.true; // Recommended + * expect(true).to.be.ok; // Not recommended + * + * Add `.not` earlier in the chain to negate `.ok`. + * + * expect(0).to.equal(0); // Recommended + * expect(0).to.not.be.ok; // Not recommended + * + * expect(false).to.be.false; // Recommended + * expect(false).to.not.be.ok; // Not recommended + * + * expect(null).to.be.null; // Recommended + * expect(null).to.not.be.ok; // Not recommended + * + * expect(undefined).to.be.undefined; // Recommended + * expect(undefined).to.not.be.ok; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(false, 'nooo why fail??').to.be.ok; + * + * @name ok + * @namespace BDD + * @api public + */ + + Assertion.addProperty('ok', function () { + this.assert( + flag(this, 'object') + , 'expected #{this} to be truthy' + , 'expected #{this} to be falsy'); + }); + + /** + * ### .true + * + * Asserts that the target is strictly (`===`) equal to `true`. + * + * expect(true).to.be.true; + * + * Add `.not` earlier in the chain to negate `.true`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `true`. + * + * expect(false).to.be.false; // Recommended + * expect(false).to.not.be.true; // Not recommended + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.true; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(false, 'nooo why fail??').to.be.true; + * + * @name true + * @namespace BDD + * @api public + */ + + Assertion.addProperty('true', function () { + this.assert( + true === flag(this, 'object') + , 'expected #{this} to be true' + , 'expected #{this} to be false' + , flag(this, 'negate') ? false : true + ); + }); + + /** + * ### .false + * + * Asserts that the target is strictly (`===`) equal to `false`. + * + * expect(false).to.be.false; + * + * Add `.not` earlier in the chain to negate `.false`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to `false`. + * + * expect(true).to.be.true; // Recommended + * expect(true).to.not.be.false; // Not recommended + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.false; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(true, 'nooo why fail??').to.be.false; + * + * @name false + * @namespace BDD + * @api public + */ + + Assertion.addProperty('false', function () { + this.assert( + false === flag(this, 'object') + , 'expected #{this} to be false' + , 'expected #{this} to be true' + , flag(this, 'negate') ? true : false + ); + }); + + /** + * ### .null + * + * Asserts that the target is strictly (`===`) equal to `null`. + * + * expect(null).to.be.null; + * + * Add `.not` earlier in the chain to negate `.null`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `null`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.null; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.null; + * + * @name null + * @namespace BDD + * @api public + */ + + Assertion.addProperty('null', function () { + this.assert( + null === flag(this, 'object') + , 'expected #{this} to be null' + , 'expected #{this} not to be null' + ); + }); + + /** + * ### .undefined + * + * Asserts that the target is strictly (`===`) equal to `undefined`. + * + * expect(undefined).to.be.undefined; + * + * Add `.not` earlier in the chain to negate `.undefined`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to `undefined`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.undefined; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.undefined; + * + * @name undefined + * @namespace BDD + * @api public + */ + + Assertion.addProperty('undefined', function () { + this.assert( + undefined === flag(this, 'object') + , 'expected #{this} to be undefined' + , 'expected #{this} not to be undefined' + ); + }); + + /** + * ### .NaN + * + * Asserts that the target is exactly `NaN`. + * + * expect(NaN).to.be.NaN; + * + * Add `.not` earlier in the chain to negate `.NaN`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `NaN`. + * + * expect('foo').to.equal('foo'); // Recommended + * expect('foo').to.not.be.NaN; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.NaN; + * + * @name NaN + * @namespace BDD + * @api public + */ + + Assertion.addProperty('NaN', function () { + this.assert( + _.isNaN(flag(this, 'object')) + , 'expected #{this} to be NaN' + , 'expected #{this} not to be NaN' + ); + }); + + /** + * ### .exist + * + * Asserts that the target is not strictly (`===`) equal to either `null` or + * `undefined`. However, it's often best to assert that the target is equal to + * its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.exist; // Not recommended + * + * expect(0).to.equal(0); // Recommended + * expect(0).to.exist; // Not recommended + * + * Add `.not` earlier in the chain to negate `.exist`. + * + * expect(null).to.be.null; // Recommended + * expect(null).to.not.exist; // Not recommended + * + * expect(undefined).to.be.undefined; // Recommended + * expect(undefined).to.not.exist; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(null, 'nooo why fail??').to.exist; + * + * The alias `.exists` can be used interchangeably with `.exist`. + * + * @name exist + * @alias exists + * @namespace BDD + * @api public + */ + + function assertExist () { + var val = flag(this, 'object'); + this.assert( + val !== null && val !== undefined + , 'expected #{this} to exist' + , 'expected #{this} to not exist' + ); + } + + Assertion.addProperty('exist', assertExist); + Assertion.addProperty('exists', assertExist); + + /** + * ### .empty + * + * When the target is a string or array, `.empty` asserts that the target's + * `length` property is strictly (`===`) equal to `0`. + * + * expect([]).to.be.empty; + * expect('').to.be.empty; + * + * When the target is a map or set, `.empty` asserts that the target's `size` + * property is strictly equal to `0`. + * + * expect(new Set()).to.be.empty; + * expect(new Map()).to.be.empty; + * + * When the target is a non-function object, `.empty` asserts that the target + * doesn't have any own enumerable properties. Properties with Symbol-based + * keys are excluded from the count. + * + * expect({}).to.be.empty; + * + * Because `.empty` does different things based on the target's type, it's + * important to check the target's type before using `.empty`. See the `.a` + * doc for info on testing a target's type. + * + * expect([]).to.be.an('array').that.is.empty; + * + * Add `.not` earlier in the chain to negate `.empty`. However, it's often + * best to assert that the target contains its expected number of values, + * rather than asserting that it's not empty. + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.not.be.empty; // Not recommended + * + * expect(new Set([1, 2, 3])).to.have.property('size', 3); // Recommended + * expect(new Set([1, 2, 3])).to.not.be.empty; // Not recommended + * + * expect(Object.keys({a: 1})).to.have.lengthOf(1); // Recommended + * expect({a: 1}).to.not.be.empty; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect([1, 2, 3], 'nooo why fail??').to.be.empty; + * + * @name empty + * @namespace BDD + * @api public + */ + + Assertion.addProperty('empty', function () { + var val = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , flagMsg = flag(this, 'message') + , itemsCount; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + switch (_.type(val).toLowerCase()) { + case 'array': + case 'string': + itemsCount = val.length; + break; + case 'map': + case 'set': + itemsCount = val.size; + break; + case 'weakmap': + case 'weakset': + throw new AssertionError( + flagMsg + '.empty was passed a weak collection', + undefined, + ssfi + ); + case 'function': + var msg = flagMsg + '.empty was passed a function ' + _.getName(val); + throw new AssertionError(msg.trim(), undefined, ssfi); + default: + if (val !== Object(val)) { + throw new AssertionError( + flagMsg + '.empty was passed non-string primitive ' + _.inspect(val), + undefined, + ssfi + ); + } + itemsCount = Object.keys(val).length; + } + + this.assert( + 0 === itemsCount + , 'expected #{this} to be empty' + , 'expected #{this} not to be empty' + ); + }); + + /** + * ### .arguments + * + * Asserts that the target is an `arguments` object. + * + * function test () { + * expect(arguments).to.be.arguments; + * } + * + * test(); + * + * Add `.not` earlier in the chain to negate `.arguments`. However, it's often + * best to assert which type the target is expected to be, rather than + * asserting that it’s not an `arguments` object. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.arguments; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({}, 'nooo why fail??').to.be.arguments; + * + * The alias `.Arguments` can be used interchangeably with `.arguments`. + * + * @name arguments + * @alias Arguments + * @namespace BDD + * @api public + */ + + function checkArguments () { + var obj = flag(this, 'object') + , type = _.type(obj); + this.assert( + 'Arguments' === type + , 'expected #{this} to be arguments but got ' + type + , 'expected #{this} to not be arguments' + ); + } + + Assertion.addProperty('arguments', checkArguments); + Assertion.addProperty('Arguments', checkArguments); + + /** + * ### .equal(val[, msg]) + * + * Asserts that the target is strictly (`===`) equal to the given `val`. + * + * expect(1).to.equal(1); + * expect('foo').to.equal('foo'); + * + * Add `.deep` earlier in the chain to use deep equality instead. See the + * `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) equals `{a: 1}` + * expect({a: 1}).to.deep.equal({a: 1}); + * expect({a: 1}).to.not.equal({a: 1}); + * + * // Target array deeply (but not strictly) equals `[1, 2]` + * expect([1, 2]).to.deep.equal([1, 2]); + * expect([1, 2]).to.not.equal([1, 2]); + * + * Add `.not` earlier in the chain to negate `.equal`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to one of countless unexpected values. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.equal(2); // Not recommended + * + * `.equal` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.equal(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.equal(2); + * + * The aliases `.equals` and `eq` can be used interchangeably with `.equal`. + * + * @name equal + * @alias equals + * @alias eq + * @param {Mixed} val + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertEqual (val, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + if (flag(this, 'deep')) { + var prevLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + this.eql(val); + flag(this, 'lockSsfi', prevLockSsfi); + } else { + this.assert( + val === obj + , 'expected #{this} to equal #{exp}' + , 'expected #{this} to not equal #{exp}' + , val + , this._obj + , true + ); + } + } + + Assertion.addMethod('equal', assertEqual); + Assertion.addMethod('equals', assertEqual); + Assertion.addMethod('eq', assertEqual); + + /** + * ### .eql(obj[, msg]) + * + * Asserts that the target is deeply equal to the given `obj`. See the + * `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target object is deeply (but not strictly) equal to {a: 1} + * expect({a: 1}).to.eql({a: 1}).but.not.equal({a: 1}); + * + * // Target array is deeply (but not strictly) equal to [1, 2] + * expect([1, 2]).to.eql([1, 2]).but.not.equal([1, 2]); + * + * Add `.not` earlier in the chain to negate `.eql`. However, it's often best + * to assert that the target is deeply equal to its expected value, rather + * than not deeply equal to one of countless unexpected values. + * + * expect({a: 1}).to.eql({a: 1}); // Recommended + * expect({a: 1}).to.not.eql({b: 2}); // Not recommended + * + * `.eql` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect({a: 1}).to.eql({b: 2}, 'nooo why fail??'); + * expect({a: 1}, 'nooo why fail??').to.eql({b: 2}); + * + * The alias `.eqls` can be used interchangeably with `.eql`. + * + * The `.deep.equal` assertion is almost identical to `.eql` but with one + * difference: `.deep.equal` causes deep equality comparisons to also be used + * for any other assertions that follow in the chain. + * + * @name eql + * @alias eqls + * @param {Mixed} obj + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertEql(obj, msg) { + if (msg) flag(this, 'message', msg); + var eql = flag(this, 'eql'); + this.assert( + eql(obj, flag(this, 'object')) + , 'expected #{this} to deeply equal #{exp}' + , 'expected #{this} to not deeply equal #{exp}' + , obj + , this._obj + , true + ); + } + + Assertion.addMethod('eql', assertEql); + Assertion.addMethod('eqls', assertEql); + + /** + * ### .above(n[, msg]) + * + * Asserts that the target is a number or a date greater than the given number or date `n` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.above(1); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.above(2); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.above(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.above`. + * + * expect(2).to.equal(2); // Recommended + * expect(1).to.not.be.above(2); // Not recommended + * + * `.above` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.above(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.above(2); + * + * The aliases `.gt` and `.greaterThan` can be used interchangeably with + * `.above`. + * + * @name above + * @alias gt + * @alias greaterThan + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertAbove (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to above must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to above must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount > n + , 'expected #{this} to have a ' + descriptor + ' above #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' above #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj > n + , 'expected #{this} to be above #{exp}' + , 'expected #{this} to be at most #{exp}' + , n + ); + } + } + + Assertion.addMethod('above', assertAbove); + Assertion.addMethod('gt', assertAbove); + Assertion.addMethod('greaterThan', assertAbove); + + /** + * ### .least(n[, msg]) + * + * Asserts that the target is a number or a date greater than or equal to the given + * number or date `n` respectively. However, it's often best to assert that the target is equal to + * its expected value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.at.least(1); // Not recommended + * expect(2).to.be.at.least(2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than or equal to the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.at.least(2); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.at.least(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.least`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.at.least(2); // Not recommended + * + * `.least` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.at.least(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.at.least(2); + * + * The aliases `.gte` and `.greaterThanOrEqual` can be used interchangeably with + * `.least`. + * + * @name least + * @alias gte + * @alias greaterThanOrEqual + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertLeast (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to least must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to least must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount >= n + , 'expected #{this} to have a ' + descriptor + ' at least #{exp} but got #{act}' + , 'expected #{this} to have a ' + descriptor + ' below #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj >= n + , 'expected #{this} to be at least #{exp}' + , 'expected #{this} to be below #{exp}' + , n + ); + } + } + + Assertion.addMethod('least', assertLeast); + Assertion.addMethod('gte', assertLeast); + Assertion.addMethod('greaterThanOrEqual', assertLeast); + + /** + * ### .below(n[, msg]) + * + * Asserts that the target is a number or a date less than the given number or date `n` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.below(2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is less than the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.below(4); // Not recommended + * + * expect([1, 2, 3]).to.have.length(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.below(4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.below`. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.be.below(1); // Not recommended + * + * `.below` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(2).to.be.below(1, 'nooo why fail??'); + * expect(2, 'nooo why fail??').to.be.below(1); + * + * The aliases `.lt` and `.lessThan` can be used interchangeably with + * `.below`. + * + * @name below + * @alias lt + * @alias lessThan + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertBelow (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to below must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to below must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount < n + , 'expected #{this} to have a ' + descriptor + ' below #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' below #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj < n + , 'expected #{this} to be below #{exp}' + , 'expected #{this} to be at least #{exp}' + , n + ); + } + } + + Assertion.addMethod('below', assertBelow); + Assertion.addMethod('lt', assertBelow); + Assertion.addMethod('lessThan', assertBelow); + + /** + * ### .most(n[, msg]) + * + * Asserts that the target is a number or a date less than or equal to the given number + * or date `n` respectively. However, it's often best to assert that the target is equal to its + * expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.at.most(2); // Not recommended + * expect(1).to.be.at.most(1); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is less than or equal to the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.at.most(4); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.at.most(4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.most`. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.be.at.most(1); // Not recommended + * + * `.most` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(2).to.be.at.most(1, 'nooo why fail??'); + * expect(2, 'nooo why fail??').to.be.at.most(1); + * + * The aliases `.lte` and `.lessThanOrEqual` can be used interchangeably with + * `.most`. + * + * @name most + * @alias lte + * @alias lessThanOrEqual + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertMost (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to most must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to most must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount <= n + , 'expected #{this} to have a ' + descriptor + ' at most #{exp} but got #{act}' + , 'expected #{this} to have a ' + descriptor + ' above #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj <= n + , 'expected #{this} to be at most #{exp}' + , 'expected #{this} to be above #{exp}' + , n + ); + } + } + + Assertion.addMethod('most', assertMost); + Assertion.addMethod('lte', assertMost); + Assertion.addMethod('lessThanOrEqual', assertMost); + + /** + * ### .within(start, finish[, msg]) + * + * Asserts that the target is a number or a date greater than or equal to the given + * number or date `start`, and less than or equal to the given number or date `finish` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.within(1, 3); // Not recommended + * expect(2).to.be.within(2, 3); // Not recommended + * expect(2).to.be.within(1, 2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than or equal to the given number `start`, and less + * than or equal to the given number `finish`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.within(2, 4); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.within(2, 4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.within`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.within(2, 4); // Not recommended + * + * `.within` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(4).to.be.within(1, 3, 'nooo why fail??'); + * expect(4, 'nooo why fail??').to.be.within(1, 3); + * + * @name within + * @param {Number} start lower bound inclusive + * @param {Number} finish upper bound inclusive + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('within', function (start, finish, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , startType = _.type(start).toLowerCase() + , finishType = _.type(finish).toLowerCase() + , errorMessage + , shouldThrow = true + , range = (startType === 'date' && finishType === 'date') + ? start.toISOString() + '..' + finish.toISOString() + : start + '..' + finish; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) { + errorMessage = msgPrefix + 'the arguments to within must be dates'; + } else if ((startType !== 'number' || finishType !== 'number') && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the arguments to within must be numbers'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount >= start && itemsCount <= finish + , 'expected #{this} to have a ' + descriptor + ' within ' + range + , 'expected #{this} to not have a ' + descriptor + ' within ' + range + ); + } else { + this.assert( + obj >= start && obj <= finish + , 'expected #{this} to be within ' + range + , 'expected #{this} to not be within ' + range + ); + } + }); + + /** + * ### .instanceof(constructor[, msg]) + * + * Asserts that the target is an instance of the given `constructor`. + * + * function Cat () { } + * + * expect(new Cat()).to.be.an.instanceof(Cat); + * expect([1, 2]).to.be.an.instanceof(Array); + * + * Add `.not` earlier in the chain to negate `.instanceof`. + * + * expect({a: 1}).to.not.be.an.instanceof(Array); + * + * `.instanceof` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1).to.be.an.instanceof(Array, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.an.instanceof(Array); + * + * Due to limitations in ES5, `.instanceof` may not always work as expected + * when using a transpiler such as Babel or TypeScript. In particular, it may + * produce unexpected results when subclassing built-in object such as + * `Array`, `Error`, and `Map`. See your transpiler's docs for details: + * + * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes)) + * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work)) + * + * The alias `.instanceOf` can be used interchangeably with `.instanceof`. + * + * @name instanceof + * @param {Constructor} constructor + * @param {String} msg _optional_ + * @alias instanceOf + * @namespace BDD + * @api public + */ + + function assertInstanceOf (constructor, msg) { + if (msg) flag(this, 'message', msg); + + var target = flag(this, 'object') + var ssfi = flag(this, 'ssfi'); + var flagMsg = flag(this, 'message'); + + try { + var isInstanceOf = target instanceof constructor; + } catch (err) { + if (err instanceof TypeError) { + flagMsg = flagMsg ? flagMsg + ': ' : ''; + throw new AssertionError( + flagMsg + 'The instanceof assertion needs a constructor but ' + + _.type(constructor) + ' was given.', + undefined, + ssfi + ); + } + throw err; + } + + var name = _.getName(constructor); + if (name === null) { + name = 'an unnamed constructor'; + } + + this.assert( + isInstanceOf + , 'expected #{this} to be an instance of ' + name + , 'expected #{this} to not be an instance of ' + name + ); + }; + + Assertion.addMethod('instanceof', assertInstanceOf); + Assertion.addMethod('instanceOf', assertInstanceOf); + + /** + * ### .property(name[, val[, msg]]) + * + * Asserts that the target has a property with the given key `name`. + * + * expect({a: 1}).to.have.property('a'); + * + * When `val` is provided, `.property` also asserts that the property's value + * is equal to the given `val`. + * + * expect({a: 1}).to.have.property('a', 1); + * + * By default, strict (`===`) equality is used. Add `.deep` earlier in the + * chain to use deep equality instead. See the `deep-eql` project page for + * info on the deep equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) has property `x: {a: 1}` + * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1}); + * expect({x: {a: 1}}).to.not.have.property('x', {a: 1}); + * + * The target's enumerable and non-enumerable properties are always included + * in the search. By default, both own and inherited properties are included. + * Add `.own` earlier in the chain to exclude inherited properties from the + * search. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.have.own.property('a'); + * expect({a: 1}).to.have.own.property('a', 1); + * expect({a: 1}).to.have.property('b'); + * expect({a: 1}).to.not.have.own.property('b'); + * + * `.deep` and `.own` can be combined. + * + * expect({x: {a: 1}}).to.have.deep.own.property('x', {a: 1}); + * + * Add `.nested` earlier in the chain to enable dot- and bracket-notation when + * referencing nested properties. + * + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]'); + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]', 'y'); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]'); + * + * `.deep` and `.nested` can be combined. + * + * expect({a: {b: [{c: 3}]}}) + * .to.have.deep.nested.property('a.b[0]', {c: 3}); + * + * `.own` and `.nested` cannot be combined. + * + * Add `.not` earlier in the chain to negate `.property`. + * + * expect({a: 1}).to.not.have.property('b'); + * + * However, it's dangerous to negate `.property` when providing `val`. The + * problem is that it creates uncertain expectations by asserting that the + * target either doesn't have a property with the given key `name`, or that it + * does have a property with the given key `name` but its value isn't equal to + * the given `val`. It's often best to identify the exact output that's + * expected, and then write an assertion that only accepts that exact output. + * + * When the target isn't expected to have a property with the given key + * `name`, it's often best to assert exactly that. + * + * expect({b: 2}).to.not.have.property('a'); // Recommended + * expect({b: 2}).to.not.have.property('a', 1); // Not recommended + * + * When the target is expected to have a property with the given key `name`, + * it's often best to assert that the property has its expected value, rather + * than asserting that it doesn't have one of many unexpected values. + * + * expect({a: 3}).to.have.property('a', 3); // Recommended + * expect({a: 3}).to.not.have.property('a', 1); // Not recommended + * + * `.property` changes the target of any assertions that follow in the chain + * to be the value of the property from the original target object. + * + * expect({a: 1}).to.have.property('a').that.is.a('number'); + * + * `.property` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing `val`, only use the + * second form. + * + * // Recommended + * expect({a: 1}).to.have.property('a', 2, 'nooo why fail??'); + * expect({a: 1}, 'nooo why fail??').to.have.property('a', 2); + * expect({a: 1}, 'nooo why fail??').to.have.property('b'); + * + * // Not recommended + * expect({a: 1}).to.have.property('b', undefined, 'nooo why fail??'); + * + * The above assertion isn't the same thing as not providing `val`. Instead, + * it's asserting that the target object has a `b` property that's equal to + * `undefined`. + * + * The assertions `.ownProperty` and `.haveOwnProperty` can be used + * interchangeably with `.own.property`. + * + * @name property + * @param {String} name + * @param {Mixed} val (optional) + * @param {String} msg _optional_ + * @returns value of property for chaining + * @namespace BDD + * @api public + */ + + function assertProperty (name, val, msg) { + if (msg) flag(this, 'message', msg); + + var isNested = flag(this, 'nested') + , isOwn = flag(this, 'own') + , flagMsg = flag(this, 'message') + , obj = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , nameType = typeof name; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + if (isNested) { + if (nameType !== 'string') { + throw new AssertionError( + flagMsg + 'the argument to property must be a string when using nested syntax', + undefined, + ssfi + ); + } + } else { + if (nameType !== 'string' && nameType !== 'number' && nameType !== 'symbol') { + throw new AssertionError( + flagMsg + 'the argument to property must be a string, number, or symbol', + undefined, + ssfi + ); + } + } + + if (isNested && isOwn) { + throw new AssertionError( + flagMsg + 'The "nested" and "own" flags cannot be combined.', + undefined, + ssfi + ); + } + + if (obj === null || obj === undefined) { + throw new AssertionError( + flagMsg + 'Target cannot be null or undefined.', + undefined, + ssfi + ); + } + + var isDeep = flag(this, 'deep') + , negate = flag(this, 'negate') + , pathInfo = isNested ? _.getPathInfo(obj, name) : null + , value = isNested ? pathInfo.value : obj[name] + , isEql = isDeep ? flag(this, 'eql') : (val1, val2) => val1 === val2;; + + var descriptor = ''; + if (isDeep) descriptor += 'deep '; + if (isOwn) descriptor += 'own '; + if (isNested) descriptor += 'nested '; + descriptor += 'property '; + + var hasProperty; + if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name); + else if (isNested) hasProperty = pathInfo.exists; + else hasProperty = _.hasProperty(obj, name); + + // When performing a negated assertion for both name and val, merely having + // a property with the given name isn't enough to cause the assertion to + // fail. It must both have a property with the given name, and the value of + // that property must equal the given val. Therefore, skip this assertion in + // favor of the next. + if (!negate || arguments.length === 1) { + this.assert( + hasProperty + , 'expected #{this} to have ' + descriptor + _.inspect(name) + , 'expected #{this} to not have ' + descriptor + _.inspect(name)); + } + + if (arguments.length > 1) { + this.assert( + hasProperty && isEql(val, value) + , 'expected #{this} to have ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}' + , 'expected #{this} to not have ' + descriptor + _.inspect(name) + ' of #{act}' + , val + , value + ); + } + + flag(this, 'object', value); + } + + Assertion.addMethod('property', assertProperty); + + function assertOwnProperty (name, value, msg) { + flag(this, 'own', true); + assertProperty.apply(this, arguments); + } + + Assertion.addMethod('ownProperty', assertOwnProperty); + Assertion.addMethod('haveOwnProperty', assertOwnProperty); + + /** + * ### .ownPropertyDescriptor(name[, descriptor[, msg]]) + * + * Asserts that the target has its own property descriptor with the given key + * `name`. Enumerable and non-enumerable properties are included in the + * search. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a'); + * + * When `descriptor` is provided, `.ownPropertyDescriptor` also asserts that + * the property's descriptor is deeply equal to the given `descriptor`. See + * the `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * Add `.not` earlier in the chain to negate `.ownPropertyDescriptor`. + * + * expect({a: 1}).to.not.have.ownPropertyDescriptor('b'); + * + * However, it's dangerous to negate `.ownPropertyDescriptor` when providing + * a `descriptor`. The problem is that it creates uncertain expectations by + * asserting that the target either doesn't have a property descriptor with + * the given key `name`, or that it does have a property descriptor with the + * given key `name` but it’s not deeply equal to the given `descriptor`. It's + * often best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to have a property descriptor with the given + * key `name`, it's often best to assert exactly that. + * + * // Recommended + * expect({b: 2}).to.not.have.ownPropertyDescriptor('a'); + * + * // Not recommended + * expect({b: 2}).to.not.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * When the target is expected to have a property descriptor with the given + * key `name`, it's often best to assert that the property has its expected + * descriptor, rather than asserting that it doesn't have one of many + * unexpected descriptors. + * + * // Recommended + * expect({a: 3}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 3, + * }); + * + * // Not recommended + * expect({a: 3}).to.not.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * `.ownPropertyDescriptor` changes the target of any assertions that follow + * in the chain to be the value of the property descriptor from the original + * target object. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a') + * .that.has.property('enumerable', true); + * + * `.ownPropertyDescriptor` accepts an optional `msg` argument which is a + * custom error message to show when the assertion fails. The message can also + * be given as the second argument to `expect`. When not providing + * `descriptor`, only use the second form. + * + * // Recommended + * expect({a: 1}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 2, + * }, 'nooo why fail??'); + * + * // Recommended + * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 2, + * }); + * + * // Recommended + * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('b'); + * + * // Not recommended + * expect({a: 1}) + * .to.have.ownPropertyDescriptor('b', undefined, 'nooo why fail??'); + * + * The above assertion isn't the same thing as not providing `descriptor`. + * Instead, it's asserting that the target object has a `b` property + * descriptor that's deeply equal to `undefined`. + * + * The alias `.haveOwnPropertyDescriptor` can be used interchangeably with + * `.ownPropertyDescriptor`. + * + * @name ownPropertyDescriptor + * @alias haveOwnPropertyDescriptor + * @param {String} name + * @param {Object} descriptor _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertOwnPropertyDescriptor (name, descriptor, msg) { + if (typeof descriptor === 'string') { + msg = descriptor; + descriptor = null; + } + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name); + var eql = flag(this, 'eql'); + if (actualDescriptor && descriptor) { + this.assert( + eql(descriptor, actualDescriptor) + , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor) + , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor) + , descriptor + , actualDescriptor + , true + ); + } else { + this.assert( + actualDescriptor + , 'expected #{this} to have an own property descriptor for ' + _.inspect(name) + , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name) + ); + } + flag(this, 'object', actualDescriptor); + } + + Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor); + Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor); + + /** + * ### .lengthOf(n[, msg]) + * + * Asserts that the target's `length` or `size` is equal to the given number + * `n`. + * + * expect([1, 2, 3]).to.have.lengthOf(3); + * expect('foo').to.have.lengthOf(3); + * expect(new Set([1, 2, 3])).to.have.lengthOf(3); + * expect(new Map([['a', 1], ['b', 2], ['c', 3]])).to.have.lengthOf(3); + * + * Add `.not` earlier in the chain to negate `.lengthOf`. However, it's often + * best to assert that the target's `length` property is equal to its expected + * value, rather than not equal to one of many unexpected values. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.not.have.lengthOf(4); // Not recommended + * + * `.lengthOf` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2, 3]).to.have.lengthOf(2, 'nooo why fail??'); + * expect([1, 2, 3], 'nooo why fail??').to.have.lengthOf(2); + * + * `.lengthOf` can also be used as a language chain, causing all `.above`, + * `.below`, `.least`, `.most`, and `.within` assertions that follow in the + * chain to use the target's `length` property as the target. However, it's + * often best to assert that the target's `length` property is equal to its + * expected length, rather than asserting that its `length` property falls + * within some range of values. + * + * // Recommended + * expect([1, 2, 3]).to.have.lengthOf(3); + * + * // Not recommended + * expect([1, 2, 3]).to.have.lengthOf.above(2); + * expect([1, 2, 3]).to.have.lengthOf.below(4); + * expect([1, 2, 3]).to.have.lengthOf.at.least(3); + * expect([1, 2, 3]).to.have.lengthOf.at.most(3); + * expect([1, 2, 3]).to.have.lengthOf.within(2,4); + * + * Due to a compatibility issue, the alias `.length` can't be chained directly + * off of an uninvoked method such as `.a`. Therefore, `.length` can't be used + * interchangeably with `.lengthOf` in every situation. It's recommended to + * always use `.lengthOf` instead of `.length`. + * + * expect([1, 2, 3]).to.have.a.length(3); // incompatible; throws error + * expect([1, 2, 3]).to.have.a.lengthOf(3); // passes as expected + * + * @name lengthOf + * @alias length + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertLengthChain () { + flag(this, 'doLength', true); + } + + function assertLength (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , objType = _.type(obj).toLowerCase() + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi') + , descriptor = 'length' + , itemsCount; + + switch (objType) { + case 'map': + case 'set': + descriptor = 'size'; + itemsCount = obj.size; + break; + default: + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + itemsCount = obj.length; + } + + this.assert( + itemsCount == n + , 'expected #{this} to have a ' + descriptor + ' of #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' of #{act}' + , n + , itemsCount + ); + } + + Assertion.addChainableMethod('length', assertLength, assertLengthChain); + Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain); + + /** + * ### .match(re[, msg]) + * + * Asserts that the target matches the given regular expression `re`. + * + * expect('foobar').to.match(/^foo/); + * + * Add `.not` earlier in the chain to negate `.match`. + * + * expect('foobar').to.not.match(/taco/); + * + * `.match` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect('foobar').to.match(/taco/, 'nooo why fail??'); + * expect('foobar', 'nooo why fail??').to.match(/taco/); + * + * The alias `.matches` can be used interchangeably with `.match`. + * + * @name match + * @alias matches + * @param {RegExp} re + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + function assertMatch(re, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + this.assert( + re.exec(obj) + , 'expected #{this} to match ' + re + , 'expected #{this} not to match ' + re + ); + } + + Assertion.addMethod('match', assertMatch); + Assertion.addMethod('matches', assertMatch); + + /** + * ### .string(str[, msg]) + * + * Asserts that the target string contains the given substring `str`. + * + * expect('foobar').to.have.string('bar'); + * + * Add `.not` earlier in the chain to negate `.string`. + * + * expect('foobar').to.not.have.string('taco'); + * + * `.string` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect('foobar').to.have.string('taco', 'nooo why fail??'); + * expect('foobar', 'nooo why fail??').to.have.string('taco'); + * + * @name string + * @param {String} str + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('string', function (str, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(obj, flagMsg, ssfi, true).is.a('string'); + + this.assert( + ~obj.indexOf(str) + , 'expected #{this} to contain ' + _.inspect(str) + , 'expected #{this} to not contain ' + _.inspect(str) + ); + }); + + /** + * ### .keys(key1[, key2[, ...]]) + * + * Asserts that the target object, array, map, or set has the given keys. Only + * the target's own inherited properties are included in the search. + * + * When the target is an object or array, keys can be provided as one or more + * string arguments, a single array argument, or a single object argument. In + * the latter case, only the keys in the given object matter; the values are + * ignored. + * + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * expect(['x', 'y']).to.have.all.keys(0, 1); + * + * expect({a: 1, b: 2}).to.have.all.keys(['a', 'b']); + * expect(['x', 'y']).to.have.all.keys([0, 1]); + * + * expect({a: 1, b: 2}).to.have.all.keys({a: 4, b: 5}); // ignore 4 and 5 + * expect(['x', 'y']).to.have.all.keys({0: 4, 1: 5}); // ignore 4 and 5 + * + * When the target is a map or set, each key must be provided as a separate + * argument. + * + * expect(new Map([['a', 1], ['b', 2]])).to.have.all.keys('a', 'b'); + * expect(new Set(['a', 'b'])).to.have.all.keys('a', 'b'); + * + * Because `.keys` does different things based on the target's type, it's + * important to check the target's type before using `.keys`. See the `.a` doc + * for info on testing a target's type. + * + * expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b'); + * + * By default, strict (`===`) equality is used to compare keys of maps and + * sets. Add `.deep` earlier in the chain to use deep equality instead. See + * the `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target set deeply (but not strictly) has key `{a: 1}` + * expect(new Set([{a: 1}])).to.have.all.deep.keys([{a: 1}]); + * expect(new Set([{a: 1}])).to.not.have.all.keys([{a: 1}]); + * + * By default, the target must have all of the given keys and no more. Add + * `.any` earlier in the chain to only require that the target have at least + * one of the given keys. Also, add `.not` earlier in the chain to negate + * `.keys`. It's often best to add `.any` when negating `.keys`, and to use + * `.all` when asserting `.keys` without negation. + * + * When negating `.keys`, `.any` is preferred because `.not.any.keys` asserts + * exactly what's expected of the output, whereas `.not.all.keys` creates + * uncertain expectations. + * + * // Recommended; asserts that target doesn't have any of the given keys + * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd'); + * + * // Not recommended; asserts that target doesn't have all of the given + * // keys but may or may not have some of them + * expect({a: 1, b: 2}).to.not.have.all.keys('c', 'd'); + * + * When asserting `.keys` without negation, `.all` is preferred because + * `.all.keys` asserts exactly what's expected of the output, whereas + * `.any.keys` creates uncertain expectations. + * + * // Recommended; asserts that target has all the given keys + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * + * // Not recommended; asserts that target has at least one of the given + * // keys but may or may not have more of them + * expect({a: 1, b: 2}).to.have.any.keys('a', 'b'); + * + * Note that `.all` is used by default when neither `.all` nor `.any` appear + * earlier in the chain. However, it's often best to add `.all` anyway because + * it improves readability. + * + * // Both assertions are identical + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); // Recommended + * expect({a: 1, b: 2}).to.have.keys('a', 'b'); // Not recommended + * + * Add `.include` earlier in the chain to require that the target's keys be a + * superset of the expected keys, rather than identical sets. + * + * // Target object's keys are a superset of ['a', 'b'] but not identical + * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b'); + * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b'); + * + * However, if `.any` and `.include` are combined, only the `.any` takes + * effect. The `.include` is ignored in this case. + * + * // Both assertions are identical + * expect({a: 1}).to.have.any.keys('a', 'b'); + * expect({a: 1}).to.include.any.keys('a', 'b'); + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.have.key('b'); + * + * The alias `.key` can be used interchangeably with `.keys`. + * + * @name keys + * @alias key + * @param {...String|Array|Object} keys + * @namespace BDD + * @api public + */ + + function assertKeys (keys) { + var obj = flag(this, 'object') + , objType = _.type(obj) + , keysType = _.type(keys) + , ssfi = flag(this, 'ssfi') + , isDeep = flag(this, 'deep') + , str + , deepStr = '' + , actual + , ok = true + , flagMsg = flag(this, 'message'); + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments'; + + if (objType === 'Map' || objType === 'Set') { + deepStr = isDeep ? 'deeply ' : ''; + actual = []; + + // Map and Set '.keys' aren't supported in IE 11. Therefore, use .forEach. + obj.forEach(function (val, key) { actual.push(key) }); + + if (keysType !== 'Array') { + keys = Array.prototype.slice.call(arguments); + } + } else { + actual = _.getOwnEnumerableProperties(obj); + + switch (keysType) { + case 'Array': + if (arguments.length > 1) { + throw new AssertionError(mixedArgsMsg, undefined, ssfi); + } + break; + case 'Object': + if (arguments.length > 1) { + throw new AssertionError(mixedArgsMsg, undefined, ssfi); + } + keys = Object.keys(keys); + break; + default: + keys = Array.prototype.slice.call(arguments); + } + + // Only stringify non-Symbols because Symbols would become "Symbol()" + keys = keys.map(function (val) { + return typeof val === 'symbol' ? val : String(val); + }); + } + + if (!keys.length) { + throw new AssertionError(flagMsg + 'keys required', undefined, ssfi); + } + + var len = keys.length + , any = flag(this, 'any') + , all = flag(this, 'all') + , expected = keys + , isEql = isDeep ? flag(this, 'eql') : (val1, val2) => val1 === val2; + + if (!any && !all) { + all = true; + } + + // Has any + if (any) { + ok = expected.some(function(expectedKey) { + return actual.some(function(actualKey) { + return isEql(expectedKey, actualKey); + }); + }); + } + + // Has all + if (all) { + ok = expected.every(function(expectedKey) { + return actual.some(function(actualKey) { + return isEql(expectedKey, actualKey); + }); + }); + + if (!flag(this, 'contains')) { + ok = ok && keys.length == actual.length; + } + } + + // Key string + if (len > 1) { + keys = keys.map(function(key) { + return _.inspect(key); + }); + var last = keys.pop(); + if (all) { + str = keys.join(', ') + ', and ' + last; + } + if (any) { + str = keys.join(', ') + ', or ' + last; + } + } else { + str = _.inspect(keys[0]); + } + + // Form + str = (len > 1 ? 'keys ' : 'key ') + str; + + // Have / include + str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; + + // Assertion + this.assert( + ok + , 'expected #{this} to ' + deepStr + str + , 'expected #{this} to not ' + deepStr + str + , expected.slice(0).sort(_.compareByInspect) + , actual.sort(_.compareByInspect) + , true + ); + } + + Assertion.addMethod('keys', assertKeys); + Assertion.addMethod('key', assertKeys); + + /** + * ### .throw([errorLike], [errMsgMatcher], [msg]) + * + * When no arguments are provided, `.throw` invokes the target function and + * asserts that an error is thrown. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(); + * + * When one argument is provided, and it's an error constructor, `.throw` + * invokes the target function and asserts that an error is thrown that's an + * instance of that error constructor. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(TypeError); + * + * When one argument is provided, and it's an error instance, `.throw` invokes + * the target function and asserts that an error is thrown that's strictly + * (`===`) equal to that error instance. + * + * var err = new TypeError('Illegal salmon!'); + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(err); + * + * When one argument is provided, and it's a string, `.throw` invokes the + * target function and asserts that an error is thrown with a message that + * contains that string. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw('salmon'); + * + * When one argument is provided, and it's a regular expression, `.throw` + * invokes the target function and asserts that an error is thrown with a + * message that matches that regular expression. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(/salmon/); + * + * When two arguments are provided, and the first is an error instance or + * constructor, and the second is a string or regular expression, `.throw` + * invokes the function and asserts that an error is thrown that fulfills both + * conditions as described above. + * + * var err = new TypeError('Illegal salmon!'); + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(TypeError, 'salmon'); + * expect(badFn).to.throw(TypeError, /salmon/); + * expect(badFn).to.throw(err, 'salmon'); + * expect(badFn).to.throw(err, /salmon/); + * + * Add `.not` earlier in the chain to negate `.throw`. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.not.throw(); + * + * However, it's dangerous to negate `.throw` when providing any arguments. + * The problem is that it creates uncertain expectations by asserting that the + * target either doesn't throw an error, or that it throws an error but of a + * different type than the given type, or that it throws an error of the given + * type but with a message that doesn't include the given string. It's often + * best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to throw an error, it's often best to assert + * exactly that. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.not.throw(); // Recommended + * expect(goodFn).to.not.throw(ReferenceError, 'x'); // Not recommended + * + * When the target is expected to throw an error, it's often best to assert + * that the error is of its expected type, and has a message that includes an + * expected string, rather than asserting that it doesn't have one of many + * unexpected types, and doesn't have a message that includes some string. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(TypeError, 'salmon'); // Recommended + * expect(badFn).to.not.throw(ReferenceError, 'x'); // Not recommended + * + * `.throw` changes the target of any assertions that follow in the chain to + * be the error object that's thrown. + * + * var err = new TypeError('Illegal salmon!'); + * err.code = 42; + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(TypeError).with.property('code', 42); + * + * `.throw` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. When not providing two arguments, always use + * the second form. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.throw(TypeError, 'x', 'nooo why fail??'); + * expect(goodFn, 'nooo why fail??').to.throw(); + * + * Due to limitations in ES5, `.throw` may not always work as expected when + * using a transpiler such as Babel or TypeScript. In particular, it may + * produce unexpected results when subclassing the built-in `Error` object and + * then passing the subclassed constructor to `.throw`. See your transpiler's + * docs for details: + * + * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes)) + * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work)) + * + * Beware of some common mistakes when using the `throw` assertion. One common + * mistake is to accidentally invoke the function yourself instead of letting + * the `throw` assertion invoke the function for you. For example, when + * testing if a function named `fn` throws, provide `fn` instead of `fn()` as + * the target for the assertion. + * + * expect(fn).to.throw(); // Good! Tests `fn` as desired + * expect(fn()).to.throw(); // Bad! Tests result of `fn()`, not `fn` + * + * If you need to assert that your function `fn` throws when passed certain + * arguments, then wrap a call to `fn` inside of another function. + * + * expect(function () { fn(42); }).to.throw(); // Function expression + * expect(() => fn(42)).to.throw(); // ES6 arrow function + * + * Another common mistake is to provide an object method (or any stand-alone + * function that relies on `this`) as the target of the assertion. Doing so is + * problematic because the `this` context will be lost when the function is + * invoked by `.throw`; there's no way for it to know what `this` is supposed + * to be. There are two ways around this problem. One solution is to wrap the + * method or function call inside of another function. Another solution is to + * use `bind`. + * + * expect(function () { cat.meow(); }).to.throw(); // Function expression + * expect(() => cat.meow()).to.throw(); // ES6 arrow function + * expect(cat.meow.bind(cat)).to.throw(); // Bind + * + * Finally, it's worth mentioning that it's a best practice in JavaScript to + * only throw `Error` and derivatives of `Error` such as `ReferenceError`, + * `TypeError`, and user-defined objects that extend `Error`. No other type of + * value will generate a stack trace when initialized. With that said, the + * `throw` assertion does technically support any type of value being thrown, + * not just `Error` and its derivatives. + * + * The aliases `.throws` and `.Throw` can be used interchangeably with + * `.throw`. + * + * @name throw + * @alias throws + * @alias Throw + * @param {Error|ErrorConstructor} errorLike + * @param {String|RegExp} errMsgMatcher error message + * @param {String} msg _optional_ + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @returns error for chaining (null if no error) + * @namespace BDD + * @api public + */ + + function assertThrows (errorLike, errMsgMatcher, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , flagMsg = flag(this, 'message') + , negate = flag(this, 'negate') || false; + new Assertion(obj, flagMsg, ssfi, true).is.a('function'); + + if (errorLike instanceof RegExp || typeof errorLike === 'string') { + errMsgMatcher = errorLike; + errorLike = null; + } + + var caughtErr; + try { + obj(); + } catch (err) { + caughtErr = err; + } + + // If we have the negate flag enabled and at least one valid argument it means we do expect an error + // but we want it to match a given set of criteria + var everyArgIsUndefined = errorLike === undefined && errMsgMatcher === undefined; + + // If we've got the negate flag enabled and both args, we should only fail if both aren't compatible + // See Issue #551 and PR #683@GitHub + var everyArgIsDefined = Boolean(errorLike && errMsgMatcher); + var errorLikeFail = false; + var errMsgMatcherFail = false; + + // Checking if error was thrown + if (everyArgIsUndefined || !everyArgIsUndefined && !negate) { + // We need this to display results correctly according to their types + var errorLikeString = 'an error'; + if (errorLike instanceof Error) { + errorLikeString = '#{exp}'; + } else if (errorLike) { + errorLikeString = _.checkError.getConstructorName(errorLike); + } + + this.assert( + caughtErr + , 'expected #{this} to throw ' + errorLikeString + , 'expected #{this} to not throw an error but #{act} was thrown' + , errorLike && errorLike.toString() + , (caughtErr instanceof Error ? + caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr && + _.checkError.getConstructorName(caughtErr))) + ); + } + + if (errorLike && caughtErr) { + // We should compare instances only if `errorLike` is an instance of `Error` + if (errorLike instanceof Error) { + var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike); + + if (isCompatibleInstance === negate) { + // These checks were created to ensure we won't fail too soon when we've got both args and a negate + // See Issue #551 and PR #683@GitHub + if (everyArgIsDefined && negate) { + errorLikeFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr && !negate ? ' but #{act} was thrown' : '') + , errorLike.toString() + , caughtErr.toString() + ); + } + } + } + + var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike); + if (isCompatibleConstructor === negate) { + if (everyArgIsDefined && negate) { + errorLikeFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') + , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) + , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) + ); + } + } + } + + if (caughtErr && errMsgMatcher !== undefined && errMsgMatcher !== null) { + // Here we check compatible messages + var placeholder = 'including'; + if (errMsgMatcher instanceof RegExp) { + placeholder = 'matching' + } + + var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher); + if (isCompatibleMessage === negate) { + if (everyArgIsDefined && negate) { + errMsgMatcherFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}' + , 'expected #{this} to throw error not ' + placeholder + ' #{exp}' + , errMsgMatcher + , _.checkError.getMessage(caughtErr) + ); + } + } + } + + // If both assertions failed and both should've matched we throw an error + if (errorLikeFail && errMsgMatcherFail) { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') + , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) + , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) + ); + } + + flag(this, 'object', caughtErr); + }; + + Assertion.addMethod('throw', assertThrows); + Assertion.addMethod('throws', assertThrows); + Assertion.addMethod('Throw', assertThrows); + + /** + * ### .respondTo(method[, msg]) + * + * When the target is a non-function object, `.respondTo` asserts that the + * target has a method with the given name `method`. The method can be own or + * inherited, and it can be enumerable or non-enumerable. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(new Cat()).to.respondTo('meow'); + * + * When the target is a function, `.respondTo` asserts that the target's + * `prototype` property has a method with the given name `method`. Again, the + * method can be own or inherited, and it can be enumerable or non-enumerable. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(Cat).to.respondTo('meow'); + * + * Add `.itself` earlier in the chain to force `.respondTo` to treat the + * target as a non-function object, even if it's a function. Thus, it asserts + * that the target has a method with the given name `method`, rather than + * asserting that the target's `prototype` property has a method with the + * given name `method`. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * Cat.hiss = function () {}; + * + * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow'); + * + * When not adding `.itself`, it's important to check the target's type before + * using `.respondTo`. See the `.a` doc for info on checking a target's type. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(new Cat()).to.be.an('object').that.respondsTo('meow'); + * + * Add `.not` earlier in the chain to negate `.respondTo`. + * + * function Dog () {} + * Dog.prototype.bark = function () {}; + * + * expect(new Dog()).to.not.respondTo('meow'); + * + * `.respondTo` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect({}).to.respondTo('meow', 'nooo why fail??'); + * expect({}, 'nooo why fail??').to.respondTo('meow'); + * + * The alias `.respondsTo` can be used interchangeably with `.respondTo`. + * + * @name respondTo + * @alias respondsTo + * @param {String} method + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function respondTo (method, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , itself = flag(this, 'itself') + , context = ('function' === typeof obj && !itself) + ? obj.prototype[method] + : obj[method]; + + this.assert( + 'function' === typeof context + , 'expected #{this} to respond to ' + _.inspect(method) + , 'expected #{this} to not respond to ' + _.inspect(method) + ); + } + + Assertion.addMethod('respondTo', respondTo); + Assertion.addMethod('respondsTo', respondTo); + + /** + * ### .itself + * + * Forces all `.respondTo` assertions that follow in the chain to behave as if + * the target is a non-function object, even if it's a function. Thus, it + * causes `.respondTo` to assert that the target has a method with the given + * name, rather than asserting that the target's `prototype` property has a + * method with the given name. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * Cat.hiss = function () {}; + * + * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow'); + * + * @name itself + * @namespace BDD + * @api public + */ + + Assertion.addProperty('itself', function () { + flag(this, 'itself', true); + }); + + /** + * ### .satisfy(matcher[, msg]) + * + * Invokes the given `matcher` function with the target being passed as the + * first argument, and asserts that the value returned is truthy. + * + * expect(1).to.satisfy(function(num) { + * return num > 0; + * }); + * + * Add `.not` earlier in the chain to negate `.satisfy`. + * + * expect(1).to.not.satisfy(function(num) { + * return num > 2; + * }); + * + * `.satisfy` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1).to.satisfy(function(num) { + * return num > 2; + * }, 'nooo why fail??'); + * + * expect(1, 'nooo why fail??').to.satisfy(function(num) { + * return num > 2; + * }); + * + * The alias `.satisfies` can be used interchangeably with `.satisfy`. + * + * @name satisfy + * @alias satisfies + * @param {Function} matcher + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function satisfy (matcher, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var result = matcher(obj); + this.assert( + result + , 'expected #{this} to satisfy ' + _.objDisplay(matcher) + , 'expected #{this} to not satisfy' + _.objDisplay(matcher) + , flag(this, 'negate') ? false : true + , result + ); + } + + Assertion.addMethod('satisfy', satisfy); + Assertion.addMethod('satisfies', satisfy); + + /** + * ### .closeTo(expected, delta[, msg]) + * + * Asserts that the target is a number that's within a given +/- `delta` range + * of the given number `expected`. However, it's often best to assert that the + * target is equal to its expected value. + * + * // Recommended + * expect(1.5).to.equal(1.5); + * + * // Not recommended + * expect(1.5).to.be.closeTo(1, 0.5); + * expect(1.5).to.be.closeTo(2, 0.5); + * expect(1.5).to.be.closeTo(1, 1); + * + * Add `.not` earlier in the chain to negate `.closeTo`. + * + * expect(1.5).to.equal(1.5); // Recommended + * expect(1.5).to.not.be.closeTo(3, 1); // Not recommended + * + * `.closeTo` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1.5).to.be.closeTo(3, 1, 'nooo why fail??'); + * expect(1.5, 'nooo why fail??').to.be.closeTo(3, 1); + * + * The alias `.approximately` can be used interchangeably with `.closeTo`. + * + * @name closeTo + * @alias approximately + * @param {Number} expected + * @param {Number} delta + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function closeTo(expected, delta, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + + new Assertion(obj, flagMsg, ssfi, true).is.a('number'); + if (typeof expected !== 'number' || typeof delta !== 'number') { + flagMsg = flagMsg ? flagMsg + ': ' : ''; + var deltaMessage = delta === undefined ? ", and a delta is required" : ""; + throw new AssertionError( + flagMsg + 'the arguments to closeTo or approximately must be numbers' + deltaMessage, + undefined, + ssfi + ); + } + + this.assert( + Math.abs(obj - expected) <= delta + , 'expected #{this} to be close to ' + expected + ' +/- ' + delta + , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta + ); + } + + Assertion.addMethod('closeTo', closeTo); + Assertion.addMethod('approximately', closeTo); + + // Note: Duplicates are ignored if testing for inclusion instead of sameness. + function isSubsetOf(subset, superset, cmp, contains, ordered) { + if (!contains) { + if (subset.length !== superset.length) return false; + superset = superset.slice(); + } + + return subset.every(function(elem, idx) { + if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx]; + + if (!cmp) { + var matchIdx = superset.indexOf(elem); + if (matchIdx === -1) return false; + + // Remove match from superset so not counted twice if duplicate in subset. + if (!contains) superset.splice(matchIdx, 1); + return true; + } + + return superset.some(function(elem2, matchIdx) { + if (!cmp(elem, elem2)) return false; + + // Remove match from superset so not counted twice if duplicate in subset. + if (!contains) superset.splice(matchIdx, 1); + return true; + }); + }); + } + + /** + * ### .members(set[, msg]) + * + * Asserts that the target array has the same members as the given array + * `set`. + * + * expect([1, 2, 3]).to.have.members([2, 1, 3]); + * expect([1, 2, 2]).to.have.members([2, 1, 2]); + * + * By default, members are compared using strict (`===`) equality. Add `.deep` + * earlier in the chain to use deep equality instead. See the `deep-eql` + * project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target array deeply (but not strictly) has member `{a: 1}` + * expect([{a: 1}]).to.have.deep.members([{a: 1}]); + * expect([{a: 1}]).to.not.have.members([{a: 1}]); + * + * By default, order doesn't matter. Add `.ordered` earlier in the chain to + * require that members appear in the same order. + * + * expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]); + * expect([1, 2, 3]).to.have.members([2, 1, 3]) + * .but.not.ordered.members([2, 1, 3]); + * + * By default, both arrays must be the same size. Add `.include` earlier in + * the chain to require that the target's members be a superset of the + * expected members. Note that duplicates are ignored in the subset when + * `.include` is added. + * + * // Target array is a superset of [1, 2] but not identical + * expect([1, 2, 3]).to.include.members([1, 2]); + * expect([1, 2, 3]).to.not.have.members([1, 2]); + * + * // Duplicates in the subset are ignored + * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]); + * + * `.deep`, `.ordered`, and `.include` can all be combined. However, if + * `.include` and `.ordered` are combined, the ordering begins at the start of + * both arrays. + * + * expect([{a: 1}, {b: 2}, {c: 3}]) + * .to.include.deep.ordered.members([{a: 1}, {b: 2}]) + * .but.not.include.deep.ordered.members([{b: 2}, {c: 3}]); + * + * Add `.not` earlier in the chain to negate `.members`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the target array doesn't have all of the same members as + * the given array `set` but may or may not have some of them. It's often best + * to identify the exact output that's expected, and then write an assertion + * that only accepts that exact output. + * + * expect([1, 2]).to.not.include(3).and.not.include(4); // Recommended + * expect([1, 2]).to.not.have.members([3, 4]); // Not recommended + * + * `.members` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2]).to.have.members([1, 2, 3], 'nooo why fail??'); + * expect([1, 2], 'nooo why fail??').to.have.members([1, 2, 3]); + * + * @name members + * @param {Array} set + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('members', function (subset, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + + new Assertion(obj, flagMsg, ssfi, true).to.be.an('array'); + new Assertion(subset, flagMsg, ssfi, true).to.be.an('array'); + + var contains = flag(this, 'contains'); + var ordered = flag(this, 'ordered'); + + var subject, failMsg, failNegateMsg; + + if (contains) { + subject = ordered ? 'an ordered superset' : 'a superset'; + failMsg = 'expected #{this} to be ' + subject + ' of #{exp}'; + failNegateMsg = 'expected #{this} to not be ' + subject + ' of #{exp}'; + } else { + subject = ordered ? 'ordered members' : 'members'; + failMsg = 'expected #{this} to have the same ' + subject + ' as #{exp}'; + failNegateMsg = 'expected #{this} to not have the same ' + subject + ' as #{exp}'; + } + + var cmp = flag(this, 'deep') ? flag(this, 'eql') : undefined; + + this.assert( + isSubsetOf(subset, obj, cmp, contains, ordered) + , failMsg + , failNegateMsg + , subset + , obj + , true + ); + }); + + /** + * ### .oneOf(list[, msg]) + * + * Asserts that the target is a member of the given array `list`. However, + * it's often best to assert that the target is equal to its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.oneOf([1, 2, 3]); // Not recommended + * + * Comparisons are performed using strict (`===`) equality. + * + * Add `.not` earlier in the chain to negate `.oneOf`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.oneOf([2, 3, 4]); // Not recommended + * + * It can also be chained with `.contain` or `.include`, which will work with + * both arrays and strings: + * + * expect('Today is sunny').to.contain.oneOf(['sunny', 'cloudy']) + * expect('Today is rainy').to.not.contain.oneOf(['sunny', 'cloudy']) + * expect([1,2,3]).to.contain.oneOf([3,4,5]) + * expect([1,2,3]).to.not.contain.oneOf([4,5,6]) + * + * `.oneOf` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.oneOf([2, 3, 4], 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.oneOf([2, 3, 4]); + * + * @name oneOf + * @param {Array<*>} list + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function oneOf (list, msg) { + if (msg) flag(this, 'message', msg); + var expected = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi') + , contains = flag(this, 'contains') + , isDeep = flag(this, 'deep') + , eql = flag(this, 'eql'); + new Assertion(list, flagMsg, ssfi, true).to.be.an('array'); + + if (contains) { + this.assert( + list.some(function(possibility) { return expected.indexOf(possibility) > -1 }) + , 'expected #{this} to contain one of #{exp}' + , 'expected #{this} to not contain one of #{exp}' + , list + , expected + ); + } else { + if (isDeep) { + this.assert( + list.some(function(possibility) { return eql(expected, possibility) }) + , 'expected #{this} to deeply equal one of #{exp}' + , 'expected #{this} to deeply equal one of #{exp}' + , list + , expected + ); + } else { + this.assert( + list.indexOf(expected) > -1 + , 'expected #{this} to be one of #{exp}' + , 'expected #{this} to not be one of #{exp}' + , list + , expected + ); + } + } + } + + Assertion.addMethod('oneOf', oneOf); + + /** + * ### .change(subject[, prop[, msg]]) + * + * When one argument is provided, `.change` asserts that the given function + * `subject` returns a different value when it's invoked before the target + * function compared to when it's invoked afterward. However, it's often best + * to assert that `subject` is equal to its expected value. + * + * var dots = '' + * , addDot = function () { dots += '.'; } + * , getDots = function () { return dots; }; + * + * // Recommended + * expect(getDots()).to.equal(''); + * addDot(); + * expect(getDots()).to.equal('.'); + * + * // Not recommended + * expect(addDot).to.change(getDots); + * + * When two arguments are provided, `.change` asserts that the value of the + * given object `subject`'s `prop` property is different before invoking the + * target function compared to afterward. + * + * var myObj = {dots: ''} + * , addDot = function () { myObj.dots += '.'; }; + * + * // Recommended + * expect(myObj).to.have.property('dots', ''); + * addDot(); + * expect(myObj).to.have.property('dots', '.'); + * + * // Not recommended + * expect(addDot).to.change(myObj, 'dots'); + * + * Strict (`===`) equality is used to compare before and after values. + * + * Add `.not` earlier in the chain to negate `.change`. + * + * var dots = '' + * , noop = function () {} + * , getDots = function () { return dots; }; + * + * expect(noop).to.not.change(getDots); + * + * var myObj = {dots: ''} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'dots'); + * + * `.change` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {dots: ''} + * , addDot = function () { myObj.dots += '.'; }; + * + * expect(addDot).to.not.change(myObj, 'dots', 'nooo why fail??'); + * + * var dots = '' + * , addDot = function () { dots += '.'; } + * , getDots = function () { return dots; }; + * + * expect(addDot, 'nooo why fail??').to.not.change(getDots); + * + * `.change` also causes all `.by` assertions that follow in the chain to + * assert how much a numeric subject was increased or decreased by. However, + * it's dangerous to use `.change.by`. The problem is that it creates + * uncertain expectations by asserting that the subject either increases by + * the given delta, or that it decreases by the given delta. It's often best + * to identify the exact output that's expected, and then write an assertion + * that only accepts that exact output. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; } + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * The alias `.changes` can be used interchangeably with `.change`. + * + * @name change + * @alias changes + * @param {String} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertChanges (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + // This gets flagged because of the .by(delta) assertion + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'change'); + flag(this, 'realDelta', final !== initial); + + this.assert( + initial !== final + , 'expected ' + msgObj + ' to change' + , 'expected ' + msgObj + ' to not change' + ); + } + + Assertion.addMethod('change', assertChanges); + Assertion.addMethod('changes', assertChanges); + + /** + * ### .increase(subject[, prop[, msg]]) + * + * When one argument is provided, `.increase` asserts that the given function + * `subject` returns a greater number when it's invoked after invoking the + * target function compared to when it's invoked beforehand. `.increase` also + * causes all `.by` assertions that follow in the chain to assert how much + * greater of a number is returned. It's often best to assert that the return + * value increased by the expected amount, rather than asserting it increased + * by any amount. + * + * var val = 1 + * , addTwo = function () { val += 2; } + * , getVal = function () { return val; }; + * + * expect(addTwo).to.increase(getVal).by(2); // Recommended + * expect(addTwo).to.increase(getVal); // Not recommended + * + * When two arguments are provided, `.increase` asserts that the value of the + * given object `subject`'s `prop` property is greater after invoking the + * target function compared to beforehand. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.increase(myObj, 'val'); // Not recommended + * + * Add `.not` earlier in the chain to negate `.increase`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either decreases, or that it stays the same. + * It's often best to identify the exact output that's expected, and then + * write an assertion that only accepts that exact output. + * + * When the subject is expected to decrease, it's often best to assert that it + * decreased by the expected amount. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.not.increase(myObj, 'val'); // Not recommended + * + * When the subject is expected to stay the same, it's often best to assert + * exactly that. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'val'); // Recommended + * expect(noop).to.not.increase(myObj, 'val'); // Not recommended + * + * `.increase` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.increase(myObj, 'val', 'nooo why fail??'); + * + * var val = 1 + * , noop = function () {} + * , getVal = function () { return val; }; + * + * expect(noop, 'nooo why fail??').to.increase(getVal); + * + * The alias `.increases` can be used interchangeably with `.increase`. + * + * @name increase + * @alias increases + * @param {String|Function} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertIncreases (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + // Make sure that the target is a number + new Assertion(initial, flagMsg, ssfi, true).is.a('number'); + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'increase'); + flag(this, 'realDelta', final - initial); + + this.assert( + final - initial > 0 + , 'expected ' + msgObj + ' to increase' + , 'expected ' + msgObj + ' to not increase' + ); + } + + Assertion.addMethod('increase', assertIncreases); + Assertion.addMethod('increases', assertIncreases); + + /** + * ### .decrease(subject[, prop[, msg]]) + * + * When one argument is provided, `.decrease` asserts that the given function + * `subject` returns a lesser number when it's invoked after invoking the + * target function compared to when it's invoked beforehand. `.decrease` also + * causes all `.by` assertions that follow in the chain to assert how much + * lesser of a number is returned. It's often best to assert that the return + * value decreased by the expected amount, rather than asserting it decreased + * by any amount. + * + * var val = 1 + * , subtractTwo = function () { val -= 2; } + * , getVal = function () { return val; }; + * + * expect(subtractTwo).to.decrease(getVal).by(2); // Recommended + * expect(subtractTwo).to.decrease(getVal); // Not recommended + * + * When two arguments are provided, `.decrease` asserts that the value of the + * given object `subject`'s `prop` property is lesser after invoking the + * target function compared to beforehand. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.decrease(myObj, 'val'); // Not recommended + * + * Add `.not` earlier in the chain to negate `.decrease`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either increases, or that it stays the same. + * It's often best to identify the exact output that's expected, and then + * write an assertion that only accepts that exact output. + * + * When the subject is expected to increase, it's often best to assert that it + * increased by the expected amount. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.not.decrease(myObj, 'val'); // Not recommended + * + * When the subject is expected to stay the same, it's often best to assert + * exactly that. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'val'); // Recommended + * expect(noop).to.not.decrease(myObj, 'val'); // Not recommended + * + * `.decrease` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.decrease(myObj, 'val', 'nooo why fail??'); + * + * var val = 1 + * , noop = function () {} + * , getVal = function () { return val; }; + * + * expect(noop, 'nooo why fail??').to.decrease(getVal); + * + * The alias `.decreases` can be used interchangeably with `.decrease`. + * + * @name decrease + * @alias decreases + * @param {String|Function} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertDecreases (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + // Make sure that the target is a number + new Assertion(initial, flagMsg, ssfi, true).is.a('number'); + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'decrease'); + flag(this, 'realDelta', initial - final); + + this.assert( + final - initial < 0 + , 'expected ' + msgObj + ' to decrease' + , 'expected ' + msgObj + ' to not decrease' + ); + } + + Assertion.addMethod('decrease', assertDecreases); + Assertion.addMethod('decreases', assertDecreases); + + /** + * ### .by(delta[, msg]) + * + * When following an `.increase` assertion in the chain, `.by` asserts that + * the subject of the `.increase` assertion increased by the given `delta`. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); + * + * When following a `.decrease` assertion in the chain, `.by` asserts that the + * subject of the `.decrease` assertion decreased by the given `delta`. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); + * + * When following a `.change` assertion in the chain, `.by` asserts that the + * subject of the `.change` assertion either increased or decreased by the + * given `delta`. However, it's dangerous to use `.change.by`. The problem is + * that it creates uncertain expectations. It's often best to identify the + * exact output that's expected, and then write an assertion that only accepts + * that exact output. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; } + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.by`. However, it's often best + * to assert that the subject changed by its expected delta, rather than + * asserting that it didn't change by one of countless unexpected deltas. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * // Recommended + * expect(addTwo).to.increase(myObj, 'val').by(2); + * + * // Not recommended + * expect(addTwo).to.increase(myObj, 'val').but.not.by(3); + * + * `.by` accepts an optional `msg` argument which is a custom error message to + * show when the assertion fails. The message can also be given as the second + * argument to `expect`. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(3, 'nooo why fail??'); + * expect(addTwo, 'nooo why fail??').to.increase(myObj, 'val').by(3); + * + * @name by + * @param {Number} delta + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertDelta(delta, msg) { + if (msg) flag(this, 'message', msg); + + var msgObj = flag(this, 'deltaMsgObj'); + var initial = flag(this, 'initialDeltaValue'); + var final = flag(this, 'finalDeltaValue'); + var behavior = flag(this, 'deltaBehavior'); + var realDelta = flag(this, 'realDelta'); + + var expression; + if (behavior === 'change') { + expression = Math.abs(final - initial) === Math.abs(delta); + } else { + expression = realDelta === Math.abs(delta); + } + + this.assert( + expression + , 'expected ' + msgObj + ' to ' + behavior + ' by ' + delta + , 'expected ' + msgObj + ' to not ' + behavior + ' by ' + delta + ); + } + + Assertion.addMethod('by', assertDelta); + + /** + * ### .extensible + * + * Asserts that the target is extensible, which means that new properties can + * be added to it. Primitives are never extensible. + * + * expect({a: 1}).to.be.extensible; + * + * Add `.not` earlier in the chain to negate `.extensible`. + * + * var nonExtensibleObject = Object.preventExtensions({}) + * , sealedObject = Object.seal({}) + * , frozenObject = Object.freeze({}); + * + * expect(nonExtensibleObject).to.not.be.extensible; + * expect(sealedObject).to.not.be.extensible; + * expect(frozenObject).to.not.be.extensible; + * expect(1).to.not.be.extensible; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(1, 'nooo why fail??').to.be.extensible; + * + * @name extensible + * @namespace BDD + * @api public + */ + + Assertion.addProperty('extensible', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible + // The following provides ES6 behavior for ES5 environments. + + var isExtensible = obj === Object(obj) && Object.isExtensible(obj); + + this.assert( + isExtensible + , 'expected #{this} to be extensible' + , 'expected #{this} to not be extensible' + ); + }); + + /** + * ### .sealed + * + * Asserts that the target is sealed, which means that new properties can't be + * added to it, and its existing properties can't be reconfigured or deleted. + * However, it's possible that its existing properties can still be reassigned + * to different values. Primitives are always sealed. + * + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freeze({}); + * + * expect(sealedObject).to.be.sealed; + * expect(frozenObject).to.be.sealed; + * expect(1).to.be.sealed; + * + * Add `.not` earlier in the chain to negate `.sealed`. + * + * expect({a: 1}).to.not.be.sealed; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.be.sealed; + * + * @name sealed + * @namespace BDD + * @api public + */ + + Assertion.addProperty('sealed', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed + // The following provides ES6 behavior for ES5 environments. + + var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true; + + this.assert( + isSealed + , 'expected #{this} to be sealed' + , 'expected #{this} to not be sealed' + ); + }); + + /** + * ### .frozen + * + * Asserts that the target is frozen, which means that new properties can't be + * added to it, and its existing properties can't be reassigned to different + * values, reconfigured, or deleted. Primitives are always frozen. + * + * var frozenObject = Object.freeze({}); + * + * expect(frozenObject).to.be.frozen; + * expect(1).to.be.frozen; + * + * Add `.not` earlier in the chain to negate `.frozen`. + * + * expect({a: 1}).to.not.be.frozen; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.be.frozen; + * + * @name frozen + * @namespace BDD + * @api public + */ + + Assertion.addProperty('frozen', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen + // The following provides ES6 behavior for ES5 environments. + + var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true; + + this.assert( + isFrozen + , 'expected #{this} to be frozen' + , 'expected #{this} to not be frozen' + ); + }); + + /** + * ### .finite + * + * Asserts that the target is a number, and isn't `NaN` or positive/negative + * `Infinity`. + * + * expect(1).to.be.finite; + * + * Add `.not` earlier in the chain to negate `.finite`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either isn't a number, or that it's `NaN`, or + * that it's positive `Infinity`, or that it's negative `Infinity`. It's often + * best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to be a number, it's often best to assert + * that it's the expected type, rather than asserting that it isn't one of + * many unexpected types. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.finite; // Not recommended + * + * When the target is expected to be `NaN`, it's often best to assert exactly + * that. + * + * expect(NaN).to.be.NaN; // Recommended + * expect(NaN).to.not.be.finite; // Not recommended + * + * When the target is expected to be positive infinity, it's often best to + * assert exactly that. + * + * expect(Infinity).to.equal(Infinity); // Recommended + * expect(Infinity).to.not.be.finite; // Not recommended + * + * When the target is expected to be negative infinity, it's often best to + * assert exactly that. + * + * expect(-Infinity).to.equal(-Infinity); // Recommended + * expect(-Infinity).to.not.be.finite; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect('foo', 'nooo why fail??').to.be.finite; + * + * @name finite + * @namespace BDD + * @api public + */ + + Assertion.addProperty('finite', function(msg) { + var obj = flag(this, 'object'); + + this.assert( + typeof obj === 'number' && isFinite(obj) + , 'expected #{this} to be a finite number' + , 'expected #{this} to not be a finite number' + ); + }); +}; + +},{}],6:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, util) { + /*! + * Chai dependencies. + */ + + var Assertion = chai.Assertion + , flag = util.flag; + + /*! + * Module export. + */ + + /** + * ### assert(expression, message) + * + * Write your own test expressions. + * + * assert('foo' !== 'bar', 'foo is not bar'); + * assert(Array.isArray([]), 'empty arrays are arrays'); + * + * @param {Mixed} expression to test for truthiness + * @param {String} message to display on error + * @name assert + * @namespace Assert + * @api public + */ + + var assert = chai.assert = function (express, errmsg) { + var test = new Assertion(null, null, chai.assert, true); + test.assert( + express + , errmsg + , '[ negation message unavailable ]' + ); + }; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. Node.js `assert` module-compatible. + * + * assert.fail(); + * assert.fail("custom error message"); + * assert.fail(1, 2); + * assert.fail(1, 2, "custom error message"); + * assert.fail(1, 2, "custom error message", ">"); + * assert.fail(1, 2, undefined, ">"); + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace Assert + * @api public + */ + + assert.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + // Comply with Node's fail([message]) interface + + message = actual; + actual = undefined; + } + + message = message || 'assert.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, assert.fail); + }; + + /** + * ### .isOk(object, [message]) + * + * Asserts that `object` is truthy. + * + * assert.isOk('everything', 'everything is ok'); + * assert.isOk(false, 'this will fail'); + * + * @name isOk + * @alias ok + * @param {Mixed} object to test + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isOk = function (val, msg) { + new Assertion(val, msg, assert.isOk, true).is.ok; + }; + + /** + * ### .isNotOk(object, [message]) + * + * Asserts that `object` is falsy. + * + * assert.isNotOk('everything', 'this will fail'); + * assert.isNotOk(false, 'this will pass'); + * + * @name isNotOk + * @alias notOk + * @param {Mixed} object to test + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotOk = function (val, msg) { + new Assertion(val, msg, assert.isNotOk, true).is.not.ok; + }; + + /** + * ### .equal(actual, expected, [message]) + * + * Asserts non-strict equality (`==`) of `actual` and `expected`. + * + * assert.equal(3, '3', '== coerces values to strings'); + * + * @name equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.equal = function (act, exp, msg) { + var test = new Assertion(act, msg, assert.equal, true); + + test.assert( + exp == flag(test, 'object') + , 'expected #{this} to equal #{exp}' + , 'expected #{this} to not equal #{act}' + , exp + , act + , true + ); + }; + + /** + * ### .notEqual(actual, expected, [message]) + * + * Asserts non-strict inequality (`!=`) of `actual` and `expected`. + * + * assert.notEqual(3, 4, 'these numbers are not equal'); + * + * @name notEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notEqual = function (act, exp, msg) { + var test = new Assertion(act, msg, assert.notEqual, true); + + test.assert( + exp != flag(test, 'object') + , 'expected #{this} to not equal #{exp}' + , 'expected #{this} to equal #{act}' + , exp + , act + , true + ); + }; + + /** + * ### .strictEqual(actual, expected, [message]) + * + * Asserts strict equality (`===`) of `actual` and `expected`. + * + * assert.strictEqual(true, true, 'these booleans are strictly equal'); + * + * @name strictEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.strictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.strictEqual, true).to.equal(exp); + }; + + /** + * ### .notStrictEqual(actual, expected, [message]) + * + * Asserts strict inequality (`!==`) of `actual` and `expected`. + * + * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); + * + * @name notStrictEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notStrictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp); + }; + + /** + * ### .deepEqual(actual, expected, [message]) + * + * Asserts that `actual` is deeply equal to `expected`. + * + * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); + * + * @name deepEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @alias deepStrictEqual + * @namespace Assert + * @api public + */ + + assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.deepEqual, true).to.eql(exp); + }; + + /** + * ### .notDeepEqual(actual, expected, [message]) + * + * Assert that `actual` is not deeply equal to `expected`. + * + * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); + * + * @name notDeepEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp); + }; + + /** + * ### .isAbove(valueToCheck, valueToBeAbove, [message]) + * + * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`. + * + * assert.isAbove(5, 2, '5 is strictly greater than 2'); + * + * @name isAbove + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAbove + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAbove = function (val, abv, msg) { + new Assertion(val, msg, assert.isAbove, true).to.be.above(abv); + }; + + /** + * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message]) + * + * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`. + * + * assert.isAtLeast(5, 2, '5 is greater or equal to 2'); + * assert.isAtLeast(3, 3, '3 is greater or equal to 3'); + * + * @name isAtLeast + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAtLeast + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAtLeast = function (val, atlst, msg) { + new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst); + }; + + /** + * ### .isBelow(valueToCheck, valueToBeBelow, [message]) + * + * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`. + * + * assert.isBelow(3, 6, '3 is strictly less than 6'); + * + * @name isBelow + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeBelow + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isBelow = function (val, blw, msg) { + new Assertion(val, msg, assert.isBelow, true).to.be.below(blw); + }; + + /** + * ### .isAtMost(valueToCheck, valueToBeAtMost, [message]) + * + * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`. + * + * assert.isAtMost(3, 6, '3 is less than or equal to 6'); + * assert.isAtMost(4, 4, '4 is less than or equal to 4'); + * + * @name isAtMost + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAtMost + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAtMost = function (val, atmst, msg) { + new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst); + }; + + /** + * ### .isTrue(value, [message]) + * + * Asserts that `value` is true. + * + * var teaServed = true; + * assert.isTrue(teaServed, 'the tea has been served'); + * + * @name isTrue + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isTrue = function (val, msg) { + new Assertion(val, msg, assert.isTrue, true).is['true']; + }; + + /** + * ### .isNotTrue(value, [message]) + * + * Asserts that `value` is not true. + * + * var tea = 'tasty chai'; + * assert.isNotTrue(tea, 'great, time for tea!'); + * + * @name isNotTrue + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotTrue = function (val, msg) { + new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true); + }; + + /** + * ### .isFalse(value, [message]) + * + * Asserts that `value` is false. + * + * var teaServed = false; + * assert.isFalse(teaServed, 'no tea yet? hmm...'); + * + * @name isFalse + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFalse = function (val, msg) { + new Assertion(val, msg, assert.isFalse, true).is['false']; + }; + + /** + * ### .isNotFalse(value, [message]) + * + * Asserts that `value` is not false. + * + * var tea = 'tasty chai'; + * assert.isNotFalse(tea, 'great, time for tea!'); + * + * @name isNotFalse + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotFalse = function (val, msg) { + new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false); + }; + + /** + * ### .isNull(value, [message]) + * + * Asserts that `value` is null. + * + * assert.isNull(err, 'there was no error'); + * + * @name isNull + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNull = function (val, msg) { + new Assertion(val, msg, assert.isNull, true).to.equal(null); + }; + + /** + * ### .isNotNull(value, [message]) + * + * Asserts that `value` is not null. + * + * var tea = 'tasty chai'; + * assert.isNotNull(tea, 'great, time for tea!'); + * + * @name isNotNull + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotNull = function (val, msg) { + new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null); + }; + + /** + * ### .isNaN + * + * Asserts that value is NaN. + * + * assert.isNaN(NaN, 'NaN is NaN'); + * + * @name isNaN + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNaN = function (val, msg) { + new Assertion(val, msg, assert.isNaN, true).to.be.NaN; + }; + + /** + * ### .isNotNaN + * + * Asserts that value is not NaN. + * + * assert.isNotNaN(4, '4 is not NaN'); + * + * @name isNotNaN + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + assert.isNotNaN = function (val, msg) { + new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN; + }; + + /** + * ### .exists + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var foo = 'hi'; + * + * assert.exists(foo, 'foo is neither `null` nor `undefined`'); + * + * @name exists + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.exists = function (val, msg) { + new Assertion(val, msg, assert.exists, true).to.exist; + }; + + /** + * ### .notExists + * + * Asserts that the target is either `null` or `undefined`. + * + * var bar = null + * , baz; + * + * assert.notExists(bar); + * assert.notExists(baz, 'baz is either null or undefined'); + * + * @name notExists + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notExists = function (val, msg) { + new Assertion(val, msg, assert.notExists, true).to.not.exist; + }; + + /** + * ### .isUndefined(value, [message]) + * + * Asserts that `value` is `undefined`. + * + * var tea; + * assert.isUndefined(tea, 'no tea defined'); + * + * @name isUndefined + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isUndefined = function (val, msg) { + new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined); + }; + + /** + * ### .isDefined(value, [message]) + * + * Asserts that `value` is not `undefined`. + * + * var tea = 'cup of chai'; + * assert.isDefined(tea, 'tea has been defined'); + * + * @name isDefined + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isDefined = function (val, msg) { + new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined); + }; + + /** + * ### .isFunction(value, [message]) + * + * Asserts that `value` is a function. + * + * function serveTea() { return 'cup of tea'; }; + * assert.isFunction(serveTea, 'great, we can have tea now'); + * + * @name isFunction + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFunction = function (val, msg) { + new Assertion(val, msg, assert.isFunction, true).to.be.a('function'); + }; + + /** + * ### .isNotFunction(value, [message]) + * + * Asserts that `value` is _not_ a function. + * + * var serveTea = [ 'heat', 'pour', 'sip' ]; + * assert.isNotFunction(serveTea, 'great, we have listed the steps'); + * + * @name isNotFunction + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotFunction = function (val, msg) { + new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function'); + }; + + /** + * ### .isObject(value, [message]) + * + * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`). + * _The assertion does not match subclassed objects._ + * + * var selection = { name: 'Chai', serve: 'with spices' }; + * assert.isObject(selection, 'tea selection is an object'); + * + * @name isObject + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isObject = function (val, msg) { + new Assertion(val, msg, assert.isObject, true).to.be.a('object'); + }; + + /** + * ### .isNotObject(value, [message]) + * + * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`). + * + * var selection = 'chai' + * assert.isNotObject(selection, 'tea selection is not an object'); + * assert.isNotObject(null, 'null is not an object'); + * + * @name isNotObject + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotObject = function (val, msg) { + new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object'); + }; + + /** + * ### .isArray(value, [message]) + * + * Asserts that `value` is an array. + * + * var menu = [ 'green', 'chai', 'oolong' ]; + * assert.isArray(menu, 'what kind of tea do we want?'); + * + * @name isArray + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isArray = function (val, msg) { + new Assertion(val, msg, assert.isArray, true).to.be.an('array'); + }; + + /** + * ### .isNotArray(value, [message]) + * + * Asserts that `value` is _not_ an array. + * + * var menu = 'green|chai|oolong'; + * assert.isNotArray(menu, 'what kind of tea do we want?'); + * + * @name isNotArray + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotArray = function (val, msg) { + new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array'); + }; + + /** + * ### .isString(value, [message]) + * + * Asserts that `value` is a string. + * + * var teaOrder = 'chai'; + * assert.isString(teaOrder, 'order placed'); + * + * @name isString + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isString = function (val, msg) { + new Assertion(val, msg, assert.isString, true).to.be.a('string'); + }; + + /** + * ### .isNotString(value, [message]) + * + * Asserts that `value` is _not_ a string. + * + * var teaOrder = 4; + * assert.isNotString(teaOrder, 'order placed'); + * + * @name isNotString + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotString = function (val, msg) { + new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string'); + }; + + /** + * ### .isNumber(value, [message]) + * + * Asserts that `value` is a number. + * + * var cups = 2; + * assert.isNumber(cups, 'how many cups'); + * + * @name isNumber + * @param {Number} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNumber = function (val, msg) { + new Assertion(val, msg, assert.isNumber, true).to.be.a('number'); + }; + + /** + * ### .isNotNumber(value, [message]) + * + * Asserts that `value` is _not_ a number. + * + * var cups = '2 cups please'; + * assert.isNotNumber(cups, 'how many cups'); + * + * @name isNotNumber + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotNumber = function (val, msg) { + new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number'); + }; + + /** + * ### .isFinite(value, [message]) + * + * Asserts that `value` is a finite number. Unlike `.isNumber`, this will fail for `NaN` and `Infinity`. + * + * var cups = 2; + * assert.isFinite(cups, 'how many cups'); + * + * assert.isFinite(NaN); // throws + * + * @name isFinite + * @param {Number} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFinite = function (val, msg) { + new Assertion(val, msg, assert.isFinite, true).to.be.finite; + }; + + /** + * ### .isBoolean(value, [message]) + * + * Asserts that `value` is a boolean. + * + * var teaReady = true + * , teaServed = false; + * + * assert.isBoolean(teaReady, 'is the tea ready'); + * assert.isBoolean(teaServed, 'has tea been served'); + * + * @name isBoolean + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isBoolean = function (val, msg) { + new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean'); + }; + + /** + * ### .isNotBoolean(value, [message]) + * + * Asserts that `value` is _not_ a boolean. + * + * var teaReady = 'yep' + * , teaServed = 'nope'; + * + * assert.isNotBoolean(teaReady, 'is the tea ready'); + * assert.isNotBoolean(teaServed, 'has tea been served'); + * + * @name isNotBoolean + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotBoolean = function (val, msg) { + new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean'); + }; + + /** + * ### .typeOf(value, name, [message]) + * + * Asserts that `value`'s type is `name`, as determined by + * `Object.prototype.toString`. + * + * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); + * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); + * assert.typeOf('tea', 'string', 'we have a string'); + * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); + * assert.typeOf(null, 'null', 'we have a null'); + * assert.typeOf(undefined, 'undefined', 'we have an undefined'); + * + * @name typeOf + * @param {Mixed} value + * @param {String} name + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.typeOf = function (val, type, msg) { + new Assertion(val, msg, assert.typeOf, true).to.be.a(type); + }; + + /** + * ### .notTypeOf(value, name, [message]) + * + * Asserts that `value`'s type is _not_ `name`, as determined by + * `Object.prototype.toString`. + * + * assert.notTypeOf('tea', 'number', 'strings are not numbers'); + * + * @name notTypeOf + * @param {Mixed} value + * @param {String} typeof name + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notTypeOf = function (val, type, msg) { + new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type); + }; + + /** + * ### .instanceOf(object, constructor, [message]) + * + * Asserts that `value` is an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , chai = new Tea('chai'); + * + * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); + * + * @name instanceOf + * @param {Object} object + * @param {Constructor} constructor + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.instanceOf = function (val, type, msg) { + new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type); + }; + + /** + * ### .notInstanceOf(object, constructor, [message]) + * + * Asserts `value` is not an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , chai = new String('chai'); + * + * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); + * + * @name notInstanceOf + * @param {Object} object + * @param {Constructor} constructor + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notInstanceOf = function (val, type, msg) { + new Assertion(val, msg, assert.notInstanceOf, true) + .to.not.be.instanceOf(type); + }; + + /** + * ### .include(haystack, needle, [message]) + * + * Asserts that `haystack` includes `needle`. Can be used to assert the + * inclusion of a value in an array, a substring in a string, or a subset of + * properties in an object. + * + * assert.include([1,2,3], 2, 'array contains value'); + * assert.include('foobar', 'foo', 'string contains substring'); + * assert.include({ foo: 'bar', hello: 'universe' }, { foo: 'bar' }, 'object contains property'); + * + * Strict equality (===) is used. When asserting the inclusion of a value in + * an array, the array is searched for an element that's strictly equal to the + * given value. When asserting a subset of properties in an object, the object + * is searched for the given property keys, checking that each one is present + * and strictly equal to the given property value. For instance: + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.include([obj1, obj2], obj1); + * assert.include({foo: obj1, bar: obj2}, {foo: obj1}); + * assert.include({foo: obj1, bar: obj2}, {foo: obj1, bar: obj2}); + * + * @name include + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.include = function (exp, inc, msg) { + new Assertion(exp, msg, assert.include, true).include(inc); + }; + + /** + * ### .notInclude(haystack, needle, [message]) + * + * Asserts that `haystack` does not include `needle`. Can be used to assert + * the absence of a value in an array, a substring in a string, or a subset of + * properties in an object. + * + * assert.notInclude([1,2,3], 4, "array doesn't contain value"); + * assert.notInclude('foobar', 'baz', "string doesn't contain substring"); + * assert.notInclude({ foo: 'bar', hello: 'universe' }, { foo: 'baz' }, 'object doesn't contain property'); + * + * Strict equality (===) is used. When asserting the absence of a value in an + * array, the array is searched to confirm the absence of an element that's + * strictly equal to the given value. When asserting a subset of properties in + * an object, the object is searched to confirm that at least one of the given + * property keys is either not present or not strictly equal to the given + * property value. For instance: + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.notInclude([obj1, obj2], {a: 1}); + * assert.notInclude({foo: obj1, bar: obj2}, {foo: {a: 1}}); + * assert.notInclude({foo: obj1, bar: obj2}, {foo: obj1, bar: {b: 2}}); + * + * @name notInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notInclude, true).not.include(inc); + }; + + /** + * ### .deepInclude(haystack, needle, [message]) + * + * Asserts that `haystack` includes `needle`. Can be used to assert the + * inclusion of a value in an array or a subset of properties in an object. + * Deep equality is used. + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.deepInclude([obj1, obj2], {a: 1}); + * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}}); + * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 2}}); + * + * @name deepInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc); + }; + + /** + * ### .notDeepInclude(haystack, needle, [message]) + * + * Asserts that `haystack` does not include `needle`. Can be used to assert + * the absence of a value in an array or a subset of properties in an object. + * Deep equality is used. + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.notDeepInclude([obj1, obj2], {a: 9}); + * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 9}}); + * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 9}}); + * + * @name notDeepInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc); + }; + + /** + * ### .nestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.nestedInclude({'.a': {'b': 'x'}}, {'\\.a.[b]': 'x'}); + * assert.nestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'x'}); + * + * @name nestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc); + }; + + /** + * ### .notNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' does not include 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.notNestedInclude({'.a': {'b': 'x'}}, {'\\.a.b': 'y'}); + * assert.notNestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'y'}); + * + * @name notNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notNestedInclude, true) + .not.nested.include(inc); + }; + + /** + * ### .deepNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while checking for deep equality. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.deepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {x: 1}}); + * assert.deepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {x: 1}}); + * + * @name deepNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepNestedInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.deepNestedInclude, true) + .deep.nested.include(inc); + }; + + /** + * ### .notDeepNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' does not include 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while checking for deep equality. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.notDeepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {y: 1}}) + * assert.notDeepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {y: 2}}); + * + * @name notDeepNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepNestedInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepNestedInclude, true) + .not.deep.nested.include(inc); + }; + + /** + * ### .ownInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while ignoring inherited properties. + * + * assert.ownInclude({ a: 1 }, { a: 1 }); + * + * @name ownInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.ownInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.ownInclude, true).own.include(inc); + }; + + /** + * ### .notOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while ignoring inherited properties. + * + * Object.prototype.b = 2; + * + * assert.notOwnInclude({ a: 1 }, { b: 2 }); + * + * @name notOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc); + }; + + /** + * ### .deepOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while ignoring inherited properties and checking for deep equality. + * + * assert.deepOwnInclude({a: {b: 2}}, {a: {b: 2}}); + * + * @name deepOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.deepOwnInclude, true) + .deep.own.include(inc); + }; + + /** + * ### .notDeepOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while ignoring inherited properties and checking for deep equality. + * + * assert.notDeepOwnInclude({a: {b: 2}}, {a: {c: 3}}); + * + * @name notDeepOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepOwnInclude, true) + .not.deep.own.include(inc); + }; + + /** + * ### .match(value, regexp, [message]) + * + * Asserts that `value` matches the regular expression `regexp`. + * + * assert.match('foobar', /^foo/, 'regexp matches'); + * + * @name match + * @param {Mixed} value + * @param {RegExp} regexp + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.match = function (exp, re, msg) { + new Assertion(exp, msg, assert.match, true).to.match(re); + }; + + /** + * ### .notMatch(value, regexp, [message]) + * + * Asserts that `value` does not match the regular expression `regexp`. + * + * assert.notMatch('foobar', /^foo/, 'regexp does not match'); + * + * @name notMatch + * @param {Mixed} value + * @param {RegExp} regexp + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notMatch = function (exp, re, msg) { + new Assertion(exp, msg, assert.notMatch, true).to.not.match(re); + }; + + /** + * ### .property(object, property, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property`. + * + * assert.property({ tea: { green: 'matcha' }}, 'tea'); + * assert.property({ tea: { green: 'matcha' }}, 'toString'); + * + * @name property + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.property = function (obj, prop, msg) { + new Assertion(obj, msg, assert.property, true).to.have.property(prop); + }; + + /** + * ### .notProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property`. + * + * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); + * + * @name notProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notProperty, true) + .to.not.have.property(prop); + }; + + /** + * ### .propertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property` with a value given by `value`. Uses a strict equality check + * (===). + * + * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); + * + * @name propertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.propertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.propertyVal, true) + .to.have.property(prop, val); + }; + + /** + * ### .notPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property` with value given by `value`. Uses a strict equality check + * (===). + * + * assert.notPropertyVal({ tea: 'is good' }, 'tea', 'is bad'); + * assert.notPropertyVal({ tea: 'is good' }, 'coffee', 'is good'); + * + * @name notPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notPropertyVal, true) + .to.not.have.property(prop, val); + }; + + /** + * ### .deepPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property` with a value given by `value`. Uses a deep equality check. + * + * assert.deepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' }); + * + * @name deepPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.deepPropertyVal, true) + .to.have.deep.property(prop, val); + }; + + /** + * ### .notDeepPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property` with value given by `value`. Uses a deep equality check. + * + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' }); + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' }); + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' }); + * + * @name notDeepPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notDeepPropertyVal, true) + .to.not.have.deep.property(prop, val); + }; + + /** + * ### .ownProperty(object, property, [message]) + * + * Asserts that `object` has a direct property named by `property`. Inherited + * properties aren't checked. + * + * assert.ownProperty({ tea: { green: 'matcha' }}, 'tea'); + * + * @name ownProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @api public + */ + + assert.ownProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.ownProperty, true) + .to.have.own.property(prop); + }; + + /** + * ### .notOwnProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a direct property named by + * `property`. Inherited properties aren't checked. + * + * assert.notOwnProperty({ tea: { green: 'matcha' }}, 'coffee'); + * assert.notOwnProperty({}, 'toString'); + * + * @name notOwnProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @api public + */ + + assert.notOwnProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notOwnProperty, true) + .to.not.have.own.property(prop); + }; + + /** + * ### .ownPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct property named by `property` and a value + * equal to the provided `value`. Uses a strict equality check (===). + * Inherited properties aren't checked. + * + * assert.ownPropertyVal({ coffee: 'is good'}, 'coffee', 'is good'); + * + * @name ownPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.ownPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.ownPropertyVal, true) + .to.have.own.property(prop, value); + }; + + /** + * ### .notOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct property named by `property` + * with a value equal to the provided `value`. Uses a strict equality check + * (===). Inherited properties aren't checked. + * + * assert.notOwnPropertyVal({ tea: 'is better'}, 'tea', 'is worse'); + * assert.notOwnPropertyVal({}, 'toString', Object.prototype.toString); + * + * @name notOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.notOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.notOwnPropertyVal, true) + .to.not.have.own.property(prop, value); + }; + + /** + * ### .deepOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct property named by `property` and a value + * equal to the provided `value`. Uses a deep equality check. Inherited + * properties aren't checked. + * + * assert.deepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' }); + * + * @name deepOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.deepOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.deepOwnPropertyVal, true) + .to.have.deep.own.property(prop, value); + }; + + /** + * ### .notDeepOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct property named by `property` + * with a value equal to the provided `value`. Uses a deep equality check. + * Inherited properties aren't checked. + * + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' }); + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' }); + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' }); + * assert.notDeepOwnPropertyVal({}, 'toString', Object.prototype.toString); + * + * @name notDeepOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true) + .to.not.have.deep.own.property(prop, value); + }; + + /** + * ### .nestedProperty(object, property, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property`, which can be a string using dot- and bracket-notation for + * nested reference. + * + * assert.nestedProperty({ tea: { green: 'matcha' }}, 'tea.green'); + * + * @name nestedProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.nestedProperty, true) + .to.have.nested.property(prop); + }; + + /** + * ### .notNestedProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a property named by `property`, which + * can be a string using dot- and bracket-notation for nested reference. The + * property cannot exist on the object nor anywhere in its prototype chain. + * + * assert.notNestedProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); + * + * @name notNestedProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notNestedProperty, true) + .to.not.have.nested.property(prop); + }; + + /** + * ### .nestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property` with value given + * by `value`. `property` can use dot- and bracket-notation for nested + * reference. Uses a strict equality check (===). + * + * assert.nestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha'); + * + * @name nestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.nestedPropertyVal, true) + .to.have.nested.property(prop, val); + }; + + /** + * ### .notNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a property named by `property` with + * value given by `value`. `property` can use dot- and bracket-notation for + * nested reference. Uses a strict equality check (===). + * + * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha'); + * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'coffee.green', 'matcha'); + * + * @name notNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notNestedPropertyVal, true) + .to.not.have.nested.property(prop, val); + }; + + /** + * ### .deepNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property` with a value given + * by `value`. `property` can use dot- and bracket-notation for nested + * reference. Uses a deep equality check. + * + * assert.deepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yum' }); + * + * @name deepNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.deepNestedPropertyVal, true) + .to.have.deep.nested.property(prop, val); + }; + + /** + * ### .notDeepNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a property named by `property` with + * value given by `value`. `property` can use dot- and bracket-notation for + * nested reference. Uses a deep equality check. + * + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { oolong: 'yum' }); + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yuck' }); + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.black', { matcha: 'yum' }); + * + * @name notDeepNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true) + .to.not.have.deep.nested.property(prop, val); + } + + /** + * ### .lengthOf(object, length, [message]) + * + * Asserts that `object` has a `length` or `size` with the expected value. + * + * assert.lengthOf([1,2,3], 3, 'array has length of 3'); + * assert.lengthOf('foobar', 6, 'string has length of 6'); + * assert.lengthOf(new Set([1,2,3]), 3, 'set has size of 3'); + * assert.lengthOf(new Map([['a',1],['b',2],['c',3]]), 3, 'map has size of 3'); + * + * @name lengthOf + * @param {Mixed} object + * @param {Number} length + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.lengthOf = function (exp, len, msg) { + new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len); + }; + + /** + * ### .hasAnyKeys(object, [keys], [message]) + * + * Asserts that `object` has at least one of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'iDontExist', 'baz']); + * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, iDontExist: 99, baz: 1337}); + * assert.hasAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.hasAnyKeys(new Set([{foo: 'bar'}, 'anotherKey']), [{foo: 'bar'}, 'anotherKey']); + * + * @name hasAnyKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAnyKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys); + } + + /** + * ### .hasAllKeys(object, [keys], [message]) + * + * Asserts that `object` has all and only all of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']); + * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337]); + * assert.hasAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.hasAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']); + * + * @name hasAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys); + } + + /** + * ### .containsAllKeys(object, [keys], [message]) + * + * Asserts that `object` has all of the `keys` provided but may have more keys not listed. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'baz']); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, baz: 1337}); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337}); + * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}]); + * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}]); + * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']); + * + * @name containsAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.containsAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.containsAllKeys, true) + .to.contain.all.keys(keys); + } + + /** + * ### .doesNotHaveAnyKeys(object, [keys], [message]) + * + * Asserts that `object` has none of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']); + * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'}); + * assert.doesNotHaveAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']); + * assert.doesNotHaveAnyKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']); + * + * @name doesNotHaveAnyKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAnyKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true) + .to.not.have.any.keys(keys); + } + + /** + * ### .doesNotHaveAllKeys(object, [keys], [message]) + * + * Asserts that `object` does not have at least one of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']); + * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'}); + * assert.doesNotHaveAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']); + * assert.doesNotHaveAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']); + * + * @name doesNotHaveAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAllKeys, true) + .to.not.have.all.keys(keys); + } + + /** + * ### .hasAnyDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has at least one of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'}); + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'}); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {three: 'three'}]); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name hasAnyDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAnyDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAnyDeepKeys, true) + .to.have.any.deep.keys(keys); + } + + /** + * ### .hasAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has all and only all of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne']]), {one: 'one'}); + * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAllDeepKeys(new Set([{one: 'one'}]), {one: 'one'}); + * assert.hasAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name hasAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAllDeepKeys, true) + .to.have.all.deep.keys(keys); + } + + /** + * ### .containsAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` contains all of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'}); + * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'}); + * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name containsAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.containsAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.containsAllDeepKeys, true) + .to.contain.all.deep.keys(keys); + } + + /** + * ### .doesNotHaveAnyDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has none of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'}); + * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {fifty: 'fifty'}]); + * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'}); + * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{twenty: 'twenty'}, {fifty: 'fifty'}]); + * + * @name doesNotHaveAnyDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true) + .to.not.have.any.deep.keys(keys); + } + + /** + * ### .doesNotHaveAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` does not have at least one of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'}); + * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {one: 'one'}]); + * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'}); + * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {fifty: 'fifty'}]); + * + * @name doesNotHaveAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true) + .to.not.have.all.deep.keys(keys); + } + + /** + * ### .throws(fn, [errorLike/string/regexp], [string/regexp], [message]) + * + * If `errorLike` is an `Error` constructor, asserts that `fn` will throw an error that is an + * instance of `errorLike`. + * If `errorLike` is an `Error` instance, asserts that the error thrown is the same + * instance as `errorLike`. + * If `errMsgMatcher` is provided, it also asserts that the error thrown will have a + * message matching `errMsgMatcher`. + * + * assert.throws(fn, 'Error thrown must have this msg'); + * assert.throws(fn, /Error thrown must have a msg that matches this/); + * assert.throws(fn, ReferenceError); + * assert.throws(fn, errorInstance); + * assert.throws(fn, ReferenceError, 'Error thrown must be a ReferenceError and have this msg'); + * assert.throws(fn, errorInstance, 'Error thrown must be the same errorInstance and have this msg'); + * assert.throws(fn, ReferenceError, /Error thrown must be a ReferenceError and match this/); + * assert.throws(fn, errorInstance, /Error thrown must be the same errorInstance and match this/); + * + * @name throws + * @alias throw + * @alias Throw + * @param {Function} fn + * @param {ErrorConstructor|Error} errorLike + * @param {RegExp|String} errMsgMatcher + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Assert + * @api public + */ + + assert.throws = function (fn, errorLike, errMsgMatcher, msg) { + if ('string' === typeof errorLike || errorLike instanceof RegExp) { + errMsgMatcher = errorLike; + errorLike = null; + } + + var assertErr = new Assertion(fn, msg, assert.throws, true) + .to.throw(errorLike, errMsgMatcher); + return flag(assertErr, 'object'); + }; + + /** + * ### .doesNotThrow(fn, [errorLike/string/regexp], [string/regexp], [message]) + * + * If `errorLike` is an `Error` constructor, asserts that `fn` will _not_ throw an error that is an + * instance of `errorLike`. + * If `errorLike` is an `Error` instance, asserts that the error thrown is _not_ the same + * instance as `errorLike`. + * If `errMsgMatcher` is provided, it also asserts that the error thrown will _not_ have a + * message matching `errMsgMatcher`. + * + * assert.doesNotThrow(fn, 'Any Error thrown must not have this message'); + * assert.doesNotThrow(fn, /Any Error thrown must not match this/); + * assert.doesNotThrow(fn, Error); + * assert.doesNotThrow(fn, errorInstance); + * assert.doesNotThrow(fn, Error, 'Error must not have this message'); + * assert.doesNotThrow(fn, errorInstance, 'Error must not have this message'); + * assert.doesNotThrow(fn, Error, /Error must not match this/); + * assert.doesNotThrow(fn, errorInstance, /Error must not match this/); + * + * @name doesNotThrow + * @param {Function} fn + * @param {ErrorConstructor} errorLike + * @param {RegExp|String} errMsgMatcher + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Assert + * @api public + */ + + assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) { + if ('string' === typeof errorLike || errorLike instanceof RegExp) { + errMsgMatcher = errorLike; + errorLike = null; + } + + new Assertion(fn, msg, assert.doesNotThrow, true) + .to.not.throw(errorLike, errMsgMatcher); + }; + + /** + * ### .operator(val1, operator, val2, [message]) + * + * Compares two values using `operator`. + * + * assert.operator(1, '<', 2, 'everything is ok'); + * assert.operator(1, '>', 2, 'this will fail'); + * + * @name operator + * @param {Mixed} val1 + * @param {String} operator + * @param {Mixed} val2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.operator = function (val, operator, val2, msg) { + var ok; + switch(operator) { + case '==': + ok = val == val2; + break; + case '===': + ok = val === val2; + break; + case '>': + ok = val > val2; + break; + case '>=': + ok = val >= val2; + break; + case '<': + ok = val < val2; + break; + case '<=': + ok = val <= val2; + break; + case '!=': + ok = val != val2; + break; + case '!==': + ok = val !== val2; + break; + default: + msg = msg ? msg + ': ' : msg; + throw new chai.AssertionError( + msg + 'Invalid operator "' + operator + '"', + undefined, + assert.operator + ); + } + var test = new Assertion(ok, msg, assert.operator, true); + test.assert( + true === flag(test, 'object') + , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2) + , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) ); + }; + + /** + * ### .closeTo(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.closeTo(1.5, 1, 0.5, 'numbers are close'); + * + * @name closeTo + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.closeTo = function (act, exp, delta, msg) { + new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta); + }; + + /** + * ### .approximately(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.approximately(1.5, 1, 0.5, 'numbers are close'); + * + * @name approximately + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.approximately = function (act, exp, delta, msg) { + new Assertion(act, msg, assert.approximately, true) + .to.be.approximately(exp, delta); + }; + + /** + * ### .sameMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in any order. Uses a + * strict equality check (===). + * + * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); + * + * @name sameMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameMembers, true) + .to.have.same.members(set2); + } + + /** + * ### .notSameMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in any order. + * Uses a strict equality check (===). + * + * assert.notSameMembers([ 1, 2, 3 ], [ 5, 1, 3 ], 'not same members'); + * + * @name notSameMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameMembers, true) + .to.not.have.same.members(set2); + } + + /** + * ### .sameDeepMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in any order. Uses a + * deep equality check. + * + * assert.sameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { c: 3 }], 'same deep members'); + * + * @name sameDeepMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameDeepMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameDeepMembers, true) + .to.have.same.deep.members(set2); + } + + /** + * ### .notSameDeepMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in any order. + * Uses a deep equality check. + * + * assert.notSameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { f: 5 }], 'not same deep members'); + * + * @name notSameDeepMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameDeepMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameDeepMembers, true) + .to.not.have.same.deep.members(set2); + } + + /** + * ### .sameOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in the same order. + * Uses a strict equality check (===). + * + * assert.sameOrderedMembers([ 1, 2, 3 ], [ 1, 2, 3 ], 'same ordered members'); + * + * @name sameOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameOrderedMembers, true) + .to.have.same.ordered.members(set2); + } + + /** + * ### .notSameOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in the same + * order. Uses a strict equality check (===). + * + * assert.notSameOrderedMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'not same ordered members'); + * + * @name notSameOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameOrderedMembers, true) + .to.not.have.same.ordered.members(set2); + } + + /** + * ### .sameDeepOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in the same order. + * Uses a deep equality check. + * + * assert.sameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { c: 3 } ], 'same deep ordered members'); + * + * @name sameDeepOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameDeepOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameDeepOrderedMembers, true) + .to.have.same.deep.ordered.members(set2); + } + + /** + * ### .notSameDeepOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in the same + * order. Uses a deep equality check. + * + * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { z: 5 } ], 'not same deep ordered members'); + * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { c: 3 } ], 'not same deep ordered members'); + * + * @name notSameDeepOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameDeepOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true) + .to.not.have.same.deep.ordered.members(set2); + } + + /** + * ### .includeMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in any order. Uses a + * strict equality check (===). Duplicates are ignored. + * + * assert.includeMembers([ 1, 2, 3 ], [ 2, 1, 2 ], 'include members'); + * + * @name includeMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeMembers, true) + .to.include.members(subset); + } + + /** + * ### .notIncludeMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in any order. Uses a + * strict equality check (===). Duplicates are ignored. + * + * assert.notIncludeMembers([ 1, 2, 3 ], [ 5, 1 ], 'not include members'); + * + * @name notIncludeMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeMembers, true) + .to.not.include.members(subset); + } + + /** + * ### .includeDeepMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in any order. Uses a deep + * equality check. Duplicates are ignored. + * + * assert.includeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { b: 2 } ], 'include deep members'); + * + * @name includeDeepMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeDeepMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeDeepMembers, true) + .to.include.deep.members(subset); + } + + /** + * ### .notIncludeDeepMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in any order. Uses a + * deep equality check. Duplicates are ignored. + * + * assert.notIncludeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { f: 5 } ], 'not include deep members'); + * + * @name notIncludeDeepMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeDeepMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeDeepMembers, true) + .to.not.include.deep.members(subset); + } + + /** + * ### .includeOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in the same order + * beginning with the first element in `superset`. Uses a strict equality + * check (===). + * + * assert.includeOrderedMembers([ 1, 2, 3 ], [ 1, 2 ], 'include ordered members'); + * + * @name includeOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeOrderedMembers, true) + .to.include.ordered.members(subset); + } + + /** + * ### .notIncludeOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in the same order + * beginning with the first element in `superset`. Uses a strict equality + * check (===). + * + * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 1 ], 'not include ordered members'); + * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 3 ], 'not include ordered members'); + * + * @name notIncludeOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeOrderedMembers, true) + .to.not.include.ordered.members(subset); + } + + /** + * ### .includeDeepOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in the same order + * beginning with the first element in `superset`. Uses a deep equality + * check. + * + * assert.includeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 } ], 'include deep ordered members'); + * + * @name includeDeepOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeDeepOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeDeepOrderedMembers, true) + .to.include.deep.ordered.members(subset); + } + + /** + * ### .notIncludeDeepOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in the same order + * beginning with the first element in `superset`. Uses a deep equality + * check. + * + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { f: 5 } ], 'not include deep ordered members'); + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 } ], 'not include deep ordered members'); + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { c: 3 } ], 'not include deep ordered members'); + * + * @name notIncludeDeepOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true) + .to.not.include.deep.ordered.members(subset); + } + + /** + * ### .oneOf(inList, list, [message]) + * + * Asserts that non-object, non-array value `inList` appears in the flat array `list`. + * + * assert.oneOf(1, [ 2, 1 ], 'Not found in list'); + * + * @name oneOf + * @param {*} inList + * @param {Array<*>} list + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.oneOf = function (inList, list, msg) { + new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list); + } + + /** + * ### .changes(function, object, property, [message]) + * + * Asserts that a function changes the value of a property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 22 }; + * assert.changes(fn, obj, 'val'); + * + * @name changes + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changes = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changes, true).to.change(obj, prop); + } + + /** + * ### .changesBy(function, object, property, delta, [message]) + * + * Asserts that a function changes the value of a property by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 2 }; + * assert.changesBy(fn, obj, 'val', 2); + * + * @name changesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changesBy, true) + .to.change(obj, prop).by(delta); + } + + /** + * ### .doesNotChange(function, object, property, [message]) + * + * Asserts that a function does not change the value of a property. + * + * var obj = { val: 10 }; + * var fn = function() { console.log('foo'); }; + * assert.doesNotChange(fn, obj, 'val'); + * + * @name doesNotChange + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotChange = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotChange, true) + .to.not.change(obj, prop); + } + + /** + * ### .changesButNotBy(function, object, property, delta, [message]) + * + * Asserts that a function does not change the value of a property or of a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 10 }; + * assert.changesButNotBy(fn, obj, 'val', 5); + * + * @name changesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changesButNotBy, true) + .to.change(obj, prop).but.not.by(delta); + } + + /** + * ### .increases(function, object, property, [message]) + * + * Asserts that a function increases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 13 }; + * assert.increases(fn, obj, 'val'); + * + * @name increases + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increases = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.increases, true) + .to.increase(obj, prop); + } + + /** + * ### .increasesBy(function, object, property, delta, [message]) + * + * Asserts that a function increases a numeric object property or a function's return value by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 10 }; + * assert.increasesBy(fn, obj, 'val', 10); + * + * @name increasesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increasesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.increasesBy, true) + .to.increase(obj, prop).by(delta); + } + + /** + * ### .doesNotIncrease(function, object, property, [message]) + * + * Asserts that a function does not increase a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 8 }; + * assert.doesNotIncrease(fn, obj, 'val'); + * + * @name doesNotIncrease + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotIncrease = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotIncrease, true) + .to.not.increase(obj, prop); + } + + /** + * ### .increasesButNotBy(function, object, property, delta, [message]) + * + * Asserts that a function does not increase a numeric object property or function's return value by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 15 }; + * assert.increasesButNotBy(fn, obj, 'val', 10); + * + * @name increasesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increasesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.increasesButNotBy, true) + .to.increase(obj, prop).but.not.by(delta); + } + + /** + * ### .decreases(function, object, property, [message]) + * + * Asserts that a function decreases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.decreases(fn, obj, 'val'); + * + * @name decreases + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreases = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.decreases, true) + .to.decrease(obj, prop); + } + + /** + * ### .decreasesBy(function, object, property, delta, [message]) + * + * Asserts that a function decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val -= 5 }; + * assert.decreasesBy(fn, obj, 'val', 5); + * + * @name decreasesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreasesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.decreasesBy, true) + .to.decrease(obj, prop).by(delta); + } + + /** + * ### .doesNotDecrease(function, object, property, [message]) + * + * Asserts that a function does not decreases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 15 }; + * assert.doesNotDecrease(fn, obj, 'val'); + * + * @name doesNotDecrease + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotDecrease = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotDecrease, true) + .to.not.decrease(obj, prop); + } + + /** + * ### .doesNotDecreaseBy(function, object, property, delta, [message]) + * + * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.doesNotDecreaseBy(fn, obj, 'val', 1); + * + * @name doesNotDecreaseBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotDecreaseBy, true) + .to.not.decrease(obj, prop).by(delta); + } + + /** + * ### .decreasesButNotBy(function, object, property, delta, [message]) + * + * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.decreasesButNotBy(fn, obj, 'val', 1); + * + * @name decreasesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.decreasesButNotBy, true) + .to.decrease(obj, prop).but.not.by(delta); + } + + /*! + * ### .ifError(object) + * + * Asserts if value is not a false value, and throws if it is a true value. + * This is added to allow for chai to be a drop-in replacement for Node's + * assert class. + * + * var err = new Error('I am a custom error'); + * assert.ifError(err); // Rethrows err! + * + * @name ifError + * @param {Object} object + * @namespace Assert + * @api public + */ + + assert.ifError = function (val) { + if (val) { + throw(val); + } + }; + + /** + * ### .isExtensible(object) + * + * Asserts that `object` is extensible (can have new properties added to it). + * + * assert.isExtensible({}); + * + * @name isExtensible + * @alias extensible + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isExtensible = function (obj, msg) { + new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible; + }; + + /** + * ### .isNotExtensible(object) + * + * Asserts that `object` is _not_ extensible. + * + * var nonExtensibleObject = Object.preventExtensions({}); + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freeze({}); + * + * assert.isNotExtensible(nonExtensibleObject); + * assert.isNotExtensible(sealedObject); + * assert.isNotExtensible(frozenObject); + * + * @name isNotExtensible + * @alias notExtensible + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotExtensible = function (obj, msg) { + new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible; + }; + + /** + * ### .isSealed(object) + * + * Asserts that `object` is sealed (cannot have new properties added to it + * and its existing properties cannot be removed). + * + * var sealedObject = Object.seal({}); + * var frozenObject = Object.seal({}); + * + * assert.isSealed(sealedObject); + * assert.isSealed(frozenObject); + * + * @name isSealed + * @alias sealed + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isSealed = function (obj, msg) { + new Assertion(obj, msg, assert.isSealed, true).to.be.sealed; + }; + + /** + * ### .isNotSealed(object) + * + * Asserts that `object` is _not_ sealed. + * + * assert.isNotSealed({}); + * + * @name isNotSealed + * @alias notSealed + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotSealed = function (obj, msg) { + new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed; + }; + + /** + * ### .isFrozen(object) + * + * Asserts that `object` is frozen (cannot have new properties added to it + * and its existing properties cannot be modified). + * + * var frozenObject = Object.freeze({}); + * assert.frozen(frozenObject); + * + * @name isFrozen + * @alias frozen + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isFrozen = function (obj, msg) { + new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen; + }; + + /** + * ### .isNotFrozen(object) + * + * Asserts that `object` is _not_ frozen. + * + * assert.isNotFrozen({}); + * + * @name isNotFrozen + * @alias notFrozen + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotFrozen = function (obj, msg) { + new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen; + }; + + /** + * ### .isEmpty(target) + * + * Asserts that the target does not contain any values. + * For arrays and strings, it checks the `length` property. + * For `Map` and `Set` instances, it checks the `size` property. + * For non-function objects, it gets the count of own + * enumerable string keys. + * + * assert.isEmpty([]); + * assert.isEmpty(''); + * assert.isEmpty(new Map); + * assert.isEmpty({}); + * + * @name isEmpty + * @alias empty + * @param {Object|Array|String|Map|Set} target + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isEmpty = function(val, msg) { + new Assertion(val, msg, assert.isEmpty, true).to.be.empty; + }; + + /** + * ### .isNotEmpty(target) + * + * Asserts that the target contains values. + * For arrays and strings, it checks the `length` property. + * For `Map` and `Set` instances, it checks the `size` property. + * For non-function objects, it gets the count of own + * enumerable string keys. + * + * assert.isNotEmpty([1, 2]); + * assert.isNotEmpty('34'); + * assert.isNotEmpty(new Set([5, 6])); + * assert.isNotEmpty({ key: 7 }); + * + * @name isNotEmpty + * @alias notEmpty + * @param {Object|Array|String|Map|Set} target + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotEmpty = function(val, msg) { + new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty; + }; + + /*! + * Aliases. + */ + + (function alias(name, as){ + assert[as] = assert[name]; + return alias; + }) + ('isOk', 'ok') + ('isNotOk', 'notOk') + ('throws', 'throw') + ('throws', 'Throw') + ('isExtensible', 'extensible') + ('isNotExtensible', 'notExtensible') + ('isSealed', 'sealed') + ('isNotSealed', 'notSealed') + ('isFrozen', 'frozen') + ('isNotFrozen', 'notFrozen') + ('isEmpty', 'empty') + ('isNotEmpty', 'notEmpty'); +}; + +},{}],7:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, util) { + chai.expect = function (val, message) { + return new chai.Assertion(val, message); + }; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * expect.fail(); + * expect.fail("custom error message"); + * expect.fail(1, 2); + * expect.fail(1, 2, "custom error message"); + * expect.fail(1, 2, "custom error message", ">"); + * expect.fail(1, 2, undefined, ">"); + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace BDD + * @api public + */ + + chai.expect.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + message = actual; + actual = undefined; + } + + message = message || 'expect.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, chai.expect.fail); + }; +}; + +},{}],8:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, util) { + var Assertion = chai.Assertion; + + function loadShould () { + // explicitly define this method as function as to have it's name to include as `ssfi` + function shouldGetter() { + if (this instanceof String + || this instanceof Number + || this instanceof Boolean + || typeof Symbol === 'function' && this instanceof Symbol + || typeof BigInt === 'function' && this instanceof BigInt) { + return new Assertion(this.valueOf(), null, shouldGetter); + } + return new Assertion(this, null, shouldGetter); + } + function shouldSetter(value) { + // See https://github.com/chaijs/chai/issues/86: this makes + // `whatever.should = someValue` actually set `someValue`, which is + // especially useful for `global.should = require('chai').should()`. + // + // Note that we have to use [[DefineProperty]] instead of [[Put]] + // since otherwise we would trigger this very setter! + Object.defineProperty(this, 'should', { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } + // modify Object.prototype to have `should` + Object.defineProperty(Object.prototype, 'should', { + set: shouldSetter + , get: shouldGetter + , configurable: true + }); + + var should = {}; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * should.fail(); + * should.fail("custom error message"); + * should.fail(1, 2); + * should.fail(1, 2, "custom error message"); + * should.fail(1, 2, "custom error message", ">"); + * should.fail(1, 2, undefined, ">"); + * + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace BDD + * @api public + */ + + should.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + message = actual; + actual = undefined; + } + + message = message || 'should.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, should.fail); + }; + + /** + * ### .equal(actual, expected, [message]) + * + * Asserts non-strict equality (`==`) of `actual` and `expected`. + * + * should.equal(3, '3', '== coerces values to strings'); + * + * @name equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Should + * @api public + */ + + should.equal = function (val1, val2, msg) { + new Assertion(val1, msg).to.equal(val2); + }; + + /** + * ### .throw(function, [constructor/string/regexp], [string/regexp], [message]) + * + * Asserts that `function` will throw an error that is an instance of + * `constructor`, or alternately that it will throw an error with message + * matching `regexp`. + * + * should.throw(fn, 'function throws a reference error'); + * should.throw(fn, /function throws a reference error/); + * should.throw(fn, ReferenceError); + * should.throw(fn, ReferenceError, 'function throws a reference error'); + * should.throw(fn, ReferenceError, /function throws a reference error/); + * + * @name throw + * @alias Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Should + * @api public + */ + + should.Throw = function (fn, errt, errs, msg) { + new Assertion(fn, msg).to.Throw(errt, errs); + }; + + /** + * ### .exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var foo = 'hi'; + * + * should.exist(foo, 'foo exists'); + * + * @name exist + * @namespace Should + * @api public + */ + + should.exist = function (val, msg) { + new Assertion(val, msg).to.exist; + } + + // negation + should.not = {} + + /** + * ### .not.equal(actual, expected, [message]) + * + * Asserts non-strict inequality (`!=`) of `actual` and `expected`. + * + * should.not.equal(3, 4, 'these numbers are not equal'); + * + * @name not.equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Should + * @api public + */ + + should.not.equal = function (val1, val2, msg) { + new Assertion(val1, msg).to.not.equal(val2); + }; + + /** + * ### .throw(function, [constructor/regexp], [message]) + * + * Asserts that `function` will _not_ throw an error that is an instance of + * `constructor`, or alternately that it will not throw an error with message + * matching `regexp`. + * + * should.not.throw(fn, Error, 'function does not throw'); + * + * @name not.throw + * @alias not.Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Should + * @api public + */ + + should.not.Throw = function (fn, errt, errs, msg) { + new Assertion(fn, msg).to.not.Throw(errt, errs); + }; + + /** + * ### .not.exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var bar = null; + * + * should.not.exist(bar, 'bar does not exist'); + * + * @name not.exist + * @namespace Should + * @api public + */ + + should.not.exist = function (val, msg) { + new Assertion(val, msg).to.not.exist; + } + + should['throw'] = should['Throw']; + should.not['throw'] = should.not['Throw']; + + return should; + }; + + chai.should = loadShould; + chai.Should = loadShould; +}; + +},{}],9:[function(require,module,exports){ +/*! + * Chai - addChainingMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var addLengthGuard = require('./addLengthGuard'); +var chai = require('../../chai'); +var flag = require('./flag'); +var proxify = require('./proxify'); +var transferFlags = require('./transferFlags'); + +/*! + * Module variables + */ + +// Check whether `Object.setPrototypeOf` is supported +var canSetPrototype = typeof Object.setPrototypeOf === 'function'; + +// Without `Object.setPrototypeOf` support, this module will need to add properties to a function. +// However, some of functions' own props are not configurable and should be skipped. +var testFn = function() {}; +var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) { + var propDesc = Object.getOwnPropertyDescriptor(testFn, name); + + // Note: PhantomJS 1.x includes `callee` as one of `testFn`'s own properties, + // but then returns `undefined` as the property descriptor for `callee`. As a + // workaround, we perform an otherwise unnecessary type-check for `propDesc`, + // and then filter it out if it's not an object as it should be. + if (typeof propDesc !== 'object') + return true; + + return !propDesc.configurable; +}); + +// Cache `Function` properties +var call = Function.prototype.call, + apply = Function.prototype.apply; + +/** + * ### .addChainableMethod(ctx, name, method, chainingBehavior) + * + * Adds a method to an object, such that the method can also be chained. + * + * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.equal(str); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); + * + * The result can then be used as both a method assertion, executing both `method` and + * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`. + * + * expect(fooStr).to.be.foo('bar'); + * expect(fooStr).to.be.foo.equal('foo'); + * + * @param {Object} ctx object to which the method is added + * @param {String} name of method to add + * @param {Function} method function to be used for `name`, when called + * @param {Function} chainingBehavior function to be called every time the property is accessed + * @namespace Utils + * @name addChainableMethod + * @api public + */ + +module.exports = function addChainableMethod(ctx, name, method, chainingBehavior) { + if (typeof chainingBehavior !== 'function') { + chainingBehavior = function () { }; + } + + var chainableBehavior = { + method: method + , chainingBehavior: chainingBehavior + }; + + // save the methods so we can overwrite them later, if we need to. + if (!ctx.__methods) { + ctx.__methods = {}; + } + ctx.__methods[name] = chainableBehavior; + + Object.defineProperty(ctx, name, + { get: function chainableMethodGetter() { + chainableBehavior.chainingBehavior.call(this); + + var chainableMethodWrapper = function () { + // Setting the `ssfi` flag to `chainableMethodWrapper` causes this + // function to be the starting point for removing implementation + // frames from the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then this assertion is being + // invoked from inside of another assertion. In this case, the `ssfi` + // flag has already been set by the outer assertion. + // + // Note that overwriting a chainable method merely replaces the saved + // methods in `ctx.__methods` instead of completely replacing the + // overwritten assertion. Therefore, an overwriting assertion won't + // set the `ssfi` or `lockSsfi` flags. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', chainableMethodWrapper); + } + + var result = chainableBehavior.method.apply(this, arguments); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + addLengthGuard(chainableMethodWrapper, name, true); + + // Use `Object.setPrototypeOf` if available + if (canSetPrototype) { + // Inherit all properties from the object by replacing the `Function` prototype + var prototype = Object.create(this); + // Restore the `call` and `apply` methods from `Function` + prototype.call = call; + prototype.apply = apply; + Object.setPrototypeOf(chainableMethodWrapper, prototype); + } + // Otherwise, redefine all properties (slow!) + else { + var asserterNames = Object.getOwnPropertyNames(ctx); + asserterNames.forEach(function (asserterName) { + if (excludeNames.indexOf(asserterName) !== -1) { + return; + } + + var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); + Object.defineProperty(chainableMethodWrapper, asserterName, pd); + }); + } + + transferFlags(this, chainableMethodWrapper); + return proxify(chainableMethodWrapper); + } + , configurable: true + }); +}; + +},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":30,"./transferFlags":32}],10:[function(require,module,exports){ +var fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length'); + +/*! + * Chai - addLengthGuard utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .addLengthGuard(fn, assertionName, isChainable) + * + * Define `length` as a getter on the given uninvoked method assertion. The + * getter acts as a guard against chaining `length` directly off of an uninvoked + * method assertion, which is a problem because it references `function`'s + * built-in `length` property instead of Chai's `length` assertion. When the + * getter catches the user making this mistake, it throws an error with a + * helpful message. + * + * There are two ways in which this mistake can be made. The first way is by + * chaining the `length` assertion directly off of an uninvoked chainable + * method. In this case, Chai suggests that the user use `lengthOf` instead. The + * second way is by chaining the `length` assertion directly off of an uninvoked + * non-chainable method. Non-chainable methods must be invoked prior to + * chaining. In this case, Chai suggests that the user consult the docs for the + * given assertion. + * + * If the `length` property of functions is unconfigurable, then return `fn` + * without modification. + * + * Note that in ES6, the function's `length` property is configurable, so once + * support for legacy environments is dropped, Chai's `length` property can + * replace the built-in function's `length` property, and this length guard will + * no longer be necessary. In the mean time, maintaining consistency across all + * environments is the priority. + * + * @param {Function} fn + * @param {String} assertionName + * @param {Boolean} isChainable + * @namespace Utils + * @name addLengthGuard + */ + +module.exports = function addLengthGuard (fn, assertionName, isChainable) { + if (!fnLengthDesc.configurable) return fn; + + Object.defineProperty(fn, 'length', { + get: function () { + if (isChainable) { + throw Error('Invalid Chai property: ' + assertionName + '.length. Due' + + ' to a compatibility issue, "length" cannot directly follow "' + + assertionName + '". Use "' + assertionName + '.lengthOf" instead.'); + } + + throw Error('Invalid Chai property: ' + assertionName + '.length. See' + + ' docs for proper usage of "' + assertionName + '".'); + } + }); + + return fn; +}; + +},{}],11:[function(require,module,exports){ +/*! + * Chai - addMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var addLengthGuard = require('./addLengthGuard'); +var chai = require('../../chai'); +var flag = require('./flag'); +var proxify = require('./proxify'); +var transferFlags = require('./transferFlags'); + +/** + * ### .addMethod(ctx, name, method) + * + * Adds a method to the prototype of an object. + * + * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.equal(str); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addMethod('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(fooStr).to.be.foo('bar'); + * + * @param {Object} ctx object to which the method is added + * @param {String} name of method to add + * @param {Function} method function to be used for name + * @namespace Utils + * @name addMethod + * @api public + */ + +module.exports = function addMethod(ctx, name, method) { + var methodWrapper = function () { + // Setting the `ssfi` flag to `methodWrapper` causes this function to be the + // starting point for removing implementation frames from the stack trace of + // a failed assertion. + // + // However, we only want to use this function as the starting point if the + // `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked from + // inside of another assertion. In the first case, the `ssfi` flag has + // already been set by the overwriting assertion. In the second case, the + // `ssfi` flag has already been set by the outer assertion. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', methodWrapper); + } + + var result = method.apply(this, arguments); + if (result !== undefined) + return result; + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + addLengthGuard(methodWrapper, name, false); + ctx[name] = proxify(methodWrapper, name); +}; + +},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":30,"./transferFlags":32}],12:[function(require,module,exports){ +/*! + * Chai - addProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var chai = require('../../chai'); +var flag = require('./flag'); +var isProxyEnabled = require('./isProxyEnabled'); +var transferFlags = require('./transferFlags'); + +/** + * ### .addProperty(ctx, name, getter) + * + * Adds a property to the prototype of an object. + * + * utils.addProperty(chai.Assertion.prototype, 'foo', function () { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.instanceof(Foo); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addProperty('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.be.foo; + * + * @param {Object} ctx object to which the property is added + * @param {String} name of property to add + * @param {Function} getter function to be used for name + * @namespace Utils + * @name addProperty + * @api public + */ + +module.exports = function addProperty(ctx, name, getter) { + getter = getter === undefined ? function () {} : getter; + + Object.defineProperty(ctx, name, + { get: function propertyGetter() { + // Setting the `ssfi` flag to `propertyGetter` causes this function to + // be the starting point for removing implementation frames from the + // stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set and proxy protection is disabled. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked + // from inside of another assertion. In the first case, the `ssfi` flag + // has already been set by the overwriting assertion. In the second + // case, the `ssfi` flag has already been set by the outer assertion. + // + // If proxy protection is enabled, then the `ssfi` flag has already been + // set by the proxy getter. + if (!isProxyEnabled() && !flag(this, 'lockSsfi')) { + flag(this, 'ssfi', propertyGetter); + } + + var result = getter.call(this); + if (result !== undefined) + return result; + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + } + , configurable: true + }); +}; + +},{"../../chai":2,"./flag":15,"./isProxyEnabled":25,"./transferFlags":32}],13:[function(require,module,exports){ +/*! + * Chai - compareByInspect utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var inspect = require('./inspect'); + +/** + * ### .compareByInspect(mixed, mixed) + * + * To be used as a compareFunction with Array.prototype.sort. Compares elements + * using inspect instead of default behavior of using toString so that Symbols + * and objects with irregular/missing toString can still be sorted without a + * TypeError. + * + * @param {Mixed} first element to compare + * @param {Mixed} second element to compare + * @returns {Number} -1 if 'a' should come before 'b'; otherwise 1 + * @name compareByInspect + * @namespace Utils + * @api public + */ + +module.exports = function compareByInspect(a, b) { + return inspect(a) < inspect(b) ? -1 : 1; +}; + +},{"./inspect":23}],14:[function(require,module,exports){ +/*! + * Chai - expectTypes utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .expectTypes(obj, types) + * + * Ensures that the object being tested against is of a valid type. + * + * utils.expectTypes(this, ['array', 'object', 'string']); + * + * @param {Mixed} obj constructed Assertion + * @param {Array} type A list of allowed types for this assertion + * @namespace Utils + * @name expectTypes + * @api public + */ + +var AssertionError = require('assertion-error'); +var flag = require('./flag'); +var type = require('type-detect'); + +module.exports = function expectTypes(obj, types) { + var flagMsg = flag(obj, 'message'); + var ssfi = flag(obj, 'ssfi'); + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + obj = flag(obj, 'object'); + types = types.map(function (t) { return t.toLowerCase(); }); + types.sort(); + + // Transforms ['lorem', 'ipsum'] into 'a lorem, or an ipsum' + var str = types.map(function (t, index) { + var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a'; + var or = types.length > 1 && index === types.length - 1 ? 'or ' : ''; + return or + art + ' ' + t; + }).join(', '); + + var objType = type(obj).toLowerCase(); + + if (!types.some(function (expected) { return objType === expected; })) { + throw new AssertionError( + flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given', + undefined, + ssfi + ); + } +}; + +},{"./flag":15,"assertion-error":33,"type-detect":39}],15:[function(require,module,exports){ +/*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .flag(object, key, [value]) + * + * Get or set a flag value on an object. If a + * value is provided it will be set, else it will + * return the currently set value or `undefined` if + * the value is not set. + * + * utils.flag(this, 'foo', 'bar'); // setter + * utils.flag(this, 'foo'); // getter, returns `bar` + * + * @param {Object} object constructed Assertion + * @param {String} key + * @param {Mixed} value (optional) + * @namespace Utils + * @name flag + * @api private + */ + +module.exports = function flag(obj, key, value) { + var flags = obj.__flags || (obj.__flags = Object.create(null)); + if (arguments.length === 3) { + flags[key] = value; + } else { + return flags[key]; + } +}; + +},{}],16:[function(require,module,exports){ +/*! + * Chai - getActual utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .getActual(object, [actual]) + * + * Returns the `actual` value for an Assertion. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getActual + */ + +module.exports = function getActual(obj, args) { + return args.length > 4 ? args[4] : obj._obj; +}; + +},{}],17:[function(require,module,exports){ +/*! + * Chai - message composition utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var flag = require('./flag') + , getActual = require('./getActual') + , objDisplay = require('./objDisplay'); + +/** + * ### .getMessage(object, message, negateMessage) + * + * Construct the error message based on flags + * and template tags. Template tags will return + * a stringified inspection of the object referenced. + * + * Message template tags: + * - `#{this}` current asserted object + * - `#{act}` actual value + * - `#{exp}` expected value + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getMessage + * @api public + */ + +module.exports = function getMessage(obj, args) { + var negate = flag(obj, 'negate') + , val = flag(obj, 'object') + , expected = args[3] + , actual = getActual(obj, args) + , msg = negate ? args[2] : args[1] + , flagMsg = flag(obj, 'message'); + + if(typeof msg === "function") msg = msg(); + msg = msg || ''; + msg = msg + .replace(/#\{this\}/g, function () { return objDisplay(val); }) + .replace(/#\{act\}/g, function () { return objDisplay(actual); }) + .replace(/#\{exp\}/g, function () { return objDisplay(expected); }); + + return flagMsg ? flagMsg + ': ' + msg : msg; +}; + +},{"./flag":15,"./getActual":16,"./objDisplay":26}],18:[function(require,module,exports){ +var type = require('type-detect'); + +var flag = require('./flag'); + +function isObjectType(obj) { + var objectType = type(obj); + var objectTypes = ['Array', 'Object', 'function']; + + return objectTypes.indexOf(objectType) !== -1; +} + +/** + * ### .getOperator(message) + * + * Extract the operator from error message. + * Operator defined is based on below link + * https://nodejs.org/api/assert.html#assert_assert. + * + * Returns the `operator` or `undefined` value for an Assertion. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getOperator + * @api public + */ + +module.exports = function getOperator(obj, args) { + var operator = flag(obj, 'operator'); + var negate = flag(obj, 'negate'); + var expected = args[3]; + var msg = negate ? args[2] : args[1]; + + if (operator) { + return operator; + } + + if (typeof msg === 'function') msg = msg(); + + msg = msg || ''; + if (!msg) { + return undefined; + } + + if (/\shave\s/.test(msg)) { + return undefined; + } + + var isObject = isObjectType(expected); + if (/\snot\s/.test(msg)) { + return isObject ? 'notDeepStrictEqual' : 'notStrictEqual'; + } + + return isObject ? 'deepStrictEqual' : 'strictEqual'; +}; + +},{"./flag":15,"type-detect":39}],19:[function(require,module,exports){ +/*! + * Chai - getOwnEnumerableProperties utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var getOwnEnumerablePropertySymbols = require('./getOwnEnumerablePropertySymbols'); + +/** + * ### .getOwnEnumerableProperties(object) + * + * This allows the retrieval of directly-owned enumerable property names and + * symbols of an object. This function is necessary because Object.keys only + * returns enumerable property names, not enumerable property symbols. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getOwnEnumerableProperties + * @api public + */ + +module.exports = function getOwnEnumerableProperties(obj) { + return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj)); +}; + +},{"./getOwnEnumerablePropertySymbols":20}],20:[function(require,module,exports){ +/*! + * Chai - getOwnEnumerablePropertySymbols utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + +/** + * ### .getOwnEnumerablePropertySymbols(object) + * + * This allows the retrieval of directly-owned enumerable property symbols of an + * object. This function is necessary because Object.getOwnPropertySymbols + * returns both enumerable and non-enumerable property symbols. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getOwnEnumerablePropertySymbols + * @api public + */ + +module.exports = function getOwnEnumerablePropertySymbols(obj) { + if (typeof Object.getOwnPropertySymbols !== 'function') return []; + + return Object.getOwnPropertySymbols(obj).filter(function (sym) { + return Object.getOwnPropertyDescriptor(obj, sym).enumerable; + }); +}; + +},{}],21:[function(require,module,exports){ +/*! + * Chai - getProperties utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .getProperties(object) + * + * This allows the retrieval of property names of an object, enumerable or not, + * inherited or not. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getProperties + * @api public + */ + +module.exports = function getProperties(object) { + var result = Object.getOwnPropertyNames(object); + + function addProperty(property) { + if (result.indexOf(property) === -1) { + result.push(property); + } + } + + var proto = Object.getPrototypeOf(object); + while (proto !== null) { + Object.getOwnPropertyNames(proto).forEach(addProperty); + proto = Object.getPrototypeOf(proto); + } + + return result; +}; + +},{}],22:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011 Jake Luer + * MIT Licensed + */ + +/*! + * Dependencies that are used for multiple exports are required here only once + */ + +var pathval = require('pathval'); + +/*! + * test utility + */ + +exports.test = require('./test'); + +/*! + * type utility + */ + +exports.type = require('type-detect'); + +/*! + * expectTypes utility + */ +exports.expectTypes = require('./expectTypes'); + +/*! + * message utility + */ + +exports.getMessage = require('./getMessage'); + +/*! + * actual utility + */ + +exports.getActual = require('./getActual'); + +/*! + * Inspect util + */ + +exports.inspect = require('./inspect'); + +/*! + * Object Display util + */ + +exports.objDisplay = require('./objDisplay'); + +/*! + * Flag utility + */ + +exports.flag = require('./flag'); + +/*! + * Flag transferring utility + */ + +exports.transferFlags = require('./transferFlags'); + +/*! + * Deep equal utility + */ + +exports.eql = require('deep-eql'); + +/*! + * Deep path info + */ + +exports.getPathInfo = pathval.getPathInfo; + +/*! + * Check if a property exists + */ + +exports.hasProperty = pathval.hasProperty; + +/*! + * Function name + */ + +exports.getName = require('get-func-name'); + +/*! + * add Property + */ + +exports.addProperty = require('./addProperty'); + +/*! + * add Method + */ + +exports.addMethod = require('./addMethod'); + +/*! + * overwrite Property + */ + +exports.overwriteProperty = require('./overwriteProperty'); + +/*! + * overwrite Method + */ + +exports.overwriteMethod = require('./overwriteMethod'); + +/*! + * Add a chainable method + */ + +exports.addChainableMethod = require('./addChainableMethod'); + +/*! + * Overwrite chainable method + */ + +exports.overwriteChainableMethod = require('./overwriteChainableMethod'); + +/*! + * Compare by inspect method + */ + +exports.compareByInspect = require('./compareByInspect'); + +/*! + * Get own enumerable property symbols method + */ + +exports.getOwnEnumerablePropertySymbols = require('./getOwnEnumerablePropertySymbols'); + +/*! + * Get own enumerable properties method + */ + +exports.getOwnEnumerableProperties = require('./getOwnEnumerableProperties'); + +/*! + * Checks error against a given set of criteria + */ + +exports.checkError = require('check-error'); + +/*! + * Proxify util + */ + +exports.proxify = require('./proxify'); + +/*! + * addLengthGuard util + */ + +exports.addLengthGuard = require('./addLengthGuard'); + +/*! + * isProxyEnabled helper + */ + +exports.isProxyEnabled = require('./isProxyEnabled'); + +/*! + * isNaN method + */ + +exports.isNaN = require('./isNaN'); + +/*! + * getOperator method + */ + +exports.getOperator = require('./getOperator'); +},{"./addChainableMethod":9,"./addLengthGuard":10,"./addMethod":11,"./addProperty":12,"./compareByInspect":13,"./expectTypes":14,"./flag":15,"./getActual":16,"./getMessage":17,"./getOperator":18,"./getOwnEnumerableProperties":19,"./getOwnEnumerablePropertySymbols":20,"./inspect":23,"./isNaN":24,"./isProxyEnabled":25,"./objDisplay":26,"./overwriteChainableMethod":27,"./overwriteMethod":28,"./overwriteProperty":29,"./proxify":30,"./test":31,"./transferFlags":32,"check-error":34,"deep-eql":35,"get-func-name":36,"pathval":38,"type-detect":39}],23:[function(require,module,exports){ +// This is (almost) directly from Node.js utils +// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js + +var getName = require('get-func-name'); +var loupe = require('loupe'); +var config = require('../config'); + +module.exports = inspect; + +/** + * ### .inspect(obj, [showHidden], [depth], [colors]) + * + * Echoes the value of a value. Tries to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Boolean} showHidden Flag that shows hidden (not enumerable) + * properties of objects. Default is false. + * @param {Number} depth Depth in which to descend in object. Default is 2. + * @param {Boolean} colors Flag to turn on ANSI escape codes to color the + * output. Default is false (no coloring). + * @namespace Utils + * @name inspect + */ +function inspect(obj, showHidden, depth, colors) { + var options = { + colors: colors, + depth: (typeof depth === 'undefined' ? 2 : depth), + showHidden: showHidden, + truncate: config.truncateThreshold ? config.truncateThreshold : Infinity, + }; + return loupe.inspect(obj, options); +} + +},{"../config":4,"get-func-name":36,"loupe":37}],24:[function(require,module,exports){ +/*! + * Chai - isNaN utility + * Copyright(c) 2012-2015 Sakthipriyan Vairamani + * MIT Licensed + */ + +/** + * ### .isNaN(value) + * + * Checks if the given value is NaN or not. + * + * utils.isNaN(NaN); // true + * + * @param {Value} The value which has to be checked if it is NaN + * @name isNaN + * @api private + */ + +function isNaN(value) { + // Refer http://www.ecma-international.org/ecma-262/6.0/#sec-isnan-number + // section's NOTE. + return value !== value; +} + +// If ECMAScript 6's Number.isNaN is present, prefer that. +module.exports = Number.isNaN || isNaN; + +},{}],25:[function(require,module,exports){ +var config = require('../config'); + +/*! + * Chai - isProxyEnabled helper + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .isProxyEnabled() + * + * Helper function to check if Chai's proxy protection feature is enabled. If + * proxies are unsupported or disabled via the user's Chai config, then return + * false. Otherwise, return true. + * + * @namespace Utils + * @name isProxyEnabled + */ + +module.exports = function isProxyEnabled() { + return config.useProxy && + typeof Proxy !== 'undefined' && + typeof Reflect !== 'undefined'; +}; + +},{"../config":4}],26:[function(require,module,exports){ +/*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var inspect = require('./inspect'); +var config = require('../config'); + +/** + * ### .objDisplay(object) + * + * Determines if an object or an array matches + * criteria to be inspected in-line for error + * messages or should be truncated. + * + * @param {Mixed} javascript object to inspect + * @returns {string} stringified object + * @name objDisplay + * @namespace Utils + * @api public + */ + +module.exports = function objDisplay(obj) { + var str = inspect(obj) + , type = Object.prototype.toString.call(obj); + + if (config.truncateThreshold && str.length >= config.truncateThreshold) { + if (type === '[object Function]') { + return !obj.name || obj.name === '' + ? '[Function]' + : '[Function: ' + obj.name + ']'; + } else if (type === '[object Array]') { + return '[ Array(' + obj.length + ') ]'; + } else if (type === '[object Object]') { + var keys = Object.keys(obj) + , kstr = keys.length > 2 + ? keys.splice(0, 2).join(', ') + ', ...' + : keys.join(', '); + return '{ Object (' + kstr + ') }'; + } else { + return str; + } + } else { + return str; + } +}; + +},{"../config":4,"./inspect":23}],27:[function(require,module,exports){ +/*! + * Chai - overwriteChainableMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var chai = require('../../chai'); +var transferFlags = require('./transferFlags'); + +/** + * ### .overwriteChainableMethod(ctx, name, method, chainingBehavior) + * + * Overwrites an already existing chainable method + * and provides access to the previous function or + * property. Must return functions to be used for + * name. + * + * utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf', + * function (_super) { + * } + * , function (_super) { + * } + * ); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteChainableMethod('foo', fn, fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.have.lengthOf(3); + * expect(myFoo).to.have.lengthOf.above(3); + * + * @param {Object} ctx object whose method / property is to be overwritten + * @param {String} name of method / property to overwrite + * @param {Function} method function that returns a function to be used for name + * @param {Function} chainingBehavior function that returns a function to be used for property + * @namespace Utils + * @name overwriteChainableMethod + * @api public + */ + +module.exports = function overwriteChainableMethod(ctx, name, method, chainingBehavior) { + var chainableBehavior = ctx.__methods[name]; + + var _chainingBehavior = chainableBehavior.chainingBehavior; + chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() { + var result = chainingBehavior(_chainingBehavior).call(this); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + var _method = chainableBehavior.method; + chainableBehavior.method = function overwritingChainableMethodWrapper() { + var result = method(_method).apply(this, arguments); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; +}; + +},{"../../chai":2,"./transferFlags":32}],28:[function(require,module,exports){ +/*! + * Chai - overwriteMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var addLengthGuard = require('./addLengthGuard'); +var chai = require('../../chai'); +var flag = require('./flag'); +var proxify = require('./proxify'); +var transferFlags = require('./transferFlags'); + +/** + * ### .overwriteMethod(ctx, name, fn) + * + * Overwrites an already existing method and provides + * access to previous function. Must return function + * to be used for name. + * + * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) { + * return function (str) { + * var obj = utils.flag(this, 'object'); + * if (obj instanceof Foo) { + * new chai.Assertion(obj.value).to.equal(str); + * } else { + * _super.apply(this, arguments); + * } + * } + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteMethod('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.equal('bar'); + * + * @param {Object} ctx object whose method is to be overwritten + * @param {String} name of method to overwrite + * @param {Function} method function that returns a function to be used for name + * @namespace Utils + * @name overwriteMethod + * @api public + */ + +module.exports = function overwriteMethod(ctx, name, method) { + var _method = ctx[name] + , _super = function () { + throw new Error(name + ' is not a function'); + }; + + if (_method && 'function' === typeof _method) + _super = _method; + + var overwritingMethodWrapper = function () { + // Setting the `ssfi` flag to `overwritingMethodWrapper` causes this + // function to be the starting point for removing implementation frames from + // the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if the + // `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked from + // inside of another assertion. In the first case, the `ssfi` flag has + // already been set by the overwriting assertion. In the second case, the + // `ssfi` flag has already been set by the outer assertion. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', overwritingMethodWrapper); + } + + // Setting the `lockSsfi` flag to `true` prevents the overwritten assertion + // from changing the `ssfi` flag. By this point, the `ssfi` flag is already + // set to the correct starting point for this assertion. + var origLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + var result = method(_super).apply(this, arguments); + flag(this, 'lockSsfi', origLockSsfi); + + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + } + + addLengthGuard(overwritingMethodWrapper, name, false); + ctx[name] = proxify(overwritingMethodWrapper, name); +}; + +},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":30,"./transferFlags":32}],29:[function(require,module,exports){ +/*! + * Chai - overwriteProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var chai = require('../../chai'); +var flag = require('./flag'); +var isProxyEnabled = require('./isProxyEnabled'); +var transferFlags = require('./transferFlags'); + +/** + * ### .overwriteProperty(ctx, name, fn) + * + * Overwrites an already existing property getter and provides + * access to previous value. Must return function to use as getter. + * + * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) { + * return function () { + * var obj = utils.flag(this, 'object'); + * if (obj instanceof Foo) { + * new chai.Assertion(obj.name).to.equal('bar'); + * } else { + * _super.call(this); + * } + * } + * }); + * + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteProperty('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.be.ok; + * + * @param {Object} ctx object whose property is to be overwritten + * @param {String} name of property to overwrite + * @param {Function} getter function that returns a getter function to be used for name + * @namespace Utils + * @name overwriteProperty + * @api public + */ + +module.exports = function overwriteProperty(ctx, name, getter) { + var _get = Object.getOwnPropertyDescriptor(ctx, name) + , _super = function () {}; + + if (_get && 'function' === typeof _get.get) + _super = _get.get + + Object.defineProperty(ctx, name, + { get: function overwritingPropertyGetter() { + // Setting the `ssfi` flag to `overwritingPropertyGetter` causes this + // function to be the starting point for removing implementation frames + // from the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set and proxy protection is disabled. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked + // from inside of another assertion. In the first case, the `ssfi` flag + // has already been set by the overwriting assertion. In the second + // case, the `ssfi` flag has already been set by the outer assertion. + // + // If proxy protection is enabled, then the `ssfi` flag has already been + // set by the proxy getter. + if (!isProxyEnabled() && !flag(this, 'lockSsfi')) { + flag(this, 'ssfi', overwritingPropertyGetter); + } + + // Setting the `lockSsfi` flag to `true` prevents the overwritten + // assertion from changing the `ssfi` flag. By this point, the `ssfi` + // flag is already set to the correct starting point for this assertion. + var origLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + var result = getter(_super).call(this); + flag(this, 'lockSsfi', origLockSsfi); + + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + } + , configurable: true + }); +}; + +},{"../../chai":2,"./flag":15,"./isProxyEnabled":25,"./transferFlags":32}],30:[function(require,module,exports){ +var config = require('../config'); +var flag = require('./flag'); +var getProperties = require('./getProperties'); +var isProxyEnabled = require('./isProxyEnabled'); + +/*! + * Chai - proxify utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .proxify(object) + * + * Return a proxy of given object that throws an error when a non-existent + * property is read. By default, the root cause is assumed to be a misspelled + * property, and thus an attempt is made to offer a reasonable suggestion from + * the list of existing properties. However, if a nonChainableMethodName is + * provided, then the root cause is instead a failure to invoke a non-chainable + * method prior to reading the non-existent property. + * + * If proxies are unsupported or disabled via the user's Chai config, then + * return object without modification. + * + * @param {Object} obj + * @param {String} nonChainableMethodName + * @namespace Utils + * @name proxify + */ + +var builtins = ['__flags', '__methods', '_obj', 'assert']; + +module.exports = function proxify(obj, nonChainableMethodName) { + if (!isProxyEnabled()) return obj; + + return new Proxy(obj, { + get: function proxyGetter(target, property) { + // This check is here because we should not throw errors on Symbol properties + // such as `Symbol.toStringTag`. + // The values for which an error should be thrown can be configured using + // the `config.proxyExcludedKeys` setting. + if (typeof property === 'string' && + config.proxyExcludedKeys.indexOf(property) === -1 && + !Reflect.has(target, property)) { + // Special message for invalid property access of non-chainable methods. + if (nonChainableMethodName) { + throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' + + property + '. See docs for proper usage of "' + + nonChainableMethodName + '".'); + } + + // If the property is reasonably close to an existing Chai property, + // suggest that property to the user. Only suggest properties with a + // distance less than 4. + var suggestion = null; + var suggestionDistance = 4; + getProperties(target).forEach(function(prop) { + if ( + !Object.prototype.hasOwnProperty(prop) && + builtins.indexOf(prop) === -1 + ) { + var dist = stringDistanceCapped( + property, + prop, + suggestionDistance + ); + if (dist < suggestionDistance) { + suggestion = prop; + suggestionDistance = dist; + } + } + }); + + if (suggestion !== null) { + throw Error('Invalid Chai property: ' + property + + '. Did you mean "' + suggestion + '"?'); + } else { + throw Error('Invalid Chai property: ' + property); + } + } + + // Use this proxy getter as the starting point for removing implementation + // frames from the stack trace of a failed assertion. For property + // assertions, this prevents the proxy getter from showing up in the stack + // trace since it's invoked before the property getter. For method and + // chainable method assertions, this flag will end up getting changed to + // the method wrapper, which is good since this frame will no longer be in + // the stack once the method is invoked. Note that Chai builtin assertion + // properties such as `__flags` are skipped since this is only meant to + // capture the starting point of an assertion. This step is also skipped + // if the `lockSsfi` flag is set, thus indicating that this assertion is + // being called from within another assertion. In that case, the `ssfi` + // flag is already set to the outer assertion's starting point. + if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) { + flag(target, 'ssfi', proxyGetter); + } + + return Reflect.get(target, property); + } + }); +}; + +/** + * # stringDistanceCapped(strA, strB, cap) + * Return the Levenshtein distance between two strings, but no more than cap. + * @param {string} strA + * @param {string} strB + * @param {number} number + * @return {number} min(string distance between strA and strB, cap) + * @api private + */ + +function stringDistanceCapped(strA, strB, cap) { + if (Math.abs(strA.length - strB.length) >= cap) { + return cap; + } + + var memo = []; + // `memo` is a two-dimensional array containing distances. + // memo[i][j] is the distance between strA.slice(0, i) and + // strB.slice(0, j). + for (var i = 0; i <= strA.length; i++) { + memo[i] = Array(strB.length + 1).fill(0); + memo[i][0] = i; + } + for (var j = 0; j < strB.length; j++) { + memo[0][j] = j; + } + + for (var i = 1; i <= strA.length; i++) { + var ch = strA.charCodeAt(i - 1); + for (var j = 1; j <= strB.length; j++) { + if (Math.abs(i - j) >= cap) { + memo[i][j] = cap; + continue; + } + memo[i][j] = Math.min( + memo[i - 1][j] + 1, + memo[i][j - 1] + 1, + memo[i - 1][j - 1] + + (ch === strB.charCodeAt(j - 1) ? 0 : 1) + ); + } + } + + return memo[strA.length][strB.length]; +} + +},{"../config":4,"./flag":15,"./getProperties":21,"./isProxyEnabled":25}],31:[function(require,module,exports){ +/*! + * Chai - test utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var flag = require('./flag'); + +/** + * ### .test(object, expression) + * + * Test an object for expression. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name test + */ + +module.exports = function test(obj, args) { + var negate = flag(obj, 'negate') + , expr = args[0]; + return negate ? !expr : expr; +}; + +},{"./flag":15}],32:[function(require,module,exports){ +/*! + * Chai - transferFlags utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .transferFlags(assertion, object, includeAll = true) + * + * Transfer all the flags for `assertion` to `object`. If + * `includeAll` is set to `false`, then the base Chai + * assertion flags (namely `object`, `ssfi`, `lockSsfi`, + * and `message`) will not be transferred. + * + * + * var newAssertion = new Assertion(); + * utils.transferFlags(assertion, newAssertion); + * + * var anotherAssertion = new Assertion(myObj); + * utils.transferFlags(assertion, anotherAssertion, false); + * + * @param {Assertion} assertion the assertion to transfer the flags from + * @param {Object} object the object to transfer the flags to; usually a new assertion + * @param {Boolean} includeAll + * @namespace Utils + * @name transferFlags + * @api private + */ + +module.exports = function transferFlags(assertion, object, includeAll) { + var flags = assertion.__flags || (assertion.__flags = Object.create(null)); + + if (!object.__flags) { + object.__flags = Object.create(null); + } + + includeAll = arguments.length === 3 ? includeAll : true; + + for (var flag in flags) { + if (includeAll || + (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) { + object.__flags[flag] = flags[flag]; + } + } +}; + +},{}],33:[function(require,module,exports){ +/*! + * assertion-error + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +/*! + * Return a function that will copy properties from + * one object to another excluding any originally + * listed. Returned function will create a new `{}`. + * + * @param {String} excluded properties ... + * @return {Function} + */ + +function exclude () { + var excludes = [].slice.call(arguments); + + function excludeProps (res, obj) { + Object.keys(obj).forEach(function (key) { + if (!~excludes.indexOf(key)) res[key] = obj[key]; + }); + } + + return function extendExclude () { + var args = [].slice.call(arguments) + , i = 0 + , res = {}; + + for (; i < args.length; i++) { + excludeProps(res, args[i]); + } + + return res; + }; +}; + +/*! + * Primary Exports + */ + +module.exports = AssertionError; + +/** + * ### AssertionError + * + * An extension of the JavaScript `Error` constructor for + * assertion and validation scenarios. + * + * @param {String} message + * @param {Object} properties to include (optional) + * @param {callee} start stack function (optional) + */ + +function AssertionError (message, _props, ssf) { + var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') + , props = extend(_props || {}); + + // default values + this.message = message || 'Unspecified AssertionError'; + this.showDiff = false; + + // copy from properties + for (var key in props) { + this[key] = props[key]; + } + + // capture stack trace + ssf = ssf || AssertionError; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, ssf); + } else { + try { + throw new Error(); + } catch(e) { + this.stack = e.stack; + } + } +} + +/*! + * Inherit from Error.prototype + */ + +AssertionError.prototype = Object.create(Error.prototype); + +/*! + * Statically set name + */ + +AssertionError.prototype.name = 'AssertionError'; + +/*! + * Ensure correct constructor + */ + +AssertionError.prototype.constructor = AssertionError; + +/** + * Allow errors to be converted to JSON for static transfer. + * + * @param {Boolean} include stack (default: `true`) + * @return {Object} object that can be `JSON.stringify` + */ + +AssertionError.prototype.toJSON = function (stack) { + var extend = exclude('constructor', 'toJSON', 'stack') + , props = extend({ name: this.name }, this); + + // include stack if exists and not turned off + if (false !== stack && this.stack) { + props.stack = this.stack; + } + + return props; +}; + +},{}],34:[function(require,module,exports){ +'use strict'; + +/* ! + * Chai - checkError utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + +var getFunctionName = require('get-func-name'); +/** + * ### .checkError + * + * Checks that an error conforms to a given set of criteria and/or retrieves information about it. + * + * @api public + */ + +/** + * ### .compatibleInstance(thrown, errorLike) + * + * Checks if two instances are compatible (strict equal). + * Returns false if errorLike is not an instance of Error, because instances + * can only be compatible if they're both error instances. + * + * @name compatibleInstance + * @param {Error} thrown error + * @param {Error|ErrorConstructor} errorLike object to compare against + * @namespace Utils + * @api public + */ + +function compatibleInstance(thrown, errorLike) { + return errorLike instanceof Error && thrown === errorLike; +} + +/** + * ### .compatibleConstructor(thrown, errorLike) + * + * Checks if two constructors are compatible. + * This function can receive either an error constructor or + * an error instance as the `errorLike` argument. + * Constructors are compatible if they're the same or if one is + * an instance of another. + * + * @name compatibleConstructor + * @param {Error} thrown error + * @param {Error|ErrorConstructor} errorLike object to compare against + * @namespace Utils + * @api public + */ + +function compatibleConstructor(thrown, errorLike) { + if (errorLike instanceof Error) { + // If `errorLike` is an instance of any error we compare their constructors + return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor; + } else if (errorLike.prototype instanceof Error || errorLike === Error) { + // If `errorLike` is a constructor that inherits from Error, we compare `thrown` to `errorLike` directly + return thrown.constructor === errorLike || thrown instanceof errorLike; + } + + return false; +} + +/** + * ### .compatibleMessage(thrown, errMatcher) + * + * Checks if an error's message is compatible with a matcher (String or RegExp). + * If the message contains the String or passes the RegExp test, + * it is considered compatible. + * + * @name compatibleMessage + * @param {Error} thrown error + * @param {String|RegExp} errMatcher to look for into the message + * @namespace Utils + * @api public + */ + +function compatibleMessage(thrown, errMatcher) { + var comparisonString = typeof thrown === 'string' ? thrown : thrown.message; + if (errMatcher instanceof RegExp) { + return errMatcher.test(comparisonString); + } else if (typeof errMatcher === 'string') { + return comparisonString.indexOf(errMatcher) !== -1; // eslint-disable-line no-magic-numbers + } + + return false; +} + +/** + * ### .getConstructorName(errorLike) + * + * Gets the constructor name for an Error instance or constructor itself. + * + * @name getConstructorName + * @param {Error|ErrorConstructor} errorLike + * @namespace Utils + * @api public + */ + +function getConstructorName(errorLike) { + var constructorName = errorLike; + if (errorLike instanceof Error) { + constructorName = getFunctionName(errorLike.constructor); + } else if (typeof errorLike === 'function') { + // If `err` is not an instance of Error it is an error constructor itself or another function. + // If we've got a common function we get its name, otherwise we may need to create a new instance + // of the error just in case it's a poorly-constructed error. Please see chaijs/chai/issues/45 to know more. + constructorName = getFunctionName(errorLike); + if (constructorName === '') { + var newConstructorName = getFunctionName(new errorLike()); // eslint-disable-line new-cap + constructorName = newConstructorName || constructorName; + } + } + + return constructorName; +} + +/** + * ### .getMessage(errorLike) + * + * Gets the error message from an error. + * If `err` is a String itself, we return it. + * If the error has no message, we return an empty string. + * + * @name getMessage + * @param {Error|String} errorLike + * @namespace Utils + * @api public + */ + +function getMessage(errorLike) { + var msg = ''; + if (errorLike && errorLike.message) { + msg = errorLike.message; + } else if (typeof errorLike === 'string') { + msg = errorLike; + } + + return msg; +} + +module.exports = { + compatibleInstance: compatibleInstance, + compatibleConstructor: compatibleConstructor, + compatibleMessage: compatibleMessage, + getMessage: getMessage, + getConstructorName: getConstructorName, +}; + +},{"get-func-name":36}],35:[function(require,module,exports){ +'use strict'; +/* globals Symbol: false, Uint8Array: false, WeakMap: false */ +/*! + * deep-eql + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +var type = require('type-detect'); +function FakeMap() { + this._key = 'chai/deep-eql__' + Math.random() + Date.now(); +} + +FakeMap.prototype = { + get: function get(key) { + return key[this._key]; + }, + set: function set(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this._key, { + value: value, + configurable: true, + }); + } + }, +}; + +var MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap; +/*! + * Check to see if the MemoizeMap has recorded a result of the two operands + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @returns {Boolean|null} result +*/ +function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) { + // Technically, WeakMap keys can *only* be objects, not primitives. + if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + return null; + } + var leftHandMap = memoizeMap.get(leftHandOperand); + if (leftHandMap) { + var result = leftHandMap.get(rightHandOperand); + if (typeof result === 'boolean') { + return result; + } + } + return null; +} + +/*! + * Set the result of the equality into the MemoizeMap + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @param {Boolean} result +*/ +function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) { + // Technically, WeakMap keys can *only* be objects, not primitives. + if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + return; + } + var leftHandMap = memoizeMap.get(leftHandOperand); + if (leftHandMap) { + leftHandMap.set(rightHandOperand, result); + } else { + leftHandMap = new MemoizeMap(); + leftHandMap.set(rightHandOperand, result); + memoizeMap.set(leftHandOperand, leftHandMap); + } +} + +/*! + * Primary Export + */ + +module.exports = deepEqual; +module.exports.MemoizeMap = MemoizeMap; + +/** + * Assert deeply nested sameValue equality between two objects of any type. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match + */ +function deepEqual(leftHandOperand, rightHandOperand, options) { + // If we have a comparator, we can't assume anything; so bail to its check first. + if (options && options.comparator) { + return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); + } + + var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); + if (simpleResult !== null) { + return simpleResult; + } + + // Deeper comparisons are pushed through to a larger function + return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); +} + +/** + * Many comparisons can be canceled out early via simple equality or primitive checks. + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @return {Boolean|null} equal match + */ +function simpleEqual(leftHandOperand, rightHandOperand) { + // Equal references (except for Numbers) can be returned early + if (leftHandOperand === rightHandOperand) { + // Handle +-0 cases + return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand; + } + + // handle NaN cases + if ( + leftHandOperand !== leftHandOperand && // eslint-disable-line no-self-compare + rightHandOperand !== rightHandOperand // eslint-disable-line no-self-compare + ) { + return true; + } + + // Anything that is not an 'object', i.e. symbols, functions, booleans, numbers, + // strings, and undefined, can be compared by reference. + if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + // Easy out b/c it would have passed the first equality check + return false; + } + return null; +} + +/*! + * The main logic of the `deepEqual` function. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match +*/ +function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) { + options = options || {}; + options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap(); + var comparator = options && options.comparator; + + // Check if a memoized result exists. + var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize); + if (memoizeResultLeft !== null) { + return memoizeResultLeft; + } + var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize); + if (memoizeResultRight !== null) { + return memoizeResultRight; + } + + // If a comparator is present, use it. + if (comparator) { + var comparatorResult = comparator(leftHandOperand, rightHandOperand); + // Comparators may return null, in which case we want to go back to default behavior. + if (comparatorResult === false || comparatorResult === true) { + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult); + return comparatorResult; + } + // To allow comparators to override *any* behavior, we ran them first. Since it didn't decide + // what to do, we need to make sure to return the basic tests first before we move on. + var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); + if (simpleResult !== null) { + // Don't memoize this, it takes longer to set/retrieve than to just compare. + return simpleResult; + } + } + + var leftHandType = type(leftHandOperand); + if (leftHandType !== type(rightHandOperand)) { + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false); + return false; + } + + // Temporarily set the operands in the memoize object to prevent blowing the stack + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true); + + var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options); + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result); + return result; +} + +function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) { + switch (leftHandType) { + case 'String': + case 'Number': + case 'Boolean': + case 'Date': + // If these types are their instance types (e.g. `new Number`) then re-deepEqual against their values + return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf()); + case 'Promise': + case 'Symbol': + case 'function': + case 'WeakMap': + case 'WeakSet': + return leftHandOperand === rightHandOperand; + case 'Error': + return keysEqual(leftHandOperand, rightHandOperand, [ 'name', 'message', 'code' ], options); + case 'Arguments': + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + case 'Array': + return iterableEqual(leftHandOperand, rightHandOperand, options); + case 'RegExp': + return regexpEqual(leftHandOperand, rightHandOperand); + case 'Generator': + return generatorEqual(leftHandOperand, rightHandOperand, options); + case 'DataView': + return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options); + case 'ArrayBuffer': + return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options); + case 'Set': + return entriesEqual(leftHandOperand, rightHandOperand, options); + case 'Map': + return entriesEqual(leftHandOperand, rightHandOperand, options); + case 'Temporal.PlainDate': + case 'Temporal.PlainTime': + case 'Temporal.PlainDateTime': + case 'Temporal.Instant': + case 'Temporal.ZonedDateTime': + case 'Temporal.PlainYearMonth': + case 'Temporal.PlainMonthDay': + return leftHandOperand.equals(rightHandOperand); + case 'Temporal.Duration': + return leftHandOperand.total('nanoseconds') === rightHandOperand.total('nanoseconds'); + case 'Temporal.TimeZone': + case 'Temporal.Calendar': + return leftHandOperand.toString() === rightHandOperand.toString(); + default: + return objectEqual(leftHandOperand, rightHandOperand, options); + } +} + +/*! + * Compare two Regular Expressions for equality. + * + * @param {RegExp} leftHandOperand + * @param {RegExp} rightHandOperand + * @return {Boolean} result + */ + +function regexpEqual(leftHandOperand, rightHandOperand) { + return leftHandOperand.toString() === rightHandOperand.toString(); +} + +/*! + * Compare two Sets/Maps for equality. Faster than other equality functions. + * + * @param {Set} leftHandOperand + * @param {Set} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function entriesEqual(leftHandOperand, rightHandOperand, options) { + // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach + if (leftHandOperand.size !== rightHandOperand.size) { + return false; + } + if (leftHandOperand.size === 0) { + return true; + } + var leftHandItems = []; + var rightHandItems = []; + leftHandOperand.forEach(function gatherEntries(key, value) { + leftHandItems.push([ key, value ]); + }); + rightHandOperand.forEach(function gatherEntries(key, value) { + rightHandItems.push([ key, value ]); + }); + return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options); +} + +/*! + * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function iterableEqual(leftHandOperand, rightHandOperand, options) { + var length = leftHandOperand.length; + if (length !== rightHandOperand.length) { + return false; + } + if (length === 0) { + return true; + } + var index = -1; + while (++index < length) { + if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) { + return false; + } + } + return true; +} + +/*! + * Simple equality for generator objects such as those returned by generator functions. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function generatorEqual(leftHandOperand, rightHandOperand, options) { + return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options); +} + +/*! + * Determine if the given object has an @@iterator function. + * + * @param {Object} target + * @return {Boolean} `true` if the object has an @@iterator function. + */ +function hasIteratorFunction(target) { + return typeof Symbol !== 'undefined' && + typeof target === 'object' && + typeof Symbol.iterator !== 'undefined' && + typeof target[Symbol.iterator] === 'function'; +} + +/*! + * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array. + * This will consume the iterator - which could have side effects depending on the @@iterator implementation. + * + * @param {Object} target + * @returns {Array} an array of entries from the @@iterator function + */ +function getIteratorEntries(target) { + if (hasIteratorFunction(target)) { + try { + return getGeneratorEntries(target[Symbol.iterator]()); + } catch (iteratorError) { + return []; + } + } + return []; +} + +/*! + * Gets all entries from a Generator. This will consume the generator - which could have side effects. + * + * @param {Generator} target + * @returns {Array} an array of entries from the Generator. + */ +function getGeneratorEntries(generator) { + var generatorResult = generator.next(); + var accumulator = [ generatorResult.value ]; + while (generatorResult.done === false) { + generatorResult = generator.next(); + accumulator.push(generatorResult.value); + } + return accumulator; +} + +/*! + * Gets all own and inherited enumerable keys from a target. + * + * @param {Object} target + * @returns {Array} an array of own and inherited enumerable keys from the target. + */ +function getEnumerableKeys(target) { + var keys = []; + for (var key in target) { + keys.push(key); + } + return keys; +} + +function getEnumerableSymbols(target) { + var keys = []; + var allKeys = Object.getOwnPropertySymbols(target); + for (var i = 0; i < allKeys.length; i += 1) { + var key = allKeys[i]; + if (Object.getOwnPropertyDescriptor(target, key).enumerable) { + keys.push(key); + } + } + return keys; +} + +/*! + * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of + * each key. If any value of the given key is not equal, the function will return false (early). + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function keysEqual(leftHandOperand, rightHandOperand, keys, options) { + var length = keys.length; + if (length === 0) { + return true; + } + for (var i = 0; i < length; i += 1) { + if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) { + return false; + } + } + return true; +} + +/*! + * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual` + * for each enumerable key in the object. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function objectEqual(leftHandOperand, rightHandOperand, options) { + var leftHandKeys = getEnumerableKeys(leftHandOperand); + var rightHandKeys = getEnumerableKeys(rightHandOperand); + var leftHandSymbols = getEnumerableSymbols(leftHandOperand); + var rightHandSymbols = getEnumerableSymbols(rightHandOperand); + leftHandKeys = leftHandKeys.concat(leftHandSymbols); + rightHandKeys = rightHandKeys.concat(rightHandSymbols); + + if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) { + if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) { + return false; + } + return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options); + } + + var leftHandEntries = getIteratorEntries(leftHandOperand); + var rightHandEntries = getIteratorEntries(rightHandOperand); + if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) { + leftHandEntries.sort(); + rightHandEntries.sort(); + return iterableEqual(leftHandEntries, rightHandEntries, options); + } + + if (leftHandKeys.length === 0 && + leftHandEntries.length === 0 && + rightHandKeys.length === 0 && + rightHandEntries.length === 0) { + return true; + } + + return false; +} + +/*! + * Returns true if the argument is a primitive. + * + * This intentionally returns true for all objects that can be compared by reference, + * including functions and symbols. + * + * @param {Mixed} value + * @return {Boolean} result + */ +function isPrimitive(value) { + return value === null || typeof value !== 'object'; +} + +function mapSymbols(arr) { + return arr.map(function mapSymbol(entry) { + if (typeof entry === 'symbol') { + return entry.toString(); + } + + return entry; + }); +} + +},{"type-detect":39}],36:[function(require,module,exports){ +'use strict'; + +/* ! + * Chai - getFuncName utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + +/** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + +var toString = Function.prototype.toString; +var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; +var maxFunctionSourceLength = 512; +function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // eslint-disable-next-line prefer-reflect + var functionSource = toString.call(aFunc); + // To avoid unconstrained resource consumption due to pathalogically large function names, + // we limit the available return value to be less than 512 characters. + if (functionSource.indexOf('(') > maxFunctionSourceLength) { + return name; + } + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = functionSource.match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; +} + +module.exports = getFuncName; + +},{}],37:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.loupe = {})); +}(this, (function (exports) { 'use strict'; + + function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArrayLimit(arr, i) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var ansiColors = { + bold: ['1', '22'], + dim: ['2', '22'], + italic: ['3', '23'], + underline: ['4', '24'], + // 5 & 6 are blinking + inverse: ['7', '27'], + hidden: ['8', '28'], + strike: ['9', '29'], + // 10-20 are fonts + // 21-29 are resets for 1-9 + black: ['30', '39'], + red: ['31', '39'], + green: ['32', '39'], + yellow: ['33', '39'], + blue: ['34', '39'], + magenta: ['35', '39'], + cyan: ['36', '39'], + white: ['37', '39'], + brightblack: ['30;1', '39'], + brightred: ['31;1', '39'], + brightgreen: ['32;1', '39'], + brightyellow: ['33;1', '39'], + brightblue: ['34;1', '39'], + brightmagenta: ['35;1', '39'], + brightcyan: ['36;1', '39'], + brightwhite: ['37;1', '39'], + grey: ['90', '39'] + }; + var styles = { + special: 'cyan', + number: 'yellow', + bigint: 'yellow', + boolean: 'yellow', + undefined: 'grey', + null: 'bold', + string: 'green', + symbol: 'green', + date: 'magenta', + regexp: 'red' + }; + var truncator = '…'; + + function colorise(value, styleType) { + var color = ansiColors[styles[styleType]] || ansiColors[styleType]; + + if (!color) { + return String(value); + } + + return "\x1B[".concat(color[0], "m").concat(String(value), "\x1B[").concat(color[1], "m"); + } + + function normaliseOptions() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$showHidden = _ref.showHidden, + showHidden = _ref$showHidden === void 0 ? false : _ref$showHidden, + _ref$depth = _ref.depth, + depth = _ref$depth === void 0 ? 2 : _ref$depth, + _ref$colors = _ref.colors, + colors = _ref$colors === void 0 ? false : _ref$colors, + _ref$customInspect = _ref.customInspect, + customInspect = _ref$customInspect === void 0 ? true : _ref$customInspect, + _ref$showProxy = _ref.showProxy, + showProxy = _ref$showProxy === void 0 ? false : _ref$showProxy, + _ref$maxArrayLength = _ref.maxArrayLength, + maxArrayLength = _ref$maxArrayLength === void 0 ? Infinity : _ref$maxArrayLength, + _ref$breakLength = _ref.breakLength, + breakLength = _ref$breakLength === void 0 ? Infinity : _ref$breakLength, + _ref$seen = _ref.seen, + seen = _ref$seen === void 0 ? [] : _ref$seen, + _ref$truncate = _ref.truncate, + truncate = _ref$truncate === void 0 ? Infinity : _ref$truncate, + _ref$stylize = _ref.stylize, + stylize = _ref$stylize === void 0 ? String : _ref$stylize; + + var options = { + showHidden: Boolean(showHidden), + depth: Number(depth), + colors: Boolean(colors), + customInspect: Boolean(customInspect), + showProxy: Boolean(showProxy), + maxArrayLength: Number(maxArrayLength), + breakLength: Number(breakLength), + truncate: Number(truncate), + seen: seen, + stylize: stylize + }; + + if (options.colors) { + options.stylize = colorise; + } + + return options; + } + function truncate(string, length) { + var tail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : truncator; + string = String(string); + var tailLength = tail.length; + var stringLength = string.length; + + if (tailLength > length && stringLength > tailLength) { + return tail; + } + + if (stringLength > length && stringLength > tailLength) { + return "".concat(string.slice(0, length - tailLength)).concat(tail); + } + + return string; + } // eslint-disable-next-line complexity + + function inspectList(list, options, inspectItem) { + var separator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ', '; + inspectItem = inspectItem || options.inspect; + var size = list.length; + if (size === 0) return ''; + var originalLength = options.truncate; + var output = ''; + var peek = ''; + var truncated = ''; + + for (var i = 0; i < size; i += 1) { + var last = i + 1 === list.length; + var secondToLast = i + 2 === list.length; + truncated = "".concat(truncator, "(").concat(list.length - i, ")"); + var value = list[i]; // If there is more than one remaining we need to account for a separator of `, ` + + options.truncate = originalLength - output.length - (last ? 0 : separator.length); + var string = peek || inspectItem(value, options) + (last ? '' : separator); + var nextLength = output.length + string.length; + var truncatedLength = nextLength + truncated.length; // If this is the last element, and adding it would + // take us over length, but adding the truncator wouldn't - then break now + + if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) { + break; + } // If this isn't the last or second to last element to scan, + // but the string is already over length then break here + + + if (!last && !secondToLast && truncatedLength > originalLength) { + break; + } // Peek at the next string to determine if we should + // break early before adding this item to the output + + + peek = last ? '' : inspectItem(list[i + 1], options) + (secondToLast ? '' : separator); // If we have one element left, but this element and + // the next takes over length, the break early + + if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) { + break; + } + + output += string; // If the next element takes us to length - + // but there are more after that, then we should truncate now + + if (!last && !secondToLast && nextLength + peek.length >= originalLength) { + truncated = "".concat(truncator, "(").concat(list.length - i - 1, ")"); + break; + } + + truncated = ''; + } + + return "".concat(output).concat(truncated); + } + + function quoteComplexKey(key) { + if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) { + return key; + } + + return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"); + } + + function inspectProperty(_ref2, options) { + var _ref3 = _slicedToArray(_ref2, 2), + key = _ref3[0], + value = _ref3[1]; + + options.truncate -= 2; + + if (typeof key === 'string') { + key = quoteComplexKey(key); + } else if (typeof key !== 'number') { + key = "[".concat(options.inspect(key, options), "]"); + } + + options.truncate -= key.length; + value = options.inspect(value, options); + return "".concat(key, ": ").concat(value); + } + + function inspectArray(array, options) { + // Object.keys will always output the Array indices first, so we can slice by + // `array.length` to get non-index properties + var nonIndexProperties = Object.keys(array).slice(array.length); + if (!array.length && !nonIndexProperties.length) return '[]'; + options.truncate -= 4; + var listContents = inspectList(array, options); + options.truncate -= listContents.length; + var propertyContents = ''; + + if (nonIndexProperties.length) { + propertyContents = inspectList(nonIndexProperties.map(function (key) { + return [key, array[key]]; + }), options, inspectProperty); + } + + return "[ ".concat(listContents).concat(propertyContents ? ", ".concat(propertyContents) : '', " ]"); + } + + /* ! + * Chai - getFuncName utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + + /** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + + var toString = Function.prototype.toString; + var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; + function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = toString.call(aFunc).match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; + } + + var getFuncName_1 = getFuncName; + + var getArrayName = function getArrayName(array) { + // We need to special case Node.js' Buffers, which report to be Uint8Array + if (typeof Buffer === 'function' && array instanceof Buffer) { + return 'Buffer'; + } + + if (array[Symbol.toStringTag]) { + return array[Symbol.toStringTag]; + } + + return getFuncName_1(array.constructor); + }; + + function inspectTypedArray(array, options) { + var name = getArrayName(array); + options.truncate -= name.length + 4; // Object.keys will always output the Array indices first, so we can slice by + // `array.length` to get non-index properties + + var nonIndexProperties = Object.keys(array).slice(array.length); + if (!array.length && !nonIndexProperties.length) return "".concat(name, "[]"); // As we know TypedArrays only contain Unsigned Integers, we can skip inspecting each one and simply + // stylise the toString() value of them + + var output = ''; + + for (var i = 0; i < array.length; i++) { + var string = "".concat(options.stylize(truncate(array[i], options.truncate), 'number')).concat(i === array.length - 1 ? '' : ', '); + options.truncate -= string.length; + + if (array[i] !== array.length && options.truncate <= 3) { + output += "".concat(truncator, "(").concat(array.length - array[i] + 1, ")"); + break; + } + + output += string; + } + + var propertyContents = ''; + + if (nonIndexProperties.length) { + propertyContents = inspectList(nonIndexProperties.map(function (key) { + return [key, array[key]]; + }), options, inspectProperty); + } + + return "".concat(name, "[ ").concat(output).concat(propertyContents ? ", ".concat(propertyContents) : '', " ]"); + } + + function inspectDate(dateObject, options) { + var stringRepresentation = dateObject.toJSON(); + + if (stringRepresentation === null) { + return 'Invalid Date'; + } + + var split = stringRepresentation.split('T'); + var date = split[0]; // If we need to - truncate the time portion, but never the date + + return options.stylize("".concat(date, "T").concat(truncate(split[1], options.truncate - date.length - 1)), 'date'); + } + + function inspectFunction(func, options) { + var name = getFuncName_1(func); + + if (!name) { + return options.stylize('[Function]', 'special'); + } + + return options.stylize("[Function ".concat(truncate(name, options.truncate - 11), "]"), 'special'); + } + + function inspectMapEntry(_ref, options) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + options.truncate -= 4; + key = options.inspect(key, options); + options.truncate -= key.length; + value = options.inspect(value, options); + return "".concat(key, " => ").concat(value); + } // IE11 doesn't support `map.entries()` + + + function mapToEntries(map) { + var entries = []; + map.forEach(function (value, key) { + entries.push([key, value]); + }); + return entries; + } + + function inspectMap(map, options) { + var size = map.size - 1; + + if (size <= 0) { + return 'Map{}'; + } + + options.truncate -= 7; + return "Map{ ".concat(inspectList(mapToEntries(map), options, inspectMapEntry), " }"); + } + + var isNaN = Number.isNaN || function (i) { + return i !== i; + }; // eslint-disable-line no-self-compare + + + function inspectNumber(number, options) { + if (isNaN(number)) { + return options.stylize('NaN', 'number'); + } + + if (number === Infinity) { + return options.stylize('Infinity', 'number'); + } + + if (number === -Infinity) { + return options.stylize('-Infinity', 'number'); + } + + if (number === 0) { + return options.stylize(1 / number === Infinity ? '+0' : '-0', 'number'); + } + + return options.stylize(truncate(number, options.truncate), 'number'); + } + + function inspectBigInt(number, options) { + var nums = truncate(number.toString(), options.truncate - 1); + if (nums !== truncator) nums += 'n'; + return options.stylize(nums, 'bigint'); + } + + function inspectRegExp(value, options) { + var flags = value.toString().split('/')[2]; + var sourceLength = options.truncate - (2 + flags.length); + var source = value.source; + return options.stylize("/".concat(truncate(source, sourceLength), "/").concat(flags), 'regexp'); + } + + function arrayFromSet(set) { + var values = []; + set.forEach(function (value) { + values.push(value); + }); + return values; + } + + function inspectSet(set, options) { + if (set.size === 0) return 'Set{}'; + options.truncate -= 7; + return "Set{ ".concat(inspectList(arrayFromSet(set), options), " }"); + } + + var stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5" + "\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", 'g'); + var escapeCharacters = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + "'": "\\'", + '\\': '\\\\' + }; + var hex = 16; + var unicodeLength = 4; + + function escape(char) { + return escapeCharacters[char] || "\\u".concat("0000".concat(char.charCodeAt(0).toString(hex)).slice(-unicodeLength)); + } + + function inspectString(string, options) { + if (stringEscapeChars.test(string)) { + string = string.replace(stringEscapeChars, escape); + } + + return options.stylize("'".concat(truncate(string, options.truncate - 2), "'"), 'string'); + } + + function inspectSymbol(value) { + if ('description' in Symbol.prototype) { + return value.description ? "Symbol(".concat(value.description, ")") : 'Symbol()'; + } + + return value.toString(); + } + + var getPromiseValue = function getPromiseValue() { + return 'Promise{…}'; + }; + + try { + var _process$binding = process.binding('util'), + getPromiseDetails = _process$binding.getPromiseDetails, + kPending = _process$binding.kPending, + kRejected = _process$binding.kRejected; + + if (Array.isArray(getPromiseDetails(Promise.resolve()))) { + getPromiseValue = function getPromiseValue(value, options) { + var _getPromiseDetails = getPromiseDetails(value), + _getPromiseDetails2 = _slicedToArray(_getPromiseDetails, 2), + state = _getPromiseDetails2[0], + innerValue = _getPromiseDetails2[1]; + + if (state === kPending) { + return 'Promise{}'; + } + + return "Promise".concat(state === kRejected ? '!' : '', "{").concat(options.inspect(innerValue, options), "}"); + }; + } + } catch (notNode) { + /* ignore */ + } + + var inspectPromise = getPromiseValue; + + function inspectObject(object, options) { + var properties = Object.getOwnPropertyNames(object); + var symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : []; + + if (properties.length === 0 && symbols.length === 0) { + return '{}'; + } + + options.truncate -= 4; + options.seen = options.seen || []; + + if (options.seen.indexOf(object) >= 0) { + return '[Circular]'; + } + + options.seen.push(object); + var propertyContents = inspectList(properties.map(function (key) { + return [key, object[key]]; + }), options, inspectProperty); + var symbolContents = inspectList(symbols.map(function (key) { + return [key, object[key]]; + }), options, inspectProperty); + options.seen.pop(); + var sep = ''; + + if (propertyContents && symbolContents) { + sep = ', '; + } + + return "{ ".concat(propertyContents).concat(sep).concat(symbolContents, " }"); + } + + var toStringTag = typeof Symbol !== 'undefined' && Symbol.toStringTag ? Symbol.toStringTag : false; + function inspectClass(value, options) { + var name = ''; + + if (toStringTag && toStringTag in value) { + name = value[toStringTag]; + } + + name = name || getFuncName_1(value.constructor); // Babel transforms anonymous classes to the name `_class` + + if (!name || name === '_class') { + name = ''; + } + + options.truncate -= name.length; + return "".concat(name).concat(inspectObject(value, options)); + } + + function inspectArguments(args, options) { + if (args.length === 0) return 'Arguments[]'; + options.truncate -= 13; + return "Arguments[ ".concat(inspectList(args, options), " ]"); + } + + var errorKeys = ['stack', 'line', 'column', 'name', 'message', 'fileName', 'lineNumber', 'columnNumber', 'number', 'description']; + function inspectObject$1(error, options) { + var properties = Object.getOwnPropertyNames(error).filter(function (key) { + return errorKeys.indexOf(key) === -1; + }); + var name = error.name; + options.truncate -= name.length; + var message = ''; + + if (typeof error.message === 'string') { + message = truncate(error.message, options.truncate); + } else { + properties.unshift('message'); + } + + message = message ? ": ".concat(message) : ''; + options.truncate -= message.length + 5; + var propertyContents = inspectList(properties.map(function (key) { + return [key, error[key]]; + }), options, inspectProperty); + return "".concat(name).concat(message).concat(propertyContents ? " { ".concat(propertyContents, " }") : ''); + } + + function inspectAttribute(_ref, options) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + options.truncate -= 3; + + if (!value) { + return "".concat(options.stylize(key, 'yellow')); + } + + return "".concat(options.stylize(key, 'yellow'), "=").concat(options.stylize("\"".concat(value, "\""), 'string')); + } + function inspectHTMLCollection(collection, options) { + // eslint-disable-next-line no-use-before-define + return inspectList(collection, options, inspectHTML, '\n'); + } + function inspectHTML(element, options) { + var properties = element.getAttributeNames(); + var name = element.tagName.toLowerCase(); + var head = options.stylize("<".concat(name), 'special'); + var headClose = options.stylize(">", 'special'); + var tail = options.stylize(""), 'special'); + options.truncate -= name.length * 2 + 5; + var propertyContents = ''; + + if (properties.length > 0) { + propertyContents += ' '; + propertyContents += inspectList(properties.map(function (key) { + return [key, element.getAttribute(key)]; + }), options, inspectAttribute, ' '); + } + + options.truncate -= propertyContents.length; + var truncate = options.truncate; + var children = inspectHTMLCollection(element.children, options); + + if (children && children.length > truncate) { + children = "".concat(truncator, "(").concat(element.children.length, ")"); + } + + return "".concat(head).concat(propertyContents).concat(headClose).concat(children).concat(tail); + } + + var symbolsSupported = typeof Symbol === 'function' && typeof Symbol.for === 'function'; + var chaiInspect = symbolsSupported ? Symbol.for('chai/inspect') : '@@chai/inspect'; + var nodeInspect = false; + + try { + // eslint-disable-next-line global-require + var nodeUtil = require('util'); + + nodeInspect = nodeUtil.inspect ? nodeUtil.inspect.custom : false; + } catch (noNodeInspect) { + nodeInspect = false; + } + + function FakeMap() { + // eslint-disable-next-line prefer-template + this.key = 'chai/loupe__' + Math.random() + Date.now(); + } + + FakeMap.prototype = { + // eslint-disable-next-line object-shorthand + get: function get(key) { + return key[this.key]; + }, + // eslint-disable-next-line object-shorthand + has: function has(key) { + return this.key in key; + }, + // eslint-disable-next-line object-shorthand + set: function set(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this.key, { + // eslint-disable-next-line object-shorthand + value: value, + configurable: true + }); + } + } + }; + var constructorMap = new (typeof WeakMap === 'function' ? WeakMap : FakeMap)(); + var stringTagMap = {}; + var baseTypesMap = { + undefined: function undefined$1(value, options) { + return options.stylize('undefined', 'undefined'); + }, + null: function _null(value, options) { + return options.stylize(null, 'null'); + }, + boolean: function boolean(value, options) { + return options.stylize(value, 'boolean'); + }, + Boolean: function Boolean(value, options) { + return options.stylize(value, 'boolean'); + }, + number: inspectNumber, + Number: inspectNumber, + bigint: inspectBigInt, + BigInt: inspectBigInt, + string: inspectString, + String: inspectString, + function: inspectFunction, + Function: inspectFunction, + symbol: inspectSymbol, + // A Symbol polyfill will return `Symbol` not `symbol` from typedetect + Symbol: inspectSymbol, + Array: inspectArray, + Date: inspectDate, + Map: inspectMap, + Set: inspectSet, + RegExp: inspectRegExp, + Promise: inspectPromise, + // WeakSet, WeakMap are totally opaque to us + WeakSet: function WeakSet(value, options) { + return options.stylize('WeakSet{…}', 'special'); + }, + WeakMap: function WeakMap(value, options) { + return options.stylize('WeakMap{…}', 'special'); + }, + Arguments: inspectArguments, + Int8Array: inspectTypedArray, + Uint8Array: inspectTypedArray, + Uint8ClampedArray: inspectTypedArray, + Int16Array: inspectTypedArray, + Uint16Array: inspectTypedArray, + Int32Array: inspectTypedArray, + Uint32Array: inspectTypedArray, + Float32Array: inspectTypedArray, + Float64Array: inspectTypedArray, + Generator: function Generator() { + return ''; + }, + DataView: function DataView() { + return ''; + }, + ArrayBuffer: function ArrayBuffer() { + return ''; + }, + Error: inspectObject$1, + HTMLCollection: inspectHTMLCollection, + NodeList: inspectHTMLCollection + }; // eslint-disable-next-line complexity + + var inspectCustom = function inspectCustom(value, options, type) { + if (chaiInspect in value && typeof value[chaiInspect] === 'function') { + return value[chaiInspect](options); + } + + if (nodeInspect && nodeInspect in value && typeof value[nodeInspect] === 'function') { + return value[nodeInspect](options.depth, options); + } + + if ('inspect' in value && typeof value.inspect === 'function') { + return value.inspect(options.depth, options); + } + + if ('constructor' in value && constructorMap.has(value.constructor)) { + return constructorMap.get(value.constructor)(value, options); + } + + if (stringTagMap[type]) { + return stringTagMap[type](value, options); + } + + return ''; + }; + + var toString$1 = Object.prototype.toString; // eslint-disable-next-line complexity + + function inspect(value, options) { + options = normaliseOptions(options); + options.inspect = inspect; + var _options = options, + customInspect = _options.customInspect; + var type = value === null ? 'null' : _typeof(value); + + if (type === 'object') { + type = toString$1.call(value).slice(8, -1); + } // If it is a base value that we already support, then use Loupe's inspector + + + if (baseTypesMap[type]) { + return baseTypesMap[type](value, options); + } // If `options.customInspect` is set to true then try to use the custom inspector + + + if (customInspect && value) { + var output = inspectCustom(value, options, type); + + if (output) { + if (typeof output === 'string') return output; + return inspect(output, options); + } + } + + var proto = value ? Object.getPrototypeOf(value) : false; // If it's a plain Object then use Loupe's inspector + + if (proto === Object.prototype || proto === null) { + return inspectObject(value, options); + } // Specifically account for HTMLElements + // eslint-disable-next-line no-undef + + + if (value && typeof HTMLElement === 'function' && value instanceof HTMLElement) { + return inspectHTML(value, options); + } + + if ('constructor' in value) { + // If it is a class, inspect it like an object but add the constructor name + if (value.constructor !== Object) { + return inspectClass(value, options); + } // If it is an object with an anonymous prototype, display it as an object. + + + return inspectObject(value, options); + } // last chance to check if it's an object + + + if (value === Object(value)) { + return inspectObject(value, options); + } // We have run out of options! Just stringify the value + + + return options.stylize(String(value), type); + } + function registerConstructor(constructor, inspector) { + if (constructorMap.has(constructor)) { + return false; + } + + constructorMap.set(constructor, inspector); + return true; + } + function registerStringTag(stringTag, inspector) { + if (stringTag in stringTagMap) { + return false; + } + + stringTagMap[stringTag] = inspector; + return true; + } + var custom = chaiInspect; + + exports.custom = custom; + exports.default = inspect; + exports.inspect = inspect; + exports.registerConstructor = registerConstructor; + exports.registerStringTag = registerStringTag; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{"util":undefined}],38:[function(require,module,exports){ +'use strict'; + +/* ! + * Chai - pathval utility + * Copyright(c) 2012-2014 Jake Luer + * @see https://github.com/logicalparadox/filtr + * MIT Licensed + */ + +/** + * ### .hasProperty(object, name) + * + * This allows checking whether an object has own + * or inherited from prototype chain named property. + * + * Basically does the same thing as the `in` + * operator but works properly with null/undefined values + * and other primitives. + * + * var obj = { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * + * The following would be the results. + * + * hasProperty(obj, 'str'); // true + * hasProperty(obj, 'constructor'); // true + * hasProperty(obj, 'bar'); // false + * + * hasProperty(obj.str, 'length'); // true + * hasProperty(obj.str, 1); // true + * hasProperty(obj.str, 5); // false + * + * hasProperty(obj.arr, 'length'); // true + * hasProperty(obj.arr, 2); // true + * hasProperty(obj.arr, 3); // false + * + * @param {Object} object + * @param {String|Symbol} name + * @returns {Boolean} whether it exists + * @namespace Utils + * @name hasProperty + * @api public + */ + +function hasProperty(obj, name) { + if (typeof obj === 'undefined' || obj === null) { + return false; + } + + // The `in` operator does not work with primitives. + return name in Object(obj); +} + +/* ! + * ## parsePath(path) + * + * Helper function used to parse string object + * paths. Use in conjunction with `internalGetPathValue`. + * + * var parsed = parsePath('myobject.property.subprop'); + * + * ### Paths: + * + * * Can be infinitely deep and nested. + * * Arrays are also valid using the formal `myobject.document[3].property`. + * * Literal dots and brackets (not delimiter) must be backslash-escaped. + * + * @param {String} path + * @returns {Object} parsed + * @api private + */ + +function parsePath(path) { + var str = path.replace(/([^\\])\[/g, '$1.['); + var parts = str.match(/(\\\.|[^.]+?)+/g); + return parts.map(function mapMatches(value) { + if ( + value === 'constructor' || + value === '__proto__' || + value === 'prototype' + ) { + return {}; + } + var regexp = /^\[(\d+)\]$/; + var mArr = regexp.exec(value); + var parsed = null; + if (mArr) { + parsed = { i: parseFloat(mArr[1]) }; + } else { + parsed = { p: value.replace(/\\([.[\]])/g, '$1') }; + } + + return parsed; + }); +} + +/* ! + * ## internalGetPathValue(obj, parsed[, pathDepth]) + * + * Helper companion function for `.parsePath` that returns + * the value located at the parsed address. + * + * var value = getPathValue(obj, parsed); + * + * @param {Object} object to search against + * @param {Object} parsed definition from `parsePath`. + * @param {Number} depth (nesting level) of the property we want to retrieve + * @returns {Object|Undefined} value + * @api private + */ + +function internalGetPathValue(obj, parsed, pathDepth) { + var temporaryValue = obj; + var res = null; + pathDepth = typeof pathDepth === 'undefined' ? parsed.length : pathDepth; + + for (var i = 0; i < pathDepth; i++) { + var part = parsed[i]; + if (temporaryValue) { + if (typeof part.p === 'undefined') { + temporaryValue = temporaryValue[part.i]; + } else { + temporaryValue = temporaryValue[part.p]; + } + + if (i === pathDepth - 1) { + res = temporaryValue; + } + } + } + + return res; +} + +/* ! + * ## internalSetPathValue(obj, value, parsed) + * + * Companion function for `parsePath` that sets + * the value located at a parsed address. + * + * internalSetPathValue(obj, 'value', parsed); + * + * @param {Object} object to search and define on + * @param {*} value to use upon set + * @param {Object} parsed definition from `parsePath` + * @api private + */ + +function internalSetPathValue(obj, val, parsed) { + var tempObj = obj; + var pathDepth = parsed.length; + var part = null; + // Here we iterate through every part of the path + for (var i = 0; i < pathDepth; i++) { + var propName = null; + var propVal = null; + part = parsed[i]; + + // If it's the last part of the path, we set the 'propName' value with the property name + if (i === pathDepth - 1) { + propName = typeof part.p === 'undefined' ? part.i : part.p; + // Now we set the property with the name held by 'propName' on object with the desired val + tempObj[propName] = val; + } else if (typeof part.p !== 'undefined' && tempObj[part.p]) { + tempObj = tempObj[part.p]; + } else if (typeof part.i !== 'undefined' && tempObj[part.i]) { + tempObj = tempObj[part.i]; + } else { + // If the obj doesn't have the property we create one with that name to define it + var next = parsed[i + 1]; + // Here we set the name of the property which will be defined + propName = typeof part.p === 'undefined' ? part.i : part.p; + // Here we decide if this property will be an array or a new object + propVal = typeof next.p === 'undefined' ? [] : {}; + tempObj[propName] = propVal; + tempObj = tempObj[propName]; + } + } +} + +/** + * ### .getPathInfo(object, path) + * + * This allows the retrieval of property info in an + * object given a string path. + * + * The path info consists of an object with the + * following properties: + * + * * parent - The parent object of the property referenced by `path` + * * name - The name of the final property, a number if it was an array indexer + * * value - The value of the property, if it exists, otherwise `undefined` + * * exists - Whether the property exists or not + * + * @param {Object} object + * @param {String} path + * @returns {Object} info + * @namespace Utils + * @name getPathInfo + * @api public + */ + +function getPathInfo(obj, path) { + var parsed = parsePath(path); + var last = parsed[parsed.length - 1]; + var info = { + parent: + parsed.length > 1 ? + internalGetPathValue(obj, parsed, parsed.length - 1) : + obj, + name: last.p || last.i, + value: internalGetPathValue(obj, parsed), + }; + info.exists = hasProperty(info.parent, info.name); + + return info; +} + +/** + * ### .getPathValue(object, path) + * + * This allows the retrieval of values in an + * object given a string path. + * + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * } + * + * The following would be the results. + * + * getPathValue(obj, 'prop1.str'); // Hello + * getPathValue(obj, 'prop1.att[2]'); // b + * getPathValue(obj, 'prop2.arr[0].nested'); // Universe + * + * @param {Object} object + * @param {String} path + * @returns {Object} value or `undefined` + * @namespace Utils + * @name getPathValue + * @api public + */ + +function getPathValue(obj, path) { + var info = getPathInfo(obj, path); + return info.value; +} + +/** + * ### .setPathValue(object, path, value) + * + * Define the value in an object at a given string path. + * + * ```js + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * }; + * ``` + * + * The following would be acceptable. + * + * ```js + * var properties = require('tea-properties'); + * properties.set(obj, 'prop1.str', 'Hello Universe!'); + * properties.set(obj, 'prop1.arr[2]', 'B'); + * properties.set(obj, 'prop2.arr[0].nested.value', { hello: 'universe' }); + * ``` + * + * @param {Object} object + * @param {String} path + * @param {Mixed} value + * @api private + */ + +function setPathValue(obj, path, val) { + var parsed = parsePath(path); + internalSetPathValue(obj, val, parsed); + return obj; +} + +module.exports = { + hasProperty: hasProperty, + getPathInfo: getPathInfo, + getPathValue: getPathValue, + setPathValue: setPathValue, +}; + +},{}],39:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.typeDetect = factory()); +})(this, (function () { 'use strict'; + + var promiseExists = typeof Promise === 'function'; + var globalObject = (function (Obj) { + if (typeof globalThis === 'object') { + return globalThis; + } + Object.defineProperty(Obj, 'typeDetectGlobalObject', { + get: function get() { + return this; + }, + configurable: true, + }); + var global = typeDetectGlobalObject; + delete Obj.typeDetectGlobalObject; + return global; + })(Object.prototype); + var symbolExists = typeof Symbol !== 'undefined'; + var mapExists = typeof Map !== 'undefined'; + var setExists = typeof Set !== 'undefined'; + var weakMapExists = typeof WeakMap !== 'undefined'; + var weakSetExists = typeof WeakSet !== 'undefined'; + var dataViewExists = typeof DataView !== 'undefined'; + var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined'; + var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined'; + var setEntriesExists = setExists && typeof Set.prototype.entries === 'function'; + var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function'; + var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries()); + var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries()); + var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function'; + var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]()); + var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function'; + var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]()); + var toStringLeftSliceLength = 8; + var toStringRightSliceLength = -1; + function typeDetect(obj) { + var typeofObj = typeof obj; + if (typeofObj !== 'object') { + return typeofObj; + } + if (obj === null) { + return 'null'; + } + if (obj === globalObject) { + return 'global'; + } + if (Array.isArray(obj) && + (symbolToStringTagExists === false || !(Symbol.toStringTag in obj))) { + return 'Array'; + } + if (typeof window === 'object' && window !== null) { + if (typeof window.location === 'object' && obj === window.location) { + return 'Location'; + } + if (typeof window.document === 'object' && obj === window.document) { + return 'Document'; + } + if (typeof window.navigator === 'object') { + if (typeof window.navigator.mimeTypes === 'object' && + obj === window.navigator.mimeTypes) { + return 'MimeTypeArray'; + } + if (typeof window.navigator.plugins === 'object' && + obj === window.navigator.plugins) { + return 'PluginArray'; + } + } + if ((typeof window.HTMLElement === 'function' || + typeof window.HTMLElement === 'object') && + obj instanceof window.HTMLElement) { + if (obj.tagName === 'BLOCKQUOTE') { + return 'HTMLQuoteElement'; + } + if (obj.tagName === 'TD') { + return 'HTMLTableDataCellElement'; + } + if (obj.tagName === 'TH') { + return 'HTMLTableHeaderCellElement'; + } + } + } + var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]); + if (typeof stringTag === 'string') { + return stringTag; + } + var objPrototype = Object.getPrototypeOf(obj); + if (objPrototype === RegExp.prototype) { + return 'RegExp'; + } + if (objPrototype === Date.prototype) { + return 'Date'; + } + if (promiseExists && objPrototype === Promise.prototype) { + return 'Promise'; + } + if (setExists && objPrototype === Set.prototype) { + return 'Set'; + } + if (mapExists && objPrototype === Map.prototype) { + return 'Map'; + } + if (weakSetExists && objPrototype === WeakSet.prototype) { + return 'WeakSet'; + } + if (weakMapExists && objPrototype === WeakMap.prototype) { + return 'WeakMap'; + } + if (dataViewExists && objPrototype === DataView.prototype) { + return 'DataView'; + } + if (mapExists && objPrototype === mapIteratorPrototype) { + return 'Map Iterator'; + } + if (setExists && objPrototype === setIteratorPrototype) { + return 'Set Iterator'; + } + if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) { + return 'Array Iterator'; + } + if (stringIteratorExists && objPrototype === stringIteratorPrototype) { + return 'String Iterator'; + } + if (objPrototype === null) { + return 'Object'; + } + return Object + .prototype + .toString + .call(obj) + .slice(toStringLeftSliceLength, toStringRightSliceLength); + } + + return typeDetect; + +})); + +},{}]},{},[1])(1) +}); diff --git a/sdk/typescript/node_modules/chai/index.js b/sdk/typescript/node_modules/chai/index.js new file mode 100644 index 0000000..634483b --- /dev/null +++ b/sdk/typescript/node_modules/chai/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/chai'); diff --git a/sdk/typescript/node_modules/chai/index.mjs b/sdk/typescript/node_modules/chai/index.mjs new file mode 100644 index 0000000..65b726a --- /dev/null +++ b/sdk/typescript/node_modules/chai/index.mjs @@ -0,0 +1,14 @@ +import chai from './index.js'; + +export const expect = chai.expect; +export const version = chai.version; +export const Assertion = chai.Assertion; +export const AssertionError = chai.AssertionError; +export const util = chai.util; +export const config = chai.config; +export const use = chai.use; +export const should = chai.should; +export const assert = chai.assert; +export const core = chai.core; + +export default chai; diff --git a/sdk/typescript/node_modules/chai/karma.conf.js b/sdk/typescript/node_modules/chai/karma.conf.js new file mode 100644 index 0000000..e22923f --- /dev/null +++ b/sdk/typescript/node_modules/chai/karma.conf.js @@ -0,0 +1,34 @@ +module.exports = function(config) { + config.set({ + frameworks: [ 'mocha' ] + , files: [ + 'chai.js' + , 'test/bootstrap/index.js' + , 'test/*.js' + ] + , reporters: [ 'progress' ] + , colors: true + , logLevel: config.LOG_INFO + , autoWatch: false + , browsers: [ 'HeadlessChrome' ] + , customLaunchers: { + HeadlessChrome: { + base: 'ChromeHeadless' + , flags: [ '--no-sandbox',] + , } + , } + , browserDisconnectTimeout: 10000 + , browserDisconnectTolerance: 2 + , browserNoActivityTimeout: 20000 + , singleRun: true + }); + + switch (process.env.CHAI_TEST_ENV) { + case 'sauce': + require('./karma.sauce')(config); + break; + default: + // ... + break; + }; +}; diff --git a/sdk/typescript/node_modules/chai/karma.sauce.js b/sdk/typescript/node_modules/chai/karma.sauce.js new file mode 100644 index 0000000..b4f22fe --- /dev/null +++ b/sdk/typescript/node_modules/chai/karma.sauce.js @@ -0,0 +1,41 @@ +var version = require('./package.json').version; +var ts = new Date().getTime(); + +module.exports = function(config) { + var auth; + + try { + auth = require('./test/auth/index'); + } catch(ex) { + auth = {}; + auth.SAUCE_USERNAME = process.env.SAUCE_USERNAME || null; + auth.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY || null; + } + + if (!auth.SAUCE_USERNAME || !auth.SAUCE_ACCESS_KEY) return; + if (process.env.SKIP_SAUCE) return; + + var branch = process.env.TRAVIS_BRANCH || 'local' + var browserConfig = require('./sauce.browsers'); + var browsers = Object.keys(browserConfig); + var tags = [ 'chaijs_' + version, auth.SAUCE_USERNAME + '@' + branch ]; + var tunnel = process.env.TRAVIS_JOB_NUMBER || ts; + + if (process.env.TRAVIS_JOB_NUMBER) { + tags.push('travis@' + process.env.TRAVIS_JOB_NUMBER); + } + + config.browsers = config.browsers.concat(browsers); + Object.assign(config.customLaunchers, browserConfig); + config.reporters.push('saucelabs'); + config.captureTimeout = 300000; + + config.sauceLabs = { + username: auth.SAUCE_USERNAME + , accessKey: auth.SAUCE_ACCESS_KEY + , startConnect: ('TRAVIS' in process.env) === false + , tags: tags + , testName: 'ChaiJS' + , tunnelIdentifier: tunnel + }; +}; diff --git a/sdk/typescript/node_modules/chai/node_modules/assertion-error/History.md b/sdk/typescript/node_modules/chai/node_modules/assertion-error/History.md new file mode 100644 index 0000000..b240018 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/assertion-error/History.md @@ -0,0 +1,24 @@ +1.1.0 / 2018-01-02 +================== + + * Add type definitions ([#11](https://github.com/chaijs/assertion-error/pull/11)) + +1.0.1 / 2015-03-04 +================== + + * Merge pull request #2 from simonzack/master + * fixes `.stack` on firefox + +1.0.0 / 2013-06-08 +================== + + * readme: change travis and component urls + * refactor: [*] prepare for move to chaijs gh org + +0.1.0 / 2013-04-07 +================== + + * test: use vanilla test runner/assert + * pgk: remove unused deps + * lib: implement + * "Initial commit" diff --git a/sdk/typescript/node_modules/chai/node_modules/assertion-error/README.md b/sdk/typescript/node_modules/chai/node_modules/assertion-error/README.md new file mode 100644 index 0000000..6cf03c8 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/assertion-error/README.md @@ -0,0 +1,41 @@ +# AssertionError [![Build Status](https://travis-ci.org/chaijs/assertion-error.png?branch=master)](https://travis-ci.org/chaijs/assertion-error) + +> Error constructor for test and validation frameworks that implements standardized AssertionError specification. + +## Installation + +### Node.js + +`assertion-error` is available on [npm](http://npmjs.org). + + $ npm install assertion-error + +### Component + +`assertion-error` is available as a [component](https://github.com/component/component). + + $ component install chaijs/assertion-error + +## License + +(The MIT License) + +Copyright (c) 2013 Jake Luer (http://qualiancy.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/node_modules/assertion-error/index.d.ts b/sdk/typescript/node_modules/chai/node_modules/assertion-error/index.d.ts new file mode 100644 index 0000000..2b9becd --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/assertion-error/index.d.ts @@ -0,0 +1,11 @@ +type AssertionError = Error & T & { + showDiff: boolean; +}; + +interface AssertionErrorConstructor { + new(message: string, props?: T, ssf?: Function): AssertionError; +} + +declare const AssertionError: AssertionErrorConstructor; + +export = AssertionError; diff --git a/sdk/typescript/node_modules/chai/node_modules/assertion-error/index.js b/sdk/typescript/node_modules/chai/node_modules/assertion-error/index.js new file mode 100644 index 0000000..8466da8 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/assertion-error/index.js @@ -0,0 +1,116 @@ +/*! + * assertion-error + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +/*! + * Return a function that will copy properties from + * one object to another excluding any originally + * listed. Returned function will create a new `{}`. + * + * @param {String} excluded properties ... + * @return {Function} + */ + +function exclude () { + var excludes = [].slice.call(arguments); + + function excludeProps (res, obj) { + Object.keys(obj).forEach(function (key) { + if (!~excludes.indexOf(key)) res[key] = obj[key]; + }); + } + + return function extendExclude () { + var args = [].slice.call(arguments) + , i = 0 + , res = {}; + + for (; i < args.length; i++) { + excludeProps(res, args[i]); + } + + return res; + }; +}; + +/*! + * Primary Exports + */ + +module.exports = AssertionError; + +/** + * ### AssertionError + * + * An extension of the JavaScript `Error` constructor for + * assertion and validation scenarios. + * + * @param {String} message + * @param {Object} properties to include (optional) + * @param {callee} start stack function (optional) + */ + +function AssertionError (message, _props, ssf) { + var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') + , props = extend(_props || {}); + + // default values + this.message = message || 'Unspecified AssertionError'; + this.showDiff = false; + + // copy from properties + for (var key in props) { + this[key] = props[key]; + } + + // capture stack trace + ssf = ssf || AssertionError; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, ssf); + } else { + try { + throw new Error(); + } catch(e) { + this.stack = e.stack; + } + } +} + +/*! + * Inherit from Error.prototype + */ + +AssertionError.prototype = Object.create(Error.prototype); + +/*! + * Statically set name + */ + +AssertionError.prototype.name = 'AssertionError'; + +/*! + * Ensure correct constructor + */ + +AssertionError.prototype.constructor = AssertionError; + +/** + * Allow errors to be converted to JSON for static transfer. + * + * @param {Boolean} include stack (default: `true`) + * @return {Object} object that can be `JSON.stringify` + */ + +AssertionError.prototype.toJSON = function (stack) { + var extend = exclude('constructor', 'toJSON', 'stack') + , props = extend({ name: this.name }, this); + + // include stack if exists and not turned off + if (false !== stack && this.stack) { + props.stack = this.stack; + } + + return props; +}; diff --git a/sdk/typescript/node_modules/chai/node_modules/assertion-error/package.json b/sdk/typescript/node_modules/chai/node_modules/assertion-error/package.json new file mode 100644 index 0000000..facc5ab --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/assertion-error/package.json @@ -0,0 +1,29 @@ +{ + "name": "assertion-error", + "version": "1.1.0", + "description": "Error constructor for test and validation frameworks that implements standardized AssertionError specification.", + "author": "Jake Luer (http://qualiancy.com)", + "license": "MIT", + "types": "./index.d.ts", + "keywords": [ + "test", + "assertion", + "assertion-error" + ], + "repository": { + "type": "git", + "url": "git@github.com:chaijs/assertion-error.git" + }, + "engines": { + "node": "*" + }, + "main": "./index", + "scripts": { + "test": "make test" + }, + "dependencies": {}, + "devDependencies": { + "component": "*", + "typescript": "^2.6.1" + } +} diff --git a/sdk/typescript/node_modules/chai/node_modules/check-error/LICENSE b/sdk/typescript/node_modules/chai/node_modules/check-error/LICENSE new file mode 100644 index 0000000..7ea799f --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/check-error/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013 Jake Luer (http://alogicalparadox.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/node_modules/check-error/README.md b/sdk/typescript/node_modules/chai/node_modules/check-error/README.md new file mode 100644 index 0000000..1fa64c3 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/check-error/README.md @@ -0,0 +1,207 @@ +

+ + ChaiJS check-error + +

+ +

+ Error comparison and information related utility for node and the browser. +

+ +

+ + license:mit + + + tag:? + + + build:? + + + coverage:? + + + npm:? + + + dependencies:? + + + devDependencies:? + +
+ + Selenium Test Status + +
+ + Join the Slack chat + + + Join the Gitter chat + +

+ +## What is Check-Error? + +Check-Error is a module which you can use to retrieve an Error's information such as its `message` or `constructor` name and also to check whether two Errors are compatible based on their messages, constructors or even instances. + +## Installation + +### Node.js + +`check-error` is available on [npm](http://npmjs.org). To install it, type: + + $ npm install check-error + +### Browsers + +You can also use it within the browser; install via npm and use the `check-error.js` file found within the download. For example: + +```html + +``` + +## Usage + +The primary export of `check-error` is an object which has the following methods: + +* `compatibleInstance(err, errorLike)` - Checks if an error is compatible with another `errorLike` object. If `errorLike` is an error instance we do a strict comparison, otherwise we return `false` by default, because instances of objects can only be compatible if they're both error instances. +* `compatibleConstructor(err, errorLike)` - Checks if an error's constructor is compatible with another `errorLike` object. If `err` has the same constructor as `errorLike` or if `err` is an instance of `errorLike`. +* `compatibleMessage(err, errMatcher)` - Checks if an error message is compatible with an `errMatcher` RegExp or String (we check if the message contains the String). +* `getConstructorName(errorLike)` - Retrieves the name of a constructor, an error's constructor or `errorLike` itself if it's not an error instance or constructor. +* `getMessage(err)` - Retrieves the message of an error or `err` itself if it's a String. If `err` or `err.message` is undefined we return an empty String. + +```js +var checkError = require('check-error'); +``` + +#### .compatibleInstance(err, errorLike) + +```js +var checkError = require('check-error'); + +var funcThatThrows = function() { throw new TypeError('I am a TypeError') }; +var caughtErr; + +try { + funcThatThrows(); +} catch(e) { + caughtErr = e; +} + +var sameInstance = caughtErr; + +checkError.compatibleInstance(caughtErr, sameInstance); // true +checkError.compatibleInstance(caughtErr, new TypeError('Another error')); // false +``` + +#### .compatibleConstructor(err, errorLike) + +```js +var checkError = require('check-error'); + +var funcThatThrows = function() { throw new TypeError('I am a TypeError') }; +var caughtErr; + +try { + funcThatThrows(); +} catch(e) { + caughtErr = e; +} + +checkError.compatibleConstructor(caughtErr, Error); // true +checkError.compatibleConstructor(caughtErr, TypeError); // true +checkError.compatibleConstructor(caughtErr, RangeError); // false +``` + +#### .compatibleMessage(err, errMatcher) + +```js +var checkError = require('check-error'); + +var funcThatThrows = function() { throw new TypeError('I am a TypeError') }; +var caughtErr; + +try { + funcThatThrows(); +} catch(e) { + caughtErr = e; +} + +var sameInstance = caughtErr; + +checkError.compatibleMessage(caughtErr, /TypeError$/); // true +checkError.compatibleMessage(caughtErr, 'I am a'); // true +checkError.compatibleMessage(caughtErr, /unicorn/); // false +checkError.compatibleMessage(caughtErr, 'I do not exist'); // false +``` + +#### .getConstructorName(errorLike) + +```js +var checkError = require('check-error'); + +var funcThatThrows = function() { throw new TypeError('I am a TypeError') }; +var caughtErr; + +try { + funcThatThrows(); +} catch(e) { + caughtErr = e; +} + +var sameInstance = caughtErr; + +checkError.getConstructorName(caughtErr) // 'TypeError' +``` + +#### .getMessage(err) + +```js +var checkError = require('check-error'); + +var funcThatThrows = function() { throw new TypeError('I am a TypeError') }; +var caughtErr; + +try { + funcThatThrows(); +} catch(e) { + caughtErr = e; +} + +var sameInstance = caughtErr; + +checkError.getMessage(caughtErr) // 'I am a TypeError' +``` diff --git a/sdk/typescript/node_modules/chai/node_modules/check-error/check-error.js b/sdk/typescript/node_modules/chai/node_modules/check-error/check-error.js new file mode 100644 index 0000000..0070ed4 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/check-error/check-error.js @@ -0,0 +1 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i + * MIT Licensed + */ + +var getFunctionName = require('get-func-name'); +/** + * ### .checkError + * + * Checks that an error conforms to a given set of criteria and/or retrieves information about it. + * + * @api public + */ + +/** + * ### .compatibleInstance(thrown, errorLike) + * + * Checks if two instances are compatible (strict equal). + * Returns false if errorLike is not an instance of Error, because instances + * can only be compatible if they're both error instances. + * + * @name compatibleInstance + * @param {Error} thrown error + * @param {Error|ErrorConstructor} errorLike object to compare against + * @namespace Utils + * @api public + */ + +function compatibleInstance(thrown, errorLike) { + return errorLike instanceof Error && thrown === errorLike; +} + +/** + * ### .compatibleConstructor(thrown, errorLike) + * + * Checks if two constructors are compatible. + * This function can receive either an error constructor or + * an error instance as the `errorLike` argument. + * Constructors are compatible if they're the same or if one is + * an instance of another. + * + * @name compatibleConstructor + * @param {Error} thrown error + * @param {Error|ErrorConstructor} errorLike object to compare against + * @namespace Utils + * @api public + */ + +function compatibleConstructor(thrown, errorLike) { + if (errorLike instanceof Error) { + // If `errorLike` is an instance of any error we compare their constructors + return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor; + } else if (errorLike.prototype instanceof Error || errorLike === Error) { + // If `errorLike` is a constructor that inherits from Error, we compare `thrown` to `errorLike` directly + return thrown.constructor === errorLike || thrown instanceof errorLike; + } + + return false; +} + +/** + * ### .compatibleMessage(thrown, errMatcher) + * + * Checks if an error's message is compatible with a matcher (String or RegExp). + * If the message contains the String or passes the RegExp test, + * it is considered compatible. + * + * @name compatibleMessage + * @param {Error} thrown error + * @param {String|RegExp} errMatcher to look for into the message + * @namespace Utils + * @api public + */ + +function compatibleMessage(thrown, errMatcher) { + var comparisonString = typeof thrown === 'string' ? thrown : thrown.message; + if (errMatcher instanceof RegExp) { + return errMatcher.test(comparisonString); + } else if (typeof errMatcher === 'string') { + return comparisonString.indexOf(errMatcher) !== -1; // eslint-disable-line no-magic-numbers + } + + return false; +} + +/** + * ### .getConstructorName(errorLike) + * + * Gets the constructor name for an Error instance or constructor itself. + * + * @name getConstructorName + * @param {Error|ErrorConstructor} errorLike + * @namespace Utils + * @api public + */ + +function getConstructorName(errorLike) { + var constructorName = errorLike; + if (errorLike instanceof Error) { + constructorName = getFunctionName(errorLike.constructor); + } else if (typeof errorLike === 'function') { + // If `err` is not an instance of Error it is an error constructor itself or another function. + // If we've got a common function we get its name, otherwise we may need to create a new instance + // of the error just in case it's a poorly-constructed error. Please see chaijs/chai/issues/45 to know more. + constructorName = getFunctionName(errorLike); + if (constructorName === '') { + var newConstructorName = getFunctionName(new errorLike()); // eslint-disable-line new-cap + constructorName = newConstructorName || constructorName; + } + } + + return constructorName; +} + +/** + * ### .getMessage(errorLike) + * + * Gets the error message from an error. + * If `err` is a String itself, we return it. + * If the error has no message, we return an empty string. + * + * @name getMessage + * @param {Error|String} errorLike + * @namespace Utils + * @api public + */ + +function getMessage(errorLike) { + var msg = ''; + if (errorLike && errorLike.message) { + msg = errorLike.message; + } else if (typeof errorLike === 'string') { + msg = errorLike; + } + + return msg; +} + +module.exports = { + compatibleInstance: compatibleInstance, + compatibleConstructor: compatibleConstructor, + compatibleMessage: compatibleMessage, + getMessage: getMessage, + getConstructorName: getConstructorName, +}; diff --git a/sdk/typescript/node_modules/chai/node_modules/check-error/package.json b/sdk/typescript/node_modules/chai/node_modules/check-error/package.json new file mode 100644 index 0000000..4084f78 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/check-error/package.json @@ -0,0 +1,87 @@ +{ + "name": "check-error", + "description": "Error comparison and information related utility for node and the browser", + "keywords": [ + "check-error", + "error", + "chai util" + ], + "license": "MIT", + "author": "Jake Luer (http://alogicalparadox.com)", + "contributors": [ + "David Losert (https://github.com/davelosert)", + "Keith Cirkel (https://github.com/keithamus)", + "Miroslav Bajtoš (https://github.com/bajtos)", + "Lucas Fernandes da Costa (https://github.com/lucasfcosta)" + ], + "files": [ + "index.js", + "check-error.js" + ], + "main": "./index.js", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/chaijs/check-error.git" + }, + "scripts": { + "build": "browserify --bare $npm_package_main --standalone checkError -o check-error.js", + "lint": "eslint --ignore-path .gitignore .", + "prepublish": "npm run build", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "pretest": "npm run lint", + "test": "npm run test:node && npm run test:browser && npm run upload-coverage", + "test:browser": "karma start --singleRun=true", + "test:node": "istanbul cover _mocha", + "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0" + }, + "config": { + "ghooks": { + "commit-msg": "validate-commit-msg" + } + }, + "eslintConfig": { + "extends": [ + "strict/es5" + ], + "env": { + "es6": true + }, + "globals": { + "HTMLElement": false + }, + "rules": { + "complexity": 0, + "max-statements": 0 + } + }, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "devDependencies": { + "browserify": "^13.0.0", + "browserify-istanbul": "^1.0.0", + "coveralls": "2.11.9", + "eslint": "^2.4.0", + "eslint-config-strict": "^8.5.0", + "eslint-plugin-filenames": "^0.2.0", + "ghooks": "^1.0.1", + "istanbul": "^0.4.2", + "karma": "^0.13.22", + "karma-browserify": "^5.0.2", + "karma-coverage": "^0.5.5", + "karma-mocha": "^0.2.2", + "karma-phantomjs-launcher": "^1.0.0", + "karma-sauce-launcher": "^0.3.1", + "lcov-result-merger": "^1.0.2", + "mocha": "^2.4.5", + "phantomjs-prebuilt": "^2.1.5", + "semantic-release": "^4.3.5", + "simple-assert": "^1.0.0", + "travis-after-all": "^1.4.4", + "validate-commit-msg": "^2.3.1" + }, + "engines": { + "node": "*" + }, + "version": "1.0.3" +} diff --git a/sdk/typescript/node_modules/chai/node_modules/deep-eql/LICENSE b/sdk/typescript/node_modules/chai/node_modules/deep-eql/LICENSE new file mode 100644 index 0000000..7ea799f --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/deep-eql/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013 Jake Luer (http://alogicalparadox.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/node_modules/deep-eql/README.md b/sdk/typescript/node_modules/chai/node_modules/deep-eql/README.md new file mode 100644 index 0000000..f6e1b85 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/deep-eql/README.md @@ -0,0 +1,93 @@ +

+ + deep-eql + +

+ +

+ Improved deep equality testing for node and the browser. +

+ +

+ + build:? + + coverage:? + + dependencies:? + + devDependencies:? + +
+ + Join the Slack chat + + + Join the Gitter chat + +

+ +## What is Deep-Eql? + +Deep Eql is a module which you can use to determine if two objects are "deeply" equal - that is, rather than having referential equality (`a === b`), this module checks an object's keys recursively, until it finds primitives to check for referential equality. For more on equality in JavaScript, read [the comparison operators article on mdn](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators). + +As an example, take the following: + +```js +1 === 1 // These are primitives, they hold the same reference - they are strictly equal +1 == '1' // These are two different primitives, through type coercion they hold the same value - they are loosely equal +{ a: 1 } !== { a: 1 } // These are two different objects, they hold different references and so are not strictly equal - even though they hold the same values inside +{ a: 1 } != { a: 1 } // They have the same type, meaning loose equality performs the same check as strict equality - they are still not equal. + +var deepEql = require("deep-eql"); +deepEql({ a: 1 }, { a: 1 }) === true // deepEql can determine that they share the same keys and those keys share the same values, therefore they are deeply equal! +``` + +## Installation + +### Node.js + +`deep-eql` is available on [npm](http://npmjs.org). + + $ npm install deep-eql + +## Usage + +The primary export of `deep-eql` is function that can be given two objects to compare. It will always return a boolean which can be used to determine if two objects are deeply equal. + +### Rules + +- Strict equality for non-traversable nodes according to [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is): + - `eql(NaN, NaN).should.be.true;` + - `eql(-0, +0).should.be.false;` +- All own and inherited enumerable properties are considered: + - `eql(Object.create({ foo: { a: 1 } }), Object.create({ foo: { a: 1 } })).should.be.true;` + - `eql(Object.create({ foo: { a: 1 } }), Object.create({ foo: { a: 2 } })).should.be.false;` +- When comparing `Error` objects, only `name`, `message`, and `code` properties are considered, regardless of enumerability: + - `eql(Error('foo'), Error('foo')).should.be.true;` + - `eql(Error('foo'), Error('bar')).should.be.false;` + - `eql(Error('foo'), TypeError('foo')).should.be.false;` + - `eql(Object.assign(Error('foo'), { code: 42 }), Object.assign(Error('foo'), { code: 42 })).should.be.true;` + - `eql(Object.assign(Error('foo'), { code: 42 }), Object.assign(Error('foo'), { code: 13 })).should.be.false;` + - `eql(Object.assign(Error('foo'), { otherProp: 42 }), Object.assign(Error('foo'), { otherProp: 13 })).should.be.true;` +- Arguments are not Arrays: + - `eql([], arguments).should.be.false;` + - `eql([], Array.prototype.slice.call(arguments)).should.be.true;` diff --git a/sdk/typescript/node_modules/chai/node_modules/deep-eql/deep-eql.js b/sdk/typescript/node_modules/chai/node_modules/deep-eql/deep-eql.js new file mode 100644 index 0000000..0070ed4 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/deep-eql/deep-eql.js @@ -0,0 +1 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i + * MIT Licensed + */ + +var type = require('type-detect'); +function FakeMap() { + this._key = 'chai/deep-eql__' + Math.random() + Date.now(); +} + +FakeMap.prototype = { + get: function get(key) { + return key[this._key]; + }, + set: function set(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this._key, { + value: value, + configurable: true, + }); + } + }, +}; + +var MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap; +/*! + * Check to see if the MemoizeMap has recorded a result of the two operands + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @returns {Boolean|null} result +*/ +function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) { + // Technically, WeakMap keys can *only* be objects, not primitives. + if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + return null; + } + var leftHandMap = memoizeMap.get(leftHandOperand); + if (leftHandMap) { + var result = leftHandMap.get(rightHandOperand); + if (typeof result === 'boolean') { + return result; + } + } + return null; +} + +/*! + * Set the result of the equality into the MemoizeMap + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @param {Boolean} result +*/ +function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) { + // Technically, WeakMap keys can *only* be objects, not primitives. + if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + return; + } + var leftHandMap = memoizeMap.get(leftHandOperand); + if (leftHandMap) { + leftHandMap.set(rightHandOperand, result); + } else { + leftHandMap = new MemoizeMap(); + leftHandMap.set(rightHandOperand, result); + memoizeMap.set(leftHandOperand, leftHandMap); + } +} + +/*! + * Primary Export + */ + +module.exports = deepEqual; +module.exports.MemoizeMap = MemoizeMap; + +/** + * Assert deeply nested sameValue equality between two objects of any type. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match + */ +function deepEqual(leftHandOperand, rightHandOperand, options) { + // If we have a comparator, we can't assume anything; so bail to its check first. + if (options && options.comparator) { + return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); + } + + var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); + if (simpleResult !== null) { + return simpleResult; + } + + // Deeper comparisons are pushed through to a larger function + return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); +} + +/** + * Many comparisons can be canceled out early via simple equality or primitive checks. + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @return {Boolean|null} equal match + */ +function simpleEqual(leftHandOperand, rightHandOperand) { + // Equal references (except for Numbers) can be returned early + if (leftHandOperand === rightHandOperand) { + // Handle +-0 cases + return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand; + } + + // handle NaN cases + if ( + leftHandOperand !== leftHandOperand && // eslint-disable-line no-self-compare + rightHandOperand !== rightHandOperand // eslint-disable-line no-self-compare + ) { + return true; + } + + // Anything that is not an 'object', i.e. symbols, functions, booleans, numbers, + // strings, and undefined, can be compared by reference. + if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + // Easy out b/c it would have passed the first equality check + return false; + } + return null; +} + +/*! + * The main logic of the `deepEqual` function. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match +*/ +function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) { + options = options || {}; + options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap(); + var comparator = options && options.comparator; + + // Check if a memoized result exists. + var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize); + if (memoizeResultLeft !== null) { + return memoizeResultLeft; + } + var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize); + if (memoizeResultRight !== null) { + return memoizeResultRight; + } + + // If a comparator is present, use it. + if (comparator) { + var comparatorResult = comparator(leftHandOperand, rightHandOperand); + // Comparators may return null, in which case we want to go back to default behavior. + if (comparatorResult === false || comparatorResult === true) { + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult); + return comparatorResult; + } + // To allow comparators to override *any* behavior, we ran them first. Since it didn't decide + // what to do, we need to make sure to return the basic tests first before we move on. + var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); + if (simpleResult !== null) { + // Don't memoize this, it takes longer to set/retrieve than to just compare. + return simpleResult; + } + } + + var leftHandType = type(leftHandOperand); + if (leftHandType !== type(rightHandOperand)) { + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false); + return false; + } + + // Temporarily set the operands in the memoize object to prevent blowing the stack + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true); + + var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options); + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result); + return result; +} + +function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) { + switch (leftHandType) { + case 'String': + case 'Number': + case 'Boolean': + case 'Date': + // If these types are their instance types (e.g. `new Number`) then re-deepEqual against their values + return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf()); + case 'Promise': + case 'Symbol': + case 'function': + case 'WeakMap': + case 'WeakSet': + return leftHandOperand === rightHandOperand; + case 'Error': + return keysEqual(leftHandOperand, rightHandOperand, [ 'name', 'message', 'code' ], options); + case 'Arguments': + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + case 'Array': + return iterableEqual(leftHandOperand, rightHandOperand, options); + case 'RegExp': + return regexpEqual(leftHandOperand, rightHandOperand); + case 'Generator': + return generatorEqual(leftHandOperand, rightHandOperand, options); + case 'DataView': + return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options); + case 'ArrayBuffer': + return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options); + case 'Set': + return entriesEqual(leftHandOperand, rightHandOperand, options); + case 'Map': + return entriesEqual(leftHandOperand, rightHandOperand, options); + case 'Temporal.PlainDate': + case 'Temporal.PlainTime': + case 'Temporal.PlainDateTime': + case 'Temporal.Instant': + case 'Temporal.ZonedDateTime': + case 'Temporal.PlainYearMonth': + case 'Temporal.PlainMonthDay': + return leftHandOperand.equals(rightHandOperand); + case 'Temporal.Duration': + return leftHandOperand.total('nanoseconds') === rightHandOperand.total('nanoseconds'); + case 'Temporal.TimeZone': + case 'Temporal.Calendar': + return leftHandOperand.toString() === rightHandOperand.toString(); + default: + return objectEqual(leftHandOperand, rightHandOperand, options); + } +} + +/*! + * Compare two Regular Expressions for equality. + * + * @param {RegExp} leftHandOperand + * @param {RegExp} rightHandOperand + * @return {Boolean} result + */ + +function regexpEqual(leftHandOperand, rightHandOperand) { + return leftHandOperand.toString() === rightHandOperand.toString(); +} + +/*! + * Compare two Sets/Maps for equality. Faster than other equality functions. + * + * @param {Set} leftHandOperand + * @param {Set} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function entriesEqual(leftHandOperand, rightHandOperand, options) { + try { + // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach + if (leftHandOperand.size !== rightHandOperand.size) { + return false; + } + if (leftHandOperand.size === 0) { + return true; + } + } catch (sizeError) { + // things that aren't actual Maps or Sets will throw here + return false; + } + var leftHandItems = []; + var rightHandItems = []; + leftHandOperand.forEach(function gatherEntries(key, value) { + leftHandItems.push([ key, value ]); + }); + rightHandOperand.forEach(function gatherEntries(key, value) { + rightHandItems.push([ key, value ]); + }); + return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options); +} + +/*! + * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function iterableEqual(leftHandOperand, rightHandOperand, options) { + var length = leftHandOperand.length; + if (length !== rightHandOperand.length) { + return false; + } + if (length === 0) { + return true; + } + var index = -1; + while (++index < length) { + if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) { + return false; + } + } + return true; +} + +/*! + * Simple equality for generator objects such as those returned by generator functions. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function generatorEqual(leftHandOperand, rightHandOperand, options) { + return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options); +} + +/*! + * Determine if the given object has an @@iterator function. + * + * @param {Object} target + * @return {Boolean} `true` if the object has an @@iterator function. + */ +function hasIteratorFunction(target) { + return typeof Symbol !== 'undefined' && + typeof target === 'object' && + typeof Symbol.iterator !== 'undefined' && + typeof target[Symbol.iterator] === 'function'; +} + +/*! + * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array. + * This will consume the iterator - which could have side effects depending on the @@iterator implementation. + * + * @param {Object} target + * @returns {Array} an array of entries from the @@iterator function + */ +function getIteratorEntries(target) { + if (hasIteratorFunction(target)) { + try { + return getGeneratorEntries(target[Symbol.iterator]()); + } catch (iteratorError) { + return []; + } + } + return []; +} + +/*! + * Gets all entries from a Generator. This will consume the generator - which could have side effects. + * + * @param {Generator} target + * @returns {Array} an array of entries from the Generator. + */ +function getGeneratorEntries(generator) { + var generatorResult = generator.next(); + var accumulator = [ generatorResult.value ]; + while (generatorResult.done === false) { + generatorResult = generator.next(); + accumulator.push(generatorResult.value); + } + return accumulator; +} + +/*! + * Gets all own and inherited enumerable keys from a target. + * + * @param {Object} target + * @returns {Array} an array of own and inherited enumerable keys from the target. + */ +function getEnumerableKeys(target) { + var keys = []; + for (var key in target) { + keys.push(key); + } + return keys; +} + +function getEnumerableSymbols(target) { + var keys = []; + var allKeys = Object.getOwnPropertySymbols(target); + for (var i = 0; i < allKeys.length; i += 1) { + var key = allKeys[i]; + if (Object.getOwnPropertyDescriptor(target, key).enumerable) { + keys.push(key); + } + } + return keys; +} + +/*! + * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of + * each key. If any value of the given key is not equal, the function will return false (early). + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function keysEqual(leftHandOperand, rightHandOperand, keys, options) { + var length = keys.length; + if (length === 0) { + return true; + } + for (var i = 0; i < length; i += 1) { + if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) { + return false; + } + } + return true; +} + +/*! + * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual` + * for each enumerable key in the object. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function objectEqual(leftHandOperand, rightHandOperand, options) { + var leftHandKeys = getEnumerableKeys(leftHandOperand); + var rightHandKeys = getEnumerableKeys(rightHandOperand); + var leftHandSymbols = getEnumerableSymbols(leftHandOperand); + var rightHandSymbols = getEnumerableSymbols(rightHandOperand); + leftHandKeys = leftHandKeys.concat(leftHandSymbols); + rightHandKeys = rightHandKeys.concat(rightHandSymbols); + + if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) { + if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) { + return false; + } + return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options); + } + + var leftHandEntries = getIteratorEntries(leftHandOperand); + var rightHandEntries = getIteratorEntries(rightHandOperand); + if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) { + leftHandEntries.sort(); + rightHandEntries.sort(); + return iterableEqual(leftHandEntries, rightHandEntries, options); + } + + if (leftHandKeys.length === 0 && + leftHandEntries.length === 0 && + rightHandKeys.length === 0 && + rightHandEntries.length === 0) { + return true; + } + + return false; +} + +/*! + * Returns true if the argument is a primitive. + * + * This intentionally returns true for all objects that can be compared by reference, + * including functions and symbols. + * + * @param {Mixed} value + * @return {Boolean} result + */ +function isPrimitive(value) { + return value === null || typeof value !== 'object'; +} + +function mapSymbols(arr) { + return arr.map(function mapSymbol(entry) { + if (typeof entry === 'symbol') { + return entry.toString(); + } + + return entry; + }); +} diff --git a/sdk/typescript/node_modules/chai/node_modules/deep-eql/package.json b/sdk/typescript/node_modules/chai/node_modules/deep-eql/package.json new file mode 100644 index 0000000..27391d2 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/deep-eql/package.json @@ -0,0 +1,79 @@ +{ + "name": "deep-eql", + "version": "4.1.4", + "description": "Improved deep equality testing for Node.js and the browser.", + "keywords": [ + "chai util", + "deep equal", + "object equal", + "testing" + ], + "repository": { + "type": "git", + "url": "git@github.com:chaijs/deep-eql.git" + }, + "license": "MIT", + "author": "Jake Luer ", + "contributors": [ + "Keith Cirkel (https://github.com/keithamus)", + "dougluce (https://github.com/dougluce)", + "Lorenz Leutgeb (https://github.com/flowlo)" + ], + "main": "./index", + "files": [ + "index.js", + "deep-eql.js" + ], + "scripts": { + "bench": "node bench", + "build": "browserify $npm_package_main --standalone deepEqual -o deep-eql.js", + "lint": "eslint --ignore-path .gitignore .", + "prepublish": "npm run build", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "pretest": "npm run lint", + "test": "npm run test:node && npm run test:browser", + "test:browser": "karma start --singleRun=true", + "test:node": "istanbul cover _mocha", + "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0", + "watch": "karma start --auto-watch --singleRun=false" + }, + "eslintConfig": { + "extends": [ + "strict/es5" + ], + "rules": { + "complexity": 0, + "no-underscore-dangle": 0, + "no-use-before-define": 0, + "spaced-comment": 0 + } + }, + "dependencies": { + "type-detect": "^4.0.0" + }, + "devDependencies": { + "@js-temporal/polyfill": "^0.4.1", + "benchmark": "^2.1.0", + "browserify": "^17.0.0", + "browserify-istanbul": "^3.0.1", + "coveralls": "^3.1.1", + "eslint": "^7.32.0", + "eslint-config-strict": "^14.0.1", + "eslint-plugin-filenames": "^1.3.2", + "istanbul": "^0.4.2", + "karma": "^6.3.4", + "karma-browserify": "^8.1.0", + "karma-chrome-launcher": "^3.1.0", + "karma-coverage": "^2.0.3", + "karma-mocha": "^2.0.1", + "karma-sauce-launcher": "^4.1.4", + "kewlr": "^0.4.1", + "lcov-result-merger": "^1.0.2", + "lodash.isequal": "^4.4.0", + "mocha": "^9.1.1", + "simple-assert": "^1.0.0" + }, + "engines": { + "node": ">=6" + } +} diff --git a/sdk/typescript/node_modules/chai/node_modules/get-func-name/LICENSE b/sdk/typescript/node_modules/chai/node_modules/get-func-name/LICENSE new file mode 100644 index 0000000..7ea799f --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/get-func-name/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013 Jake Luer (http://alogicalparadox.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/node_modules/get-func-name/README.md b/sdk/typescript/node_modules/chai/node_modules/get-func-name/README.md new file mode 100644 index 0000000..e908416 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/get-func-name/README.md @@ -0,0 +1,123 @@ +

+ + ChaiJS +
+ get-func-name +
+

+ +

+ Utility for getting a function's name for node and the browser. +

+ +

+ + license:mit + + + tag:? + + + build:? + + + coverage:? + + + npm:? + + + dependencies:? + + + devDependencies:? + +
+ + Selenium Test Status + +
+ + Join the Slack chat + + + Join the Gitter chat + +

+ +## What is get-func-name? + +This is a module to retrieve a function's name securely and consistently both in NodeJS and the browser. + +## Installation + +### Node.js + +`get-func-name` is available on [npm](http://npmjs.org). To install it, type: + + $ npm install get-func-name + +### Browsers + +You can also use it within the browser; install via npm and use the `get-func-name.js` file found within the download. For example: + +```html + +``` + +## Usage + +The module `get-func-name` exports the following method: + +* `getFuncName(fn)` - Returns the name of a function. + +```js +var getFuncName = require('get-func-name'); +``` + +#### .getFuncName(fun) + +```js +var getFuncName = require('get-func-name'); + +var unknownFunction = function myCoolFunction(word) { + return word + 'is cool'; +}; + +var anonymousFunction = (function () { + return function () {}; +}()); + +getFuncName(unknownFunction) // 'myCoolFunction' +getFuncName(anonymousFunction) // '' +``` diff --git a/sdk/typescript/node_modules/chai/node_modules/get-func-name/get-func-name.js b/sdk/typescript/node_modules/chai/node_modules/get-func-name/get-func-name.js new file mode 100644 index 0000000..0070ed4 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/get-func-name/get-func-name.js @@ -0,0 +1 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i + * MIT Licensed + */ + +/** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + +var toString = Function.prototype.toString; +var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; +var maxFunctionSourceLength = 512; +function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // eslint-disable-next-line prefer-reflect + var functionSource = toString.call(aFunc); + // To avoid unconstrained resource consumption due to pathalogically large function names, + // we limit the available return value to be less than 512 characters. + if (functionSource.indexOf('(') > maxFunctionSourceLength) { + return name; + } + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = functionSource.match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; +} + +module.exports = getFuncName; diff --git a/sdk/typescript/node_modules/chai/node_modules/get-func-name/package.json b/sdk/typescript/node_modules/chai/node_modules/get-func-name/package.json new file mode 100644 index 0000000..0eb8838 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/get-func-name/package.json @@ -0,0 +1,85 @@ +{ + "name": "get-func-name", + "version": "2.0.2", + "description": "Utility for getting a function's name for node and the browser", + "keywords": [ + "get-func-name", + "chai util" + ], + "license": "MIT", + "author": "Jake Luer (http://alogicalparadox.com)", + "contributors": [ + "Keith Cirkel (https://github.com/keithamus)", + "Lucas Fernandes da Costa (https://github.com/lucasfcosta)", + "Grant Snodgrass (https://github.com/meeber)", + "Lucas Vieira (https://github.com/vieiralucas)", + "Aleksey Shvayka (https://github.com/shvaikalesh)" + ], + "files": [ + "index.js", + "get-func-name.js" + ], + "main": "./index.js", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/chaijs/get-func-name.git" + }, + "scripts": { + "build": "browserify --bare $npm_package_main --standalone getFuncName -o get-func-name.js", + "lint": "eslint --ignore-path .gitignore .", + "prepublish": "npm run build", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "pretest": "npm run lint", + "test": "npm run test:node && npm run test:browser && npm run upload-coverage", + "test:browser": "karma start --singleRun=true", + "test:node": "istanbul cover _mocha", + "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0" + }, + "config": { + "ghooks": { + "commit-msg": "validate-commit-msg" + } + }, + "eslintConfig": { + "extends": [ + "strict/es5" + ], + "env": { + "es6": true + }, + "globals": { + "HTMLElement": false + }, + "rules": { + "complexity": 0, + "max-statements": 0 + } + }, + "dependencies": {}, + "devDependencies": { + "browserify": "^13.0.0", + "browserify-istanbul": "^2.0.0", + "coveralls": "2.11.14", + "eslint": "^2.4.0", + "eslint-config-strict": "^9.1.0", + "eslint-plugin-filenames": "^1.1.0", + "ghooks": "^1.0.1", + "istanbul": "^0.4.2", + "karma": "^1.3.0", + "karma-browserify": "^5.0.2", + "karma-coverage": "^1.1.1", + "karma-mocha": "^1.2.0", + "karma-phantomjs-launcher": "^1.0.0", + "karma-sauce-launcher": "^1.0.0", + "lcov-result-merger": "^1.0.2", + "mocha": "^3.1.2", + "phantomjs-prebuilt": "^2.1.5", + "semantic-release": "^4.3.5", + "simple-assert": "^1.0.0", + "travis-after-all": "^1.4.4", + "validate-commit-msg": "^2.3.1" + }, + "engines": { + "node": "*" + } +} diff --git a/sdk/typescript/node_modules/chai/node_modules/loupe/CHANGELOG.md b/sdk/typescript/node_modules/chai/node_modules/loupe/CHANGELOG.md new file mode 100644 index 0000000..11799db --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/loupe/CHANGELOG.md @@ -0,0 +1,5 @@ + +0.0.1 / 2013-12-17 +================== + + * Initial port from chai.js diff --git a/sdk/typescript/node_modules/chai/node_modules/loupe/LICENSE b/sdk/typescript/node_modules/chai/node_modules/loupe/LICENSE new file mode 100644 index 0000000..b0c8a5a --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/loupe/LICENSE @@ -0,0 +1,9 @@ +(The MIT License) + +Copyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/node_modules/loupe/README.md b/sdk/typescript/node_modules/chai/node_modules/loupe/README.md new file mode 100644 index 0000000..44f61d3 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/loupe/README.md @@ -0,0 +1,63 @@ +![npm](https://img.shields.io/npm/v/loupe?logo=npm) +![Build](https://github.com/chaijs/loupe/workflows/Build/badge.svg?branch=master) +![Codecov branch](https://img.shields.io/codecov/c/github/chaijs/loupe/master?logo=codecov) + +# What is loupe? + +Loupe turns the object you give it into a string. It's similar to Node.js' `util.inspect()` function, but it works cross platform, in most modern browsers as well as Node. + +## Installation + +### Node.js + +`loupe` is available on [npm](http://npmjs.org). To install it, type: + + $ npm install loupe + +### Browsers + +You can also use it within the browser; install via npm and use the `loupe.js` file found within the download. For example: + +```html + +``` + +## Usage + +``` js +const { inspect } = require('loupe'); +``` + +```js +inspect({ foo: 'bar' }); // => "{ foo: 'bar' }" +inspect(1); // => '1' +inspect('foo'); // => "'foo'" +inspect([ 1, 2, 3 ]); // => '[ 1, 2, 3 ]' +inspect(/Test/g); // => '/Test/g' + +// ... +``` + +## Tests + +```bash +$ npm test +``` + +Coverage: + +```bash +$ npm run upload-coverage +``` + +## License + +(The MIT License) + +Copyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/node_modules/loupe/index.js b/sdk/typescript/node_modules/chai/node_modules/loupe/index.js new file mode 100644 index 0000000..01e0b3c --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/loupe/index.js @@ -0,0 +1,219 @@ +/* ! + * loupe + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +import inspectArray from './lib/array' +import inspectTypedArray from './lib/typedarray' +import inspectDate from './lib/date' +import inspectFunction from './lib/function' +import inspectMap from './lib/map' +import inspectNumber from './lib/number' +import inspectBigInt from './lib/bigint' +import inspectRegExp from './lib/regexp' +import inspectSet from './lib/set' +import inspectString from './lib/string' +import inspectSymbol from './lib/symbol' +import inspectPromise from './lib/promise' +import inspectClass from './lib/class' +import inspectObject from './lib/object' +import inspectArguments from './lib/arguments' +import inspectError from './lib/error' +import inspectHTMLElement, { inspectHTMLCollection } from './lib/html' + +import { normaliseOptions } from './lib/helpers' + +const symbolsSupported = typeof Symbol === 'function' && typeof Symbol.for === 'function' +const chaiInspect = symbolsSupported ? Symbol.for('chai/inspect') : '@@chai/inspect' +let nodeInspect = false +try { + // eslint-disable-next-line global-require + const nodeUtil = require('util') + nodeInspect = nodeUtil.inspect ? nodeUtil.inspect.custom : false +} catch (noNodeInspect) { + nodeInspect = false +} + +function FakeMap() { + // eslint-disable-next-line prefer-template + this.key = 'chai/loupe__' + Math.random() + Date.now() +} +FakeMap.prototype = { + // eslint-disable-next-line object-shorthand + get: function get(key) { + return key[this.key] + }, + // eslint-disable-next-line object-shorthand + has: function has(key) { + return this.key in key + }, + // eslint-disable-next-line object-shorthand + set: function set(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this.key, { + // eslint-disable-next-line object-shorthand + value: value, + configurable: true, + }) + } + }, +} +const constructorMap = new (typeof WeakMap === 'function' ? WeakMap : FakeMap)() +const stringTagMap = {} +const baseTypesMap = { + undefined: (value, options) => options.stylize('undefined', 'undefined'), + null: (value, options) => options.stylize(null, 'null'), + + boolean: (value, options) => options.stylize(value, 'boolean'), + Boolean: (value, options) => options.stylize(value, 'boolean'), + + number: inspectNumber, + Number: inspectNumber, + + bigint: inspectBigInt, + BigInt: inspectBigInt, + + string: inspectString, + String: inspectString, + + function: inspectFunction, + Function: inspectFunction, + + symbol: inspectSymbol, + // A Symbol polyfill will return `Symbol` not `symbol` from typedetect + Symbol: inspectSymbol, + + Array: inspectArray, + Date: inspectDate, + Map: inspectMap, + Set: inspectSet, + RegExp: inspectRegExp, + Promise: inspectPromise, + + // WeakSet, WeakMap are totally opaque to us + WeakSet: (value, options) => options.stylize('WeakSet{…}', 'special'), + WeakMap: (value, options) => options.stylize('WeakMap{…}', 'special'), + + Arguments: inspectArguments, + Int8Array: inspectTypedArray, + Uint8Array: inspectTypedArray, + Uint8ClampedArray: inspectTypedArray, + Int16Array: inspectTypedArray, + Uint16Array: inspectTypedArray, + Int32Array: inspectTypedArray, + Uint32Array: inspectTypedArray, + Float32Array: inspectTypedArray, + Float64Array: inspectTypedArray, + + Generator: () => '', + DataView: () => '', + ArrayBuffer: () => '', + + Error: inspectError, + + HTMLCollection: inspectHTMLCollection, + NodeList: inspectHTMLCollection, +} + +// eslint-disable-next-line complexity +const inspectCustom = (value, options, type) => { + if (chaiInspect in value && typeof value[chaiInspect] === 'function') { + return value[chaiInspect](options) + } + + if (nodeInspect && nodeInspect in value && typeof value[nodeInspect] === 'function') { + return value[nodeInspect](options.depth, options) + } + + if ('inspect' in value && typeof value.inspect === 'function') { + return value.inspect(options.depth, options) + } + + if ('constructor' in value && constructorMap.has(value.constructor)) { + return constructorMap.get(value.constructor)(value, options) + } + + if (stringTagMap[type]) { + return stringTagMap[type](value, options) + } + + return '' +} + +const toString = Object.prototype.toString + +// eslint-disable-next-line complexity +export function inspect(value, options) { + options = normaliseOptions(options) + options.inspect = inspect + const { customInspect } = options + let type = value === null ? 'null' : typeof value + if (type === 'object') { + type = toString.call(value).slice(8, -1) + } + + // If it is a base value that we already support, then use Loupe's inspector + if (baseTypesMap[type]) { + return baseTypesMap[type](value, options) + } + + // If `options.customInspect` is set to true then try to use the custom inspector + if (customInspect && value) { + const output = inspectCustom(value, options, type) + if (output) { + if (typeof output === 'string') return output + return inspect(output, options) + } + } + + const proto = value ? Object.getPrototypeOf(value) : false + // If it's a plain Object then use Loupe's inspector + if (proto === Object.prototype || proto === null) { + return inspectObject(value, options) + } + + // Specifically account for HTMLElements + // eslint-disable-next-line no-undef + if (value && typeof HTMLElement === 'function' && value instanceof HTMLElement) { + return inspectHTMLElement(value, options) + } + + if ('constructor' in value) { + // If it is a class, inspect it like an object but add the constructor name + if (value.constructor !== Object) { + return inspectClass(value, options) + } + + // If it is an object with an anonymous prototype, display it as an object. + return inspectObject(value, options) + } + + // last chance to check if it's an object + if (value === Object(value)) { + return inspectObject(value, options) + } + + // We have run out of options! Just stringify the value + return options.stylize(String(value), type) +} + +export function registerConstructor(constructor, inspector) { + if (constructorMap.has(constructor)) { + return false + } + constructorMap.set(constructor, inspector) + return true +} + +export function registerStringTag(stringTag, inspector) { + if (stringTag in stringTagMap) { + return false + } + stringTagMap[stringTag] = inspector + return true +} + +export const custom = chaiInspect + +export default inspect diff --git a/sdk/typescript/node_modules/chai/node_modules/loupe/loupe.js b/sdk/typescript/node_modules/chai/node_modules/loupe/loupe.js new file mode 100644 index 0000000..5e1c239 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/loupe/loupe.js @@ -0,0 +1,891 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.loupe = {})); +}(this, (function (exports) { 'use strict'; + + function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArrayLimit(arr, i) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var ansiColors = { + bold: ['1', '22'], + dim: ['2', '22'], + italic: ['3', '23'], + underline: ['4', '24'], + // 5 & 6 are blinking + inverse: ['7', '27'], + hidden: ['8', '28'], + strike: ['9', '29'], + // 10-20 are fonts + // 21-29 are resets for 1-9 + black: ['30', '39'], + red: ['31', '39'], + green: ['32', '39'], + yellow: ['33', '39'], + blue: ['34', '39'], + magenta: ['35', '39'], + cyan: ['36', '39'], + white: ['37', '39'], + brightblack: ['30;1', '39'], + brightred: ['31;1', '39'], + brightgreen: ['32;1', '39'], + brightyellow: ['33;1', '39'], + brightblue: ['34;1', '39'], + brightmagenta: ['35;1', '39'], + brightcyan: ['36;1', '39'], + brightwhite: ['37;1', '39'], + grey: ['90', '39'] + }; + var styles = { + special: 'cyan', + number: 'yellow', + bigint: 'yellow', + boolean: 'yellow', + undefined: 'grey', + null: 'bold', + string: 'green', + symbol: 'green', + date: 'magenta', + regexp: 'red' + }; + var truncator = '…'; + + function colorise(value, styleType) { + var color = ansiColors[styles[styleType]] || ansiColors[styleType]; + + if (!color) { + return String(value); + } + + return "\x1B[".concat(color[0], "m").concat(String(value), "\x1B[").concat(color[1], "m"); + } + + function normaliseOptions() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$showHidden = _ref.showHidden, + showHidden = _ref$showHidden === void 0 ? false : _ref$showHidden, + _ref$depth = _ref.depth, + depth = _ref$depth === void 0 ? 2 : _ref$depth, + _ref$colors = _ref.colors, + colors = _ref$colors === void 0 ? false : _ref$colors, + _ref$customInspect = _ref.customInspect, + customInspect = _ref$customInspect === void 0 ? true : _ref$customInspect, + _ref$showProxy = _ref.showProxy, + showProxy = _ref$showProxy === void 0 ? false : _ref$showProxy, + _ref$maxArrayLength = _ref.maxArrayLength, + maxArrayLength = _ref$maxArrayLength === void 0 ? Infinity : _ref$maxArrayLength, + _ref$breakLength = _ref.breakLength, + breakLength = _ref$breakLength === void 0 ? Infinity : _ref$breakLength, + _ref$seen = _ref.seen, + seen = _ref$seen === void 0 ? [] : _ref$seen, + _ref$truncate = _ref.truncate, + truncate = _ref$truncate === void 0 ? Infinity : _ref$truncate, + _ref$stylize = _ref.stylize, + stylize = _ref$stylize === void 0 ? String : _ref$stylize; + + var options = { + showHidden: Boolean(showHidden), + depth: Number(depth), + colors: Boolean(colors), + customInspect: Boolean(customInspect), + showProxy: Boolean(showProxy), + maxArrayLength: Number(maxArrayLength), + breakLength: Number(breakLength), + truncate: Number(truncate), + seen: seen, + stylize: stylize + }; + + if (options.colors) { + options.stylize = colorise; + } + + return options; + } + function truncate(string, length) { + var tail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : truncator; + string = String(string); + var tailLength = tail.length; + var stringLength = string.length; + + if (tailLength > length && stringLength > tailLength) { + return tail; + } + + if (stringLength > length && stringLength > tailLength) { + return "".concat(string.slice(0, length - tailLength)).concat(tail); + } + + return string; + } // eslint-disable-next-line complexity + + function inspectList(list, options, inspectItem) { + var separator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ', '; + inspectItem = inspectItem || options.inspect; + var size = list.length; + if (size === 0) return ''; + var originalLength = options.truncate; + var output = ''; + var peek = ''; + var truncated = ''; + + for (var i = 0; i < size; i += 1) { + var last = i + 1 === list.length; + var secondToLast = i + 2 === list.length; + truncated = "".concat(truncator, "(").concat(list.length - i, ")"); + var value = list[i]; // If there is more than one remaining we need to account for a separator of `, ` + + options.truncate = originalLength - output.length - (last ? 0 : separator.length); + var string = peek || inspectItem(value, options) + (last ? '' : separator); + var nextLength = output.length + string.length; + var truncatedLength = nextLength + truncated.length; // If this is the last element, and adding it would + // take us over length, but adding the truncator wouldn't - then break now + + if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) { + break; + } // If this isn't the last or second to last element to scan, + // but the string is already over length then break here + + + if (!last && !secondToLast && truncatedLength > originalLength) { + break; + } // Peek at the next string to determine if we should + // break early before adding this item to the output + + + peek = last ? '' : inspectItem(list[i + 1], options) + (secondToLast ? '' : separator); // If we have one element left, but this element and + // the next takes over length, the break early + + if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) { + break; + } + + output += string; // If the next element takes us to length - + // but there are more after that, then we should truncate now + + if (!last && !secondToLast && nextLength + peek.length >= originalLength) { + truncated = "".concat(truncator, "(").concat(list.length - i - 1, ")"); + break; + } + + truncated = ''; + } + + return "".concat(output).concat(truncated); + } + + function quoteComplexKey(key) { + if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) { + return key; + } + + return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"); + } + + function inspectProperty(_ref2, options) { + var _ref3 = _slicedToArray(_ref2, 2), + key = _ref3[0], + value = _ref3[1]; + + options.truncate -= 2; + + if (typeof key === 'string') { + key = quoteComplexKey(key); + } else if (typeof key !== 'number') { + key = "[".concat(options.inspect(key, options), "]"); + } + + options.truncate -= key.length; + value = options.inspect(value, options); + return "".concat(key, ": ").concat(value); + } + + function inspectArray(array, options) { + // Object.keys will always output the Array indices first, so we can slice by + // `array.length` to get non-index properties + var nonIndexProperties = Object.keys(array).slice(array.length); + if (!array.length && !nonIndexProperties.length) return '[]'; + options.truncate -= 4; + var listContents = inspectList(array, options); + options.truncate -= listContents.length; + var propertyContents = ''; + + if (nonIndexProperties.length) { + propertyContents = inspectList(nonIndexProperties.map(function (key) { + return [key, array[key]]; + }), options, inspectProperty); + } + + return "[ ".concat(listContents).concat(propertyContents ? ", ".concat(propertyContents) : '', " ]"); + } + + /* ! + * Chai - getFuncName utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + + /** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + + var toString = Function.prototype.toString; + var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; + var maxFunctionSourceLength = 512; + function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // eslint-disable-next-line prefer-reflect + var functionSource = toString.call(aFunc); + // To avoid unconstrained resource consumption due to pathalogically large function names, + // we limit the available return value to be less than 512 characters. + if (functionSource.indexOf('(') > maxFunctionSourceLength) { + return name; + } + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = functionSource.match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; + } + + var getFuncName_1 = getFuncName; + + var getArrayName = function getArrayName(array) { + // We need to special case Node.js' Buffers, which report to be Uint8Array + if (typeof Buffer === 'function' && array instanceof Buffer) { + return 'Buffer'; + } + + if (array[Symbol.toStringTag]) { + return array[Symbol.toStringTag]; + } + + return getFuncName_1(array.constructor); + }; + + function inspectTypedArray(array, options) { + var name = getArrayName(array); + options.truncate -= name.length + 4; // Object.keys will always output the Array indices first, so we can slice by + // `array.length` to get non-index properties + + var nonIndexProperties = Object.keys(array).slice(array.length); + if (!array.length && !nonIndexProperties.length) return "".concat(name, "[]"); // As we know TypedArrays only contain Unsigned Integers, we can skip inspecting each one and simply + // stylise the toString() value of them + + var output = ''; + + for (var i = 0; i < array.length; i++) { + var string = "".concat(options.stylize(truncate(array[i], options.truncate), 'number')).concat(i === array.length - 1 ? '' : ', '); + options.truncate -= string.length; + + if (array[i] !== array.length && options.truncate <= 3) { + output += "".concat(truncator, "(").concat(array.length - array[i] + 1, ")"); + break; + } + + output += string; + } + + var propertyContents = ''; + + if (nonIndexProperties.length) { + propertyContents = inspectList(nonIndexProperties.map(function (key) { + return [key, array[key]]; + }), options, inspectProperty); + } + + return "".concat(name, "[ ").concat(output).concat(propertyContents ? ", ".concat(propertyContents) : '', " ]"); + } + + function inspectDate(dateObject, options) { + var stringRepresentation = dateObject.toJSON(); + + if (stringRepresentation === null) { + return 'Invalid Date'; + } + + var split = stringRepresentation.split('T'); + var date = split[0]; // If we need to - truncate the time portion, but never the date + + return options.stylize("".concat(date, "T").concat(truncate(split[1], options.truncate - date.length - 1)), 'date'); + } + + function inspectFunction(func, options) { + var name = getFuncName_1(func); + + if (!name) { + return options.stylize('[Function]', 'special'); + } + + return options.stylize("[Function ".concat(truncate(name, options.truncate - 11), "]"), 'special'); + } + + function inspectMapEntry(_ref, options) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + options.truncate -= 4; + key = options.inspect(key, options); + options.truncate -= key.length; + value = options.inspect(value, options); + return "".concat(key, " => ").concat(value); + } // IE11 doesn't support `map.entries()` + + + function mapToEntries(map) { + var entries = []; + map.forEach(function (value, key) { + entries.push([key, value]); + }); + return entries; + } + + function inspectMap(map, options) { + var size = map.size - 1; + + if (size <= 0) { + return 'Map{}'; + } + + options.truncate -= 7; + return "Map{ ".concat(inspectList(mapToEntries(map), options, inspectMapEntry), " }"); + } + + var isNaN = Number.isNaN || function (i) { + return i !== i; + }; // eslint-disable-line no-self-compare + + + function inspectNumber(number, options) { + if (isNaN(number)) { + return options.stylize('NaN', 'number'); + } + + if (number === Infinity) { + return options.stylize('Infinity', 'number'); + } + + if (number === -Infinity) { + return options.stylize('-Infinity', 'number'); + } + + if (number === 0) { + return options.stylize(1 / number === Infinity ? '+0' : '-0', 'number'); + } + + return options.stylize(truncate(number, options.truncate), 'number'); + } + + function inspectBigInt(number, options) { + var nums = truncate(number.toString(), options.truncate - 1); + if (nums !== truncator) nums += 'n'; + return options.stylize(nums, 'bigint'); + } + + function inspectRegExp(value, options) { + var flags = value.toString().split('/')[2]; + var sourceLength = options.truncate - (2 + flags.length); + var source = value.source; + return options.stylize("/".concat(truncate(source, sourceLength), "/").concat(flags), 'regexp'); + } + + function arrayFromSet(set) { + var values = []; + set.forEach(function (value) { + values.push(value); + }); + return values; + } + + function inspectSet(set, options) { + if (set.size === 0) return 'Set{}'; + options.truncate -= 7; + return "Set{ ".concat(inspectList(arrayFromSet(set), options), " }"); + } + + var stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5" + "\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", 'g'); + var escapeCharacters = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + "'": "\\'", + '\\': '\\\\' + }; + var hex = 16; + var unicodeLength = 4; + + function escape(char) { + return escapeCharacters[char] || "\\u".concat("0000".concat(char.charCodeAt(0).toString(hex)).slice(-unicodeLength)); + } + + function inspectString(string, options) { + if (stringEscapeChars.test(string)) { + string = string.replace(stringEscapeChars, escape); + } + + return options.stylize("'".concat(truncate(string, options.truncate - 2), "'"), 'string'); + } + + function inspectSymbol(value) { + if ('description' in Symbol.prototype) { + return value.description ? "Symbol(".concat(value.description, ")") : 'Symbol()'; + } + + return value.toString(); + } + + var getPromiseValue = function getPromiseValue() { + return 'Promise{…}'; + }; + + try { + var _process$binding = process.binding('util'), + getPromiseDetails = _process$binding.getPromiseDetails, + kPending = _process$binding.kPending, + kRejected = _process$binding.kRejected; + + if (Array.isArray(getPromiseDetails(Promise.resolve()))) { + getPromiseValue = function getPromiseValue(value, options) { + var _getPromiseDetails = getPromiseDetails(value), + _getPromiseDetails2 = _slicedToArray(_getPromiseDetails, 2), + state = _getPromiseDetails2[0], + innerValue = _getPromiseDetails2[1]; + + if (state === kPending) { + return 'Promise{}'; + } + + return "Promise".concat(state === kRejected ? '!' : '', "{").concat(options.inspect(innerValue, options), "}"); + }; + } + } catch (notNode) { + /* ignore */ + } + + var inspectPromise = getPromiseValue; + + function inspectObject(object, options) { + var properties = Object.getOwnPropertyNames(object); + var symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : []; + + if (properties.length === 0 && symbols.length === 0) { + return '{}'; + } + + options.truncate -= 4; + options.seen = options.seen || []; + + if (options.seen.indexOf(object) >= 0) { + return '[Circular]'; + } + + options.seen.push(object); + var propertyContents = inspectList(properties.map(function (key) { + return [key, object[key]]; + }), options, inspectProperty); + var symbolContents = inspectList(symbols.map(function (key) { + return [key, object[key]]; + }), options, inspectProperty); + options.seen.pop(); + var sep = ''; + + if (propertyContents && symbolContents) { + sep = ', '; + } + + return "{ ".concat(propertyContents).concat(sep).concat(symbolContents, " }"); + } + + var toStringTag = typeof Symbol !== 'undefined' && Symbol.toStringTag ? Symbol.toStringTag : false; + function inspectClass(value, options) { + var name = ''; + + if (toStringTag && toStringTag in value) { + name = value[toStringTag]; + } + + name = name || getFuncName_1(value.constructor); // Babel transforms anonymous classes to the name `_class` + + if (!name || name === '_class') { + name = ''; + } + + options.truncate -= name.length; + return "".concat(name).concat(inspectObject(value, options)); + } + + function inspectArguments(args, options) { + if (args.length === 0) return 'Arguments[]'; + options.truncate -= 13; + return "Arguments[ ".concat(inspectList(args, options), " ]"); + } + + var errorKeys = ['stack', 'line', 'column', 'name', 'message', 'fileName', 'lineNumber', 'columnNumber', 'number', 'description']; + function inspectObject$1(error, options) { + var properties = Object.getOwnPropertyNames(error).filter(function (key) { + return errorKeys.indexOf(key) === -1; + }); + var name = error.name; + options.truncate -= name.length; + var message = ''; + + if (typeof error.message === 'string') { + message = truncate(error.message, options.truncate); + } else { + properties.unshift('message'); + } + + message = message ? ": ".concat(message) : ''; + options.truncate -= message.length + 5; + var propertyContents = inspectList(properties.map(function (key) { + return [key, error[key]]; + }), options, inspectProperty); + return "".concat(name).concat(message).concat(propertyContents ? " { ".concat(propertyContents, " }") : ''); + } + + function inspectAttribute(_ref, options) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + options.truncate -= 3; + + if (!value) { + return "".concat(options.stylize(key, 'yellow')); + } + + return "".concat(options.stylize(key, 'yellow'), "=").concat(options.stylize("\"".concat(value, "\""), 'string')); + } + function inspectHTMLCollection(collection, options) { + // eslint-disable-next-line no-use-before-define + return inspectList(collection, options, inspectHTML, '\n'); + } + function inspectHTML(element, options) { + var properties = element.getAttributeNames(); + var name = element.tagName.toLowerCase(); + var head = options.stylize("<".concat(name), 'special'); + var headClose = options.stylize(">", 'special'); + var tail = options.stylize(""), 'special'); + options.truncate -= name.length * 2 + 5; + var propertyContents = ''; + + if (properties.length > 0) { + propertyContents += ' '; + propertyContents += inspectList(properties.map(function (key) { + return [key, element.getAttribute(key)]; + }), options, inspectAttribute, ' '); + } + + options.truncate -= propertyContents.length; + var truncate = options.truncate; + var children = inspectHTMLCollection(element.children, options); + + if (children && children.length > truncate) { + children = "".concat(truncator, "(").concat(element.children.length, ")"); + } + + return "".concat(head).concat(propertyContents).concat(headClose).concat(children).concat(tail); + } + + var symbolsSupported = typeof Symbol === 'function' && typeof Symbol.for === 'function'; + var chaiInspect = symbolsSupported ? Symbol.for('chai/inspect') : '@@chai/inspect'; + var nodeInspect = false; + + try { + // eslint-disable-next-line global-require + var nodeUtil = require('util'); + + nodeInspect = nodeUtil.inspect ? nodeUtil.inspect.custom : false; + } catch (noNodeInspect) { + nodeInspect = false; + } + + function FakeMap() { + // eslint-disable-next-line prefer-template + this.key = 'chai/loupe__' + Math.random() + Date.now(); + } + + FakeMap.prototype = { + // eslint-disable-next-line object-shorthand + get: function get(key) { + return key[this.key]; + }, + // eslint-disable-next-line object-shorthand + has: function has(key) { + return this.key in key; + }, + // eslint-disable-next-line object-shorthand + set: function set(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this.key, { + // eslint-disable-next-line object-shorthand + value: value, + configurable: true + }); + } + } + }; + var constructorMap = new (typeof WeakMap === 'function' ? WeakMap : FakeMap)(); + var stringTagMap = {}; + var baseTypesMap = { + undefined: function undefined$1(value, options) { + return options.stylize('undefined', 'undefined'); + }, + null: function _null(value, options) { + return options.stylize(null, 'null'); + }, + boolean: function boolean(value, options) { + return options.stylize(value, 'boolean'); + }, + Boolean: function Boolean(value, options) { + return options.stylize(value, 'boolean'); + }, + number: inspectNumber, + Number: inspectNumber, + bigint: inspectBigInt, + BigInt: inspectBigInt, + string: inspectString, + String: inspectString, + function: inspectFunction, + Function: inspectFunction, + symbol: inspectSymbol, + // A Symbol polyfill will return `Symbol` not `symbol` from typedetect + Symbol: inspectSymbol, + Array: inspectArray, + Date: inspectDate, + Map: inspectMap, + Set: inspectSet, + RegExp: inspectRegExp, + Promise: inspectPromise, + // WeakSet, WeakMap are totally opaque to us + WeakSet: function WeakSet(value, options) { + return options.stylize('WeakSet{…}', 'special'); + }, + WeakMap: function WeakMap(value, options) { + return options.stylize('WeakMap{…}', 'special'); + }, + Arguments: inspectArguments, + Int8Array: inspectTypedArray, + Uint8Array: inspectTypedArray, + Uint8ClampedArray: inspectTypedArray, + Int16Array: inspectTypedArray, + Uint16Array: inspectTypedArray, + Int32Array: inspectTypedArray, + Uint32Array: inspectTypedArray, + Float32Array: inspectTypedArray, + Float64Array: inspectTypedArray, + Generator: function Generator() { + return ''; + }, + DataView: function DataView() { + return ''; + }, + ArrayBuffer: function ArrayBuffer() { + return ''; + }, + Error: inspectObject$1, + HTMLCollection: inspectHTMLCollection, + NodeList: inspectHTMLCollection + }; // eslint-disable-next-line complexity + + var inspectCustom = function inspectCustom(value, options, type) { + if (chaiInspect in value && typeof value[chaiInspect] === 'function') { + return value[chaiInspect](options); + } + + if (nodeInspect && nodeInspect in value && typeof value[nodeInspect] === 'function') { + return value[nodeInspect](options.depth, options); + } + + if ('inspect' in value && typeof value.inspect === 'function') { + return value.inspect(options.depth, options); + } + + if ('constructor' in value && constructorMap.has(value.constructor)) { + return constructorMap.get(value.constructor)(value, options); + } + + if (stringTagMap[type]) { + return stringTagMap[type](value, options); + } + + return ''; + }; + + var toString$1 = Object.prototype.toString; // eslint-disable-next-line complexity + + function inspect(value, options) { + options = normaliseOptions(options); + options.inspect = inspect; + var _options = options, + customInspect = _options.customInspect; + var type = value === null ? 'null' : _typeof(value); + + if (type === 'object') { + type = toString$1.call(value).slice(8, -1); + } // If it is a base value that we already support, then use Loupe's inspector + + + if (baseTypesMap[type]) { + return baseTypesMap[type](value, options); + } // If `options.customInspect` is set to true then try to use the custom inspector + + + if (customInspect && value) { + var output = inspectCustom(value, options, type); + + if (output) { + if (typeof output === 'string') return output; + return inspect(output, options); + } + } + + var proto = value ? Object.getPrototypeOf(value) : false; // If it's a plain Object then use Loupe's inspector + + if (proto === Object.prototype || proto === null) { + return inspectObject(value, options); + } // Specifically account for HTMLElements + // eslint-disable-next-line no-undef + + + if (value && typeof HTMLElement === 'function' && value instanceof HTMLElement) { + return inspectHTML(value, options); + } + + if ('constructor' in value) { + // If it is a class, inspect it like an object but add the constructor name + if (value.constructor !== Object) { + return inspectClass(value, options); + } // If it is an object with an anonymous prototype, display it as an object. + + + return inspectObject(value, options); + } // last chance to check if it's an object + + + if (value === Object(value)) { + return inspectObject(value, options); + } // We have run out of options! Just stringify the value + + + return options.stylize(String(value), type); + } + function registerConstructor(constructor, inspector) { + if (constructorMap.has(constructor)) { + return false; + } + + constructorMap.set(constructor, inspector); + return true; + } + function registerStringTag(stringTag, inspector) { + if (stringTag in stringTagMap) { + return false; + } + + stringTagMap[stringTag] = inspector; + return true; + } + var custom = chaiInspect; + + exports.custom = custom; + exports.default = inspect; + exports.inspect = inspect; + exports.registerConstructor = registerConstructor; + exports.registerStringTag = registerStringTag; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/sdk/typescript/node_modules/chai/node_modules/loupe/package.json b/sdk/typescript/node_modules/chai/node_modules/loupe/package.json new file mode 100644 index 0000000..ae185c8 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/loupe/package.json @@ -0,0 +1,141 @@ +{ + "name": "loupe", + "version": "2.3.7", + "description": "Inspect utility for Node.js and browsers", + "homepage": "https://github.com/chaijs/loupe", + "license": "MIT", + "author": "Veselin Todorov ", + "contributors": [ + "Keith Cirkel (https://github.com/keithamus)" + ], + "main": "./loupe.js", + "module": "./index.js", + "browser": { + "./index.js": "./loupe.js", + "util": false + }, + "repository": { + "type": "git", + "url": "https://github.com/chaijs/loupe" + }, + "files": [ + "loupe.js", + "index.js", + "lib/*" + ], + "scripts": { + "bench": "node -r esm bench", + "commit-msg": "commitlint -x angular", + "lint": "eslint --ignore-path .gitignore .", + "prepare": "rollup -c rollup.conf.js", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "test": "npm run test:node && npm run test:browser", + "pretest:browser": "npm run prepare", + "test:browser": "karma start --singleRun=true", + "posttest:browser": "npm run upload-coverage", + "test:node": "nyc mocha -r esm", + "posttest:node": "nyc report --report-dir \"coverage/node-$(node --version)\" --reporter=lcovonly && npm run upload-coverage", + "upload-coverage": "codecov" + }, + "eslintConfig": { + "root": true, + "parserOptions": { + "ecmaVersion": 2020 + }, + "env": { + "es6": true + }, + "plugins": [ + "filenames", + "prettier" + ], + "extends": [ + "strict/es6" + ], + "rules": { + "comma-dangle": "off", + "func-style": "off", + "no-magic-numbers": "off", + "class-methods-use-this": "off", + "array-bracket-spacing": "off", + "array-element-newline": "off", + "space-before-function-paren": "off", + "arrow-parens": "off", + "template-curly-spacing": "off", + "quotes": "off", + "generator-star-spacing": "off", + "prefer-destructuring": "off", + "no-mixed-operators": "off", + "id-blacklist": "off", + "curly": "off", + "semi": [ + "error", + "never" + ], + "prettier/prettier": [ + "error", + { + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "avoid", + "bracketSpacing": true + } + ] + } + }, + "prettier": { + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "avoid", + "bracketSpacing": true + }, + "dependencies": { + "get-func-name": "^2.0.1" + }, + "devDependencies": { + "@babel/core": "^7.12.10", + "@babel/preset-env": "^7.12.11", + "@commitlint/cli": "^11.0.0", + "@rollup/plugin-commonjs": "^17.0.0", + "@rollup/plugin-node-resolve": "^11.1.0", + "benchmark": "^2.1.4", + "chai": "^4.2.0", + "codecov": "^3.8.1", + "commitlint-config-angular": "^11.0.0", + "core-js": "^3.8.3", + "cross-env": "^7.0.3", + "eslint": "^7.18.0", + "eslint-config-strict": "^14.0.1", + "eslint-plugin-filenames": "^1.3.2", + "eslint-plugin-prettier": "^3.3.1", + "esm": "^3.2.25", + "husky": "^4.3.8", + "karma": "^5.2.3", + "karma-chrome-launcher": "^3.1.0", + "karma-coverage": "^2.0.3", + "karma-edge-launcher": "^0.4.2", + "karma-firefox-launcher": "^2.1.0", + "karma-ie-launcher": "^1.0.0", + "karma-mocha": "^2.0.1", + "karma-opera-launcher": "^1.0.0", + "karma-safari-launcher": "^1.0.0", + "karma-safaritechpreview-launcher": "^2.0.2", + "karma-sauce-launcher": "^4.3.4", + "mocha": "^8.2.1", + "nyc": "^15.1.0", + "prettier": "^2.2.1", + "rollup": "^2.37.1", + "rollup-plugin-babel": "^4.4.0", + "rollup-plugin-istanbul": "^3.0.0", + "semantic-release": "^17.3.6", + "simple-assert": "^1.0.0" + } +} diff --git a/sdk/typescript/node_modules/chai/node_modules/pathval/CHANGELOG.md b/sdk/typescript/node_modules/chai/node_modules/pathval/CHANGELOG.md new file mode 100644 index 0000000..804de5e --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/pathval/CHANGELOG.md @@ -0,0 +1,18 @@ + +0.1.1 / 2013-12-30 +================== + + * expose parse + * rename lib to index + +0.1.0 / 2013-12-28 +================== + + * API BREAKING! `get` has been changed, see the README for migration path + * Add `set` method + * Start using simple-assert (closes #2) + +0.0.1 / 2013-11-24 +================== + + * Initial implementation diff --git a/sdk/typescript/node_modules/chai/node_modules/pathval/LICENSE b/sdk/typescript/node_modules/chai/node_modules/pathval/LICENSE new file mode 100644 index 0000000..90d22da --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/pathval/LICENSE @@ -0,0 +1,16 @@ +MIT License + +Copyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/node_modules/pathval/README.md b/sdk/typescript/node_modules/chai/node_modules/pathval/README.md new file mode 100644 index 0000000..22a841e --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/pathval/README.md @@ -0,0 +1,147 @@ +

+ + ChaiJS + +
+ pathval +

+ +

+ Tool for Object value retrieval given a string path for node and the browser. +

+ +

+ + license:mit + + + tag:? + + + build:? + + + coverage:? + + + npm:? + + + dependencies:? + + + devDependencies:? + +
+ + Selenium Test Status + +
+ + Join the Slack chat + + + Join the Gitter chat + +

+ +## What is pathval? + +Pathval is a module which you can use to retrieve or set an Object's property for a given `String` path. + +## Installation + +### Node.js + +`pathval` is available on [npm](http://npmjs.org). To install it, type: + + $ npm install pathval + +### Browsers + +You can also use it within the browser; install via npm and use the `pathval.js` file found within the download. For example: + +```html + +``` + +## Usage + +The primary export of `pathval` is an object which has the following methods: + +* `hasProperty(object, name)` - Checks whether an `object` has `name`d property or numeric array index. +* `getPathInfo(object, path)` - Returns an object with info indicating the value of the `parent` of that path, the `name ` of the property we're retrieving and its `value`. +* `getPathValue(object, path)` - Retrieves the value of a property at a given `path` inside an `object`'. +* `setPathValue(object, path, value)` - Sets the `value` of a property at a given `path` inside an `object` and returns the object in which the property has been set. + +```js +var pathval = require('pathval'); +``` + +#### .hasProperty(object, name) + +```js +var pathval = require('pathval'); + +var obj = { prop: 'a value' }; +pathval.hasProperty(obj, 'prop'); // true +``` + +#### .getPathInfo(object, path) + +```js +var pathval = require('pathval'); + +var obj = { earth: { country: 'Brazil' } }; +pathval.getPathInfo(obj, 'earth.country'); // { parent: { country: 'Brazil' }, name: 'country', value: 'Brazil', exists: true } +``` + +#### .getPathValue(object, path) + +```js +var pathval = require('pathval'); + +var obj = { earth: { country: 'Brazil' } }; +pathval.getPathValue(obj, 'earth.country'); // 'Brazil' +``` + +#### .setPathValue(object, path, value) + +```js +var pathval = require('pathval'); + +var obj = { earth: { country: 'Brazil' } }; +pathval.setPathValue(obj, 'earth.country', 'USA'); + +obj.earth.country; // 'USA' +``` diff --git a/sdk/typescript/node_modules/chai/node_modules/pathval/index.js b/sdk/typescript/node_modules/chai/node_modules/pathval/index.js new file mode 100644 index 0000000..d0dc43e --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/pathval/index.js @@ -0,0 +1,301 @@ +'use strict'; + +/* ! + * Chai - pathval utility + * Copyright(c) 2012-2014 Jake Luer + * @see https://github.com/logicalparadox/filtr + * MIT Licensed + */ + +/** + * ### .hasProperty(object, name) + * + * This allows checking whether an object has own + * or inherited from prototype chain named property. + * + * Basically does the same thing as the `in` + * operator but works properly with null/undefined values + * and other primitives. + * + * var obj = { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * + * The following would be the results. + * + * hasProperty(obj, 'str'); // true + * hasProperty(obj, 'constructor'); // true + * hasProperty(obj, 'bar'); // false + * + * hasProperty(obj.str, 'length'); // true + * hasProperty(obj.str, 1); // true + * hasProperty(obj.str, 5); // false + * + * hasProperty(obj.arr, 'length'); // true + * hasProperty(obj.arr, 2); // true + * hasProperty(obj.arr, 3); // false + * + * @param {Object} object + * @param {String|Symbol} name + * @returns {Boolean} whether it exists + * @namespace Utils + * @name hasProperty + * @api public + */ + +function hasProperty(obj, name) { + if (typeof obj === 'undefined' || obj === null) { + return false; + } + + // The `in` operator does not work with primitives. + return name in Object(obj); +} + +/* ! + * ## parsePath(path) + * + * Helper function used to parse string object + * paths. Use in conjunction with `internalGetPathValue`. + * + * var parsed = parsePath('myobject.property.subprop'); + * + * ### Paths: + * + * * Can be infinitely deep and nested. + * * Arrays are also valid using the formal `myobject.document[3].property`. + * * Literal dots and brackets (not delimiter) must be backslash-escaped. + * + * @param {String} path + * @returns {Object} parsed + * @api private + */ + +function parsePath(path) { + var str = path.replace(/([^\\])\[/g, '$1.['); + var parts = str.match(/(\\\.|[^.]+?)+/g); + return parts.map(function mapMatches(value) { + if ( + value === 'constructor' || + value === '__proto__' || + value === 'prototype' + ) { + return {}; + } + var regexp = /^\[(\d+)\]$/; + var mArr = regexp.exec(value); + var parsed = null; + if (mArr) { + parsed = { i: parseFloat(mArr[1]) }; + } else { + parsed = { p: value.replace(/\\([.[\]])/g, '$1') }; + } + + return parsed; + }); +} + +/* ! + * ## internalGetPathValue(obj, parsed[, pathDepth]) + * + * Helper companion function for `.parsePath` that returns + * the value located at the parsed address. + * + * var value = getPathValue(obj, parsed); + * + * @param {Object} object to search against + * @param {Object} parsed definition from `parsePath`. + * @param {Number} depth (nesting level) of the property we want to retrieve + * @returns {Object|Undefined} value + * @api private + */ + +function internalGetPathValue(obj, parsed, pathDepth) { + var temporaryValue = obj; + var res = null; + pathDepth = typeof pathDepth === 'undefined' ? parsed.length : pathDepth; + + for (var i = 0; i < pathDepth; i++) { + var part = parsed[i]; + if (temporaryValue) { + if (typeof part.p === 'undefined') { + temporaryValue = temporaryValue[part.i]; + } else { + temporaryValue = temporaryValue[part.p]; + } + + if (i === pathDepth - 1) { + res = temporaryValue; + } + } + } + + return res; +} + +/* ! + * ## internalSetPathValue(obj, value, parsed) + * + * Companion function for `parsePath` that sets + * the value located at a parsed address. + * + * internalSetPathValue(obj, 'value', parsed); + * + * @param {Object} object to search and define on + * @param {*} value to use upon set + * @param {Object} parsed definition from `parsePath` + * @api private + */ + +function internalSetPathValue(obj, val, parsed) { + var tempObj = obj; + var pathDepth = parsed.length; + var part = null; + // Here we iterate through every part of the path + for (var i = 0; i < pathDepth; i++) { + var propName = null; + var propVal = null; + part = parsed[i]; + + // If it's the last part of the path, we set the 'propName' value with the property name + if (i === pathDepth - 1) { + propName = typeof part.p === 'undefined' ? part.i : part.p; + // Now we set the property with the name held by 'propName' on object with the desired val + tempObj[propName] = val; + } else if (typeof part.p !== 'undefined' && tempObj[part.p]) { + tempObj = tempObj[part.p]; + } else if (typeof part.i !== 'undefined' && tempObj[part.i]) { + tempObj = tempObj[part.i]; + } else { + // If the obj doesn't have the property we create one with that name to define it + var next = parsed[i + 1]; + // Here we set the name of the property which will be defined + propName = typeof part.p === 'undefined' ? part.i : part.p; + // Here we decide if this property will be an array or a new object + propVal = typeof next.p === 'undefined' ? [] : {}; + tempObj[propName] = propVal; + tempObj = tempObj[propName]; + } + } +} + +/** + * ### .getPathInfo(object, path) + * + * This allows the retrieval of property info in an + * object given a string path. + * + * The path info consists of an object with the + * following properties: + * + * * parent - The parent object of the property referenced by `path` + * * name - The name of the final property, a number if it was an array indexer + * * value - The value of the property, if it exists, otherwise `undefined` + * * exists - Whether the property exists or not + * + * @param {Object} object + * @param {String} path + * @returns {Object} info + * @namespace Utils + * @name getPathInfo + * @api public + */ + +function getPathInfo(obj, path) { + var parsed = parsePath(path); + var last = parsed[parsed.length - 1]; + var info = { + parent: + parsed.length > 1 ? + internalGetPathValue(obj, parsed, parsed.length - 1) : + obj, + name: last.p || last.i, + value: internalGetPathValue(obj, parsed), + }; + info.exists = hasProperty(info.parent, info.name); + + return info; +} + +/** + * ### .getPathValue(object, path) + * + * This allows the retrieval of values in an + * object given a string path. + * + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * } + * + * The following would be the results. + * + * getPathValue(obj, 'prop1.str'); // Hello + * getPathValue(obj, 'prop1.att[2]'); // b + * getPathValue(obj, 'prop2.arr[0].nested'); // Universe + * + * @param {Object} object + * @param {String} path + * @returns {Object} value or `undefined` + * @namespace Utils + * @name getPathValue + * @api public + */ + +function getPathValue(obj, path) { + var info = getPathInfo(obj, path); + return info.value; +} + +/** + * ### .setPathValue(object, path, value) + * + * Define the value in an object at a given string path. + * + * ```js + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * }; + * ``` + * + * The following would be acceptable. + * + * ```js + * var properties = require('tea-properties'); + * properties.set(obj, 'prop1.str', 'Hello Universe!'); + * properties.set(obj, 'prop1.arr[2]', 'B'); + * properties.set(obj, 'prop2.arr[0].nested.value', { hello: 'universe' }); + * ``` + * + * @param {Object} object + * @param {String} path + * @param {Mixed} value + * @api private + */ + +function setPathValue(obj, path, val) { + var parsed = parsePath(path); + internalSetPathValue(obj, val, parsed); + return obj; +} + +module.exports = { + hasProperty: hasProperty, + getPathInfo: getPathInfo, + getPathValue: getPathValue, + setPathValue: setPathValue, +}; diff --git a/sdk/typescript/node_modules/chai/node_modules/pathval/package.json b/sdk/typescript/node_modules/chai/node_modules/pathval/package.json new file mode 100644 index 0000000..48ead1b --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/pathval/package.json @@ -0,0 +1,80 @@ +{ + "name": "pathval", + "description": "Object value retrieval given a string path", + "homepage": "https://github.com/chaijs/pathval", + "version": "1.1.1", + "keywords": [ + "pathval", + "value retrieval", + "chai util" + ], + "license": "MIT", + "author": "Veselin Todorov ", + "files": [ + "index.js", + "pathval.js" + ], + "main": "./index.js", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/chaijs/pathval.git" + }, + "scripts": { + "build": "browserify --standalone pathval -o pathval.js", + "lint": "eslint --ignore-path .gitignore .", + "lint:fix": "npm run lint -- --fix", + "prepublish": "npm run build", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "pretest": "npm run lint", + "test": "npm run test:node && npm run test:browser && npm run upload-coverage", + "test:browser": "karma start --singleRun=true", + "test:node": "nyc mocha", + "upload-coverage": "lcov-result-merger 'coverage/**/lcov.info' | coveralls; exit 0" + }, + "config": { + "ghooks": { + "commit-msg": "validate-commit-msg" + } + }, + "eslintConfig": { + "extends": [ + "strict/es5" + ], + "env": { + "es6": true + }, + "globals": { + "HTMLElement": false + }, + "rules": { + "complexity": 0, + "max-statements": 0 + } + }, + "devDependencies": { + "browserify": "^17.0.0", + "browserify-istanbul": "^3.0.1", + "coveralls": "^3.1.0", + "eslint": "^7.13.0", + "eslint-config-strict": "^14.0.1", + "eslint-plugin-filenames": "^1.3.2", + "ghooks": "^2.0.4", + "karma": "^5.2.3", + "karma-browserify": "^7.0.0", + "karma-coverage": "^2.0.3", + "karma-mocha": "^2.0.1", + "karma-phantomjs-launcher": "^1.0.4", + "karma-sauce-launcher": "^4.3.3", + "lcov-result-merger": "^3.1.0", + "mocha": "^8.2.1", + "nyc": "^15.1.0", + "phantomjs-prebuilt": "^2.1.16", + "semantic-release": "^17.2.2", + "simple-assert": "^1.0.0", + "travis-after-all": "^1.4.5", + "validate-commit-msg": "^2.14.0" + }, + "engines": { + "node": "*" + } +} diff --git a/sdk/typescript/node_modules/chai/node_modules/pathval/pathval.js b/sdk/typescript/node_modules/chai/node_modules/pathval/pathval.js new file mode 100644 index 0000000..0070ed4 --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/pathval/pathval.js @@ -0,0 +1 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i (http://alogicalparadox.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/chai/node_modules/type-detect/README.md b/sdk/typescript/node_modules/chai/node_modules/type-detect/README.md new file mode 100644 index 0000000..beb645e --- /dev/null +++ b/sdk/typescript/node_modules/chai/node_modules/type-detect/README.md @@ -0,0 +1,235 @@ +

+ + type-detect + +

+
+

+ Improved typeof detection for node, Deno, and the browser. +

+ +

+ + license:mit + + + npm:? + + + build:? + + + coverage:? + + + dependencies:? + + + devDependencies:? + +
+ + Join the Slack chat + + + Join the Gitter chat + +

+
+ + + + + + + + + + + + + + +
Supported Browsers
Chrome Edge Firefox Safari IE
9, 10, 11
+
+ +## What is Type-Detect? + +Type Detect is a module which you can use to detect the type of a given object. It returns a string representation of the object's type, either using [`typeof`](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-typeof-operator) or [`@@toStringTag`](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-symbol.tostringtag). It also normalizes some object names for consistency among browsers. + +## Why? + +The `typeof` operator will only specify primitive values; everything else is `"object"` (including `null`, arrays, regexps, etc). Many developers use `Object.prototype.toString()` - which is a fine alternative and returns many more types (null returns `[object Null]`, Arrays as `[object Array]`, regexps as `[object RegExp]` etc). + +Sadly, `Object.prototype.toString` is slow, and buggy. By slow - we mean it is slower than `typeof`. By buggy - we mean that some values (like Promises, the global object, iterators, dataviews, a bunch of HTML elements) all report different things in different browsers. + +`type-detect` fixes all of the shortcomings with `Object.prototype.toString`. We have extra code to speed up checks of JS and DOM objects, as much as 20-30x faster for some values. `type-detect` also fixes any consistencies with these objects. + +## Installation + +### Node.js + +`type-detect` is available on [npm](http://npmjs.org). To install it, type: + + $ npm install type-detect + +### Deno + +`type-detect` can be imported with the following line: + +```js +import type from 'https://deno.land/x/type_detect@v4.1.0/index.ts' +``` + +### Browsers + +You can also use it within the browser; install via npm and use the `type-detect.js` file found within the download. For example: + +```html + +``` + +## Usage + +The primary export of `type-detect` is function that can serve as a replacement for `typeof`. The results of this function will be more specific than that of native `typeof`. + +```js +var type = require('type-detect'); +``` +Or, in the browser use case, after the +``` + +(It also works with various module systems, if you prefer that sort of thing - it has a dependency on [vlq](https://github.com/Rich-Harris/vlq).) + +## Usage + +These examples assume you're in node.js, or something similar: + +```js +import MagicString from 'magic-string'; +import fs from 'fs'; + +const s = new MagicString('problems = 99'); + +s.update(0, 8, 'answer'); +s.toString(); // 'answer = 99' + +s.update(11, 13, '42'); // character indices always refer to the original string +s.toString(); // 'answer = 42' + +s.prepend('var ').append(';'); // most methods are chainable +s.toString(); // 'var answer = 42;' + +const map = s.generateMap({ + source: 'source.js', + file: 'converted.js.map', + includeContent: true, +}); // generates a v3 sourcemap + +fs.writeFileSync('converted.js', s.toString()); +fs.writeFileSync('converted.js.map', map.toString()); +``` + +You can pass an options argument: + +```js +const s = new MagicString(someCode, { + // these options will be used if you later call `bundle.addSource( s )` - see below + filename: 'foo.js', + indentExclusionRanges: [ + /*...*/ + ], + // mark source as ignore in DevTools, see below #Bundling + ignoreList: false, + // adjust the incoming position - see below + offset: 0, +}); +``` + +## Properties + +### s.offset + +Sets the offset property to adjust the incoming position for the following APIs: `slice`, `update`, `overwrite`, `appendLeft`, `prependLeft`, `appendRight`, `prependRight`, `move`, `reset`, and `remove`. + +Example usage: + +```ts +const s = new MagicString('hello world', { offset: 0 }); +s.offset = 6; +s.slice() === 'world'; +``` + +## Methods + +### s.addSourcemapLocation( index ) + +Adds the specified character index (with respect to the original string) to sourcemap mappings, if `hires` is `false` (see below). + +### s.append( content ) + +Appends the specified content to the end of the string. Returns `this`. + +### s.appendLeft( index, content ) + +Appends the specified `content` at the `index` in the original string. If a range _ending_ with `index` is subsequently moved, the insert will be moved with it. Returns `this`. See also `s.prependLeft(...)`. + +### s.appendRight( index, content ) + +Appends the specified `content` at the `index` in the original string. If a range _starting_ with `index` is subsequently moved, the insert will be moved with it. Returns `this`. See also `s.prependRight(...)`. + +### s.clone() + +Does what you'd expect. + +### s.generateDecodedMap( options ) + +Generates a sourcemap object with raw mappings in array form, rather than encoded as a string. See `generateMap` documentation below for options details. Useful if you need to manipulate the sourcemap further, but most of the time you will use `generateMap` instead. + +### s.generateMap( options ) + +Generates a [version 3 sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit). All options are, well, optional: + +- `file` - the filename where you plan to write the sourcemap +- `source` - the filename of the file containing the original source +- `includeContent` - whether to include the original content in the map's `sourcesContent` array +- `hires` - whether the mapping should be high-resolution. Hi-res mappings map every single character, meaning (for example) your devtools will always be able to pinpoint the exact location of function calls and so on. With lo-res mappings, devtools may only be able to identify the correct line - but they're quicker to generate and less bulky. You can also set `"boundary"` to generate a semi-hi-res mappings segmented per word boundary instead of per character, suitable for string semantics that are separated by words. If sourcemap locations have been specified with `s.addSourcemapLocation()`, they will be used here. + +The returned sourcemap has two (non-enumerable) methods attached for convenience: + +- `toString` - returns the equivalent of `JSON.stringify(map)` +- `toUrl` - returns a DataURI containing the sourcemap. Useful for doing this sort of thing: + +```js +code += '\n//# sourceMappingURL=' + map.toUrl(); +``` + +### s.hasChanged() + +Indicates if the string has been changed. + +### s.indent( prefix[, options] ) + +Prefixes each line of the string with `prefix`. If `prefix` is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. Returns `this`. + +The `options` argument can have an `exclude` property, which is an array of `[start, end]` character ranges. These ranges will be excluded from the indentation - useful for (e.g.) multiline strings. + +### s.insertLeft( index, content ) + +**DEPRECATED** since 0.17 – use `s.appendLeft(...)` instead + +### s.insertRight( index, content ) + +**DEPRECATED** since 0.17 – use `s.prependRight(...)` instead + +### s.isEmpty() + +Returns true if the resulting source is empty (disregarding white space). + +### s.locate( index ) + +**DEPRECATED** since 0.10 – see [#30](https://github.com/Rich-Harris/magic-string/pull/30) + +### s.locateOrigin( index ) + +**DEPRECATED** since 0.10 – see [#30](https://github.com/Rich-Harris/magic-string/pull/30) + +### s.move( start, end, index ) + +Moves the characters from `start` and `end` to `index`. Returns `this`. + +### s.overwrite( start, end, content[, options] ) + +Replaces the characters from `start` to `end` with `content`, along with the appended/prepended content in that range. The same restrictions as `s.remove()` apply. Returns `this`. + +The fourth argument is optional. It can have a `storeName` property — if `true`, the original name will be stored for later inclusion in a sourcemap's `names` array — and a `contentOnly` property which determines whether only the content is overwritten, or anything that was appended/prepended to the range as well. + +It may be preferred to use `s.update(...)` instead if you wish to avoid overwriting the appended/prepended content. + +### s.prepend( content ) + +Prepends the string with the specified content. Returns `this`. + +### s.prependLeft ( index, content ) + +Same as `s.appendLeft(...)`, except that the inserted content will go _before_ any previous appends or prepends at `index` + +### s.prependRight ( index, content ) + +Same as `s.appendRight(...)`, except that the inserted content will go _before_ any previous appends or prepends at `index` + +### s.replace( regexpOrString, substitution ) + +String replacement with RegExp or string. The `substitution` parameter supports strings and functions. Returns `this`. + +```ts +import MagicString from 'magic-string'; + +const s = new MagicString(source); + +s.replace('foo', 'bar'); +s.replace('foo', (str, index, s) => str + '-' + index); +s.replace(/foo/g, 'bar'); +s.replace(/(\w)(\d+)/g, (_, $1, $2) => $1.toUpperCase() + $2); +``` + +The differences from [`String.replace`](<(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)>): + +- It will always match against the **original string** +- It mutates the magic string state (use `.clone()` to be immutable) + +### s.replaceAll( regexpOrString, substitution ) + +Same as `s.replace`, but replace all matched strings instead of just one. +If `regexpOrString` is a regex, then it must have the global (`g`) flag set, or a `TypeError` is thrown. Matches the behavior of the builtin [`String.property.replaceAll`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll). Returns `this`. + +### s.remove( start, end ) + +Removes the characters from `start` to `end` (of the original string, **not** the generated string). Removing the same content twice, or making removals that partially overlap, will cause an error. Returns `this`. + +### s.reset( start, end ) + +Resets the characters from `start` to `end` (of the original string, **not** the generated string). +It can be used to restore previously removed characters and discard unwanted changes. + +### s.slice( start, end ) + +Returns the content of the generated string that corresponds to the slice between `start` and `end` of the original string. Throws error if the indices are for characters that were already removed. + +### s.snip( start, end ) + +Returns a clone of `s`, with all content before the `start` and `end` characters of the original string removed. + +### s.toString() + +Returns the generated string. + +### s.trim([ charType ]) + +Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start and end. Returns `this`. + +### s.trimStart([ charType ]) + +Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start. Returns `this`. + +### s.trimEnd([ charType ]) + +Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the end. Returns `this`. + +### s.trimLines() + +Removes empty lines from the start and end. Returns `this`. + +### s.update( start, end, content[, options] ) + +Replaces the characters from `start` to `end` with `content`. The same restrictions as `s.remove()` apply. Returns `this`. + +The fourth argument is optional. It can have a `storeName` property — if `true`, the original name will be stored for later inclusion in a sourcemap's `names` array — and an `overwrite` property which defaults to `false` and determines whether anything that was appended/prepended to the range will be overwritten along with the original content. + +`s.update(start, end, content)` is equivalent to `s.overwrite(start, end, content, { contentOnly: true })`. + +## Bundling + +To concatenate several sources, use `MagicString.Bundle`: + +```js +const bundle = new MagicString.Bundle(); + +bundle.addSource({ + filename: 'foo.js', + content: new MagicString('var answer = 42;'), +}); + +bundle.addSource({ + filename: 'bar.js', + content: new MagicString('console.log( answer )'), +}); + +// Sources can be marked as ignore-listed, which provides a hint to debuggers +// to not step into this code and also don't show the source files depending +// on user preferences. +bundle.addSource({ + filename: 'some-3rdparty-library.js', + content: new MagicString('function myLib(){}'), + ignoreList: false, // <-- +}); + +// Advanced: a source can include an `indentExclusionRanges` property +// alongside `filename` and `content`. This will be passed to `s.indent()` +// - see documentation above + +bundle + .indent() // optionally, pass an indent string, otherwise it will be guessed + .prepend('(function () {\n') + .append('}());'); + +bundle.toString(); +// (function () { +// var answer = 42; +// console.log( answer ); +// }()); + +// options are as per `s.generateMap()` above +const map = bundle.generateMap({ + file: 'bundle.js', + includeContent: true, + hires: true, +}); +``` + +As an alternative syntax, if you a) don't have `filename` or `indentExclusionRanges` options, or b) passed those in when you used `new MagicString(...)`, you can simply pass the `MagicString` instance itself: + +```js +const bundle = new MagicString.Bundle(); +const source = new MagicString(someCode, { + filename: 'foo.js', +}); + +bundle.addSource(source); +``` + +## License + +MIT diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/LICENSE b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/LICENSE new file mode 100644 index 0000000..1f6ce94 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/LICENSE @@ -0,0 +1,19 @@ +Copyright 2024 Justin Ridgewell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/README.md b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/README.md new file mode 100644 index 0000000..b3e0708 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/README.md @@ -0,0 +1,264 @@ +# @jridgewell/sourcemap-codec + +Encode/decode the `mappings` property of a [sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit). + + +## Why? + +Sourcemaps are difficult to generate and manipulate, because the `mappings` property – the part that actually links the generated code back to the original source – is encoded using an obscure method called [Variable-length quantity](https://en.wikipedia.org/wiki/Variable-length_quantity). On top of that, each segment in the mapping contains offsets rather than absolute indices, which means that you can't look at a segment in isolation – you have to understand the whole sourcemap. + +This package makes the process slightly easier. + + +## Installation + +```bash +npm install @jridgewell/sourcemap-codec +``` + + +## Usage + +```js +import { encode, decode } from '@jridgewell/sourcemap-codec'; + +var decoded = decode( ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' ); + +assert.deepEqual( decoded, [ + // the first line (of the generated code) has no mappings, + // as shown by the starting semi-colon (which separates lines) + [], + + // the second line contains four (comma-separated) segments + [ + // segments are encoded as you'd expect: + // [ generatedCodeColumn, sourceIndex, sourceCodeLine, sourceCodeColumn, nameIndex ] + + // i.e. the first segment begins at column 2, and maps back to the second column + // of the second line (both zero-based) of the 0th source, and uses the 0th + // name in the `map.names` array + [ 2, 0, 2, 2, 0 ], + + // the remaining segments are 4-length rather than 5-length, + // because they don't map a name + [ 4, 0, 2, 4 ], + [ 6, 0, 2, 5 ], + [ 7, 0, 2, 7 ] + ], + + // the final line contains two segments + [ + [ 2, 1, 10, 19 ], + [ 12, 1, 11, 20 ] + ] +]); + +var encoded = encode( decoded ); +assert.equal( encoded, ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' ); +``` + +## Benchmarks + +``` +node v20.10.0 + +amp.js.map - 45120 segments + +Decode Memory Usage: +local code 5815135 bytes +@jridgewell/sourcemap-codec 1.4.15 5868160 bytes +sourcemap-codec 5492584 bytes +source-map-0.6.1 13569984 bytes +source-map-0.8.0 6390584 bytes +chrome dev tools 8011136 bytes +Smallest memory usage is sourcemap-codec + +Decode speed: +decode: local code x 492 ops/sec ±1.22% (90 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 499 ops/sec ±1.16% (89 runs sampled) +decode: sourcemap-codec x 376 ops/sec ±1.66% (89 runs sampled) +decode: source-map-0.6.1 x 34.99 ops/sec ±0.94% (48 runs sampled) +decode: source-map-0.8.0 x 351 ops/sec ±0.07% (95 runs sampled) +chrome dev tools x 165 ops/sec ±0.91% (86 runs sampled) +Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 + +Encode Memory Usage: +local code 444248 bytes +@jridgewell/sourcemap-codec 1.4.15 623024 bytes +sourcemap-codec 8696280 bytes +source-map-0.6.1 8745176 bytes +source-map-0.8.0 8736624 bytes +Smallest memory usage is local code + +Encode speed: +encode: local code x 796 ops/sec ±0.11% (97 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 795 ops/sec ±0.25% (98 runs sampled) +encode: sourcemap-codec x 231 ops/sec ±0.83% (86 runs sampled) +encode: source-map-0.6.1 x 166 ops/sec ±0.57% (86 runs sampled) +encode: source-map-0.8.0 x 203 ops/sec ±0.45% (88 runs sampled) +Fastest is encode: local code,encode: @jridgewell/sourcemap-codec 1.4.15 + + +*** + + +babel.min.js.map - 347793 segments + +Decode Memory Usage: +local code 35424960 bytes +@jridgewell/sourcemap-codec 1.4.15 35424696 bytes +sourcemap-codec 36033464 bytes +source-map-0.6.1 62253704 bytes +source-map-0.8.0 43843920 bytes +chrome dev tools 45111400 bytes +Smallest memory usage is @jridgewell/sourcemap-codec 1.4.15 + +Decode speed: +decode: local code x 38.18 ops/sec ±5.44% (52 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 38.36 ops/sec ±5.02% (52 runs sampled) +decode: sourcemap-codec x 34.05 ops/sec ±4.45% (47 runs sampled) +decode: source-map-0.6.1 x 4.31 ops/sec ±2.76% (15 runs sampled) +decode: source-map-0.8.0 x 55.60 ops/sec ±0.13% (73 runs sampled) +chrome dev tools x 16.94 ops/sec ±3.78% (46 runs sampled) +Fastest is decode: source-map-0.8.0 + +Encode Memory Usage: +local code 2606016 bytes +@jridgewell/sourcemap-codec 1.4.15 2626440 bytes +sourcemap-codec 21152576 bytes +source-map-0.6.1 25023928 bytes +source-map-0.8.0 25256448 bytes +Smallest memory usage is local code + +Encode speed: +encode: local code x 127 ops/sec ±0.18% (83 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 128 ops/sec ±0.26% (83 runs sampled) +encode: sourcemap-codec x 29.31 ops/sec ±2.55% (53 runs sampled) +encode: source-map-0.6.1 x 18.85 ops/sec ±3.19% (36 runs sampled) +encode: source-map-0.8.0 x 19.34 ops/sec ±1.97% (36 runs sampled) +Fastest is encode: @jridgewell/sourcemap-codec 1.4.15 + + +*** + + +preact.js.map - 1992 segments + +Decode Memory Usage: +local code 261696 bytes +@jridgewell/sourcemap-codec 1.4.15 244296 bytes +sourcemap-codec 302816 bytes +source-map-0.6.1 939176 bytes +source-map-0.8.0 336 bytes +chrome dev tools 587368 bytes +Smallest memory usage is source-map-0.8.0 + +Decode speed: +decode: local code x 17,782 ops/sec ±0.32% (97 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 17,863 ops/sec ±0.40% (100 runs sampled) +decode: sourcemap-codec x 12,453 ops/sec ±0.27% (101 runs sampled) +decode: source-map-0.6.1 x 1,288 ops/sec ±1.05% (96 runs sampled) +decode: source-map-0.8.0 x 9,289 ops/sec ±0.27% (101 runs sampled) +chrome dev tools x 4,769 ops/sec ±0.18% (100 runs sampled) +Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 + +Encode Memory Usage: +local code 262944 bytes +@jridgewell/sourcemap-codec 1.4.15 25544 bytes +sourcemap-codec 323048 bytes +source-map-0.6.1 507808 bytes +source-map-0.8.0 507480 bytes +Smallest memory usage is @jridgewell/sourcemap-codec 1.4.15 + +Encode speed: +encode: local code x 24,207 ops/sec ±0.79% (95 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 24,288 ops/sec ±0.48% (96 runs sampled) +encode: sourcemap-codec x 6,761 ops/sec ±0.21% (100 runs sampled) +encode: source-map-0.6.1 x 5,374 ops/sec ±0.17% (99 runs sampled) +encode: source-map-0.8.0 x 5,633 ops/sec ±0.32% (99 runs sampled) +Fastest is encode: @jridgewell/sourcemap-codec 1.4.15,encode: local code + + +*** + + +react.js.map - 5726 segments + +Decode Memory Usage: +local code 678816 bytes +@jridgewell/sourcemap-codec 1.4.15 678816 bytes +sourcemap-codec 816400 bytes +source-map-0.6.1 2288864 bytes +source-map-0.8.0 721360 bytes +chrome dev tools 1012512 bytes +Smallest memory usage is local code + +Decode speed: +decode: local code x 6,178 ops/sec ±0.19% (98 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 6,261 ops/sec ±0.22% (100 runs sampled) +decode: sourcemap-codec x 4,472 ops/sec ±0.90% (99 runs sampled) +decode: source-map-0.6.1 x 449 ops/sec ±0.31% (95 runs sampled) +decode: source-map-0.8.0 x 3,219 ops/sec ±0.13% (100 runs sampled) +chrome dev tools x 1,743 ops/sec ±0.20% (99 runs sampled) +Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 + +Encode Memory Usage: +local code 140960 bytes +@jridgewell/sourcemap-codec 1.4.15 159808 bytes +sourcemap-codec 969304 bytes +source-map-0.6.1 930520 bytes +source-map-0.8.0 930248 bytes +Smallest memory usage is local code + +Encode speed: +encode: local code x 8,013 ops/sec ±0.19% (100 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 7,989 ops/sec ±0.20% (101 runs sampled) +encode: sourcemap-codec x 2,472 ops/sec ±0.21% (99 runs sampled) +encode: source-map-0.6.1 x 2,200 ops/sec ±0.17% (99 runs sampled) +encode: source-map-0.8.0 x 2,220 ops/sec ±0.37% (99 runs sampled) +Fastest is encode: local code + + +*** + + +vscode.map - 2141001 segments + +Decode Memory Usage: +local code 198955264 bytes +@jridgewell/sourcemap-codec 1.4.15 199175352 bytes +sourcemap-codec 199102688 bytes +source-map-0.6.1 386323432 bytes +source-map-0.8.0 244116432 bytes +chrome dev tools 293734280 bytes +Smallest memory usage is local code + +Decode speed: +decode: local code x 3.90 ops/sec ±22.21% (15 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 3.95 ops/sec ±23.53% (15 runs sampled) +decode: sourcemap-codec x 3.82 ops/sec ±17.94% (14 runs sampled) +decode: source-map-0.6.1 x 0.61 ops/sec ±7.81% (6 runs sampled) +decode: source-map-0.8.0 x 9.54 ops/sec ±0.28% (28 runs sampled) +chrome dev tools x 2.18 ops/sec ±10.58% (10 runs sampled) +Fastest is decode: source-map-0.8.0 + +Encode Memory Usage: +local code 13509880 bytes +@jridgewell/sourcemap-codec 1.4.15 13537648 bytes +sourcemap-codec 32540104 bytes +source-map-0.6.1 127531040 bytes +source-map-0.8.0 127535312 bytes +Smallest memory usage is local code + +Encode speed: +encode: local code x 20.10 ops/sec ±0.19% (38 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 20.26 ops/sec ±0.32% (38 runs sampled) +encode: sourcemap-codec x 5.44 ops/sec ±1.64% (18 runs sampled) +encode: source-map-0.6.1 x 2.30 ops/sec ±4.79% (10 runs sampled) +encode: source-map-0.8.0 x 2.46 ops/sec ±6.53% (10 runs sampled) +Fastest is encode: @jridgewell/sourcemap-codec 1.4.15 +``` + +# License + +MIT diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/package.json b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/package.json new file mode 100644 index 0000000..da55137 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/package.json @@ -0,0 +1,63 @@ +{ + "name": "@jridgewell/sourcemap-codec", + "version": "1.5.5", + "description": "Encode/decode sourcemap mappings", + "keywords": [ + "sourcemap", + "vlq" + ], + "main": "dist/sourcemap-codec.umd.js", + "module": "dist/sourcemap-codec.mjs", + "types": "types/sourcemap-codec.d.cts", + "files": [ + "dist", + "src", + "types" + ], + "exports": { + ".": [ + { + "import": { + "types": "./types/sourcemap-codec.d.mts", + "default": "./dist/sourcemap-codec.mjs" + }, + "default": { + "types": "./types/sourcemap-codec.d.cts", + "default": "./dist/sourcemap-codec.umd.js" + } + }, + "./dist/sourcemap-codec.umd.js" + ], + "./package.json": "./package.json" + }, + "scripts": { + "benchmark": "run-s build:code benchmark:*", + "benchmark:install": "cd benchmark && npm install", + "benchmark:only": "node --expose-gc benchmark/index.js", + "build": "run-s -n build:code build:types", + "build:code": "node ../../esbuild.mjs sourcemap-codec.ts", + "build:types": "run-s build:types:force build:types:emit build:types:mts", + "build:types:force": "rimraf tsconfig.build.tsbuildinfo", + "build:types:emit": "tsc --project tsconfig.build.json", + "build:types:mts": "node ../../mts-types.mjs", + "clean": "run-s -n clean:code clean:types", + "clean:code": "tsc --build --clean tsconfig.build.json", + "clean:types": "rimraf dist types", + "test": "run-s -n test:types test:only test:format", + "test:format": "prettier --check '{src,test}/**/*.ts'", + "test:only": "mocha", + "test:types": "eslint '{src,test}/**/*.ts'", + "lint": "run-s -n lint:types lint:format", + "lint:format": "npm run test:format -- --write", + "lint:types": "npm run test:types -- --fix", + "prepublishOnly": "npm run-s -n build test" + }, + "homepage": "https://github.com/jridgewell/sourcemaps/tree/main/packages/sourcemap-codec", + "repository": { + "type": "git", + "url": "git+https://github.com/jridgewell/sourcemaps.git", + "directory": "packages/sourcemap-codec" + }, + "author": "Justin Ridgewell ", + "license": "MIT" +} diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts new file mode 100644 index 0000000..d194c2f --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts @@ -0,0 +1,345 @@ +import { StringReader, StringWriter } from './strings'; +import { comma, decodeInteger, encodeInteger, hasMoreVlq, semicolon } from './vlq'; + +const EMPTY: any[] = []; + +type Line = number; +type Column = number; +type Kind = number; +type Name = number; +type Var = number; +type SourcesIndex = number; +type ScopesIndex = number; + +type Mix = (A & O) | (B & O); + +export type OriginalScope = Mix< + [Line, Column, Line, Column, Kind], + [Line, Column, Line, Column, Kind, Name], + { vars: Var[] } +>; + +export type GeneratedRange = Mix< + [Line, Column, Line, Column], + [Line, Column, Line, Column, SourcesIndex, ScopesIndex], + { + callsite: CallSite | null; + bindings: Binding[]; + isScope: boolean; + } +>; +export type CallSite = [SourcesIndex, Line, Column]; +type Binding = BindingExpressionRange[]; +export type BindingExpressionRange = [Name] | [Name, Line, Column]; + +export function decodeOriginalScopes(input: string): OriginalScope[] { + const { length } = input; + const reader = new StringReader(input); + const scopes: OriginalScope[] = []; + const stack: OriginalScope[] = []; + let line = 0; + + for (; reader.pos < length; reader.pos++) { + line = decodeInteger(reader, line); + const column = decodeInteger(reader, 0); + + if (!hasMoreVlq(reader, length)) { + const last = stack.pop()!; + last[2] = line; + last[3] = column; + continue; + } + + const kind = decodeInteger(reader, 0); + const fields = decodeInteger(reader, 0); + const hasName = fields & 0b0001; + + const scope: OriginalScope = ( + hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind] + ) as OriginalScope; + + let vars: Var[] = EMPTY; + if (hasMoreVlq(reader, length)) { + vars = []; + do { + const varsIndex = decodeInteger(reader, 0); + vars.push(varsIndex); + } while (hasMoreVlq(reader, length)); + } + scope.vars = vars; + + scopes.push(scope); + stack.push(scope); + } + + return scopes; +} + +export function encodeOriginalScopes(scopes: OriginalScope[]): string { + const writer = new StringWriter(); + + for (let i = 0; i < scopes.length; ) { + i = _encodeOriginalScopes(scopes, i, writer, [0]); + } + + return writer.flush(); +} + +function _encodeOriginalScopes( + scopes: OriginalScope[], + index: number, + writer: StringWriter, + state: [ + number, // GenColumn + ], +): number { + const scope = scopes[index]; + const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope; + + if (index > 0) writer.write(comma); + + state[0] = encodeInteger(writer, startLine, state[0]); + encodeInteger(writer, startColumn, 0); + encodeInteger(writer, kind, 0); + + const fields = scope.length === 6 ? 0b0001 : 0; + encodeInteger(writer, fields, 0); + if (scope.length === 6) encodeInteger(writer, scope[5], 0); + + for (const v of vars) { + encodeInteger(writer, v, 0); + } + + for (index++; index < scopes.length; ) { + const next = scopes[index]; + const { 0: l, 1: c } = next; + if (l > endLine || (l === endLine && c >= endColumn)) { + break; + } + index = _encodeOriginalScopes(scopes, index, writer, state); + } + + writer.write(comma); + state[0] = encodeInteger(writer, endLine, state[0]); + encodeInteger(writer, endColumn, 0); + + return index; +} + +export function decodeGeneratedRanges(input: string): GeneratedRange[] { + const { length } = input; + const reader = new StringReader(input); + const ranges: GeneratedRange[] = []; + const stack: GeneratedRange[] = []; + + let genLine = 0; + let definitionSourcesIndex = 0; + let definitionScopeIndex = 0; + let callsiteSourcesIndex = 0; + let callsiteLine = 0; + let callsiteColumn = 0; + let bindingLine = 0; + let bindingColumn = 0; + + do { + const semi = reader.indexOf(';'); + let genColumn = 0; + + for (; reader.pos < semi; reader.pos++) { + genColumn = decodeInteger(reader, genColumn); + + if (!hasMoreVlq(reader, semi)) { + const last = stack.pop()!; + last[2] = genLine; + last[3] = genColumn; + continue; + } + + const fields = decodeInteger(reader, 0); + const hasDefinition = fields & 0b0001; + const hasCallsite = fields & 0b0010; + const hasScope = fields & 0b0100; + + let callsite: CallSite | null = null; + let bindings: Binding[] = EMPTY; + let range: GeneratedRange; + if (hasDefinition) { + const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex); + definitionScopeIndex = decodeInteger( + reader, + definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0, + ); + + definitionSourcesIndex = defSourcesIndex; + range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex] as GeneratedRange; + } else { + range = [genLine, genColumn, 0, 0] as GeneratedRange; + } + + range.isScope = !!hasScope; + + if (hasCallsite) { + const prevCsi = callsiteSourcesIndex; + const prevLine = callsiteLine; + callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex); + const sameSource = prevCsi === callsiteSourcesIndex; + callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0); + callsiteColumn = decodeInteger( + reader, + sameSource && prevLine === callsiteLine ? callsiteColumn : 0, + ); + + callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn]; + } + range.callsite = callsite; + + if (hasMoreVlq(reader, semi)) { + bindings = []; + do { + bindingLine = genLine; + bindingColumn = genColumn; + const expressionsCount = decodeInteger(reader, 0); + let expressionRanges: BindingExpressionRange[]; + if (expressionsCount < -1) { + expressionRanges = [[decodeInteger(reader, 0)]]; + for (let i = -1; i > expressionsCount; i--) { + const prevBl = bindingLine; + bindingLine = decodeInteger(reader, bindingLine); + bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0); + const expression = decodeInteger(reader, 0); + expressionRanges.push([expression, bindingLine, bindingColumn]); + } + } else { + expressionRanges = [[expressionsCount]]; + } + bindings.push(expressionRanges); + } while (hasMoreVlq(reader, semi)); + } + range.bindings = bindings; + + ranges.push(range); + stack.push(range); + } + + genLine++; + reader.pos = semi + 1; + } while (reader.pos < length); + + return ranges; +} + +export function encodeGeneratedRanges(ranges: GeneratedRange[]): string { + if (ranges.length === 0) return ''; + + const writer = new StringWriter(); + + for (let i = 0; i < ranges.length; ) { + i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]); + } + + return writer.flush(); +} + +function _encodeGeneratedRanges( + ranges: GeneratedRange[], + index: number, + writer: StringWriter, + state: [ + number, // GenLine + number, // GenColumn + number, // DefSourcesIndex + number, // DefScopesIndex + number, // CallSourcesIndex + number, // CallLine + number, // CallColumn + ], +): number { + const range = ranges[index]; + const { + 0: startLine, + 1: startColumn, + 2: endLine, + 3: endColumn, + isScope, + callsite, + bindings, + } = range; + + if (state[0] < startLine) { + catchupLine(writer, state[0], startLine); + state[0] = startLine; + state[1] = 0; + } else if (index > 0) { + writer.write(comma); + } + + state[1] = encodeInteger(writer, range[1], state[1]); + + const fields = + (range.length === 6 ? 0b0001 : 0) | (callsite ? 0b0010 : 0) | (isScope ? 0b0100 : 0); + encodeInteger(writer, fields, 0); + + if (range.length === 6) { + const { 4: sourcesIndex, 5: scopesIndex } = range; + if (sourcesIndex !== state[2]) { + state[3] = 0; + } + state[2] = encodeInteger(writer, sourcesIndex, state[2]); + state[3] = encodeInteger(writer, scopesIndex, state[3]); + } + + if (callsite) { + const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite!; + if (sourcesIndex !== state[4]) { + state[5] = 0; + state[6] = 0; + } else if (callLine !== state[5]) { + state[6] = 0; + } + state[4] = encodeInteger(writer, sourcesIndex, state[4]); + state[5] = encodeInteger(writer, callLine, state[5]); + state[6] = encodeInteger(writer, callColumn, state[6]); + } + + if (bindings) { + for (const binding of bindings) { + if (binding.length > 1) encodeInteger(writer, -binding.length, 0); + const expression = binding[0][0]; + encodeInteger(writer, expression, 0); + let bindingStartLine = startLine; + let bindingStartColumn = startColumn; + for (let i = 1; i < binding.length; i++) { + const expRange = binding[i]; + bindingStartLine = encodeInteger(writer, expRange[1]!, bindingStartLine); + bindingStartColumn = encodeInteger(writer, expRange[2]!, bindingStartColumn); + encodeInteger(writer, expRange[0]!, 0); + } + } + } + + for (index++; index < ranges.length; ) { + const next = ranges[index]; + const { 0: l, 1: c } = next; + if (l > endLine || (l === endLine && c >= endColumn)) { + break; + } + index = _encodeGeneratedRanges(ranges, index, writer, state); + } + + if (state[0] < endLine) { + catchupLine(writer, state[0], endLine); + state[0] = endLine; + state[1] = 0; + } else { + writer.write(comma); + } + state[1] = encodeInteger(writer, endColumn, state[1]); + + return index; +} + +function catchupLine(writer: StringWriter, lastLine: number, line: number) { + do { + writer.write(semicolon); + } while (++lastLine < line); +} diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts new file mode 100644 index 0000000..a81f894 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts @@ -0,0 +1,111 @@ +import { comma, decodeInteger, encodeInteger, hasMoreVlq, semicolon } from './vlq'; +import { StringWriter, StringReader } from './strings'; + +export { + decodeOriginalScopes, + encodeOriginalScopes, + decodeGeneratedRanges, + encodeGeneratedRanges, +} from './scopes'; +export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes'; + +export type SourceMapSegment = + | [number] + | [number, number, number, number] + | [number, number, number, number, number]; +export type SourceMapLine = SourceMapSegment[]; +export type SourceMapMappings = SourceMapLine[]; + +export function decode(mappings: string): SourceMapMappings { + const { length } = mappings; + const reader = new StringReader(mappings); + const decoded: SourceMapMappings = []; + let genColumn = 0; + let sourcesIndex = 0; + let sourceLine = 0; + let sourceColumn = 0; + let namesIndex = 0; + + do { + const semi = reader.indexOf(';'); + const line: SourceMapLine = []; + let sorted = true; + let lastCol = 0; + genColumn = 0; + + while (reader.pos < semi) { + let seg: SourceMapSegment; + + genColumn = decodeInteger(reader, genColumn); + if (genColumn < lastCol) sorted = false; + lastCol = genColumn; + + if (hasMoreVlq(reader, semi)) { + sourcesIndex = decodeInteger(reader, sourcesIndex); + sourceLine = decodeInteger(reader, sourceLine); + sourceColumn = decodeInteger(reader, sourceColumn); + + if (hasMoreVlq(reader, semi)) { + namesIndex = decodeInteger(reader, namesIndex); + seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]; + } else { + seg = [genColumn, sourcesIndex, sourceLine, sourceColumn]; + } + } else { + seg = [genColumn]; + } + + line.push(seg); + reader.pos++; + } + + if (!sorted) sort(line); + decoded.push(line); + reader.pos = semi + 1; + } while (reader.pos <= length); + + return decoded; +} + +function sort(line: SourceMapSegment[]) { + line.sort(sortComparator); +} + +function sortComparator(a: SourceMapSegment, b: SourceMapSegment): number { + return a[0] - b[0]; +} + +export function encode(decoded: SourceMapMappings): string; +export function encode(decoded: Readonly): string; +export function encode(decoded: Readonly): string { + const writer = new StringWriter(); + let sourcesIndex = 0; + let sourceLine = 0; + let sourceColumn = 0; + let namesIndex = 0; + + for (let i = 0; i < decoded.length; i++) { + const line = decoded[i]; + if (i > 0) writer.write(semicolon); + if (line.length === 0) continue; + + let genColumn = 0; + + for (let j = 0; j < line.length; j++) { + const segment = line[j]; + if (j > 0) writer.write(comma); + + genColumn = encodeInteger(writer, segment[0], genColumn); + + if (segment.length === 1) continue; + sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex); + sourceLine = encodeInteger(writer, segment[2], sourceLine); + sourceColumn = encodeInteger(writer, segment[3], sourceColumn); + + if (segment.length === 4) continue; + namesIndex = encodeInteger(writer, segment[4], namesIndex); + } + } + + return writer.flush(); +} diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/strings.ts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/strings.ts new file mode 100644 index 0000000..d161965 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/strings.ts @@ -0,0 +1,65 @@ +const bufLength = 1024 * 16; + +// Provide a fallback for older environments. +const td = + typeof TextDecoder !== 'undefined' + ? /* #__PURE__ */ new TextDecoder() + : typeof Buffer !== 'undefined' + ? { + decode(buf: Uint8Array): string { + const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength); + return out.toString(); + }, + } + : { + decode(buf: Uint8Array): string { + let out = ''; + for (let i = 0; i < buf.length; i++) { + out += String.fromCharCode(buf[i]); + } + return out; + }, + }; + +export class StringWriter { + pos = 0; + private out = ''; + private buffer = new Uint8Array(bufLength); + + write(v: number): void { + const { buffer } = this; + buffer[this.pos++] = v; + if (this.pos === bufLength) { + this.out += td.decode(buffer); + this.pos = 0; + } + } + + flush(): string { + const { buffer, out, pos } = this; + return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out; + } +} + +export class StringReader { + pos = 0; + declare private buffer: string; + + constructor(buffer: string) { + this.buffer = buffer; + } + + next(): number { + return this.buffer.charCodeAt(this.pos++); + } + + peek(): number { + return this.buffer.charCodeAt(this.pos); + } + + indexOf(char: string): number { + const { buffer, pos } = this; + const idx = buffer.indexOf(char, pos); + return idx === -1 ? buffer.length : idx; + } +} diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts new file mode 100644 index 0000000..a42c681 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts @@ -0,0 +1,55 @@ +import type { StringReader, StringWriter } from './strings'; + +export const comma = ','.charCodeAt(0); +export const semicolon = ';'.charCodeAt(0); + +const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +const intToChar = new Uint8Array(64); // 64 possible chars. +const charToInt = new Uint8Array(128); // z is 122 in ASCII + +for (let i = 0; i < chars.length; i++) { + const c = chars.charCodeAt(i); + intToChar[i] = c; + charToInt[c] = i; +} + +export function decodeInteger(reader: StringReader, relative: number): number { + let value = 0; + let shift = 0; + let integer = 0; + + do { + const c = reader.next(); + integer = charToInt[c]; + value |= (integer & 31) << shift; + shift += 5; + } while (integer & 32); + + const shouldNegate = value & 1; + value >>>= 1; + + if (shouldNegate) { + value = -0x80000000 | -value; + } + + return relative + value; +} + +export function encodeInteger(builder: StringWriter, num: number, relative: number): number { + let delta = num - relative; + + delta = delta < 0 ? (-delta << 1) | 1 : delta << 1; + do { + let clamped = delta & 0b011111; + delta >>>= 5; + if (delta > 0) clamped |= 0b100000; + builder.write(intToChar[clamped]); + } while (delta > 0); + + return num; +} + +export function hasMoreVlq(reader: StringReader, max: number) { + if (reader.pos >= max) return false; + return reader.peek() !== comma; +} diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts new file mode 100644 index 0000000..c583c75 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts @@ -0,0 +1,50 @@ +type Line = number; +type Column = number; +type Kind = number; +type Name = number; +type Var = number; +type SourcesIndex = number; +type ScopesIndex = number; +type Mix = (A & O) | (B & O); +export type OriginalScope = Mix<[ + Line, + Column, + Line, + Column, + Kind +], [ + Line, + Column, + Line, + Column, + Kind, + Name +], { + vars: Var[]; +}>; +export type GeneratedRange = Mix<[ + Line, + Column, + Line, + Column +], [ + Line, + Column, + Line, + Column, + SourcesIndex, + ScopesIndex +], { + callsite: CallSite | null; + bindings: Binding[]; + isScope: boolean; +}>; +export type CallSite = [SourcesIndex, Line, Column]; +type Binding = BindingExpressionRange[]; +export type BindingExpressionRange = [Name] | [Name, Line, Column]; +export declare function decodeOriginalScopes(input: string): OriginalScope[]; +export declare function encodeOriginalScopes(scopes: OriginalScope[]): string; +export declare function decodeGeneratedRanges(input: string): GeneratedRange[]; +export declare function encodeGeneratedRanges(ranges: GeneratedRange[]): string; +export {}; +//# sourceMappingURL=scopes.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map new file mode 100644 index 0000000..630e647 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAKA,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,MAAM,GAAG,MAAM,CAAC;AACrB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,GAAG,GAAG,MAAM,CAAC;AAClB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,GAAG,CAC7B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;CAAC,EAClC;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,IAAI;CAAC,EACxC;IAAE,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,GAAG,CAC9B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;CAAC,EAC5B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,YAAY;IAAE,WAAW;CAAC,EACvD;IACE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CACF,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,KAAK,OAAO,GAAG,sBAAsB,EAAE,CAAC;AACxC,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAyCnE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAQpE;AA2CD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAoGrE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAUtE"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts new file mode 100644 index 0000000..c583c75 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts @@ -0,0 +1,50 @@ +type Line = number; +type Column = number; +type Kind = number; +type Name = number; +type Var = number; +type SourcesIndex = number; +type ScopesIndex = number; +type Mix = (A & O) | (B & O); +export type OriginalScope = Mix<[ + Line, + Column, + Line, + Column, + Kind +], [ + Line, + Column, + Line, + Column, + Kind, + Name +], { + vars: Var[]; +}>; +export type GeneratedRange = Mix<[ + Line, + Column, + Line, + Column +], [ + Line, + Column, + Line, + Column, + SourcesIndex, + ScopesIndex +], { + callsite: CallSite | null; + bindings: Binding[]; + isScope: boolean; +}>; +export type CallSite = [SourcesIndex, Line, Column]; +type Binding = BindingExpressionRange[]; +export type BindingExpressionRange = [Name] | [Name, Line, Column]; +export declare function decodeOriginalScopes(input: string): OriginalScope[]; +export declare function encodeOriginalScopes(scopes: OriginalScope[]): string; +export declare function decodeGeneratedRanges(input: string): GeneratedRange[]; +export declare function encodeGeneratedRanges(ranges: GeneratedRange[]): string; +export {}; +//# sourceMappingURL=scopes.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map new file mode 100644 index 0000000..630e647 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAKA,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,MAAM,GAAG,MAAM,CAAC;AACrB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,GAAG,GAAG,MAAM,CAAC;AAClB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,GAAG,CAC7B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;CAAC,EAClC;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,IAAI;CAAC,EACxC;IAAE,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,GAAG,CAC9B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;CAAC,EAC5B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,YAAY;IAAE,WAAW;CAAC,EACvD;IACE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CACF,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,KAAK,OAAO,GAAG,sBAAsB,EAAE,CAAC;AACxC,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAyCnE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAQpE;AA2CD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAoGrE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAUtE"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts new file mode 100644 index 0000000..5f35e22 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts @@ -0,0 +1,9 @@ +export { decodeOriginalScopes, encodeOriginalScopes, decodeGeneratedRanges, encodeGeneratedRanges, } from './scopes.cts'; +export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes.cts'; +export type SourceMapSegment = [number] | [number, number, number, number] | [number, number, number, number, number]; +export type SourceMapLine = SourceMapSegment[]; +export type SourceMapMappings = SourceMapLine[]; +export declare function decode(mappings: string): SourceMapMappings; +export declare function encode(decoded: SourceMapMappings): string; +export declare function encode(decoded: Readonly): string; +//# sourceMappingURL=sourcemap-codec.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map new file mode 100644 index 0000000..7123d52 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"sourcemap-codec.d.ts","sourceRoot":"","sources":["../src/sourcemap-codec.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEhG,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,CAAC,GACR,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,aAAa,EAAE,CAAC;AAEhD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAiD1D;AAUD,wBAAgB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC;AAC3D,wBAAgB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts new file mode 100644 index 0000000..199fb9f --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts @@ -0,0 +1,9 @@ +export { decodeOriginalScopes, encodeOriginalScopes, decodeGeneratedRanges, encodeGeneratedRanges, } from './scopes.mts'; +export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes.mts'; +export type SourceMapSegment = [number] | [number, number, number, number] | [number, number, number, number, number]; +export type SourceMapLine = SourceMapSegment[]; +export type SourceMapMappings = SourceMapLine[]; +export declare function decode(mappings: string): SourceMapMappings; +export declare function encode(decoded: SourceMapMappings): string; +export declare function encode(decoded: Readonly): string; +//# sourceMappingURL=sourcemap-codec.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map new file mode 100644 index 0000000..7123d52 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"sourcemap-codec.d.ts","sourceRoot":"","sources":["../src/sourcemap-codec.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEhG,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,CAAC,GACR,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,aAAa,EAAE,CAAC;AAEhD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAiD1D;AAUD,wBAAgB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC;AAC3D,wBAAgB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts new file mode 100644 index 0000000..62faceb --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts @@ -0,0 +1,16 @@ +export declare class StringWriter { + pos: number; + private out; + private buffer; + write(v: number): void; + flush(): string; +} +export declare class StringReader { + pos: number; + private buffer; + constructor(buffer: string); + next(): number; + peek(): number; + indexOf(char: string): number; +} +//# sourceMappingURL=strings.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map new file mode 100644 index 0000000..d3602da --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAuBA,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAA6B;IAE3C,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAStB,KAAK,IAAI,MAAM;CAIhB;AAED,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,QAAgB,MAAM,CAAS;gBAEnB,MAAM,EAAE,MAAM;IAI1B,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAK9B"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts new file mode 100644 index 0000000..62faceb --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts @@ -0,0 +1,16 @@ +export declare class StringWriter { + pos: number; + private out; + private buffer; + write(v: number): void; + flush(): string; +} +export declare class StringReader { + pos: number; + private buffer; + constructor(buffer: string); + next(): number; + peek(): number; + indexOf(char: string): number; +} +//# sourceMappingURL=strings.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map new file mode 100644 index 0000000..d3602da --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAuBA,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAA6B;IAE3C,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAStB,KAAK,IAAI,MAAM;CAIhB;AAED,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,QAAgB,MAAM,CAAS;gBAEnB,MAAM,EAAE,MAAM;IAI1B,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAK9B"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts new file mode 100644 index 0000000..dbd6602 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts @@ -0,0 +1,7 @@ +import type { StringReader, StringWriter } from './strings.cts'; +export declare const comma: number; +export declare const semicolon: number; +export declare function decodeInteger(reader: StringReader, relative: number): number; +export declare function encodeInteger(builder: StringWriter, num: number, relative: number): number; +export declare function hasMoreVlq(reader: StringReader, max: number): boolean; +//# sourceMappingURL=vlq.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map new file mode 100644 index 0000000..6fdc356 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"vlq.d.ts","sourceRoot":"","sources":["../src/vlq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5D,eAAO,MAAM,KAAK,QAAoB,CAAC;AACvC,eAAO,MAAM,SAAS,QAAoB,CAAC;AAY3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoB5E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,WAG3D"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts new file mode 100644 index 0000000..2c739bc --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts @@ -0,0 +1,7 @@ +import type { StringReader, StringWriter } from './strings.mts'; +export declare const comma: number; +export declare const semicolon: number; +export declare function decodeInteger(reader: StringReader, relative: number): number; +export declare function encodeInteger(builder: StringWriter, num: number, relative: number): number; +export declare function hasMoreVlq(reader: StringReader, max: number): boolean; +//# sourceMappingURL=vlq.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map new file mode 100644 index 0000000..6fdc356 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"vlq.d.ts","sourceRoot":"","sources":["../src/vlq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5D,eAAO,MAAM,KAAK,QAAoB,CAAC;AACvC,eAAO,MAAM,SAAS,QAAoB,CAAC;AAY3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoB5E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,WAG3D"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/magic-string/package.json b/sdk/typescript/node_modules/magic-string/package.json new file mode 100644 index 0000000..5ba3ac6 --- /dev/null +++ b/sdk/typescript/node_modules/magic-string/package.json @@ -0,0 +1,67 @@ +{ + "name": "magic-string", + "version": "0.30.21", + "type": "commonjs", + "description": "Modify strings, generate sourcemaps", + "keywords": [ + "string", + "string manipulation", + "sourcemap", + "templating", + "transpilation" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/Rich-Harris/magic-string.git" + }, + "license": "MIT", + "author": "Rich Harris", + "main": "./dist/magic-string.cjs.js", + "module": "./dist/magic-string.es.mjs", + "sideEffects": false, + "jsnext:main": "./dist/magic-string.es.mjs", + "types": "./dist/magic-string.cjs.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "import": "./dist/magic-string.es.mjs", + "require": "./dist/magic-string.cjs.js" + } + }, + "files": [ + "dist/*", + "index.d.ts", + "README.md" + ], + "devDependencies": { + "@eslint/js": "^9.38.0", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-replace": "^6.0.2", + "benchmark": "^2.1.4", + "bumpp": "^10.3.1", + "conventional-changelog-cli": "^5.0.0", + "eslint": "^9.38.0", + "prettier": "^3.6.2", + "publint": "^0.3.15", + "rollup": "^4.52.5", + "source-map-js": "^1.2.1", + "source-map-support": "^0.5.21", + "vitest": "^4.0.2" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + }, + "scripts": { + "build": "rollup -c", + "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", + "format": "prettier --single-quote --print-width 100 --use-tabs --write .", + "lint": "eslint src test && publint", + "lint:fix": "eslint src test --fix", + "release": "bumpp -x \"pnpm run changelog\" --all", + "pretest": "pnpm run build", + "test": "vitest run", + "test:dev": "vitest", + "bench": "pnpm run build && node benchmark/index.mjs", + "watch": "rollup -cw" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/picocolors/LICENSE b/sdk/typescript/node_modules/picocolors/LICENSE new file mode 100644 index 0000000..46c9b95 --- /dev/null +++ b/sdk/typescript/node_modules/picocolors/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/sdk/typescript/node_modules/picocolors/README.md b/sdk/typescript/node_modules/picocolors/README.md new file mode 100644 index 0000000..8e47aa8 --- /dev/null +++ b/sdk/typescript/node_modules/picocolors/README.md @@ -0,0 +1,21 @@ +# picocolors + +The tiniest and the fastest library for terminal output formatting with ANSI colors. + +```javascript +import pc from "picocolors" + +console.log( + pc.green(`How are ${pc.italic(`you`)} doing?`) +) +``` + +- **No dependencies.** +- **14 times** smaller and **2 times** faster than chalk. +- Used by popular tools like PostCSS, SVGO, Stylelint, and Browserslist. +- Node.js v6+ & browsers support. Support for both CJS and ESM projects. +- TypeScript type declarations included. +- [`NO_COLOR`](https://no-color.org/) friendly. + +## Docs +Read **[full docs](https://github.com/alexeyraspopov/picocolors#readme)** on GitHub. diff --git a/sdk/typescript/node_modules/picocolors/package.json b/sdk/typescript/node_modules/picocolors/package.json new file mode 100644 index 0000000..372d4b6 --- /dev/null +++ b/sdk/typescript/node_modules/picocolors/package.json @@ -0,0 +1,25 @@ +{ + "name": "picocolors", + "version": "1.1.1", + "main": "./picocolors.js", + "types": "./picocolors.d.ts", + "browser": { + "./picocolors.js": "./picocolors.browser.js" + }, + "sideEffects": false, + "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors", + "files": [ + "picocolors.*", + "types.d.ts" + ], + "keywords": [ + "terminal", + "colors", + "formatting", + "cli", + "console" + ], + "author": "Alexey Raspopov", + "repository": "alexeyraspopov/picocolors", + "license": "ISC" +} diff --git a/sdk/typescript/node_modules/picocolors/picocolors.browser.js b/sdk/typescript/node_modules/picocolors/picocolors.browser.js new file mode 100644 index 0000000..9dcf637 --- /dev/null +++ b/sdk/typescript/node_modules/picocolors/picocolors.browser.js @@ -0,0 +1,4 @@ +var x=String; +var create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}}; +module.exports=create(); +module.exports.createColors = create; diff --git a/sdk/typescript/node_modules/picocolors/picocolors.d.ts b/sdk/typescript/node_modules/picocolors/picocolors.d.ts new file mode 100644 index 0000000..94e146a --- /dev/null +++ b/sdk/typescript/node_modules/picocolors/picocolors.d.ts @@ -0,0 +1,5 @@ +import { Colors } from "./types" + +declare const picocolors: Colors & { createColors: (enabled?: boolean) => Colors } + +export = picocolors diff --git a/sdk/typescript/node_modules/picocolors/picocolors.js b/sdk/typescript/node_modules/picocolors/picocolors.js new file mode 100644 index 0000000..e32df85 --- /dev/null +++ b/sdk/typescript/node_modules/picocolors/picocolors.js @@ -0,0 +1,75 @@ +let p = process || {}, argv = p.argv || [], env = p.env || {} +let isColorSupported = + !(!!env.NO_COLOR || argv.includes("--no-color")) && + (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI) + +let formatter = (open, close, replace = open) => + input => { + let string = "" + input, index = string.indexOf(close, open.length) + return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close + } + +let replaceClose = (string, close, replace, index) => { + let result = "", cursor = 0 + do { + result += string.substring(cursor, index) + replace + cursor = index + close.length + index = string.indexOf(close, cursor) + } while (~index) + return result + string.substring(cursor) +} + +let createColors = (enabled = isColorSupported) => { + let f = enabled ? formatter : () => String + return { + isColorSupported: enabled, + reset: f("\x1b[0m", "\x1b[0m"), + bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"), + dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"), + italic: f("\x1b[3m", "\x1b[23m"), + underline: f("\x1b[4m", "\x1b[24m"), + inverse: f("\x1b[7m", "\x1b[27m"), + hidden: f("\x1b[8m", "\x1b[28m"), + strikethrough: f("\x1b[9m", "\x1b[29m"), + + black: f("\x1b[30m", "\x1b[39m"), + red: f("\x1b[31m", "\x1b[39m"), + green: f("\x1b[32m", "\x1b[39m"), + yellow: f("\x1b[33m", "\x1b[39m"), + blue: f("\x1b[34m", "\x1b[39m"), + magenta: f("\x1b[35m", "\x1b[39m"), + cyan: f("\x1b[36m", "\x1b[39m"), + white: f("\x1b[37m", "\x1b[39m"), + gray: f("\x1b[90m", "\x1b[39m"), + + bgBlack: f("\x1b[40m", "\x1b[49m"), + bgRed: f("\x1b[41m", "\x1b[49m"), + bgGreen: f("\x1b[42m", "\x1b[49m"), + bgYellow: f("\x1b[43m", "\x1b[49m"), + bgBlue: f("\x1b[44m", "\x1b[49m"), + bgMagenta: f("\x1b[45m", "\x1b[49m"), + bgCyan: f("\x1b[46m", "\x1b[49m"), + bgWhite: f("\x1b[47m", "\x1b[49m"), + + blackBright: f("\x1b[90m", "\x1b[39m"), + redBright: f("\x1b[91m", "\x1b[39m"), + greenBright: f("\x1b[92m", "\x1b[39m"), + yellowBright: f("\x1b[93m", "\x1b[39m"), + blueBright: f("\x1b[94m", "\x1b[39m"), + magentaBright: f("\x1b[95m", "\x1b[39m"), + cyanBright: f("\x1b[96m", "\x1b[39m"), + whiteBright: f("\x1b[97m", "\x1b[39m"), + + bgBlackBright: f("\x1b[100m", "\x1b[49m"), + bgRedBright: f("\x1b[101m", "\x1b[49m"), + bgGreenBright: f("\x1b[102m", "\x1b[49m"), + bgYellowBright: f("\x1b[103m", "\x1b[49m"), + bgBlueBright: f("\x1b[104m", "\x1b[49m"), + bgMagentaBright: f("\x1b[105m", "\x1b[49m"), + bgCyanBright: f("\x1b[106m", "\x1b[49m"), + bgWhiteBright: f("\x1b[107m", "\x1b[49m"), + } +} + +module.exports = createColors() +module.exports.createColors = createColors diff --git a/sdk/typescript/node_modules/picocolors/types.d.ts b/sdk/typescript/node_modules/picocolors/types.d.ts new file mode 100644 index 0000000..cd1aec4 --- /dev/null +++ b/sdk/typescript/node_modules/picocolors/types.d.ts @@ -0,0 +1,51 @@ +export type Formatter = (input: string | number | null | undefined) => string + +export interface Colors { + isColorSupported: boolean + + reset: Formatter + bold: Formatter + dim: Formatter + italic: Formatter + underline: Formatter + inverse: Formatter + hidden: Formatter + strikethrough: Formatter + + black: Formatter + red: Formatter + green: Formatter + yellow: Formatter + blue: Formatter + magenta: Formatter + cyan: Formatter + white: Formatter + gray: Formatter + + bgBlack: Formatter + bgRed: Formatter + bgGreen: Formatter + bgYellow: Formatter + bgBlue: Formatter + bgMagenta: Formatter + bgCyan: Formatter + bgWhite: Formatter + + blackBright: Formatter + redBright: Formatter + greenBright: Formatter + yellowBright: Formatter + blueBright: Formatter + magentaBright: Formatter + cyanBright: Formatter + whiteBright: Formatter + + bgBlackBright: Formatter + bgRedBright: Formatter + bgGreenBright: Formatter + bgYellowBright: Formatter + bgBlueBright: Formatter + bgMagentaBright: Formatter + bgCyanBright: Formatter + bgWhiteBright: Formatter +} diff --git a/sdk/typescript/node_modules/postcss-load-config/LICENSE b/sdk/typescript/node_modules/postcss-load-config/LICENSE new file mode 100644 index 0000000..458e8a3 --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright Michael Ciniawsky + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/postcss-load-config/README.md b/sdk/typescript/node_modules/postcss-load-config/README.md new file mode 100644 index 0000000..6244afc --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/README.md @@ -0,0 +1,474 @@ + + +
+ + + + + +

Load Config

+
+ +

Install

+ +```bash +npm i -D postcss-load-config +``` + +

Usage

+ +```bash +npm i -S|-D postcss-plugin +``` + +Install all required PostCSS plugins and save them to your **package.json** `dependencies`/`devDependencies` + +Then create a PostCSS config file by choosing one of the following formats + +### `package.json` + +Create a **`postcss`** section in your project's **`package.json`** + +``` +Project (Root) + |– client + |– public + | + |- package.json +``` + +```json +{ + "postcss": { + "parser": "sugarss", + "map": false, + "plugins": { + "postcss-plugin": {} + } + } +} +``` + +### `.postcssrc` + +Create a **`.postcssrc`** file in JSON or YAML format + +> ℹ️ It's recommended to use an extension (e.g **`.postcssrc.json`** or **`.postcssrc.yml`**) instead of `.postcssrc` + +``` +Project (Root) + |– client + |– public + | + |- (.postcssrc|.postcssrc.json|.postcssrc.yml) + |- package.json +``` + +**`.postcssrc.json`** +```json +{ + "parser": "sugarss", + "map": false, + "plugins": { + "postcss-plugin": {} + } +} +``` + +**`.postcssrc.yml`** +```yaml +parser: sugarss +map: false +plugins: + postcss-plugin: {} +``` + +> [!NOTE] +> For YAML configs, you must have [yaml](https://www.npmjs.com/package/yaml) installed as a peer dependency. + +### `.postcssrc.js` or `postcss.config.js` + +You may need some logic within your config. +In this case create JS/TS file named: +- `.postcssrc.js` +- `.postcssrc.mjs` +- `.postcssrc.cjs` +- `.postcssrc.ts` +- `.postcssrc.mts` +- `.postcssrc.cts` +- `postcss.config.js` +- `postcss.config.mjs` +- `postcss.config.cjs` +- `postcss.config.ts` +- `postcss.config.mts` +- `postcss.config.cts` + +> [!NOTE] +> For TypeScript configs, you must have [tsx](https://www.npmjs.com/package/tsx) or [jiti](https://www.npmjs.com/package/jiti) installed as a peer dependency. + +``` +Project (Root) + |– client + |– public + |- (.postcssrc|postcss.config).(js|mjs|cjs|ts|mts|cts) + |- package.json +``` + +You can export the config as an `{Object}` + +**.postcssrc.js** +```js +module.exports = { + parser: 'sugarss', + map: false, + plugins: { + 'postcss-plugin': {} + } +} +``` + +Or export a `{Function}` that returns the config (more about the `ctx` param below) + +**.postcssrc.js** +```js +module.exports = (ctx) => ({ + parser: ctx.parser ? 'sugarss' : false, + map: ctx.env === 'development' ? ctx.map : false, + plugins: { + 'postcss-plugin': ctx.options.plugin + } +}) +``` + +Plugins can be loaded either using an `{Object}` or an `{Array}` + +#### `{Object}` + +**.postcssrc.js** +```js +module.exports = ({ env }) => ({ + ...options, + plugins: { + 'postcss-plugin': env === 'production' ? {} : false + } +}) +``` + +> ℹ️ When using an `{Object}`, the key can be a Node.js module name, a path to a JavaScript file that is relative to the directory of the PostCSS config file, or an absolute path to a JavaScript file. + +#### `{Array}` + +**.postcssrc.js** +```js +module.exports = ({ env }) => ({ + ...options, + plugins: [ + env === 'production' ? require('postcss-plugin')() : false + ] +}) +``` +> :warning: When using an `{Array}`, make sure to `require()` each plugin + +

Options

+ +|Name|Type|Default|Description| +|:--:|:--:|:-----:|:----------| +|[**`to`**](#to)|`{String}`|`undefined`|Destination File Path| +|[**`map`**](#map)|`{String\|Object}`|`false`|Enable/Disable Source Maps| +|[**`from`**](#from)|`{String}`|`undefined`|Source File Path| +|[**`parser`**](#parser)|`{String\|Function}`|`false`|Custom PostCSS Parser| +|[**`syntax`**](#syntax)|`{String\|Function}`|`false`|Custom PostCSS Syntax| +|[**`stringifier`**](#stringifier)|`{String\|Function}`|`false`|Custom PostCSS Stringifier| + +### `parser` + +**.postcssrc.js** +```js +module.exports = { + parser: 'sugarss' +} +``` + +### `syntax` + +**.postcssrc.js** +```js +module.exports = { + syntax: 'postcss-scss' +} +``` + +### `stringifier` + +**.postcssrc.js** +```js +module.exports = { + stringifier: 'midas' +} +``` + +### [**`map`**](https://github.com/postcss/postcss/blob/master/docs/source-maps.md) + +**.postcssrc.js** +```js +module.exports = { + map: 'inline' +} +``` + +> :warning: In most cases `options.from` && `options.to` are set by the third-party which integrates this package (CLI, gulp, webpack). It's unlikely one needs to set/use `options.from` && `options.to` within a config file. Unless you're a third-party plugin author using this module and its Node API directly **dont't set `options.from` && `options.to` yourself** + +### `to` + +```js +module.exports = { + to: 'path/to/dest.css' +} +``` + +### `from` + +```js +module.exports = { + from: 'path/to/src.css' +} +``` + +

Plugins

+ +### `{} || null` + +The plugin will be loaded with defaults + +```js +'postcss-plugin': {} || null +``` + +**.postcssrc.js** +```js +module.exports = { + plugins: { + 'postcss-plugin': {} || null + } +} +``` + +> :warning: `{}` must be an **empty** `{Object}` literal + +### `{Object}` + +The plugin will be loaded with given options + +```js +'postcss-plugin': { option: '', option: '' } +``` + +**.postcssrc.js** +```js +module.exports = { + plugins: { + 'postcss-plugin': { option: '', option: '' } + } +} +``` + +### `false` + +The plugin will not be loaded + +```js +'postcss-plugin': false +``` + +**.postcssrc.js** +```js +module.exports = { + plugins: { + 'postcss-plugin': false + } +} +``` + +### `Ordering` + +Plugin **execution order** is determined by declaration in the plugins section (**top-down**) + +```js +{ + plugins: { + 'postcss-plugin': {}, // [0] + 'postcss-plugin': {}, // [1] + 'postcss-plugin': {} // [2] + } +} +``` + +

Context

+ +When using a `{Function}` (`postcss.config.js` or `.postcssrc.js`), it's possible to pass context to `postcss-load-config`, which will be evaluated while loading your config. By default `ctx.env (process.env.NODE_ENV)` and `ctx.cwd (process.cwd())` are available on the `ctx` `{Object}` + +> ℹ️ Most third-party integrations add additional properties to the `ctx` (e.g `postcss-loader`). Check the specific module's README for more information about what is available on the respective `ctx` + +

Examples

+ +**postcss.config.js** + +```js +module.exports = (ctx) => ({ + parser: ctx.parser ? 'sugarss' : false, + map: ctx.env === 'development' ? ctx.map : false, + plugins: { + 'postcss-import': {}, + 'postcss-nested': {}, + cssnano: ctx.env === 'production' ? {} : false + } +}) +``` + +
+ +
+ +```json +"scripts": { + "build": "NODE_ENV=production node postcss", + "start": "NODE_ENV=development node postcss" +} +``` + +```js +const { readFileSync } = require('fs') + +const postcss = require('postcss') +const postcssrc = require('postcss-load-config') + +const css = readFileSync('index.css', 'utf8') + +const ctx = { parser: true, map: 'inline' } + +postcssrc(ctx).then(({ plugins, options }) => { + postcss(plugins) + .process(css, options) + .then((result) => console.log(result.css)) +}) +``` + +
+ +
+ +```json +"scripts": { + "build": "NODE_ENV=production gulp", + "start": "NODE_ENV=development gulp" +} +``` + +```js +const { task, src, dest, series, watch } = require('gulp') + +const postcss = require('gulp-postcssrc') + +const css = () => { + src('src/*.css') + .pipe(postcss()) + .pipe(dest('dest')) +}) + +task('watch', () => { + watch(['src/*.css', 'postcss.config.js'], css) +}) + +task('default', series(css, 'watch')) +``` + +
+ +
+ +```json +"scripts": { + "build": "NODE_ENV=production webpack", + "start": "NODE_ENV=development webpack-dev-server" +} +``` + +**webpack.config.js** +```js +module.exports = (env) => ({ + module: { + rules: [ + { + test: /\.css$/, + use: [ + 'style-loader', + 'css-loader', + 'postcss-loader' + ] + } + ] + } +}) +``` + +

Maintainers

+ + + + + + + + +
+ +
+ Michael Ciniawsky +
+ +
+ Mateusz Derks +
+ +

Contributors

+ + + + + + + + + + +
+ +
+ Ryan Dunckel +
+ +
+ Patrick Gilday +
+ +
+ Dalton Santos +
+ +
+ François Wouts +
=14" + } +} diff --git a/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/readme.md b/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/readme.md new file mode 100644 index 0000000..99c4262 --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/readme.md @@ -0,0 +1,98 @@ +# Lilconfig ⚙️ +[![npm version](https://badge.fury.io/js/lilconfig.svg)](https://badge.fury.io/js/lilconfig) +[![install size](https://packagephobia.now.sh/badge?p=lilconfig)](https://packagephobia.now.sh/result?p=lilconfig) +[![Coverage Status](https://coveralls.io/repos/github/antonk52/lilconfig/badge.svg)](https://coveralls.io/github/antonk52/lilconfig) + +A zero-dependency alternative to [cosmiconfig](https://www.npmjs.com/package/cosmiconfig) with the same API. + +## Installation + +```sh +npm install lilconfig +``` + +## Usage + +```js +import {lilconfig, lilconfigSync} from 'lilconfig'; + +// all keys are optional +const options = { + stopDir: '/Users/you/some/dir', + searchPlaces: ['package.json', 'myapp.conf.js'], + ignoreEmptySearchPlaces: false +} + +lilconfig( + 'myapp', + options // optional +).search() // Promise + +lilconfigSync( + 'myapp', + options // optional +).load(pathToConfig) // LilconfigResult + +/** + * LilconfigResult + * { + * config: any; // your config + * filepath: string; + * } + */ +``` + +## ESM + +ESM configs can be loaded with **async API only**. Specifically `js` files in projects with `"type": "module"` in `package.json` or `mjs` files. + +## Difference to `cosmiconfig` +Lilconfig does not intend to be 100% compatible with `cosmiconfig` but tries to mimic it where possible. The key difference is **no** support for yaml files out of the box(`lilconfig` attempts to parse files with no extension as JSON instead of YAML). You can still add the support for YAML files by providing a loader, see an [example](#yaml-loader) below. + +### Options difference between the two. + +|cosmiconfig option | lilconfig | +|------------------------|-----------| +|cache | ✅ | +|loaders | ✅ | +|ignoreEmptySearchPlaces | ✅ | +|packageProp | ✅ | +|searchPlaces | ✅ | +|stopDir | ✅ | +|transform | ✅ | + +## Loaders examples + +### Yaml loader + +If you need the YAML support you can provide your own loader + +```js +import {lilconfig} from 'lilconfig'; +import yaml from 'yaml'; + +function loadYaml(filepath, content) { + return yaml.parse(content); +} + +const options = { + loaders: { + '.yaml': loadYaml, + '.yml': loadYaml, + // loader for files with no extension + noExt: loadYaml + } +}; + +lilconfig('myapp', options) + .search() + .then(result => { + result // {config, filepath} + }); +``` + +## Version correlation + +- lilconig v1 → cosmiconfig v6 +- lilconig v2 → cosmiconfig v7 +- lilconig v3 → cosmiconfig v8 diff --git a/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/src/index.d.ts b/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/src/index.d.ts new file mode 100644 index 0000000..fa1146b --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/src/index.d.ts @@ -0,0 +1,54 @@ +export type LilconfigResult = null | { + filepath: string; + config: any; + isEmpty?: boolean; +}; +interface OptionsBase { + cache?: boolean; + stopDir?: string; + searchPlaces?: string[]; + ignoreEmptySearchPlaces?: boolean; + packageProp?: string | string[]; +} +export type Transform = + | TransformSync + | ((result: LilconfigResult) => Promise); +export type TransformSync = (result: LilconfigResult) => LilconfigResult; +type LoaderResult = any; +export type LoaderSync = (filepath: string, content: string) => LoaderResult; +export type Loader = + | LoaderSync + | ((filepath: string, content: string) => Promise); +export type Loaders = Record; +export type LoadersSync = Record; +export interface Options extends OptionsBase { + loaders?: Loaders; + transform?: Transform; +} +export interface OptionsSync extends OptionsBase { + loaders?: LoadersSync; + transform?: TransformSync; +} +export declare const defaultLoadersSync: LoadersSync; +export declare const defaultLoaders: Loaders; +type ClearCaches = { + clearLoadCache: () => void; + clearSearchCache: () => void; + clearCaches: () => void; +}; +type AsyncSearcher = { + search(searchFrom?: string): Promise; + load(filepath: string): Promise; +} & ClearCaches; +export declare function lilconfig( + name: string, + options?: Partial, +): AsyncSearcher; +type SyncSearcher = { + search(searchFrom?: string): LilconfigResult; + load(filepath: string): LilconfigResult; +} & ClearCaches; +export declare function lilconfigSync( + name: string, + options?: OptionsSync, +): SyncSearcher; diff --git a/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/src/index.js b/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/src/index.js new file mode 100644 index 0000000..af7bf47 --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/node_modules/lilconfig/src/index.js @@ -0,0 +1,460 @@ +// @ts-check +const path = require('path'); +const fs = require('fs'); +const os = require('os'); +const url = require('url'); + +const fsReadFileAsync = fs.promises.readFile; + +/** @type {(name: string, sync: boolean) => string[]} */ +function getDefaultSearchPlaces(name, sync) { + return [ + 'package.json', + `.${name}rc.json`, + `.${name}rc.js`, + `.${name}rc.cjs`, + ...(sync ? [] : [`.${name}rc.mjs`]), + `.config/${name}rc`, + `.config/${name}rc.json`, + `.config/${name}rc.js`, + `.config/${name}rc.cjs`, + ...(sync ? [] : [`.config/${name}rc.mjs`]), + `${name}.config.js`, + `${name}.config.cjs`, + ...(sync ? [] : [`${name}.config.mjs`]), + ]; +} + +/** + * @type {(p: string) => string} + * + * see #17 + * On *nix, if cwd is not under homedir, + * the last path will be '', ('/build' -> '') + * but it should be '/' actually. + * And on Windows, this will never happen. ('C:\build' -> 'C:') + */ +function parentDir(p) { + return path.dirname(p) || path.sep; +} + +/** @type {import('./index').LoaderSync} */ +const jsonLoader = (_, content) => JSON.parse(content); +// Use plain require in webpack context for dynamic import +const requireFunc = + typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require; +/** @type {import('./index').LoadersSync} */ +const defaultLoadersSync = Object.freeze({ + '.js': requireFunc, + '.json': requireFunc, + '.cjs': requireFunc, + noExt: jsonLoader, +}); +module.exports.defaultLoadersSync = defaultLoadersSync; + +/** @type {import('./index').Loader} */ +const dynamicImport = async id => { + try { + const fileUrl = url.pathToFileURL(id).href; + const mod = await import(/* webpackIgnore: true */ fileUrl); + + return mod.default; + } catch (e) { + try { + return requireFunc(id); + } catch (/** @type {any} */ requireE) { + if ( + requireE.code === 'ERR_REQUIRE_ESM' || + (requireE instanceof SyntaxError && + requireE + .toString() + .includes('Cannot use import statement outside a module')) + ) { + throw e; + } + throw requireE; + } + } +}; + +/** @type {import('./index').Loaders} */ +const defaultLoaders = Object.freeze({ + '.js': dynamicImport, + '.mjs': dynamicImport, + '.cjs': dynamicImport, + '.json': jsonLoader, + noExt: jsonLoader, +}); +module.exports.defaultLoaders = defaultLoaders; + +/** + * @param {string} name + * @param {import('./index').Options | import('./index').OptionsSync} options + * @param {boolean} sync + * @returns {Required} + */ +function getOptions(name, options, sync) { + /** @type {Required} */ + const conf = { + stopDir: os.homedir(), + searchPlaces: getDefaultSearchPlaces(name, sync), + ignoreEmptySearchPlaces: true, + cache: true, + transform: x => x, + packageProp: [name], + ...options, + loaders: { + ...(sync ? defaultLoadersSync : defaultLoaders), + ...options.loaders, + }, + }; + conf.searchPlaces.forEach(place => { + const key = path.extname(place) || 'noExt'; + const loader = conf.loaders[key]; + if (!loader) { + throw new Error(`Missing loader for extension "${place}"`); + } + + if (typeof loader !== 'function') { + throw new Error( + `Loader for extension "${place}" is not a function: Received ${typeof loader}.`, + ); + } + }); + + return conf; +} + +/** @type {(props: string | string[], obj: Record) => unknown} */ +function getPackageProp(props, obj) { + if (typeof props === 'string' && props in obj) return obj[props]; + return ( + (Array.isArray(props) ? props : props.split('.')).reduce( + (acc, prop) => (acc === undefined ? acc : acc[prop]), + obj, + ) || null + ); +} + +/** @param {string} filepath */ +function validateFilePath(filepath) { + if (!filepath) throw new Error('load must pass a non-empty string'); +} + +/** @type {(loader: import('./index').Loader, ext: string) => void} */ +function validateLoader(loader, ext) { + if (!loader) throw new Error(`No loader specified for extension "${ext}"`); + if (typeof loader !== 'function') throw new Error('loader is not a function'); +} + +/** @type {(enableCache: boolean) => (c: Map, filepath: string, res: T) => T} */ +const makeEmplace = enableCache => (c, filepath, res) => { + if (enableCache) c.set(filepath, res); + return res; +}; + +/** @type {import('./index').lilconfig} */ +module.exports.lilconfig = function lilconfig(name, options) { + const { + ignoreEmptySearchPlaces, + loaders, + packageProp, + searchPlaces, + stopDir, + transform, + cache, + } = getOptions(name, options ?? {}, false); + const searchCache = new Map(); + const loadCache = new Map(); + const emplace = makeEmplace(cache); + + return { + async search(searchFrom = process.cwd()) { + /** @type {import('./index').LilconfigResult} */ + const result = { + config: null, + filepath: '', + }; + + /** @type {Set} */ + const visited = new Set(); + let dir = searchFrom; + dirLoop: while (true) { + if (cache) { + const r = searchCache.get(dir); + if (r !== undefined) { + for (const p of visited) searchCache.set(p, r); + return r; + } + visited.add(dir); + } + + for (const searchPlace of searchPlaces) { + const filepath = path.join(dir, searchPlace); + try { + await fs.promises.access(filepath); + } catch { + continue; + } + const content = String(await fsReadFileAsync(filepath)); + const loaderKey = path.extname(searchPlace) || 'noExt'; + const loader = loaders[loaderKey]; + + // handle package.json + if (searchPlace === 'package.json') { + const pkg = await loader(filepath, content); + const maybeConfig = getPackageProp(packageProp, pkg); + if (maybeConfig != null) { + result.config = maybeConfig; + result.filepath = filepath; + break dirLoop; + } + + continue; + } + + // handle other type of configs + const isEmpty = content.trim() === ''; + if (isEmpty && ignoreEmptySearchPlaces) continue; + + if (isEmpty) { + result.isEmpty = true; + result.config = undefined; + } else { + validateLoader(loader, loaderKey); + result.config = await loader(filepath, content); + } + result.filepath = filepath; + break dirLoop; + } + if (dir === stopDir || dir === parentDir(dir)) break dirLoop; + dir = parentDir(dir); + } + + const transformed = + // not found + result.filepath === '' && result.config === null + ? transform(null) + : transform(result); + + if (cache) { + for (const p of visited) searchCache.set(p, transformed); + } + + return transformed; + }, + async load(filepath) { + validateFilePath(filepath); + const absPath = path.resolve(process.cwd(), filepath); + if (cache && loadCache.has(absPath)) { + return loadCache.get(absPath); + } + const {base, ext} = path.parse(absPath); + const loaderKey = ext || 'noExt'; + const loader = loaders[loaderKey]; + validateLoader(loader, loaderKey); + const content = String(await fsReadFileAsync(absPath)); + + if (base === 'package.json') { + const pkg = await loader(absPath, content); + return emplace( + loadCache, + absPath, + transform({ + config: getPackageProp(packageProp, pkg), + filepath: absPath, + }), + ); + } + /** @type {import('./index').LilconfigResult} */ + const result = { + config: null, + filepath: absPath, + }; + // handle other type of configs + const isEmpty = content.trim() === ''; + if (isEmpty && ignoreEmptySearchPlaces) + return emplace( + loadCache, + absPath, + transform({ + config: undefined, + filepath: absPath, + isEmpty: true, + }), + ); + + // cosmiconfig returns undefined for empty files + result.config = isEmpty ? undefined : await loader(absPath, content); + + return emplace( + loadCache, + absPath, + transform(isEmpty ? {...result, isEmpty, config: undefined} : result), + ); + }, + clearLoadCache() { + if (cache) loadCache.clear(); + }, + clearSearchCache() { + if (cache) searchCache.clear(); + }, + clearCaches() { + if (cache) { + loadCache.clear(); + searchCache.clear(); + } + }, + }; +}; + +/** @type {import('./index').lilconfigSync} */ +module.exports.lilconfigSync = function lilconfigSync(name, options) { + const { + ignoreEmptySearchPlaces, + loaders, + packageProp, + searchPlaces, + stopDir, + transform, + cache, + } = getOptions(name, options ?? {}, true); + const searchCache = new Map(); + const loadCache = new Map(); + const emplace = makeEmplace(cache); + + return { + search(searchFrom = process.cwd()) { + /** @type {import('./index').LilconfigResult} */ + const result = { + config: null, + filepath: '', + }; + + /** @type {Set} */ + const visited = new Set(); + let dir = searchFrom; + dirLoop: while (true) { + if (cache) { + const r = searchCache.get(dir); + if (r !== undefined) { + for (const p of visited) searchCache.set(p, r); + return r; + } + visited.add(dir); + } + + for (const searchPlace of searchPlaces) { + const filepath = path.join(dir, searchPlace); + try { + fs.accessSync(filepath); + } catch { + continue; + } + const loaderKey = path.extname(searchPlace) || 'noExt'; + const loader = loaders[loaderKey]; + const content = String(fs.readFileSync(filepath)); + + // handle package.json + if (searchPlace === 'package.json') { + const pkg = loader(filepath, content); + const maybeConfig = getPackageProp(packageProp, pkg); + if (maybeConfig != null) { + result.config = maybeConfig; + result.filepath = filepath; + break dirLoop; + } + + continue; + } + + // handle other type of configs + const isEmpty = content.trim() === ''; + if (isEmpty && ignoreEmptySearchPlaces) continue; + + if (isEmpty) { + result.isEmpty = true; + result.config = undefined; + } else { + validateLoader(loader, loaderKey); + result.config = loader(filepath, content); + } + result.filepath = filepath; + break dirLoop; + } + if (dir === stopDir || dir === parentDir(dir)) break dirLoop; + dir = parentDir(dir); + } + + const transformed = + // not found + result.filepath === '' && result.config === null + ? transform(null) + : transform(result); + + if (cache) { + for (const p of visited) searchCache.set(p, transformed); + } + + return transformed; + }, + load(filepath) { + validateFilePath(filepath); + const absPath = path.resolve(process.cwd(), filepath); + if (cache && loadCache.has(absPath)) { + return loadCache.get(absPath); + } + const {base, ext} = path.parse(absPath); + const loaderKey = ext || 'noExt'; + const loader = loaders[loaderKey]; + validateLoader(loader, loaderKey); + + const content = String(fs.readFileSync(absPath)); + + if (base === 'package.json') { + const pkg = loader(absPath, content); + return transform({ + config: getPackageProp(packageProp, pkg), + filepath: absPath, + }); + } + const result = { + config: null, + filepath: absPath, + }; + // handle other type of configs + const isEmpty = content.trim() === ''; + if (isEmpty && ignoreEmptySearchPlaces) + return emplace( + loadCache, + absPath, + transform({ + filepath: absPath, + config: undefined, + isEmpty: true, + }), + ); + + // cosmiconfig returns undefined for empty files + result.config = isEmpty ? undefined : loader(absPath, content); + + return emplace( + loadCache, + absPath, + transform(isEmpty ? {...result, isEmpty, config: undefined} : result), + ); + }, + clearLoadCache() { + if (cache) loadCache.clear(); + }, + clearSearchCache() { + if (cache) searchCache.clear(); + }, + clearCaches() { + if (cache) { + loadCache.clear(); + searchCache.clear(); + } + }, + }; +}; diff --git a/sdk/typescript/node_modules/postcss-load-config/package.json b/sdk/typescript/node_modules/postcss-load-config/package.json new file mode 100644 index 0000000..9042fc9 --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/package.json @@ -0,0 +1,61 @@ +{ + "name": "postcss-load-config", + "version": "6.0.1", + "description": "Autoload Config for PostCSS", + "main": "src/index.js", + "types": "src/index.d.ts", + "files": [ + "src" + ], + "engines": { + "node": ">= 18" + }, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + }, + "keywords": [ + "postcss", + "postcssrc", + "postcss.config.js" + ], + "author": "Michael Ciniawky ", + "contributors": [ + "Ryan Dunckel", + "Mateusz Derks", + "Dalton Santos", + "Patrick Gilday", + "François Wouts" + ], + "repository": "postcss/postcss-load-config", + "license": "MIT" +} diff --git a/sdk/typescript/node_modules/postcss-load-config/src/index.d.ts b/sdk/typescript/node_modules/postcss-load-config/src/index.d.ts new file mode 100644 index 0000000..30b7d61 --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/src/index.d.ts @@ -0,0 +1,65 @@ +// based on @types/postcss-load-config@2.0.1 +// Type definitions for postcss-load-config 2.1 +import Processor from 'postcss/lib/processor' +import { Plugin, ProcessOptions, Transformer } from 'postcss' +import { Options as ConfigOptions } from 'lilconfig' + +declare function postcssrc( + ctx?: postcssrc.ConfigContext, + path?: string, + options?: ConfigOptions +): Promise + +declare namespace postcssrc { + // In the ConfigContext, these three options can be instances of the + // appropriate class, or strings. If they are strings, postcss-load-config will + // require() them and pass the instances along. + export interface ProcessOptionsPreload { + parser?: string | ProcessOptions['parser'] + stringifier?: string | ProcessOptions['stringifier'] + syntax?: string | ProcessOptions['syntax'] + } + + // The remaining ProcessOptions, sans the three above. + export type RemainingProcessOptions = Pick< + ProcessOptions, + Exclude + > + + // Additional context options that postcss-load-config understands. + export interface Context { + cwd?: string + env?: string + } + + // The full shape of the ConfigContext. + export type ConfigContext = Context & + ProcessOptionsPreload & + RemainingProcessOptions + + // Result of postcssrc is a Promise containing the filename plus the options + // and plugins that are ready to pass on to postcss. + export type ResultPlugin = Plugin | Transformer | Processor + + export interface Result { + file: string + options: ProcessOptions + plugins: ResultPlugin[] + } + + export type ConfigPlugin = Transformer | Plugin | Processor + + export interface Config { + parser?: string | ProcessOptions['parser'] | false + stringifier?: string | ProcessOptions['stringifier'] | false + syntax?: string | ProcessOptions['syntax'] | false + map?: string | false + from?: string + to?: string + plugins?: Array | Record + } + + export type ConfigFn = (ctx: ConfigContext) => Config | Promise +} + +export = postcssrc diff --git a/sdk/typescript/node_modules/postcss-load-config/src/index.js b/sdk/typescript/node_modules/postcss-load-config/src/index.js new file mode 100644 index 0000000..909e395 --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/src/index.js @@ -0,0 +1,178 @@ +// @ts-check +const { resolve } = require('node:path') + +const config = require('lilconfig') + +const loadOptions = require('./options.js') +const loadPlugins = require('./plugins.js') +const req = require('./req.js') + +const interopRequireDefault = obj => + obj && obj.__esModule ? obj : { default: obj } + +/** + * Process the result from cosmiconfig + * + * @param {Object} ctx Config Context + * @param {Object} result Cosmiconfig result + * + * @return {Promise} PostCSS Config + */ +async function processResult(ctx, result) { + let file = result.filepath || '' + let projectConfig = interopRequireDefault(result.config).default || {} + + if (typeof projectConfig === 'function') { + projectConfig = projectConfig(ctx) + } else { + projectConfig = Object.assign({}, projectConfig, ctx) + } + + if (!projectConfig.plugins) { + projectConfig.plugins = [] + } + + let res = { + file, + options: await loadOptions(projectConfig, file), + plugins: await loadPlugins(projectConfig, file) + } + delete projectConfig.plugins + return res +} + +/** + * Builds the Config Context + * + * @param {Object} ctx Config Context + * + * @return {Object} Config Context + */ +function createContext(ctx) { + /** + * @type {Object} + * + * @prop {String} cwd=process.cwd() Config search start location + * @prop {String} env=process.env.NODE_ENV Config Enviroment, will be set to `development` by `postcss-load-config` if `process.env.NODE_ENV` is `undefined` + */ + ctx = Object.assign( + { + cwd: process.cwd(), + env: process.env.NODE_ENV + }, + ctx + ) + + if (!ctx.env) { + process.env.NODE_ENV = 'development' + } + + return ctx +} + +async function loader(filepath) { + return req(filepath) +} + +let yaml +async function yamlLoader(_, content) { + if (!yaml) { + try { + yaml = await import('yaml') + } catch (e) { + /* c8 ignore start */ + throw new Error( + `'yaml' is required for the YAML configuration files. Make sure it is installed\nError: ${e.message}` + ) + } + } + return yaml.parse(content); +} + +/** @return {import('lilconfig').Options} */ +const withLoaders = (options = {}) => { + let moduleName = 'postcss' + + return { + ...options, + loaders: { + ...options.loaders, + '.cjs': loader, + '.cts': loader, + '.js': loader, + '.mjs': loader, + '.mts': loader, + '.ts': loader, + '.yaml': yamlLoader, + '.yml': yamlLoader + }, + searchPlaces: [ + ...(options.searchPlaces || []), + 'package.json', + `.${moduleName}rc`, + `.${moduleName}rc.json`, + `.${moduleName}rc.yaml`, + `.${moduleName}rc.yml`, + `.${moduleName}rc.ts`, + `.${moduleName}rc.cts`, + `.${moduleName}rc.mts`, + `.${moduleName}rc.js`, + `.${moduleName}rc.cjs`, + `.${moduleName}rc.mjs`, + `${moduleName}.config.ts`, + `${moduleName}.config.cts`, + `${moduleName}.config.mts`, + `${moduleName}.config.js`, + `${moduleName}.config.cjs`, + `${moduleName}.config.mjs` + ] + } +} + +/** + * Load Config + * + * @method rc + * + * @param {Object} ctx Config Context + * @param {String} path Config Path + * @param {Object} options Config Options + * + * @return {Promise} config PostCSS Config + */ +function rc(ctx, path, options) { + /** + * @type {Object} The full Config Context + */ + ctx = createContext(ctx) + + /** + * @type {String} `process.cwd()` + */ + path = path ? resolve(path) : process.cwd() + + return config + .lilconfig('postcss', withLoaders(options)) + .search(path) + .then(result => { + if (!result) { + throw new Error(`No PostCSS Config found in: ${path}`) + } + return processResult(ctx, result) + }) +} + +/** + * Autoload Config for PostCSS + * + * @author Michael Ciniawsky @michael-ciniawsky + * @license MIT + * + * @module postcss-load-config + * @version 2.1.0 + * + * @requires comsiconfig + * @requires ./options + * @requires ./plugins + */ +module.exports = rc diff --git a/sdk/typescript/node_modules/postcss-load-config/src/options.js b/sdk/typescript/node_modules/postcss-load-config/src/options.js new file mode 100644 index 0000000..14b03ce --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/src/options.js @@ -0,0 +1,48 @@ +// @ts-check +const req = require('./req.js') + +/** + * Load Options + * + * @private + * @method options + * + * @param {Object} config PostCSS Config + * + * @return {Promise} options PostCSS Options + */ +async function options(config, file) { + if (config.parser && typeof config.parser === 'string') { + try { + config.parser = await req(config.parser, file) + } catch (err) { + throw new Error( + `Loading PostCSS Parser failed: ${err.message}\n\n(@${file})` + ) + } + } + + if (config.syntax && typeof config.syntax === 'string') { + try { + config.syntax = await req(config.syntax, file) + } catch (err) { + throw new Error( + `Loading PostCSS Syntax failed: ${err.message}\n\n(@${file})` + ) + } + } + + if (config.stringifier && typeof config.stringifier === 'string') { + try { + config.stringifier = await req(config.stringifier, file) + } catch (err) { + throw new Error( + `Loading PostCSS Stringifier failed: ${err.message}\n\n(@${file})` + ) + } + } + + return config +} + +module.exports = options diff --git a/sdk/typescript/node_modules/postcss-load-config/src/plugins.js b/sdk/typescript/node_modules/postcss-load-config/src/plugins.js new file mode 100644 index 0000000..817127f --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/src/plugins.js @@ -0,0 +1,89 @@ +// @ts-check +const req = require('./req.js') + +/** + * Plugin Loader + * + * @private + * @method load + * + * @param {String} plugin PostCSS Plugin Name + * @param {Object} options PostCSS Plugin Options + * + * @return {Promise} PostCSS Plugin + */ +async function load(plugin, options, file) { + try { + if ( + options === null || + options === undefined || + Object.keys(options).length === 0 + ) { + return await req(plugin, file) + } else { + return (await req(plugin, file))(options) + /* c8 ignore next */ + } + } catch (err) { + throw new Error( + `Loading PostCSS Plugin failed: ${err.message}\n\n(@${file})` + ) + } +} + +/** + * Load Plugins + * + * @private + * @method plugins + * + * @param {Object} config PostCSS Config Plugins + * + * @return {Promise} plugins PostCSS Plugins + */ +async function plugins(config, file) { + let list = [] + + if (Array.isArray(config.plugins)) { + list = config.plugins.filter(Boolean) + } else { + list = Object.entries(config.plugins) + .filter(([, options]) => { + return options !== false + }) + .map(([plugin, options]) => { + return load(plugin, options, file) + }) + list = await Promise.all(list) + } + + if (list.length && list.length > 0) { + list.forEach((plugin, i) => { + if (plugin.default) { + plugin = plugin.default + } + + if (plugin.postcss === true) { + plugin = plugin() + } else if (plugin.postcss) { + plugin = plugin.postcss + } + + if ( + !( + (typeof plugin === 'object' && Array.isArray(plugin.plugins)) || + (typeof plugin === 'object' && plugin.postcssPlugin) || + typeof plugin === 'function' + ) + ) { + throw new TypeError( + `Invalid PostCSS Plugin found at: plugins[${i}]\n\n(@${file})` + ) + } + }) + } + + return list +} + +module.exports = plugins diff --git a/sdk/typescript/node_modules/postcss-load-config/src/req.js b/sdk/typescript/node_modules/postcss-load-config/src/req.js new file mode 100644 index 0000000..bd7cb39 --- /dev/null +++ b/sdk/typescript/node_modules/postcss-load-config/src/req.js @@ -0,0 +1,62 @@ +// @ts-check +const { createRequire } = require('node:module') +const { pathToFileURL } = require('node:url') + +const TS_EXT_RE = /\.[mc]?ts$/ + +let tsx + +let jiti + +let importError = [] + +/** + * @param {string} name + * @param {string} rootFile + * @returns {Promise} + */ +async function req(name, rootFile = __filename) { + let url = createRequire(rootFile).resolve(name) + + try { + return (await import(`${pathToFileURL(url)}?t=${Date.now()}`)).default + } catch (err) { + if (!TS_EXT_RE.test(url)) { + /* c8 ignore start */ + throw err + } + } + + if (tsx === undefined) { + try { + tsx = await import('tsx/cjs/api') + } catch (error) { + importError.push(error) + } + } + + if (tsx) { + let loaded = tsx.require(name, rootFile) + return loaded && '__esModule' in loaded ? loaded.default : loaded + } + + if (jiti === undefined) { + try { + jiti = (await import('jiti')).default + } catch (error) { + importError.push(error) + } + } + + if (jiti) { + return jiti(rootFile, { interopDefault: true })(name) + } + + throw new Error( + `'tsx' or 'jiti' is required for the TypeScript configuration files. Make sure it is installed\nError: ${importError + .map(error => error.message) + .join('\n')}` + ) +} + +module.exports = req diff --git a/sdk/typescript/node_modules/postcss/LICENSE b/sdk/typescript/node_modules/postcss/LICENSE new file mode 100644 index 0000000..da057b4 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2013 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/postcss/README.md b/sdk/typescript/node_modules/postcss/README.md new file mode 100644 index 0000000..05fed07 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/README.md @@ -0,0 +1,29 @@ +# PostCSS + +Philosopher’s stone, logo of PostCSS + +PostCSS is a tool for transforming styles with JS plugins. +These plugins can lint your CSS, support variables and mixins, +transpile future CSS syntax, inline images, and more. + +PostCSS is used by industry leaders including Wikipedia, Twitter, Alibaba, +and JetBrains. The [Autoprefixer] and [Stylelint] PostCSS plugins are some of the most popular CSS tools. + +--- + +  Built by + Evil Martians, go-to agency for developer tools. + +--- + +[Abstract Syntax Tree]: https://en.wikipedia.org/wiki/Abstract_syntax_tree +[Evil Martians]: https://evilmartians.com/?utm_source=postcss +[Autoprefixer]: https://github.com/postcss/autoprefixer +[Stylelint]: https://stylelint.io/ +[plugins]: https://github.com/postcss/postcss#plugins + + +## Docs +Read full docs **[here](https://postcss.org/)**. diff --git a/sdk/typescript/node_modules/postcss/node_modules/.bin/nanoid b/sdk/typescript/node_modules/postcss/node_modules/.bin/nanoid new file mode 120000 index 0000000..e2be547 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/.bin/nanoid @@ -0,0 +1 @@ +../nanoid/bin/nanoid.cjs \ No newline at end of file diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/LICENSE b/sdk/typescript/node_modules/postcss/node_modules/nanoid/LICENSE new file mode 100644 index 0000000..37f56aa --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2017 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/README.md b/sdk/typescript/node_modules/postcss/node_modules/nanoid/README.md new file mode 100644 index 0000000..35abb57 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/README.md @@ -0,0 +1,39 @@ +# Nano ID + +Nano ID logo by Anton Lovchikov + +**English** | [Русский](./README.ru.md) | [简体中文](./README.zh-CN.md) | [Bahasa Indonesia](./README.id-ID.md) + +A tiny, secure, URL-friendly, unique string ID generator for JavaScript. + +> “An amazing level of senseless perfectionism, +> which is simply impossible not to respect.” + +* **Small.** 130 bytes (minified and gzipped). No dependencies. + [Size Limit] controls the size. +* **Fast.** It is 2 times faster than UUID. +* **Safe.** It uses hardware random generator. Can be used in clusters. +* **Short IDs.** It uses a larger alphabet than UUID (`A-Za-z0-9_-`). + So ID size was reduced from 36 to 21 symbols. +* **Portable.** Nano ID was ported + to [20 programming languages](#other-programming-languages). + +```js +import { nanoid } from 'nanoid' +model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT" +``` + +Supports modern browsers, IE [with Babel], Node.js and React Native. + +[online tool]: https://gitpod.io/#https://github.com/ai/nanoid/ +[with Babel]: https://developer.epages.com/blog/coding/how-to-transpile-node-modules-with-babel-and-webpack-in-a-monorepo/ +[Size Limit]: https://github.com/ai/size-limit + + + Sponsored by Evil Martians + + +## Docs +Read full docs **[here](https://github.com/ai/nanoid#readme)**. diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.browser.cjs b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.browser.cjs new file mode 100644 index 0000000..80d1871 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.browser.cjs @@ -0,0 +1,69 @@ +let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes)) + +let customAlphabet = (alphabet, defaultSize = 21) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + // `Math.clz32` is not used, because it is not available in browsers. + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + + // `-~f => Math.ceil(f)` if f is a float + // `-~i => i + 1` if i is an integer + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + + return async (size = defaultSize) => { + let id = '' + while (true) { + let bytes = crypto.getRandomValues(new Uint8Array(step)) + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = step | 0 + while (i--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} + +let nanoid = async (size = 21) => { + let id = '' + let bytes = crypto.getRandomValues(new Uint8Array((size |= 0))) + + // A compact alternative for `for (var i = 0; i < step; i++)`. + while (size--) { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + let byte = bytes[size] & 63 + if (byte < 36) { + // `0-9a-z` + id += byte.toString(36) + } else if (byte < 62) { + // `A-Z` + id += (byte - 26).toString(36).toUpperCase() + } else if (byte < 63) { + id += '_' + } else { + id += '-' + } + } + return id +} + +module.exports = { nanoid, customAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.browser.js b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.browser.js new file mode 100644 index 0000000..fbaa230 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.browser.js @@ -0,0 +1,34 @@ +let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes)) +let customAlphabet = (alphabet, defaultSize = 21) => { + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + return async (size = defaultSize) => { + let id = '' + while (true) { + let bytes = crypto.getRandomValues(new Uint8Array(step)) + let i = step | 0 + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} +let nanoid = async (size = 21) => { + let id = '' + let bytes = crypto.getRandomValues(new Uint8Array((size |= 0))) + while (size--) { + let byte = bytes[size] & 63 + if (byte < 36) { + id += byte.toString(36) + } else if (byte < 62) { + id += (byte - 26).toString(36).toUpperCase() + } else if (byte < 63) { + id += '_' + } else { + id += '-' + } + } + return id +} +export { nanoid, customAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.cjs b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.cjs new file mode 100644 index 0000000..f1b0ad0 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.cjs @@ -0,0 +1,71 @@ +let crypto = require('crypto') + +let { urlAlphabet } = require('../url-alphabet/index.cjs') + +// `crypto.randomFill()` is a little faster than `crypto.randomBytes()`, +// because it is possible to use in combination with `Buffer.allocUnsafe()`. +let random = bytes => + new Promise((resolve, reject) => { + // `Buffer.allocUnsafe()` is faster because it doesn’t flush the memory. + // Memory flushing is unnecessary since the buffer allocation itself resets + // the memory with the new bytes. + crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => { + if (err) { + reject(err) + } else { + resolve(buf) + } + }) + }) + +let customAlphabet = (alphabet, defaultSize = 21) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + + let tick = (id, size = defaultSize) => + random(step).then(bytes => { + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = step + while (i--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[i] & mask] || '' + if (id.length >= size) return id + } + return tick(id, size) + }) + + return size => tick('', size) +} + +let nanoid = (size = 21) => + random((size |= 0)).then(bytes => { + let id = '' + // A compact alternative for `for (var i = 0; i < step; i++)`. + while (size--) { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + id += urlAlphabet[bytes[size] & 63] + } + return id + }) + +module.exports = { nanoid, customAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.d.ts b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.d.ts new file mode 100644 index 0000000..9e91965 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.d.ts @@ -0,0 +1,56 @@ +/** + * Generate secure URL-friendly unique ID. The non-blocking version. + * + * By default, the ID will have 21 symbols to have a collision probability + * similar to UUID v4. + * + * ```js + * import { nanoid } from 'nanoid/async' + * nanoid().then(id => { + * model.id = id + * }) + * ``` + * + * @param size Size of the ID. The default size is 21. + * @returns A promise with a random string. + */ +export function nanoid(size?: number): Promise + +/** + * A low-level function. + * Generate secure unique ID with custom alphabet. The non-blocking version. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * @param alphabet Alphabet used to generate the ID. + * @param defaultSize Size of the ID. The default size is 21. + * @returns A function that returns a promise with a random string. + * + * ```js + * import { customAlphabet } from 'nanoid/async' + * const nanoid = customAlphabet('0123456789абвгдеё', 5) + * nanoid().then(id => { + * model.id = id //=> "8ё56а" + * }) + * ``` + */ +export function customAlphabet( + alphabet: string, + defaultSize?: number +): (size?: number) => Promise + +/** + * Generate an array of random bytes collected from hardware noise. + * + * ```js + * import { random } from 'nanoid/async' + * random(5).then(bytes => { + * bytes //=> [10, 67, 212, 67, 89] + * }) + * ``` + * + * @param bytes Size of the array. + * @returns A promise with a random bytes array. + */ +export function random(bytes: number): Promise diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.js b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.js new file mode 100644 index 0000000..cec454a --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.js @@ -0,0 +1,35 @@ +import crypto from 'crypto' +import { urlAlphabet } from '../url-alphabet/index.js' +let random = bytes => + new Promise((resolve, reject) => { + crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => { + if (err) { + reject(err) + } else { + resolve(buf) + } + }) + }) +let customAlphabet = (alphabet, defaultSize = 21) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + let tick = (id, size = defaultSize) => + random(step).then(bytes => { + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length >= size) return id + } + return tick(id, size) + }) + return size => tick('', size) +} +let nanoid = (size = 21) => + random((size |= 0)).then(bytes => { + let id = '' + while (size--) { + id += urlAlphabet[bytes[size] & 63] + } + return id + }) +export { nanoid, customAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.native.js b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.native.js new file mode 100644 index 0000000..7c1d6f3 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/index.native.js @@ -0,0 +1,26 @@ +import { getRandomBytesAsync } from 'expo-random' +import { urlAlphabet } from '../url-alphabet/index.js' +let random = getRandomBytesAsync +let customAlphabet = (alphabet, defaultSize = 21) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + let tick = (id, size = defaultSize) => + random(step).then(bytes => { + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length >= size) return id + } + return tick(id, size) + }) + return size => tick('', size) +} +let nanoid = (size = 21) => + random((size |= 0)).then(bytes => { + let id = '' + while (size--) { + id += urlAlphabet[bytes[size] & 63] + } + return id + }) +export { nanoid, customAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/package.json b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/package.json new file mode 100644 index 0000000..578cdb4 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/async/package.json @@ -0,0 +1,12 @@ +{ + "type": "module", + "main": "index.cjs", + "module": "index.js", + "react-native": { + "./index.js": "./index.native.js" + }, + "browser": { + "./index.js": "./index.browser.js", + "./index.cjs": "./index.browser.cjs" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/bin/nanoid.cjs b/sdk/typescript/node_modules/postcss/node_modules/nanoid/bin/nanoid.cjs new file mode 100644 index 0000000..c76db0f --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/bin/nanoid.cjs @@ -0,0 +1,55 @@ +#!/usr/bin/env node + +let { nanoid, customAlphabet } = require('..') + +function print(msg) { + process.stdout.write(msg + '\n') +} + +function error(msg) { + process.stderr.write(msg + '\n') + process.exit(1) +} + +if (process.argv.includes('--help') || process.argv.includes('-h')) { + print(` + Usage + $ nanoid [options] + + Options + -s, --size Generated ID size + -a, --alphabet Alphabet to use + -h, --help Show this help + + Examples + $ nanoid --s 15 + S9sBF77U6sDB8Yg + + $ nanoid --size 10 --alphabet abc + bcabababca`) + process.exit() +} + +let alphabet, size +for (let i = 2; i < process.argv.length; i++) { + let arg = process.argv[i] + if (arg === '--size' || arg === '-s') { + size = Number(process.argv[i + 1]) + i += 1 + if (Number.isNaN(size) || size <= 0) { + error('Size must be positive integer') + } + } else if (arg === '--alphabet' || arg === '-a') { + alphabet = process.argv[i + 1] + i += 1 + } else { + error('Unknown argument ' + arg) + } +} + +if (alphabet) { + let customNanoid = customAlphabet(alphabet, size) + print(customNanoid()) +} else { + print(nanoid(size)) +} diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.browser.cjs b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.browser.cjs new file mode 100644 index 0000000..d21a91f --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.browser.cjs @@ -0,0 +1,72 @@ +// This file replaces `index.js` in bundlers like webpack or Rollup, +// according to `browser` config in `package.json`. + +let { urlAlphabet } = require('./url-alphabet/index.cjs') + +let random = bytes => crypto.getRandomValues(new Uint8Array(bytes)) + +let customRandom = (alphabet, defaultSize, getRandom) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + // `Math.clz32` is not used, because it is not available in browsers. + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + + // `-~f => Math.ceil(f)` if f is a float + // `-~i => i + 1` if i is an integer + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + // A compact alternative for `for (var i = 0; i < step; i++)`. + let j = step | 0 + while (j--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[j] & mask] || '' + if (id.length === size) return id + } + } + } +} + +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) + +let nanoid = (size = 21) => + crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + byte &= 63 + if (byte < 36) { + // `0-9a-z` + id += byte.toString(36) + } else if (byte < 62) { + // `A-Z` + id += (byte - 26).toString(36).toUpperCase() + } else if (byte > 62) { + id += '-' + } else { + id += '_' + } + return id + }, '') + +module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.browser.js b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.browser.js new file mode 100644 index 0000000..7d3b876 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.browser.js @@ -0,0 +1,34 @@ +import { urlAlphabet } from './url-alphabet/index.js' +let random = bytes => crypto.getRandomValues(new Uint8Array(bytes)) +let customRandom = (alphabet, defaultSize, getRandom) => { + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + let j = step | 0 + while (j--) { + id += alphabet[bytes[j] & mask] || '' + if (id.length === size) return id + } + } + } +} +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) +let nanoid = (size = 21) => + crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => { + byte &= 63 + if (byte < 36) { + id += byte.toString(36) + } else if (byte < 62) { + id += (byte - 26).toString(36).toUpperCase() + } else if (byte > 62) { + id += '-' + } else { + id += '_' + } + return id + }, '') +export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.cjs b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.cjs new file mode 100644 index 0000000..c20e374 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.cjs @@ -0,0 +1,85 @@ +let crypto = require('crypto') + +let { urlAlphabet } = require('./url-alphabet/index.cjs') + +// It is best to make fewer, larger requests to the crypto module to +// avoid system call overhead. So, random numbers are generated in a +// pool. The pool is a Buffer that is larger than the initial random +// request size by this multiplier. The pool is enlarged if subsequent +// requests exceed the maximum buffer size. +const POOL_SIZE_MULTIPLIER = 128 +let pool, poolOffset + +let fillPool = bytes => { + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) + crypto.randomFillSync(pool) + poolOffset = 0 + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool) + poolOffset = 0 + } + poolOffset += bytes +} + +let random = bytes => { + // `|=` convert `bytes` to number to prevent `valueOf` abusing and pool pollution + fillPool((bytes |= 0)) + return pool.subarray(poolOffset - bytes, poolOffset) +} + +let customRandom = (alphabet, defaultSize, getRandom) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + // A compact alternative for `for (let i = 0; i < step; i++)`. + let i = step + while (i--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} + +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) + +let nanoid = (size = 21) => { + // `|=` convert `size` to number to prevent `valueOf` abusing and pool pollution + fillPool((size |= 0)) + let id = '' + // We are reading directly from the random pool to avoid creating new array + for (let i = poolOffset - size; i < poolOffset; i++) { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + id += urlAlphabet[pool[i] & 63] + } + return id +} + +module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.d.cts b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.d.cts new file mode 100644 index 0000000..3e111a3 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.d.cts @@ -0,0 +1,91 @@ +/** + * Generate secure URL-friendly unique ID. + * + * By default, the ID will have 21 symbols to have a collision probability + * similar to UUID v4. + * + * ```js + * import { nanoid } from 'nanoid' + * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL" + * ``` + * + * @param size Size of the ID. The default size is 21. + * @returns A random string. + */ +export function nanoid(size?: number): string + +/** + * Generate secure unique ID with custom alphabet. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * @param alphabet Alphabet used to generate the ID. + * @param defaultSize Size of the ID. The default size is 21. + * @returns A random string generator. + * + * ```js + * const { customAlphabet } = require('nanoid') + * const nanoid = customAlphabet('0123456789абвгдеё', 5) + * nanoid() //=> "8ё56а" + * ``` + */ +export function customAlphabet( + alphabet: string, + defaultSize?: number +): (size?: number) => string + +/** + * Generate unique ID with custom random generator and alphabet. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * ```js + * import { customRandom } from 'nanoid/format' + * + * const nanoid = customRandom('abcdef', 5, size => { + * const random = [] + * for (let i = 0; i < size; i++) { + * random.push(randomByte()) + * } + * return random + * }) + * + * nanoid() //=> "fbaef" + * ``` + * + * @param alphabet Alphabet used to generate a random string. + * @param size Size of the random string. + * @param random A random bytes generator. + * @returns A random string generator. + */ +export function customRandom( + alphabet: string, + size: number, + random: (bytes: number) => Uint8Array +): () => string + +/** + * URL safe symbols. + * + * ```js + * import { urlAlphabet } from 'nanoid' + * const nanoid = customAlphabet(urlAlphabet, 10) + * nanoid() //=> "Uakgb_J5m9" + * ``` + */ +export const urlAlphabet: string + +/** + * Generate an array of random bytes collected from hardware noise. + * + * ```js + * import { customRandom, random } from 'nanoid' + * const nanoid = customRandom("abcdef", 5, random) + * ``` + * + * @param bytes Size of the array. + * @returns An array of random bytes. + */ +export function random(bytes: number): Uint8Array diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.d.ts b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.d.ts new file mode 100644 index 0000000..3e111a3 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.d.ts @@ -0,0 +1,91 @@ +/** + * Generate secure URL-friendly unique ID. + * + * By default, the ID will have 21 symbols to have a collision probability + * similar to UUID v4. + * + * ```js + * import { nanoid } from 'nanoid' + * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL" + * ``` + * + * @param size Size of the ID. The default size is 21. + * @returns A random string. + */ +export function nanoid(size?: number): string + +/** + * Generate secure unique ID with custom alphabet. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * @param alphabet Alphabet used to generate the ID. + * @param defaultSize Size of the ID. The default size is 21. + * @returns A random string generator. + * + * ```js + * const { customAlphabet } = require('nanoid') + * const nanoid = customAlphabet('0123456789абвгдеё', 5) + * nanoid() //=> "8ё56а" + * ``` + */ +export function customAlphabet( + alphabet: string, + defaultSize?: number +): (size?: number) => string + +/** + * Generate unique ID with custom random generator and alphabet. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * ```js + * import { customRandom } from 'nanoid/format' + * + * const nanoid = customRandom('abcdef', 5, size => { + * const random = [] + * for (let i = 0; i < size; i++) { + * random.push(randomByte()) + * } + * return random + * }) + * + * nanoid() //=> "fbaef" + * ``` + * + * @param alphabet Alphabet used to generate a random string. + * @param size Size of the random string. + * @param random A random bytes generator. + * @returns A random string generator. + */ +export function customRandom( + alphabet: string, + size: number, + random: (bytes: number) => Uint8Array +): () => string + +/** + * URL safe symbols. + * + * ```js + * import { urlAlphabet } from 'nanoid' + * const nanoid = customAlphabet(urlAlphabet, 10) + * nanoid() //=> "Uakgb_J5m9" + * ``` + */ +export const urlAlphabet: string + +/** + * Generate an array of random bytes collected from hardware noise. + * + * ```js + * import { customRandom, random } from 'nanoid' + * const nanoid = customRandom("abcdef", 5, random) + * ``` + * + * @param bytes Size of the array. + * @returns An array of random bytes. + */ +export function random(bytes: number): Uint8Array diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.js b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.js new file mode 100644 index 0000000..9bc909d --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/index.js @@ -0,0 +1,45 @@ +import crypto from 'crypto' +import { urlAlphabet } from './url-alphabet/index.js' +const POOL_SIZE_MULTIPLIER = 128 +let pool, poolOffset +let fillPool = bytes => { + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) + crypto.randomFillSync(pool) + poolOffset = 0 + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool) + poolOffset = 0 + } + poolOffset += bytes +} +let random = bytes => { + fillPool((bytes |= 0)) + return pool.subarray(poolOffset - bytes, poolOffset) +} +let customRandom = (alphabet, defaultSize, getRandom) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) +let nanoid = (size = 21) => { + fillPool((size |= 0)) + let id = '' + for (let i = poolOffset - size; i < poolOffset; i++) { + id += urlAlphabet[pool[i] & 63] + } + return id +} +export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/nanoid.js b/sdk/typescript/node_modules/postcss/node_modules/nanoid/nanoid.js new file mode 100644 index 0000000..ec242ea --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/nanoid.js @@ -0,0 +1 @@ +export let nanoid=(t=21)=>crypto.getRandomValues(new Uint8Array(t)).reduce(((t,e)=>t+=(e&=63)<36?e.toString(36):e<62?(e-26).toString(36).toUpperCase():e<63?"_":"-"),""); \ No newline at end of file diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.cjs b/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.cjs new file mode 100644 index 0000000..d51fcb6 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.cjs @@ -0,0 +1,34 @@ +// This alphabet uses `A-Za-z0-9_-` symbols. +// The order of characters is optimized for better gzip and brotli compression. +// References to the same file (works both for gzip and brotli): +// `'use`, `andom`, and `rict'` +// References to the brotli default dictionary: +// `-26T`, `1983`, `40px`, `75px`, `bush`, `jack`, `mind`, `very`, and `wolf` +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' + +let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = '' + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = size | 0 + while (i--) { + // `| 0` is more compact and faster than `Math.floor()`. + id += alphabet[(Math.random() * alphabet.length) | 0] + } + return id + } +} + +let nanoid = (size = 21) => { + let id = '' + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = size | 0 + while (i--) { + // `| 0` is more compact and faster than `Math.floor()`. + id += urlAlphabet[(Math.random() * 64) | 0] + } + return id +} + +module.exports = { nanoid, customAlphabet } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.d.ts b/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.d.ts new file mode 100644 index 0000000..4965322 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.d.ts @@ -0,0 +1,33 @@ +/** + * Generate URL-friendly unique ID. This method uses the non-secure + * predictable random generator with bigger collision probability. + * + * ```js + * import { nanoid } from 'nanoid/non-secure' + * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL" + * ``` + * + * @param size Size of the ID. The default size is 21. + * @returns A random string. + */ +export function nanoid(size?: number): string + +/** + * Generate a unique ID based on a custom alphabet. + * This method uses the non-secure predictable random generator + * with bigger collision probability. + * + * @param alphabet Alphabet used to generate the ID. + * @param defaultSize Size of the ID. The default size is 21. + * @returns A random string generator. + * + * ```js + * import { customAlphabet } from 'nanoid/non-secure' + * const nanoid = customAlphabet('0123456789абвгдеё', 5) + * model.id = //=> "8ё56а" + * ``` + */ +export function customAlphabet( + alphabet: string, + defaultSize?: number +): (size?: number) => string diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.js b/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.js new file mode 100644 index 0000000..2ea5827 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/index.js @@ -0,0 +1,21 @@ +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' +let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = '' + let i = size | 0 + while (i--) { + id += alphabet[(Math.random() * alphabet.length) | 0] + } + return id + } +} +let nanoid = (size = 21) => { + let id = '' + let i = size | 0 + while (i--) { + id += urlAlphabet[(Math.random() * 64) | 0] + } + return id +} +export { nanoid, customAlphabet } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/package.json b/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/package.json new file mode 100644 index 0000000..9930d6a --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/non-secure/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "main": "index.cjs", + "module": "index.js", + "react-native": "index.js" +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/package.json b/sdk/typescript/node_modules/postcss/node_modules/nanoid/package.json new file mode 100644 index 0000000..a3d3f44 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/package.json @@ -0,0 +1,89 @@ +{ + "name": "nanoid", + "version": "3.3.11", + "description": "A tiny (116 bytes), secure URL-friendly unique string ID generator", + "keywords": [ + "uuid", + "random", + "id", + "url" + ], + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "author": "Andrey Sitnik ", + "license": "MIT", + "repository": "ai/nanoid", + "browser": { + "./index.js": "./index.browser.js", + "./async/index.js": "./async/index.browser.js", + "./async/index.cjs": "./async/index.browser.cjs", + "./index.cjs": "./index.browser.cjs" + }, + "react-native": "index.js", + "bin": "./bin/nanoid.cjs", + "sideEffects": false, + "types": "./index.d.ts", + "type": "module", + "main": "index.cjs", + "module": "index.js", + "exports": { + ".": { + "react-native": "./index.browser.js", + "browser": "./index.browser.js", + "require": { + "types": "./index.d.cts", + "default": "./index.cjs" + }, + "import": { + "types": "./index.d.ts", + "default": "./index.js" + }, + "default": "./index.js" + }, + "./package.json": "./package.json", + "./async/package.json": "./async/package.json", + "./async": { + "browser": "./async/index.browser.js", + "require": { + "types": "./index.d.cts", + "default": "./async/index.cjs" + }, + "import": { + "types": "./index.d.ts", + "default": "./async/index.js" + }, + "default": "./async/index.js" + }, + "./non-secure/package.json": "./non-secure/package.json", + "./non-secure": { + "require": { + "types": "./index.d.cts", + "default": "./non-secure/index.cjs" + }, + "import": { + "types": "./index.d.ts", + "default": "./non-secure/index.js" + }, + "default": "./non-secure/index.js" + }, + "./url-alphabet/package.json": "./url-alphabet/package.json", + "./url-alphabet": { + "require": { + "types": "./index.d.cts", + "default": "./url-alphabet/index.cjs" + }, + "import": { + "types": "./index.d.ts", + "default": "./url-alphabet/index.js" + }, + "default": "./url-alphabet/index.js" + } + } +} diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/index.cjs b/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/index.cjs new file mode 100644 index 0000000..a332f0b --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/index.cjs @@ -0,0 +1,7 @@ +// This alphabet uses `A-Za-z0-9_-` symbols. +// The order of characters is optimized for better gzip and brotli compression. +// Same as in non-secure/index.js +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' + +module.exports = { urlAlphabet } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/index.js b/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/index.js new file mode 100644 index 0000000..c2782e5 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/index.js @@ -0,0 +1,3 @@ +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' +export { urlAlphabet } diff --git a/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/package.json b/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/package.json new file mode 100644 index 0000000..9930d6a --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/nanoid/url-alphabet/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "main": "index.cjs", + "module": "index.js", + "react-native": "index.js" +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/postcss/node_modules/source-map-js/LICENSE b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/LICENSE new file mode 100644 index 0000000..ed1b7cf --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/LICENSE @@ -0,0 +1,28 @@ + +Copyright (c) 2009-2011, Mozilla Foundation and contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the names of the Mozilla Foundation nor the names of project + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/sdk/typescript/node_modules/postcss/node_modules/source-map-js/README.md b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/README.md new file mode 100644 index 0000000..614962d --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/README.md @@ -0,0 +1,765 @@ +# Source Map JS + +[![NPM](https://nodei.co/npm/source-map-js.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map-js) + +Difference between original [source-map](https://github.com/mozilla/source-map): + +> TL,DR: it's fork of original source-map@0.6, but with perfomance optimizations. + +This journey starts from [source-map@0.7.0](https://github.com/mozilla/source-map/blob/master/CHANGELOG.md#070). Some part of it was rewritten to Rust and WASM and API became async. + +It's still a major block for many libraries like PostCSS or Sass for example because they need to migrate the whole API to the async way. This is the reason why 0.6.1 has 2x more downloads than 0.7.3 while it's faster several times. + +![Downloads count](media/downloads.png) + +More important that WASM version has some optimizations in JS code too. This is why [community asked to create branch for 0.6 version](https://github.com/mozilla/source-map/issues/324) and port these optimizations but, sadly, the answer was «no». A bit later I discovered [the issue](https://github.com/mozilla/source-map/issues/370) created by [Ben Rothman (@benthemonkey)](https://github.com/benthemonkey) with no response at all. + +[Roman Dvornov (@lahmatiy)](https://github.com/lahmatiy) wrote a [serveral posts](https://t.me/gorshochekvarit/76) (russian, only, sorry) about source-map library in his own Telegram channel. He mentioned the article [«Maybe you don't need Rust and WASM to speed up your JS»](https://mrale.ph/blog/2018/02/03/maybe-you-dont-need-rust-to-speed-up-your-js.html) written by [Vyacheslav Egorov (@mraleph)](https://github.com/mraleph). This article contains optimizations and hacks that lead to almost the same performance compare to WASM implementation. + +I decided to fork the original source-map and port these optimizations from the article and several others PR from the original source-map. + +--------- + +This is a library to generate and consume the source map format +[described here][format]. + +[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit + +## Use with Node + + $ npm install source-map-js + + + +-------------------------------------------------------------------------------- + + + + + +## Table of Contents + +- [Examples](#examples) + - [Consuming a source map](#consuming-a-source-map) + - [Generating a source map](#generating-a-source-map) + - [With SourceNode (high level API)](#with-sourcenode-high-level-api) + - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api) +- [API](#api) + - [SourceMapConsumer](#sourcemapconsumer) + - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap) + - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans) + - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition) + - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition) + - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition) + - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources) + - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing) + - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order) + - [SourceMapGenerator](#sourcemapgenerator) + - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap) + - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer) + - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping) + - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath) + - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring) + - [SourceNode](#sourcenode) + - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name) + - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath) + - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk) + - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk) + - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn) + - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn) + - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep) + - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement) + - [SourceNode.prototype.toString()](#sourcenodeprototypetostring) + - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap) + + + +## Examples + +### Consuming a source map + +```js +var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' +}; + +var smc = new SourceMapConsumer(rawSourceMap); + +console.log(smc.sources); +// [ 'http://example.com/www/js/one.js', +// 'http://example.com/www/js/two.js' ] + +console.log(smc.originalPositionFor({ + line: 2, + column: 28 +})); +// { source: 'http://example.com/www/js/two.js', +// line: 2, +// column: 10, +// name: 'n' } + +console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 +})); +// { line: 2, column: 28 } + +smc.eachMapping(function (m) { + // ... +}); +``` + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + +```js +function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } +} + +var ast = parse("40 + 2", "add.js"); +console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' +})); +// { code: '40 + 2', +// map: [object SourceMapGenerator] } +``` + +#### With SourceMapGenerator (low level API) + +```js +var map = new SourceMapGenerator({ + file: "source-mapped.js" +}); + +map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" +}); + +console.log(map.toString()); +// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' +``` + +## API + +Get a reference to the module: + +```js +// Node.js +var sourceMap = require('source-map'); + +// Browser builds +var sourceMap = window.sourceMap; + +// Inside Firefox +const sourceMap = require("devtools/toolkit/sourcemap/source-map.js"); +``` + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: Optional. The generated filename this source map is associated with. + +```js +var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData); +``` + +#### SourceMapConsumer.prototype.computeColumnSpans() + +Compute the last column for each generated mapping. The last column is +inclusive. + +```js +// Before: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] + +consumer.computeColumnSpans(); + +// After: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1, +// lastColumn: 9 }, +// { line: 2, +// column: 10, +// lastColumn: 19 }, +// { line: 2, +// column: 20, +// lastColumn: Infinity } ] + +``` + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. Line numbers in + this library are 1-based (note that the underlying source map + specification uses 0-based line numbers -- this library handles the + translation). + +* `column`: The column number in the generated source. Column numbers + in this library are 0-based. + +* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or + `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest + element that is smaller than or greater than the one we are searching for, + respectively, if the exact element cannot be found. Defaults to + `SourceMapConsumer.GREATEST_LOWER_BOUND`. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. The line number is 1-based. + +* `column`: The column number in the original source, or null if this + information is not available. The column number is 0-based. + +* `name`: The original identifier, or null if this information is not available. + +```js +consumer.originalPositionFor({ line: 2, column: 10 }) +// { source: 'foo.coffee', +// line: 2, +// column: 2, +// name: null } + +consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 }) +// { source: null, +// line: null, +// column: null, +// name: null } +``` + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. The line number is + 1-based. + +* `column`: The column number in the original source. The column + number is 0-based. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. The line + number is 1-based. + +* `column`: The column number in the generated source, or null. The + column number is 0-based. + +```js +consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 }) +// { line: 1, +// column: 56 } +``` + +#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) + +Returns all generated line and column information for the original source, line, +and column provided. If no column is provided, returns all mappings +corresponding to a either the line we are searching for or the next closest line +that has any mappings. Otherwise, returns all mappings corresponding to the +given line and either the column we are searching for or the next closest column +that has any offsets. + +The only argument is an object with the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. The line number is + 1-based. + +* `column`: Optional. The column number in the original source. The + column number is 0-based. + +and an array of objects is returned, each with the following properties: + +* `line`: The line number in the generated source, or null. The line + number is 1-based. + +* `column`: The column number in the generated source, or null. The + column number is 0-based. + +```js +consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] +``` + +#### SourceMapConsumer.prototype.hasContentsOfAllSources() + +Return true if we have the embedded source content for every source listed in +the source map, false otherwise. + +In other words, if this method returns `true`, then +`consumer.sourceContentFor(s)` will succeed for every source `s` in +`consumer.sources`. + +```js +// ... +if (consumer.hasContentsOfAllSources()) { + consumerReadyCallback(consumer); +} else { + fetchSources(consumer, consumerReadyCallback); +} +// ... +``` + +#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +If the source content for the given source is not found, then an error is +thrown. Optionally, pass `true` as the second param to have `null` returned +instead. + +```js +consumer.sources +// [ "my-cool-lib.clj" ] + +consumer.sourceContentFor("my-cool-lib.clj") +// "..." + +consumer.sourceContentFor("this is not in the source map"); +// Error: "this is not in the source map" is not in the source map + +consumer.sourceContentFor("this is not in the source map", true); +// null +``` + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +```js +consumer.eachMapping(function (m) { console.log(m); }) +// ... +// { source: 'illmatic.js', +// generatedLine: 1, +// generatedColumn: 0, +// originalLine: 1, +// originalColumn: 0, +// name: null } +// { source: 'illmatic.js', +// generatedLine: 2, +// generatedColumn: 0, +// originalLine: 2, +// originalColumn: 0, +// name: null } +// ... +``` +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator([startOfSourceMap]) + +You may pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: A root for all relative URLs in this source map. + +* `skipValidation`: Optional. When `true`, disables validation of mappings as + they are added. This can improve performance but should be used with + discretion, as a last resort. Even then, one should avoid using this flag when + running tests, if possible. + +* `ignoreInvalidMapping`: Optional. When `true`, instead of throwing error on + invalid mapping, it will be ignored. + +```js +var generator = new sourceMap.SourceMapGenerator({ + file: "my-generated-javascript-file.js", + sourceRoot: "http://example.com/app/js/" +}); +``` + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer, sourceMapGeneratorOptions) + +Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance. + +* `sourceMapConsumer` The SourceMap. + +* `sourceMapGeneratorOptions` options that will be passed to the SourceMapGenerator constructor which used under the hood. + +```js +var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer, { + ignoreInvalidMapping: true, +}); +``` + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +```js +generator.addMapping({ + source: "module-one.scm", + original: { line: 128, column: 0 }, + generated: { line: 3, column: 456 } +}) +``` + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +```js +generator.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimum of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used, if it exists. + Otherwise an error will be thrown. + +* `sourceMapPath`: Optional. The dirname of the path to the SourceMap + to be applied. If relative, it is relative to the SourceMap. + + This parameter is needed when the two SourceMaps aren't in the same + directory, and the SourceMap to be applied contains relative source + paths. If so, those relative source paths need to be rewritten + relative to the SourceMap. + + If omitted, it is assumed that both SourceMaps are in the same directory, + thus not needing any rewriting. (Supplying `'.'` has the same effect.) + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +```js +generator.toString() +// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}' +``` + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode([line, column, source[, chunk[, name]]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. The line number is 1-based. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. The column number + is 0-based. + +* `source`: The original source's filename; null if no filename is provided. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +```js +var node = new SourceNode(1, 2, "a.cpp", [ + new SourceNode(3, 4, "b.cpp", "extern int status;\n"), + new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"), + new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"), +]); +``` + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +* `relativePath` The optional path that relative sources in `sourceMapConsumer` + should be relative to. + +```js +var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8")); +var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"), + consumer); +``` + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.add(" + "); +node.add(otherNode); +node.add([leftHandOperandNode, " + ", rightHandOperandNode]); +``` + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.prepend("/** Build Id: f783haef86324gf **/\n\n"); +``` + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +```js +node.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.walk(function (code, loc) { console.log("WALK:", code, loc); }) +// WALK: uno { source: 'b.js', line: 3, column: 4, name: null } +// WALK: dos { source: 'a.js', line: 1, column: 2, name: null } +// WALK: tres { source: 'a.js', line: 1, column: 2, name: null } +// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null } +``` + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +```js +var a = new SourceNode(1, 2, "a.js", "generated from a"); +a.setSourceContent("a.js", "original a"); +var b = new SourceNode(1, 2, "b.js", "generated from b"); +b.setSourceContent("b.js", "original b"); +var c = new SourceNode(1, 2, "c.js", "generated from c"); +c.setSourceContent("c.js", "original c"); + +var node = new SourceNode(null, null, null, [a, b, c]); +node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); }) +// WALK: a.js : original a +// WALK: b.js : original b +// WALK: c.js : original c +``` + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +```js +var lhs = new SourceNode(1, 2, "a.rs", "my_copy"); +var operand = new SourceNode(3, 4, "a.rs", "="); +var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()"); + +var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]); +var joinedNode = node.join(" "); +``` + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming white space from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +```js +// Trim trailing white space. +node.replaceRight(/\s*$/, ""); +``` + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toString() +// 'unodostresquatro' +``` + +#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toStringWithSourceMap({ file: "my-output-file.js" }) +// { code: 'unodostresquatro', +// map: [object SourceMapGenerator] } +``` diff --git a/sdk/typescript/node_modules/postcss/node_modules/source-map-js/package.json b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/package.json new file mode 100644 index 0000000..f58dbeb --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/package.json @@ -0,0 +1,71 @@ +{ + "name": "source-map-js", + "description": "Generates and consumes source maps", + "version": "1.2.1", + "homepage": "https://github.com/7rulnik/source-map-js", + "author": "Valentin 7rulnik Semirulnik ", + "contributors": [ + "Nick Fitzgerald ", + "Tobias Koppers ", + "Duncan Beevers ", + "Stephen Crane ", + "Ryan Seddon ", + "Miles Elam ", + "Mihai Bazon ", + "Michael Ficarra ", + "Todd Wolfson ", + "Alexander Solovyov ", + "Felix Gnass ", + "Conrad Irwin ", + "usrbincc ", + "David Glasser ", + "Chase Douglas ", + "Evan Wallace ", + "Heather Arthur ", + "Hugh Kennedy ", + "David Glasser ", + "Simon Lydell ", + "Jmeas Smith ", + "Michael Z Goddard ", + "azu ", + "John Gozde ", + "Adam Kirkton ", + "Chris Montgomery ", + "J. Ryan Stinnett ", + "Jack Herrington ", + "Chris Truter ", + "Daniel Espeset ", + "Jamie Wong ", + "Eddy Bruël ", + "Hawken Rives ", + "Gilad Peleg ", + "djchie ", + "Gary Ye ", + "Nicolas Lalevée " + ], + "repository": "7rulnik/source-map-js", + "main": "./source-map.js", + "files": [ + "source-map.js", + "source-map.d.ts", + "lib/" + ], + "engines": { + "node": ">=0.10.0" + }, + "license": "BSD-3-Clause", + "scripts": { + "test": "npm run build && node test/run-tests.js", + "build": "webpack --color", + "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md" + }, + "devDependencies": { + "clean-publish": "^3.1.0", + "doctoc": "^0.15.0", + "webpack": "^1.12.0" + }, + "clean-publish": { + "cleanDocs": true + }, + "typings": "source-map.d.ts" +} diff --git a/sdk/typescript/node_modules/postcss/node_modules/source-map-js/source-map.d.ts b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/source-map.d.ts new file mode 100644 index 0000000..ec8892f --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/source-map.d.ts @@ -0,0 +1,104 @@ +export interface StartOfSourceMap { + file?: string; + sourceRoot?: string; +} + +export interface RawSourceMap extends StartOfSourceMap { + version: string; + sources: string[]; + names: string[]; + sourcesContent?: string[]; + mappings: string; +} + +export interface Position { + line: number; + column: number; +} + +export interface LineRange extends Position { + lastColumn: number; +} + +export interface FindPosition extends Position { + // SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND + bias?: number; +} + +export interface SourceFindPosition extends FindPosition { + source: string; +} + +export interface MappedPosition extends Position { + source: string; + name?: string; +} + +export interface MappingItem { + source: string | null; + generatedLine: number; + generatedColumn: number; + originalLine: number | null; + originalColumn: number | null; + name: string | null; +} + +export class SourceMapConsumer { + static GENERATED_ORDER: number; + static ORIGINAL_ORDER: number; + + static GREATEST_LOWER_BOUND: number; + static LEAST_UPPER_BOUND: number; + + constructor(rawSourceMap: RawSourceMap); + readonly file: string | undefined | null; + readonly sourceRoot: string | undefined | null; + readonly sourcesContent: readonly string[] | null | undefined; + readonly sources: readonly string[] + + computeColumnSpans(): void; + originalPositionFor(generatedPosition: FindPosition): MappedPosition; + generatedPositionFor(originalPosition: SourceFindPosition): LineRange; + allGeneratedPositionsFor(originalPosition: MappedPosition): Position[]; + hasContentsOfAllSources(): boolean; + sourceContentFor(source: string, returnNullOnMissing?: boolean): string | null; + eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void; +} + +export interface Mapping { + generated: Position; + original?: Position | null; + source?: string | null; + name?: string | null; +} + +export class SourceMapGenerator { + constructor(startOfSourceMap?: StartOfSourceMap); + static fromSourceMap(sourceMapConsumer: SourceMapConsumer, startOfSourceMap?: StartOfSourceMap): SourceMapGenerator; + addMapping(mapping: Mapping): void; + setSourceContent(sourceFile: string, sourceContent: string | null | undefined): void; + applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void; + toString(): string; + toJSON(): RawSourceMap; +} + +export interface CodeWithSourceMap { + code: string; + map: SourceMapGenerator; +} + +export class SourceNode { + constructor(); + constructor(line: number, column: number, source: string); + constructor(line: number, column: number, source: string, chunk?: string, name?: string); + static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode; + add(chunk: string): void; + prepend(chunk: string): void; + setSourceContent(sourceFile: string, sourceContent: string): void; + walk(fn: (chunk: string, mapping: MappedPosition) => void): void; + walkSourceContents(fn: (file: string, content: string) => void): void; + join(sep: string): SourceNode; + replaceRight(pattern: string, replacement: string): SourceNode; + toString(): string; + toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap; +} diff --git a/sdk/typescript/node_modules/postcss/node_modules/source-map-js/source-map.js b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/source-map.js new file mode 100644 index 0000000..bc88fe8 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/node_modules/source-map-js/source-map.js @@ -0,0 +1,8 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./lib/source-node').SourceNode; diff --git a/sdk/typescript/node_modules/postcss/package.json b/sdk/typescript/node_modules/postcss/package.json new file mode 100644 index 0000000..7683d17 --- /dev/null +++ b/sdk/typescript/node_modules/postcss/package.json @@ -0,0 +1,88 @@ +{ + "name": "postcss", + "version": "8.5.8", + "description": "Tool for transforming styles with JS plugins", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "exports": { + ".": { + "import": "./lib/postcss.mjs", + "require": "./lib/postcss.js" + }, + "./lib/at-rule": "./lib/at-rule.js", + "./lib/comment": "./lib/comment.js", + "./lib/container": "./lib/container.js", + "./lib/css-syntax-error": "./lib/css-syntax-error.js", + "./lib/declaration": "./lib/declaration.js", + "./lib/fromJSON": "./lib/fromJSON.js", + "./lib/input": "./lib/input.js", + "./lib/lazy-result": "./lib/lazy-result.js", + "./lib/no-work-result": "./lib/no-work-result.js", + "./lib/list": "./lib/list.js", + "./lib/map-generator": "./lib/map-generator.js", + "./lib/node": "./lib/node.js", + "./lib/parse": "./lib/parse.js", + "./lib/parser": "./lib/parser.js", + "./lib/postcss": "./lib/postcss.js", + "./lib/previous-map": "./lib/previous-map.js", + "./lib/processor": "./lib/processor.js", + "./lib/result": "./lib/result.js", + "./lib/root": "./lib/root.js", + "./lib/rule": "./lib/rule.js", + "./lib/stringifier": "./lib/stringifier.js", + "./lib/stringify": "./lib/stringify.js", + "./lib/symbols": "./lib/symbols.js", + "./lib/terminal-highlight": "./lib/terminal-highlight.js", + "./lib/tokenize": "./lib/tokenize.js", + "./lib/warn-once": "./lib/warn-once.js", + "./lib/warning": "./lib/warning.js", + "./package.json": "./package.json" + }, + "main": "./lib/postcss.js", + "types": "./lib/postcss.d.ts", + "keywords": [ + "css", + "postcss", + "rework", + "preprocessor", + "parser", + "source map", + "transform", + "manipulation", + "transpiler" + ], + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "author": "Andrey Sitnik ", + "license": "MIT", + "homepage": "https://postcss.org/", + "repository": "postcss/postcss", + "bugs": { + "url": "https://github.com/postcss/postcss/issues" + }, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "browser": { + "./lib/terminal-highlight": false, + "source-map-js": false, + "path": false, + "url": false, + "fs": false + } +} diff --git a/sdk/typescript/node_modules/resolve-from/index.d.ts b/sdk/typescript/node_modules/resolve-from/index.d.ts new file mode 100644 index 0000000..dd5f5ef --- /dev/null +++ b/sdk/typescript/node_modules/resolve-from/index.d.ts @@ -0,0 +1,31 @@ +declare const resolveFrom: { + /** + Resolve the path of a module like [`require.resolve()`](https://nodejs.org/api/globals.html#globals_require_resolve) but from a given path. + + @param fromDirectory - Directory to resolve from. + @param moduleId - What you would use in `require()`. + @returns Resolved module path. Throws when the module can't be found. + + @example + ``` + import resolveFrom = require('resolve-from'); + + // There is a file at `./foo/bar.js` + + resolveFrom('foo', './bar'); + //=> '/Users/sindresorhus/dev/test/foo/bar.js' + ``` + */ + (fromDirectory: string, moduleId: string): string; + + /** + Resolve the path of a module like [`require.resolve()`](https://nodejs.org/api/globals.html#globals_require_resolve) but from a given path. + + @param fromDirectory - Directory to resolve from. + @param moduleId - What you would use in `require()`. + @returns Resolved module path or `undefined` when the module can't be found. + */ + silent(fromDirectory: string, moduleId: string): string | undefined; +}; + +export = resolveFrom; diff --git a/sdk/typescript/node_modules/resolve-from/index.js b/sdk/typescript/node_modules/resolve-from/index.js new file mode 100644 index 0000000..44f291c --- /dev/null +++ b/sdk/typescript/node_modules/resolve-from/index.js @@ -0,0 +1,47 @@ +'use strict'; +const path = require('path'); +const Module = require('module'); +const fs = require('fs'); + +const resolveFrom = (fromDirectory, moduleId, silent) => { + if (typeof fromDirectory !== 'string') { + throw new TypeError(`Expected \`fromDir\` to be of type \`string\`, got \`${typeof fromDirectory}\``); + } + + if (typeof moduleId !== 'string') { + throw new TypeError(`Expected \`moduleId\` to be of type \`string\`, got \`${typeof moduleId}\``); + } + + try { + fromDirectory = fs.realpathSync(fromDirectory); + } catch (error) { + if (error.code === 'ENOENT') { + fromDirectory = path.resolve(fromDirectory); + } else if (silent) { + return; + } else { + throw error; + } + } + + const fromFile = path.join(fromDirectory, 'noop.js'); + + const resolveFileName = () => Module._resolveFilename(moduleId, { + id: fromFile, + filename: fromFile, + paths: Module._nodeModulePaths(fromDirectory) + }); + + if (silent) { + try { + return resolveFileName(); + } catch (error) { + return; + } + } + + return resolveFileName(); +}; + +module.exports = (fromDirectory, moduleId) => resolveFrom(fromDirectory, moduleId); +module.exports.silent = (fromDirectory, moduleId) => resolveFrom(fromDirectory, moduleId, true); diff --git a/sdk/typescript/node_modules/resolve-from/license b/sdk/typescript/node_modules/resolve-from/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/sdk/typescript/node_modules/resolve-from/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/resolve-from/package.json b/sdk/typescript/node_modules/resolve-from/package.json new file mode 100644 index 0000000..733df16 --- /dev/null +++ b/sdk/typescript/node_modules/resolve-from/package.json @@ -0,0 +1,36 @@ +{ + "name": "resolve-from", + "version": "5.0.0", + "description": "Resolve the path of a module like `require.resolve()` but from a given path", + "license": "MIT", + "repository": "sindresorhus/resolve-from", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "require", + "resolve", + "path", + "module", + "from", + "like", + "import" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/sdk/typescript/node_modules/resolve-from/readme.md b/sdk/typescript/node_modules/resolve-from/readme.md new file mode 100644 index 0000000..fd4f46f --- /dev/null +++ b/sdk/typescript/node_modules/resolve-from/readme.md @@ -0,0 +1,72 @@ +# resolve-from [![Build Status](https://travis-ci.org/sindresorhus/resolve-from.svg?branch=master)](https://travis-ci.org/sindresorhus/resolve-from) + +> Resolve the path of a module like [`require.resolve()`](https://nodejs.org/api/globals.html#globals_require_resolve) but from a given path + + +## Install + +``` +$ npm install resolve-from +``` + + +## Usage + +```js +const resolveFrom = require('resolve-from'); + +// There is a file at `./foo/bar.js` + +resolveFrom('foo', './bar'); +//=> '/Users/sindresorhus/dev/test/foo/bar.js' +``` + + +## API + +### resolveFrom(fromDirectory, moduleId) + +Like `require()`, throws when the module can't be found. + +### resolveFrom.silent(fromDirectory, moduleId) + +Returns `undefined` instead of throwing when the module can't be found. + +#### fromDirectory + +Type: `string` + +Directory to resolve from. + +#### moduleId + +Type: `string` + +What you would use in `require()`. + + +## Tip + +Create a partial using a bound function if you want to resolve from the same `fromDirectory` multiple times: + +```js +const resolveFromFoo = resolveFrom.bind(null, 'foo'); + +resolveFromFoo('./bar'); +resolveFromFoo('./baz'); +``` + + +## Related + +- [resolve-cwd](https://github.com/sindresorhus/resolve-cwd) - Resolve the path of a module from the current working directory +- [import-from](https://github.com/sindresorhus/import-from) - Import a module from a given path +- [import-cwd](https://github.com/sindresorhus/import-cwd) - Import a module from the current working directory +- [resolve-pkg](https://github.com/sindresorhus/resolve-pkg) - Resolve the path of a package regardless of it having an entry point +- [import-lazy](https://github.com/sindresorhus/import-lazy) - Import a module lazily +- [resolve-global](https://github.com/sindresorhus/resolve-global) - Resolve the path of a globally installed module + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/sdk/typescript/node_modules/rollup/LICENSE.md b/sdk/typescript/node_modules/rollup/LICENSE.md new file mode 100644 index 0000000..7b80682 --- /dev/null +++ b/sdk/typescript/node_modules/rollup/LICENSE.md @@ -0,0 +1,679 @@ +# Rollup core license +Rollup is released under the MIT license: + +The MIT License (MIT) + +Copyright (c) 2017 [these people](https://github.com/rollup/rollup/graphs/contributors) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# Licenses of bundled dependencies +The published Rollup artifact additionally contains code with the following licenses: +MIT, ISC, 0BSD + +# Bundled dependencies: +## @jridgewell/sourcemap-codec +License: MIT +By: Justin Ridgewell +Repository: git+https://github.com/jridgewell/sourcemaps.git + +> Copyright 2024 Justin Ridgewell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## @rollup/pluginutils +License: MIT +By: Rich Harris +Repository: rollup/plugins + +> The MIT License (MIT) +> +> Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## anymatch +License: ISC +By: Elan Shanker +Repository: https://github.com/micromatch/anymatch + +> The ISC License +> +> Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## binary-extensions +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/binary-extensions + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> Copyright (c) Paul Miller (https://paulmillr.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## braces +License: MIT +By: Jon Schlinkert, Brian Woodward, Elan Shanker, Eugene Sharygin, hemanth.hm +Repository: micromatch/braces + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## builtin-modules +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/builtin-modules + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## chokidar +License: MIT +By: Paul Miller, Elan Shanker +Repository: git+https://github.com/paulmillr/chokidar.git + +> The MIT License (MIT) +> +> Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the “Software”), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## date-time +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/date-time + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## fill-range +License: MIT +By: Jon Schlinkert, Edo Rivai, Paul Miller, Rouven Weßling +Repository: jonschlinkert/fill-range + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## flru +License: MIT +By: Luke Edwards +Repository: lukeed/flru + +> MIT License +> +> Copyright (c) Luke Edwards (lukeed.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## glob-parent +License: ISC +By: Gulp Team, Elan Shanker, Blaine Bublitz +Repository: gulpjs/glob-parent + +> The ISC License +> +> Copyright (c) 2015, 2019 Elan Shanker +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## is-binary-path +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/is-binary-path + +> MIT License +> +> Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## is-extglob +License: MIT +By: Jon Schlinkert +Repository: jonschlinkert/is-extglob + +> The MIT License (MIT) +> +> Copyright (c) 2014-2016, Jon Schlinkert +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## is-glob +License: MIT +By: Jon Schlinkert, Brian Woodward, Daniel Perez +Repository: micromatch/is-glob + +> The MIT License (MIT) +> +> Copyright (c) 2014-2017, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## is-number +License: MIT +By: Jon Schlinkert, Olsten Larck, Rouven Weßling +Repository: jonschlinkert/is-number + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## is-reference +License: MIT +By: Rich Harris +Repository: git+https://github.com/Rich-Harris/is-reference.git + +--------------------------------------- + +## locate-character +License: MIT +By: Rich Harris +Repository: git+https://gitlab.com/Rich-Harris/locate-character.git + +--------------------------------------- + +## magic-string +License: MIT +By: Rich Harris +Repository: git+https://github.com/Rich-Harris/magic-string.git + +> Copyright 2018 Rich Harris +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## normalize-path +License: MIT +By: Jon Schlinkert, Blaine Bublitz +Repository: jonschlinkert/normalize-path + +> The MIT License (MIT) +> +> Copyright (c) 2014-2018, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## parse-ms +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/parse-ms + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## picocolors +License: ISC +By: Alexey Raspopov +Repository: alexeyraspopov/picocolors + +> ISC License +> +> Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## picomatch +License: MIT +By: Jon Schlinkert +Repository: micromatch/picomatch + +> The MIT License (MIT) +> +> Copyright (c) 2017-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## pretty-bytes +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/pretty-bytes + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## pretty-ms +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/pretty-ms + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## readdirp +License: MIT +By: Thorsten Lorenz, Paul Miller +Repository: git://github.com/paulmillr/readdirp.git + +> MIT License +> +> Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## signal-exit +License: ISC +By: Ben Coe +Repository: https://github.com/tapjs/signal-exit.git + +> The ISC License +> +> Copyright (c) 2015-2023 Benjamin Coe, Isaac Z. Schlueter, and Contributors +> +> Permission to use, copy, modify, and/or distribute this software +> for any purpose with or without fee is hereby granted, provided +> that the above copyright notice and this permission notice +> appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +> OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +> LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +> OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +> WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +> ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## time-zone +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/time-zone + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## to-regex-range +License: MIT +By: Jon Schlinkert, Rouven Weßling +Repository: micromatch/to-regex-range + +> The MIT License (MIT) +> +> Copyright (c) 2015-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## tslib +License: 0BSD +By: Microsoft Corp. +Repository: https://github.com/Microsoft/tslib.git + +> Copyright (c) Microsoft Corporation. +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +> AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +> LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +> OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +> PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## yargs-parser +License: ISC +By: Ben Coe +Repository: https://github.com/yargs/yargs-parser.git + +> Copyright (c) 2016, Contributors +> +> Permission to use, copy, modify, and/or distribute this software +> for any purpose with or without fee is hereby granted, provided +> that the above copyright notice and this permission notice +> appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +> OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +> LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +> OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +> WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +> ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/sdk/typescript/node_modules/rollup/README.md b/sdk/typescript/node_modules/rollup/README.md new file mode 100644 index 0000000..0c4fe95 --- /dev/null +++ b/sdk/typescript/node_modules/rollup/README.md @@ -0,0 +1,134 @@ +

+ +

+ +

+ + npm version + + + node compatibility + + + install size + + + code coverage + + + backers + + + sponsors + + + license + + + Join the chat at https://is.gd/rollup_chat + +

+ +

Rollup

+ +## Overview + +Rollup is a module bundler for JavaScript which compiles small pieces of code into something larger and more complex, such as a library or application. It uses the standardized ES module format for code, instead of previous idiosyncratic solutions such as CommonJS and AMD. ES modules let you freely and seamlessly combine the most useful individual functions from your favorite libraries. Rollup can optimize ES modules for faster native loading in modern browsers, or output a legacy module format allowing ES module workflows today. + +## Quick Start Guide + +Install with `npm install --global rollup`. Rollup can be used either through a [command line interface](https://rollupjs.org/command-line-interface/) with an optional configuration file or else through its [JavaScript API](https://rollupjs.org/javascript-api/). Run `rollup --help` to see the available options and parameters. The starter project templates, [rollup-starter-lib](https://github.com/rollup/rollup-starter-lib) and [rollup-starter-app](https://github.com/rollup/rollup-starter-app), demonstrate common configuration options, and more detailed instructions are available throughout the [user guide](https://rollupjs.org/introduction/). + +### Commands + +These commands assume the entry point to your application is named main.js, and that you'd like all imports compiled into a single file named bundle.js. + +For browsers: + +```bash +# compile to a + +``` + +--- + +## Table of Contents + + + + +- [Examples](#examples) + - [Consuming a source map](#consuming-a-source-map) + - [Generating a source map](#generating-a-source-map) + - [With SourceNode (high level API)](#with-sourcenode-high-level-api) + - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api) +- [API](#api) + - [SourceMapConsumer](#sourcemapconsumer) + - [SourceMapConsumer.initialize(options)](#sourcemapconsumerinitializeoptions) + - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap) + - [SourceMapConsumer.with](#sourcemapconsumerwith) + - [SourceMapConsumer.prototype.destroy()](#sourcemapconsumerprototypedestroy) + - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans) + - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition) + - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition) + - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition) + - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources) + - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing) + - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order) + - [SourceMapGenerator](#sourcemapgenerator) + - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap) + - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer) + - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping) + - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath) + - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring) + - [SourceNode](#sourcenode) + - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name) + - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath) + - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk) + - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk) + - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn) + - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn) + - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep) + - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement) + - [SourceNode.prototype.toString()](#sourcenodeprototypetostring) + - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap) + + + +## Examples + +### Consuming a source map + +```js +const rawSourceMap = { + version: 3, + file: "min.js", + names: ["bar", "baz", "n"], + sources: ["one.js", "two.js"], + sourceRoot: "http://example.com/www/js/", + mappings: + "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA", +}; + +const whatever = await SourceMapConsumer.with(rawSourceMap, null, consumer => { + console.log(consumer.sources); + // [ 'http://example.com/www/js/one.js', + // 'http://example.com/www/js/two.js' ] + + console.log( + consumer.originalPositionFor({ + line: 2, + column: 28, + }) + ); + // { source: 'http://example.com/www/js/two.js', + // line: 2, + // column: 10, + // name: 'n' } + + console.log( + consumer.generatedPositionFor({ + source: "http://example.com/www/js/two.js", + line: 2, + column: 10, + }) + ); + // { line: 2, column: 28 } + + consumer.eachMapping(function (m) { + // ... + }); + + return computeWhatever(); +}); +``` + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + +```js +function compile(ast) { + switch (ast.type) { + case "BinaryExpression": + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case "Literal": + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } +} + +var ast = parse("40 + 2", "add.js"); +console.log( + compile(ast).toStringWithSourceMap({ + file: "add.js", + }) +); +// { code: '40 + 2', +// map: [object SourceMapGenerator] } +``` + +#### With SourceMapGenerator (low level API) + +```js +var map = new SourceMapGenerator({ + file: "source-mapped.js", +}); + +map.addMapping({ + generated: { + line: 10, + column: 35, + }, + source: "foo.js", + original: { + line: 33, + column: 2, + }, + name: "christopher", +}); + +console.log(map.toString()); +// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' +``` + +## API + +Get a reference to the module: + +```js +// Node.js +var sourceMap = require("source-map"); + +// Browser builds +var sourceMap = window.sourceMap; + +// Inside Firefox +const sourceMap = require("devtools/toolkit/sourcemap/source-map.js"); +``` + +### SourceMapConsumer + +A `SourceMapConsumer` instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### SourceMapConsumer.initialize(options) + +When using `SourceMapConsumer` outside of node.js, for example on the Web, it +needs to know from what URL to load `lib/mappings.wasm`. You must inform it by +calling `initialize` before constructing any `SourceMapConsumer`s. + +The options object has the following properties: + +- `"lib/mappings.wasm"`: A `String` containing the URL of the + `lib/mappings.wasm` file, or an `ArrayBuffer` with the contents of `lib/mappings.wasm`. + +```js +sourceMap.SourceMapConsumer.initialize({ + "lib/mappings.wasm": "https://example.com/source-map/lib/mappings.wasm", +}); +``` + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +- `version`: Which version of the source map spec this map is following. + +- `sources`: An array of URLs to the original source files. + +- `names`: An array of identifiers which can be referenced by individual + mappings. + +- `sourceRoot`: Optional. The URL root from which all sources are relative. + +- `sourcesContent`: Optional. An array of contents of the original source files. + +- `mappings`: A string of base64 VLQs which contain the actual mappings. + +- `file`: Optional. The generated filename this source map is associated with. + +- `x_google_ignoreList`: Optional. An additional extension field which is an array + of indices refering to urls in the sources array. This is used to identify third-party + sources, that the developer might want to avoid when debugging. [Read more](https://developer.chrome.com/articles/x-google-ignore-list/) + +The promise of the constructed souce map consumer is returned. + +When the `SourceMapConsumer` will no longer be used anymore, you must call its +`destroy` method. + +```js +const consumer = await new sourceMap.SourceMapConsumer(rawSourceMapJsonData); +doStuffWith(consumer); +consumer.destroy(); +``` + +Alternatively, you can use `SourceMapConsumer.with` to avoid needing to remember +to call `destroy`. + +#### SourceMapConsumer.with + +Construct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl` +(see the `SourceMapConsumer` constructor for details. Then, invoke the `async function f(SourceMapConsumer) -> T` with the newly constructed consumer, wait +for `f` to complete, call `destroy` on the consumer, and return `f`'s return +value. + +You must not use the consumer after `f` completes! + +By using `with`, you do not have to remember to manually call `destroy` on +the consumer, since it will be called automatically once `f` completes. + +```js +const xSquared = await SourceMapConsumer.with( + myRawSourceMap, + null, + async function (consumer) { + // Use `consumer` inside here and don't worry about remembering + // to call `destroy`. + + const x = await whatever(consumer); + return x * x; + } +); + +// You may not use that `consumer` anymore out here; it has +// been destroyed. But you can use `xSquared`. +console.log(xSquared); +``` + +#### SourceMapConsumer.prototype.destroy() + +Free this source map consumer's associated wasm data that is manually-managed. + +```js +consumer.destroy(); +``` + +Alternatively, you can use `SourceMapConsumer.with` to avoid needing to remember +to call `destroy`. + +#### SourceMapConsumer.prototype.computeColumnSpans() + +Compute the last column for each generated mapping. The last column is +inclusive. + +```js +// Before: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }); +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] + +consumer.computeColumnSpans(); + +// After: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }); +// [ { line: 2, +// column: 1, +// lastColumn: 9 }, +// { line: 2, +// column: 10, +// lastColumn: 19 }, +// { line: 2, +// column: 20, +// lastColumn: Infinity } ] +``` + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +- `line`: The line number in the generated source. Line numbers in + this library are 1-based (note that the underlying source map + specification uses 0-based line numbers -- this library handles the + translation). + +- `column`: The column number in the generated source. Column numbers + in this library are 0-based. + +- `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or + `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest + element that is smaller than or greater than the one we are searching for, + respectively, if the exact element cannot be found. Defaults to + `SourceMapConsumer.GREATEST_LOWER_BOUND`. + +and an object is returned with the following properties: + +- `source`: The original source file, or null if this information is not + available. + +- `line`: The line number in the original source, or null if this information is + not available. The line number is 1-based. + +- `column`: The column number in the original source, or null if this + information is not available. The column number is 0-based. + +- `name`: The original identifier, or null if this information is not available. + +```js +consumer.originalPositionFor({ line: 2, column: 10 }); +// { source: 'foo.coffee', +// line: 2, +// column: 2, +// name: null } + +consumer.originalPositionFor({ + line: 99999999999999999, + column: 999999999999999, +}); +// { source: null, +// line: null, +// column: null, +// name: null } +``` + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +- `source`: The filename of the original source. + +- `line`: The line number in the original source. The line number is + 1-based. + +- `column`: The column number in the original source. The column + number is 0-based. + +and an object is returned with the following properties: + +- `line`: The line number in the generated source, or null. The line + number is 1-based. + +- `column`: The column number in the generated source, or null. The + column number is 0-based. + +```js +consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 }); +// { line: 1, +// column: 56 } +``` + +#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) + +Returns all generated line and column information for the original source, line, +and column provided. If no column is provided, returns all mappings +corresponding to a either the line we are searching for or the next closest line +that has any mappings. Otherwise, returns all mappings corresponding to the +given line and either the column we are searching for or the next closest column +that has any offsets. + +The only argument is an object with the following properties: + +- `source`: The filename of the original source. + +- `line`: The line number in the original source. The line number is + 1-based. + +- `column`: Optional. The column number in the original source. The + column number is 0-based. + +and an array of objects is returned, each with the following properties: + +- `line`: The line number in the generated source, or null. The line + number is 1-based. + +- `column`: The column number in the generated source, or null. The + column number is 0-based. + +```js +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }); +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] +``` + +#### SourceMapConsumer.prototype.hasContentsOfAllSources() + +Return true if we have the embedded source content for every source listed in +the source map, false otherwise. + +In other words, if this method returns `true`, then +`consumer.sourceContentFor(s)` will succeed for every source `s` in +`consumer.sources`. + +```js +// ... +if (consumer.hasContentsOfAllSources()) { + consumerReadyCallback(consumer); +} else { + fetchSources(consumer, consumerReadyCallback); +} +// ... +``` + +#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +If the source content for the given source is not found, then an error is +thrown. Optionally, pass `true` as the second param to have `null` returned +instead. + +```js +consumer.sources; +// [ "my-cool-lib.clj" ] + +consumer.sourceContentFor("my-cool-lib.clj"); +// "..." + +consumer.sourceContentFor("this is not in the source map"); +// Error: "this is not in the source map" is not in the source map + +consumer.sourceContentFor("this is not in the source map", true); +// null +``` + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +- `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, name }` + +- `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +- `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +```js +consumer.eachMapping(function (m) { + console.log(m); +}); +// ... +// { source: 'illmatic.js', +// generatedLine: 1, +// generatedColumn: 0, +// originalLine: 1, +// originalColumn: 0, +// name: null } +// { source: 'illmatic.js', +// generatedLine: 2, +// generatedColumn: 0, +// originalLine: 2, +// originalColumn: 0, +// name: null } +// ... +``` + +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator([startOfSourceMap]) + +You may pass an object with the following properties: + +- `file`: The filename of the generated source that this source map is + associated with. + +- `sourceRoot`: A root for all relative URLs in this source map. + +- `skipValidation`: Optional. When `true`, disables validation of mappings as + they are added. This can improve performance but should be used with + discretion, as a last resort. Even then, one should avoid using this flag when + running tests, if possible. + +```js +var generator = new sourceMap.SourceMapGenerator({ + file: "my-generated-javascript-file.js", + sourceRoot: "http://example.com/app/js/", +}); +``` + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance. + +- `sourceMapConsumer` The SourceMap. + +```js +var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer); +``` + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +- `generated`: An object with the generated line and column positions. + +- `original`: An object with the original line and column positions. + +- `source`: The original source file (relative to the sourceRoot). + +- `name`: An optional original token name for this mapping. + +```js +generator.addMapping({ + source: "module-one.scm", + original: { line: 128, column: 0 }, + generated: { line: 3, column: 456 }, +}); +``` + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +- `sourceFile` the URL of the original source file. + +- `sourceContent` the content of the source file. + +```js +generator.setSourceContent( + "module-one.scm", + fs.readFileSync("path/to/module-one.scm") +); +``` + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimum of this map and the supplied map. + +- `sourceMapConsumer`: The SourceMap to be applied. + +- `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used, if it exists. + Otherwise an error will be thrown. + +- `sourceMapPath`: Optional. The dirname of the path to the SourceMap + to be applied. If relative, it is relative to the SourceMap. + + This parameter is needed when the two SourceMaps aren't in the same + directory, and the SourceMap to be applied contains relative source + paths. If so, those relative source paths need to be rewritten + relative to the SourceMap. + + If omitted, it is assumed that both SourceMaps are in the same directory, + thus not needing any rewriting. (Supplying `'.'` has the same effect.) + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +```js +generator.toString(); +// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}' +``` + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode([line, column, source[, chunk[, name]]]) + +- `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. The line number is 1-based. + +- `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. The column number + is 0-based. + +- `source`: The original source's filename; null if no filename is provided. + +- `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +- `name`: Optional. The original identifier. + +```js +var node = new SourceNode(1, 2, "a.cpp", [ + new SourceNode(3, 4, "b.cpp", "extern int status;\n"), + new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"), + new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"), +]); +``` + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +- `code`: The generated code + +- `sourceMapConsumer` The SourceMap for the generated code + +- `relativePath` The optional path that relative sources in `sourceMapConsumer` + should be relative to. + +```js +const consumer = await new SourceMapConsumer( + fs.readFileSync("path/to/my-file.js.map", "utf8") +); +const node = SourceNode.fromStringWithSourceMap( + fs.readFileSync("path/to/my-file.js"), + consumer +); +``` + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +- `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.add(" + "); +node.add(otherNode); +node.add([leftHandOperandNode, " + ", rightHandOperandNode]); +``` + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +- `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.prepend("/** Build Id: f783haef86324gf **/\n\n"); +``` + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +- `sourceFile`: The filename of the source file + +- `sourceContent`: The content of the source file + +```js +node.setSourceContent( + "module-one.scm", + fs.readFileSync("path/to/module-one.scm") +); +``` + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +- `fn`: The traversal function. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + ["tres", new SourceNode(5, 6, "c.js", "quatro")], +]); + +node.walk(function (code, loc) { + console.log("WALK:", code, loc); +}); +// WALK: uno { source: 'b.js', line: 3, column: 4, name: null } +// WALK: dos { source: 'a.js', line: 1, column: 2, name: null } +// WALK: tres { source: 'a.js', line: 1, column: 2, name: null } +// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null } +``` + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +- `fn`: The traversal function. + +```js +var a = new SourceNode(1, 2, "a.js", "generated from a"); +a.setSourceContent("a.js", "original a"); +var b = new SourceNode(1, 2, "b.js", "generated from b"); +b.setSourceContent("b.js", "original b"); +var c = new SourceNode(1, 2, "c.js", "generated from c"); +c.setSourceContent("c.js", "original c"); + +var node = new SourceNode(null, null, null, [a, b, c]); +node.walkSourceContents(function (source, contents) { + console.log("WALK:", source, ":", contents); +}); +// WALK: a.js : original a +// WALK: b.js : original b +// WALK: c.js : original c +``` + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +- `sep`: The separator. + +```js +var lhs = new SourceNode(1, 2, "a.rs", "my_copy"); +var operand = new SourceNode(3, 4, "a.rs", "="); +var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()"); + +var node = new SourceNode(null, null, null, [lhs, operand, rhs]); +var joinedNode = node.join(" "); +``` + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming white space from the end of a source node, etc. + +- `pattern`: The pattern to replace. + +- `replacement`: The thing to replace the pattern with. + +```js +// Trim trailing white space. +node.replaceRight(/\s*$/, ""); +``` + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + ["tres", new SourceNode(5, 6, "c.js", "quatro")], +]); + +node.toString(); +// 'unodostresquatro' +``` + +#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + ["tres", new SourceNode(5, 6, "c.js", "quatro")], +]); + +node.toStringWithSourceMap({ file: "my-output-file.js" }); +// { code: 'unodostresquatro', +// map: [object SourceMapGenerator] } +``` diff --git a/sdk/typescript/node_modules/source-map/package.json b/sdk/typescript/node_modules/source-map/package.json new file mode 100644 index 0000000..06d4f1a --- /dev/null +++ b/sdk/typescript/node_modules/source-map/package.json @@ -0,0 +1,79 @@ +{ + "name": "source-map", + "description": "Generates and consumes source maps", + "version": "0.7.6", + "homepage": "https://github.com/mozilla/source-map", + "author": "Nick Fitzgerald ", + "contributors": [ + "Tobias Koppers ", + "Duncan Beevers ", + "Stephen Crane ", + "Ryan Seddon ", + "Miles Elam ", + "Mihai Bazon ", + "Michael Ficarra ", + "Todd Wolfson ", + "Alexander Solovyov ", + "Felix Gnass ", + "Conrad Irwin ", + "usrbincc ", + "David Glasser ", + "Chase Douglas ", + "Evan Wallace ", + "Heather Arthur ", + "Hugh Kennedy ", + "David Glasser ", + "Simon Lydell ", + "Jmeas Smith ", + "Michael Z Goddard ", + "azu ", + "John Gozde ", + "Adam Kirkton ", + "Chris Montgomery ", + "J. Ryan Stinnett ", + "Jack Herrington ", + "Chris Truter ", + "Daniel Espeset ", + "Jamie Wong ", + "Eddy Bruël ", + "Hawken Rives ", + "Gilad Peleg ", + "djchie ", + "Gary Ye ", + "Nicolas Lalevée " + ], + "repository": { + "type": "git", + "url": "http://github.com/mozilla/source-map.git" + }, + "main": "./source-map.js", + "types": "./source-map.d.ts", + "browser": { + "./lib/read-wasm.js": "./lib/read-wasm-browser.js" + }, + "files": [ + "source-map.js", + "source-map.d.ts", + "lib/" + ], + "engines": { + "node": ">= 12" + }, + "license": "BSD-3-Clause", + "scripts": { + "lint": "eslint --fix *.js lib/ test/ --ignore-pattern 'test/source-map-tests/**'", + "test": "git submodule update --init --recursive; node test/run-tests.js", + "coverage": "c8 --reporter=text --reporter=html npm test", + "prettier": "prettier --write .", + "clean": "rm -rf coverage", + "toc": "doctoc --github --notitle README.md CONTRIBUTING.md" + }, + "devDependencies": { + "c8": "^7.12.0", + "doctoc": "^2.2.1", + "eslint": "^8.24.0", + "eslint-config-prettier": "^8.5.0", + "prettier": "^2.7.1" + }, + "dependencies": {} +} diff --git a/sdk/typescript/node_modules/source-map/source-map.d.ts b/sdk/typescript/node_modules/source-map/source-map.d.ts new file mode 100644 index 0000000..8bd5b6a --- /dev/null +++ b/sdk/typescript/node_modules/source-map/source-map.d.ts @@ -0,0 +1,423 @@ +// Type definitions for source-map 0.7 +// Project: https://github.com/mozilla/source-map +// Definitions by: Morten Houston Ludvigsen , +// Ron Buckton , +// John Vilk +// Definitions: https://github.com/mozilla/source-map +export type SourceMapUrl = string; + +export interface StartOfSourceMap { + file?: string; + sourceRoot?: string; + skipValidation?: boolean; +} + +export interface RawSourceMap { + version: number; + sources: string[]; + names: string[]; + sourceRoot?: string; + sourcesContent?: string[]; + mappings: string; + file: string; +} + +export interface RawIndexMap extends StartOfSourceMap { + version: number; + sections: RawSection[]; +} + +export interface RawSection { + offset: Position; + map: RawSourceMap; +} + +export interface Position { + line: number; + column: number; +} + +export interface NullablePosition { + line: number | null; + column: number | null; + lastColumn: number | null; +} + +export interface MappedPosition { + source: string; + line: number; + column: number; + name?: string; +} + +export interface NullableMappedPosition { + source: string | null; + line: number | null; + column: number | null; + name: string | null; +} + +export interface MappingItem { + source: string; + generatedLine: number; + generatedColumn: number; + lastGeneratedColumn: number | null; + originalLine: number; + originalColumn: number; + name: string; +} + +export interface Mapping { + generated: Position; + original: Position; + source: string; + name?: string; +} + +export interface CodeWithSourceMap { + code: string; + map: SourceMapGenerator; +} + +export interface SourceMappings { + "lib/mappings.wasm": SourceMapUrl | ArrayBuffer; +} + +export interface SourceMapConsumer { + /** + * When using SourceMapConsumer outside of node.js, for example on the Web, it + * needs to know from what URL to load lib/mappings.wasm. You must inform it + * by calling initialize before constructing any SourceMapConsumers. + * + * @param mappings an object with the following property: + * - "lib/mappings.wasm": A String containing the URL of the + * lib/mappings.wasm file, or an ArrayBuffer with the contents of + * lib/mappings.wasm. + */ + initialize(mappings: SourceMappings): void; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + computeColumnSpans(): void; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + originalPositionFor( + generatedPosition: Position & { bias?: number } + ): NullableMappedPosition; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + generatedPositionFor( + originalPosition: MappedPosition & { bias?: number } + ): NullablePosition; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + allGeneratedPositionsFor( + originalPosition: MappedPosition + ): NullablePosition[]; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + hasContentsOfAllSources(): boolean; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + sourceContentFor( + source: string, + returnNullOnMissing?: boolean + ): string | null; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param callback + * The function that is called with each mapping. + * @param context + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param order + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + eachMapping( + callback: (mapping: MappingItem) => void, + context?: any, + order?: number + ): void; + /** + * Free this source map consumer's associated wasm data that is manually-managed. + * Alternatively, you can use SourceMapConsumer.with to avoid needing to remember to call destroy. + */ + destroy(): void; +} + +export interface SourceMapConsumerConstructor { + prototype: SourceMapConsumer; + + GENERATED_ORDER: number; + ORIGINAL_ORDER: number; + GREATEST_LOWER_BOUND: number; + LEAST_UPPER_BOUND: number; + + new ( + rawSourceMap: RawSourceMap, + sourceMapUrl?: SourceMapUrl + ): Promise; + new ( + rawSourceMap: RawIndexMap, + sourceMapUrl?: SourceMapUrl + ): Promise; + new ( + rawSourceMap: RawSourceMap | RawIndexMap | string, + sourceMapUrl?: SourceMapUrl + ): Promise; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param sourceMap + * The source map that will be consumed. + */ + fromSourceMap( + sourceMap: SourceMapGenerator, + sourceMapUrl?: SourceMapUrl + ): Promise; + + /** + * Construct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl` + * (see the `SourceMapConsumer` constructor for details. Then, invoke the `async + * function f(SourceMapConsumer) -> T` with the newly constructed consumer, wait + * for `f` to complete, call `destroy` on the consumer, and return `f`'s return + * value. + * + * You must not use the consumer after `f` completes! + * + * By using `with`, you do not have to remember to manually call `destroy` on + * the consumer, since it will be called automatically once `f` completes. + * + * ```js + * const xSquared = await SourceMapConsumer.with( + * myRawSourceMap, + * null, + * async function (consumer) { + * // Use `consumer` inside here and don't worry about remembering + * // to call `destroy`. + * + * const x = await whatever(consumer); + * return x * x; + * } + * ); + * + * // You may not use that `consumer` anymore out here; it has + * // been destroyed. But you can use `xSquared`. + * console.log(xSquared); + * ``` + */ + with( + rawSourceMap: RawSourceMap | RawIndexMap | string, + sourceMapUrl: SourceMapUrl | null | undefined, + callback: ( + consumer: BasicSourceMapConsumer | IndexedSourceMapConsumer + ) => Promise | T + ): Promise; +} + +export const SourceMapConsumer: SourceMapConsumerConstructor; + +export interface BasicSourceMapConsumer extends SourceMapConsumer { + file: string; + sourceRoot: string; + sources: string[]; + sourcesContent: string[]; +} + +export interface BasicSourceMapConsumerConstructor { + prototype: BasicSourceMapConsumer; + + new (rawSourceMap: RawSourceMap | string): Promise; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param sourceMap + * The source map that will be consumed. + */ + fromSourceMap(sourceMap: SourceMapGenerator): Promise; +} + +export const BasicSourceMapConsumer: BasicSourceMapConsumerConstructor; + +export interface IndexedSourceMapConsumer extends SourceMapConsumer { + sources: string[]; +} + +export interface IndexedSourceMapConsumerConstructor { + prototype: IndexedSourceMapConsumer; + + new (rawSourceMap: RawIndexMap | string): Promise; +} + +export const IndexedSourceMapConsumer: IndexedSourceMapConsumerConstructor; + +export class SourceMapGenerator { + constructor(startOfSourceMap?: StartOfSourceMap); + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param sourceMapConsumer The SourceMap. + */ + static fromSourceMap( + sourceMapConsumer: SourceMapConsumer + ): SourceMapGenerator; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + addMapping(mapping: Mapping): void; + + /** + * Set the source content for a source file. + */ + setSourceContent(sourceFile: string, sourceContent: string): void; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param sourceMapConsumer The source map to be applied. + * @param sourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param sourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + applySourceMap( + sourceMapConsumer: SourceMapConsumer, + sourceFile?: string, + sourceMapPath?: string + ): void; + + toString(): string; + + toJSON(): RawSourceMap; +} + +export class SourceNode { + children: SourceNode[]; + sourceContents: any; + line: number; + column: number; + source: string; + name: string; + + constructor(); + constructor( + line: number | null, + column: number | null, + source: string | null, + chunks?: Array | SourceNode | string, + name?: string + ); + + static fromStringWithSourceMap( + code: string, + sourceMapConsumer: SourceMapConsumer, + relativePath?: string + ): SourceNode; + + add(chunk: Array | SourceNode | string): SourceNode; + + prepend(chunk: Array | SourceNode | string): SourceNode; + + setSourceContent(sourceFile: string, sourceContent: string): void; + + walk(fn: (chunk: string, mapping: MappedPosition) => void): void; + + walkSourceContents(fn: (file: string, content: string) => void): void; + + join(sep: string): SourceNode; + + replaceRight(pattern: string, replacement: string): SourceNode; + + toString(): string; + + toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap; +} diff --git a/sdk/typescript/node_modules/source-map/source-map.js b/sdk/typescript/node_modules/source-map/source-map.js new file mode 100644 index 0000000..6c73fc0 --- /dev/null +++ b/sdk/typescript/node_modules/source-map/source-map.js @@ -0,0 +1,10 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = + require("./lib/source-map-generator").SourceMapGenerator; +exports.SourceMapConsumer = + require("./lib/source-map-consumer").SourceMapConsumer; +exports.SourceNode = require("./lib/source-node").SourceNode; diff --git a/sdk/typescript/node_modules/std-env/LICENCE b/sdk/typescript/node_modules/std-env/LICENCE new file mode 100644 index 0000000..db8fffe --- /dev/null +++ b/sdk/typescript/node_modules/std-env/LICENCE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) Pooya Parsa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/sdk/typescript/node_modules/std-env/README.md b/sdk/typescript/node_modules/std-env/README.md new file mode 100644 index 0000000..7ed80fe --- /dev/null +++ b/sdk/typescript/node_modules/std-env/README.md @@ -0,0 +1,118 @@ +# std-env + +[![npm](https://img.shields.io/npm/dm/std-env.svg?style=flat-square)](http://npmjs.com/package/std-env) +[![npm](https://img.shields.io/npm/v/std-env.svg?style=flat-square)](http://npmjs.com/package/std-env) +[![bundlephobia](https://img.shields.io/bundlephobia/min/std-env/latest.svg?style=flat-square)](https://bundlephobia.com/result?p=std-env) + +> Runtime agnostic JS utils + +## Installation + +```sh +# Using npm +npm i std-env + +# Using pnpm +pnpm i std-env + +# Using yarn +yarn add std-env +``` + +## Usage + +```js +// ESM +import { env, isDevelopment, isProduction } from "std-env"; + +// CommonJS +const { env, isDevelopment, isProduction } = require("std-env"); +``` + +## Flags + +- `hasTTY` +- `hasWindow` +- `isDebug` +- `isDevelopment` +- `isLinux` +- `isMacOS` +- `isMinimal` +- `isProduction` +- `isTest` +- `isWindows` +- `platform` +- `isColorSupported` +- `nodeVersion` +- `nodeMajorVersion` + +You can read more about how each flag works from [./src/flags.ts](./src/flags.ts). + +## Provider Detection + +`std-env` can automatically detect the current runtime provider based on environment variables. + +You can use `isCI` and `platform` exports to detect it: + +```ts +import { isCI, provider, providerInfo } from "std-env"; + +console.log({ + isCI, // true + provider, // "github_actions" + providerInfo, // { name: "github_actions", isCI: true } +}); +``` + +List of well known providers can be found from [./src/providers.ts](./src/providers.ts). + +## Runtime Detection + +`std-env` can automatically detect the current JavaScript runtime based on global variables, following the [WinterCG Runtime Keys proposal](https://runtime-keys.proposal.wintercg.org/): + +```ts +import { runtime, runtimeInfo } from "std-env"; + +// "" | "node" | "deno" | "bun" | "workerd" ... +console.log(runtime); + +// { name: "node" } +console.log(runtimeInfo); +``` + +You can also use individual named exports for each runtime detection: + +> [!NOTE] +> When running code in Bun and Deno with Node.js compatibility mode, `isNode` flag will be also `true`, indicating running in a Node.js compatible runtime. +> +> Use `runtime === "node"` if you need strict check for Node.js runtime. + +- `isNode` +- `isBun` +- `isDeno` +- `isNetlify` +- `isEdgeLight` +- `isWorkerd` +- `isFastly` + +List of well known providers can be found from [./src/runtimes.ts](./src/runtimes.ts). + +## Platform-Agnostic `env` + +`std-env` provides a lightweight proxy to access environment variables in a platform agnostic way. + +```ts +import { env } from "std-env"; +``` + +## Platform-Agnostic `process` + +`std-env` provides a lightweight proxy to access [`process`](https://nodejs.org/api/process.html) object in a platform agnostic way. + +```ts +import { process } from "std-env"; +``` + +## License + +MIT diff --git a/sdk/typescript/node_modules/std-env/package.json b/sdk/typescript/node_modules/std-env/package.json new file mode 100644 index 0000000..0abe132 --- /dev/null +++ b/sdk/typescript/node_modules/std-env/package.json @@ -0,0 +1,46 @@ +{ + "name": "std-env", + "version": "3.10.0", + "description": "Runtime agnostic JS utils", + "repository": "unjs/std-env", + "license": "MIT", + "sideEffects": false, + "type": "module", + "exports": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "unbuild", + "dev": "vitest", + "lint": "eslint . && prettier -c src test", + "lint:fix": "eslint --fix . && prettier -w src test", + "prepack": "unbuild", + "play:bun": "bun playground/bun.ts", + "play:deno": "pnpm build && deno run -A playground/deno.ts", + "play:node": "pnpm build && node playground/node.mjs", + "release": "pnpm test && changelogen --release && npm publish && git push --follow-tags", + "test": "pnpm lint && pnpm typecheck && vitest run --coverage", + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "@types/node": "^24.7.2", + "@vitest/coverage-v8": "^3.2.4", + "changelogen": "^0.6.2", + "esbuild": "^0.25.10", + "eslint": "^9.37.0", + "eslint-config-unjs": "^0.5.0", + "prettier": "^3.6.2", + "rollup": "^4.52.4", + "typescript": "^5.9.3", + "unbuild": "^3.6.1", + "vitest": "^3.2.4" + }, + "packageManager": "pnpm@10.18.2" +} diff --git a/sdk/typescript/node_modules/strip-literal/LICENSE b/sdk/typescript/node_modules/strip-literal/LICENSE new file mode 100644 index 0000000..7d71216 --- /dev/null +++ b/sdk/typescript/node_modules/strip-literal/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Anthony Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/strip-literal/README.md b/sdk/typescript/node_modules/strip-literal/README.md new file mode 100644 index 0000000..1af1379 --- /dev/null +++ b/sdk/typescript/node_modules/strip-literal/README.md @@ -0,0 +1,29 @@ +# strip-literal + +[![NPM version](https://img.shields.io/npm/v/strip-literal?color=a1b858&label=)](https://www.npmjs.com/package/strip-literal) + +Strip comments and string literals from JavaScript code. Powered by [`js-tokens`](https://github.com/lydell/js-tokens). + +## Usage + + + +```ts +import { stripLiteral } from 'strip-literal' + +stripLiteral('const foo = `//foo ${bar}`') // 'const foo = ` ${bar}`' +``` + +Comments, string literals will be replaced by spaces with the same length to keep the source map untouched. + +## Sponsors + +

+ + + +

+ +## License + +[MIT](./LICENSE) License © 2022 [Anthony Fu](https://github.com/antfu) diff --git a/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/LICENSE b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/LICENSE new file mode 100644 index 0000000..f07e1ac --- /dev/null +++ b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Simon Lydell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/README.md b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/README.md new file mode 100644 index 0000000..ee52150 --- /dev/null +++ b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/README.md @@ -0,0 +1,14 @@ +# js-tokens + +The tiny, regex powered, lenient, _almost_ spec-compliant JavaScript tokenizer that never fails. + +```js +const jsTokens = require("js-tokens"); + +const jsString = 'JSON.stringify({k:3.14**2}, null /*replacer*/, "\\t")'; + +Array.from(jsTokens(jsString), (token) => token.value).join("|"); +// JSON|.|stringify|(|{|k|:|3.14|**|2|}|,| |null| |/*replacer*/|,| |"\t"|) +``` + +**[➡️ Full readme](https://github.com/lydell/js-tokens/)** \ No newline at end of file diff --git a/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/index.d.ts b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/index.d.ts new file mode 100644 index 0000000..d67cac0 --- /dev/null +++ b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/index.d.ts @@ -0,0 +1,37 @@ +export declare type Token = + | { type: "StringLiteral"; value: string; closed: boolean } + | { type: "NoSubstitutionTemplate"; value: string; closed: boolean } + | { type: "TemplateHead"; value: string } + | { type: "TemplateMiddle"; value: string } + | { type: "TemplateTail"; value: string; closed: boolean } + | { type: "RegularExpressionLiteral"; value: string; closed: boolean } + | { type: "MultiLineComment"; value: string; closed: boolean } + | { type: "SingleLineComment"; value: string } + | { type: "HashbangComment"; value: string } + | { type: "IdentifierName"; value: string } + | { type: "PrivateIdentifier"; value: string } + | { type: "NumericLiteral"; value: string } + | { type: "Punctuator"; value: string } + | { type: "WhiteSpace"; value: string } + | { type: "LineTerminatorSequence"; value: string } + | { type: "Invalid"; value: string }; + +export declare type JSXToken = + | { type: "JSXString"; value: string; closed: boolean } + | { type: "JSXText"; value: string } + | { type: "JSXIdentifier"; value: string } + | { type: "JSXPunctuator"; value: string } + | { type: "JSXInvalid"; value: string }; + +declare function jsTokens( + input: string, + options: { jsx: true }, +): Iterable; + +declare function jsTokens( + input: string, + options?: { jsx?: boolean }, +): Iterable; + +// @ts-expect-error TypeScript complains about _both_ exporting types _and_ using `export =` but it seems to work fine in practice. +export = jsTokens; diff --git a/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/index.js b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/index.js new file mode 100644 index 0000000..1afeff9 --- /dev/null +++ b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/index.js @@ -0,0 +1,396 @@ +// Copyright 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Simon Lydell +// License: MIT. +var HashbangComment, Identifier, JSXIdentifier, JSXPunctuator, JSXString, JSXText, KeywordsWithExpressionAfter, KeywordsWithNoLineTerminatorAfter, LineTerminatorSequence, MultiLineComment, Newline, NumericLiteral, Punctuator, RegularExpressionLiteral, SingleLineComment, StringLiteral, Template, TokensNotPrecedingObjectLiteral, TokensPrecedingExpression, WhiteSpace, jsTokens; +RegularExpressionLiteral = /\/(?![*\/])(?:\[(?:[^\]\\\n\r\u2028\u2029]+|\\.)*\]?|[^\/[\\\n\r\u2028\u2029]+|\\.)*(\/[$_\u200C\u200D\p{ID_Continue}]*|\\)?/yu; +Punctuator = /--|\+\+|=>|\.{3}|\??\.(?!\d)|(?:&&|\|\||\?\?|[+\-%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2}|\/(?![\/*]))=?|[?~,:;[\](){}]/y; +Identifier = /(\x23?)(?=[$_\p{ID_Start}\\])(?:[$_\u200C\u200D\p{ID_Continue}]+|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+/yu; +StringLiteral = /(['"])(?:[^'"\\\n\r]+|(?!\1)['"]|\\(?:\r\n|[^]))*(\1)?/y; +NumericLiteral = /(?:0[xX][\da-fA-F](?:_?[\da-fA-F])*|0[oO][0-7](?:_?[0-7])*|0[bB][01](?:_?[01])*)n?|0n|[1-9](?:_?\d)*n|(?:(?:0(?!\d)|0\d*[89]\d*|[1-9](?:_?\d)*)(?:\.(?:\d(?:_?\d)*)?)?|\.\d(?:_?\d)*)(?:[eE][+-]?\d(?:_?\d)*)?|0[0-7]+/y; +Template = /[`}](?:[^`\\$]+|\\[^]|\$(?!\{))*(`|\$\{)?/y; +WhiteSpace = /[\t\v\f\ufeff\p{Zs}]+/yu; +LineTerminatorSequence = /\r?\n|[\r\u2028\u2029]/y; +MultiLineComment = /\/\*(?:[^*]+|\*(?!\/))*(\*\/)?/y; +SingleLineComment = /\/\/.*/y; +HashbangComment = /^#!.*/; +JSXPunctuator = /[<>.:={}]|\/(?![\/*])/y; +JSXIdentifier = /[$_\p{ID_Start}][$_\u200C\u200D\p{ID_Continue}-]*/yu; +JSXString = /(['"])(?:[^'"]+|(?!\1)['"])*(\1)?/y; +JSXText = /[^<>{}]+/y; +TokensPrecedingExpression = /^(?:[\/+-]|\.{3}|\?(?:InterpolationIn(?:JSX|Template)|NoLineTerminatorHere|NonExpressionParenEnd|UnaryIncDec))?$|[{}([,;<>=*%&|^!~?:]$/; +TokensNotPrecedingObjectLiteral = /^(?:=>|[;\]){}]|else|\?(?:NoLineTerminatorHere|NonExpressionParenEnd))?$/; +KeywordsWithExpressionAfter = /^(?:await|case|default|delete|do|else|instanceof|new|return|throw|typeof|void|yield)$/; +KeywordsWithNoLineTerminatorAfter = /^(?:return|throw|yield)$/; +Newline = RegExp(LineTerminatorSequence.source); +module.exports = jsTokens = function*(input, {jsx = false} = {}) { + var braces, firstCodePoint, isExpression, lastIndex, lastSignificantToken, length, match, mode, nextLastIndex, nextLastSignificantToken, parenNesting, postfixIncDec, punctuator, stack; + ({length} = input); + lastIndex = 0; + lastSignificantToken = ""; + stack = [ + {tag: "JS"} + ]; + braces = []; + parenNesting = 0; + postfixIncDec = false; + if (match = HashbangComment.exec(input)) { + yield ({ + type: "HashbangComment", + value: match[0] + }); + lastIndex = match[0].length; + } + while (lastIndex < length) { + mode = stack[stack.length - 1]; + switch (mode.tag) { + case "JS": + case "JSNonExpressionParen": + case "InterpolationInTemplate": + case "InterpolationInJSX": + if (input[lastIndex] === "/" && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken))) { + RegularExpressionLiteral.lastIndex = lastIndex; + if (match = RegularExpressionLiteral.exec(input)) { + lastIndex = RegularExpressionLiteral.lastIndex; + lastSignificantToken = match[0]; + postfixIncDec = true; + yield ({ + type: "RegularExpressionLiteral", + value: match[0], + closed: match[1] !== void 0 && match[1] !== "\\" + }); + continue; + } + } + Punctuator.lastIndex = lastIndex; + if (match = Punctuator.exec(input)) { + punctuator = match[0]; + nextLastIndex = Punctuator.lastIndex; + nextLastSignificantToken = punctuator; + switch (punctuator) { + case "(": + if (lastSignificantToken === "?NonExpressionParenKeyword") { + stack.push({ + tag: "JSNonExpressionParen", + nesting: parenNesting + }); + } + parenNesting++; + postfixIncDec = false; + break; + case ")": + parenNesting--; + postfixIncDec = true; + if (mode.tag === "JSNonExpressionParen" && parenNesting === mode.nesting) { + stack.pop(); + nextLastSignificantToken = "?NonExpressionParenEnd"; + postfixIncDec = false; + } + break; + case "{": + Punctuator.lastIndex = 0; + isExpression = !TokensNotPrecedingObjectLiteral.test(lastSignificantToken) && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken)); + braces.push(isExpression); + postfixIncDec = false; + break; + case "}": + switch (mode.tag) { + case "InterpolationInTemplate": + if (braces.length === mode.nesting) { + Template.lastIndex = lastIndex; + match = Template.exec(input); + lastIndex = Template.lastIndex; + lastSignificantToken = match[0]; + if (match[1] === "${") { + lastSignificantToken = "?InterpolationInTemplate"; + postfixIncDec = false; + yield ({ + type: "TemplateMiddle", + value: match[0] + }); + } else { + stack.pop(); + postfixIncDec = true; + yield ({ + type: "TemplateTail", + value: match[0], + closed: match[1] === "`" + }); + } + continue; + } + break; + case "InterpolationInJSX": + if (braces.length === mode.nesting) { + stack.pop(); + lastIndex += 1; + lastSignificantToken = "}"; + yield ({ + type: "JSXPunctuator", + value: "}" + }); + continue; + } + } + postfixIncDec = braces.pop(); + nextLastSignificantToken = postfixIncDec ? "?ExpressionBraceEnd" : "}"; + break; + case "]": + postfixIncDec = true; + break; + case "++": + case "--": + nextLastSignificantToken = postfixIncDec ? "?PostfixIncDec" : "?UnaryIncDec"; + break; + case "<": + if (jsx && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken))) { + stack.push({tag: "JSXTag"}); + lastIndex += 1; + lastSignificantToken = "<"; + yield ({ + type: "JSXPunctuator", + value: punctuator + }); + continue; + } + postfixIncDec = false; + break; + default: + postfixIncDec = false; + } + lastIndex = nextLastIndex; + lastSignificantToken = nextLastSignificantToken; + yield ({ + type: "Punctuator", + value: punctuator + }); + continue; + } + Identifier.lastIndex = lastIndex; + if (match = Identifier.exec(input)) { + lastIndex = Identifier.lastIndex; + nextLastSignificantToken = match[0]; + switch (match[0]) { + case "for": + case "if": + case "while": + case "with": + if (lastSignificantToken !== "." && lastSignificantToken !== "?.") { + nextLastSignificantToken = "?NonExpressionParenKeyword"; + } + } + lastSignificantToken = nextLastSignificantToken; + postfixIncDec = !KeywordsWithExpressionAfter.test(match[0]); + yield ({ + type: match[1] === "#" ? "PrivateIdentifier" : "IdentifierName", + value: match[0] + }); + continue; + } + StringLiteral.lastIndex = lastIndex; + if (match = StringLiteral.exec(input)) { + lastIndex = StringLiteral.lastIndex; + lastSignificantToken = match[0]; + postfixIncDec = true; + yield ({ + type: "StringLiteral", + value: match[0], + closed: match[2] !== void 0 + }); + continue; + } + NumericLiteral.lastIndex = lastIndex; + if (match = NumericLiteral.exec(input)) { + lastIndex = NumericLiteral.lastIndex; + lastSignificantToken = match[0]; + postfixIncDec = true; + yield ({ + type: "NumericLiteral", + value: match[0] + }); + continue; + } + Template.lastIndex = lastIndex; + if (match = Template.exec(input)) { + lastIndex = Template.lastIndex; + lastSignificantToken = match[0]; + if (match[1] === "${") { + lastSignificantToken = "?InterpolationInTemplate"; + stack.push({ + tag: "InterpolationInTemplate", + nesting: braces.length + }); + postfixIncDec = false; + yield ({ + type: "TemplateHead", + value: match[0] + }); + } else { + postfixIncDec = true; + yield ({ + type: "NoSubstitutionTemplate", + value: match[0], + closed: match[1] === "`" + }); + } + continue; + } + break; + case "JSXTag": + case "JSXTagEnd": + JSXPunctuator.lastIndex = lastIndex; + if (match = JSXPunctuator.exec(input)) { + lastIndex = JSXPunctuator.lastIndex; + nextLastSignificantToken = match[0]; + switch (match[0]) { + case "<": + stack.push({tag: "JSXTag"}); + break; + case ">": + stack.pop(); + if (lastSignificantToken === "/" || mode.tag === "JSXTagEnd") { + nextLastSignificantToken = "?JSX"; + postfixIncDec = true; + } else { + stack.push({tag: "JSXChildren"}); + } + break; + case "{": + stack.push({ + tag: "InterpolationInJSX", + nesting: braces.length + }); + nextLastSignificantToken = "?InterpolationInJSX"; + postfixIncDec = false; + break; + case "/": + if (lastSignificantToken === "<") { + stack.pop(); + if (stack[stack.length - 1].tag === "JSXChildren") { + stack.pop(); + } + stack.push({tag: "JSXTagEnd"}); + } + } + lastSignificantToken = nextLastSignificantToken; + yield ({ + type: "JSXPunctuator", + value: match[0] + }); + continue; + } + JSXIdentifier.lastIndex = lastIndex; + if (match = JSXIdentifier.exec(input)) { + lastIndex = JSXIdentifier.lastIndex; + lastSignificantToken = match[0]; + yield ({ + type: "JSXIdentifier", + value: match[0] + }); + continue; + } + JSXString.lastIndex = lastIndex; + if (match = JSXString.exec(input)) { + lastIndex = JSXString.lastIndex; + lastSignificantToken = match[0]; + yield ({ + type: "JSXString", + value: match[0], + closed: match[2] !== void 0 + }); + continue; + } + break; + case "JSXChildren": + JSXText.lastIndex = lastIndex; + if (match = JSXText.exec(input)) { + lastIndex = JSXText.lastIndex; + lastSignificantToken = match[0]; + yield ({ + type: "JSXText", + value: match[0] + }); + continue; + } + switch (input[lastIndex]) { + case "<": + stack.push({tag: "JSXTag"}); + lastIndex++; + lastSignificantToken = "<"; + yield ({ + type: "JSXPunctuator", + value: "<" + }); + continue; + case "{": + stack.push({ + tag: "InterpolationInJSX", + nesting: braces.length + }); + lastIndex++; + lastSignificantToken = "?InterpolationInJSX"; + postfixIncDec = false; + yield ({ + type: "JSXPunctuator", + value: "{" + }); + continue; + } + } + WhiteSpace.lastIndex = lastIndex; + if (match = WhiteSpace.exec(input)) { + lastIndex = WhiteSpace.lastIndex; + yield ({ + type: "WhiteSpace", + value: match[0] + }); + continue; + } + LineTerminatorSequence.lastIndex = lastIndex; + if (match = LineTerminatorSequence.exec(input)) { + lastIndex = LineTerminatorSequence.lastIndex; + postfixIncDec = false; + if (KeywordsWithNoLineTerminatorAfter.test(lastSignificantToken)) { + lastSignificantToken = "?NoLineTerminatorHere"; + } + yield ({ + type: "LineTerminatorSequence", + value: match[0] + }); + continue; + } + MultiLineComment.lastIndex = lastIndex; + if (match = MultiLineComment.exec(input)) { + lastIndex = MultiLineComment.lastIndex; + if (Newline.test(match[0])) { + postfixIncDec = false; + if (KeywordsWithNoLineTerminatorAfter.test(lastSignificantToken)) { + lastSignificantToken = "?NoLineTerminatorHere"; + } + } + yield ({ + type: "MultiLineComment", + value: match[0], + closed: match[1] !== void 0 + }); + continue; + } + SingleLineComment.lastIndex = lastIndex; + if (match = SingleLineComment.exec(input)) { + lastIndex = SingleLineComment.lastIndex; + postfixIncDec = false; + yield ({ + type: "SingleLineComment", + value: match[0] + }); + continue; + } + firstCodePoint = String.fromCodePoint(input.codePointAt(lastIndex)); + lastIndex += firstCodePoint.length; + lastSignificantToken = firstCodePoint; + postfixIncDec = false; + yield ({ + type: mode.tag.startsWith("JSX") ? "JSXInvalid" : "Invalid", + value: firstCodePoint + }); + } + return void 0; +}; diff --git a/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/package.json b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/package.json new file mode 100644 index 0000000..b868c1c --- /dev/null +++ b/sdk/typescript/node_modules/strip-literal/node_modules/js-tokens/package.json @@ -0,0 +1,22 @@ +{ + "name": "js-tokens", + "version": "9.0.1", + "author": "Simon Lydell", + "license": "MIT", + "description": "Tiny JavaScript tokenizer.", + "repository": "lydell/js-tokens", + "type": "commonjs", + "exports": "./index.js", + "keywords": [ + "JavaScript", + "js", + "ECMAScript", + "es", + "token", + "tokens", + "tokenize", + "tokenizer", + "regex", + "regexp" + ] +} diff --git a/sdk/typescript/node_modules/strip-literal/package.json b/sdk/typescript/node_modules/strip-literal/package.json new file mode 100644 index 0000000..4a597af --- /dev/null +++ b/sdk/typescript/node_modules/strip-literal/package.json @@ -0,0 +1,62 @@ +{ + "name": "strip-literal", + "version": "2.1.1", + "packageManager": "pnpm@9.14.2", + "description": "Strip comments and string literals from JavaScript code", + "author": "Anthony Fu ", + "license": "MIT", + "funding": "https://github.com/sponsors/antfu", + "homepage": "https://github.com/antfu/strip-literal#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/antfu/strip-literal.git" + }, + "bugs": { + "url": "https://github.com/antfu/strip-literal/issues" + }, + "keywords": [], + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + } + }, + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "unbuild", + "dev": "unbuild --stub", + "lint": "eslint .", + "prepublishOnly": "nr build", + "release": "bumpp --commit --push --tag && npm publish", + "start": "esmo src/index.ts", + "test": "vitest", + "bench": "vitest bench", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "js-tokens": "^9.0.1" + }, + "devDependencies": { + "@antfu/eslint-config": "^3.9.2", + "@antfu/ni": "^0.23.1", + "@types/node": "^22.9.3", + "bumpp": "^9.8.1", + "eslint": "^9.15.0", + "esmo": "^4.8.0", + "pnpm": "^9.14.2", + "rimraf": "^6.0.1", + "three": "^0.170.0", + "typescript": "^5.7.2", + "unbuild": "^2.0.0", + "vite": "^5.4.11", + "vitest": "^2.1.5", + "vue": "^3.5.13" + } +} diff --git a/sdk/typescript/node_modules/sucrase/LICENSE b/sdk/typescript/node_modules/sucrase/LICENSE new file mode 100644 index 0000000..06d77d6 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012-2018 various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/README.md b/sdk/typescript/node_modules/sucrase/README.md new file mode 100644 index 0000000..c45138a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/README.md @@ -0,0 +1,295 @@ +# Sucrase + +[![Build Status](https://github.com/alangpierce/sucrase/workflows/All%20tests/badge.svg)](https://github.com/alangpierce/sucrase/actions) +[![npm version](https://img.shields.io/npm/v/sucrase.svg)](https://www.npmjs.com/package/sucrase) +[![Install Size](https://packagephobia.now.sh/badge?p=sucrase)](https://packagephobia.now.sh/result?p=sucrase) +[![MIT License](https://img.shields.io/npm/l/express.svg?maxAge=2592000)](LICENSE) +[![Join the chat at https://gitter.im/sucrasejs](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sucrasejs/Lobby) + +## [Try it out](https://sucrase.io) + +## Quick usage + +```bash +yarn add --dev sucrase # Or npm install --save-dev sucrase +node -r sucrase/register main.ts +``` + +Using the [ts-node](https://github.com/TypeStrong/ts-node) integration: + +```bash +yarn add --dev sucrase ts-node typescript +./node_modules/.bin/ts-node --transpiler sucrase/ts-node-plugin main.ts +``` + +## Project overview + +Sucrase is an alternative to Babel that allows super-fast development builds. +Instead of compiling a large range of JS features to be able to work in Internet +Explorer, Sucrase assumes that you're developing with a recent browser or recent +Node.js version, so it focuses on compiling non-standard language extensions: +JSX, TypeScript, and Flow. Because of this smaller scope, Sucrase can get away +with an architecture that is much more performant but less extensible and +maintainable. Sucrase's parser is forked from Babel's parser (so Sucrase is +indebted to Babel and wouldn't be possible without it) and trims it down to a +focused subset of what Babel solves. If it fits your use case, hopefully Sucrase +can speed up your development experience! + +**Sucrase has been extensively tested.** It can successfully build +the [Benchling](https://benchling.com/) frontend code, +[Babel](https://github.com/babel/babel), +[React](https://github.com/facebook/react), +[TSLint](https://github.com/palantir/tslint), +[Apollo client](https://github.com/apollographql/apollo-client), and +[decaffeinate](https://github.com/decaffeinate/decaffeinate) +with all tests passing, about 1 million lines of code total. + +**Sucrase is about 20x faster than Babel.** Here's one measurement of how +Sucrase compares with other tools when compiling the Jest codebase 3 times, +about 360k lines of code total: + +```text + Time Speed +Sucrase 0.57 seconds 636975 lines per second +swc 1.19 seconds 304526 lines per second +esbuild 1.45 seconds 248692 lines per second +TypeScript 8.98 seconds 40240 lines per second +Babel 9.18 seconds 39366 lines per second +``` + +Details: Measured on July 2022. Tools run in single-threaded mode without warm-up. See the +[benchmark code](https://github.com/alangpierce/sucrase/blob/main/benchmark/benchmark.ts) +for methodology and caveats. + +## Transforms + +The main configuration option in Sucrase is an array of transform names. These +transforms are available: + +* **jsx**: Enables JSX syntax. By default, JSX is transformed to `React.createClass`, + but may be preserved or transformed to `_jsx()` by setting the `jsxRuntime` option. + Also adds `createReactClass` display names and JSX context information. +* **typescript**: Compiles TypeScript code to JavaScript, removing type + annotations and handling features like enums. Does not check types. Sucrase + transforms each file independently, so you should enable the `isolatedModules` + TypeScript flag so that the typechecker will disallow the few features like + `const enum`s that need cross-file compilation. The Sucrase option `keepUnusedImports` + can be used to disable all automatic removal of imports and exports, analogous to TS + `verbatimModuleSyntax`. +* **flow**: Removes Flow type annotations. Does not check types. +* **imports**: Transforms ES Modules (`import`/`export`) to CommonJS + (`require`/`module.exports`) using the same approach as Babel and TypeScript + with `--esModuleInterop`. If `preserveDynamicImport` is specified in the Sucrase + options, then dynamic `import` expressions are left alone, which is particularly + useful in Node to load ESM-only libraries. If `preserveDynamicImport` is not + specified, `import` expressions are transformed into a promise-wrapped call to + `require`. +* **react-hot-loader**: Performs the equivalent of the `react-hot-loader/babel` + transform in the [react-hot-loader](https://github.com/gaearon/react-hot-loader) + project. This enables advanced hot reloading use cases such as editing of + bound methods. +* **jest**: Hoist desired [jest](https://jestjs.io/) method calls above imports in + the same way as [babel-plugin-jest-hoist](https://github.com/facebook/jest/tree/master/packages/babel-plugin-jest-hoist). + Does not validate the arguments passed to `jest.mock`, but the same rules still apply. + +When the `imports` transform is *not* specified (i.e. when targeting ESM), the +`injectCreateRequireForImportRequire` option can be specified to transform TS +`import foo = require("foo");` in a way that matches the +[TypeScript 4.7 behavior](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#commonjs-interoperability) +with `module: nodenext`. + +These newer JS features are transformed by default: + +* [Optional chaining](https://github.com/tc39/proposal-optional-chaining): `a?.b` +* [Nullish coalescing](https://github.com/tc39/proposal-nullish-coalescing): `a ?? b` +* [Class fields](https://github.com/tc39/proposal-class-fields): `class C { x = 1; }`. + This includes static fields but not the `#x` private field syntax. +* [Numeric separators](https://github.com/tc39/proposal-numeric-separator): + `const n = 1_234;` +* [Optional catch binding](https://github.com/tc39/proposal-optional-catch-binding): + `try { doThing(); } catch { }`. + +If your target runtime supports these features, you can specify +`disableESTransforms: true` so that Sucrase preserves the syntax rather than +trying to transform it. Note that transpiled and standard class fields behave +slightly differently; see the +[TypeScript 3.7 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#the-usedefineforclassfields-flag-and-the-declare-property-modifier) +for details. If you use TypeScript, you can enable the TypeScript option +`useDefineForClassFields` to enable error checking related to these differences. + +### Unsupported syntax + +All JS syntax not mentioned above will "pass through" and needs to be supported +by your JS runtime. For example: + +* Decorators, private fields, `throw` expressions, generator arrow functions, + and `do` expressions are all unsupported in browsers and Node (as of this + writing), and Sucrase doesn't make an attempt to transpile them. +* Object rest/spread, async functions, and async iterators are all recent + features that should work fine, but might cause issues if you use older + versions of tools like webpack. BigInt and newer regex features may or may not + work, based on your tooling. + +### JSX Options + +By default, JSX is compiled to React functions in development mode. This can be +configured with a few options: + +* **jsxRuntime**: A string specifying the transform mode, which can be one of three values: + * `"classic"` (default): The original JSX transform that calls `React.createElement` by default. + To configure for non-React use cases, specify: + * **jsxPragma**: Element creation function, defaults to `React.createElement`. + * **jsxFragmentPragma**: Fragment component, defaults to `React.Fragment`. + * `"automatic"`: The [new JSX transform](https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html) + introduced with React 17, which calls `jsx` functions and auto-adds import statements. + To configure for non-React use cases, specify: + * **jsxImportSource**: Package name for auto-generated import statements, defaults to `react`. + * `"preserve"`: Don't transform JSX, and instead emit it as-is in the output code. +* **production**: If `true`, use production version of functions and don't include debugging + information. When using React in production mode with the automatic transform, this *must* be + set to true to avoid an error about `jsxDEV` being missing. + +### Legacy CommonJS interop + +Two legacy modes can be used with the `imports` transform: + +* **enableLegacyTypeScriptModuleInterop**: Use the default TypeScript approach + to CommonJS interop instead of assuming that TypeScript's `--esModuleInterop` + flag is enabled. For example, if a CJS module exports a function, legacy + TypeScript interop requires you to write `import * as add from './add';`, + while Babel, Webpack, Node.js, and TypeScript with `--esModuleInterop` require + you to write `import add from './add';`. As mentioned in the + [docs](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#support-for-import-d-from-cjs-form-commonjs-modules-with---esmoduleinterop), + the TypeScript team recommends you always use `--esModuleInterop`. +* **enableLegacyBabel5ModuleInterop**: Use the Babel 5 approach to CommonJS + interop, so that you can run `require('./MyModule')` instead of + `require('./MyModule').default`. Analogous to + [babel-plugin-add-module-exports](https://github.com/59naga/babel-plugin-add-module-exports). + +## Usage + +### Tool integrations + +* [Webpack](https://github.com/alangpierce/sucrase/tree/main/integrations/webpack-loader) +* [Gulp](https://github.com/alangpierce/sucrase/tree/main/integrations/gulp-plugin) +* [Jest](https://github.com/alangpierce/sucrase/tree/main/integrations/jest-plugin) +* [Rollup](https://github.com/rollup/plugins/tree/master/packages/sucrase) +* [Broccoli](https://github.com/stefanpenner/broccoli-sucrase) + +### Usage in Node + +The most robust way is to use the Sucrase plugin for [ts-node](https://github.com/TypeStrong/ts-node), +which has various Node integrations and configures Sucrase via `tsconfig.json`: +```bash +ts-node --transpiler sucrase/ts-node-plugin +``` + +For projects that don't target ESM, Sucrase also has a require hook with some +reasonable defaults that can be accessed in a few ways: + +* From code: `require("sucrase/register");` +* When invoking Node: `node -r sucrase/register main.ts` +* As a separate binary: `sucrase-node main.ts` + +Options can be passed to the require hook via a `SUCRASE_OPTIONS` environment +variable holding a JSON string of options. + +### Compiling a project to JS + +For simple use cases, Sucrase comes with a `sucrase` CLI that mirrors your +directory structure to an output directory: +```bash +sucrase ./srcDir -d ./outDir --transforms typescript,imports +``` + +### Usage from code + +For any advanced use cases, Sucrase can be called from JS directly: + +```js +import {transform} from "sucrase"; +const compiledCode = transform(code, {transforms: ["typescript", "imports"]}).code; +``` + +## What Sucrase is not + +Sucrase is intended to be useful for the most common cases, but it does not aim +to have nearly the scope and versatility of Babel. Some specific examples: + +* Sucrase does not check your code for errors. Sucrase's contract is that if you + give it valid code, it will produce valid JS code. If you give it invalid + code, it might produce invalid code, it might produce valid code, or it might + give an error. Always use Sucrase with a linter or typechecker, which is more + suited for error-checking. +* Sucrase is not pluginizable. With the current architecture, transforms need to + be explicitly written to cooperate with each other, so each additional + transform takes significant extra work. +* Sucrase is not good for prototyping language extensions and upcoming language + features. Its faster architecture makes new transforms more difficult to write + and more fragile. +* Sucrase will never produce code for old browsers like IE. Compiling code down + to ES5 is much more complicated than any transformation that Sucrase needs to + do. +* Sucrase is hesitant to implement upcoming JS features, although some of them + make sense to implement for pragmatic reasons. Its main focus is on language + extensions (JSX, TypeScript, Flow) that will never be supported by JS + runtimes. +* Like Babel, Sucrase is not a typechecker, and must process each file in + isolation. For example, TypeScript `const enum`s are treated as regular + `enum`s rather than inlining across files. +* You should think carefully before using Sucrase in production. Sucrase is + mostly beneficial in development, and in many cases, Babel or tsc will be more + suitable for production builds. + +See the [Project Vision](./docs/PROJECT_VISION.md) document for more details on +the philosophy behind Sucrase. + +## Motivation + +As JavaScript implementations mature, it becomes more and more reasonable to +disable Babel transforms, especially in development when you know that you're +targeting a modern runtime. You might hope that you could simplify and speed up +the build step by eventually disabling Babel entirely, but this isn't possible +if you're using a non-standard language extension like JSX, TypeScript, or Flow. +Unfortunately, disabling most transforms in Babel doesn't speed it up as much as +you might expect. To understand, let's take a look at how Babel works: + +1. Tokenize the input source code into a token stream. +2. Parse the token stream into an AST. +3. Walk the AST to compute the scope information for each variable. +4. Apply all transform plugins in a single traversal, resulting in a new AST. +5. Print the resulting AST. + +Only step 4 gets faster when disabling plugins, so there's always a fixed cost +to running Babel regardless of how many transforms are enabled. + +Sucrase bypasses most of these steps, and works like this: + +1. Tokenize the input source code into a token stream using a trimmed-down fork + of the Babel parser. This fork does not produce a full AST, but still + produces meaningful token metadata specifically designed for the later + transforms. +2. Scan through the tokens, computing preliminary information like all + imported/exported names. +3. Run the transform by doing a pass through the tokens and performing a number + of careful find-and-replace operations, like replacing ` + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/README.md b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/README.md new file mode 100644 index 0000000..93692b1 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/README.md @@ -0,0 +1,227 @@ +# @jridgewell/gen-mapping + +> Generate source maps + +`gen-mapping` allows you to generate a source map during transpilation or minification. +With a source map, you're able to trace the original location in the source file, either in Chrome's +DevTools or using a library like [`@jridgewell/trace-mapping`][trace-mapping]. + +You may already be familiar with the [`source-map`][source-map] package's `SourceMapGenerator`. This +provides the same `addMapping` and `setSourceContent` API. + +## Installation + +```sh +npm install @jridgewell/gen-mapping +``` + +## Usage + +```typescript +import { GenMapping, addMapping, setSourceContent, toEncodedMap, toDecodedMap } from '@jridgewell/gen-mapping'; + +const map = new GenMapping({ + file: 'output.js', + sourceRoot: 'https://example.com/', +}); + +setSourceContent(map, 'input.js', `function foo() {}`); + +addMapping(map, { + // Lines start at line 1, columns at column 0. + generated: { line: 1, column: 0 }, + source: 'input.js', + original: { line: 1, column: 0 }, +}); + +addMapping(map, { + generated: { line: 1, column: 9 }, + source: 'input.js', + original: { line: 1, column: 9 }, + name: 'foo', +}); + +assert.deepEqual(toDecodedMap(map), { + version: 3, + file: 'output.js', + names: ['foo'], + sourceRoot: 'https://example.com/', + sources: ['input.js'], + sourcesContent: ['function foo() {}'], + mappings: [ + [ [0, 0, 0, 0], [9, 0, 0, 9, 0] ] + ], +}); + +assert.deepEqual(toEncodedMap(map), { + version: 3, + file: 'output.js', + names: ['foo'], + sourceRoot: 'https://example.com/', + sources: ['input.js'], + sourcesContent: ['function foo() {}'], + mappings: 'AAAA,SAASA', +}); +``` + +### Smaller Sourcemaps + +Not everything needs to be added to a sourcemap, and needless markings can cause signficantly +larger file sizes. `gen-mapping` exposes `maybeAddSegment`/`maybeAddMapping` APIs that will +intelligently determine if this marking adds useful information. If not, the marking will be +skipped. + +```typescript +import { maybeAddMapping } from '@jridgewell/gen-mapping'; + +const map = new GenMapping(); + +// Adding a sourceless marking at the beginning of a line isn't useful. +maybeAddMapping(map, { + generated: { line: 1, column: 0 }, +}); + +// Adding a new source marking is useful. +maybeAddMapping(map, { + generated: { line: 1, column: 0 }, + source: 'input.js', + original: { line: 1, column: 0 }, +}); + +// But adding another marking pointing to the exact same original location isn't, even if the +// generated column changed. +maybeAddMapping(map, { + generated: { line: 1, column: 9 }, + source: 'input.js', + original: { line: 1, column: 0 }, +}); + +assert.deepEqual(toEncodedMap(map), { + version: 3, + names: [], + sources: ['input.js'], + sourcesContent: [null], + mappings: 'AAAA', +}); +``` + +## Benchmarks + +``` +node v18.0.0 + +amp.js.map +Memory Usage: +gen-mapping: addSegment 5852872 bytes +gen-mapping: addMapping 7716042 bytes +source-map-js 6143250 bytes +source-map-0.6.1 6124102 bytes +source-map-0.8.0 6121173 bytes +Smallest memory usage is gen-mapping: addSegment + +Adding speed: +gen-mapping: addSegment x 441 ops/sec ±2.07% (90 runs sampled) +gen-mapping: addMapping x 350 ops/sec ±2.40% (86 runs sampled) +source-map-js: addMapping x 169 ops/sec ±2.42% (80 runs sampled) +source-map-0.6.1: addMapping x 167 ops/sec ±2.56% (80 runs sampled) +source-map-0.8.0: addMapping x 168 ops/sec ±2.52% (80 runs sampled) +Fastest is gen-mapping: addSegment + +Generate speed: +gen-mapping: decoded output x 150,824,370 ops/sec ±0.07% (102 runs sampled) +gen-mapping: encoded output x 663 ops/sec ±0.22% (98 runs sampled) +source-map-js: encoded output x 197 ops/sec ±0.45% (84 runs sampled) +source-map-0.6.1: encoded output x 198 ops/sec ±0.33% (85 runs sampled) +source-map-0.8.0: encoded output x 197 ops/sec ±0.06% (93 runs sampled) +Fastest is gen-mapping: decoded output + + +*** + + +babel.min.js.map +Memory Usage: +gen-mapping: addSegment 37578063 bytes +gen-mapping: addMapping 37212897 bytes +source-map-js 47638527 bytes +source-map-0.6.1 47690503 bytes +source-map-0.8.0 47470188 bytes +Smallest memory usage is gen-mapping: addMapping + +Adding speed: +gen-mapping: addSegment x 31.05 ops/sec ±8.31% (43 runs sampled) +gen-mapping: addMapping x 29.83 ops/sec ±7.36% (51 runs sampled) +source-map-js: addMapping x 20.73 ops/sec ±6.22% (38 runs sampled) +source-map-0.6.1: addMapping x 20.03 ops/sec ±10.51% (38 runs sampled) +source-map-0.8.0: addMapping x 19.30 ops/sec ±8.27% (37 runs sampled) +Fastest is gen-mapping: addSegment + +Generate speed: +gen-mapping: decoded output x 381,379,234 ops/sec ±0.29% (96 runs sampled) +gen-mapping: encoded output x 95.15 ops/sec ±2.98% (72 runs sampled) +source-map-js: encoded output x 15.20 ops/sec ±7.41% (33 runs sampled) +source-map-0.6.1: encoded output x 16.36 ops/sec ±10.46% (31 runs sampled) +source-map-0.8.0: encoded output x 16.06 ops/sec ±6.45% (31 runs sampled) +Fastest is gen-mapping: decoded output + + +*** + + +preact.js.map +Memory Usage: +gen-mapping: addSegment 416247 bytes +gen-mapping: addMapping 419824 bytes +source-map-js 1024619 bytes +source-map-0.6.1 1146004 bytes +source-map-0.8.0 1113250 bytes +Smallest memory usage is gen-mapping: addSegment + +Adding speed: +gen-mapping: addSegment x 13,755 ops/sec ±0.15% (98 runs sampled) +gen-mapping: addMapping x 13,013 ops/sec ±0.11% (101 runs sampled) +source-map-js: addMapping x 4,564 ops/sec ±0.21% (98 runs sampled) +source-map-0.6.1: addMapping x 4,562 ops/sec ±0.11% (99 runs sampled) +source-map-0.8.0: addMapping x 4,593 ops/sec ±0.11% (100 runs sampled) +Fastest is gen-mapping: addSegment + +Generate speed: +gen-mapping: decoded output x 379,864,020 ops/sec ±0.23% (93 runs sampled) +gen-mapping: encoded output x 14,368 ops/sec ±4.07% (82 runs sampled) +source-map-js: encoded output x 5,261 ops/sec ±0.21% (99 runs sampled) +source-map-0.6.1: encoded output x 5,124 ops/sec ±0.58% (99 runs sampled) +source-map-0.8.0: encoded output x 5,434 ops/sec ±0.33% (96 runs sampled) +Fastest is gen-mapping: decoded output + + +*** + + +react.js.map +Memory Usage: +gen-mapping: addSegment 975096 bytes +gen-mapping: addMapping 1102981 bytes +source-map-js 2918836 bytes +source-map-0.6.1 2885435 bytes +source-map-0.8.0 2874336 bytes +Smallest memory usage is gen-mapping: addSegment + +Adding speed: +gen-mapping: addSegment x 4,772 ops/sec ±0.15% (100 runs sampled) +gen-mapping: addMapping x 4,456 ops/sec ±0.13% (97 runs sampled) +source-map-js: addMapping x 1,618 ops/sec ±0.24% (97 runs sampled) +source-map-0.6.1: addMapping x 1,622 ops/sec ±0.12% (99 runs sampled) +source-map-0.8.0: addMapping x 1,631 ops/sec ±0.12% (100 runs sampled) +Fastest is gen-mapping: addSegment + +Generate speed: +gen-mapping: decoded output x 379,107,695 ops/sec ±0.07% (99 runs sampled) +gen-mapping: encoded output x 5,421 ops/sec ±1.60% (89 runs sampled) +source-map-js: encoded output x 2,113 ops/sec ±1.81% (98 runs sampled) +source-map-0.6.1: encoded output x 2,126 ops/sec ±0.10% (100 runs sampled) +source-map-0.8.0: encoded output x 2,176 ops/sec ±0.39% (98 runs sampled) +Fastest is gen-mapping: decoded output +``` + +[source-map]: https://www.npmjs.com/package/source-map +[trace-mapping]: https://github.com/jridgewell/sourcemaps/tree/main/packages/trace-mapping diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/package.json b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/package.json new file mode 100644 index 0000000..036f9b7 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/package.json @@ -0,0 +1,67 @@ +{ + "name": "@jridgewell/gen-mapping", + "version": "0.3.13", + "description": "Generate source maps", + "keywords": [ + "source", + "map" + ], + "main": "dist/gen-mapping.umd.js", + "module": "dist/gen-mapping.mjs", + "types": "types/gen-mapping.d.cts", + "files": [ + "dist", + "src", + "types" + ], + "exports": { + ".": [ + { + "import": { + "types": "./types/gen-mapping.d.mts", + "default": "./dist/gen-mapping.mjs" + }, + "default": { + "types": "./types/gen-mapping.d.cts", + "default": "./dist/gen-mapping.umd.js" + } + }, + "./dist/gen-mapping.umd.js" + ], + "./package.json": "./package.json" + }, + "scripts": { + "benchmark": "run-s build:code benchmark:*", + "benchmark:install": "cd benchmark && npm install", + "benchmark:only": "node --expose-gc benchmark/index.js", + "build": "run-s -n build:code build:types", + "build:code": "node ../../esbuild.mjs gen-mapping.ts", + "build:types": "run-s build:types:force build:types:emit build:types:mts", + "build:types:force": "rimraf tsconfig.build.tsbuildinfo", + "build:types:emit": "tsc --project tsconfig.build.json", + "build:types:mts": "node ../../mts-types.mjs", + "clean": "run-s -n clean:code clean:types", + "clean:code": "tsc --build --clean tsconfig.build.json", + "clean:types": "rimraf dist types", + "test": "run-s -n test:types test:only test:format", + "test:format": "prettier --check '{src,test}/**/*.ts'", + "test:only": "mocha", + "test:types": "eslint '{src,test}/**/*.ts'", + "lint": "run-s -n lint:types lint:format", + "lint:format": "npm run test:format -- --write", + "lint:types": "npm run test:types -- --fix", + "prepublishOnly": "npm run-s -n build test" + }, + "homepage": "https://github.com/jridgewell/sourcemaps/tree/main/packages/gen-mapping", + "repository": { + "type": "git", + "url": "git+https://github.com/jridgewell/sourcemaps.git", + "directory": "packages/gen-mapping" + }, + "author": "Justin Ridgewell ", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts new file mode 100644 index 0000000..ecc878c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts @@ -0,0 +1,614 @@ +import { SetArray, put, remove } from './set-array'; +import { + encode, + // encodeGeneratedRanges, + // encodeOriginalScopes +} from '@jridgewell/sourcemap-codec'; +import { TraceMap, decodedMappings } from '@jridgewell/trace-mapping'; + +import { + COLUMN, + SOURCES_INDEX, + SOURCE_LINE, + SOURCE_COLUMN, + NAMES_INDEX, +} from './sourcemap-segment'; + +import type { SourceMapInput } from '@jridgewell/trace-mapping'; +// import type { OriginalScope, GeneratedRange } from '@jridgewell/sourcemap-codec'; +import type { SourceMapSegment } from './sourcemap-segment'; +import type { + DecodedSourceMap, + EncodedSourceMap, + Pos, + Mapping, + // BindingExpressionRange, + // OriginalPos, + // OriginalScopeInfo, + // GeneratedRangeInfo, +} from './types'; + +export type { DecodedSourceMap, EncodedSourceMap, Mapping }; + +export type Options = { + file?: string | null; + sourceRoot?: string | null; +}; + +const NO_NAME = -1; + +/** + * Provides the state to generate a sourcemap. + */ +export class GenMapping { + declare private _names: SetArray; + declare private _sources: SetArray; + declare private _sourcesContent: (string | null)[]; + declare private _mappings: SourceMapSegment[][]; + // private declare _originalScopes: OriginalScope[][]; + // private declare _generatedRanges: GeneratedRange[]; + declare private _ignoreList: SetArray; + declare file: string | null | undefined; + declare sourceRoot: string | null | undefined; + + constructor({ file, sourceRoot }: Options = {}) { + this._names = new SetArray(); + this._sources = new SetArray(); + this._sourcesContent = []; + this._mappings = []; + // this._originalScopes = []; + // this._generatedRanges = []; + this.file = file; + this.sourceRoot = sourceRoot; + this._ignoreList = new SetArray(); + } +} + +interface PublicMap { + _names: GenMapping['_names']; + _sources: GenMapping['_sources']; + _sourcesContent: GenMapping['_sourcesContent']; + _mappings: GenMapping['_mappings']; + // _originalScopes: GenMapping['_originalScopes']; + // _generatedRanges: GenMapping['_generatedRanges']; + _ignoreList: GenMapping['_ignoreList']; +} + +/** + * Typescript doesn't allow friend access to private fields, so this just casts the map into a type + * with public access modifiers. + */ +function cast(map: unknown): PublicMap { + return map as any; +} + +/** + * A low-level API to associate a generated position with an original source position. Line and + * column here are 0-based, unlike `addMapping`. + */ +export function addSegment( + map: GenMapping, + genLine: number, + genColumn: number, + source?: null, + sourceLine?: null, + sourceColumn?: null, + name?: null, + content?: null, +): void; +export function addSegment( + map: GenMapping, + genLine: number, + genColumn: number, + source: string, + sourceLine: number, + sourceColumn: number, + name?: null, + content?: string | null, +): void; +export function addSegment( + map: GenMapping, + genLine: number, + genColumn: number, + source: string, + sourceLine: number, + sourceColumn: number, + name: string, + content?: string | null, +): void; +export function addSegment( + map: GenMapping, + genLine: number, + genColumn: number, + source?: string | null, + sourceLine?: number | null, + sourceColumn?: number | null, + name?: string | null, + content?: string | null, +): void { + return addSegmentInternal( + false, + map, + genLine, + genColumn, + source, + sourceLine, + sourceColumn, + name, + content, + ); +} + +/** + * A high-level API to associate a generated position with an original source position. Line is + * 1-based, but column is 0-based, due to legacy behavior in `source-map` library. + */ +export function addMapping( + map: GenMapping, + mapping: { + generated: Pos; + source?: null; + original?: null; + name?: null; + content?: null; + }, +): void; +export function addMapping( + map: GenMapping, + mapping: { + generated: Pos; + source: string; + original: Pos; + name?: null; + content?: string | null; + }, +): void; +export function addMapping( + map: GenMapping, + mapping: { + generated: Pos; + source: string; + original: Pos; + name: string; + content?: string | null; + }, +): void; +export function addMapping( + map: GenMapping, + mapping: { + generated: Pos; + source?: string | null; + original?: Pos | null; + name?: string | null; + content?: string | null; + }, +): void { + return addMappingInternal(false, map, mapping as Parameters[2]); +} + +/** + * Same as `addSegment`, but will only add the segment if it generates useful information in the + * resulting map. This only works correctly if segments are added **in order**, meaning you should + * not add a segment with a lower generated line/column than one that came before. + */ +export const maybeAddSegment: typeof addSegment = ( + map, + genLine, + genColumn, + source, + sourceLine, + sourceColumn, + name, + content, +) => { + return addSegmentInternal( + true, + map, + genLine, + genColumn, + source, + sourceLine, + sourceColumn, + name, + content, + ); +}; + +/** + * Same as `addMapping`, but will only add the mapping if it generates useful information in the + * resulting map. This only works correctly if mappings are added **in order**, meaning you should + * not add a mapping with a lower generated line/column than one that came before. + */ +export const maybeAddMapping: typeof addMapping = (map, mapping) => { + return addMappingInternal(true, map, mapping as Parameters[2]); +}; + +/** + * Adds/removes the content of the source file to the source map. + */ +export function setSourceContent(map: GenMapping, source: string, content: string | null): void { + const { + _sources: sources, + _sourcesContent: sourcesContent, + // _originalScopes: originalScopes, + } = cast(map); + const index = put(sources, source); + sourcesContent[index] = content; + // if (index === originalScopes.length) originalScopes[index] = []; +} + +export function setIgnore(map: GenMapping, source: string, ignore = true) { + const { + _sources: sources, + _sourcesContent: sourcesContent, + _ignoreList: ignoreList, + // _originalScopes: originalScopes, + } = cast(map); + const index = put(sources, source); + if (index === sourcesContent.length) sourcesContent[index] = null; + // if (index === originalScopes.length) originalScopes[index] = []; + if (ignore) put(ignoreList, index); + else remove(ignoreList, index); +} + +/** + * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export function toDecodedMap(map: GenMapping): DecodedSourceMap { + const { + _mappings: mappings, + _sources: sources, + _sourcesContent: sourcesContent, + _names: names, + _ignoreList: ignoreList, + // _originalScopes: originalScopes, + // _generatedRanges: generatedRanges, + } = cast(map); + removeEmptyFinalLines(mappings); + + return { + version: 3, + file: map.file || undefined, + names: names.array, + sourceRoot: map.sourceRoot || undefined, + sources: sources.array, + sourcesContent, + mappings, + // originalScopes, + // generatedRanges, + ignoreList: ignoreList.array, + }; +} + +/** + * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export function toEncodedMap(map: GenMapping): EncodedSourceMap { + const decoded = toDecodedMap(map); + return Object.assign({}, decoded, { + // originalScopes: decoded.originalScopes.map((os) => encodeOriginalScopes(os)), + // generatedRanges: encodeGeneratedRanges(decoded.generatedRanges as GeneratedRange[]), + mappings: encode(decoded.mappings as SourceMapSegment[][]), + }); +} + +/** + * Constructs a new GenMapping, using the already present mappings of the input. + */ +export function fromMap(input: SourceMapInput): GenMapping { + const map = new TraceMap(input); + const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot }); + + putAll(cast(gen)._names, map.names); + putAll(cast(gen)._sources, map.sources as string[]); + cast(gen)._sourcesContent = map.sourcesContent || map.sources.map(() => null); + cast(gen)._mappings = decodedMappings(map) as GenMapping['_mappings']; + // TODO: implement originalScopes/generatedRanges + if (map.ignoreList) putAll(cast(gen)._ignoreList, map.ignoreList); + + return gen; +} + +/** + * Returns an array of high-level mapping objects for every recorded segment, which could then be + * passed to the `source-map` library. + */ +export function allMappings(map: GenMapping): Mapping[] { + const out: Mapping[] = []; + const { _mappings: mappings, _sources: sources, _names: names } = cast(map); + + for (let i = 0; i < mappings.length; i++) { + const line = mappings[i]; + for (let j = 0; j < line.length; j++) { + const seg = line[j]; + + const generated = { line: i + 1, column: seg[COLUMN] }; + let source: string | undefined = undefined; + let original: Pos | undefined = undefined; + let name: string | undefined = undefined; + + if (seg.length !== 1) { + source = sources.array[seg[SOURCES_INDEX]]; + original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] }; + + if (seg.length === 5) name = names.array[seg[NAMES_INDEX]]; + } + + out.push({ generated, source, original, name } as Mapping); + } + } + + return out; +} + +// This split declaration is only so that terser can elminiate the static initialization block. +function addSegmentInternal( + skipable: boolean, + map: GenMapping, + genLine: number, + genColumn: number, + source: S, + sourceLine: S extends string ? number : null | undefined, + sourceColumn: S extends string ? number : null | undefined, + name: S extends string ? string | null | undefined : null | undefined, + content: S extends string ? string | null | undefined : null | undefined, +): void { + const { + _mappings: mappings, + _sources: sources, + _sourcesContent: sourcesContent, + _names: names, + // _originalScopes: originalScopes, + } = cast(map); + const line = getIndex(mappings, genLine); + const index = getColumnIndex(line, genColumn); + + if (!source) { + if (skipable && skipSourceless(line, index)) return; + return insert(line, index, [genColumn]); + } + + // Sigh, TypeScript can't figure out sourceLine and sourceColumn aren't nullish if source + // isn't nullish. + assert(sourceLine); + assert(sourceColumn); + + const sourcesIndex = put(sources, source); + const namesIndex = name ? put(names, name) : NO_NAME; + if (sourcesIndex === sourcesContent.length) sourcesContent[sourcesIndex] = content ?? null; + // if (sourcesIndex === originalScopes.length) originalScopes[sourcesIndex] = []; + + if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) { + return; + } + + return insert( + line, + index, + name + ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex] + : [genColumn, sourcesIndex, sourceLine, sourceColumn], + ); +} + +function assert(_val: unknown): asserts _val is T { + // noop. +} + +function getIndex(arr: T[][], index: number): T[] { + for (let i = arr.length; i <= index; i++) { + arr[i] = []; + } + return arr[index]; +} + +function getColumnIndex(line: SourceMapSegment[], genColumn: number): number { + let index = line.length; + for (let i = index - 1; i >= 0; index = i--) { + const current = line[i]; + if (genColumn >= current[COLUMN]) break; + } + return index; +} + +function insert(array: T[], index: number, value: T) { + for (let i = array.length; i > index; i--) { + array[i] = array[i - 1]; + } + array[index] = value; +} + +function removeEmptyFinalLines(mappings: SourceMapSegment[][]) { + const { length } = mappings; + let len = length; + for (let i = len - 1; i >= 0; len = i, i--) { + if (mappings[i].length > 0) break; + } + if (len < length) mappings.length = len; +} + +function putAll(setarr: SetArray, array: T[]) { + for (let i = 0; i < array.length; i++) put(setarr, array[i]); +} + +function skipSourceless(line: SourceMapSegment[], index: number): boolean { + // The start of a line is already sourceless, so adding a sourceless segment to the beginning + // doesn't generate any useful information. + if (index === 0) return true; + + const prev = line[index - 1]; + // If the previous segment is also sourceless, then adding another sourceless segment doesn't + // genrate any new information. Else, this segment will end the source/named segment and point to + // a sourceless position, which is useful. + return prev.length === 1; +} + +function skipSource( + line: SourceMapSegment[], + index: number, + sourcesIndex: number, + sourceLine: number, + sourceColumn: number, + namesIndex: number, +): boolean { + // A source/named segment at the start of a line gives position at that genColumn + if (index === 0) return false; + + const prev = line[index - 1]; + + // If the previous segment is sourceless, then we're transitioning to a source. + if (prev.length === 1) return false; + + // If the previous segment maps to the exact same source position, then this segment doesn't + // provide any new position information. + return ( + sourcesIndex === prev[SOURCES_INDEX] && + sourceLine === prev[SOURCE_LINE] && + sourceColumn === prev[SOURCE_COLUMN] && + namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME) + ); +} + +function addMappingInternal( + skipable: boolean, + map: GenMapping, + mapping: { + generated: Pos; + source: S; + original: S extends string ? Pos : null | undefined; + name: S extends string ? string | null | undefined : null | undefined; + content: S extends string ? string | null | undefined : null | undefined; + }, +) { + const { generated, source, original, name, content } = mapping; + if (!source) { + return addSegmentInternal( + skipable, + map, + generated.line - 1, + generated.column, + null, + null, + null, + null, + null, + ); + } + assert(original); + return addSegmentInternal( + skipable, + map, + generated.line - 1, + generated.column, + source as string, + original.line - 1, + original.column, + name, + content, + ); +} + +/* +export function addOriginalScope( + map: GenMapping, + data: { + start: Pos; + end: Pos; + source: string; + kind: string; + name?: string; + variables?: string[]; + }, +): OriginalScopeInfo { + const { start, end, source, kind, name, variables } = data; + const { + _sources: sources, + _sourcesContent: sourcesContent, + _originalScopes: originalScopes, + _names: names, + } = cast(map); + const index = put(sources, source); + if (index === sourcesContent.length) sourcesContent[index] = null; + if (index === originalScopes.length) originalScopes[index] = []; + + const kindIndex = put(names, kind); + const scope: OriginalScope = name + ? [start.line - 1, start.column, end.line - 1, end.column, kindIndex, put(names, name)] + : [start.line - 1, start.column, end.line - 1, end.column, kindIndex]; + if (variables) { + scope.vars = variables.map((v) => put(names, v)); + } + const len = originalScopes[index].push(scope); + return [index, len - 1, variables]; +} +*/ + +// Generated Ranges +/* +export function addGeneratedRange( + map: GenMapping, + data: { + start: Pos; + isScope: boolean; + originalScope?: OriginalScopeInfo; + callsite?: OriginalPos; + }, +): GeneratedRangeInfo { + const { start, isScope, originalScope, callsite } = data; + const { + _originalScopes: originalScopes, + _sources: sources, + _sourcesContent: sourcesContent, + _generatedRanges: generatedRanges, + } = cast(map); + + const range: GeneratedRange = [ + start.line - 1, + start.column, + 0, + 0, + originalScope ? originalScope[0] : -1, + originalScope ? originalScope[1] : -1, + ]; + if (originalScope?.[2]) { + range.bindings = originalScope[2].map(() => [[-1]]); + } + if (callsite) { + const index = put(sources, callsite.source); + if (index === sourcesContent.length) sourcesContent[index] = null; + if (index === originalScopes.length) originalScopes[index] = []; + range.callsite = [index, callsite.line - 1, callsite.column]; + } + if (isScope) range.isScope = true; + generatedRanges.push(range); + + return [range, originalScope?.[2]]; +} + +export function setEndPosition(range: GeneratedRangeInfo, pos: Pos) { + range[0][2] = pos.line - 1; + range[0][3] = pos.column; +} + +export function addBinding( + map: GenMapping, + range: GeneratedRangeInfo, + variable: string, + expression: string | BindingExpressionRange, +) { + const { _names: names } = cast(map); + const bindings = (range[0].bindings ||= []); + const vars = range[1]; + + const index = vars!.indexOf(variable); + const binding = getIndex(bindings, index); + + if (typeof expression === 'string') binding[0] = [put(names, expression)]; + else { + const { start } = expression; + binding.push([put(names, expression.expression), start.line - 1, start.column]); + } +} +*/ diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/set-array.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/set-array.ts new file mode 100644 index 0000000..a2a73a5 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/set-array.ts @@ -0,0 +1,82 @@ +type Key = string | number | symbol; + +/** + * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the + * index of the `key` in the backing array. + * + * This is designed to allow synchronizing a second array with the contents of the backing array, + * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, + * and there are never duplicates. + */ +export class SetArray { + declare private _indexes: Record; + declare array: readonly T[]; + + constructor() { + this._indexes = { __proto__: null } as any; + this.array = []; + } +} + +interface PublicSet { + array: T[]; + _indexes: SetArray['_indexes']; +} + +/** + * Typescript doesn't allow friend access to private fields, so this just casts the set into a type + * with public access modifiers. + */ +function cast(set: SetArray): PublicSet { + return set as any; +} + +/** + * Gets the index associated with `key` in the backing array, if it is already present. + */ +export function get(setarr: SetArray, key: T): number | undefined { + return cast(setarr)._indexes[key]; +} + +/** + * Puts `key` into the backing array, if it is not already present. Returns + * the index of the `key` in the backing array. + */ +export function put(setarr: SetArray, key: T): number { + // The key may or may not be present. If it is present, it's a number. + const index = get(setarr, key); + if (index !== undefined) return index; + + const { array, _indexes: indexes } = cast(setarr); + + const length = array.push(key); + return (indexes[key] = length - 1); +} + +/** + * Pops the last added item out of the SetArray. + */ +export function pop(setarr: SetArray): void { + const { array, _indexes: indexes } = cast(setarr); + if (array.length === 0) return; + + const last = array.pop()!; + indexes[last] = undefined; +} + +/** + * Removes the key, if it exists in the set. + */ +export function remove(setarr: SetArray, key: T): void { + const index = get(setarr, key); + if (index === undefined) return; + + const { array, _indexes: indexes } = cast(setarr); + for (let i = index + 1; i < array.length; i++) { + const k = array[i]; + array[i - 1] = k; + indexes[k]!--; + } + indexes[key] = undefined; + array.pop(); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts new file mode 100644 index 0000000..fb296dd --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts @@ -0,0 +1,16 @@ +type GeneratedColumn = number; +type SourcesIndex = number; +type SourceLine = number; +type SourceColumn = number; +type NamesIndex = number; + +export type SourceMapSegment = + | [GeneratedColumn] + | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] + | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; + +export const COLUMN = 0; +export const SOURCES_INDEX = 1; +export const SOURCE_LINE = 2; +export const SOURCE_COLUMN = 3; +export const NAMES_INDEX = 4; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/types.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/types.ts new file mode 100644 index 0000000..b087f70 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/src/types.ts @@ -0,0 +1,61 @@ +// import type { GeneratedRange, OriginalScope } from '@jridgewell/sourcemap-codec'; +import type { SourceMapSegment } from './sourcemap-segment'; + +export interface SourceMapV3 { + file?: string | null; + names: readonly string[]; + sourceRoot?: string; + sources: readonly (string | null)[]; + sourcesContent?: readonly (string | null)[]; + version: 3; + ignoreList?: readonly number[]; +} + +export interface EncodedSourceMap extends SourceMapV3 { + mappings: string; + // originalScopes: string[]; + // generatedRanges: string; +} + +export interface DecodedSourceMap extends SourceMapV3 { + mappings: readonly SourceMapSegment[][]; + // originalScopes: readonly OriginalScope[][]; + // generatedRanges: readonly GeneratedRange[]; +} + +export interface Pos { + line: number; // 1-based + column: number; // 0-based +} + +export interface OriginalPos extends Pos { + source: string; +} + +export interface BindingExpressionRange { + start: Pos; + expression: string; +} + +// export type OriginalScopeInfo = [number, number, string[] | undefined]; +// export type GeneratedRangeInfo = [GeneratedRange, string[] | undefined]; + +export type Mapping = + | { + generated: Pos; + source: undefined; + original: undefined; + name: undefined; + } + | { + generated: Pos; + source: string; + original: Pos; + name: string; + } + | { + generated: Pos; + source: string; + original: Pos; + name: undefined; + }; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts new file mode 100644 index 0000000..7618d85 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts @@ -0,0 +1,89 @@ +import type { SourceMapInput } from '@jridgewell/trace-mapping'; +import type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types.cts'; +export type { DecodedSourceMap, EncodedSourceMap, Mapping }; +export type Options = { + file?: string | null; + sourceRoot?: string | null; +}; +/** + * Provides the state to generate a sourcemap. + */ +export declare class GenMapping { + private _names; + private _sources; + private _sourcesContent; + private _mappings; + private _ignoreList; + file: string | null | undefined; + sourceRoot: string | null | undefined; + constructor({ file, sourceRoot }?: Options); +} +/** + * A low-level API to associate a generated position with an original source position. Line and + * column here are 0-based, unlike `addMapping`. + */ +export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source?: null, sourceLine?: null, sourceColumn?: null, name?: null, content?: null): void; +export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name?: null, content?: string | null): void; +export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name: string, content?: string | null): void; +/** + * A high-level API to associate a generated position with an original source position. Line is + * 1-based, but column is 0-based, due to legacy behavior in `source-map` library. + */ +export declare function addMapping(map: GenMapping, mapping: { + generated: Pos; + source?: null; + original?: null; + name?: null; + content?: null; +}): void; +export declare function addMapping(map: GenMapping, mapping: { + generated: Pos; + source: string; + original: Pos; + name?: null; + content?: string | null; +}): void; +export declare function addMapping(map: GenMapping, mapping: { + generated: Pos; + source: string; + original: Pos; + name: string; + content?: string | null; +}): void; +/** + * Same as `addSegment`, but will only add the segment if it generates useful information in the + * resulting map. This only works correctly if segments are added **in order**, meaning you should + * not add a segment with a lower generated line/column than one that came before. + */ +export declare const maybeAddSegment: typeof addSegment; +/** + * Same as `addMapping`, but will only add the mapping if it generates useful information in the + * resulting map. This only works correctly if mappings are added **in order**, meaning you should + * not add a mapping with a lower generated line/column than one that came before. + */ +export declare const maybeAddMapping: typeof addMapping; +/** + * Adds/removes the content of the source file to the source map. + */ +export declare function setSourceContent(map: GenMapping, source: string, content: string | null): void; +export declare function setIgnore(map: GenMapping, source: string, ignore?: boolean): void; +/** + * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export declare function toDecodedMap(map: GenMapping): DecodedSourceMap; +/** + * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export declare function toEncodedMap(map: GenMapping): EncodedSourceMap; +/** + * Constructs a new GenMapping, using the already present mappings of the input. + */ +export declare function fromMap(input: SourceMapInput): GenMapping; +/** + * Returns an array of high-level mapping objects for every recorded segment, which could then be + * passed to the `source-map` library. + */ +export declare function allMappings(map: GenMapping): Mapping[]; +//# sourceMappingURL=gen-mapping.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map new file mode 100644 index 0000000..8a2b183 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"gen-mapping.d.ts","sourceRoot":"","sources":["../src/gen-mapping.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts new file mode 100644 index 0000000..bbc0d89 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts @@ -0,0 +1,89 @@ +import type { SourceMapInput } from '@jridgewell/trace-mapping'; +import type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types.mts'; +export type { DecodedSourceMap, EncodedSourceMap, Mapping }; +export type Options = { + file?: string | null; + sourceRoot?: string | null; +}; +/** + * Provides the state to generate a sourcemap. + */ +export declare class GenMapping { + private _names; + private _sources; + private _sourcesContent; + private _mappings; + private _ignoreList; + file: string | null | undefined; + sourceRoot: string | null | undefined; + constructor({ file, sourceRoot }?: Options); +} +/** + * A low-level API to associate a generated position with an original source position. Line and + * column here are 0-based, unlike `addMapping`. + */ +export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source?: null, sourceLine?: null, sourceColumn?: null, name?: null, content?: null): void; +export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name?: null, content?: string | null): void; +export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name: string, content?: string | null): void; +/** + * A high-level API to associate a generated position with an original source position. Line is + * 1-based, but column is 0-based, due to legacy behavior in `source-map` library. + */ +export declare function addMapping(map: GenMapping, mapping: { + generated: Pos; + source?: null; + original?: null; + name?: null; + content?: null; +}): void; +export declare function addMapping(map: GenMapping, mapping: { + generated: Pos; + source: string; + original: Pos; + name?: null; + content?: string | null; +}): void; +export declare function addMapping(map: GenMapping, mapping: { + generated: Pos; + source: string; + original: Pos; + name: string; + content?: string | null; +}): void; +/** + * Same as `addSegment`, but will only add the segment if it generates useful information in the + * resulting map. This only works correctly if segments are added **in order**, meaning you should + * not add a segment with a lower generated line/column than one that came before. + */ +export declare const maybeAddSegment: typeof addSegment; +/** + * Same as `addMapping`, but will only add the mapping if it generates useful information in the + * resulting map. This only works correctly if mappings are added **in order**, meaning you should + * not add a mapping with a lower generated line/column than one that came before. + */ +export declare const maybeAddMapping: typeof addMapping; +/** + * Adds/removes the content of the source file to the source map. + */ +export declare function setSourceContent(map: GenMapping, source: string, content: string | null): void; +export declare function setIgnore(map: GenMapping, source: string, ignore?: boolean): void; +/** + * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export declare function toDecodedMap(map: GenMapping): DecodedSourceMap; +/** + * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export declare function toEncodedMap(map: GenMapping): EncodedSourceMap; +/** + * Constructs a new GenMapping, using the already present mappings of the input. + */ +export declare function fromMap(input: SourceMapInput): GenMapping; +/** + * Returns an array of high-level mapping objects for every recorded segment, which could then be + * passed to the `source-map` library. + */ +export declare function allMappings(map: GenMapping): Mapping[]; +//# sourceMappingURL=gen-mapping.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map new file mode 100644 index 0000000..8a2b183 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"gen-mapping.d.ts","sourceRoot":"","sources":["../src/gen-mapping.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts new file mode 100644 index 0000000..5d8cda3 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts @@ -0,0 +1,33 @@ +type Key = string | number | symbol; +/** + * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the + * index of the `key` in the backing array. + * + * This is designed to allow synchronizing a second array with the contents of the backing array, + * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, + * and there are never duplicates. + */ +export declare class SetArray { + private _indexes; + array: readonly T[]; + constructor(); +} +/** + * Gets the index associated with `key` in the backing array, if it is already present. + */ +export declare function get(setarr: SetArray, key: T): number | undefined; +/** + * Puts `key` into the backing array, if it is not already present. Returns + * the index of the `key` in the backing array. + */ +export declare function put(setarr: SetArray, key: T): number; +/** + * Pops the last added item out of the SetArray. + */ +export declare function pop(setarr: SetArray): void; +/** + * Removes the key, if it exists in the set. + */ +export declare function remove(setarr: SetArray, key: T): void; +export {}; +//# sourceMappingURL=set-array.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map new file mode 100644 index 0000000..c52b8bc --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"set-array.d.ts","sourceRoot":"","sources":["../src/set-array.ts"],"names":[],"mappings":"AAAA,KAAK,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpC;;;;;;;GAOG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG;IACvC,QAAgB,QAAQ,CAAgC;IAChD,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;;CAM7B;AAeD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAElF;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAStE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAYvE"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts new file mode 100644 index 0000000..5d8cda3 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts @@ -0,0 +1,33 @@ +type Key = string | number | symbol; +/** + * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the + * index of the `key` in the backing array. + * + * This is designed to allow synchronizing a second array with the contents of the backing array, + * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, + * and there are never duplicates. + */ +export declare class SetArray { + private _indexes; + array: readonly T[]; + constructor(); +} +/** + * Gets the index associated with `key` in the backing array, if it is already present. + */ +export declare function get(setarr: SetArray, key: T): number | undefined; +/** + * Puts `key` into the backing array, if it is not already present. Returns + * the index of the `key` in the backing array. + */ +export declare function put(setarr: SetArray, key: T): number; +/** + * Pops the last added item out of the SetArray. + */ +export declare function pop(setarr: SetArray): void; +/** + * Removes the key, if it exists in the set. + */ +export declare function remove(setarr: SetArray, key: T): void; +export {}; +//# sourceMappingURL=set-array.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map new file mode 100644 index 0000000..c52b8bc --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"set-array.d.ts","sourceRoot":"","sources":["../src/set-array.ts"],"names":[],"mappings":"AAAA,KAAK,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpC;;;;;;;GAOG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG;IACvC,QAAgB,QAAQ,CAAgC;IAChD,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;;CAM7B;AAeD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAElF;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAStE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAYvE"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts new file mode 100644 index 0000000..6886295 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts @@ -0,0 +1,13 @@ +type GeneratedColumn = number; +type SourcesIndex = number; +type SourceLine = number; +type SourceColumn = number; +type NamesIndex = number; +export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; +export declare const COLUMN = 0; +export declare const SOURCES_INDEX = 1; +export declare const SOURCE_LINE = 2; +export declare const SOURCE_COLUMN = 3; +export declare const NAMES_INDEX = 4; +export {}; +//# sourceMappingURL=sourcemap-segment.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map new file mode 100644 index 0000000..23cdc45 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"sourcemap-segment.d.ts","sourceRoot":"","sources":["../src/sourcemap-segment.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC;AAC9B,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AACzB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB,CAAC,eAAe,CAAC,GACjB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,GACzD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE1E,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts new file mode 100644 index 0000000..6886295 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts @@ -0,0 +1,13 @@ +type GeneratedColumn = number; +type SourcesIndex = number; +type SourceLine = number; +type SourceColumn = number; +type NamesIndex = number; +export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; +export declare const COLUMN = 0; +export declare const SOURCES_INDEX = 1; +export declare const SOURCE_LINE = 2; +export declare const SOURCE_COLUMN = 3; +export declare const NAMES_INDEX = 4; +export {}; +//# sourceMappingURL=sourcemap-segment.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map new file mode 100644 index 0000000..23cdc45 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"sourcemap-segment.d.ts","sourceRoot":"","sources":["../src/sourcemap-segment.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC;AAC9B,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AACzB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB,CAAC,eAAe,CAAC,GACjB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,GACzD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE1E,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.cts new file mode 100644 index 0000000..58da00a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.cts @@ -0,0 +1,44 @@ +import type { SourceMapSegment } from './sourcemap-segment.cts'; +export interface SourceMapV3 { + file?: string | null; + names: readonly string[]; + sourceRoot?: string; + sources: readonly (string | null)[]; + sourcesContent?: readonly (string | null)[]; + version: 3; + ignoreList?: readonly number[]; +} +export interface EncodedSourceMap extends SourceMapV3 { + mappings: string; +} +export interface DecodedSourceMap extends SourceMapV3 { + mappings: readonly SourceMapSegment[][]; +} +export interface Pos { + line: number; + column: number; +} +export interface OriginalPos extends Pos { + source: string; +} +export interface BindingExpressionRange { + start: Pos; + expression: string; +} +export type Mapping = { + generated: Pos; + source: undefined; + original: undefined; + name: undefined; +} | { + generated: Pos; + source: string; + original: Pos; + name: string; +} | { + generated: Pos; + source: string; + original: Pos; + name: undefined; +}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map new file mode 100644 index 0000000..159e734 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,EAAE,MAAM,CAAC;CAGlB;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,CAAC;CAGzC;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,MAAM,OAAO,GACf;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;CACjB,GACD;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.mts new file mode 100644 index 0000000..e9837eb --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.mts @@ -0,0 +1,44 @@ +import type { SourceMapSegment } from './sourcemap-segment.mts'; +export interface SourceMapV3 { + file?: string | null; + names: readonly string[]; + sourceRoot?: string; + sources: readonly (string | null)[]; + sourcesContent?: readonly (string | null)[]; + version: 3; + ignoreList?: readonly number[]; +} +export interface EncodedSourceMap extends SourceMapV3 { + mappings: string; +} +export interface DecodedSourceMap extends SourceMapV3 { + mappings: readonly SourceMapSegment[][]; +} +export interface Pos { + line: number; + column: number; +} +export interface OriginalPos extends Pos { + source: string; +} +export interface BindingExpressionRange { + start: Pos; + expression: string; +} +export type Mapping = { + generated: Pos; + source: undefined; + original: undefined; + name: undefined; +} | { + generated: Pos; + source: string; + original: Pos; + name: string; +} | { + generated: Pos; + source: string; + original: Pos; + name: undefined; +}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map new file mode 100644 index 0000000..159e734 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,EAAE,MAAM,CAAC;CAGlB;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,CAAC;CAGzC;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,MAAM,OAAO,GACf;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;CACjB,GACD;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/LICENSE new file mode 100644 index 0000000..0a81b2a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/LICENSE @@ -0,0 +1,19 @@ +Copyright 2019 Justin Ridgewell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/README.md b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/README.md new file mode 100644 index 0000000..2fe70df --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/README.md @@ -0,0 +1,40 @@ +# @jridgewell/resolve-uri + +> Resolve a URI relative to an optional base URI + +Resolve any combination of absolute URIs, protocol-realtive URIs, absolute paths, or relative paths. + +## Installation + +```sh +npm install @jridgewell/resolve-uri +``` + +## Usage + +```typescript +function resolve(input: string, base?: string): string; +``` + +```js +import resolve from '@jridgewell/resolve-uri'; + +resolve('foo', 'https://example.com'); // => 'https://example.com/foo' +``` + +| Input | Base | Resolution | Explanation | +|-----------------------|-------------------------|--------------------------------|--------------------------------------------------------------| +| `https://example.com` | _any_ | `https://example.com/` | Input is normalized only | +| `//example.com` | `https://base.com/` | `https://example.com/` | Input inherits the base's protocol | +| `//example.com` | _rest_ | `//example.com/` | Input is normalized only | +| `/example` | `https://base.com/` | `https://base.com/example` | Input inherits the base's origin | +| `/example` | `//base.com/` | `//base.com/example` | Input inherits the base's host and remains protocol relative | +| `/example` | _rest_ | `/example` | Input is normalized only | +| `example` | `https://base.com/dir/` | `https://base.com/dir/example` | Input is joined with the base | +| `example` | `https://base.com/file` | `https://base.com/example` | Input is joined with the base without its file | +| `example` | `//base.com/dir/` | `//base.com/dir/example` | Input is joined with the base's last directory | +| `example` | `//base.com/file` | `//base.com/example` | Input is joined with the base without its file | +| `example` | `/base/dir/` | `/base/dir/example` | Input is joined with the base's last directory | +| `example` | `/base/file` | `/base/example` | Input is joined with the base without its file | +| `example` | `base/dir/` | `base/dir/example` | Input is joined with the base's last directory | +| `example` | `base/file` | `base/example` | Input is joined with the base without its file | diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/package.json b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/package.json new file mode 100644 index 0000000..02a4c51 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/resolve-uri/package.json @@ -0,0 +1,69 @@ +{ + "name": "@jridgewell/resolve-uri", + "version": "3.1.2", + "description": "Resolve a URI relative to an optional base URI", + "keywords": [ + "resolve", + "uri", + "url", + "path" + ], + "author": "Justin Ridgewell ", + "license": "MIT", + "repository": "https://github.com/jridgewell/resolve-uri", + "main": "dist/resolve-uri.umd.js", + "module": "dist/resolve-uri.mjs", + "types": "dist/types/resolve-uri.d.ts", + "exports": { + ".": [ + { + "types": "./dist/types/resolve-uri.d.ts", + "browser": "./dist/resolve-uri.umd.js", + "require": "./dist/resolve-uri.umd.js", + "import": "./dist/resolve-uri.mjs" + }, + "./dist/resolve-uri.umd.js" + ], + "./package.json": "./package.json" + }, + "files": [ + "dist" + ], + "engines": { + "node": ">=6.0.0" + }, + "scripts": { + "prebuild": "rm -rf dist", + "build": "run-s -n build:*", + "build:rollup": "rollup -c rollup.config.js", + "build:ts": "tsc --project tsconfig.build.json", + "lint": "run-s -n lint:*", + "lint:prettier": "npm run test:lint:prettier -- --write", + "lint:ts": "npm run test:lint:ts -- --fix", + "pretest": "run-s build:rollup", + "test": "run-s -n test:lint test:only", + "test:debug": "mocha --inspect-brk", + "test:lint": "run-s -n test:lint:*", + "test:lint:prettier": "prettier --check '{src,test}/**/*.ts'", + "test:lint:ts": "eslint '{src,test}/**/*.ts'", + "test:only": "mocha", + "test:coverage": "c8 mocha", + "test:watch": "mocha --watch", + "prepublishOnly": "npm run preversion", + "preversion": "run-s test build" + }, + "devDependencies": { + "@jridgewell/resolve-uri-latest": "npm:@jridgewell/resolve-uri@*", + "@rollup/plugin-typescript": "8.3.0", + "@typescript-eslint/eslint-plugin": "5.10.0", + "@typescript-eslint/parser": "5.10.0", + "c8": "7.11.0", + "eslint": "8.7.0", + "eslint-config-prettier": "8.3.0", + "mocha": "9.2.0", + "npm-run-all": "4.1.5", + "prettier": "2.5.1", + "rollup": "2.66.0", + "typescript": "4.5.5" + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/LICENSE new file mode 100644 index 0000000..1f6ce94 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/LICENSE @@ -0,0 +1,19 @@ +Copyright 2024 Justin Ridgewell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/README.md b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/README.md new file mode 100644 index 0000000..b3e0708 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/README.md @@ -0,0 +1,264 @@ +# @jridgewell/sourcemap-codec + +Encode/decode the `mappings` property of a [sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit). + + +## Why? + +Sourcemaps are difficult to generate and manipulate, because the `mappings` property – the part that actually links the generated code back to the original source – is encoded using an obscure method called [Variable-length quantity](https://en.wikipedia.org/wiki/Variable-length_quantity). On top of that, each segment in the mapping contains offsets rather than absolute indices, which means that you can't look at a segment in isolation – you have to understand the whole sourcemap. + +This package makes the process slightly easier. + + +## Installation + +```bash +npm install @jridgewell/sourcemap-codec +``` + + +## Usage + +```js +import { encode, decode } from '@jridgewell/sourcemap-codec'; + +var decoded = decode( ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' ); + +assert.deepEqual( decoded, [ + // the first line (of the generated code) has no mappings, + // as shown by the starting semi-colon (which separates lines) + [], + + // the second line contains four (comma-separated) segments + [ + // segments are encoded as you'd expect: + // [ generatedCodeColumn, sourceIndex, sourceCodeLine, sourceCodeColumn, nameIndex ] + + // i.e. the first segment begins at column 2, and maps back to the second column + // of the second line (both zero-based) of the 0th source, and uses the 0th + // name in the `map.names` array + [ 2, 0, 2, 2, 0 ], + + // the remaining segments are 4-length rather than 5-length, + // because they don't map a name + [ 4, 0, 2, 4 ], + [ 6, 0, 2, 5 ], + [ 7, 0, 2, 7 ] + ], + + // the final line contains two segments + [ + [ 2, 1, 10, 19 ], + [ 12, 1, 11, 20 ] + ] +]); + +var encoded = encode( decoded ); +assert.equal( encoded, ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' ); +``` + +## Benchmarks + +``` +node v20.10.0 + +amp.js.map - 45120 segments + +Decode Memory Usage: +local code 5815135 bytes +@jridgewell/sourcemap-codec 1.4.15 5868160 bytes +sourcemap-codec 5492584 bytes +source-map-0.6.1 13569984 bytes +source-map-0.8.0 6390584 bytes +chrome dev tools 8011136 bytes +Smallest memory usage is sourcemap-codec + +Decode speed: +decode: local code x 492 ops/sec ±1.22% (90 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 499 ops/sec ±1.16% (89 runs sampled) +decode: sourcemap-codec x 376 ops/sec ±1.66% (89 runs sampled) +decode: source-map-0.6.1 x 34.99 ops/sec ±0.94% (48 runs sampled) +decode: source-map-0.8.0 x 351 ops/sec ±0.07% (95 runs sampled) +chrome dev tools x 165 ops/sec ±0.91% (86 runs sampled) +Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 + +Encode Memory Usage: +local code 444248 bytes +@jridgewell/sourcemap-codec 1.4.15 623024 bytes +sourcemap-codec 8696280 bytes +source-map-0.6.1 8745176 bytes +source-map-0.8.0 8736624 bytes +Smallest memory usage is local code + +Encode speed: +encode: local code x 796 ops/sec ±0.11% (97 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 795 ops/sec ±0.25% (98 runs sampled) +encode: sourcemap-codec x 231 ops/sec ±0.83% (86 runs sampled) +encode: source-map-0.6.1 x 166 ops/sec ±0.57% (86 runs sampled) +encode: source-map-0.8.0 x 203 ops/sec ±0.45% (88 runs sampled) +Fastest is encode: local code,encode: @jridgewell/sourcemap-codec 1.4.15 + + +*** + + +babel.min.js.map - 347793 segments + +Decode Memory Usage: +local code 35424960 bytes +@jridgewell/sourcemap-codec 1.4.15 35424696 bytes +sourcemap-codec 36033464 bytes +source-map-0.6.1 62253704 bytes +source-map-0.8.0 43843920 bytes +chrome dev tools 45111400 bytes +Smallest memory usage is @jridgewell/sourcemap-codec 1.4.15 + +Decode speed: +decode: local code x 38.18 ops/sec ±5.44% (52 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 38.36 ops/sec ±5.02% (52 runs sampled) +decode: sourcemap-codec x 34.05 ops/sec ±4.45% (47 runs sampled) +decode: source-map-0.6.1 x 4.31 ops/sec ±2.76% (15 runs sampled) +decode: source-map-0.8.0 x 55.60 ops/sec ±0.13% (73 runs sampled) +chrome dev tools x 16.94 ops/sec ±3.78% (46 runs sampled) +Fastest is decode: source-map-0.8.0 + +Encode Memory Usage: +local code 2606016 bytes +@jridgewell/sourcemap-codec 1.4.15 2626440 bytes +sourcemap-codec 21152576 bytes +source-map-0.6.1 25023928 bytes +source-map-0.8.0 25256448 bytes +Smallest memory usage is local code + +Encode speed: +encode: local code x 127 ops/sec ±0.18% (83 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 128 ops/sec ±0.26% (83 runs sampled) +encode: sourcemap-codec x 29.31 ops/sec ±2.55% (53 runs sampled) +encode: source-map-0.6.1 x 18.85 ops/sec ±3.19% (36 runs sampled) +encode: source-map-0.8.0 x 19.34 ops/sec ±1.97% (36 runs sampled) +Fastest is encode: @jridgewell/sourcemap-codec 1.4.15 + + +*** + + +preact.js.map - 1992 segments + +Decode Memory Usage: +local code 261696 bytes +@jridgewell/sourcemap-codec 1.4.15 244296 bytes +sourcemap-codec 302816 bytes +source-map-0.6.1 939176 bytes +source-map-0.8.0 336 bytes +chrome dev tools 587368 bytes +Smallest memory usage is source-map-0.8.0 + +Decode speed: +decode: local code x 17,782 ops/sec ±0.32% (97 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 17,863 ops/sec ±0.40% (100 runs sampled) +decode: sourcemap-codec x 12,453 ops/sec ±0.27% (101 runs sampled) +decode: source-map-0.6.1 x 1,288 ops/sec ±1.05% (96 runs sampled) +decode: source-map-0.8.0 x 9,289 ops/sec ±0.27% (101 runs sampled) +chrome dev tools x 4,769 ops/sec ±0.18% (100 runs sampled) +Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 + +Encode Memory Usage: +local code 262944 bytes +@jridgewell/sourcemap-codec 1.4.15 25544 bytes +sourcemap-codec 323048 bytes +source-map-0.6.1 507808 bytes +source-map-0.8.0 507480 bytes +Smallest memory usage is @jridgewell/sourcemap-codec 1.4.15 + +Encode speed: +encode: local code x 24,207 ops/sec ±0.79% (95 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 24,288 ops/sec ±0.48% (96 runs sampled) +encode: sourcemap-codec x 6,761 ops/sec ±0.21% (100 runs sampled) +encode: source-map-0.6.1 x 5,374 ops/sec ±0.17% (99 runs sampled) +encode: source-map-0.8.0 x 5,633 ops/sec ±0.32% (99 runs sampled) +Fastest is encode: @jridgewell/sourcemap-codec 1.4.15,encode: local code + + +*** + + +react.js.map - 5726 segments + +Decode Memory Usage: +local code 678816 bytes +@jridgewell/sourcemap-codec 1.4.15 678816 bytes +sourcemap-codec 816400 bytes +source-map-0.6.1 2288864 bytes +source-map-0.8.0 721360 bytes +chrome dev tools 1012512 bytes +Smallest memory usage is local code + +Decode speed: +decode: local code x 6,178 ops/sec ±0.19% (98 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 6,261 ops/sec ±0.22% (100 runs sampled) +decode: sourcemap-codec x 4,472 ops/sec ±0.90% (99 runs sampled) +decode: source-map-0.6.1 x 449 ops/sec ±0.31% (95 runs sampled) +decode: source-map-0.8.0 x 3,219 ops/sec ±0.13% (100 runs sampled) +chrome dev tools x 1,743 ops/sec ±0.20% (99 runs sampled) +Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 + +Encode Memory Usage: +local code 140960 bytes +@jridgewell/sourcemap-codec 1.4.15 159808 bytes +sourcemap-codec 969304 bytes +source-map-0.6.1 930520 bytes +source-map-0.8.0 930248 bytes +Smallest memory usage is local code + +Encode speed: +encode: local code x 8,013 ops/sec ±0.19% (100 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 7,989 ops/sec ±0.20% (101 runs sampled) +encode: sourcemap-codec x 2,472 ops/sec ±0.21% (99 runs sampled) +encode: source-map-0.6.1 x 2,200 ops/sec ±0.17% (99 runs sampled) +encode: source-map-0.8.0 x 2,220 ops/sec ±0.37% (99 runs sampled) +Fastest is encode: local code + + +*** + + +vscode.map - 2141001 segments + +Decode Memory Usage: +local code 198955264 bytes +@jridgewell/sourcemap-codec 1.4.15 199175352 bytes +sourcemap-codec 199102688 bytes +source-map-0.6.1 386323432 bytes +source-map-0.8.0 244116432 bytes +chrome dev tools 293734280 bytes +Smallest memory usage is local code + +Decode speed: +decode: local code x 3.90 ops/sec ±22.21% (15 runs sampled) +decode: @jridgewell/sourcemap-codec 1.4.15 x 3.95 ops/sec ±23.53% (15 runs sampled) +decode: sourcemap-codec x 3.82 ops/sec ±17.94% (14 runs sampled) +decode: source-map-0.6.1 x 0.61 ops/sec ±7.81% (6 runs sampled) +decode: source-map-0.8.0 x 9.54 ops/sec ±0.28% (28 runs sampled) +chrome dev tools x 2.18 ops/sec ±10.58% (10 runs sampled) +Fastest is decode: source-map-0.8.0 + +Encode Memory Usage: +local code 13509880 bytes +@jridgewell/sourcemap-codec 1.4.15 13537648 bytes +sourcemap-codec 32540104 bytes +source-map-0.6.1 127531040 bytes +source-map-0.8.0 127535312 bytes +Smallest memory usage is local code + +Encode speed: +encode: local code x 20.10 ops/sec ±0.19% (38 runs sampled) +encode: @jridgewell/sourcemap-codec 1.4.15 x 20.26 ops/sec ±0.32% (38 runs sampled) +encode: sourcemap-codec x 5.44 ops/sec ±1.64% (18 runs sampled) +encode: source-map-0.6.1 x 2.30 ops/sec ±4.79% (10 runs sampled) +encode: source-map-0.8.0 x 2.46 ops/sec ±6.53% (10 runs sampled) +Fastest is encode: @jridgewell/sourcemap-codec 1.4.15 +``` + +# License + +MIT diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/package.json b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/package.json new file mode 100644 index 0000000..da55137 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/package.json @@ -0,0 +1,63 @@ +{ + "name": "@jridgewell/sourcemap-codec", + "version": "1.5.5", + "description": "Encode/decode sourcemap mappings", + "keywords": [ + "sourcemap", + "vlq" + ], + "main": "dist/sourcemap-codec.umd.js", + "module": "dist/sourcemap-codec.mjs", + "types": "types/sourcemap-codec.d.cts", + "files": [ + "dist", + "src", + "types" + ], + "exports": { + ".": [ + { + "import": { + "types": "./types/sourcemap-codec.d.mts", + "default": "./dist/sourcemap-codec.mjs" + }, + "default": { + "types": "./types/sourcemap-codec.d.cts", + "default": "./dist/sourcemap-codec.umd.js" + } + }, + "./dist/sourcemap-codec.umd.js" + ], + "./package.json": "./package.json" + }, + "scripts": { + "benchmark": "run-s build:code benchmark:*", + "benchmark:install": "cd benchmark && npm install", + "benchmark:only": "node --expose-gc benchmark/index.js", + "build": "run-s -n build:code build:types", + "build:code": "node ../../esbuild.mjs sourcemap-codec.ts", + "build:types": "run-s build:types:force build:types:emit build:types:mts", + "build:types:force": "rimraf tsconfig.build.tsbuildinfo", + "build:types:emit": "tsc --project tsconfig.build.json", + "build:types:mts": "node ../../mts-types.mjs", + "clean": "run-s -n clean:code clean:types", + "clean:code": "tsc --build --clean tsconfig.build.json", + "clean:types": "rimraf dist types", + "test": "run-s -n test:types test:only test:format", + "test:format": "prettier --check '{src,test}/**/*.ts'", + "test:only": "mocha", + "test:types": "eslint '{src,test}/**/*.ts'", + "lint": "run-s -n lint:types lint:format", + "lint:format": "npm run test:format -- --write", + "lint:types": "npm run test:types -- --fix", + "prepublishOnly": "npm run-s -n build test" + }, + "homepage": "https://github.com/jridgewell/sourcemaps/tree/main/packages/sourcemap-codec", + "repository": { + "type": "git", + "url": "git+https://github.com/jridgewell/sourcemaps.git", + "directory": "packages/sourcemap-codec" + }, + "author": "Justin Ridgewell ", + "license": "MIT" +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts new file mode 100644 index 0000000..d194c2f --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts @@ -0,0 +1,345 @@ +import { StringReader, StringWriter } from './strings'; +import { comma, decodeInteger, encodeInteger, hasMoreVlq, semicolon } from './vlq'; + +const EMPTY: any[] = []; + +type Line = number; +type Column = number; +type Kind = number; +type Name = number; +type Var = number; +type SourcesIndex = number; +type ScopesIndex = number; + +type Mix = (A & O) | (B & O); + +export type OriginalScope = Mix< + [Line, Column, Line, Column, Kind], + [Line, Column, Line, Column, Kind, Name], + { vars: Var[] } +>; + +export type GeneratedRange = Mix< + [Line, Column, Line, Column], + [Line, Column, Line, Column, SourcesIndex, ScopesIndex], + { + callsite: CallSite | null; + bindings: Binding[]; + isScope: boolean; + } +>; +export type CallSite = [SourcesIndex, Line, Column]; +type Binding = BindingExpressionRange[]; +export type BindingExpressionRange = [Name] | [Name, Line, Column]; + +export function decodeOriginalScopes(input: string): OriginalScope[] { + const { length } = input; + const reader = new StringReader(input); + const scopes: OriginalScope[] = []; + const stack: OriginalScope[] = []; + let line = 0; + + for (; reader.pos < length; reader.pos++) { + line = decodeInteger(reader, line); + const column = decodeInteger(reader, 0); + + if (!hasMoreVlq(reader, length)) { + const last = stack.pop()!; + last[2] = line; + last[3] = column; + continue; + } + + const kind = decodeInteger(reader, 0); + const fields = decodeInteger(reader, 0); + const hasName = fields & 0b0001; + + const scope: OriginalScope = ( + hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind] + ) as OriginalScope; + + let vars: Var[] = EMPTY; + if (hasMoreVlq(reader, length)) { + vars = []; + do { + const varsIndex = decodeInteger(reader, 0); + vars.push(varsIndex); + } while (hasMoreVlq(reader, length)); + } + scope.vars = vars; + + scopes.push(scope); + stack.push(scope); + } + + return scopes; +} + +export function encodeOriginalScopes(scopes: OriginalScope[]): string { + const writer = new StringWriter(); + + for (let i = 0; i < scopes.length; ) { + i = _encodeOriginalScopes(scopes, i, writer, [0]); + } + + return writer.flush(); +} + +function _encodeOriginalScopes( + scopes: OriginalScope[], + index: number, + writer: StringWriter, + state: [ + number, // GenColumn + ], +): number { + const scope = scopes[index]; + const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope; + + if (index > 0) writer.write(comma); + + state[0] = encodeInteger(writer, startLine, state[0]); + encodeInteger(writer, startColumn, 0); + encodeInteger(writer, kind, 0); + + const fields = scope.length === 6 ? 0b0001 : 0; + encodeInteger(writer, fields, 0); + if (scope.length === 6) encodeInteger(writer, scope[5], 0); + + for (const v of vars) { + encodeInteger(writer, v, 0); + } + + for (index++; index < scopes.length; ) { + const next = scopes[index]; + const { 0: l, 1: c } = next; + if (l > endLine || (l === endLine && c >= endColumn)) { + break; + } + index = _encodeOriginalScopes(scopes, index, writer, state); + } + + writer.write(comma); + state[0] = encodeInteger(writer, endLine, state[0]); + encodeInteger(writer, endColumn, 0); + + return index; +} + +export function decodeGeneratedRanges(input: string): GeneratedRange[] { + const { length } = input; + const reader = new StringReader(input); + const ranges: GeneratedRange[] = []; + const stack: GeneratedRange[] = []; + + let genLine = 0; + let definitionSourcesIndex = 0; + let definitionScopeIndex = 0; + let callsiteSourcesIndex = 0; + let callsiteLine = 0; + let callsiteColumn = 0; + let bindingLine = 0; + let bindingColumn = 0; + + do { + const semi = reader.indexOf(';'); + let genColumn = 0; + + for (; reader.pos < semi; reader.pos++) { + genColumn = decodeInteger(reader, genColumn); + + if (!hasMoreVlq(reader, semi)) { + const last = stack.pop()!; + last[2] = genLine; + last[3] = genColumn; + continue; + } + + const fields = decodeInteger(reader, 0); + const hasDefinition = fields & 0b0001; + const hasCallsite = fields & 0b0010; + const hasScope = fields & 0b0100; + + let callsite: CallSite | null = null; + let bindings: Binding[] = EMPTY; + let range: GeneratedRange; + if (hasDefinition) { + const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex); + definitionScopeIndex = decodeInteger( + reader, + definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0, + ); + + definitionSourcesIndex = defSourcesIndex; + range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex] as GeneratedRange; + } else { + range = [genLine, genColumn, 0, 0] as GeneratedRange; + } + + range.isScope = !!hasScope; + + if (hasCallsite) { + const prevCsi = callsiteSourcesIndex; + const prevLine = callsiteLine; + callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex); + const sameSource = prevCsi === callsiteSourcesIndex; + callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0); + callsiteColumn = decodeInteger( + reader, + sameSource && prevLine === callsiteLine ? callsiteColumn : 0, + ); + + callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn]; + } + range.callsite = callsite; + + if (hasMoreVlq(reader, semi)) { + bindings = []; + do { + bindingLine = genLine; + bindingColumn = genColumn; + const expressionsCount = decodeInteger(reader, 0); + let expressionRanges: BindingExpressionRange[]; + if (expressionsCount < -1) { + expressionRanges = [[decodeInteger(reader, 0)]]; + for (let i = -1; i > expressionsCount; i--) { + const prevBl = bindingLine; + bindingLine = decodeInteger(reader, bindingLine); + bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0); + const expression = decodeInteger(reader, 0); + expressionRanges.push([expression, bindingLine, bindingColumn]); + } + } else { + expressionRanges = [[expressionsCount]]; + } + bindings.push(expressionRanges); + } while (hasMoreVlq(reader, semi)); + } + range.bindings = bindings; + + ranges.push(range); + stack.push(range); + } + + genLine++; + reader.pos = semi + 1; + } while (reader.pos < length); + + return ranges; +} + +export function encodeGeneratedRanges(ranges: GeneratedRange[]): string { + if (ranges.length === 0) return ''; + + const writer = new StringWriter(); + + for (let i = 0; i < ranges.length; ) { + i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]); + } + + return writer.flush(); +} + +function _encodeGeneratedRanges( + ranges: GeneratedRange[], + index: number, + writer: StringWriter, + state: [ + number, // GenLine + number, // GenColumn + number, // DefSourcesIndex + number, // DefScopesIndex + number, // CallSourcesIndex + number, // CallLine + number, // CallColumn + ], +): number { + const range = ranges[index]; + const { + 0: startLine, + 1: startColumn, + 2: endLine, + 3: endColumn, + isScope, + callsite, + bindings, + } = range; + + if (state[0] < startLine) { + catchupLine(writer, state[0], startLine); + state[0] = startLine; + state[1] = 0; + } else if (index > 0) { + writer.write(comma); + } + + state[1] = encodeInteger(writer, range[1], state[1]); + + const fields = + (range.length === 6 ? 0b0001 : 0) | (callsite ? 0b0010 : 0) | (isScope ? 0b0100 : 0); + encodeInteger(writer, fields, 0); + + if (range.length === 6) { + const { 4: sourcesIndex, 5: scopesIndex } = range; + if (sourcesIndex !== state[2]) { + state[3] = 0; + } + state[2] = encodeInteger(writer, sourcesIndex, state[2]); + state[3] = encodeInteger(writer, scopesIndex, state[3]); + } + + if (callsite) { + const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite!; + if (sourcesIndex !== state[4]) { + state[5] = 0; + state[6] = 0; + } else if (callLine !== state[5]) { + state[6] = 0; + } + state[4] = encodeInteger(writer, sourcesIndex, state[4]); + state[5] = encodeInteger(writer, callLine, state[5]); + state[6] = encodeInteger(writer, callColumn, state[6]); + } + + if (bindings) { + for (const binding of bindings) { + if (binding.length > 1) encodeInteger(writer, -binding.length, 0); + const expression = binding[0][0]; + encodeInteger(writer, expression, 0); + let bindingStartLine = startLine; + let bindingStartColumn = startColumn; + for (let i = 1; i < binding.length; i++) { + const expRange = binding[i]; + bindingStartLine = encodeInteger(writer, expRange[1]!, bindingStartLine); + bindingStartColumn = encodeInteger(writer, expRange[2]!, bindingStartColumn); + encodeInteger(writer, expRange[0]!, 0); + } + } + } + + for (index++; index < ranges.length; ) { + const next = ranges[index]; + const { 0: l, 1: c } = next; + if (l > endLine || (l === endLine && c >= endColumn)) { + break; + } + index = _encodeGeneratedRanges(ranges, index, writer, state); + } + + if (state[0] < endLine) { + catchupLine(writer, state[0], endLine); + state[0] = endLine; + state[1] = 0; + } else { + writer.write(comma); + } + state[1] = encodeInteger(writer, endColumn, state[1]); + + return index; +} + +function catchupLine(writer: StringWriter, lastLine: number, line: number) { + do { + writer.write(semicolon); + } while (++lastLine < line); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts new file mode 100644 index 0000000..a81f894 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts @@ -0,0 +1,111 @@ +import { comma, decodeInteger, encodeInteger, hasMoreVlq, semicolon } from './vlq'; +import { StringWriter, StringReader } from './strings'; + +export { + decodeOriginalScopes, + encodeOriginalScopes, + decodeGeneratedRanges, + encodeGeneratedRanges, +} from './scopes'; +export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes'; + +export type SourceMapSegment = + | [number] + | [number, number, number, number] + | [number, number, number, number, number]; +export type SourceMapLine = SourceMapSegment[]; +export type SourceMapMappings = SourceMapLine[]; + +export function decode(mappings: string): SourceMapMappings { + const { length } = mappings; + const reader = new StringReader(mappings); + const decoded: SourceMapMappings = []; + let genColumn = 0; + let sourcesIndex = 0; + let sourceLine = 0; + let sourceColumn = 0; + let namesIndex = 0; + + do { + const semi = reader.indexOf(';'); + const line: SourceMapLine = []; + let sorted = true; + let lastCol = 0; + genColumn = 0; + + while (reader.pos < semi) { + let seg: SourceMapSegment; + + genColumn = decodeInteger(reader, genColumn); + if (genColumn < lastCol) sorted = false; + lastCol = genColumn; + + if (hasMoreVlq(reader, semi)) { + sourcesIndex = decodeInteger(reader, sourcesIndex); + sourceLine = decodeInteger(reader, sourceLine); + sourceColumn = decodeInteger(reader, sourceColumn); + + if (hasMoreVlq(reader, semi)) { + namesIndex = decodeInteger(reader, namesIndex); + seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]; + } else { + seg = [genColumn, sourcesIndex, sourceLine, sourceColumn]; + } + } else { + seg = [genColumn]; + } + + line.push(seg); + reader.pos++; + } + + if (!sorted) sort(line); + decoded.push(line); + reader.pos = semi + 1; + } while (reader.pos <= length); + + return decoded; +} + +function sort(line: SourceMapSegment[]) { + line.sort(sortComparator); +} + +function sortComparator(a: SourceMapSegment, b: SourceMapSegment): number { + return a[0] - b[0]; +} + +export function encode(decoded: SourceMapMappings): string; +export function encode(decoded: Readonly): string; +export function encode(decoded: Readonly): string { + const writer = new StringWriter(); + let sourcesIndex = 0; + let sourceLine = 0; + let sourceColumn = 0; + let namesIndex = 0; + + for (let i = 0; i < decoded.length; i++) { + const line = decoded[i]; + if (i > 0) writer.write(semicolon); + if (line.length === 0) continue; + + let genColumn = 0; + + for (let j = 0; j < line.length; j++) { + const segment = line[j]; + if (j > 0) writer.write(comma); + + genColumn = encodeInteger(writer, segment[0], genColumn); + + if (segment.length === 1) continue; + sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex); + sourceLine = encodeInteger(writer, segment[2], sourceLine); + sourceColumn = encodeInteger(writer, segment[3], sourceColumn); + + if (segment.length === 4) continue; + namesIndex = encodeInteger(writer, segment[4], namesIndex); + } + } + + return writer.flush(); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/strings.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/strings.ts new file mode 100644 index 0000000..d161965 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/strings.ts @@ -0,0 +1,65 @@ +const bufLength = 1024 * 16; + +// Provide a fallback for older environments. +const td = + typeof TextDecoder !== 'undefined' + ? /* #__PURE__ */ new TextDecoder() + : typeof Buffer !== 'undefined' + ? { + decode(buf: Uint8Array): string { + const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength); + return out.toString(); + }, + } + : { + decode(buf: Uint8Array): string { + let out = ''; + for (let i = 0; i < buf.length; i++) { + out += String.fromCharCode(buf[i]); + } + return out; + }, + }; + +export class StringWriter { + pos = 0; + private out = ''; + private buffer = new Uint8Array(bufLength); + + write(v: number): void { + const { buffer } = this; + buffer[this.pos++] = v; + if (this.pos === bufLength) { + this.out += td.decode(buffer); + this.pos = 0; + } + } + + flush(): string { + const { buffer, out, pos } = this; + return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out; + } +} + +export class StringReader { + pos = 0; + declare private buffer: string; + + constructor(buffer: string) { + this.buffer = buffer; + } + + next(): number { + return this.buffer.charCodeAt(this.pos++); + } + + peek(): number { + return this.buffer.charCodeAt(this.pos); + } + + indexOf(char: string): number { + const { buffer, pos } = this; + const idx = buffer.indexOf(char, pos); + return idx === -1 ? buffer.length : idx; + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts new file mode 100644 index 0000000..a42c681 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts @@ -0,0 +1,55 @@ +import type { StringReader, StringWriter } from './strings'; + +export const comma = ','.charCodeAt(0); +export const semicolon = ';'.charCodeAt(0); + +const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +const intToChar = new Uint8Array(64); // 64 possible chars. +const charToInt = new Uint8Array(128); // z is 122 in ASCII + +for (let i = 0; i < chars.length; i++) { + const c = chars.charCodeAt(i); + intToChar[i] = c; + charToInt[c] = i; +} + +export function decodeInteger(reader: StringReader, relative: number): number { + let value = 0; + let shift = 0; + let integer = 0; + + do { + const c = reader.next(); + integer = charToInt[c]; + value |= (integer & 31) << shift; + shift += 5; + } while (integer & 32); + + const shouldNegate = value & 1; + value >>>= 1; + + if (shouldNegate) { + value = -0x80000000 | -value; + } + + return relative + value; +} + +export function encodeInteger(builder: StringWriter, num: number, relative: number): number { + let delta = num - relative; + + delta = delta < 0 ? (-delta << 1) | 1 : delta << 1; + do { + let clamped = delta & 0b011111; + delta >>>= 5; + if (delta > 0) clamped |= 0b100000; + builder.write(intToChar[clamped]); + } while (delta > 0); + + return num; +} + +export function hasMoreVlq(reader: StringReader, max: number) { + if (reader.pos >= max) return false; + return reader.peek() !== comma; +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts new file mode 100644 index 0000000..c583c75 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts @@ -0,0 +1,50 @@ +type Line = number; +type Column = number; +type Kind = number; +type Name = number; +type Var = number; +type SourcesIndex = number; +type ScopesIndex = number; +type Mix = (A & O) | (B & O); +export type OriginalScope = Mix<[ + Line, + Column, + Line, + Column, + Kind +], [ + Line, + Column, + Line, + Column, + Kind, + Name +], { + vars: Var[]; +}>; +export type GeneratedRange = Mix<[ + Line, + Column, + Line, + Column +], [ + Line, + Column, + Line, + Column, + SourcesIndex, + ScopesIndex +], { + callsite: CallSite | null; + bindings: Binding[]; + isScope: boolean; +}>; +export type CallSite = [SourcesIndex, Line, Column]; +type Binding = BindingExpressionRange[]; +export type BindingExpressionRange = [Name] | [Name, Line, Column]; +export declare function decodeOriginalScopes(input: string): OriginalScope[]; +export declare function encodeOriginalScopes(scopes: OriginalScope[]): string; +export declare function decodeGeneratedRanges(input: string): GeneratedRange[]; +export declare function encodeGeneratedRanges(ranges: GeneratedRange[]): string; +export {}; +//# sourceMappingURL=scopes.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map new file mode 100644 index 0000000..630e647 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAKA,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,MAAM,GAAG,MAAM,CAAC;AACrB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,GAAG,GAAG,MAAM,CAAC;AAClB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,GAAG,CAC7B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;CAAC,EAClC;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,IAAI;CAAC,EACxC;IAAE,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,GAAG,CAC9B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;CAAC,EAC5B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,YAAY;IAAE,WAAW;CAAC,EACvD;IACE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CACF,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,KAAK,OAAO,GAAG,sBAAsB,EAAE,CAAC;AACxC,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAyCnE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAQpE;AA2CD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAoGrE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAUtE"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts new file mode 100644 index 0000000..c583c75 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts @@ -0,0 +1,50 @@ +type Line = number; +type Column = number; +type Kind = number; +type Name = number; +type Var = number; +type SourcesIndex = number; +type ScopesIndex = number; +type Mix = (A & O) | (B & O); +export type OriginalScope = Mix<[ + Line, + Column, + Line, + Column, + Kind +], [ + Line, + Column, + Line, + Column, + Kind, + Name +], { + vars: Var[]; +}>; +export type GeneratedRange = Mix<[ + Line, + Column, + Line, + Column +], [ + Line, + Column, + Line, + Column, + SourcesIndex, + ScopesIndex +], { + callsite: CallSite | null; + bindings: Binding[]; + isScope: boolean; +}>; +export type CallSite = [SourcesIndex, Line, Column]; +type Binding = BindingExpressionRange[]; +export type BindingExpressionRange = [Name] | [Name, Line, Column]; +export declare function decodeOriginalScopes(input: string): OriginalScope[]; +export declare function encodeOriginalScopes(scopes: OriginalScope[]): string; +export declare function decodeGeneratedRanges(input: string): GeneratedRange[]; +export declare function encodeGeneratedRanges(ranges: GeneratedRange[]): string; +export {}; +//# sourceMappingURL=scopes.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map new file mode 100644 index 0000000..630e647 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAKA,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,MAAM,GAAG,MAAM,CAAC;AACrB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,GAAG,GAAG,MAAM,CAAC;AAClB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,GAAG,CAC7B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;CAAC,EAClC;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,IAAI;CAAC,EACxC;IAAE,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,GAAG,CAC9B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;CAAC,EAC5B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,YAAY;IAAE,WAAW;CAAC,EACvD;IACE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CACF,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,KAAK,OAAO,GAAG,sBAAsB,EAAE,CAAC;AACxC,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAyCnE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAQpE;AA2CD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAoGrE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAUtE"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts new file mode 100644 index 0000000..5f35e22 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts @@ -0,0 +1,9 @@ +export { decodeOriginalScopes, encodeOriginalScopes, decodeGeneratedRanges, encodeGeneratedRanges, } from './scopes.cts'; +export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes.cts'; +export type SourceMapSegment = [number] | [number, number, number, number] | [number, number, number, number, number]; +export type SourceMapLine = SourceMapSegment[]; +export type SourceMapMappings = SourceMapLine[]; +export declare function decode(mappings: string): SourceMapMappings; +export declare function encode(decoded: SourceMapMappings): string; +export declare function encode(decoded: Readonly): string; +//# sourceMappingURL=sourcemap-codec.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map new file mode 100644 index 0000000..7123d52 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"sourcemap-codec.d.ts","sourceRoot":"","sources":["../src/sourcemap-codec.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEhG,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,CAAC,GACR,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,aAAa,EAAE,CAAC;AAEhD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAiD1D;AAUD,wBAAgB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC;AAC3D,wBAAgB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts new file mode 100644 index 0000000..199fb9f --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts @@ -0,0 +1,9 @@ +export { decodeOriginalScopes, encodeOriginalScopes, decodeGeneratedRanges, encodeGeneratedRanges, } from './scopes.mts'; +export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes.mts'; +export type SourceMapSegment = [number] | [number, number, number, number] | [number, number, number, number, number]; +export type SourceMapLine = SourceMapSegment[]; +export type SourceMapMappings = SourceMapLine[]; +export declare function decode(mappings: string): SourceMapMappings; +export declare function encode(decoded: SourceMapMappings): string; +export declare function encode(decoded: Readonly): string; +//# sourceMappingURL=sourcemap-codec.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map new file mode 100644 index 0000000..7123d52 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"sourcemap-codec.d.ts","sourceRoot":"","sources":["../src/sourcemap-codec.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEhG,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,CAAC,GACR,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,aAAa,EAAE,CAAC;AAEhD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAiD1D;AAUD,wBAAgB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC;AAC3D,wBAAgB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts new file mode 100644 index 0000000..62faceb --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts @@ -0,0 +1,16 @@ +export declare class StringWriter { + pos: number; + private out; + private buffer; + write(v: number): void; + flush(): string; +} +export declare class StringReader { + pos: number; + private buffer; + constructor(buffer: string); + next(): number; + peek(): number; + indexOf(char: string): number; +} +//# sourceMappingURL=strings.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map new file mode 100644 index 0000000..d3602da --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAuBA,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAA6B;IAE3C,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAStB,KAAK,IAAI,MAAM;CAIhB;AAED,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,QAAgB,MAAM,CAAS;gBAEnB,MAAM,EAAE,MAAM;IAI1B,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAK9B"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts new file mode 100644 index 0000000..62faceb --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts @@ -0,0 +1,16 @@ +export declare class StringWriter { + pos: number; + private out; + private buffer; + write(v: number): void; + flush(): string; +} +export declare class StringReader { + pos: number; + private buffer; + constructor(buffer: string); + next(): number; + peek(): number; + indexOf(char: string): number; +} +//# sourceMappingURL=strings.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map new file mode 100644 index 0000000..d3602da --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAuBA,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAA6B;IAE3C,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAStB,KAAK,IAAI,MAAM;CAIhB;AAED,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,QAAgB,MAAM,CAAS;gBAEnB,MAAM,EAAE,MAAM;IAI1B,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAK9B"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts new file mode 100644 index 0000000..dbd6602 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts @@ -0,0 +1,7 @@ +import type { StringReader, StringWriter } from './strings.cts'; +export declare const comma: number; +export declare const semicolon: number; +export declare function decodeInteger(reader: StringReader, relative: number): number; +export declare function encodeInteger(builder: StringWriter, num: number, relative: number): number; +export declare function hasMoreVlq(reader: StringReader, max: number): boolean; +//# sourceMappingURL=vlq.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map new file mode 100644 index 0000000..6fdc356 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"vlq.d.ts","sourceRoot":"","sources":["../src/vlq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5D,eAAO,MAAM,KAAK,QAAoB,CAAC;AACvC,eAAO,MAAM,SAAS,QAAoB,CAAC;AAY3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoB5E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,WAG3D"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts new file mode 100644 index 0000000..2c739bc --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts @@ -0,0 +1,7 @@ +import type { StringReader, StringWriter } from './strings.mts'; +export declare const comma: number; +export declare const semicolon: number; +export declare function decodeInteger(reader: StringReader, relative: number): number; +export declare function encodeInteger(builder: StringWriter, num: number, relative: number): number; +export declare function hasMoreVlq(reader: StringReader, max: number): boolean; +//# sourceMappingURL=vlq.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map new file mode 100644 index 0000000..6fdc356 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"vlq.d.ts","sourceRoot":"","sources":["../src/vlq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5D,eAAO,MAAM,KAAK,QAAoB,CAAC;AACvC,eAAO,MAAM,SAAS,QAAoB,CAAC;AAY3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoB5E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,WAG3D"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/LICENSE new file mode 100644 index 0000000..1f6ce94 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/LICENSE @@ -0,0 +1,19 @@ +Copyright 2024 Justin Ridgewell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/README.md b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/README.md new file mode 100644 index 0000000..9fc0ed0 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/README.md @@ -0,0 +1,348 @@ +# @jridgewell/trace-mapping + +> Trace the original position through a source map + +`trace-mapping` allows you to take the line and column of an output file and trace it to the +original location in the source file through a source map. + +You may already be familiar with the [`source-map`][source-map] package's `SourceMapConsumer`. This +provides the same `originalPositionFor` and `generatedPositionFor` API, without requiring WASM. + +## Installation + +```sh +npm install @jridgewell/trace-mapping +``` + +## Usage + +```typescript +import { + TraceMap, + originalPositionFor, + generatedPositionFor, + sourceContentFor, + isIgnored, +} from '@jridgewell/trace-mapping'; + +const tracer = new TraceMap({ + version: 3, + sources: ['input.js'], + sourcesContent: ['content of input.js'], + names: ['foo'], + mappings: 'KAyCIA', + ignoreList: [], +}); + +// Lines start at line 1, columns at column 0. +const traced = originalPositionFor(tracer, { line: 1, column: 5 }); +assert.deepEqual(traced, { + source: 'input.js', + line: 42, + column: 4, + name: 'foo', +}); + +const content = sourceContentFor(tracer, traced.source); +assert.strictEqual(content, 'content for input.js'); + +const generated = generatedPositionFor(tracer, { + source: 'input.js', + line: 42, + column: 4, +}); +assert.deepEqual(generated, { + line: 1, + column: 5, +}); + +const ignored = isIgnored(tracer, 'input.js'); +assert.equal(ignored, false); +``` + +We also provide a lower level API to get the actual segment that matches our line and column. Unlike +`originalPositionFor`, `traceSegment` uses a 0-base for `line`: + +```typescript +import { traceSegment } from '@jridgewell/trace-mapping'; + +// line is 0-base. +const traced = traceSegment(tracer, /* line */ 0, /* column */ 5); + +// Segments are [outputColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex] +// Again, line is 0-base and so is sourceLine +assert.deepEqual(traced, [5, 0, 41, 4, 0]); +``` + +### SectionedSourceMaps + +The sourcemap spec defines a special `sections` field that's designed to handle concatenation of +output code with associated sourcemaps. This type of sourcemap is rarely used (no major build tool +produces it), but if you are hand coding a concatenation you may need it. We provide an `AnyMap` +helper that can receive either a regular sourcemap or a `SectionedSourceMap` and returns a +`TraceMap` instance: + +```typescript +import { AnyMap } from '@jridgewell/trace-mapping'; +const fooOutput = 'foo'; +const barOutput = 'bar'; +const output = [fooOutput, barOutput].join('\n'); + +const sectioned = new AnyMap({ + version: 3, + sections: [ + { + // 0-base line and column + offset: { line: 0, column: 0 }, + // fooOutput's sourcemap + map: { + version: 3, + sources: ['foo.js'], + names: ['foo'], + mappings: 'AAAAA', + }, + }, + { + // barOutput's sourcemap will not affect the first line, only the second + offset: { line: 1, column: 0 }, + map: { + version: 3, + sources: ['bar.js'], + names: ['bar'], + mappings: 'AAAAA', + }, + }, + ], +}); + +const traced = originalPositionFor(sectioned, { + line: 2, + column: 0, +}); + +assert.deepEqual(traced, { + source: 'bar.js', + line: 1, + column: 0, + name: 'bar', +}); +``` + +## Benchmarks + +``` +node v20.10.0 + +amp.js.map - 45120 segments + +Memory Usage: +trace-mapping decoded 414164 bytes +trace-mapping encoded 6274352 bytes +source-map-js 10968904 bytes +source-map-0.6.1 17587160 bytes +source-map-0.8.0 8812155 bytes +Chrome dev tools 8672912 bytes +Smallest memory usage is trace-mapping decoded + +Init speed: +trace-mapping: decoded JSON input x 205 ops/sec ±0.19% (88 runs sampled) +trace-mapping: encoded JSON input x 405 ops/sec ±1.47% (88 runs sampled) +trace-mapping: decoded Object input x 4,645 ops/sec ±0.15% (98 runs sampled) +trace-mapping: encoded Object input x 458 ops/sec ±1.63% (91 runs sampled) +source-map-js: encoded Object input x 75.48 ops/sec ±1.64% (67 runs sampled) +source-map-0.6.1: encoded Object input x 39.37 ops/sec ±1.44% (53 runs sampled) +Chrome dev tools: encoded Object input x 150 ops/sec ±1.76% (79 runs sampled) +Fastest is trace-mapping: decoded Object input + +Trace speed (random): +trace-mapping: decoded originalPositionFor x 44,946 ops/sec ±0.16% (99 runs sampled) +trace-mapping: encoded originalPositionFor x 37,995 ops/sec ±1.81% (89 runs sampled) +source-map-js: encoded originalPositionFor x 9,230 ops/sec ±1.36% (93 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 8,057 ops/sec ±0.84% (96 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 28,198 ops/sec ±1.12% (91 runs sampled) +Chrome dev tools: encoded originalPositionFor x 46,276 ops/sec ±1.35% (95 runs sampled) +Fastest is Chrome dev tools: encoded originalPositionFor + +Trace speed (ascending): +trace-mapping: decoded originalPositionFor x 204,406 ops/sec ±0.19% (97 runs sampled) +trace-mapping: encoded originalPositionFor x 196,695 ops/sec ±0.24% (99 runs sampled) +source-map-js: encoded originalPositionFor x 11,948 ops/sec ±0.94% (99 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 10,730 ops/sec ±0.36% (100 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 51,427 ops/sec ±0.21% (98 runs sampled) +Chrome dev tools: encoded originalPositionFor x 162,615 ops/sec ±0.18% (98 runs sampled) +Fastest is trace-mapping: decoded originalPositionFor + + +*** + + +babel.min.js.map - 347793 segments + +Memory Usage: +trace-mapping decoded 18504 bytes +trace-mapping encoded 35428008 bytes +source-map-js 51676808 bytes +source-map-0.6.1 63367136 bytes +source-map-0.8.0 43158400 bytes +Chrome dev tools 50721552 bytes +Smallest memory usage is trace-mapping decoded + +Init speed: +trace-mapping: decoded JSON input x 17.82 ops/sec ±6.35% (35 runs sampled) +trace-mapping: encoded JSON input x 31.57 ops/sec ±7.50% (43 runs sampled) +trace-mapping: decoded Object input x 867 ops/sec ±0.74% (94 runs sampled) +trace-mapping: encoded Object input x 33.83 ops/sec ±7.66% (46 runs sampled) +source-map-js: encoded Object input x 6.58 ops/sec ±3.31% (20 runs sampled) +source-map-0.6.1: encoded Object input x 4.23 ops/sec ±3.43% (15 runs sampled) +Chrome dev tools: encoded Object input x 22.14 ops/sec ±3.79% (41 runs sampled) +Fastest is trace-mapping: decoded Object input + +Trace speed (random): +trace-mapping: decoded originalPositionFor x 78,234 ops/sec ±1.48% (29 runs sampled) +trace-mapping: encoded originalPositionFor x 60,761 ops/sec ±1.35% (21 runs sampled) +source-map-js: encoded originalPositionFor x 51,448 ops/sec ±2.17% (89 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 47,221 ops/sec ±1.99% (15 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 84,002 ops/sec ±1.45% (27 runs sampled) +Chrome dev tools: encoded originalPositionFor x 106,457 ops/sec ±1.38% (37 runs sampled) +Fastest is Chrome dev tools: encoded originalPositionFor + +Trace speed (ascending): +trace-mapping: decoded originalPositionFor x 930,943 ops/sec ±0.25% (99 runs sampled) +trace-mapping: encoded originalPositionFor x 843,545 ops/sec ±0.34% (97 runs sampled) +source-map-js: encoded originalPositionFor x 114,510 ops/sec ±1.37% (36 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 87,412 ops/sec ±0.72% (92 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 197,709 ops/sec ±0.89% (59 runs sampled) +Chrome dev tools: encoded originalPositionFor x 688,983 ops/sec ±0.33% (98 runs sampled) +Fastest is trace-mapping: decoded originalPositionFor + + +*** + + +preact.js.map - 1992 segments + +Memory Usage: +trace-mapping decoded 33136 bytes +trace-mapping encoded 254240 bytes +source-map-js 837488 bytes +source-map-0.6.1 961928 bytes +source-map-0.8.0 54384 bytes +Chrome dev tools 709680 bytes +Smallest memory usage is trace-mapping decoded + +Init speed: +trace-mapping: decoded JSON input x 3,709 ops/sec ±0.13% (99 runs sampled) +trace-mapping: encoded JSON input x 6,447 ops/sec ±0.22% (101 runs sampled) +trace-mapping: decoded Object input x 83,062 ops/sec ±0.23% (100 runs sampled) +trace-mapping: encoded Object input x 14,980 ops/sec ±0.28% (100 runs sampled) +source-map-js: encoded Object input x 2,544 ops/sec ±0.16% (99 runs sampled) +source-map-0.6.1: encoded Object input x 1,221 ops/sec ±0.37% (97 runs sampled) +Chrome dev tools: encoded Object input x 4,241 ops/sec ±0.39% (93 runs sampled) +Fastest is trace-mapping: decoded Object input + +Trace speed (random): +trace-mapping: decoded originalPositionFor x 91,028 ops/sec ±0.14% (94 runs sampled) +trace-mapping: encoded originalPositionFor x 84,348 ops/sec ±0.26% (98 runs sampled) +source-map-js: encoded originalPositionFor x 26,998 ops/sec ±0.23% (98 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 18,049 ops/sec ±0.26% (100 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 41,916 ops/sec ±0.28% (98 runs sampled) +Chrome dev tools: encoded originalPositionFor x 88,616 ops/sec ±0.14% (98 runs sampled) +Fastest is trace-mapping: decoded originalPositionFor + +Trace speed (ascending): +trace-mapping: decoded originalPositionFor x 319,960 ops/sec ±0.16% (100 runs sampled) +trace-mapping: encoded originalPositionFor x 302,153 ops/sec ±0.18% (100 runs sampled) +source-map-js: encoded originalPositionFor x 35,574 ops/sec ±0.19% (100 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 19,943 ops/sec ±0.12% (101 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 54,648 ops/sec ±0.20% (99 runs sampled) +Chrome dev tools: encoded originalPositionFor x 278,319 ops/sec ±0.17% (102 runs sampled) +Fastest is trace-mapping: decoded originalPositionFor + + +*** + + +react.js.map - 5726 segments + +Memory Usage: +trace-mapping decoded 10872 bytes +trace-mapping encoded 681512 bytes +source-map-js 2563944 bytes +source-map-0.6.1 2150864 bytes +source-map-0.8.0 88680 bytes +Chrome dev tools 1149576 bytes +Smallest memory usage is trace-mapping decoded + +Init speed: +trace-mapping: decoded JSON input x 1,887 ops/sec ±0.28% (99 runs sampled) +trace-mapping: encoded JSON input x 4,749 ops/sec ±0.48% (97 runs sampled) +trace-mapping: decoded Object input x 74,236 ops/sec ±0.11% (99 runs sampled) +trace-mapping: encoded Object input x 5,752 ops/sec ±0.38% (100 runs sampled) +source-map-js: encoded Object input x 806 ops/sec ±0.19% (97 runs sampled) +source-map-0.6.1: encoded Object input x 418 ops/sec ±0.33% (94 runs sampled) +Chrome dev tools: encoded Object input x 1,524 ops/sec ±0.57% (92 runs sampled) +Fastest is trace-mapping: decoded Object input + +Trace speed (random): +trace-mapping: decoded originalPositionFor x 620,201 ops/sec ±0.33% (96 runs sampled) +trace-mapping: encoded originalPositionFor x 579,548 ops/sec ±0.35% (97 runs sampled) +source-map-js: encoded originalPositionFor x 230,983 ops/sec ±0.62% (54 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 158,145 ops/sec ±0.80% (46 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 343,801 ops/sec ±0.55% (96 runs sampled) +Chrome dev tools: encoded originalPositionFor x 659,649 ops/sec ±0.49% (98 runs sampled) +Fastest is Chrome dev tools: encoded originalPositionFor + +Trace speed (ascending): +trace-mapping: decoded originalPositionFor x 2,368,079 ops/sec ±0.32% (98 runs sampled) +trace-mapping: encoded originalPositionFor x 2,134,039 ops/sec ±2.72% (87 runs sampled) +source-map-js: encoded originalPositionFor x 290,120 ops/sec ±2.49% (82 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 187,613 ops/sec ±0.86% (49 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 479,569 ops/sec ±0.65% (96 runs sampled) +Chrome dev tools: encoded originalPositionFor x 2,048,414 ops/sec ±0.24% (98 runs sampled) +Fastest is trace-mapping: decoded originalPositionFor + + +*** + + +vscode.map - 2141001 segments + +Memory Usage: +trace-mapping decoded 5206584 bytes +trace-mapping encoded 208370336 bytes +source-map-js 278493008 bytes +source-map-0.6.1 391564048 bytes +source-map-0.8.0 257508787 bytes +Chrome dev tools 291053000 bytes +Smallest memory usage is trace-mapping decoded + +Init speed: +trace-mapping: decoded JSON input x 1.63 ops/sec ±33.88% (9 runs sampled) +trace-mapping: encoded JSON input x 3.29 ops/sec ±36.13% (13 runs sampled) +trace-mapping: decoded Object input x 103 ops/sec ±0.93% (77 runs sampled) +trace-mapping: encoded Object input x 5.42 ops/sec ±28.54% (19 runs sampled) +source-map-js: encoded Object input x 1.07 ops/sec ±13.84% (7 runs sampled) +source-map-0.6.1: encoded Object input x 0.60 ops/sec ±2.43% (6 runs sampled) +Chrome dev tools: encoded Object input x 2.61 ops/sec ±22.00% (11 runs sampled) +Fastest is trace-mapping: decoded Object input + +Trace speed (random): +trace-mapping: decoded originalPositionFor x 257,019 ops/sec ±0.97% (93 runs sampled) +trace-mapping: encoded originalPositionFor x 179,163 ops/sec ±0.83% (92 runs sampled) +source-map-js: encoded originalPositionFor x 73,337 ops/sec ±1.35% (87 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 38,797 ops/sec ±1.66% (88 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 107,758 ops/sec ±1.94% (45 runs sampled) +Chrome dev tools: encoded originalPositionFor x 188,550 ops/sec ±1.85% (79 runs sampled) +Fastest is trace-mapping: decoded originalPositionFor + +Trace speed (ascending): +trace-mapping: decoded originalPositionFor x 447,621 ops/sec ±3.64% (94 runs sampled) +trace-mapping: encoded originalPositionFor x 323,698 ops/sec ±5.20% (88 runs sampled) +source-map-js: encoded originalPositionFor x 78,387 ops/sec ±1.69% (89 runs sampled) +source-map-0.6.1: encoded originalPositionFor x 41,016 ops/sec ±3.01% (25 runs sampled) +source-map-0.8.0: encoded originalPositionFor x 124,204 ops/sec ±0.90% (92 runs sampled) +Chrome dev tools: encoded originalPositionFor x 230,087 ops/sec ±2.61% (93 runs sampled) +Fastest is trace-mapping: decoded originalPositionFor +``` + +[source-map]: https://www.npmjs.com/package/source-map diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/package.json b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/package.json new file mode 100644 index 0000000..9d3a1c0 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/package.json @@ -0,0 +1,67 @@ +{ + "name": "@jridgewell/trace-mapping", + "version": "0.3.31", + "description": "Trace the original position through a source map", + "keywords": [ + "source", + "map" + ], + "main": "dist/trace-mapping.umd.js", + "module": "dist/trace-mapping.mjs", + "types": "types/trace-mapping.d.cts", + "files": [ + "dist", + "src", + "types" + ], + "exports": { + ".": [ + { + "import": { + "types": "./types/trace-mapping.d.mts", + "default": "./dist/trace-mapping.mjs" + }, + "default": { + "types": "./types/trace-mapping.d.cts", + "default": "./dist/trace-mapping.umd.js" + } + }, + "./dist/trace-mapping.umd.js" + ], + "./package.json": "./package.json" + }, + "scripts": { + "benchmark": "run-s build:code benchmark:*", + "benchmark:install": "cd benchmark && npm install", + "benchmark:only": "node --expose-gc benchmark/index.mjs", + "build": "run-s -n build:code build:types", + "build:code": "node ../../esbuild.mjs trace-mapping.ts", + "build:types": "run-s build:types:force build:types:emit build:types:mts", + "build:types:force": "rimraf tsconfig.build.tsbuildinfo", + "build:types:emit": "tsc --project tsconfig.build.json", + "build:types:mts": "node ../../mts-types.mjs", + "clean": "run-s -n clean:code clean:types", + "clean:code": "tsc --build --clean tsconfig.build.json", + "clean:types": "rimraf dist types", + "test": "run-s -n test:types test:only test:format", + "test:format": "prettier --check '{src,test}/**/*.ts'", + "test:only": "mocha", + "test:types": "eslint '{src,test}/**/*.ts'", + "lint": "run-s -n lint:types lint:format", + "lint:format": "npm run test:format -- --write", + "lint:types": "npm run test:types -- --fix", + "prepublishOnly": "npm run-s -n build test" + }, + "homepage": "https://github.com/jridgewell/sourcemaps/tree/main/packages/trace-mapping", + "repository": { + "type": "git", + "url": "git+https://github.com/jridgewell/sourcemaps.git", + "directory": "packages/trace-mapping" + }, + "author": "Justin Ridgewell ", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/binary-search.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/binary-search.ts new file mode 100644 index 0000000..c1144ad --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/binary-search.ts @@ -0,0 +1,115 @@ +import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment'; +import { COLUMN } from './sourcemap-segment'; + +export type MemoState = { + lastKey: number; + lastNeedle: number; + lastIndex: number; +}; + +export let found = false; + +/** + * A binary search implementation that returns the index if a match is found. + * If no match is found, then the left-index (the index associated with the item that comes just + * before the desired index) is returned. To maintain proper sort order, a splice would happen at + * the next index: + * + * ```js + * const array = [1, 3]; + * const needle = 2; + * const index = binarySearch(array, needle, (item, needle) => item - needle); + * + * assert.equal(index, 0); + * array.splice(index + 1, 0, needle); + * assert.deepEqual(array, [1, 2, 3]); + * ``` + */ +export function binarySearch( + haystack: SourceMapSegment[] | ReverseSegment[], + needle: number, + low: number, + high: number, +): number { + while (low <= high) { + const mid = low + ((high - low) >> 1); + const cmp = haystack[mid][COLUMN] - needle; + + if (cmp === 0) { + found = true; + return mid; + } + + if (cmp < 0) { + low = mid + 1; + } else { + high = mid - 1; + } + } + + found = false; + return low - 1; +} + +export function upperBound( + haystack: SourceMapSegment[] | ReverseSegment[], + needle: number, + index: number, +): number { + for (let i = index + 1; i < haystack.length; index = i++) { + if (haystack[i][COLUMN] !== needle) break; + } + return index; +} + +export function lowerBound( + haystack: SourceMapSegment[] | ReverseSegment[], + needle: number, + index: number, +): number { + for (let i = index - 1; i >= 0; index = i--) { + if (haystack[i][COLUMN] !== needle) break; + } + return index; +} + +export function memoizedState(): MemoState { + return { + lastKey: -1, + lastNeedle: -1, + lastIndex: -1, + }; +} + +/** + * This overly complicated beast is just to record the last tested line/column and the resulting + * index, allowing us to skip a few tests if mappings are monotonically increasing. + */ +export function memoizedBinarySearch( + haystack: SourceMapSegment[] | ReverseSegment[], + needle: number, + state: MemoState, + key: number, +): number { + const { lastKey, lastNeedle, lastIndex } = state; + + let low = 0; + let high = haystack.length - 1; + if (key === lastKey) { + if (needle === lastNeedle) { + found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle; + return lastIndex; + } + + if (needle >= lastNeedle) { + // lastIndex may be -1 if the previous needle was not found. + low = lastIndex === -1 ? 0 : lastIndex; + } else { + high = lastIndex; + } + } + state.lastKey = key; + state.lastNeedle = needle; + + return (state.lastIndex = binarySearch(haystack, needle, low, high)); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/by-source.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/by-source.ts new file mode 100644 index 0000000..1da6af0 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/by-source.ts @@ -0,0 +1,41 @@ +import { COLUMN, SOURCES_INDEX, SOURCE_LINE, SOURCE_COLUMN } from './sourcemap-segment'; +import { sortComparator } from './sort'; + +import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment'; + +export type Source = ReverseSegment[][]; + +// Rebuilds the original source files, with mappings that are ordered by source line/column instead +// of generated line/column. +export default function buildBySources( + decoded: readonly SourceMapSegment[][], + memos: unknown[], +): Source[] { + const sources: Source[] = memos.map(() => []); + + for (let i = 0; i < decoded.length; i++) { + const line = decoded[i]; + for (let j = 0; j < line.length; j++) { + const seg = line[j]; + if (seg.length === 1) continue; + + const sourceIndex = seg[SOURCES_INDEX]; + const sourceLine = seg[SOURCE_LINE]; + const sourceColumn = seg[SOURCE_COLUMN]; + + const source = sources[sourceIndex]; + const segs = (source[sourceLine] ||= []); + segs.push([sourceColumn, i, seg[COLUMN]]); + } + } + + for (let i = 0; i < sources.length; i++) { + const source = sources[i]; + for (let j = 0; j < source.length; j++) { + const line = source[j]; + if (line) line.sort(sortComparator); + } + } + + return sources; +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts new file mode 100644 index 0000000..61ac40c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts @@ -0,0 +1,192 @@ +import { TraceMap, presortedDecodedMap, decodedMappings } from './trace-mapping'; +import { + COLUMN, + SOURCES_INDEX, + SOURCE_LINE, + SOURCE_COLUMN, + NAMES_INDEX, +} from './sourcemap-segment'; +import { parse } from './types'; + +import type { + DecodedSourceMap, + DecodedSourceMapXInput, + EncodedSourceMapXInput, + SectionedSourceMapXInput, + SectionedSourceMapInput, + SectionXInput, + Ro, +} from './types'; +import type { SourceMapSegment } from './sourcemap-segment'; + +type FlattenMap = { + new (map: Ro, mapUrl?: string | null): TraceMap; + (map: Ro, mapUrl?: string | null): TraceMap; +}; + +export const FlattenMap: FlattenMap = function (map, mapUrl) { + const parsed = parse(map as SectionedSourceMapInput); + + if (!('sections' in parsed)) { + return new TraceMap(parsed as DecodedSourceMapXInput | EncodedSourceMapXInput, mapUrl); + } + + const mappings: SourceMapSegment[][] = []; + const sources: string[] = []; + const sourcesContent: (string | null)[] = []; + const names: string[] = []; + const ignoreList: number[] = []; + + recurse( + parsed, + mapUrl, + mappings, + sources, + sourcesContent, + names, + ignoreList, + 0, + 0, + Infinity, + Infinity, + ); + + const joined: DecodedSourceMap = { + version: 3, + file: parsed.file, + names, + sources, + sourcesContent, + mappings, + ignoreList, + }; + + return presortedDecodedMap(joined); +} as FlattenMap; + +function recurse( + input: SectionedSourceMapXInput, + mapUrl: string | null | undefined, + mappings: SourceMapSegment[][], + sources: string[], + sourcesContent: (string | null)[], + names: string[], + ignoreList: number[], + lineOffset: number, + columnOffset: number, + stopLine: number, + stopColumn: number, +) { + const { sections } = input; + for (let i = 0; i < sections.length; i++) { + const { map, offset } = sections[i]; + + let sl = stopLine; + let sc = stopColumn; + if (i + 1 < sections.length) { + const nextOffset = sections[i + 1].offset; + sl = Math.min(stopLine, lineOffset + nextOffset.line); + + if (sl === stopLine) { + sc = Math.min(stopColumn, columnOffset + nextOffset.column); + } else if (sl < stopLine) { + sc = columnOffset + nextOffset.column; + } + } + + addSection( + map, + mapUrl, + mappings, + sources, + sourcesContent, + names, + ignoreList, + lineOffset + offset.line, + columnOffset + offset.column, + sl, + sc, + ); + } +} + +function addSection( + input: SectionXInput['map'], + mapUrl: string | null | undefined, + mappings: SourceMapSegment[][], + sources: string[], + sourcesContent: (string | null)[], + names: string[], + ignoreList: number[], + lineOffset: number, + columnOffset: number, + stopLine: number, + stopColumn: number, +) { + const parsed = parse(input); + if ('sections' in parsed) return recurse(...(arguments as unknown as Parameters)); + + const map = new TraceMap(parsed, mapUrl); + const sourcesOffset = sources.length; + const namesOffset = names.length; + const decoded = decodedMappings(map); + const { resolvedSources, sourcesContent: contents, ignoreList: ignores } = map; + + append(sources, resolvedSources); + append(names, map.names); + + if (contents) append(sourcesContent, contents); + else for (let i = 0; i < resolvedSources.length; i++) sourcesContent.push(null); + + if (ignores) for (let i = 0; i < ignores.length; i++) ignoreList.push(ignores[i] + sourcesOffset); + + for (let i = 0; i < decoded.length; i++) { + const lineI = lineOffset + i; + + // We can only add so many lines before we step into the range that the next section's map + // controls. When we get to the last line, then we'll start checking the segments to see if + // they've crossed into the column range. But it may not have any columns that overstep, so we + // still need to check that we don't overstep lines, too. + if (lineI > stopLine) return; + + // The out line may already exist in mappings (if we're continuing the line started by a + // previous section). Or, we may have jumped ahead several lines to start this section. + const out = getLine(mappings, lineI); + // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the + // map can be multiple lines), it doesn't. + const cOffset = i === 0 ? columnOffset : 0; + + const line = decoded[i]; + for (let j = 0; j < line.length; j++) { + const seg = line[j]; + const column = cOffset + seg[COLUMN]; + + // If this segment steps into the column range that the next section's map controls, we need + // to stop early. + if (lineI === stopLine && column >= stopColumn) return; + + if (seg.length === 1) { + out.push([column]); + continue; + } + + const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX]; + const sourceLine = seg[SOURCE_LINE]; + const sourceColumn = seg[SOURCE_COLUMN]; + out.push( + seg.length === 4 + ? [column, sourcesIndex, sourceLine, sourceColumn] + : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]], + ); + } + } +} + +function append(arr: T[], other: T[]) { + for (let i = 0; i < other.length; i++) arr.push(other[i]); +} + +function getLine(arr: T[][], index: number): T[] { + for (let i = arr.length; i <= index; i++) arr[i] = []; + return arr[index]; +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/resolve.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/resolve.ts new file mode 100644 index 0000000..30bfa3b --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/resolve.ts @@ -0,0 +1,16 @@ +import resolveUri from '@jridgewell/resolve-uri'; +import stripFilename from './strip-filename'; + +type Resolve = (source: string | null) => string; +export default function resolver( + mapUrl: string | null | undefined, + sourceRoot: string | undefined, +): Resolve { + const from = stripFilename(mapUrl); + // The sourceRoot is always treated as a directory, if it's not empty. + // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327 + // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401 + const prefix = sourceRoot ? sourceRoot + '/' : ''; + + return (source) => resolveUri(prefix + (source || ''), from); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/sort.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/sort.ts new file mode 100644 index 0000000..5d016cb --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/sort.ts @@ -0,0 +1,45 @@ +import { COLUMN } from './sourcemap-segment'; + +import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment'; + +export default function maybeSort( + mappings: SourceMapSegment[][], + owned: boolean, +): SourceMapSegment[][] { + const unsortedIndex = nextUnsortedSegmentLine(mappings, 0); + if (unsortedIndex === mappings.length) return mappings; + + // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If + // not, we do not want to modify the consumer's input array. + if (!owned) mappings = mappings.slice(); + + for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) { + mappings[i] = sortSegments(mappings[i], owned); + } + return mappings; +} + +function nextUnsortedSegmentLine(mappings: SourceMapSegment[][], start: number): number { + for (let i = start; i < mappings.length; i++) { + if (!isSorted(mappings[i])) return i; + } + return mappings.length; +} + +function isSorted(line: SourceMapSegment[]): boolean { + for (let j = 1; j < line.length; j++) { + if (line[j][COLUMN] < line[j - 1][COLUMN]) { + return false; + } + } + return true; +} + +function sortSegments(line: SourceMapSegment[], owned: boolean): SourceMapSegment[] { + if (!owned) line = line.slice(); + return line.sort(sortComparator); +} + +export function sortComparator(a: T, b: T): number { + return a[COLUMN] - b[COLUMN]; +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts new file mode 100644 index 0000000..94f1b6a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts @@ -0,0 +1,23 @@ +type GeneratedColumn = number; +type SourcesIndex = number; +type SourceLine = number; +type SourceColumn = number; +type NamesIndex = number; + +type GeneratedLine = number; + +export type SourceMapSegment = + | [GeneratedColumn] + | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] + | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; + +export type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn]; + +export const COLUMN = 0; +export const SOURCES_INDEX = 1; +export const SOURCE_LINE = 2; +export const SOURCE_COLUMN = 3; +export const NAMES_INDEX = 4; + +export const REV_GENERATED_LINE = 1; +export const REV_GENERATED_COLUMN = 2; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts new file mode 100644 index 0000000..2c88980 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts @@ -0,0 +1,8 @@ +/** + * Removes everything after the last "/", but leaves the slash. + */ +export default function stripFilename(path: string | undefined | null): string { + if (!path) return ''; + const index = path.lastIndexOf('/'); + return path.slice(0, index + 1); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts new file mode 100644 index 0000000..0b793d5 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts @@ -0,0 +1,502 @@ +import { encode, decode } from '@jridgewell/sourcemap-codec'; + +import resolver from './resolve'; +import maybeSort from './sort'; +import buildBySources from './by-source'; +import { + memoizedState, + memoizedBinarySearch, + upperBound, + lowerBound, + found as bsFound, +} from './binary-search'; +import { + COLUMN, + SOURCES_INDEX, + SOURCE_LINE, + SOURCE_COLUMN, + NAMES_INDEX, + REV_GENERATED_LINE, + REV_GENERATED_COLUMN, +} from './sourcemap-segment'; +import { parse } from './types'; + +import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment'; +import type { + SourceMapV3, + DecodedSourceMap, + EncodedSourceMap, + InvalidOriginalMapping, + OriginalMapping, + InvalidGeneratedMapping, + GeneratedMapping, + SourceMapInput, + Needle, + SourceNeedle, + SourceMap, + EachMapping, + Bias, + XInput, + SectionedSourceMap, + Ro, +} from './types'; +import type { Source } from './by-source'; +import type { MemoState } from './binary-search'; + +export type { SourceMapSegment } from './sourcemap-segment'; +export type { + SourceMap, + DecodedSourceMap, + EncodedSourceMap, + Section, + SectionedSourceMap, + SourceMapV3, + Bias, + EachMapping, + GeneratedMapping, + InvalidGeneratedMapping, + InvalidOriginalMapping, + Needle, + OriginalMapping, + OriginalMapping as Mapping, + SectionedSourceMapInput, + SourceMapInput, + SourceNeedle, + XInput, + EncodedSourceMapXInput, + DecodedSourceMapXInput, + SectionedSourceMapXInput, + SectionXInput, +} from './types'; + +interface PublicMap { + _encoded: TraceMap['_encoded']; + _decoded: TraceMap['_decoded']; + _decodedMemo: TraceMap['_decodedMemo']; + _bySources: TraceMap['_bySources']; + _bySourceMemos: TraceMap['_bySourceMemos']; +} + +const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)'; +const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)'; + +export const LEAST_UPPER_BOUND = -1; +export const GREATEST_LOWER_BOUND = 1; + +export { FlattenMap, FlattenMap as AnyMap } from './flatten-map'; + +export class TraceMap implements SourceMap { + declare version: SourceMapV3['version']; + declare file: SourceMapV3['file']; + declare names: SourceMapV3['names']; + declare sourceRoot: SourceMapV3['sourceRoot']; + declare sources: SourceMapV3['sources']; + declare sourcesContent: SourceMapV3['sourcesContent']; + declare ignoreList: SourceMapV3['ignoreList']; + + declare resolvedSources: string[]; + declare private _encoded: string | undefined; + + declare private _decoded: SourceMapSegment[][] | undefined; + declare private _decodedMemo: MemoState; + + declare private _bySources: Source[] | undefined; + declare private _bySourceMemos: MemoState[] | undefined; + + constructor(map: Ro, mapUrl?: string | null) { + const isString = typeof map === 'string'; + if (!isString && (map as unknown as { _decodedMemo: any })._decodedMemo) return map as TraceMap; + + const parsed = parse(map as Exclude); + + const { version, file, names, sourceRoot, sources, sourcesContent } = parsed; + this.version = version; + this.file = file; + this.names = names || []; + this.sourceRoot = sourceRoot; + this.sources = sources; + this.sourcesContent = sourcesContent; + this.ignoreList = parsed.ignoreList || (parsed as XInput).x_google_ignoreList || undefined; + + const resolve = resolver(mapUrl, sourceRoot); + this.resolvedSources = sources.map(resolve); + + const { mappings } = parsed; + if (typeof mappings === 'string') { + this._encoded = mappings; + this._decoded = undefined; + } else if (Array.isArray(mappings)) { + this._encoded = undefined; + this._decoded = maybeSort(mappings, isString); + } else if ((parsed as unknown as SectionedSourceMap).sections) { + throw new Error(`TraceMap passed sectioned source map, please use FlattenMap export instead`); + } else { + throw new Error(`invalid source map: ${JSON.stringify(parsed)}`); + } + + this._decodedMemo = memoizedState(); + this._bySources = undefined; + this._bySourceMemos = undefined; + } +} + +/** + * Typescript doesn't allow friend access to private fields, so this just casts the map into a type + * with public access modifiers. + */ +function cast(map: unknown): PublicMap { + return map as any; +} + +/** + * Returns the encoded (VLQ string) form of the SourceMap's mappings field. + */ +export function encodedMappings(map: TraceMap): EncodedSourceMap['mappings'] { + return (cast(map)._encoded ??= encode(cast(map)._decoded!)); +} + +/** + * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field. + */ +export function decodedMappings(map: TraceMap): Readonly { + return (cast(map)._decoded ||= decode(cast(map)._encoded!)); +} + +/** + * A low-level API to find the segment associated with a generated line/column (think, from a + * stack trace). Line and column here are 0-based, unlike `originalPositionFor`. + */ +export function traceSegment( + map: TraceMap, + line: number, + column: number, +): Readonly | null { + const decoded = decodedMappings(map); + + // It's common for parent source maps to have pointers to lines that have no + // mapping (like a "//# sourceMappingURL=") at the end of the child file. + if (line >= decoded.length) return null; + + const segments = decoded[line]; + const index = traceSegmentInternal( + segments, + cast(map)._decodedMemo, + line, + column, + GREATEST_LOWER_BOUND, + ); + + return index === -1 ? null : segments[index]; +} + +/** + * A higher-level API to find the source/line/column associated with a generated line/column + * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in + * `source-map` library. + */ +export function originalPositionFor( + map: TraceMap, + needle: Needle, +): OriginalMapping | InvalidOriginalMapping { + let { line, column, bias } = needle; + line--; + if (line < 0) throw new Error(LINE_GTR_ZERO); + if (column < 0) throw new Error(COL_GTR_EQ_ZERO); + + const decoded = decodedMappings(map); + + // It's common for parent source maps to have pointers to lines that have no + // mapping (like a "//# sourceMappingURL=") at the end of the child file. + if (line >= decoded.length) return OMapping(null, null, null, null); + + const segments = decoded[line]; + const index = traceSegmentInternal( + segments, + cast(map)._decodedMemo, + line, + column, + bias || GREATEST_LOWER_BOUND, + ); + + if (index === -1) return OMapping(null, null, null, null); + + const segment = segments[index]; + if (segment.length === 1) return OMapping(null, null, null, null); + + const { names, resolvedSources } = map; + return OMapping( + resolvedSources[segment[SOURCES_INDEX]], + segment[SOURCE_LINE] + 1, + segment[SOURCE_COLUMN], + segment.length === 5 ? names[segment[NAMES_INDEX]] : null, + ); +} + +/** + * Finds the generated line/column position of the provided source/line/column source position. + */ +export function generatedPositionFor( + map: TraceMap, + needle: SourceNeedle, +): GeneratedMapping | InvalidGeneratedMapping { + const { source, line, column, bias } = needle; + return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false); +} + +/** + * Finds all generated line/column positions of the provided source/line/column source position. + */ +export function allGeneratedPositionsFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping[] { + const { source, line, column, bias } = needle; + // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit. + return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true); +} + +/** + * Iterates each mapping in generated position order. + */ +export function eachMapping(map: TraceMap, cb: (mapping: EachMapping) => void): void { + const decoded = decodedMappings(map); + const { names, resolvedSources } = map; + + for (let i = 0; i < decoded.length; i++) { + const line = decoded[i]; + for (let j = 0; j < line.length; j++) { + const seg = line[j]; + + const generatedLine = i + 1; + const generatedColumn = seg[0]; + let source = null; + let originalLine = null; + let originalColumn = null; + let name = null; + if (seg.length !== 1) { + source = resolvedSources[seg[1]]; + originalLine = seg[2] + 1; + originalColumn = seg[3]; + } + if (seg.length === 5) name = names[seg[4]]; + + cb({ + generatedLine, + generatedColumn, + source, + originalLine, + originalColumn, + name, + } as EachMapping); + } + } +} + +function sourceIndex(map: TraceMap, source: string): number { + const { sources, resolvedSources } = map; + let index = sources.indexOf(source); + if (index === -1) index = resolvedSources.indexOf(source); + return index; +} + +/** + * Retrieves the source content for a particular source, if its found. Returns null if not. + */ +export function sourceContentFor(map: TraceMap, source: string): string | null { + const { sourcesContent } = map; + if (sourcesContent == null) return null; + const index = sourceIndex(map, source); + return index === -1 ? null : sourcesContent[index]; +} + +/** + * Determines if the source is marked to ignore by the source map. + */ +export function isIgnored(map: TraceMap, source: string): boolean { + const { ignoreList } = map; + if (ignoreList == null) return false; + const index = sourceIndex(map, source); + return index === -1 ? false : ignoreList.includes(index); +} + +/** + * A helper that skips sorting of the input map's mappings array, which can be expensive for larger + * maps. + */ +export function presortedDecodedMap(map: DecodedSourceMap, mapUrl?: string): TraceMap { + const tracer = new TraceMap(clone(map, []), mapUrl); + cast(tracer)._decoded = map.mappings; + return tracer; +} + +/** + * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export function decodedMap( + map: TraceMap, +): Omit & { mappings: readonly SourceMapSegment[][] } { + return clone(map, decodedMappings(map)); +} + +/** + * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export function encodedMap(map: TraceMap): EncodedSourceMap { + return clone(map, encodedMappings(map)); +} + +function clone( + map: TraceMap | DecodedSourceMap, + mappings: T, +): T extends string ? EncodedSourceMap : DecodedSourceMap { + return { + version: map.version, + file: map.file, + names: map.names, + sourceRoot: map.sourceRoot, + sources: map.sources, + sourcesContent: map.sourcesContent, + mappings, + ignoreList: map.ignoreList || (map as XInput).x_google_ignoreList, + } as any; +} + +function OMapping(source: null, line: null, column: null, name: null): InvalidOriginalMapping; +function OMapping( + source: string, + line: number, + column: number, + name: string | null, +): OriginalMapping; +function OMapping( + source: string | null, + line: number | null, + column: number | null, + name: string | null, +): OriginalMapping | InvalidOriginalMapping { + return { source, line, column, name } as any; +} + +function GMapping(line: null, column: null): InvalidGeneratedMapping; +function GMapping(line: number, column: number): GeneratedMapping; +function GMapping( + line: number | null, + column: number | null, +): GeneratedMapping | InvalidGeneratedMapping { + return { line, column } as any; +} + +function traceSegmentInternal( + segments: SourceMapSegment[], + memo: MemoState, + line: number, + column: number, + bias: Bias, +): number; +function traceSegmentInternal( + segments: ReverseSegment[], + memo: MemoState, + line: number, + column: number, + bias: Bias, +): number; +function traceSegmentInternal( + segments: SourceMapSegment[] | ReverseSegment[], + memo: MemoState, + line: number, + column: number, + bias: Bias, +): number { + let index = memoizedBinarySearch(segments, column, memo, line); + if (bsFound) { + index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index); + } else if (bias === LEAST_UPPER_BOUND) index++; + + if (index === -1 || index === segments.length) return -1; + return index; +} + +function sliceGeneratedPositions( + segments: ReverseSegment[], + memo: MemoState, + line: number, + column: number, + bias: Bias, +): GeneratedMapping[] { + let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND); + + // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in + // insertion order) segment that matched. Even if we did respect the bias when tracing, we would + // still need to call `lowerBound()` to find the first segment, which is slower than just looking + // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the + // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to + // match LEAST_UPPER_BOUND. + if (!bsFound && bias === LEAST_UPPER_BOUND) min++; + + if (min === -1 || min === segments.length) return []; + + // We may have found the segment that started at an earlier column. If this is the case, then we + // need to slice all generated segments that match _that_ column, because all such segments span + // to our desired column. + const matchedColumn = bsFound ? column : segments[min][COLUMN]; + + // The binary search is not guaranteed to find the lower bound when a match wasn't found. + if (!bsFound) min = lowerBound(segments, matchedColumn, min); + const max = upperBound(segments, matchedColumn, min); + + const result = []; + for (; min <= max; min++) { + const segment = segments[min]; + result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN])); + } + return result; +} + +function generatedPosition( + map: TraceMap, + source: string, + line: number, + column: number, + bias: Bias, + all: false, +): GeneratedMapping | InvalidGeneratedMapping; +function generatedPosition( + map: TraceMap, + source: string, + line: number, + column: number, + bias: Bias, + all: true, +): GeneratedMapping[]; +function generatedPosition( + map: TraceMap, + source: string, + line: number, + column: number, + bias: Bias, + all: boolean, +): GeneratedMapping | InvalidGeneratedMapping | GeneratedMapping[] { + line--; + if (line < 0) throw new Error(LINE_GTR_ZERO); + if (column < 0) throw new Error(COL_GTR_EQ_ZERO); + + const { sources, resolvedSources } = map; + let sourceIndex = sources.indexOf(source); + if (sourceIndex === -1) sourceIndex = resolvedSources.indexOf(source); + if (sourceIndex === -1) return all ? [] : GMapping(null, null); + + const bySourceMemos = (cast(map)._bySourceMemos ||= sources.map(memoizedState)); + const generated = (cast(map)._bySources ||= buildBySources(decodedMappings(map), bySourceMemos)); + + const segments = generated[sourceIndex][line]; + if (segments == null) return all ? [] : GMapping(null, null); + + const memo = bySourceMemos[sourceIndex]; + + if (all) return sliceGeneratedPositions(segments, memo, line, column, bias); + + const index = traceSegmentInternal(segments, memo, line, column, bias); + if (index === -1) return GMapping(null, null); + + const segment = segments[index]; + return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/types.ts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/types.ts new file mode 100644 index 0000000..730a61f --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/src/types.ts @@ -0,0 +1,114 @@ +import type { SourceMapSegment } from './sourcemap-segment'; +import type { GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap } from './trace-mapping'; + +export interface SourceMapV3 { + file?: string | null; + names: string[]; + sourceRoot?: string; + sources: (string | null)[]; + sourcesContent?: (string | null)[]; + version: 3; + ignoreList?: number[]; +} + +export interface EncodedSourceMap extends SourceMapV3 { + mappings: string; +} + +export interface DecodedSourceMap extends SourceMapV3 { + mappings: SourceMapSegment[][]; +} + +export interface Section { + offset: { line: number; column: number }; + map: EncodedSourceMap | DecodedSourceMap | SectionedSourceMap; +} + +export interface SectionedSourceMap { + file?: string | null; + sections: Section[]; + version: 3; +} + +export type OriginalMapping = { + source: string | null; + line: number; + column: number; + name: string | null; +}; + +export type InvalidOriginalMapping = { + source: null; + line: null; + column: null; + name: null; +}; + +export type GeneratedMapping = { + line: number; + column: number; +}; +export type InvalidGeneratedMapping = { + line: null; + column: null; +}; + +export type Bias = typeof GREATEST_LOWER_BOUND | typeof LEAST_UPPER_BOUND; + +export type XInput = { x_google_ignoreList?: SourceMapV3['ignoreList'] }; +export type EncodedSourceMapXInput = EncodedSourceMap & XInput; +export type DecodedSourceMapXInput = DecodedSourceMap & XInput; +export type SectionedSourceMapXInput = Omit & { + sections: SectionXInput[]; +}; +export type SectionXInput = Omit & { + map: SectionedSourceMapInput; +}; + +export type SourceMapInput = string | EncodedSourceMapXInput | DecodedSourceMapXInput | TraceMap; +export type SectionedSourceMapInput = SourceMapInput | SectionedSourceMapXInput; + +export type Needle = { line: number; column: number; bias?: Bias }; +export type SourceNeedle = { source: string; line: number; column: number; bias?: Bias }; + +export type EachMapping = + | { + generatedLine: number; + generatedColumn: number; + source: null; + originalLine: null; + originalColumn: null; + name: null; + } + | { + generatedLine: number; + generatedColumn: number; + source: string | null; + originalLine: number; + originalColumn: number; + name: string | null; + }; + +export abstract class SourceMap { + declare version: SourceMapV3['version']; + declare file: SourceMapV3['file']; + declare names: SourceMapV3['names']; + declare sourceRoot: SourceMapV3['sourceRoot']; + declare sources: SourceMapV3['sources']; + declare sourcesContent: SourceMapV3['sourcesContent']; + declare resolvedSources: SourceMapV3['sources']; + declare ignoreList: SourceMapV3['ignoreList']; +} + +export type Ro = + T extends Array + ? V[] | Readonly | RoArray | Readonly> + : T extends object + ? T | Readonly | RoObject | Readonly> + : T; +type RoArray = Ro[]; +type RoObject = { [K in keyof T]: T[K] | Ro }; + +export function parse(map: T): Exclude { + return typeof map === 'string' ? JSON.parse(map) : (map as Exclude); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts new file mode 100644 index 0000000..b7bb85c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts @@ -0,0 +1,33 @@ +import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment.cts'; +export type MemoState = { + lastKey: number; + lastNeedle: number; + lastIndex: number; +}; +export declare let found: boolean; +/** + * A binary search implementation that returns the index if a match is found. + * If no match is found, then the left-index (the index associated with the item that comes just + * before the desired index) is returned. To maintain proper sort order, a splice would happen at + * the next index: + * + * ```js + * const array = [1, 3]; + * const needle = 2; + * const index = binarySearch(array, needle, (item, needle) => item - needle); + * + * assert.equal(index, 0); + * array.splice(index + 1, 0, needle); + * assert.deepEqual(array, [1, 2, 3]); + * ``` + */ +export declare function binarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, low: number, high: number): number; +export declare function upperBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number; +export declare function lowerBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number; +export declare function memoizedState(): MemoState; +/** + * This overly complicated beast is just to record the last tested line/column and the resulting + * index, allowing us to skip a few tests if mappings are monotonically increasing. + */ +export declare function memoizedBinarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, state: MemoState, key: number): number; +//# sourceMappingURL=binary-search.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map new file mode 100644 index 0000000..648e84c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"binary-search.d.ts","sourceRoot":"","sources":["../src/binary-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG5E,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,IAAI,KAAK,SAAQ,CAAC;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,CAmBR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,aAAa,IAAI,SAAS,CAMzC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAsBR"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts new file mode 100644 index 0000000..19e1e6b --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts @@ -0,0 +1,33 @@ +import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment.mts'; +export type MemoState = { + lastKey: number; + lastNeedle: number; + lastIndex: number; +}; +export declare let found: boolean; +/** + * A binary search implementation that returns the index if a match is found. + * If no match is found, then the left-index (the index associated with the item that comes just + * before the desired index) is returned. To maintain proper sort order, a splice would happen at + * the next index: + * + * ```js + * const array = [1, 3]; + * const needle = 2; + * const index = binarySearch(array, needle, (item, needle) => item - needle); + * + * assert.equal(index, 0); + * array.splice(index + 1, 0, needle); + * assert.deepEqual(array, [1, 2, 3]); + * ``` + */ +export declare function binarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, low: number, high: number): number; +export declare function upperBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number; +export declare function lowerBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number; +export declare function memoizedState(): MemoState; +/** + * This overly complicated beast is just to record the last tested line/column and the resulting + * index, allowing us to skip a few tests if mappings are monotonically increasing. + */ +export declare function memoizedBinarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, state: MemoState, key: number): number; +//# sourceMappingURL=binary-search.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map new file mode 100644 index 0000000..648e84c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"binary-search.d.ts","sourceRoot":"","sources":["../src/binary-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG5E,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,IAAI,KAAK,SAAQ,CAAC;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,CAmBR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,aAAa,IAAI,SAAS,CAMzC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAsBR"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts new file mode 100644 index 0000000..da49693 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts @@ -0,0 +1,4 @@ +import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment.cts'; +export type Source = ReverseSegment[][]; +export = function buildBySources(decoded: readonly SourceMapSegment[][], memos: unknown[]): Source[]; +//# sourceMappingURL=by-source.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map new file mode 100644 index 0000000..32d2a7a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"by-source.d.ts","sourceRoot":"","sources":["../src/by-source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,MAAM,MAAM,GAAG,cAAc,EAAE,EAAE,CAAC;AAIxC,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,EACtC,KAAK,EAAE,OAAO,EAAE,GACf,MAAM,EAAE,CA4BV"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts new file mode 100644 index 0000000..f361049 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts @@ -0,0 +1,4 @@ +import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment.mts'; +export type Source = ReverseSegment[][]; +export default function buildBySources(decoded: readonly SourceMapSegment[][], memos: unknown[]): Source[]; +//# sourceMappingURL=by-source.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map new file mode 100644 index 0000000..32d2a7a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"by-source.d.ts","sourceRoot":"","sources":["../src/by-source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,MAAM,MAAM,GAAG,cAAc,EAAE,EAAE,CAAC;AAIxC,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,EACtC,KAAK,EAAE,OAAO,EAAE,GACf,MAAM,EAAE,CA4BV"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts new file mode 100644 index 0000000..433d849 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts @@ -0,0 +1,9 @@ +import { TraceMap } from './trace-mapping.cts'; +import type { SectionedSourceMapInput, Ro } from './types.cts'; +type FlattenMap = { + new (map: Ro, mapUrl?: string | null): TraceMap; + (map: Ro, mapUrl?: string | null): TraceMap; +}; +export declare const FlattenMap: FlattenMap; +export {}; +//# sourceMappingURL=flatten-map.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map new file mode 100644 index 0000000..994b208 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"flatten-map.d.ts","sourceRoot":"","sources":["../src/flatten-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwC,MAAM,iBAAiB,CAAC;AAUjF,OAAO,KAAK,EAKV,uBAAuB,EAEvB,EAAE,EACH,MAAM,SAAS,CAAC;AAGjB,KAAK,UAAU,GAAG;IAChB,KAAK,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;IACzE,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;CACtE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAsCV,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts new file mode 100644 index 0000000..444a1be --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts @@ -0,0 +1,9 @@ +import { TraceMap } from './trace-mapping.mts'; +import type { SectionedSourceMapInput, Ro } from './types.mts'; +type FlattenMap = { + new (map: Ro, mapUrl?: string | null): TraceMap; + (map: Ro, mapUrl?: string | null): TraceMap; +}; +export declare const FlattenMap: FlattenMap; +export {}; +//# sourceMappingURL=flatten-map.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map new file mode 100644 index 0000000..994b208 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"flatten-map.d.ts","sourceRoot":"","sources":["../src/flatten-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwC,MAAM,iBAAiB,CAAC;AAUjF,OAAO,KAAK,EAKV,uBAAuB,EAEvB,EAAE,EACH,MAAM,SAAS,CAAC;AAGjB,KAAK,UAAU,GAAG;IAChB,KAAK,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;IACzE,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;CACtE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAsCV,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts new file mode 100644 index 0000000..62aeedb --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts @@ -0,0 +1,4 @@ +type Resolve = (source: string | null) => string; +export = function resolver(mapUrl: string | null | undefined, sourceRoot: string | undefined): Resolve; +export {}; +//# sourceMappingURL=resolve.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map new file mode 100644 index 0000000..9f155ac --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAGA,KAAK,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;AACjD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAQT"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts new file mode 100644 index 0000000..e2798a1 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts @@ -0,0 +1,4 @@ +type Resolve = (source: string | null) => string; +export default function resolver(mapUrl: string | null | undefined, sourceRoot: string | undefined): Resolve; +export {}; +//# sourceMappingURL=resolve.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map new file mode 100644 index 0000000..9f155ac --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAGA,KAAK,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;AACjD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAQT"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.cts new file mode 100644 index 0000000..aa14c12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.cts @@ -0,0 +1,4 @@ +import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment.cts'; +export = function maybeSort(mappings: SourceMapSegment[][], owned: boolean): SourceMapSegment[][]; +export declare function sortComparator(a: T, b: T): number; +//# sourceMappingURL=sort.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map new file mode 100644 index 0000000..48b8e67 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,QAAQ,EAAE,gBAAgB,EAAE,EAAE,EAC9B,KAAK,EAAE,OAAO,GACb,gBAAgB,EAAE,EAAE,CAYtB;AAuBD,wBAAgB,cAAc,CAAC,CAAC,SAAS,gBAAgB,GAAG,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAE9F"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.mts new file mode 100644 index 0000000..c5b94e6 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.mts @@ -0,0 +1,4 @@ +import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment.mts'; +export default function maybeSort(mappings: SourceMapSegment[][], owned: boolean): SourceMapSegment[][]; +export declare function sortComparator(a: T, b: T): number; +//# sourceMappingURL=sort.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map new file mode 100644 index 0000000..48b8e67 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,QAAQ,EAAE,gBAAgB,EAAE,EAAE,EAC9B,KAAK,EAAE,OAAO,GACb,gBAAgB,EAAE,EAAE,CAYtB;AAuBD,wBAAgB,cAAc,CAAC,CAAC,SAAS,gBAAgB,GAAG,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAE9F"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts new file mode 100644 index 0000000..8d3cabc --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts @@ -0,0 +1,17 @@ +type GeneratedColumn = number; +type SourcesIndex = number; +type SourceLine = number; +type SourceColumn = number; +type NamesIndex = number; +type GeneratedLine = number; +export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; +export type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn]; +export declare const COLUMN = 0; +export declare const SOURCES_INDEX = 1; +export declare const SOURCE_LINE = 2; +export declare const SOURCE_COLUMN = 3; +export declare const NAMES_INDEX = 4; +export declare const REV_GENERATED_LINE = 1; +export declare const REV_GENERATED_COLUMN = 2; +export {}; +//# sourceMappingURL=sourcemap-segment.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map new file mode 100644 index 0000000..0c94a46 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"sourcemap-segment.d.ts","sourceRoot":"","sources":["../src/sourcemap-segment.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC;AAC9B,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AACzB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,KAAK,aAAa,GAAG,MAAM,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GACxB,CAAC,eAAe,CAAC,GACjB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,GACzD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;AAE5E,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,oBAAoB,IAAI,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts new file mode 100644 index 0000000..8d3cabc --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts @@ -0,0 +1,17 @@ +type GeneratedColumn = number; +type SourcesIndex = number; +type SourceLine = number; +type SourceColumn = number; +type NamesIndex = number; +type GeneratedLine = number; +export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; +export type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn]; +export declare const COLUMN = 0; +export declare const SOURCES_INDEX = 1; +export declare const SOURCE_LINE = 2; +export declare const SOURCE_COLUMN = 3; +export declare const NAMES_INDEX = 4; +export declare const REV_GENERATED_LINE = 1; +export declare const REV_GENERATED_COLUMN = 2; +export {}; +//# sourceMappingURL=sourcemap-segment.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map new file mode 100644 index 0000000..0c94a46 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"sourcemap-segment.d.ts","sourceRoot":"","sources":["../src/sourcemap-segment.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC;AAC9B,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AACzB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,KAAK,aAAa,GAAG,MAAM,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GACxB,CAAC,eAAe,CAAC,GACjB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,GACzD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;AAE5E,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,oBAAoB,IAAI,CAAC"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts new file mode 100644 index 0000000..8b3c0e9 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts @@ -0,0 +1,5 @@ +/** + * Removes everything after the last "/", but leaves the slash. + */ +export = function stripFilename(path: string | undefined | null): string; +//# sourceMappingURL=strip-filename.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map new file mode 100644 index 0000000..17a25da --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"strip-filename.d.ts","sourceRoot":"","sources":["../src/strip-filename.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAI7E"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts new file mode 100644 index 0000000..cbbaee0 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts @@ -0,0 +1,5 @@ +/** + * Removes everything after the last "/", but leaves the slash. + */ +export default function stripFilename(path: string | undefined | null): string; +//# sourceMappingURL=strip-filename.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map new file mode 100644 index 0000000..17a25da --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"strip-filename.d.ts","sourceRoot":"","sources":["../src/strip-filename.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAI7E"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts new file mode 100644 index 0000000..a40f305 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts @@ -0,0 +1,80 @@ +import type { SourceMapSegment } from './sourcemap-segment.cts'; +import type { SourceMapV3, DecodedSourceMap, EncodedSourceMap, InvalidOriginalMapping, OriginalMapping, InvalidGeneratedMapping, GeneratedMapping, SourceMapInput, Needle, SourceNeedle, SourceMap, EachMapping, Ro } from './types.cts'; +export type { SourceMapSegment } from './sourcemap-segment.cts'; +export type { SourceMap, DecodedSourceMap, EncodedSourceMap, Section, SectionedSourceMap, SourceMapV3, Bias, EachMapping, GeneratedMapping, InvalidGeneratedMapping, InvalidOriginalMapping, Needle, OriginalMapping, OriginalMapping as Mapping, SectionedSourceMapInput, SourceMapInput, SourceNeedle, XInput, EncodedSourceMapXInput, DecodedSourceMapXInput, SectionedSourceMapXInput, SectionXInput, } from './types.cts'; +export declare const LEAST_UPPER_BOUND = -1; +export declare const GREATEST_LOWER_BOUND = 1; +export { FlattenMap, FlattenMap as AnyMap } from './flatten-map.cts'; +export declare class TraceMap implements SourceMap { + version: SourceMapV3['version']; + file: SourceMapV3['file']; + names: SourceMapV3['names']; + sourceRoot: SourceMapV3['sourceRoot']; + sources: SourceMapV3['sources']; + sourcesContent: SourceMapV3['sourcesContent']; + ignoreList: SourceMapV3['ignoreList']; + resolvedSources: string[]; + private _encoded; + private _decoded; + private _decodedMemo; + private _bySources; + private _bySourceMemos; + constructor(map: Ro, mapUrl?: string | null); +} +/** + * Returns the encoded (VLQ string) form of the SourceMap's mappings field. + */ +export declare function encodedMappings(map: TraceMap): EncodedSourceMap['mappings']; +/** + * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field. + */ +export declare function decodedMappings(map: TraceMap): Readonly; +/** + * A low-level API to find the segment associated with a generated line/column (think, from a + * stack trace). Line and column here are 0-based, unlike `originalPositionFor`. + */ +export declare function traceSegment(map: TraceMap, line: number, column: number): Readonly | null; +/** + * A higher-level API to find the source/line/column associated with a generated line/column + * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in + * `source-map` library. + */ +export declare function originalPositionFor(map: TraceMap, needle: Needle): OriginalMapping | InvalidOriginalMapping; +/** + * Finds the generated line/column position of the provided source/line/column source position. + */ +export declare function generatedPositionFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping | InvalidGeneratedMapping; +/** + * Finds all generated line/column positions of the provided source/line/column source position. + */ +export declare function allGeneratedPositionsFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping[]; +/** + * Iterates each mapping in generated position order. + */ +export declare function eachMapping(map: TraceMap, cb: (mapping: EachMapping) => void): void; +/** + * Retrieves the source content for a particular source, if its found. Returns null if not. + */ +export declare function sourceContentFor(map: TraceMap, source: string): string | null; +/** + * Determines if the source is marked to ignore by the source map. + */ +export declare function isIgnored(map: TraceMap, source: string): boolean; +/** + * A helper that skips sorting of the input map's mappings array, which can be expensive for larger + * maps. + */ +export declare function presortedDecodedMap(map: DecodedSourceMap, mapUrl?: string): TraceMap; +/** + * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export declare function decodedMap(map: TraceMap): Omit & { + mappings: readonly SourceMapSegment[][]; +}; +/** + * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export declare function encodedMap(map: TraceMap): EncodedSourceMap; +//# sourceMappingURL=trace-mapping.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map new file mode 100644 index 0000000..b5a874c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"trace-mapping.d.ts","sourceRoot":"","sources":["../src/trace-mapping.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts new file mode 100644 index 0000000..bc2ff0f --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts @@ -0,0 +1,80 @@ +import type { SourceMapSegment } from './sourcemap-segment.mts'; +import type { SourceMapV3, DecodedSourceMap, EncodedSourceMap, InvalidOriginalMapping, OriginalMapping, InvalidGeneratedMapping, GeneratedMapping, SourceMapInput, Needle, SourceNeedle, SourceMap, EachMapping, Ro } from './types.mts'; +export type { SourceMapSegment } from './sourcemap-segment.mts'; +export type { SourceMap, DecodedSourceMap, EncodedSourceMap, Section, SectionedSourceMap, SourceMapV3, Bias, EachMapping, GeneratedMapping, InvalidGeneratedMapping, InvalidOriginalMapping, Needle, OriginalMapping, OriginalMapping as Mapping, SectionedSourceMapInput, SourceMapInput, SourceNeedle, XInput, EncodedSourceMapXInput, DecodedSourceMapXInput, SectionedSourceMapXInput, SectionXInput, } from './types.mts'; +export declare const LEAST_UPPER_BOUND = -1; +export declare const GREATEST_LOWER_BOUND = 1; +export { FlattenMap, FlattenMap as AnyMap } from './flatten-map.mts'; +export declare class TraceMap implements SourceMap { + version: SourceMapV3['version']; + file: SourceMapV3['file']; + names: SourceMapV3['names']; + sourceRoot: SourceMapV3['sourceRoot']; + sources: SourceMapV3['sources']; + sourcesContent: SourceMapV3['sourcesContent']; + ignoreList: SourceMapV3['ignoreList']; + resolvedSources: string[]; + private _encoded; + private _decoded; + private _decodedMemo; + private _bySources; + private _bySourceMemos; + constructor(map: Ro, mapUrl?: string | null); +} +/** + * Returns the encoded (VLQ string) form of the SourceMap's mappings field. + */ +export declare function encodedMappings(map: TraceMap): EncodedSourceMap['mappings']; +/** + * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field. + */ +export declare function decodedMappings(map: TraceMap): Readonly; +/** + * A low-level API to find the segment associated with a generated line/column (think, from a + * stack trace). Line and column here are 0-based, unlike `originalPositionFor`. + */ +export declare function traceSegment(map: TraceMap, line: number, column: number): Readonly | null; +/** + * A higher-level API to find the source/line/column associated with a generated line/column + * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in + * `source-map` library. + */ +export declare function originalPositionFor(map: TraceMap, needle: Needle): OriginalMapping | InvalidOriginalMapping; +/** + * Finds the generated line/column position of the provided source/line/column source position. + */ +export declare function generatedPositionFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping | InvalidGeneratedMapping; +/** + * Finds all generated line/column positions of the provided source/line/column source position. + */ +export declare function allGeneratedPositionsFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping[]; +/** + * Iterates each mapping in generated position order. + */ +export declare function eachMapping(map: TraceMap, cb: (mapping: EachMapping) => void): void; +/** + * Retrieves the source content for a particular source, if its found. Returns null if not. + */ +export declare function sourceContentFor(map: TraceMap, source: string): string | null; +/** + * Determines if the source is marked to ignore by the source map. + */ +export declare function isIgnored(map: TraceMap, source: string): boolean; +/** + * A helper that skips sorting of the input map's mappings array, which can be expensive for larger + * maps. + */ +export declare function presortedDecodedMap(map: DecodedSourceMap, mapUrl?: string): TraceMap; +/** + * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export declare function decodedMap(map: TraceMap): Omit & { + mappings: readonly SourceMapSegment[][]; +}; +/** + * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects + * a sourcemap, or to JSON.stringify. + */ +export declare function encodedMap(map: TraceMap): EncodedSourceMap; +//# sourceMappingURL=trace-mapping.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map new file mode 100644 index 0000000..b5a874c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"trace-mapping.d.ts","sourceRoot":"","sources":["../src/trace-mapping.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.cts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.cts new file mode 100644 index 0000000..729c2c3 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.cts @@ -0,0 +1,107 @@ +import type { SourceMapSegment } from './sourcemap-segment.cts'; +import type { GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap } from './trace-mapping.cts'; +export interface SourceMapV3 { + file?: string | null; + names: string[]; + sourceRoot?: string; + sources: (string | null)[]; + sourcesContent?: (string | null)[]; + version: 3; + ignoreList?: number[]; +} +export interface EncodedSourceMap extends SourceMapV3 { + mappings: string; +} +export interface DecodedSourceMap extends SourceMapV3 { + mappings: SourceMapSegment[][]; +} +export interface Section { + offset: { + line: number; + column: number; + }; + map: EncodedSourceMap | DecodedSourceMap | SectionedSourceMap; +} +export interface SectionedSourceMap { + file?: string | null; + sections: Section[]; + version: 3; +} +export type OriginalMapping = { + source: string | null; + line: number; + column: number; + name: string | null; +}; +export type InvalidOriginalMapping = { + source: null; + line: null; + column: null; + name: null; +}; +export type GeneratedMapping = { + line: number; + column: number; +}; +export type InvalidGeneratedMapping = { + line: null; + column: null; +}; +export type Bias = typeof GREATEST_LOWER_BOUND | typeof LEAST_UPPER_BOUND; +export type XInput = { + x_google_ignoreList?: SourceMapV3['ignoreList']; +}; +export type EncodedSourceMapXInput = EncodedSourceMap & XInput; +export type DecodedSourceMapXInput = DecodedSourceMap & XInput; +export type SectionedSourceMapXInput = Omit & { + sections: SectionXInput[]; +}; +export type SectionXInput = Omit & { + map: SectionedSourceMapInput; +}; +export type SourceMapInput = string | EncodedSourceMapXInput | DecodedSourceMapXInput | TraceMap; +export type SectionedSourceMapInput = SourceMapInput | SectionedSourceMapXInput; +export type Needle = { + line: number; + column: number; + bias?: Bias; +}; +export type SourceNeedle = { + source: string; + line: number; + column: number; + bias?: Bias; +}; +export type EachMapping = { + generatedLine: number; + generatedColumn: number; + source: null; + originalLine: null; + originalColumn: null; + name: null; +} | { + generatedLine: number; + generatedColumn: number; + source: string | null; + originalLine: number; + originalColumn: number; + name: string | null; +}; +export declare abstract class SourceMap { + version: SourceMapV3['version']; + file: SourceMapV3['file']; + names: SourceMapV3['names']; + sourceRoot: SourceMapV3['sourceRoot']; + sources: SourceMapV3['sources']; + sourcesContent: SourceMapV3['sourcesContent']; + resolvedSources: SourceMapV3['sources']; + ignoreList: SourceMapV3['ignoreList']; +} +export type Ro = T extends Array ? V[] | Readonly | RoArray | Readonly> : T extends object ? T | Readonly | RoObject | Readonly> : T; +type RoArray = Ro[]; +type RoObject = { + [K in keyof T]: T[K] | Ro; +}; +export declare function parse(map: T): Exclude; +export {}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map new file mode 100644 index 0000000..9224783 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.mts b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.mts new file mode 100644 index 0000000..a26d186 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.mts @@ -0,0 +1,107 @@ +import type { SourceMapSegment } from './sourcemap-segment.mts'; +import type { GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap } from './trace-mapping.mts'; +export interface SourceMapV3 { + file?: string | null; + names: string[]; + sourceRoot?: string; + sources: (string | null)[]; + sourcesContent?: (string | null)[]; + version: 3; + ignoreList?: number[]; +} +export interface EncodedSourceMap extends SourceMapV3 { + mappings: string; +} +export interface DecodedSourceMap extends SourceMapV3 { + mappings: SourceMapSegment[][]; +} +export interface Section { + offset: { + line: number; + column: number; + }; + map: EncodedSourceMap | DecodedSourceMap | SectionedSourceMap; +} +export interface SectionedSourceMap { + file?: string | null; + sections: Section[]; + version: 3; +} +export type OriginalMapping = { + source: string | null; + line: number; + column: number; + name: string | null; +}; +export type InvalidOriginalMapping = { + source: null; + line: null; + column: null; + name: null; +}; +export type GeneratedMapping = { + line: number; + column: number; +}; +export type InvalidGeneratedMapping = { + line: null; + column: null; +}; +export type Bias = typeof GREATEST_LOWER_BOUND | typeof LEAST_UPPER_BOUND; +export type XInput = { + x_google_ignoreList?: SourceMapV3['ignoreList']; +}; +export type EncodedSourceMapXInput = EncodedSourceMap & XInput; +export type DecodedSourceMapXInput = DecodedSourceMap & XInput; +export type SectionedSourceMapXInput = Omit & { + sections: SectionXInput[]; +}; +export type SectionXInput = Omit & { + map: SectionedSourceMapInput; +}; +export type SourceMapInput = string | EncodedSourceMapXInput | DecodedSourceMapXInput | TraceMap; +export type SectionedSourceMapInput = SourceMapInput | SectionedSourceMapXInput; +export type Needle = { + line: number; + column: number; + bias?: Bias; +}; +export type SourceNeedle = { + source: string; + line: number; + column: number; + bias?: Bias; +}; +export type EachMapping = { + generatedLine: number; + generatedColumn: number; + source: null; + originalLine: null; + originalColumn: null; + name: null; +} | { + generatedLine: number; + generatedColumn: number; + source: string | null; + originalLine: number; + originalColumn: number; + name: string | null; +}; +export declare abstract class SourceMap { + version: SourceMapV3['version']; + file: SourceMapV3['file']; + names: SourceMapV3['names']; + sourceRoot: SourceMapV3['sourceRoot']; + sources: SourceMapV3['sources']; + sourcesContent: SourceMapV3['sourcesContent']; + resolvedSources: SourceMapV3['sources']; + ignoreList: SourceMapV3['ignoreList']; +} +export type Ro = T extends Array ? V[] | Readonly | RoArray | Readonly> : T extends object ? T | Readonly | RoObject | Readonly> : T; +type RoArray = Ro[]; +type RoObject = { + [K in keyof T]: T[K] | Ro; +}; +export declare function parse(map: T): Exclude; +export {}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map new file mode 100644 index 0000000..9224783 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/.jshintrc b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/.jshintrc new file mode 100644 index 0000000..979105e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/.jshintrc @@ -0,0 +1,4 @@ +{ + "node":true, + "strict":true +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/.npmignore b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/.npmignore new file mode 100644 index 0000000..1354abc --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/.npmignore @@ -0,0 +1,7 @@ +.git* +test/ +test-browser/ +build/ +.travis.yml +*.swp +Makefile diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/LICENSE new file mode 100644 index 0000000..9187fe5 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2014-2016 Kevin Beaty + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/README.md b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/README.md new file mode 100644 index 0000000..174bea4 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/README.md @@ -0,0 +1,161 @@ +## Any Promise + +[![Build Status](https://secure.travis-ci.org/kevinbeaty/any-promise.svg)](http://travis-ci.org/kevinbeaty/any-promise) + +Let your library support any ES 2015 (ES6) compatible `Promise` and leave the choice to application authors. The application can *optionally* register its preferred `Promise` implementation and it will be exported when requiring `any-promise` from library code. + +If no preference is registered, defaults to the global `Promise` for newer Node.js versions. The browser version defaults to the window `Promise`, so polyfill or register as necessary. + +### Usage with global Promise: + +Assuming the global `Promise` is the desired implementation: + +```bash +# Install any libraries depending on any-promise +$ npm install mz +``` + +The installed libraries will use global Promise by default. + +```js +// in library +var Promise = require('any-promise') // the global Promise + +function promiseReturningFunction(){ + return new Promise(function(resolve, reject){...}) +} +``` + +### Usage with registration: + +Assuming `bluebird` is the desired Promise implementation: + +```bash +# Install preferred promise library +$ npm install bluebird +# Install any-promise to allow registration +$ npm install any-promise +# Install any libraries you would like to use depending on any-promise +$ npm install mz +``` + +Register your preference in the application entry point before any other `require` of packages that load `any-promise`: + +```javascript +// top of application index.js or other entry point +require('any-promise/register/bluebird') + +// -or- Equivalent to above, but allows customization of Promise library +require('any-promise/register')('bluebird', {Promise: require('bluebird')}) +``` + +Now that the implementation is registered, you can use any package depending on `any-promise`: + + +```javascript +var fsp = require('mz/fs') // mz/fs will use registered bluebird promises +var Promise = require('any-promise') // the registered bluebird promise +``` + +It is safe to call `register` multiple times, but it must always be with the same implementation. + +Again, registration is *optional*. It should only be called by the application user if overriding the global `Promise` implementation is desired. + +### Optional Application Registration + +As an application author, you can *optionally* register a preferred `Promise` implementation on application startup (before any call to `require('any-promise')`: + +You must register your preference before any call to `require('any-promise')` (by you or required packages), and only one implementation can be registered. Typically, this registration would occur at the top of the application entry point. + + +#### Registration shortcuts + +If you are using a known `Promise` implementation, you can register your preference with a shortcut: + + +```js +require('any-promise/register/bluebird') +// -or- +import 'any-promise/register/q'; +``` + +Shortcut registration is the preferred registration method as it works in the browser and Node.js. It is also convenient for using with `import` and many test runners, that offer a `--require` flag: + +``` +$ ava --require=any-promise/register/bluebird test.js +``` + +Current known implementations include `bluebird`, `q`, `when`, `rsvp`, `es6-promise`, `promise`, `native-promise-only`, `pinkie`, `vow` and `lie`. If you are not using a known implementation, you can use another registration method described below. + + +#### Basic Registration + +As an alternative to registration shortcuts, you can call the `register` function with the preferred `Promise` implementation. The benefit of this approach is that a `Promise` library can be required by name without being a known implementation. This approach does NOT work in the browser. To use `any-promise` in the browser use either registration shortcuts or specify the `Promise` constructor using advanced registration (see below). + +```javascript +require('any-promise/register')('when') +// -or- require('any-promise/register')('any other ES6 compatible library (known or otherwise)') +``` + +This registration method will try to detect the `Promise` constructor from requiring the specified implementation. If you would like to specify your own constructor, see advanced registration. + + +#### Advanced Registration + +To use the browser version, you should either install a polyfill or explicitly register the `Promise` constructor: + +```javascript +require('any-promise/register')('bluebird', {Promise: require('bluebird')}) +``` + +This could also be used for registering a custom `Promise` implementation or subclass. + +Your preference will be registered globally, allowing a single registration even if multiple versions of `any-promise` are installed in the NPM dependency tree or are using multiple bundled JavaScript files in the browser. You can bypass this global registration in options: + + +```javascript +require('../register')('es6-promise', {Promise: require('es6-promise').Promise, global: false}) +``` + +### Library Usage + +To use any `Promise` constructor, simply require it: + +```javascript +var Promise = require('any-promise'); + +return Promise + .all([xf, f, init, coll]) + .then(fn); + + +return new Promise(function(resolve, reject){ + try { + resolve(item); + } catch(e){ + reject(e); + } +}); + +``` + +Except noted below, libraries using `any-promise` should only use [documented](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) functions as there is no guarantee which implementation will be chosen by the application author. Libraries should never call `register`, only the application user should call if desired. + + +#### Advanced Library Usage + +If your library needs to branch code based on the registered implementation, you can retrieve it using `var impl = require('any-promise/implementation')`, where `impl` will be the package name (`"bluebird"`, `"when"`, etc.) if registered, `"global.Promise"` if using the global version on Node.js, or `"window.Promise"` if using the browser version. You should always include a default case, as there is no guarantee what package may be registered. + + +### Support for old Node.js versions + +Node.js versions prior to `v0.12` may have contained buggy versions of the global `Promise`. For this reason, the global `Promise` is not loaded automatically for these old versions. If using `any-promise` in Node.js versions versions `<= v0.12`, the user should register a desired implementation. + +If an implementation is not registered, `any-promise` will attempt to discover an installed `Promise` implementation. If no implementation can be found, an error will be thrown on `require('any-promise')`. While the auto-discovery usually avoids errors, it is non-deterministic. It is recommended that the user always register a preferred implementation for older Node.js versions. + +This auto-discovery is only available for Node.jS versions prior to `v0.12`. Any newer versions will always default to the global `Promise` implementation. + +### Related + +- [any-observable](https://github.com/sindresorhus/any-observable) - `any-promise` for Observables. + diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/implementation.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/implementation.d.ts new file mode 100644 index 0000000..c331a56 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/implementation.d.ts @@ -0,0 +1,3 @@ +declare var implementation: string; + +export = implementation; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/implementation.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/implementation.js new file mode 100644 index 0000000..a45ae94 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/implementation.js @@ -0,0 +1 @@ +module.exports = require('./register')().implementation diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/index.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/index.d.ts new file mode 100644 index 0000000..9f646c5 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/index.d.ts @@ -0,0 +1,73 @@ +declare class Promise implements Promise.Thenable { + /** + * If you call resolve in the body of the callback passed to the constructor, + * your promise is fulfilled with result object passed to resolve. + * If you call reject your promise is rejected with the object passed to resolve. + * For consistency and debugging (eg stack traces), obj should be an instanceof Error. + * Any errors thrown in the constructor callback will be implicitly passed to reject(). + */ + constructor (callback: (resolve : (value?: R | Promise.Thenable) => void, reject: (error?: any) => void) => void); + + /** + * onFulfilled is called when/if "promise" resolves. onRejected is called when/if "promise" rejects. + * Both are optional, if either/both are omitted the next onFulfilled/onRejected in the chain is called. + * Both callbacks have a single parameter , the fulfillment value or rejection reason. + * "then" returns a new promise equivalent to the value you return from onFulfilled/onRejected after being passed through Promise.resolve. + * If an error is thrown in the callback, the returned promise rejects with that error. + * + * @param onFulfilled called when/if "promise" resolves + * @param onRejected called when/if "promise" rejects + */ + then (onFulfilled?: (value: R) => U | Promise.Thenable, onRejected?: (error: any) => U | Promise.Thenable): Promise; + then (onFulfilled?: (value: R) => U | Promise.Thenable, onRejected?: (error: any) => void): Promise; + + /** + * Sugar for promise.then(undefined, onRejected) + * + * @param onRejected called when/if "promise" rejects + */ + catch (onRejected?: (error: any) => U | Promise.Thenable): Promise; + + /** + * Make a new promise from the thenable. + * A thenable is promise-like in as far as it has a "then" method. + */ + static resolve (): Promise; + static resolve (value: R | Promise.Thenable): Promise; + + /** + * Make a promise that rejects to obj. For consistency and debugging (eg stack traces), obj should be an instanceof Error + */ + static reject (error: any): Promise; + + /** + * Make a promise that fulfills when every item in the array fulfills, and rejects if (and when) any item rejects. + * the array passed to all can be a mixture of promise-like objects and other objects. + * The fulfillment value is an array (in order) of fulfillment values. The rejection value is the first rejection value. + */ + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable, T9 | Promise.Thenable, T10 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable, T9 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable ]): Promise<[T1, T2, T3, T4]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable]): Promise<[T1, T2, T3]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable]): Promise<[T1, T2]>; + static all (values: [T1 | Promise.Thenable]): Promise<[T1]>; + static all (values: Array>): Promise; + + /** + * Make a Promise that fulfills when any item fulfills, and rejects if any item rejects. + */ + static race (promises: (R | Promise.Thenable)[]): Promise; +} + +declare namespace Promise { + export interface Thenable { + then (onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => U | Thenable): Thenable; + then (onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => void): Thenable; + } +} + +export = Promise; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/index.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/index.js new file mode 100644 index 0000000..74b8548 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/index.js @@ -0,0 +1 @@ +module.exports = require('./register')().Promise diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/loader.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/loader.js new file mode 100644 index 0000000..e164914 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/loader.js @@ -0,0 +1,78 @@ +"use strict" + // global key for user preferred registration +var REGISTRATION_KEY = '@@any-promise/REGISTRATION', + // Prior registration (preferred or detected) + registered = null + +/** + * Registers the given implementation. An implementation must + * be registered prior to any call to `require("any-promise")`, + * typically on application load. + * + * If called with no arguments, will return registration in + * following priority: + * + * For Node.js: + * + * 1. Previous registration + * 2. global.Promise if node.js version >= 0.12 + * 3. Auto detected promise based on first sucessful require of + * known promise libraries. Note this is a last resort, as the + * loaded library is non-deterministic. node.js >= 0.12 will + * always use global.Promise over this priority list. + * 4. Throws error. + * + * For Browser: + * + * 1. Previous registration + * 2. window.Promise + * 3. Throws error. + * + * Options: + * + * Promise: Desired Promise constructor + * global: Boolean - Should the registration be cached in a global variable to + * allow cross dependency/bundle registration? (default true) + */ +module.exports = function(root, loadImplementation){ + return function register(implementation, opts){ + implementation = implementation || null + opts = opts || {} + // global registration unless explicitly {global: false} in options (default true) + var registerGlobal = opts.global !== false; + + // load any previous global registration + if(registered === null && registerGlobal){ + registered = root[REGISTRATION_KEY] || null + } + + if(registered !== null + && implementation !== null + && registered.implementation !== implementation){ + // Throw error if attempting to redefine implementation + throw new Error('any-promise already defined as "'+registered.implementation+ + '". You can only register an implementation before the first '+ + ' call to require("any-promise") and an implementation cannot be changed') + } + + if(registered === null){ + // use provided implementation + if(implementation !== null && typeof opts.Promise !== 'undefined'){ + registered = { + Promise: opts.Promise, + implementation: implementation + } + } else { + // require implementation if implementation is specified but not provided + registered = loadImplementation(implementation) + } + + if(registerGlobal){ + // register preference globally in case multiple installations + root[REGISTRATION_KEY] = registered + } + } + + return registered + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/optional.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/optional.js new file mode 100644 index 0000000..f388942 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/optional.js @@ -0,0 +1,6 @@ +"use strict"; +try { + module.exports = require('./register')().Promise || null +} catch(e) { + module.exports = null +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/package.json b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/package.json new file mode 100644 index 0000000..5baf14c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/package.json @@ -0,0 +1,45 @@ +{ + "name": "any-promise", + "version": "1.3.0", + "description": "Resolve any installed ES6 compatible promise", + "main": "index.js", + "typings": "index.d.ts", + "browser": { + "./register.js": "./register-shim.js" + }, + "scripts": { + "test": "ava" + }, + "repository": { + "type": "git", + "url": "https://github.com/kevinbeaty/any-promise" + }, + "keywords": [ + "promise", + "es6" + ], + "author": "Kevin Beaty", + "license": "MIT", + "bugs": { + "url": "https://github.com/kevinbeaty/any-promise/issues" + }, + "homepage": "http://github.com/kevinbeaty/any-promise", + "dependencies": {}, + "devDependencies": { + "ava": "^0.14.0", + "bluebird": "^3.0.0", + "es6-promise": "^3.0.0", + "is-promise": "^2.0.0", + "lie": "^3.0.0", + "mocha": "^2.0.0", + "native-promise-only": "^0.8.0", + "phantomjs-prebuilt": "^2.0.0", + "pinkie": "^2.0.0", + "promise": "^7.0.0", + "q": "^1.0.0", + "rsvp": "^3.0.0", + "vow": "^0.4.0", + "when": "^3.0.0", + "zuul": "^3.0.0" + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register-shim.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register-shim.js new file mode 100644 index 0000000..9049405 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register-shim.js @@ -0,0 +1,18 @@ +"use strict"; +module.exports = require('./loader')(window, loadImplementation) + +/** + * Browser specific loadImplementation. Always uses `window.Promise` + * + * To register a custom implementation, must register with `Promise` option. + */ +function loadImplementation(){ + if(typeof window.Promise === 'undefined'){ + throw new Error("any-promise browser requires a polyfill or explicit registration"+ + " e.g: require('any-promise/register/bluebird')") + } + return { + Promise: window.Promise, + implementation: 'window.Promise' + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register.d.ts new file mode 100644 index 0000000..97f2fc0 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register.d.ts @@ -0,0 +1,17 @@ +import Promise = require('./index'); + +declare function register (module?: string, options?: register.Options): register.Register; + +declare namespace register { + export interface Register { + Promise: typeof Promise; + implementation: string; + } + + export interface Options { + Promise?: typeof Promise; + global?: boolean + } +} + +export = register; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register.js new file mode 100644 index 0000000..255c6e2 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register.js @@ -0,0 +1,94 @@ +"use strict" +module.exports = require('./loader')(global, loadImplementation); + +/** + * Node.js version of loadImplementation. + * + * Requires the given implementation and returns the registration + * containing {Promise, implementation} + * + * If implementation is undefined or global.Promise, loads it + * Otherwise uses require + */ +function loadImplementation(implementation){ + var impl = null + + if(shouldPreferGlobalPromise(implementation)){ + // if no implementation or env specified use global.Promise + impl = { + Promise: global.Promise, + implementation: 'global.Promise' + } + } else if(implementation){ + // if implementation specified, require it + var lib = require(implementation) + impl = { + Promise: lib.Promise || lib, + implementation: implementation + } + } else { + // try to auto detect implementation. This is non-deterministic + // and should prefer other branches, but this is our last chance + // to load something without throwing error + impl = tryAutoDetect() + } + + if(impl === null){ + throw new Error('Cannot find any-promise implementation nor'+ + ' global.Promise. You must install polyfill or call'+ + ' require("any-promise/register") with your preferred'+ + ' implementation, e.g. require("any-promise/register/bluebird")'+ + ' on application load prior to any require("any-promise").') + } + + return impl +} + +/** + * Determines if the global.Promise should be preferred if an implementation + * has not been registered. + */ +function shouldPreferGlobalPromise(implementation){ + if(implementation){ + return implementation === 'global.Promise' + } else if(typeof global.Promise !== 'undefined'){ + // Load global promise if implementation not specified + // Versions < 0.11 did not have global Promise + // Do not use for version < 0.12 as version 0.11 contained buggy versions + var version = (/v(\d+)\.(\d+)\.(\d+)/).exec(process.version) + return !(version && +version[1] == 0 && +version[2] < 12) + } + + // do not have global.Promise or another implementation was specified + return false +} + +/** + * Look for common libs as last resort there is no guarantee that + * this will return a desired implementation or even be deterministic. + * The priority is also nearly arbitrary. We are only doing this + * for older versions of Node.js <0.12 that do not have a reasonable + * global.Promise implementation and we the user has not registered + * the preference. This preserves the behavior of any-promise <= 0.1 + * and may be deprecated or removed in the future + */ +function tryAutoDetect(){ + var libs = [ + "es6-promise", + "promise", + "native-promise-only", + "bluebird", + "rsvp", + "when", + "q", + "pinkie", + "lie", + "vow"] + var i = 0, len = libs.length + for(; i < len; i++){ + try { + return loadImplementation(libs[i]) + } catch(e){} + } + return null +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/bluebird.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/bluebird.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/bluebird.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/bluebird.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/bluebird.js new file mode 100644 index 0000000..de0f87e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/bluebird.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('bluebird', {Promise: require('bluebird')}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/es6-promise.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/es6-promise.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/es6-promise.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/es6-promise.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/es6-promise.js new file mode 100644 index 0000000..59bd55b --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/es6-promise.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('es6-promise', {Promise: require('es6-promise').Promise}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/lie.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/lie.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/lie.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/lie.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/lie.js new file mode 100644 index 0000000..7d305ca --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/lie.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('lie', {Promise: require('lie')}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/native-promise-only.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/native-promise-only.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/native-promise-only.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/native-promise-only.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/native-promise-only.js new file mode 100644 index 0000000..70a5a5e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/native-promise-only.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('native-promise-only', {Promise: require('native-promise-only')}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/pinkie.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/pinkie.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/pinkie.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/pinkie.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/pinkie.js new file mode 100644 index 0000000..caaf98a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/pinkie.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('pinkie', {Promise: require('pinkie')}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/promise.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/promise.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/promise.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/promise.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/promise.js new file mode 100644 index 0000000..746620d --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/promise.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('promise', {Promise: require('promise')}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/q.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/q.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/q.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/q.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/q.js new file mode 100644 index 0000000..0fc633a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/q.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('q', {Promise: require('q').Promise}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/rsvp.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/rsvp.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/rsvp.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/rsvp.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/rsvp.js new file mode 100644 index 0000000..02b1318 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/rsvp.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('rsvp', {Promise: require('rsvp').Promise}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/vow.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/vow.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/vow.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/vow.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/vow.js new file mode 100644 index 0000000..5b6868c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/vow.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('vow', {Promise: require('vow').Promise}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/when.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/when.d.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/when.d.ts @@ -0,0 +1 @@ +export {} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/when.js b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/when.js new file mode 100644 index 0000000..d91c13d --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/any-promise/register/when.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('when', {Promise: require('when').Promise}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/commander/CHANGELOG.md b/sdk/typescript/node_modules/sucrase/node_modules/commander/CHANGELOG.md new file mode 100644 index 0000000..f00cb2b --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/commander/CHANGELOG.md @@ -0,0 +1,436 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). (Format adopted after v3.0.0.) + + + +## [4.1.1] (2020-02-02) + +### Fixed + +* TypeScript definition for `.action()` should include Promise for async ([#1157]) + +## [4.1.0] (2020-01-06) + +### Added + +* two routines to change how option values are handled, and eliminate name clashes with command properties ([#933] [#1102]) + * see storeOptionsAsProperties and passCommandToAction in README +* `.parseAsync` to use instead of `.parse` if supply async action handlers ([#806] [#1118]) + +### Fixed + +* Remove trailing blanks from wrapped help text ([#1096]) + +### Changed + +* update dependencies +* extend security coverage for Commander 2.x to 2020-02-03 +* improvements to README +* improvements to TypeScript definition documentation +* move old versions out of main CHANGELOG +* removed explicit use of `ts-node` in tests + +## [4.0.1] (2019-11-12) + +### Fixed + +* display help when requested, even if there are missing required options ([#1091]) + +## [4.0.0] (2019-11-02) + +### Added + +* automatically wrap and indent help descriptions for options and commands ([#1051]) +* `.exitOverride()` allows override of calls to `process.exit` for additional error handling and to keep program running ([#1040]) +* support for declaring required options with `.requiredOptions()` ([#1071]) +* GitHub Actions support ([#1027]) +* translation links in README + +### Changed + +* dev: switch tests from Sinon+Should to Jest with major rewrite of tests ([#1035]) +* call default subcommand even when there are unknown options ([#1047]) +* *Breaking* Commander is only officially supported on Node 8 and above, and requires Node 6 ([#1053]) + +### Fixed + +* *Breaking* keep command object out of program.args when action handler called ([#1048]) + * also, action handler now passed array of unknown arguments +* complain about unknown options when program argument supplied and action handler ([#1049]) + * this changes parameters to `command:*` event to include unknown arguments +* removed deprecated `customFds` option from call to `child_process.spawn` ([#1052]) +* rework TypeScript declarations to bring all types into imported namespace ([#1081]) + +### Migration Tips + +#### Testing for no arguments + +If you were previously using code like: + +```js +if (!program.args.length) ... +``` + +a partial replacement is: + +```js +if (program.rawArgs.length < 3) ... +``` + +## [4.0.0-1] Prerelease (2019-10-08) + +(Released in 4.0.0) + +## [4.0.0-0] Prerelease (2019-10-01) + +(Released in 4.0.0) + +## [2.20.1] (2019-09-29) + +### Fixed + +* Improve tracking of executable subcommands. + +### Changed + +* update development dependencies + +## [3.0.2] (2019-09-27) + +### Fixed + +* Improve tracking of executable subcommands. + +### Changed + +* update development dependencies + +## [3.0.1] (2019-08-30) + +### Added + +* .name and .usage to README ([#1010]) +* Table of Contents to README ([#1010]) +* TypeScript definition for `executableFile` in CommandOptions ([#1028]) + +### Changed + +* consistently use `const` rather than `var` in README ([#1026]) + +### Fixed + +* help for sub commands with custom executableFile ([#1018]) + +## [3.0.0] / 2019-08-08 + +* Add option to specify executable file name ([#999]) + * e.g. `.command('clone', 'clone description', { executableFile: 'myClone' })` +* Change docs for `.command` to contrast action handler vs git-style executable. ([#938] [#990]) +* **Breaking** Change TypeScript to use overloaded function for `.command`. ([#938] [#990]) +* Change to use straight quotes around strings in error messages (like 'this' instead of `this') ([#915]) +* Add TypeScript "reference types" for node ([#974]) +* Add support for hyphen as an option argument in subcommands ([#697]) +* Add support for a short option flag and its value to be concatenated for action handler subcommands ([#599]) + * e.g. `-p 80` can also be supplied as `-p80` +* Add executable arguments to spawn in win32, for git-style executables ([#611]) + * e.g. `node --harmony myCommand.js clone` +* Add parent command as prefix of subcommand in help ([#980]) +* Add optional custom description to `.version` ([#963]) + * e.g. `program.version('0.0.1', '-v, --vers', 'output the current version')` +* Add `.helpOption(flags, description)` routine to customise help flags and description ([#963]) + * e.g. `.helpOption('-e, --HELP', 'read more information')` +* Fix behavior of --no-* options ([#795]) + * can now define both `--foo` and `--no-foo` + * **Breaking** custom event listeners: `--no-foo` on cli now emits `option:no-foo` (previously `option:foo`) + * **Breaking** default value: defining `--no-foo` after defining `--foo` leaves the default value unchanged (previously set it to false) + * allow boolean default value, such as from environment ([#987]) +* Increment inspector port for spawned subcommands ([#991]) + * e.g. `node --inspect myCommand.js clone` + +### Migration Tips + +The custom event for a negated option like `--no-foo` is `option:no-foo` (previously `option:foo`). + +```js +program + .option('--no-foo') + .on('option:no-foo', () => { + console.log('removing foo'); + }); +``` + +When using TypeScript, adding a command does not allow an explicit `undefined` for an unwanted executable description (e.g +for a command with an action handler). + +```js +program + .command('action1', undefined, { noHelp: true }) // No longer valid + .command('action2', { noHelp: true }) // Correct +``` + +## 3.0.0-0 Prerelease / 2019-07-28 + +(Released as 3.0.0) + +## 2.20.0 / 2019-04-02 + +* fix: resolve symbolic links completely when hunting for subcommands (#935) +* Update index.d.ts (#930) +* Update Readme.md (#924) +* Remove --save option as it isn't required anymore (#918) +* Add link to the license file (#900) +* Added example of receiving args from options (#858) +* Added missing semicolon (#882) +* Add extension to .eslintrc (#876) + +## 2.19.0 / 2018-10-02 + +* Removed newline after Options and Commands headers (#864) +* Bugfix - Error output (#862) +* Fix to change default value to string (#856) + +## 2.18.0 / 2018-09-07 + +* Standardize help output (#853) +* chmod 644 travis.yml (#851) +* add support for execute typescript subcommand via ts-node (#849) + +## 2.17.1 / 2018-08-07 + +* Fix bug in command emit (#844) + +## 2.17.0 / 2018-08-03 + +* fixed newline output after help information (#833) +* Fix to emit the action even without command (#778) +* npm update (#823) + +## 2.16.0 / 2018-06-29 + +* Remove Makefile and `test/run` (#821) +* Make 'npm test' run on Windows (#820) +* Add badge to display install size (#807) +* chore: cache node_modules (#814) +* chore: remove Node.js 4 (EOL), add Node.js 10 (#813) +* fixed typo in readme (#812) +* Fix types (#804) +* Update eslint to resolve vulnerabilities in lodash (#799) +* updated readme with custom event listeners. (#791) +* fix tests (#794) + +## 2.15.0 / 2018-03-07 + +* Update downloads badge to point to graph of downloads over time instead of duplicating link to npm +* Arguments description + +## 2.14.1 / 2018-02-07 + +* Fix typing of help function + +## 2.14.0 / 2018-02-05 + +* only register the option:version event once +* Fixes issue #727: Passing empty string for option on command is set to undefined +* enable eqeqeq rule +* resolves #754 add linter configuration to project +* resolves #560 respect custom name for version option +* document how to override the version flag +* document using options per command + +## 2.13.0 / 2018-01-09 + +* Do not print default for --no- +* remove trailing spaces in command help +* Update CI's Node.js to LTS and latest version +* typedefs: Command and Option types added to commander namespace + +## 2.12.2 / 2017-11-28 + +* fix: typings are not shipped + +## 2.12.1 / 2017-11-23 + +* Move @types/node to dev dependency + +## 2.12.0 / 2017-11-22 + +* add attributeName() method to Option objects +* Documentation updated for options with --no prefix +* typings: `outputHelp` takes a string as the first parameter +* typings: use overloads +* feat(typings): update to match js api +* Print default value in option help +* Fix translation error +* Fail when using same command and alias (#491) +* feat(typings): add help callback +* fix bug when description is add after command with options (#662) +* Format js code +* Rename History.md to CHANGELOG.md (#668) +* feat(typings): add typings to support TypeScript (#646) +* use current node + +## 2.11.0 / 2017-07-03 + +* Fix help section order and padding (#652) +* feature: support for signals to subcommands (#632) +* Fixed #37, --help should not display first (#447) +* Fix translation errors. (#570) +* Add package-lock.json +* Remove engines +* Upgrade package version +* Prefix events to prevent conflicts between commands and options (#494) +* Removing dependency on graceful-readlink +* Support setting name in #name function and make it chainable +* Add .vscode directory to .gitignore (Visual Studio Code metadata) +* Updated link to ruby commander in readme files + +## 2.10.0 / 2017-06-19 + +* Update .travis.yml. drop support for older node.js versions. +* Fix require arguments in README.md +* On SemVer you do not start from 0.0.1 +* Add missing semi colon in readme +* Add save param to npm install +* node v6 travis test +* Update Readme_zh-CN.md +* Allow literal '--' to be passed-through as an argument +* Test subcommand alias help +* link build badge to master branch +* Support the alias of Git style sub-command +* added keyword commander for better search result on npm +* Fix Sub-Subcommands +* test node.js stable +* Fixes TypeError when a command has an option called `--description` +* Update README.md to make it beginner friendly and elaborate on the difference between angled and square brackets. +* Add chinese Readme file + +## 2.9.0 / 2015-10-13 + +* Add option `isDefault` to set default subcommand #415 @Qix- +* Add callback to allow filtering or post-processing of help text #434 @djulien +* Fix `undefined` text in help information close #414 #416 @zhiyelee + +## 2.8.1 / 2015-04-22 + +* Back out `support multiline description` Close #396 #397 + +## 2.8.0 / 2015-04-07 + +* Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee +* Fix bug in Git-style sub-commands #372 @zhiyelee +* Allow commands to be hidden from help #383 @tonylukasavage +* When git-style sub-commands are in use, yet none are called, display help #382 @claylo +* Add ability to specify arguments syntax for top-level command #258 @rrthomas +* Support multiline descriptions #208 @zxqfox + +## 2.7.1 / 2015-03-11 + +* Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367. + +## 2.7.0 / 2015-03-09 + +* Fix git-style bug when installed globally. Close #335 #349 @zhiyelee +* Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage +* Add support for camelCase on `opts()`. Close #353 @nkzawa +* Add node.js 0.12 and io.js to travis.yml +* Allow RegEx options. #337 @palanik +* Fixes exit code when sub-command failing. Close #260 #332 @pirelenito +* git-style `bin` files in $PATH make sense. Close #196 #327 @zhiyelee + +## 2.6.0 / 2014-12-30 + +* added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee +* Add application description to the help msg. Close #112 @dalssoft + +## 2.5.1 / 2014-12-15 + +* fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee + +## 2.5.0 / 2014-10-24 + +* add support for variadic arguments. Closes #277 @whitlockjc + +## 2.4.0 / 2014-10-17 + +* fixed a bug on executing the coercion function of subcommands option. Closes #270 +* added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage +* added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage +* fixed a bug on subcommand name. Closes #248 @jonathandelgado +* fixed function normalize doesn’t honor option terminator. Closes #216 @abbr + +## 2.3.0 / 2014-07-16 + +* add command alias'. Closes PR #210 +* fix: Typos. Closes #99 +* fix: Unused fs module. Closes #217 + +## 2.2.0 / 2014-03-29 + +* add passing of previous option value +* fix: support subcommands on windows. Closes #142 +* Now the defaultValue passed as the second argument of the coercion function. + +## 2.1.0 / 2013-11-21 + +* add: allow cflag style option params, unit test, fixes #174 + +## 2.0.0 / 2013-07-18 + +* remove input methods (.prompt, .confirm, etc) + +## Older versions + +* [1.x](./changelogs/CHANGELOG-1.md) +* [0.x](./changelogs/CHANGELOG-0.md) + +[#599]: https://github.com/tj/commander.js/issues/599 +[#611]: https://github.com/tj/commander.js/issues/611 +[#697]: https://github.com/tj/commander.js/issues/697 +[#795]: https://github.com/tj/commander.js/issues/795 +[#806]: https://github.com/tj/commander.js/issues/806 +[#915]: https://github.com/tj/commander.js/issues/915 +[#938]: https://github.com/tj/commander.js/issues/938 +[#963]: https://github.com/tj/commander.js/issues/963 +[#974]: https://github.com/tj/commander.js/issues/974 +[#980]: https://github.com/tj/commander.js/issues/980 +[#987]: https://github.com/tj/commander.js/issues/987 +[#990]: https://github.com/tj/commander.js/issues/990 +[#991]: https://github.com/tj/commander.js/issues/991 +[#993]: https://github.com/tj/commander.js/issues/993 +[#999]: https://github.com/tj/commander.js/issues/999 +[#1010]: https://github.com/tj/commander.js/pull/1010 +[#1018]: https://github.com/tj/commander.js/pull/1018 +[#1026]: https://github.com/tj/commander.js/pull/1026 +[#1027]: https://github.com/tj/commander.js/pull/1027 +[#1028]: https://github.com/tj/commander.js/pull/1028 +[#1035]: https://github.com/tj/commander.js/pull/1035 +[#1040]: https://github.com/tj/commander.js/pull/1040 +[#1047]: https://github.com/tj/commander.js/pull/1047 +[#1048]: https://github.com/tj/commander.js/pull/1048 +[#1049]: https://github.com/tj/commander.js/pull/1049 +[#1051]: https://github.com/tj/commander.js/pull/1051 +[#1052]: https://github.com/tj/commander.js/pull/1052 +[#1053]: https://github.com/tj/commander.js/pull/1053 +[#1071]: https://github.com/tj/commander.js/pull/1071 +[#1081]: https://github.com/tj/commander.js/pull/1081 +[#1091]: https://github.com/tj/commander.js/pull/1091 +[#1096]: https://github.com/tj/commander.js/pull/1096 +[#1102]: https://github.com/tj/commander.js/pull/1102 +[#1118]: https://github.com/tj/commander.js/pull/1118 +[#1157]: https://github.com/tj/commander.js/pull/1157 + +[Unreleased]: https://github.com/tj/commander.js/compare/master...develop +[4.1.1]: https://github.com/tj/commander.js/compare/v4.0.0..v4.1.1 +[4.1.0]: https://github.com/tj/commander.js/compare/v4.0.1..v4.1.0 +[4.0.1]: https://github.com/tj/commander.js/compare/v4.0.0..v4.0.1 +[4.0.0]: https://github.com/tj/commander.js/compare/v3.0.2..v4.0.0 +[4.0.0-1]: https://github.com/tj/commander.js/compare/v4.0.0-0..v4.0.0-1 +[4.0.0-0]: https://github.com/tj/commander.js/compare/v3.0.2...v4.0.0-0 +[3.0.2]: https://github.com/tj/commander.js/compare/v3.0.1...v3.0.2 +[3.0.1]: https://github.com/tj/commander.js/compare/v3.0.0...v3.0.1 +[3.0.0]: https://github.com/tj/commander.js/compare/v2.20.1...v3.0.0 +[2.20.1]: https://github.com/tj/commander.js/compare/v2.20.0...v2.20.1 diff --git a/sdk/typescript/node_modules/sucrase/node_modules/commander/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/commander/LICENSE new file mode 100644 index 0000000..10f997a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/commander/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/commander/Readme.md b/sdk/typescript/node_modules/sucrase/node_modules/commander/Readme.md new file mode 100644 index 0000000..aa4f42b --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/commander/Readme.md @@ -0,0 +1,713 @@ +# Commander.js + +[![Build Status](https://api.travis-ci.org/tj/commander.js.svg?branch=master)](http://travis-ci.org/tj/commander.js) +[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander) +[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true) +[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) + +The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander). + +Read this in other languages: English | [简体中文](./Readme_zh-CN.md) + +- [Commander.js](#commanderjs) + - [Installation](#installation) + - [Declaring program variable](#declaring-program-variable) + - [Options](#options) + - [Common option types, boolean and value](#common-option-types-boolean-and-value) + - [Default option value](#default-option-value) + - [Other option types, negatable boolean and flag|value](#other-option-types-negatable-boolean-and-flagvalue) + - [Custom option processing](#custom-option-processing) + - [Required option](#required-option) + - [Version option](#version-option) + - [Commands](#commands) + - [Specify the argument syntax](#specify-the-argument-syntax) + - [Action handler (sub)commands](#action-handler-subcommands) + - [Git-style executable (sub)commands](#git-style-executable-subcommands) + - [Automated --help](#automated---help) + - [Custom help](#custom-help) + - [.usage and .name](#usage-and-name) + - [.outputHelp(cb)](#outputhelpcb) + - [.helpOption(flags, description)](#helpoptionflags-description) + - [.help(cb)](#helpcb) + - [Custom event listeners](#custom-event-listeners) + - [Bits and pieces](#bits-and-pieces) + - [Avoiding option name clashes](#avoiding-option-name-clashes) + - [TypeScript](#typescript) + - [Node options such as --harmony](#node-options-such-as---harmony) + - [Node debugging](#node-debugging) + - [Override exit handling](#override-exit-handling) + - [Examples](#examples) + - [License](#license) + - [Support](#support) + - [Commander for enterprise](#commander-for-enterprise) + +## Installation + +```bash +npm install commander +``` + +## Declaring _program_ variable + +Commander exports a global object which is convenient for quick programs. +This is used in the examples in this README for brevity. + +```js +const program = require('commander'); +program.version('0.0.1'); +``` + +For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use. + + ```js + const commander = require('commander'); + const program = new commander.Command(); + program.version('0.0.1'); + ``` + +## Options + +Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space. + +The options can be accessed as properties on the Command object. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. Multiple short flags may be combined as a single arg, for example `-abc` is equivalent to `-a -b -c`. + +See also optional new behaviour to [avoid name clashes](#avoiding-option-name-clashes). + +### Common option types, boolean and value + +The two most used option types are a boolean flag, and an option which takes a value (declared using angle brackets). Both are `undefined` unless specified on command line. + +```js +const program = require('commander'); + +program + .option('-d, --debug', 'output extra debugging') + .option('-s, --small', 'small pizza size') + .option('-p, --pizza-type ', 'flavour of pizza'); + +program.parse(process.argv); + +if (program.debug) console.log(program.opts()); +console.log('pizza details:'); +if (program.small) console.log('- small pizza size'); +if (program.pizzaType) console.log(`- ${program.pizzaType}`); +``` + +```bash +$ pizza-options -d +{ debug: true, small: undefined, pizzaType: undefined } +pizza details: +$ pizza-options -p +error: option '-p, --pizza-type ' argument missing +$ pizza-options -ds -p vegetarian +{ debug: true, small: true, pizzaType: 'vegetarian' } +pizza details: +- small pizza size +- vegetarian +$ pizza-options --pizza-type=cheese +pizza details: +- cheese +``` + +`program.parse(arguments)` processes the arguments, leaving any args not consumed by the options as the `program.args` array. + +### Default option value + +You can specify a default value for an option which takes a value. + +```js +const program = require('commander'); + +program + .option('-c, --cheese ', 'add the specified type of cheese', 'blue'); + +program.parse(process.argv); + +console.log(`cheese: ${program.cheese}`); +``` + +```bash +$ pizza-options +cheese: blue +$ pizza-options --cheese stilton +cheese: stilton +``` + +### Other option types, negatable boolean and flag|value + +You can specify a boolean option long name with a leading `no-` to set the option value to false when used. +Defined alone this also makes the option true by default. + +If you define `--foo` first, adding `--no-foo` does not change the default value from what it would +otherwise be. You can specify a default boolean value for a boolean flag and it can be overridden on command line. + +```js +const program = require('commander'); + +program + .option('--no-sauce', 'Remove sauce') + .option('--cheese ', 'cheese flavour', 'mozzarella') + .option('--no-cheese', 'plain with no cheese') + .parse(process.argv); + +const sauceStr = program.sauce ? 'sauce' : 'no sauce'; +const cheeseStr = (program.cheese === false) ? 'no cheese' : `${program.cheese} cheese`; +console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`); +``` + +```bash +$ pizza-options +You ordered a pizza with sauce and mozzarella cheese +$ pizza-options --sauce +error: unknown option '--sauce' +$ pizza-options --cheese=blue +You ordered a pizza with sauce and blue cheese +$ pizza-options --no-sauce --no-cheese +You ordered a pizza with no sauce and no cheese +``` + +You can specify an option which functions as a flag but may also take a value (declared using square brackets). + +```js +const program = require('commander'); + +program + .option('-c, --cheese [type]', 'Add cheese with optional type'); + +program.parse(process.argv); + +if (program.cheese === undefined) console.log('no cheese'); +else if (program.cheese === true) console.log('add cheese'); +else console.log(`add cheese type ${program.cheese}`); +``` + +```bash +$ pizza-options +no cheese +$ pizza-options --cheese +add cheese +$ pizza-options --cheese mozzarella +add cheese type mozzarella +``` + +### Custom option processing + +You may specify a function to do custom processing of option values. The callback function receives two parameters, the user specified value and the +previous value for the option. It returns the new value for the option. + +This allows you to coerce the option value to the desired type, or accumulate values, or do entirely custom processing. + +You can optionally specify the default/starting value for the option after the function. + +```js +const program = require('commander'); + +function myParseInt(value, dummyPrevious) { + // parseInt takes a string and an optional radix + return parseInt(value); +} + +function increaseVerbosity(dummyValue, previous) { + return previous + 1; +} + +function collect(value, previous) { + return previous.concat([value]); +} + +function commaSeparatedList(value, dummyPrevious) { + return value.split(','); +} + +program + .option('-f, --float ', 'float argument', parseFloat) + .option('-i, --integer ', 'integer argument', myParseInt) + .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0) + .option('-c, --collect ', 'repeatable value', collect, []) + .option('-l, --list ', 'comma separated list', commaSeparatedList) +; + +program.parse(process.argv); + +if (program.float !== undefined) console.log(`float: ${program.float}`); +if (program.integer !== undefined) console.log(`integer: ${program.integer}`); +if (program.verbose > 0) console.log(`verbosity: ${program.verbose}`); +if (program.collect.length > 0) console.log(program.collect); +if (program.list !== undefined) console.log(program.list); +``` + +```bash +$ custom -f 1e2 +float: 100 +$ custom --integer 2 +integer: 2 +$ custom -v -v -v +verbose: 3 +$ custom -c a -c b -c c +[ 'a', 'b', 'c' ] +$ custom --list x,y,z +[ 'x', 'y', 'z' ] +``` + +### Required option + +You may specify a required (mandatory) option using `.requiredOption`. The option must be specified on the command line, or by having a default value. The method is otherwise the same as `.option` in format, taking flags and description, and optional default value or custom processing. + +```js +const program = require('commander'); + +program + .requiredOption('-c, --cheese ', 'pizza must have cheese'); + +program.parse(process.argv); +``` + +``` +$ pizza +error: required option '-c, --cheese ' not specified +``` + +### Version option + +The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits. + +```js +program.version('0.0.1'); +``` + +```bash +$ ./examples/pizza -V +0.0.1 +``` + +You may change the flags and description by passing additional parameters to the `version` method, using +the same syntax for flags as the `option` method. The version flags can be named anything, but a long name is required. + +```js +program.version('0.0.1', '-v, --vers', 'output the current version'); +``` + +## Commands + +You can specify (sub)commands for your top-level command using `.command`. There are two ways these can be implemented: using an action handler attached to the command, or as a separate executable file (described in more detail later). In the first parameter to `.command` you specify the command name and any command arguments. The arguments may be `` or `[optional]`, and the last argument may also be `variadic...`. + +For example: + +```js +// Command implemented using action handler (description is supplied separately to `.command`) +// Returns new command for configuring. +program + .command('clone [destination]') + .description('clone a repository into a newly created directory') + .action((source, destination) => { + console.log('clone command called'); + }); + +// Command implemented using separate executable file (description is second parameter to `.command`) +// Returns top-level command for adding more commands. +program + .command('start ', 'start named service') + .command('stop [service]', 'stop named service, or all if no name supplied'); +``` + +### Specify the argument syntax + +You use `.arguments` to specify the arguments for the top-level command, and for subcommands they are included in the `.command` call. Angled brackets (e.g. ``) indicate required input. Square brackets (e.g. `[optional]`) indicate optional input. + +```js +const program = require('commander'); + +program + .version('0.1.0') + .arguments(' [env]') + .action(function (cmd, env) { + cmdValue = cmd; + envValue = env; + }); + +program.parse(process.argv); + +if (typeof cmdValue === 'undefined') { + console.error('no command given!'); + process.exit(1); +} +console.log('command:', cmdValue); +console.log('environment:', envValue || "no environment given"); +``` + + The last argument of a command can be variadic, and only the last argument. To make an argument variadic you + append `...` to the argument name. For example: + +```js +const program = require('commander'); + +program + .version('0.1.0') + .command('rmdir [otherDirs...]') + .action(function (dir, otherDirs) { + console.log('rmdir %s', dir); + if (otherDirs) { + otherDirs.forEach(function (oDir) { + console.log('rmdir %s', oDir); + }); + } + }); + +program.parse(process.argv); +``` + +The variadic argument is passed to the action handler as an array. (And this also applies to `program.args`.) + +### Action handler (sub)commands + +You can add options to a command that uses an action handler. +The action handler gets passed a parameter for each argument you declared, and one additional argument which is the +command object itself. This command argument has the values for the command-specific options added as properties. + +```js +const program = require('commander'); + +program + .command('rm ') + .option('-r, --recursive', 'Remove recursively') + .action(function (dir, cmdObj) { + console.log('remove ' + dir + (cmdObj.recursive ? ' recursively' : '')) + }) + +program.parse(process.argv) +``` + +You may supply an `async` action handler, in which case you call `.parseAsync` rather than `.parse`. + +```js +async function run() { /* code goes here */ } + +async function main() { + program + .command('run') + .action(run); + await program.parseAsync(process.argv); +} +``` + +A command's options on the command line are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated. + +Configuration options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the command from the generated help output. + +### Git-style executable (sub)commands + +When `.command()` is invoked with a description argument, this tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools. +Commander will search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-subcommand`, like `pm-install`, `pm-search`. +You can specify a custom name with the `executableFile` configuration option. + +You handle the options for an executable (sub)command in the executable, and don't declare them at the top-level. + +```js +// file: ./examples/pm +const program = require('commander'); + +program + .version('0.1.0') + .command('install [name]', 'install one or more packages') + .command('search [query]', 'search with optional query') + .command('update', 'update installed packages', {executableFile: 'myUpdateSubCommand'}) + .command('list', 'list packages installed', {isDefault: true}) + .parse(process.argv); +``` + +Configuration options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the command from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified. +Specifying a name with `executableFile` will override the default constructed name. + +If the program is designed to be installed globally, make sure the executables have proper modes, like `755`. + +## Automated --help + + The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: + +```bash +$ ./examples/pizza --help +Usage: pizza [options] + +An application for pizzas ordering + +Options: + -V, --version output the version number + -p, --peppers Add peppers + -P, --pineapple Add pineapple + -b, --bbq Add bbq sauce + -c, --cheese Add the specified type of cheese (default: "marble") + -C, --no-cheese You do not want any cheese + -h, --help output usage information +``` + +### Custom help + + You can display arbitrary `-h, --help` information + by listening for "--help". Commander will automatically + exit once you are done so that the remainder of your program + does not execute causing undesired behaviors, for example + in the following executable "stuff" will not output when + `--help` is used. + +```js +#!/usr/bin/env node + +const program = require('commander'); + +program + .version('0.1.0') + .option('-f, --foo', 'enable some foo') + .option('-b, --bar', 'enable some bar') + .option('-B, --baz', 'enable some baz'); + +// must be before .parse() since +// node's emit() is immediate + +program.on('--help', function(){ + console.log('') + console.log('Examples:'); + console.log(' $ custom-help --help'); + console.log(' $ custom-help -h'); +}); + +program.parse(process.argv); + +console.log('stuff'); +``` + +Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run: + +```Text +Usage: custom-help [options] + +Options: + -h, --help output usage information + -V, --version output the version number + -f, --foo enable some foo + -b, --bar enable some bar + -B, --baz enable some baz + +Examples: + $ custom-help --help + $ custom-help -h +``` + +### .usage and .name + +These allow you to customise the usage description in the first line of the help. The name is otherwise +deduced from the (full) program arguments. Given: + +```js +program + .name("my-command") + .usage("[global options] command") +``` + +The help will start with: + +```Text +Usage: my-command [global options] command +``` + +### .outputHelp(cb) + +Output help information without exiting. +Optional callback cb allows post-processing of help text before it is displayed. + +If you want to display help by default (e.g. if no command was provided), you can use something like: + +```js +const program = require('commander'); +const colors = require('colors'); + +program + .version('0.1.0') + .command('getstream [url]', 'get stream URL') + .parse(process.argv); + +if (!process.argv.slice(2).length) { + program.outputHelp(make_red); +} + +function make_red(txt) { + return colors.red(txt); //display the help text in red on the console +} +``` + +### .helpOption(flags, description) + + Override the default help flags and description. + +```js +program + .helpOption('-e, --HELP', 'read more information'); +``` + +### .help(cb) + + Output help information and exit immediately. + Optional callback cb allows post-processing of help text before it is displayed. + +## Custom event listeners + + You can execute custom actions by listening to command and option events. + +```js +program.on('option:verbose', function () { + process.env.VERBOSE = this.verbose; +}); + +// error on unknown commands +program.on('command:*', function () { + console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' ')); + process.exit(1); +}); +``` + +## Bits and pieces + +### Avoiding option name clashes + +The original and default behaviour is that the option values are stored +as properties on the program, and the action handler is passed a +command object with the options values stored as properties. +This is very convenient to code, but the downside is possible clashes with +existing properties of Command. + +There are two new routines to change the behaviour, and the default behaviour may change in the future: + +- `storeOptionsAsProperties`: whether to store option values as properties on command object, or store separately (specify false) and access using `.opts()` +- `passCommandToAction`: whether to pass command to action handler, +or just the options (specify false) + +```js +// file: ./examples/storeOptionsAsProperties.action.js +program + .storeOptionsAsProperties(false) + .passCommandToAction(false); + +program + .name('my-program-name') + .option('-n,--name '); + +program + .command('show') + .option('-a,--action ') + .action((options) => { + console.log(options.action); + }); + +program.parse(process.argv); + +const programOptions = program.opts(); +console.log(programOptions.name); +``` + +### TypeScript + +The Commander package includes its TypeScript Definition file, but also requires the node types which you need to install yourself. e.g. + +```bash +npm install commander +npm install --save-dev @types/node +``` + +If you use `ts-node` and git-style sub-commands written as `.ts` files, you need to call your program through node to get the sub-commands called correctly. e.g. + +```bash +node -r ts-node/register pm.ts +``` + +### Node options such as `--harmony` + +You can enable `--harmony` option in two ways: + +- Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. (Note Windows does not support this pattern.) +- Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process. + +### Node debugging + +If you are using the node inspector for [debugging](https://nodejs.org/en/docs/guides/debugging-getting-started/) git-style executable (sub)commands using `node --inspect` et al, +the inspector port is incremented by 1 for the spawned subcommand. + +### Override exit handling + +By default Commander calls `process.exit` when it detects errors, or after displaying the help or version. You can override +this behaviour and optionally supply a callback. The default override throws a `CommanderError`. + +The override callback is passed a `CommanderError` with properties `exitCode` number, `code` string, and `message`. The default override behaviour is to throw the error, except for async handling of executable subcommand completion which carries on. The normal display of error messages or version or help +is not affected by the override which is called after the display. + +``` js +program.exitOverride(); + +try { + program.parse(process.argv); +} catch (err) { + // custom processing... +} +``` + +## Examples + +```js +const program = require('commander'); + +program + .version('0.1.0') + .option('-C, --chdir ', 'change the working directory') + .option('-c, --config ', 'set config path. defaults to ./deploy.conf') + .option('-T, --no-tests', 'ignore test hook'); + +program + .command('setup [env]') + .description('run setup commands for all envs') + .option("-s, --setup_mode [mode]", "Which setup mode to use") + .action(function(env, options){ + const mode = options.setup_mode || "normal"; + env = env || 'all'; + console.log('setup for %s env(s) with %s mode', env, mode); + }); + +program + .command('exec ') + .alias('ex') + .description('execute the given remote cmd') + .option("-e, --exec_mode ", "Which exec mode to use") + .action(function(cmd, options){ + console.log('exec "%s" using %s mode', cmd, options.exec_mode); + }).on('--help', function() { + console.log(''); + console.log('Examples:'); + console.log(''); + console.log(' $ deploy exec sequential'); + console.log(' $ deploy exec async'); + }); + +program + .command('*') + .action(function(env){ + console.log('deploying "%s"', env); + }); + +program.parse(process.argv); +``` + +More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory. + +## License + +[MIT](https://github.com/tj/commander.js/blob/master/LICENSE) + +## Support + +Commander 4.x is supported on Node 8 and above, and is likely to work with Node 6 but not tested. +(For versions of Node below Node 6, use Commander 3.x or 2.x.) + +The main forum for free and community support is the project [Issues](https://github.com/tj/commander.js/issues) on GitHub. + +### Commander for enterprise + +Available as part of the Tidelift Subscription + +The maintainers of Commander and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-commander?utm_source=npm-commander&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/commander/index.js b/sdk/typescript/node_modules/sucrase/node_modules/commander/index.js new file mode 100644 index 0000000..37d20cc --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/commander/index.js @@ -0,0 +1,1649 @@ +/** + * Module dependencies. + */ + +var EventEmitter = require('events').EventEmitter; +var spawn = require('child_process').spawn; +var path = require('path'); +var dirname = path.dirname; +var basename = path.basename; +var fs = require('fs'); + +/** + * Inherit `Command` from `EventEmitter.prototype`. + */ + +require('util').inherits(Command, EventEmitter); + +/** + * Expose the root command. + */ + +exports = module.exports = new Command(); + +/** + * Expose `Command`. + */ + +exports.Command = Command; + +/** + * Expose `Option`. + */ + +exports.Option = Option; + +/** + * Initialize a new `Option` with the given `flags` and `description`. + * + * @param {String} flags + * @param {String} description + * @api public + */ + +function Option(flags, description) { + this.flags = flags; + this.required = flags.indexOf('<') >= 0; // A value must be supplied when the option is specified. + this.optional = flags.indexOf('[') >= 0; // A value is optional when the option is specified. + this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line. + this.negate = flags.indexOf('-no-') !== -1; + flags = flags.split(/[ ,|]+/); + if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); + this.long = flags.shift(); + this.description = description || ''; +} + +/** + * Return option name. + * + * @return {String} + * @api private + */ + +Option.prototype.name = function() { + return this.long.replace(/^--/, ''); +}; + +/** + * Return option name, in a camelcase format that can be used + * as a object attribute key. + * + * @return {String} + * @api private + */ + +Option.prototype.attributeName = function() { + return camelcase(this.name().replace(/^no-/, '')); +}; + +/** + * Check if `arg` matches the short or long flag. + * + * @param {String} arg + * @return {Boolean} + * @api private + */ + +Option.prototype.is = function(arg) { + return this.short === arg || this.long === arg; +}; + +/** + * CommanderError class + * @class + */ +class CommanderError extends Error { + /** + * Constructs the CommanderError class + * @param {Number} exitCode suggested exit code which could be used with process.exit + * @param {String} code an id string representing the error + * @param {String} message human-readable description of the error + * @constructor + */ + constructor(exitCode, code, message) { + super(message); + // properly capture stack trace in Node.js + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.code = code; + this.exitCode = exitCode; + } +} + +exports.CommanderError = CommanderError; + +/** + * Initialize a new `Command`. + * + * @param {String} [name] + * @api public + */ + +function Command(name) { + this.commands = []; + this.options = []; + this._execs = new Set(); + this._allowUnknownOption = false; + this._args = []; + this._name = name || ''; + this._optionValues = {}; + this._storeOptionsAsProperties = true; // backwards compatible by default + this._passCommandToAction = true; // backwards compatible by default + this._actionResults = []; + + this._helpFlags = '-h, --help'; + this._helpDescription = 'output usage information'; + this._helpShortFlag = '-h'; + this._helpLongFlag = '--help'; +} + +/** + * Define a command. + * + * There are two styles of command: pay attention to where to put the description. + * + * Examples: + * + * // Command implemented using action handler (description is supplied separately to `.command`) + * program + * .command('clone [destination]') + * .description('clone a repository into a newly created directory') + * .action((source, destination) => { + * console.log('clone command called'); + * }); + * + * // Command implemented using separate executable file (description is second parameter to `.command`) + * program + * .command('start ', 'start named service') + * .command('stop [service]', 'stop named service, or all if no name supplied'); + * + * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` + * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) + * @param {Object} [execOpts] - configuration options (for executable) + * @return {Command} returns new command for action handler, or top-level command for executable command + * @api public + */ + +Command.prototype.command = function(nameAndArgs, actionOptsOrExecDesc, execOpts) { + var desc = actionOptsOrExecDesc; + var opts = execOpts; + if (typeof desc === 'object' && desc !== null) { + opts = desc; + desc = null; + } + opts = opts || {}; + var args = nameAndArgs.split(/ +/); + var cmd = new Command(args.shift()); + + if (desc) { + cmd.description(desc); + this.executables = true; + this._execs.add(cmd._name); + if (opts.isDefault) this.defaultExecutable = cmd._name; + } + cmd._noHelp = !!opts.noHelp; + cmd._helpFlags = this._helpFlags; + cmd._helpDescription = this._helpDescription; + cmd._helpShortFlag = this._helpShortFlag; + cmd._helpLongFlag = this._helpLongFlag; + cmd._exitCallback = this._exitCallback; + cmd._storeOptionsAsProperties = this._storeOptionsAsProperties; + cmd._passCommandToAction = this._passCommandToAction; + + cmd._executableFile = opts.executableFile; // Custom name for executable file + this.commands.push(cmd); + cmd.parseExpectedArgs(args); + cmd.parent = this; + + if (desc) return this; + return cmd; +}; + +/** + * Define argument syntax for the top-level command. + * + * @api public + */ + +Command.prototype.arguments = function(desc) { + return this.parseExpectedArgs(desc.split(/ +/)); +}; + +/** + * Add an implicit `help [cmd]` subcommand + * which invokes `--help` for the given command. + * + * @api private + */ + +Command.prototype.addImplicitHelpCommand = function() { + this.command('help [cmd]', 'display help for [cmd]'); +}; + +/** + * Parse expected `args`. + * + * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. + * + * @param {Array} args + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parseExpectedArgs = function(args) { + if (!args.length) return; + var self = this; + args.forEach(function(arg) { + var argDetails = { + required: false, + name: '', + variadic: false + }; + + switch (arg[0]) { + case '<': + argDetails.required = true; + argDetails.name = arg.slice(1, -1); + break; + case '[': + argDetails.name = arg.slice(1, -1); + break; + } + + if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') { + argDetails.variadic = true; + argDetails.name = argDetails.name.slice(0, -3); + } + if (argDetails.name) { + self._args.push(argDetails); + } + }); + return this; +}; + +/** + * Register callback to use as replacement for calling process.exit. + * + * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing + * @return {Command} for chaining + * @api public + */ + +Command.prototype.exitOverride = function(fn) { + if (fn) { + this._exitCallback = fn; + } else { + this._exitCallback = function(err) { + if (err.code !== 'commander.executeSubCommandAsync') { + throw err; + } else { + // Async callback from spawn events, not useful to throw. + } + }; + } + return this; +}; + +/** + * Call process.exit, and _exitCallback if defined. + * + * @param {Number} exitCode exit code for using with process.exit + * @param {String} code an id string representing the error + * @param {String} message human-readable description of the error + * @return never + * @api private + */ + +Command.prototype._exit = function(exitCode, code, message) { + if (this._exitCallback) { + this._exitCallback(new CommanderError(exitCode, code, message)); + // Expecting this line is not reached. + } + process.exit(exitCode); +}; + +/** + * Register callback `fn` for the command. + * + * Examples: + * + * program + * .command('help') + * .description('display verbose help') + * .action(function() { + * // output help here + * }); + * + * @param {Function} fn + * @return {Command} for chaining + * @api public + */ + +Command.prototype.action = function(fn) { + var self = this; + var listener = function(args, unknown) { + // Parse any so-far unknown options + args = args || []; + unknown = unknown || []; + + var parsed = self.parseOptions(unknown); + + // Output help if necessary + outputHelpIfRequested(self, parsed.unknown); + self._checkForMissingMandatoryOptions(); + + // If there are still any unknown options, then we simply + // die, unless someone asked for help, in which case we give it + // to them, and then we die. + if (parsed.unknown.length > 0) { + self.unknownOption(parsed.unknown[0]); + } + + // Leftover arguments need to be pushed back. Fixes issue #56 + if (parsed.args.length) args = parsed.args.concat(args); + + self._args.forEach(function(arg, i) { + if (arg.required && args[i] == null) { + self.missingArgument(arg.name); + } else if (arg.variadic) { + if (i !== self._args.length - 1) { + self.variadicArgNotLast(arg.name); + } + + args[i] = args.splice(i); + } + }); + + // The .action callback takes an extra parameter which is the command itself. + var expectedArgsCount = self._args.length; + var actionArgs = args.slice(0, expectedArgsCount); + if (self._passCommandToAction) { + actionArgs[expectedArgsCount] = self; + } else { + actionArgs[expectedArgsCount] = self.opts(); + } + // Add the extra arguments so available too. + if (args.length > expectedArgsCount) { + actionArgs.push(args.slice(expectedArgsCount)); + } + + const actionResult = fn.apply(self, actionArgs); + // Remember result in case it is async. Assume parseAsync getting called on root. + let rootCommand = self; + while (rootCommand.parent) { + rootCommand = rootCommand.parent; + } + rootCommand._actionResults.push(actionResult); + }; + var parent = this.parent || this; + var name = parent === this ? '*' : this._name; + parent.on('command:' + name, listener); + if (this._alias) parent.on('command:' + this._alias, listener); + return this; +}; + +/** + * Internal implementation shared by .option() and .requiredOption() + * + * @param {Object} config + * @param {String} flags + * @param {String} description + * @param {Function|*} [fn] - custom option processing function or default vaue + * @param {*} [defaultValue] + * @return {Command} for chaining + * @api private + */ + +Command.prototype._optionEx = function(config, flags, description, fn, defaultValue) { + var self = this, + option = new Option(flags, description), + oname = option.name(), + name = option.attributeName(); + option.mandatory = !!config.mandatory; + + // default as 3rd arg + if (typeof fn !== 'function') { + if (fn instanceof RegExp) { + // This is a bit simplistic (especially no error messages), and probably better handled by caller using custom option processing. + // No longer documented in README, but still present for backwards compatibility. + var regex = fn; + fn = function(val, def) { + var m = regex.exec(val); + return m ? m[0] : def; + }; + } else { + defaultValue = fn; + fn = null; + } + } + + // preassign default value for --no-*, [optional], , or plain flag if boolean value + if (option.negate || option.optional || option.required || typeof defaultValue === 'boolean') { + // when --no-foo we make sure default is true, unless a --foo option is already defined + if (option.negate) { + const positiveLongFlag = option.long.replace(/^--no-/, '--'); + defaultValue = self.optionFor(positiveLongFlag) ? self._getOptionValue(name) : true; + } + // preassign only if we have a default + if (defaultValue !== undefined) { + self._setOptionValue(name, defaultValue); + option.defaultValue = defaultValue; + } + } + + // register the option + this.options.push(option); + + // when it's passed assign the value + // and conditionally invoke the callback + this.on('option:' + oname, function(val) { + // coercion + if (val !== null && fn) { + val = fn(val, self._getOptionValue(name) === undefined ? defaultValue : self._getOptionValue(name)); + } + + // unassigned or boolean value + if (typeof self._getOptionValue(name) === 'boolean' || typeof self._getOptionValue(name) === 'undefined') { + // if no value, negate false, and we have a default, then use it! + if (val == null) { + self._setOptionValue(name, option.negate + ? false + : defaultValue || true); + } else { + self._setOptionValue(name, val); + } + } else if (val !== null) { + // reassign + self._setOptionValue(name, option.negate ? false : val); + } + }); + + return this; +}; + +/** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * Examples: + * + * // simple boolean defaulting to undefined + * program.option('-p, --pepper', 'add pepper'); + * + * program.pepper + * // => undefined + * + * --pepper + * program.pepper + * // => true + * + * // simple boolean defaulting to true (unless non-negated option is also defined) + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => false + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @param {String} flags + * @param {String} description + * @param {Function|*} [fn] - custom option processing function or default vaue + * @param {*} [defaultValue] + * @return {Command} for chaining + * @api public + */ + +Command.prototype.option = function(flags, description, fn, defaultValue) { + return this._optionEx({}, flags, description, fn, defaultValue); +}; + +/* + * Add a required option which must have a value after parsing. This usually means + * the option must be specified on the command line. (Otherwise the same as .option().) + * + * The `flags` string should contain both the short and long flags, separated by comma, a pipe or space. + * + * @param {String} flags + * @param {String} description + * @param {Function|*} [fn] - custom option processing function or default vaue + * @param {*} [defaultValue] + * @return {Command} for chaining + * @api public + */ + +Command.prototype.requiredOption = function(flags, description, fn, defaultValue) { + return this._optionEx({ mandatory: true }, flags, description, fn, defaultValue); +}; + +/** + * Allow unknown options on the command line. + * + * @param {Boolean} arg if `true` or omitted, no error will be thrown + * for unknown options. + * @api public + */ +Command.prototype.allowUnknownOption = function(arg) { + this._allowUnknownOption = arguments.length === 0 || arg; + return this; +}; + +/** + * Whether to store option values as properties on command object, + * or store separately (specify false). In both cases the option values can be accessed using .opts(). + * + * @param {boolean} value + * @return {Command} Command for chaining + * @api public + */ + +Command.prototype.storeOptionsAsProperties = function(value) { + this._storeOptionsAsProperties = (value === undefined) || value; + if (this.options.length) { + // This is for programmer, not end user. + console.error('Commander usage error: call storeOptionsAsProperties before adding options'); + } + return this; +}; + +/** + * Whether to pass command to action handler, + * or just the options (specify false). + * + * @param {boolean} value + * @return {Command} Command for chaining + * @api public + */ + +Command.prototype.passCommandToAction = function(value) { + this._passCommandToAction = (value === undefined) || value; + return this; +}; + +/** + * Store option value + * + * @param {String} key + * @param {Object} value + * @api private + */ + +Command.prototype._setOptionValue = function(key, value) { + if (this._storeOptionsAsProperties) { + this[key] = value; + } else { + this._optionValues[key] = value; + } +}; + +/** + * Retrieve option value + * + * @param {String} key + * @return {Object} value + * @api private + */ + +Command.prototype._getOptionValue = function(key) { + if (this._storeOptionsAsProperties) { + return this[key]; + } + return this._optionValues[key]; +}; + +/** + * Parse `argv`, setting options and invoking commands when defined. + * + * @param {Array} argv + * @return {Command} for chaining + * @api public + */ + +Command.prototype.parse = function(argv) { + // implicit help + if (this.executables) this.addImplicitHelpCommand(); + + // store raw args + this.rawArgs = argv; + + // guess name + this._name = this._name || basename(argv[1], '.js'); + + // github-style sub-commands with no sub-command + if (this.executables && argv.length < 3 && !this.defaultExecutable) { + // this user needs help + argv.push(this._helpLongFlag); + } + + // process argv + var normalized = this.normalize(argv.slice(2)); + var parsed = this.parseOptions(normalized); + var args = this.args = parsed.args; + + var result = this.parseArgs(this.args, parsed.unknown); + + if (args[0] === 'help' && args.length === 1) this.help(); + + // Note for future: we could return early if we found an action handler in parseArgs, as none of following code needed? + + // --help + if (args[0] === 'help') { + args[0] = args[1]; + args[1] = this._helpLongFlag; + } else { + // If calling through to executable subcommand we could check for help flags before failing, + // but a somewhat unlikely case since program options not passed to executable subcommands. + // Wait for reports to see if check needed and what usage pattern is. + this._checkForMissingMandatoryOptions(); + } + + // executable sub-commands + // (Debugging note for future: args[0] is not right if an action has been called) + var name = result.args[0]; + var subCommand = null; + + // Look for subcommand + if (name) { + subCommand = this.commands.find(function(command) { + return command._name === name; + }); + } + + // Look for alias + if (!subCommand && name) { + subCommand = this.commands.find(function(command) { + return command.alias() === name; + }); + if (subCommand) { + name = subCommand._name; + args[0] = name; + } + } + + // Look for default subcommand + if (!subCommand && this.defaultExecutable) { + name = this.defaultExecutable; + args.unshift(name); + subCommand = this.commands.find(function(command) { + return command._name === name; + }); + } + + if (this._execs.has(name)) { + return this.executeSubCommand(argv, args, parsed.unknown, subCommand ? subCommand._executableFile : undefined); + } + + return result; +}; + +/** + * Parse `argv`, setting options and invoking commands when defined. + * + * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. + * + * @param {Array} argv + * @return {Promise} + * @api public + */ +Command.prototype.parseAsync = function(argv) { + this.parse(argv); + return Promise.all(this._actionResults); +}; + +/** + * Execute a sub-command executable. + * + * @param {Array} argv + * @param {Array} args + * @param {Array} unknown + * @param {String} executableFile + * @api private + */ + +Command.prototype.executeSubCommand = function(argv, args, unknown, executableFile) { + args = args.concat(unknown); + + if (!args.length) this.help(); + + var isExplicitJS = false; // Whether to use node to launch "executable" + + // executable + var pm = argv[1]; + // name of the subcommand, like `pm-install` + var bin = basename(pm, path.extname(pm)) + '-' + args[0]; + if (executableFile != null) { + bin = executableFile; + // Check for same extensions as we scan for below so get consistent launch behaviour. + var executableExt = path.extname(executableFile); + isExplicitJS = executableExt === '.js' || executableExt === '.ts' || executableExt === '.mjs'; + } + + // In case of globally installed, get the base dir where executable + // subcommand file should be located at + var baseDir; + + var resolvedLink = fs.realpathSync(pm); + + baseDir = dirname(resolvedLink); + + // prefer local `./` to bin in the $PATH + var localBin = path.join(baseDir, bin); + + // whether bin file is a js script with explicit `.js` or `.ts` extension + if (exists(localBin + '.js')) { + bin = localBin + '.js'; + isExplicitJS = true; + } else if (exists(localBin + '.ts')) { + bin = localBin + '.ts'; + isExplicitJS = true; + } else if (exists(localBin + '.mjs')) { + bin = localBin + '.mjs'; + isExplicitJS = true; + } else if (exists(localBin)) { + bin = localBin; + } + + args = args.slice(1); + + var proc; + if (process.platform !== 'win32') { + if (isExplicitJS) { + args.unshift(bin); + // add executable arguments to spawn + args = incrementNodeInspectorPort(process.execArgv).concat(args); + + proc = spawn(process.argv[0], args, { stdio: 'inherit' }); + } else { + proc = spawn(bin, args, { stdio: 'inherit' }); + } + } else { + args.unshift(bin); + // add executable arguments to spawn + args = incrementNodeInspectorPort(process.execArgv).concat(args); + proc = spawn(process.execPath, args, { stdio: 'inherit' }); + } + + var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP']; + signals.forEach(function(signal) { + process.on(signal, function() { + if (proc.killed === false && proc.exitCode === null) { + proc.kill(signal); + } + }); + }); + + // By default terminate process when spawned process terminates. + // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running! + const exitCallback = this._exitCallback; + if (!exitCallback) { + proc.on('close', process.exit.bind(process)); + } else { + proc.on('close', () => { + exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)')); + }); + } + proc.on('error', function(err) { + if (err.code === 'ENOENT') { + console.error('error: %s(1) does not exist, try --help', bin); + } else if (err.code === 'EACCES') { + console.error('error: %s(1) not executable. try chmod or run with root', bin); + } + if (!exitCallback) { + process.exit(1); + } else { + const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)'); + wrappedError.nestedError = err; + exitCallback(wrappedError); + } + }); + + // Store the reference to the child process + this.runningCommand = proc; +}; + +/** + * Normalize `args`, splitting joined short flags. For example + * the arg "-abc" is equivalent to "-a -b -c". + * This also normalizes equal sign and splits "--abc=def" into "--abc def". + * + * @param {Array} args + * @return {Array} + * @api private + */ + +Command.prototype.normalize = function(args) { + var ret = [], + arg, + lastOpt, + index, + short, + opt; + + for (var i = 0, len = args.length; i < len; ++i) { + arg = args[i]; + if (i > 0) { + lastOpt = this.optionFor(args[i - 1]); + } + + if (arg === '--') { + // Honor option terminator + ret = ret.concat(args.slice(i)); + break; + } else if (lastOpt && lastOpt.required) { + ret.push(arg); + } else if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') { + short = arg.slice(0, 2); + opt = this.optionFor(short); + if (opt && (opt.required || opt.optional)) { + ret.push(short); + ret.push(arg.slice(2)); + } else { + arg.slice(1).split('').forEach(function(c) { + ret.push('-' + c); + }); + } + } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) { + ret.push(arg.slice(0, index), arg.slice(index + 1)); + } else { + ret.push(arg); + } + } + + return ret; +}; + +/** + * Parse command `args`. + * + * When listener(s) are available those + * callbacks are invoked, otherwise the "*" + * event is emitted and those actions are invoked. + * + * @param {Array} args + * @return {Command} for chaining + * @api private + */ + +Command.prototype.parseArgs = function(args, unknown) { + var name; + + if (args.length) { + name = args[0]; + if (this.listeners('command:' + name).length) { + this.emit('command:' + args.shift(), args, unknown); + } else { + this.emit('command:*', args, unknown); + } + } else { + outputHelpIfRequested(this, unknown); + + // If there were no args and we have unknown options, + // then they are extraneous and we need to error. + if (unknown.length > 0 && !this.defaultExecutable) { + this.unknownOption(unknown[0]); + } + if (this.commands.length === 0 && + this._args.filter(function(a) { return a.required; }).length === 0) { + this.emit('command:*'); + } + } + + return this; +}; + +/** + * Return an option matching `arg` if any. + * + * @param {String} arg + * @return {Option} + * @api private + */ + +Command.prototype.optionFor = function(arg) { + for (var i = 0, len = this.options.length; i < len; ++i) { + if (this.options[i].is(arg)) { + return this.options[i]; + } + } +}; + +/** + * Display an error message if a mandatory option does not have a value. + * + * @api private + */ + +Command.prototype._checkForMissingMandatoryOptions = function() { + // Walk up hierarchy so can call from action handler after checking for displaying help. + for (var cmd = this; cmd; cmd = cmd.parent) { + cmd.options.forEach((anOption) => { + if (anOption.mandatory && (cmd._getOptionValue(anOption.attributeName()) === undefined)) { + cmd.missingMandatoryOptionValue(anOption); + } + }); + } +}; + +/** + * Parse options from `argv` returning `argv` + * void of these options. + * + * @param {Array} argv + * @return {{args: Array, unknown: Array}} + * @api public + */ + +Command.prototype.parseOptions = function(argv) { + var args = [], + len = argv.length, + literal, + option, + arg; + + var unknownOptions = []; + + // parse options + for (var i = 0; i < len; ++i) { + arg = argv[i]; + + // literal args after -- + if (literal) { + args.push(arg); + continue; + } + + if (arg === '--') { + literal = true; + continue; + } + + // find matching Option + option = this.optionFor(arg); + + // option is defined + if (option) { + // requires arg + if (option.required) { + arg = argv[++i]; + if (arg == null) return this.optionMissingArgument(option); + this.emit('option:' + option.name(), arg); + // optional arg + } else if (option.optional) { + arg = argv[i + 1]; + if (arg == null || (arg[0] === '-' && arg !== '-')) { + arg = null; + } else { + ++i; + } + this.emit('option:' + option.name(), arg); + // flag + } else { + this.emit('option:' + option.name()); + } + continue; + } + + // looks like an option + if (arg.length > 1 && arg[0] === '-') { + unknownOptions.push(arg); + + // If the next argument looks like it might be + // an argument for this option, we pass it on. + // If it isn't, then it'll simply be ignored + if ((i + 1) < argv.length && (argv[i + 1][0] !== '-' || argv[i + 1] === '-')) { + unknownOptions.push(argv[++i]); + } + continue; + } + + // arg + args.push(arg); + } + + return { args: args, unknown: unknownOptions }; +}; + +/** + * Return an object containing options as key-value pairs + * + * @return {Object} + * @api public + */ +Command.prototype.opts = function() { + if (this._storeOptionsAsProperties) { + // Preserve original behaviour so backwards compatible when still using properties + var result = {}, + len = this.options.length; + + for (var i = 0; i < len; i++) { + var key = this.options[i].attributeName(); + result[key] = key === this._versionOptionName ? this._version : this[key]; + } + return result; + } + + return this._optionValues; +}; + +/** + * Argument `name` is missing. + * + * @param {String} name + * @api private + */ + +Command.prototype.missingArgument = function(name) { + const message = `error: missing required argument '${name}'`; + console.error(message); + this._exit(1, 'commander.missingArgument', message); +}; + +/** + * `Option` is missing an argument, but received `flag` or nothing. + * + * @param {Option} option + * @param {String} [flag] + * @api private + */ + +Command.prototype.optionMissingArgument = function(option, flag) { + let message; + if (flag) { + message = `error: option '${option.flags}' argument missing, got '${flag}'`; + } else { + message = `error: option '${option.flags}' argument missing`; + } + console.error(message); + this._exit(1, 'commander.optionMissingArgument', message); +}; + +/** + * `Option` does not have a value, and is a mandatory option. + * + * @param {Option} option + * @api private + */ + +Command.prototype.missingMandatoryOptionValue = function(option) { + const message = `error: required option '${option.flags}' not specified`; + console.error(message); + this._exit(1, 'commander.missingMandatoryOptionValue', message); +}; + +/** + * Unknown option `flag`. + * + * @param {String} flag + * @api private + */ + +Command.prototype.unknownOption = function(flag) { + if (this._allowUnknownOption) return; + const message = `error: unknown option '${flag}'`; + console.error(message); + this._exit(1, 'commander.unknownOption', message); +}; + +/** + * Variadic argument with `name` is not the last argument as required. + * + * @param {String} name + * @api private + */ + +Command.prototype.variadicArgNotLast = function(name) { + const message = `error: variadic arguments must be last '${name}'`; + console.error(message); + this._exit(1, 'commander.variadicArgNotLast', message); +}; + +/** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * You can optionally supply the flags and description to override the defaults. + * + * @param {String} str + * @param {String} [flags] + * @param {String} [description] + * @return {Command} for chaining + * @api public + */ + +Command.prototype.version = function(str, flags, description) { + if (arguments.length === 0) return this._version; + this._version = str; + flags = flags || '-V, --version'; + description = description || 'output the version number'; + var versionOption = new Option(flags, description); + this._versionOptionName = versionOption.long.substr(2) || 'version'; + this.options.push(versionOption); + var self = this; + this.on('option:' + this._versionOptionName, function() { + process.stdout.write(str + '\n'); + self._exit(0, 'commander.version', str); + }); + return this; +}; + +/** + * Set the description to `str`. + * + * @param {String} str + * @param {Object} [argsDescription] + * @return {String|Command} + * @api public + */ + +Command.prototype.description = function(str, argsDescription) { + if (arguments.length === 0) return this._description; + this._description = str; + this._argsDescription = argsDescription; + return this; +}; + +/** + * Set an alias for the command + * + * @param {String} alias + * @return {String|Command} + * @api public + */ + +Command.prototype.alias = function(alias) { + var command = this; + if (this.commands.length !== 0) { + command = this.commands[this.commands.length - 1]; + } + + if (arguments.length === 0) return command._alias; + + if (alias === command._name) throw new Error('Command alias can\'t be the same as its name'); + + command._alias = alias; + return this; +}; + +/** + * Set / get the command usage `str`. + * + * @param {String} [str] + * @return {String|Command} + * @api public + */ + +Command.prototype.usage = function(str) { + var args = this._args.map(function(arg) { + return humanReadableArgName(arg); + }); + + var usage = '[options]' + + (this.commands.length ? ' [command]' : '') + + (this._args.length ? ' ' + args.join(' ') : ''); + + if (arguments.length === 0) return this._usage || usage; + this._usage = str; + + return this; +}; + +/** + * Get or set the name of the command + * + * @param {String} [str] + * @return {String|Command} + * @api public + */ + +Command.prototype.name = function(str) { + if (arguments.length === 0) return this._name; + this._name = str; + return this; +}; + +/** + * Return prepared commands. + * + * @return {Array} + * @api private + */ + +Command.prototype.prepareCommands = function() { + return this.commands.filter(function(cmd) { + return !cmd._noHelp; + }).map(function(cmd) { + var args = cmd._args.map(function(arg) { + return humanReadableArgName(arg); + }).join(' '); + + return [ + cmd._name + + (cmd._alias ? '|' + cmd._alias : '') + + (cmd.options.length ? ' [options]' : '') + + (args ? ' ' + args : ''), + cmd._description + ]; + }); +}; + +/** + * Return the largest command length. + * + * @return {Number} + * @api private + */ + +Command.prototype.largestCommandLength = function() { + var commands = this.prepareCommands(); + return commands.reduce(function(max, command) { + return Math.max(max, command[0].length); + }, 0); +}; + +/** + * Return the largest option length. + * + * @return {Number} + * @api private + */ + +Command.prototype.largestOptionLength = function() { + var options = [].slice.call(this.options); + options.push({ + flags: this._helpFlags + }); + + return options.reduce(function(max, option) { + return Math.max(max, option.flags.length); + }, 0); +}; + +/** + * Return the largest arg length. + * + * @return {Number} + * @api private + */ + +Command.prototype.largestArgLength = function() { + return this._args.reduce(function(max, arg) { + return Math.max(max, arg.name.length); + }, 0); +}; + +/** + * Return the pad width. + * + * @return {Number} + * @api private + */ + +Command.prototype.padWidth = function() { + var width = this.largestOptionLength(); + if (this._argsDescription && this._args.length) { + if (this.largestArgLength() > width) { + width = this.largestArgLength(); + } + } + + if (this.commands && this.commands.length) { + if (this.largestCommandLength() > width) { + width = this.largestCommandLength(); + } + } + + return width; +}; + +/** + * Return help for options. + * + * @return {String} + * @api private + */ + +Command.prototype.optionHelp = function() { + var width = this.padWidth(); + + var columns = process.stdout.columns || 80; + var descriptionWidth = columns - width - 4; + + // Append the help information + return this.options.map(function(option) { + const fullDesc = option.description + + ((!option.negate && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : ''); + return pad(option.flags, width) + ' ' + optionalWrap(fullDesc, descriptionWidth, width + 2); + }).concat([pad(this._helpFlags, width) + ' ' + optionalWrap(this._helpDescription, descriptionWidth, width + 2)]) + .join('\n'); +}; + +/** + * Return command help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.commandHelp = function() { + if (!this.commands.length) return ''; + + var commands = this.prepareCommands(); + var width = this.padWidth(); + + var columns = process.stdout.columns || 80; + var descriptionWidth = columns - width - 4; + + return [ + 'Commands:', + commands.map(function(cmd) { + var desc = cmd[1] ? ' ' + cmd[1] : ''; + return (desc ? pad(cmd[0], width) : cmd[0]) + optionalWrap(desc, descriptionWidth, width + 2); + }).join('\n').replace(/^/gm, ' '), + '' + ].join('\n'); +}; + +/** + * Return program help documentation. + * + * @return {String} + * @api private + */ + +Command.prototype.helpInformation = function() { + var desc = []; + if (this._description) { + desc = [ + this._description, + '' + ]; + + var argsDescription = this._argsDescription; + if (argsDescription && this._args.length) { + var width = this.padWidth(); + var columns = process.stdout.columns || 80; + var descriptionWidth = columns - width - 5; + desc.push('Arguments:'); + desc.push(''); + this._args.forEach(function(arg) { + desc.push(' ' + pad(arg.name, width) + ' ' + wrap(argsDescription[arg.name], descriptionWidth, width + 4)); + }); + desc.push(''); + } + } + + var cmdName = this._name; + if (this._alias) { + cmdName = cmdName + '|' + this._alias; + } + var parentCmdNames = ''; + for (var parentCmd = this.parent; parentCmd; parentCmd = parentCmd.parent) { + parentCmdNames = parentCmd.name() + ' ' + parentCmdNames; + } + var usage = [ + 'Usage: ' + parentCmdNames + cmdName + ' ' + this.usage(), + '' + ]; + + var cmds = []; + var commandHelp = this.commandHelp(); + if (commandHelp) cmds = [commandHelp]; + + var options = [ + 'Options:', + '' + this.optionHelp().replace(/^/gm, ' '), + '' + ]; + + return usage + .concat(desc) + .concat(options) + .concat(cmds) + .join('\n'); +}; + +/** + * Output help information for this command. + * + * When listener(s) are available for the helpLongFlag + * those callbacks are invoked. + * + * @api public + */ + +Command.prototype.outputHelp = function(cb) { + if (!cb) { + cb = function(passthru) { + return passthru; + }; + } + const cbOutput = cb(this.helpInformation()); + if (typeof cbOutput !== 'string' && !Buffer.isBuffer(cbOutput)) { + throw new Error('outputHelp callback must return a string or a Buffer'); + } + process.stdout.write(cbOutput); + this.emit(this._helpLongFlag); +}; + +/** + * You can pass in flags and a description to override the help + * flags and help description for your command. + * + * @param {String} [flags] + * @param {String} [description] + * @return {Command} + * @api public + */ + +Command.prototype.helpOption = function(flags, description) { + this._helpFlags = flags || this._helpFlags; + this._helpDescription = description || this._helpDescription; + + var splitFlags = this._helpFlags.split(/[ ,|]+/); + + if (splitFlags.length > 1) this._helpShortFlag = splitFlags.shift(); + + this._helpLongFlag = splitFlags.shift(); + + return this; +}; + +/** + * Output help information and exit. + * + * @param {Function} [cb] + * @api public + */ + +Command.prototype.help = function(cb) { + this.outputHelp(cb); + // exitCode: preserving original behaviour which was calling process.exit() + // message: do not have all displayed text available so only passing placeholder. + this._exit(process.exitCode || 0, 'commander.help', '(outputHelp)'); +}; + +/** + * Camel-case the given `flag` + * + * @param {String} flag + * @return {String} + * @api private + */ + +function camelcase(flag) { + return flag.split('-').reduce(function(str, word) { + return str + word[0].toUpperCase() + word.slice(1); + }); +} + +/** + * Pad `str` to `width`. + * + * @param {String} str + * @param {Number} width + * @return {String} + * @api private + */ + +function pad(str, width) { + var len = Math.max(0, width - str.length); + return str + Array(len + 1).join(' '); +} + +/** + * Wraps the given string with line breaks at the specified width while breaking + * words and indenting every but the first line on the left. + * + * @param {String} str + * @param {Number} width + * @param {Number} indent + * @return {String} + * @api private + */ +function wrap(str, width, indent) { + var regex = new RegExp('.{1,' + (width - 1) + '}([\\s\u200B]|$)|[^\\s\u200B]+?([\\s\u200B]|$)', 'g'); + var lines = str.match(regex) || []; + return lines.map(function(line, i) { + if (line.slice(-1) === '\n') { + line = line.slice(0, line.length - 1); + } + return ((i > 0 && indent) ? Array(indent + 1).join(' ') : '') + line.trimRight(); + }).join('\n'); +} + +/** + * Optionally wrap the given str to a max width of width characters per line + * while indenting with indent spaces. Do not wrap if insufficient width or + * string is manually formatted. + * + * @param {String} str + * @param {Number} width + * @param {Number} indent + * @return {String} + * @api private + */ +function optionalWrap(str, width, indent) { + // Detect manually wrapped and indented strings by searching for line breaks + // followed by multiple spaces/tabs. + if (str.match(/[\n]\s+/)) return str; + // Do not wrap to narrow columns (or can end up with a word per line). + const minWidth = 40; + if (width < minWidth) return str; + + return wrap(str, width, indent); +} + +/** + * Output help information if help flags specified + * + * @param {Command} cmd - command to output help for + * @param {Array} options - array of options to search for -h or --help + * @api private + */ + +function outputHelpIfRequested(cmd, options) { + options = options || []; + + for (var i = 0; i < options.length; i++) { + if (options[i] === cmd._helpLongFlag || options[i] === cmd._helpShortFlag) { + cmd.outputHelp(); + // (Do not have all displayed text available so only passing placeholder.) + cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)'); + } + } +} + +/** + * Takes an argument and returns its human readable equivalent for help usage. + * + * @param {Object} arg + * @return {String} + * @api private + */ + +function humanReadableArgName(arg) { + var nameOutput = arg.name + (arg.variadic === true ? '...' : ''); + + return arg.required + ? '<' + nameOutput + '>' + : '[' + nameOutput + ']'; +} + +// for versions before node v0.8 when there weren't `fs.existsSync` +function exists(file) { + try { + if (fs.statSync(file).isFile()) { + return true; + } + } catch (e) { + return false; + } +} + +/** + * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command). + * + * @param {string[]} args - array of arguments from node.execArgv + * @returns {string[]} + * @api private + */ + +function incrementNodeInspectorPort(args) { + // Testing for these options: + // --inspect[=[host:]port] + // --inspect-brk[=[host:]port] + // --inspect-port=[host:]port + return args.map((arg) => { + var result = arg; + if (arg.indexOf('--inspect') === 0) { + var debugOption; + var debugHost = '127.0.0.1'; + var debugPort = '9229'; + var match; + if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) { + // e.g. --inspect + debugOption = match[1]; + } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) { + debugOption = match[1]; + if (/^\d+$/.test(match[3])) { + // e.g. --inspect=1234 + debugPort = match[3]; + } else { + // e.g. --inspect=localhost + debugHost = match[3]; + } + } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) { + // e.g. --inspect=localhost:1234 + debugOption = match[1]; + debugHost = match[3]; + debugPort = match[4]; + } + + if (debugOption && debugPort !== '0') { + result = `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`; + } + } + return result; + }); +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/commander/package.json b/sdk/typescript/node_modules/sucrase/node_modules/commander/package.json new file mode 100644 index 0000000..e4781e5 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/commander/package.json @@ -0,0 +1,41 @@ +{ + "name": "commander", + "version": "4.1.1", + "description": "the complete solution for node.js command-line programs", + "keywords": [ + "commander", + "command", + "option", + "parser" + ], + "author": "TJ Holowaychuk ", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/tj/commander.js.git" + }, + "scripts": { + "lint": "eslint index.js \"tests/**/*.js\"", + "test": "jest && npm run test-typings", + "test-typings": "tsc -p tsconfig.json" + }, + "main": "index", + "files": [ + "index.js", + "typings/index.d.ts" + ], + "dependencies": {}, + "devDependencies": { + "@types/jest": "^24.0.23", + "@types/node": "^12.12.11", + "eslint": "^6.7.0", + "eslint-plugin-jest": "^22.21.0", + "jest": "^24.8.0", + "standard": "^14.3.1", + "typescript": "^3.7.2" + }, + "typings": "typings/index.d.ts", + "engines": { + "node": ">= 6" + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/commander/typings/index.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/commander/typings/index.d.ts new file mode 100644 index 0000000..082a3a3 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/commander/typings/index.d.ts @@ -0,0 +1,311 @@ +// Type definitions for commander +// Original definitions by: Alan Agius , Marcelo Dezem , vvakame , Jules Randolph + +/// + +declare namespace commander { + + interface CommanderError extends Error { + code: string; + exitCode: number; + message: string; + nestedError?: string; + } + type CommanderErrorConstructor = { new (exitCode: number, code: string, message: string): CommanderError }; + + interface Option { + flags: string; + required: boolean; // A value must be supplied when the option is specified. + optional: boolean; // A value is optional when the option is specified. + mandatory: boolean; // The option must have a value after parsing, which usually means it must be specified on command line. + bool: boolean; + short?: string; + long: string; + description: string; + } + type OptionConstructor = { new (flags: string, description?: string): Option }; + + interface Command extends NodeJS.EventEmitter { + [key: string]: any; // options as properties + + args: string[]; + + /** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * You can optionally supply the flags and description to override the defaults. + */ + version(str: string, flags?: string, description?: string): Command; + + /** + * Define a command, implemented using an action handler. + * + * @remarks + * The command description is supplied using `.description`, not as a parameter to `.command`. + * + * @example + * ```ts + * program + * .command('clone [destination]') + * .description('clone a repository into a newly created directory') + * .action((source, destination) => { + * console.log('clone command called'); + * }); + * ``` + * + * @param nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` + * @param opts - configuration options + * @returns new command + */ + command(nameAndArgs: string, opts?: CommandOptions): Command; + /** + * Define a command, implemented in a separate executable file. + * + * @remarks + * The command description is supplied as the second parameter to `.command`. + * + * @example + * ```ts + * program + * .command('start ', 'start named service') + * .command('stop [service]', 'stop named serice, or all if no name supplied'); + * ``` + * + * @param nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` + * @param description - description of executable command + * @param opts - configuration options + * @returns top level command for chaining more command definitions + */ + command(nameAndArgs: string, description: string, opts?: commander.CommandOptions): Command; + + /** + * Define argument syntax for the top-level command. + * + * @returns Command for chaining + */ + arguments(desc: string): Command; + + /** + * Parse expected `args`. + * + * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. + * + * @returns Command for chaining + */ + parseExpectedArgs(args: string[]): Command; + + /** + * Register callback to use as replacement for calling process.exit. + */ + exitOverride(callback?: (err: CommanderError) => never|void): Command; + + /** + * Register callback `fn` for the command. + * + * @example + * program + * .command('help') + * .description('display verbose help') + * .action(function() { + * // output help here + * }); + * + * @returns Command for chaining + */ + action(fn: (...args: any[]) => void | Promise): Command; + + /** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * @example + * // simple boolean defaulting to false + * program.option('-p, --pepper', 'add pepper'); + * + * --pepper + * program.pepper + * // => Boolean + * + * // simple boolean defaulting to true + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => false + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @returns Command for chaining + */ + option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command; + option(flags: string, description?: string, defaultValue?: any): Command; + + /** + * Define a required option, which must have a value after parsing. This usually means + * the option must be specified on the command line. (Otherwise the same as .option().) + * + * The `flags` string should contain both the short and long flags, separated by comma, a pipe or space. + */ + requiredOption(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command; + requiredOption(flags: string, description?: string, defaultValue?: any): Command; + + + /** + * Whether to store option values as properties on command object, + * or store separately (specify false). In both cases the option values can be accessed using .opts(). + * + * @return Command for chaining + */ + storeOptionsAsProperties(value?: boolean): Command; + + /** + * Whether to pass command to action handler, + * or just the options (specify false). + * + * @return Command for chaining + */ + passCommandToAction(value?: boolean): Command; + + /** + * Allow unknown options on the command line. + * + * @param [arg] if `true` or omitted, no error will be thrown for unknown options. + * @returns Command for chaining + */ + allowUnknownOption(arg?: boolean): Command; + + /** + * Parse `argv`, setting options and invoking commands when defined. + * + * @returns Command for chaining + */ + parse(argv: string[]): Command; + + /** + * Parse `argv`, setting options and invoking commands when defined. + * + * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. + * + * @returns Promise + */ + parseAsync(argv: string[]): Promise; + + /** + * Parse options from `argv` returning `argv` void of these options. + */ + parseOptions(argv: string[]): commander.ParseOptionsResult; + + /** + * Return an object containing options as key-value pairs + */ + opts(): { [key: string]: any }; + + /** + * Set the description. + * + * @returns Command for chaining + */ + description(str: string, argsDescription?: {[argName: string]: string}): Command; + /** + * Get the description. + */ + description(): string; + + /** + * Set an alias for the command. + * + * @returns Command for chaining + */ + alias(alias: string): Command; + /** + * Get alias for the command. + */ + alias(): string; + + /** + * Set the command usage. + * + * @returns Command for chaining + */ + usage(str: string): Command; + /** + * Get the command usage. + */ + usage(): string; + + /** + * Set the name of the command. + * + * @returns Command for chaining + */ + name(str: string): Command; + /** + * Get the name of the command. + */ + name(): string; + + /** + * Output help information for this command. + * + * When listener(s) are available for the helpLongFlag + * those callbacks are invoked. + */ + outputHelp(cb?: (str: string) => string): void; + + /** + * You can pass in flags and a description to override the help + * flags and help description for your command. + */ + helpOption(flags?: string, description?: string): Command; + + /** + * Output help information and exit. + */ + help(cb?: (str: string) => string): never; + } + type CommandConstructor = { new (name?: string): Command }; + + + interface CommandOptions { + noHelp?: boolean; + isDefault?: boolean; + executableFile?: string; + } + + interface ParseOptionsResult { + args: string[]; + unknown: string[]; + } + + interface CommanderStatic extends Command { + Command: CommandConstructor; + Option: OptionConstructor; + CommanderError:CommanderErrorConstructor; + } + +} + +declare const commander: commander.CommanderStatic; +export = commander; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/LICENSE new file mode 100644 index 0000000..12978ec --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Brian Donovan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/README.md b/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/README.md new file mode 100644 index 0000000..fa90223 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/README.md @@ -0,0 +1,33 @@ +# lines-and-columns + +Maps lines and columns to character offsets and back. This is useful for parsers +and other text processors that deal in character ranges but process text with +meaningful lines and columns. + +## Install + +``` +$ npm install [--save] lines-and-columns +``` + +## Usage + +```js +import { LinesAndColumns } from 'lines-and-columns' + +const lines = new LinesAndColumns( + `table { + border: 0 +}` +) + +lines.locationForIndex(9) +// { line: 1, column: 1 } + +lines.indexForLocation({ line: 1, column: 2 }) +// 10 +``` + +## License + +MIT diff --git a/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/package.json b/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/package.json new file mode 100644 index 0000000..a12eb6b --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/lines-and-columns/package.json @@ -0,0 +1,49 @@ +{ + "name": "lines-and-columns", + "version": "1.2.4", + "description": "Maps lines and columns to character offsets and back.", + "keywords": [ + "lines", + "columns", + "parser" + ], + "homepage": "https://github.com/eventualbuddha/lines-and-columns#readme", + "bugs": { + "url": "https://github.com/eventualbuddha/lines-and-columns/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/eventualbuddha/lines-and-columns.git" + }, + "license": "MIT", + "author": "Brian Donovan ", + "main": "./build/index.js", + "types": "./build/index.d.ts", + "files": [ + "build" + ], + "scripts": { + "build:watch": "tsc --build tsconfig.build.json --watch", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "test": "is-ci test:coverage test:watch", + "test:coverage": "jest --coverage", + "test:watch": "jest --watch" + }, + "devDependencies": { + "@types/jest": "^27.0.3", + "@types/node": "^16.11.9", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", + "esbuild": "^0.13.15", + "esbuild-runner": "^2.2.1", + "eslint": "^8.2.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "is-ci-cli": "^2.2.0", + "jest": "^27.3.1", + "prettier": "^2.4.1", + "semantic-release": "^18.0.0", + "typescript": "^4.5.2" + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/HISTORY.md b/sdk/typescript/node_modules/sucrase/node_modules/mz/HISTORY.md new file mode 100644 index 0000000..6ebee21 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/HISTORY.md @@ -0,0 +1,66 @@ + +2.7.0 / 2017-09-13 +================== + + * feat: support fs.copyFile (#58) + +2.6.0 / 2016-11-22 +================== + + * Added fdatasync to fs api (#46) + +2.5.0 / 2016-11-04 +================== + + * feat: support fs.mkdtemp + +2.4.0 / 2016-03-23 +================== + + * add `fs.truncate()` [#34](https://github.com/normalize/mz/pull/34) + +2.3.1 / 2016-02-01 +================== + + * update `any-promise@v1` + +2.3.0 / 2016-01-30 +================== + + * feat(package): switch to `any-promise` to support more promise engines + +2.2.0 / 2016-01-24 +================== + + * feat(package): add index.js to files + +2.1.0 / 2015-10-15 +================== + + * support for readline library + +2.0.0 / 2015-05-24 +================== + + * support callbacks as well + +1.2.0 / 2014-12-16 +================== + + * refactor promisification to `thenify` and `thenify-all` + +1.1.0 / 2014-11-14 +================== + + * use `graceful-fs` if available + +1.0.1 / 2014-08-18 +================== + + * don't use `bluebird.promisify()` - unnecessarily wraps runtime errors, causing issues + +1.0.0 / 2014-06-18 +================== + + * use `bluebird` by default if found + * support node 0.8 diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/mz/LICENSE new file mode 100644 index 0000000..1835f3d --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/README.md b/sdk/typescript/node_modules/sucrase/node_modules/mz/README.md new file mode 100644 index 0000000..50d6557 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/README.md @@ -0,0 +1,106 @@ + +# MZ - Modernize node.js + +[![NPM version][npm-image]][npm-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] +[![Dependency Status][david-image]][david-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +Modernize node.js to current ECMAScript specifications! +node.js will not update their API to ES6+ [for a while](https://github.com/joyent/node/issues/7549). +This library is a wrapper for various aspects of node.js' API. + +## Installation and Usage + +Set `mz` as a dependency and install it. + +```bash +npm i mz +``` + +Then prefix the relevant `require()`s with `mz/`: + +```js +var fs = require('mz/fs') + +fs.exists(__filename).then(function (exists) { + if (exists) // do something +}) +``` + +With ES2017, this will allow you to use async functions cleanly with node's core API: + +```js +const fs = require('mz/fs') + + +async function doSomething () { + if (await fs.exists(__filename)) // do something +} +``` + +## Promisification + +Many node methods are converted into promises. +Any properties that are deprecated or aren't asynchronous will simply be proxied. +The modules wrapped are: + +- `child_process` +- `crypto` +- `dns` +- `fs` (uses `graceful-fs` if available) +- `readline` +- `zlib` + +```js +var exec = require('mz/child_process').exec + +exec('node --version').then(function (stdout) { + console.log(stdout) +}) +``` + +## Promise Engine + +`mz` uses [`any-promise`](https://github.com/kevinbeaty/any-promise). + +## FAQ + +### Can I use this in production? + +Yes, Node 4.x ships with stable promises support. For older engines, +you should probably install your own promise implementation and register it with +`require('any-promise/register')('bluebird')`. + +### Will this make my app faster? + +Nope, probably slower actually. + +### Can I add more features? + +Sure. +Open an issue. + +Currently, the plans are to eventually support: + +- New APIs in node.js that are not available in older versions of node +- ECMAScript7 Streams + +[bluebird]: https://github.com/petkaantonov/bluebird + +[npm-image]: https://img.shields.io/npm/v/mz.svg?style=flat-square +[npm-url]: https://npmjs.org/package/mz +[github-tag]: http://img.shields.io/github/tag/normalize/mz.svg?style=flat-square +[github-url]: https://github.com/normalize/mz/tags +[travis-image]: https://img.shields.io/travis/normalize/mz.svg?style=flat-square +[travis-url]: https://travis-ci.org/normalize/mz +[coveralls-image]: https://img.shields.io/coveralls/normalize/mz.svg?style=flat-square +[coveralls-url]: https://coveralls.io/r/normalize/mz?branch=master +[david-image]: http://img.shields.io/david/normalize/mz.svg?style=flat-square +[david-url]: https://david-dm.org/normalize/mz +[license-image]: http://img.shields.io/npm/l/mz.svg?style=flat-square +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/mz.svg?style=flat-square +[downloads-url]: https://npmjs.org/package/mz diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/child_process.js b/sdk/typescript/node_modules/sucrase/node_modules/mz/child_process.js new file mode 100644 index 0000000..06d5d9e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/child_process.js @@ -0,0 +1,8 @@ + +require('thenify-all').withCallback( + require('child_process'), + exports, [ + 'exec', + 'execFile', + ] +) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/crypto.js b/sdk/typescript/node_modules/sucrase/node_modules/mz/crypto.js new file mode 100644 index 0000000..d8cff57 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/crypto.js @@ -0,0 +1,9 @@ + +require('thenify-all').withCallback( + require('crypto'), + exports, [ + 'pbkdf2', + 'pseudoRandomBytes', + 'randomBytes' + ] +) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/dns.js b/sdk/typescript/node_modules/sucrase/node_modules/mz/dns.js new file mode 100644 index 0000000..c103582 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/dns.js @@ -0,0 +1,16 @@ + +require('thenify-all').withCallback( + require('dns'), + exports, [ + 'lookup', + 'resolve', + 'resolve4', + 'resolve6', + 'resolveCname', + 'resolveMx', + 'resolveNs', + 'resolveSrv', + 'resolveTxt', + 'reverse' + ] +) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/fs.js b/sdk/typescript/node_modules/sucrase/node_modules/mz/fs.js new file mode 100644 index 0000000..1cfd2d7 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/fs.js @@ -0,0 +1,62 @@ + +var Promise = require('any-promise') +var fs +try { + fs = require('graceful-fs') +} catch(err) { + fs = require('fs') +} + +var api = [ + 'appendFile', + 'chmod', + 'chown', + 'close', + 'fchmod', + 'fchown', + 'fdatasync', + 'fstat', + 'fsync', + 'ftruncate', + 'futimes', + 'lchown', + 'link', + 'lstat', + 'mkdir', + 'open', + 'read', + 'readFile', + 'readdir', + 'readlink', + 'realpath', + 'rename', + 'rmdir', + 'stat', + 'symlink', + 'truncate', + 'unlink', + 'utimes', + 'write', + 'writeFile' +] + +typeof fs.access === 'function' && api.push('access') +typeof fs.copyFile === 'function' && api.push('copyFile') +typeof fs.mkdtemp === 'function' && api.push('mkdtemp') + +require('thenify-all').withCallback(fs, exports, api) + +exports.exists = function (filename, callback) { + // callback + if (typeof callback === 'function') { + return fs.stat(filename, function (err) { + callback(null, !err); + }) + } + // or promise + return new Promise(function (resolve) { + fs.stat(filename, function (err) { + resolve(!err) + }) + }) +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/index.js b/sdk/typescript/node_modules/sucrase/node_modules/mz/index.js new file mode 100644 index 0000000..cef508d --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/index.js @@ -0,0 +1,8 @@ +module.exports = { + fs: require('./fs'), + dns: require('./dns'), + zlib: require('./zlib'), + crypto: require('./crypto'), + readline: require('./readline'), + child_process: require('./child_process') +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/package.json b/sdk/typescript/node_modules/sucrase/node_modules/mz/package.json new file mode 100644 index 0000000..de8d542 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/package.json @@ -0,0 +1,44 @@ +{ + "name": "mz", + "description": "modernize node.js to current ECMAScript standards", + "version": "2.7.0", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com", + "twitter": "https://twitter.com/jongleberry" + }, + "license": "MIT", + "repository": "normalize/mz", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + }, + "devDependencies": { + "istanbul": "^0.4.0", + "bluebird": "^3.0.0", + "mocha": "^3.0.0" + }, + "scripts": { + "test": "mocha --reporter spec", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" + }, + "keywords": [ + "promisify", + "promise", + "thenify", + "then", + "es6" + ], + "files": [ + "index.js", + "child_process.js", + "crypto.js", + "dns.js", + "fs.js", + "readline.js", + "zlib.js" + ] +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/readline.js b/sdk/typescript/node_modules/sucrase/node_modules/mz/readline.js new file mode 100644 index 0000000..eb70c46 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/readline.js @@ -0,0 +1,64 @@ +var readline = require('readline') +var Promise = require('any-promise') +var objectAssign = require('object-assign') +var Interface = readline.Interface + +function wrapCompleter (completer) { + if (completer.length === 2) return completer + + return function (line, cb) { + var result = completer(line) + + if (typeof result.then !== 'function') { + return cb(null, result) + } + + result.catch(cb).then(function (result) { + process.nextTick(function () { cb(null, result) }) + }) + } +} + +function InterfaceAsPromised (input, output, completer, terminal) { + if (arguments.length === 1) { + var options = input + + if (typeof options.completer === 'function') { + options = objectAssign({}, options, { + completer: wrapCompleter(options.completer) + }) + } + + Interface.call(this, options) + } else { + if (typeof completer === 'function') { + completer = wrapCompleter(completer) + } + + Interface.call(this, input, output, completer, terminal) + } +} + +InterfaceAsPromised.prototype = Object.create(Interface.prototype) + +InterfaceAsPromised.prototype.question = function (question, callback) { + if (typeof callback === 'function') { + return Interface.prototype.question.call(this, question, callback) + } + + var self = this + return new Promise(function (resolve) { + Interface.prototype.question.call(self, question, resolve) + }) +} + +objectAssign(exports, readline, { + Interface: InterfaceAsPromised, + createInterface: function (input, output, completer, terminal) { + if (arguments.length === 1) { + return new InterfaceAsPromised(input) + } + + return new InterfaceAsPromised(input, output, completer, terminal) + } +}) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/mz/zlib.js b/sdk/typescript/node_modules/sucrase/node_modules/mz/zlib.js new file mode 100644 index 0000000..a05c26a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/mz/zlib.js @@ -0,0 +1,13 @@ + +require('thenify-all').withCallback( + require('zlib'), + exports, [ + 'deflate', + 'deflateRaw', + 'gzip', + 'gunzip', + 'inflate', + 'inflateRaw', + 'unzip', + ] +) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/object-assign/index.js b/sdk/typescript/node_modules/sucrase/node_modules/object-assign/index.js new file mode 100644 index 0000000..0930cf8 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/object-assign/index.js @@ -0,0 +1,90 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +'use strict'; +/* eslint-disable no-unused-vars */ +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +module.exports = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +}; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/object-assign/license b/sdk/typescript/node_modules/sucrase/node_modules/object-assign/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/object-assign/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/object-assign/package.json b/sdk/typescript/node_modules/sucrase/node_modules/object-assign/package.json new file mode 100644 index 0000000..503eb1e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/object-assign/package.json @@ -0,0 +1,42 @@ +{ + "name": "object-assign", + "version": "4.1.1", + "description": "ES2015 `Object.assign()` ponyfill", + "license": "MIT", + "repository": "sindresorhus/object-assign", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && ava", + "bench": "matcha bench.js" + }, + "files": [ + "index.js" + ], + "keywords": [ + "object", + "assign", + "extend", + "properties", + "es2015", + "ecmascript", + "harmony", + "ponyfill", + "prollyfill", + "polyfill", + "shim", + "browser" + ], + "devDependencies": { + "ava": "^0.16.0", + "lodash": "^4.16.4", + "matcha": "^0.7.0", + "xo": "^0.16.0" + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/object-assign/readme.md b/sdk/typescript/node_modules/sucrase/node_modules/object-assign/readme.md new file mode 100644 index 0000000..1be09d3 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/object-assign/readme.md @@ -0,0 +1,61 @@ +# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign) + +> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com) + + +## Use the built-in + +Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari), +support `Object.assign()` :tada:. If you target only those environments, then by all +means, use `Object.assign()` instead of this package. + + +## Install + +``` +$ npm install --save object-assign +``` + + +## Usage + +```js +const objectAssign = require('object-assign'); + +objectAssign({foo: 0}, {bar: 1}); +//=> {foo: 0, bar: 1} + +// multiple sources +objectAssign({foo: 0}, {bar: 1}, {baz: 2}); +//=> {foo: 0, bar: 1, baz: 2} + +// overwrites equal keys +objectAssign({foo: 0}, {foo: 1}, {foo: 2}); +//=> {foo: 2} + +// ignores null and undefined sources +objectAssign({foo: 0}, null, {bar: 1}, undefined); +//=> {foo: 0, bar: 1} +``` + + +## API + +### objectAssign(target, [source, ...]) + +Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones. + + +## Resources + +- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign) + + +## Related + +- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()` + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/pirates/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/pirates/LICENSE new file mode 100644 index 0000000..acc7a0e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/pirates/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016-2018 Ari Porad + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/pirates/README.md b/sdk/typescript/node_modules/sucrase/node_modules/pirates/README.md new file mode 100644 index 0000000..f36bc5a --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/pirates/README.md @@ -0,0 +1,73 @@ +# Pirates [![Coverage][codecov-badge]][codecov-link] + +### Properly hijack require + +This library allows to add custom require hooks, which do not interfere with other require hooks. + +This library only works with commonJS. + +[codecov-badge]: https://img.shields.io/codecov/c/github/danez/pirates/master.svg?style=flat "codecov" +[codecov-link]: https://codecov.io/gh/danez/pirates "codecov" + +## Why? + +Two reasons: +1. Babel and istanbul were breaking each other. +2. Everyone seemed to re-invent the wheel on this, and everyone wanted a solution that was DRY, simple, easy to use, +and made everything Just Work™, while allowing multiple require hooks, in a fashion similar to calling `super`. + +For some context, see [the Babel issue thread][] which started this all, then [the nyc issue thread][], where +discussion was moved (as we began to discuss just using the code nyc had developed), and finally to [#1][issue-1] +where discussion was finally moved. + +[the Babel issue thread]: https://github.com/babel/babel/pull/3062 "Babel Issue Thread" +[the nyc issue thread]: https://github.com/bcoe/nyc/issues/70 "NYC Issue Thread" +[issue-1]: https://github.com/danez/pirates/issues/1 "Issue #1" + +## Installation + + npm install --save pirates + +## Usage + +Using pirates is really easy: +```javascript +// my-module/register.js +const addHook = require('pirates').addHook; +// Or if you use ES modules +// import { addHook } from 'pirates'; + +function matcher(filename) { + // Here, you can inspect the filename to determine if it should be hooked or + // not. Just return a truthy/falsey. Files in node_modules are automatically ignored, + // unless otherwise specified in options (see below). + + // TODO: Implement your logic here + return true; +} + +const revert = addHook( + (code, filename) => code.replace('@@foo', 'console.log(\'foo\');'), + { exts: ['.js'], matcher } +); + +// And later, if you want to un-hook require, you can just do: +revert(); +``` + +## API + +### pirates.addHook(hook, [opts={ [matcher: true], [exts: ['.js']], [ignoreNodeModules: true] }]); +Add a require hook. `hook` must be a function that takes `(code, filename)`, and returns the modified code. `opts` is +an optional options object. Available options are: `matcher`, which is a function that accepts a filename, and +returns a truthy value if the file should be hooked (defaults to a function that always returns true), falsey if +otherwise; `exts`, which is an array of extensions to hook, they should begin with `.` (defaults to `['.js']`); +`ignoreNodeModules`, if true, any file in a `node_modules` folder wont be hooked (the matcher also wont be called), +if false, then the matcher will be called for any files in `node_modules` (defaults to true). + + +## Projects that use Pirates + +See the [wiki page](https://github.com/danez/pirates/wiki/Projects-using-Pirates). If you add Pirates to your project, +(And you should! It works best if everyone uses it. Then we can have a happy world full of happy require hooks!), please +add yourself to the wiki. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/pirates/index.d.ts b/sdk/typescript/node_modules/sucrase/node_modules/pirates/index.d.ts new file mode 100644 index 0000000..b2d8ce6 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/pirates/index.d.ts @@ -0,0 +1,82 @@ +/* (c) 2015 Ari Porad (@ariporad) . License: ariporad.mit-license.org */ + +/** + * The hook. Accepts the code of the module and the filename. + */ +declare type Hook = (code: string, filename: string) => string; + +/** + * A matcher function, will be called with path to a file. + * + * Should return truthy if the file should be hooked, falsy otherwise. + */ +declare type Matcher = (path: string) => boolean; + +/** + * Reverts the hook when called. + */ +declare type RevertFunction = () => void; +interface Options { + /** + * The extensions to hook. Should start with '.' (ex. ['.js']). + * + * Takes precedence over `exts`, `extension` and `ext`. + * + * @alias exts + * @alias extension + * @alias ext + * @default ['.js'] + */ + extensions?: ReadonlyArray | string; + + /** + * The extensions to hook. Should start with '.' (ex. ['.js']). + * + * Takes precedence over `extension` and `ext`. + * + * @alias extension + * @alias ext + * @default ['.js'] + */ + exts?: ReadonlyArray | string; + + /** + * The extensions to hook. Should start with '.' (ex. ['.js']). + * + * Takes precedence over `ext`. + * + * @alias ext + * @default ['.js'] + */ + extension?: ReadonlyArray | string; + + /** + * The extensions to hook. Should start with '.' (ex. ['.js']). + * + * @default ['.js'] + */ + ext?: ReadonlyArray | string; + + /** + * A matcher function, will be called with path to a file. + * + * Should return truthy if the file should be hooked, falsy otherwise. + */ + matcher?: Matcher | null; + + /** + * Auto-ignore node_modules. Independent of any matcher. + * + * @default true + */ + ignoreNodeModules?: boolean; +} + +/** + * Add a require hook. + * + * @param hook The hook. Accepts the code of the module and the filename. Required. + * @returns The `revert` function. Reverts the hook when called. + */ +export declare function addHook(hook: Hook, opts?: Options): RevertFunction; +export {}; diff --git a/sdk/typescript/node_modules/sucrase/node_modules/pirates/package.json b/sdk/typescript/node_modules/sucrase/node_modules/pirates/package.json new file mode 100644 index 0000000..131277c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/pirates/package.json @@ -0,0 +1,43 @@ +{ + "name": "pirates", + "description": "Properly hijack require, i.e., properly define require hooks and customizations", + "main": "lib/index.js", + "types": "index.d.ts", + "scripts": { + "test": "ava" + }, + "files": [ + "lib", + "index.d.ts" + ], + "repository": { + "type": "git", + "url": "https://github.com/danez/pirates.git" + }, + "engines": { + "node": ">= 6" + }, + "author": { + "name": "Ari Porad", + "email": "ari@ariporad.com", + "url": "http://ariporad.com" + }, + "devDependencies": { + "ava": "1.4.1", + "decache": "4.6.2" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/danez/pirates/issues" + }, + "homepage": "https://github.com/danez/pirates#readme", + "ava": { + "files": [ + "test/*.js" + ], + "sources": [ + "lib/**/*.js" + ] + }, + "version": "4.0.7" +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/History.md b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/History.md new file mode 100644 index 0000000..16e378c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/History.md @@ -0,0 +1,11 @@ + +1.6.0 / 2015-01-11 +================== + + * feat: exports thenify + * support node 0.8+ + +1.5.0 / 2015-01-09 +================== + + * feat: support backward compatible with callback diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/LICENSE new file mode 100644 index 0000000..a7ae8ee --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/README.md b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/README.md new file mode 100644 index 0000000..8e7829e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/README.md @@ -0,0 +1,66 @@ + +# thenify-all + +[![NPM version][npm-image]][npm-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] +[![Dependency Status][david-image]][david-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] +[![Gittip][gittip-image]][gittip-url] + +Promisifies all the selected functions in an object. + +```js +var thenifyAll = require('thenify-all'); + +var fs = thenifyAll(require('fs'), {}, [ + 'readFile', + 'writeFile', +]); + +fs.readFile(__filename).then(function (buffer) { + console.log(buffer.toString()); +}); +``` + +## API + +### var obj = thenifyAll(source, [obj], [methods]) + +Promisifies all the selected functions in an object. + +- `source` - the source object for the async functions +- `obj` - the destination to set all the promisified methods +- `methods` - an array of method names of `source` + +### var obj = thenifyAll.withCallback(source, [obj], [methods]) + +Promisifies all the selected functions in an object and backward compatible with callback. + +- `source` - the source object for the async functions +- `obj` - the destination to set all the promisified methods +- `methods` - an array of method names of `source` + +### thenifyAll.thenify + +Exports [thenify](https://github.com/thenables/thenify) this package uses. + +[gitter-image]: https://badges.gitter.im/thenables/thenify-all.png +[gitter-url]: https://gitter.im/thenables/thenify-all +[npm-image]: https://img.shields.io/npm/v/thenify-all.svg?style=flat-square +[npm-url]: https://npmjs.org/package/thenify-all +[github-tag]: http://img.shields.io/github/tag/thenables/thenify-all.svg?style=flat-square +[github-url]: https://github.com/thenables/thenify-all/tags +[travis-image]: https://img.shields.io/travis/thenables/thenify-all.svg?style=flat-square +[travis-url]: https://travis-ci.org/thenables/thenify-all +[coveralls-image]: https://img.shields.io/coveralls/thenables/thenify-all.svg?style=flat-square +[coveralls-url]: https://coveralls.io/r/thenables/thenify-all +[david-image]: http://img.shields.io/david/thenables/thenify-all.svg?style=flat-square +[david-url]: https://david-dm.org/thenables/thenify-all +[license-image]: http://img.shields.io/npm/l/thenify-all.svg?style=flat-square +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/thenify-all.svg?style=flat-square +[downloads-url]: https://npmjs.org/package/thenify-all +[gittip-image]: https://img.shields.io/gratipay/jonathanong.svg?style=flat-square +[gittip-url]: https://gratipay.com/jonathanong/ diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/index.js b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/index.js new file mode 100644 index 0000000..e0cc69c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/index.js @@ -0,0 +1,73 @@ + +var thenify = require('thenify') + +module.exports = thenifyAll +thenifyAll.withCallback = withCallback +thenifyAll.thenify = thenify + +/** + * Promisifies all the selected functions in an object. + * + * @param {Object} source the source object for the async functions + * @param {Object} [destination] the destination to set all the promisified methods + * @param {Array} [methods] an array of method names of `source` + * @return {Object} + * @api public + */ + +function thenifyAll(source, destination, methods) { + return promisifyAll(source, destination, methods, thenify) +} + +/** + * Promisifies all the selected functions in an object and backward compatible with callback. + * + * @param {Object} source the source object for the async functions + * @param {Object} [destination] the destination to set all the promisified methods + * @param {Array} [methods] an array of method names of `source` + * @return {Object} + * @api public + */ + +function withCallback(source, destination, methods) { + return promisifyAll(source, destination, methods, thenify.withCallback) +} + +function promisifyAll(source, destination, methods, promisify) { + if (!destination) { + destination = {}; + methods = Object.keys(source) + } + + if (Array.isArray(destination)) { + methods = destination + destination = {} + } + + if (!methods) { + methods = Object.keys(source) + } + + if (typeof source === 'function') destination = promisify(source) + + methods.forEach(function (name) { + // promisify only if it's a function + if (typeof source[name] === 'function') destination[name] = promisify(source[name]) + }) + + // proxy the rest + Object.keys(source).forEach(function (name) { + if (deprecated(source, name)) return + if (destination[name]) return + destination[name] = source[name] + }) + + return destination +} + +function deprecated(source, name) { + var desc = Object.getOwnPropertyDescriptor(source, name) + if (!desc || !desc.get) return false + if (desc.get.name === 'deprecated') return true + return false +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/package.json b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/package.json new file mode 100644 index 0000000..768800f --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify-all/package.json @@ -0,0 +1,34 @@ +{ + "name": "thenify-all", + "description": "Promisifies all the selected functions in an object", + "version": "1.6.0", + "author": "Jonathan Ong (http://jongleberry.com)", + "license": "MIT", + "repository": "thenables/thenify-all", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "devDependencies": { + "bluebird": "2", + "istanbul": "0", + "mocha": "2" + }, + "scripts": { + "test": "mocha --reporter spec", + "test-cov": "istanbul cover node_modules/.bin/_mocha -- --reporter dot", + "test-travis": "istanbul cover node_modules/.bin/_mocha --report lcovonly -- --reporter dot" + }, + "keywords": [ + "promisify", + "promise", + "thenify", + "then", + "es6" + ], + "files": [ + "index.js" + ], + "engines": { + "node": ">=0.8" + } +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify/History.md b/sdk/typescript/node_modules/sucrase/node_modules/thenify/History.md new file mode 100644 index 0000000..9f016fb --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify/History.md @@ -0,0 +1,11 @@ + +3.3.1 / 2020-06-18 +================== + +**fixes** + * [[`0d94a24`](http://github.com/thenables/thenify/commit/0d94a24eb933bc835d568f3009f4d269c4c4c17a)] - fix: remove eval (#30) (Yiyu He <>) + +3.3.0 / 2017-05-19 +================== + + * feat: support options.multiArgs and options.withCallback (#27) diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/thenify/LICENSE new file mode 100644 index 0000000..bed701c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify/README.md b/sdk/typescript/node_modules/sucrase/node_modules/thenify/README.md new file mode 100644 index 0000000..3afce3e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify/README.md @@ -0,0 +1,120 @@ + +# thenify + +[![NPM version][npm-image]][npm-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] +[![Dependency Status][david-image]][david-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +Promisify a callback-based function using [`any-promise`](https://github.com/kevinbeaty/any-promise). + +- Preserves function names +- Uses a native promise implementation if available and tries to fall back to a promise implementation such as `bluebird` +- Converts multiple arguments from the callback into an `Array`, also support change the behavior by `options.multiArgs` +- Resulting function never deoptimizes +- Supports both callback and promise style + +An added benefit is that `throw`n errors in that async function will be caught by the promise! + +## API + +### fn = thenify(fn, options) + +Promisifies a function. + +### Options + +`options` are optional. + +- `options.withCallback` - support both callback and promise style, default to `false`. +- `options.multiArgs` - change the behavior when callback have multiple arguments. default to `true`. + - `true` - converts multiple arguments to an array + - `false`- always use the first argument + - `Array` - converts multiple arguments to an object with keys provided in `options.multiArgs` + +- Turn async functions into promises + +```js +var thenify = require('thenify'); + +var somethingAsync = thenify(function somethingAsync(a, b, c, callback) { + callback(null, a, b, c); +}); +``` + +- Backward compatible with callback + +```js +var thenify = require('thenify'); + +var somethingAsync = thenify(function somethingAsync(a, b, c, callback) { + callback(null, a, b, c); +}, { withCallback: true }); + +// somethingAsync(a, b, c).then(onFulfilled).catch(onRejected); +// somethingAsync(a, b, c, function () {}); +``` + +or use `thenify.withCallback()` + +```js +var thenify = require('thenify').withCallback; + +var somethingAsync = thenify(function somethingAsync(a, b, c, callback) { + callback(null, a, b, c); +}); + +// somethingAsync(a, b, c).then(onFulfilled).catch(onRejected); +// somethingAsync(a, b, c, function () {}); +``` + +- Always return the first argument in callback + +```js +var thenify = require('thenify'); + +var promise = thenify(function (callback) { + callback(null, 1, 2, 3); +}, { multiArgs: false }); + +// promise().then(function onFulfilled(value) { +// assert.equal(value, 1); +// }); +``` + +- Converts callback arguments to an object + +```js +var thenify = require('thenify'); + +var promise = thenify(function (callback) { + callback(null, 1, 2, 3); +}, { multiArgs: [ 'one', 'tow', 'three' ] }); + +// promise().then(function onFulfilled(value) { +// assert.deepEqual(value, { +// one: 1, +// tow: 2, +// three: 3 +// }); +// }); +``` + +[gitter-image]: https://badges.gitter.im/thenables/thenify.png +[gitter-url]: https://gitter.im/thenables/thenify +[npm-image]: https://img.shields.io/npm/v/thenify.svg?style=flat-square +[npm-url]: https://npmjs.org/package/thenify +[github-tag]: http://img.shields.io/github/tag/thenables/thenify.svg?style=flat-square +[github-url]: https://github.com/thenables/thenify/tags +[travis-image]: https://img.shields.io/travis/thenables/thenify.svg?style=flat-square +[travis-url]: https://travis-ci.org/thenables/thenify +[coveralls-image]: https://img.shields.io/coveralls/thenables/thenify.svg?style=flat-square +[coveralls-url]: https://coveralls.io/r/thenables/thenify +[david-image]: http://img.shields.io/david/thenables/thenify.svg?style=flat-square +[david-url]: https://david-dm.org/thenables/thenify +[license-image]: http://img.shields.io/npm/l/thenify.svg?style=flat-square +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/thenify.svg?style=flat-square +[downloads-url]: https://npmjs.org/package/thenify diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify/index.js b/sdk/typescript/node_modules/sucrase/node_modules/thenify/index.js new file mode 100644 index 0000000..d633174 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify/index.js @@ -0,0 +1,77 @@ + +var Promise = require('any-promise') +var assert = require('assert') + +module.exports = thenify + +/** + * Turn async functions into promises + * + * @param {Function} fn + * @return {Function} + * @api public + */ + +function thenify(fn, options) { + assert(typeof fn === 'function') + return createWrapper(fn, options) +} + +/** + * Turn async functions into promises and backward compatible with callback + * + * @param {Function} fn + * @return {Function} + * @api public + */ + +thenify.withCallback = function (fn, options) { + assert(typeof fn === 'function') + options = options || {} + options.withCallback = true + return createWrapper(fn, options) +} + +function createCallback(resolve, reject, multiArgs) { + // default to true + if (multiArgs === undefined) multiArgs = true + return function(err, value) { + if (err) return reject(err) + var length = arguments.length + + if (length <= 2 || !multiArgs) return resolve(value) + + if (Array.isArray(multiArgs)) { + var values = {} + for (var i = 1; i < length; i++) values[multiArgs[i - 1]] = arguments[i] + return resolve(values) + } + + var values = new Array(length - 1) + for (var i = 1; i < length; ++i) values[i - 1] = arguments[i] + resolve(values) + } +} + +function createWrapper(fn, options) { + options = options || {} + var name = fn.name; + name = (name || '').replace(/\s|bound(?!$)/g, '') + var newFn = function () { + var self = this + var len = arguments.length + if (options.withCallback) { + var lastType = typeof arguments[len - 1] + if (lastType === 'function') return fn.apply(self, arguments) + } + var args = new Array(len + 1) + for (var i = 0; i < len; ++i) args[i] = arguments[i] + var lastIndex = i + return new Promise(function (resolve, reject) { + args[lastIndex] = createCallback(resolve, reject, options.multiArgs) + fn.apply(self, args) + }) + } + Object.defineProperty(newFn, 'name', { value: name }) + return newFn +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/thenify/package.json b/sdk/typescript/node_modules/sucrase/node_modules/thenify/package.json new file mode 100644 index 0000000..addf77e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/thenify/package.json @@ -0,0 +1,31 @@ +{ + "name": "thenify", + "description": "Promisify a callback-based function", + "version": "3.3.1", + "author": "Jonathan Ong (http://jongleberry.com)", + "license": "MIT", + "repository": "thenables/thenify", + "dependencies": { + "any-promise": "^1.0.0" + }, + "devDependencies": { + "bluebird": "^3.1.1", + "istanbul": "^0.4.0", + "mocha": "^3.0.2" + }, + "scripts": { + "test": "mocha --reporter spec", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" + }, + "keywords": [ + "promisify", + "promise", + "thenify", + "then", + "es6" + ], + "files": [ + "index.js" + ] +} diff --git a/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/LICENSE b/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/README.md b/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/README.md new file mode 100644 index 0000000..975ef6c --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/README.md @@ -0,0 +1,185 @@ +# ts-interface-checker + +[![Build Status](https://travis-ci.org/gristlabs/ts-interface-checker.svg?branch=master)](https://travis-ci.org/gristlabs/ts-interface-checker) +[![npm version](https://badge.fury.io/js/ts-interface-checker.svg)](https://badge.fury.io/js/ts-interface-checker) + + +> Runtime library to validate data against TypeScript interfaces. + +This package is the runtime support for validators created by +[ts-interface-builder](https://github.com/gristlabs/ts-interface-builder). +It allows validating data, such as parsed JSON objects received +over the network, or parsed JSON or YAML files, to check if they satisfy a +TypeScript interface, and to produce informative error messages if they do not. + +## Installation + +```bash +npm install --save-dev ts-interface-builder +npm install --save ts-interface-checker +``` + +## Usage + +Suppose you have a TypeScript file defining an interface: +```typescript +// foo.ts +interface Square { + size: number; + color?: string; +} +``` + +The first step is to generate some code for runtime checks: +```bash +`npm bin`/ts-interface-builder foo.ts +``` + +It produces a file like this: +```typescript +// foo-ti.js +import * as t from "ts-interface-checker"; + +export const Square = t.iface([], { + "size": "number", + "color": t.opt("string"), +}); +... +``` + +Now at runtime, to check if a value satisfies the Square interface: +```typescript +import fooTI from "./foo-ti"; +import {createCheckers} from "ts-interface-checker"; + +const {Square} = createCheckers(fooTI); + +Square.check({size: 1}); // OK +Square.check({size: 1, color: "green"}); // OK +Square.check({color: "green"}); // Fails with "value.size is missing" +Square.check({size: 4, color: 5}); // Fails with "value.color is not a string" +``` + +Note that `ts-interface-builder` is only needed for the build-time step, and +`ts-interface-checker` is needed at runtime. That's why the recommendation is to npm-install the +former using `--save-dev` flag and the latter using `--save`. + +## Checking method calls + +If you have an interface with methods, you can validate method call arguments and return values: +```typescript +// greet.ts +interface Greeter { + greet(name: string): string; +} +``` + +After generating the runtime code, you can now check calls like: +```typescript +import greetTI from "./greet-ti"; +import {createCheckers} from "ts-interface-checker"; + +const {Greeter} = createCheckers(greetTI); + +Greeter.methodArgs("greet").check(["Bob"]); // OK +Greeter.methodArgs("greet").check([17]); // Fails with "value.name is not a string" +Greeter.methodArgs("greet").check([]); // Fails with "value.name is missing" + +Greeter.methodResult("greet").check("hello"); // OK +Greeter.methodResult("greet").check(null); // Fails with "value is not a string" +``` + +## Type suites + +If one type refers to a type defined in another file, you need to tell the interface checker about +all type names when you call `createCheckers()`. E.g. given + +```typescript +// color.ts +export type Color = RGB | string; +export type RGB = [number, number, number]; +``` + +```typescript +// shape.ts +import {Color} from "./color"; +export interface Square { + size: number; + color?: Color; +} +``` + +the produced files `color-ti.ts` and `shape-ti.ts` do not automatically refer to each other, but +expect you to relate them in `createCheckers()` call: +```typescript +import color from "./color-ti"; +import shape from "./shape-ti"; +import {createCheckers} from "ts-interface-checker"; + +const {Square} = createCheckers(shape, color); // Pass in all required type suites. + +Square.check({size: 1, color: [255,255,255]}); +``` + +## Strict checking + +You may check that data contains no extra properties. Note that it is not generally recommended as +it this prevents backward compatibility: if you add new properties to an interface, then older +code with strict checks will not accept them. + +Following on the example above: +```typescript +Square.strictCheck({size: 1, color: [255,255,255], bg: "blue"}); // Fails with value.bg is extraneous +Square.strictCheck({size: 1, color: [255,255,255,0.5]}); // Fails with ...value.color[3] is extraneous +``` + +## Type guards + +Standard `Checker` objects do the type checking logic, but are unable to make the TypeScript +compiler aware that an object of `unknown` type implements a certain interface. + +Basic code: +```typescript +const unk: unknown = {size: 1, color: "green"}; +// Type is unknown, so TypeScript will not let you access the members. +console.log(unk.size); // Error: "Object is of type 'unknown'" +``` + +With a `Checker` available: +```typescript +import fooTI from "./foo-ti"; +import {createCheckers} from "ts-interface-checker"; + +const {Square} = createCheckers(fooTI); + +const unk: unknown = {size: 1, color: "green"}; + +if (Square.test(unk)) { + // unk does implement Square, but TypeScript is not aware of it. + console.log(unk.size); // Error: "Object is of type 'unknown'" +} +``` + +To enable type guard functionality on the existing `test`, and `strictTest` functions, `Checker` +objects should be cast to `CheckerT<>` using the appropriate type. + +Using `CheckerT<>`: +```typescript +import {Square} from "./foo"; +import fooTI from "./foo-ti"; +import {createCheckers, CheckerT} from "ts-interface-checker"; + +const {Square} = createCheckers(fooTI) as {Square: CheckerT}; + +const unk: unknown = {size: 1, color: "green"}; + +if (Square.test(unk)) { + // TypeScript is now aware that unk implements Square, and allows member access. + console.log(unk.size); +} +``` + +## Type assertions + +`CheckerT<>` will eventually support type assertions using the `check` and `strictCheck` functions, +however, this feature is not yet fully working in TypeScript. diff --git a/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/package.json b/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/package.json new file mode 100644 index 0000000..022e321 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/node_modules/ts-interface-checker/package.json @@ -0,0 +1,60 @@ +{ + "name": "ts-interface-checker", + "version": "0.1.13", + "description": "Runtime library to validate data against TypeScript interfaces", + "main": "dist/index", + "typings": "dist/index", + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "tsc && nyc mocha -R list test/", + "bench": "tsc && node test/bench/bench.js", + "preversion": "npm test", + "version": "npm run build" + }, + "keywords": [ + "typescript", + "ts", + "interface", + "type", + "validate", + "validator", + "check" + ], + "files": [ + "dist" + ], + "author": "Dmitry S, Grist Labs", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/gristlabs/ts-interface-checker" + }, + "bugs": { + "url": "https://github.com/gristlabs/ts-interface-checker/issues" + }, + "nyc": { + "extension": [ + ".ts" + ], + "exclude": [ + "**/*.d.ts" + ] + }, + "dependencies": {}, + "devDependencies": { + "@types/benchmark": "^1.0.31", + "@types/chai": "~4.0.8", + "@types/mocha": "^8.0.1", + "@types/node": "^8.0.57", + "benchmark": "^2.1.4", + "chai": "^4.1.2", + "coveralls": "^3.0.0", + "mocha": "^7.1.2", + "nyc": "^15.0.1", + "protobufjs": "^6.8.3", + "source-map-support": "^0.5.0", + "ts-node": "^8.10.2", + "typescript": "^3.9.7" + } +} diff --git a/sdk/typescript/node_modules/sucrase/package.json b/sdk/typescript/node_modules/sucrase/package.json new file mode 100644 index 0000000..7bccf70 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/package.json @@ -0,0 +1,88 @@ +{ + "name": "sucrase", + "version": "3.35.1", + "description": "Super-fast alternative to Babel for when you can target modern JS runtimes", + "author": "Alan Pierce ", + "license": "MIT", + "main": "dist/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "bin": { + "sucrase": "./bin/sucrase", + "sucrase-node": "./bin/sucrase-node" + }, + "scripts": { + "build": "sucrase-node script/build.ts", + "fast-build": "sucrase-node script/build.ts --fast", + "clean": "rm -rf ./build ./dist ./dist-self-build ./dist-types ./example-runner/example-repos ./spec-compliance-tests/test262/test262-checkout ./spec-compliance-tests/babel-tests/babel-tests-checkout", + "generate": "sucrase-node generator/generate.ts", + "benchmark": "cd benchmark && yarn && sucrase-node ./benchmark.ts", + "benchmark-compare": "sucrase-node ./benchmark/compare-performance.ts", + "microbenchmark": "sucrase-node benchmark/microbenchmark.ts", + "lint": "sucrase-node script/lint.ts", + "lint-fix": "sucrase-node script/lint.ts --fix", + "profile": "node --inspect-brk ./node_modules/.bin/sucrase-node ./benchmark/profile", + "profile-project": "node --inspect-brk ./node_modules/.bin/sucrase-node ./benchmark/benchmark-project.ts --profile", + "prepublishOnly": "yarn clean && yarn build", + "release": "sucrase-node script/release.ts", + "run-examples": "sucrase-node example-runner/example-runner.ts", + "test": "yarn lint && yarn test-only", + "test-only": "mocha './test/**/*.ts'", + "integration-test": "cd integration-test && yarn && yarn link @sucrase/jest-plugin && mocha --timeout 10000 ./integration-tests.ts", + "test262": "sucrase-node spec-compliance-tests/test262/run-test262.ts", + "check-babel-tests": "sucrase-node spec-compliance-tests/babel-tests/check-babel-tests.ts", + "test-with-coverage": "nyc mocha './test/**/*.ts'", + "report-coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov" + }, + "repository": { + "type": "git", + "url": "https://github.com/alangpierce/sucrase.git" + }, + "keywords": [ + "babel", + "jsx", + "typescript", + "flow" + ], + "bugs": { + "url": "https://github.com/alangpierce/sucrase/issues" + }, + "devDependencies": { + "@babel/core": "^7.22.5", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/mocha": "^9.1.1", + "@types/mz": "^2.7.4", + "@types/node": "^20.3.2", + "@typescript-eslint/eslint-plugin": "^5.60.1", + "@typescript-eslint/parser": "^5.60.1", + "chalk": "^4", + "codecov": "^3.8.3", + "eslint": "^8.43.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "~2.26", + "eslint-plugin-prettier": "^4.2.1", + "mocha": "^10.2.0", + "nyc": "^15.1.0", + "prettier": "^2.8.8", + "sucrase": "^3.35.0", + "test262-harness": "^10.0.0", + "ts-interface-builder": "^0.3.3", + "typescript": "~5.0" + }, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "resolutions": { + "**/eshost/socket.io": "4.7.0" + } +} diff --git a/sdk/typescript/node_modules/sucrase/register/index.js b/sdk/typescript/node_modules/sucrase/register/index.js new file mode 100644 index 0000000..f6eb814 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/register/index.js @@ -0,0 +1 @@ +require("../dist/register").registerAll(); diff --git a/sdk/typescript/node_modules/sucrase/register/js.js b/sdk/typescript/node_modules/sucrase/register/js.js new file mode 100644 index 0000000..4891896 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/register/js.js @@ -0,0 +1 @@ +require("../dist/register").registerJS(); diff --git a/sdk/typescript/node_modules/sucrase/register/jsx.js b/sdk/typescript/node_modules/sucrase/register/jsx.js new file mode 100644 index 0000000..4bd476e --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/register/jsx.js @@ -0,0 +1 @@ +require("../dist/register").registerJSX(); diff --git a/sdk/typescript/node_modules/sucrase/register/ts-legacy-module-interop.js b/sdk/typescript/node_modules/sucrase/register/ts-legacy-module-interop.js new file mode 100644 index 0000000..1ec5a6d --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/register/ts-legacy-module-interop.js @@ -0,0 +1 @@ +require("../dist/register").registerTSLegacyModuleInterop(); diff --git a/sdk/typescript/node_modules/sucrase/register/ts.js b/sdk/typescript/node_modules/sucrase/register/ts.js new file mode 100644 index 0000000..23b8c88 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/register/ts.js @@ -0,0 +1 @@ +require("../dist/register").registerTS(); diff --git a/sdk/typescript/node_modules/sucrase/register/tsx-legacy-module-interop.js b/sdk/typescript/node_modules/sucrase/register/tsx-legacy-module-interop.js new file mode 100644 index 0000000..a883680 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/register/tsx-legacy-module-interop.js @@ -0,0 +1 @@ +require("../dist/register").registerTSXLegacyModuleInterop(); diff --git a/sdk/typescript/node_modules/sucrase/register/tsx.js b/sdk/typescript/node_modules/sucrase/register/tsx.js new file mode 100644 index 0000000..deb8b34 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/register/tsx.js @@ -0,0 +1 @@ +require("../dist/register").registerTSX(); diff --git a/sdk/typescript/node_modules/sucrase/ts-node-plugin/index.js b/sdk/typescript/node_modules/sucrase/ts-node-plugin/index.js new file mode 100644 index 0000000..b523fb3 --- /dev/null +++ b/sdk/typescript/node_modules/sucrase/ts-node-plugin/index.js @@ -0,0 +1,83 @@ +const {transform} = require("../dist"); + +// Enum constants taken from the TypeScript codebase. +const ModuleKindCommonJS = 1; + +const JsxEmitReactJSX = 4; +const JsxEmitReactJSXDev = 5; + +/** + * ts-node transpiler plugin + * + * This plugin hooks into ts-node so that Sucrase can handle all TS-to-JS + * conversion while ts-node handles the ESM loader, require hook, REPL + * integration, etc. ts-node automatically discovers the relevant tsconfig file, + * so the main logic in this integration is translating tsconfig options to the + * corresponding Sucrase options. + * + * Any tsconfig options relevant to Sucrase are translated, but some config + * options outside the scope of Sucrase are ignored. For example, we assume the + * isolatedModules option, and we ignore target because Sucrase doesn't provide + * JS syntax downleveling (at least not in a way that is useful for Node). + * + * One notable caveat is that importsNotUsedAsValues and preserveValueImports + * are ignored right now, since they are deprecated and don't have exact Sucrase + * equivalents. To preserve imports and exports, use verbatimModuleSyntax. + */ +function create(createOptions) { + const {nodeModuleEmitKind} = createOptions; + const { + module, + jsx, + jsxFactory, + jsxFragmentFactory, + jsxImportSource, + esModuleInterop, + verbatimModuleSyntax, + } = createOptions.service.config.options; + + return { + transpile(input, transpileOptions) { + const {fileName} = transpileOptions; + const transforms = []; + // Detect JS rather than TS so we bias toward including the typescript + // transform, since almost always it doesn't hurt to include. + const isJS = + fileName.endsWith(".js") || + fileName.endsWith(".jsx") || + fileName.endsWith(".mjs") || + fileName.endsWith(".cjs"); + if (!isJS) { + transforms.push("typescript"); + } + if (module === ModuleKindCommonJS || nodeModuleEmitKind === "nodecjs") { + transforms.push("imports"); + } + if (fileName.endsWith(".tsx") || fileName.endsWith(".jsx")) { + transforms.push("jsx"); + } + + const {code, sourceMap} = transform(input, { + transforms, + disableESTransforms: true, + jsxRuntime: jsx === JsxEmitReactJSX || jsx === JsxEmitReactJSXDev ? "automatic" : "classic", + production: jsx === JsxEmitReactJSX, + jsxImportSource, + jsxPragma: jsxFactory, + jsxFragmentPragma: jsxFragmentFactory, + keepUnusedImports: verbatimModuleSyntax, + preserveDynamicImport: nodeModuleEmitKind === "nodecjs", + injectCreateRequireForImportRequire: nodeModuleEmitKind === "nodeesm", + enableLegacyTypeScriptModuleInterop: !esModuleInterop, + sourceMapOptions: {compiledFilename: fileName}, + filePath: fileName, + }); + return { + outputText: code, + sourceMapText: JSON.stringify(sourceMap), + }; + }, + }; +} + +exports.create = create; diff --git a/sdk/typescript/node_modules/tinybench/LICENSE b/sdk/typescript/node_modules/tinybench/LICENSE new file mode 100644 index 0000000..64143b8 --- /dev/null +++ b/sdk/typescript/node_modules/tinybench/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Tinylibs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/tinybench/README.md b/sdk/typescript/node_modules/tinybench/README.md new file mode 100644 index 0000000..0d0c662 --- /dev/null +++ b/sdk/typescript/node_modules/tinybench/README.md @@ -0,0 +1,422 @@ +_I'm transitioning to a full-time open source career. Your support would be greatly appreciated 🙌_ +Subscription Tiers on Polar + +# Tinybench 🔎 + +[![CI](https://github.com/tinylibs/tinybench/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/tinylibs/tinybench/actions/workflows/test.yml) +[![NPM version](https://img.shields.io/npm/v/tinybench.svg?style=flat)](https://www.npmjs.com/package/tinybench) + +Benchmark your code easily with Tinybench, a simple, tiny and light-weight `7KB` (`2KB` minified and gzipped) +benchmarking library! +You can run your benchmarks in multiple JavaScript runtimes, Tinybench is +completely based on the Web APIs with proper timing using `process.hrtime` or +`performance.now`. + +- Accurate and precise timing based on the environment +- `Event` and `EventTarget` compatible events +- Statistically analyzed values +- Calculated Percentiles +- Fully detailed results +- No dependencies + +_In case you need more tiny libraries like tinypool or tinyspy, please consider submitting an [RFC](https://github.com/tinylibs/rfcs)_ + +## Installing + +```bash +$ npm install -D tinybench +``` + +## Usage + +You can start benchmarking by instantiating the `Bench` class and adding +benchmark tasks to it. + +```js +import { Bench } from 'tinybench'; + +const bench = new Bench({ time: 100 }); + +bench + .add('faster task', () => { + console.log('I am faster') + }) + .add('slower task', async () => { + await new Promise(r => setTimeout(r, 1)) // we wait 1ms :) + console.log('I am slower') + }) + .todo('unimplemented bench') + +await bench.warmup(); // make results more reliable, ref: https://github.com/tinylibs/tinybench/pull/50 +await bench.run(); + +console.table(bench.table()); + +// Output: +// ┌─────────┬───────────────┬──────────┬────────────────────┬───────────┬─────────┐ +// │ (index) │ Task Name │ ops/sec │ Average Time (ns) │ Margin │ Samples │ +// ├─────────┼───────────────┼──────────┼────────────────────┼───────────┼─────────┤ +// │ 0 │ 'faster task' │ '41,621' │ 24025.791819761525 │ '±20.50%' │ 4257 │ +// │ 1 │ 'slower task' │ '828' │ 1207382.7838323202 │ '±7.07%' │ 83 │ +// └─────────┴───────────────┴──────────┴────────────────────┴───────────┴─────────┘ + +console.table( + bench.table((task) => ({'Task name': task.name})) +); + +// Output: +// ┌─────────┬───────────────────────┐ +// │ (index) │ Task name │ +// ├─────────┼───────────────────────┤ +// │ 0 │ 'unimplemented bench' │ +// └─────────┴───────────────────────┘ +``` + +The `add` method accepts a task name and a task function, so it can benchmark +it! This method returns a reference to the Bench instance, so it's possible to +use it to create an another task for that instance. + +Note that the task name should always be unique in an instance, because Tinybench stores the tasks based +on their names in a `Map`. + +Also note that `tinybench` does not log any result by default. You can extract the relevant stats +from `bench.tasks` or any other API after running the benchmark, and process them however you want. + +## Docs + +### `Bench` + +The Benchmark instance for keeping track of the benchmark tasks and controlling +them. + +Options: + +```ts +export type Options = { + /** + * time needed for running a benchmark task (milliseconds) @default 500 + */ + time?: number; + + /** + * number of times that a task should run if even the time option is finished @default 10 + */ + iterations?: number; + + /** + * function to get the current timestamp in milliseconds + */ + now?: () => number; + + /** + * An AbortSignal for aborting the benchmark + */ + signal?: AbortSignal; + + /** + * Throw if a task fails (events will not work if true) + */ + throws?: boolean; + + /** + * warmup time (milliseconds) @default 100ms + */ + warmupTime?: number; + + /** + * warmup iterations @default 5 + */ + warmupIterations?: number; + + /** + * setup function to run before each benchmark task (cycle) + */ + setup?: Hook; + + /** + * teardown function to run after each benchmark task (cycle) + */ + teardown?: Hook; +}; + +export type Hook = (task: Task, mode: "warmup" | "run") => void | Promise; +``` + +- `async run()`: run the added tasks that were registered using the `add` method +- `async runConcurrently(threshold: number = Infinity, mode: "bench" | "task" = "bench")`: similar to the `run` method but runs concurrently rather than sequentially. See the [Concurrency](#Concurrency) section. +- `async warmup()`: warm up the benchmark tasks +- `async warmupConcurrently(threshold: number = Infinity, mode: "bench" | "task" = "bench")`: warm up the benchmark tasks concurrently +- `reset()`: reset each task and remove its result +- `add(name: string, fn: Fn, opts?: FnOpts)`: add a benchmark task to the task map + - `Fn`: `() => any | Promise` + - `FnOpts`: `{}`: a set of optional functions run during the benchmark lifecycle that can be used to set up or tear down test data or fixtures without affecting the timing of each task + - `beforeAll?: () => any | Promise`: invoked once before iterations of `fn` begin + - `beforeEach?: () => any | Promise`: invoked before each time `fn` is executed + - `afterEach?: () => any | Promise`: invoked after each time `fn` is executed + - `afterAll?: () => any | Promise`: invoked once after all iterations of `fn` have finished +- `remove(name: string)`: remove a benchmark task from the task map +- `table()`: table of the tasks results +- `get results(): (TaskResult | undefined)[]`: (getter) tasks results as an array +- `get tasks(): Task[]`: (getter) tasks as an array +- `getTask(name: string): Task | undefined`: get a task based on the name +- `todo(name: string, fn?: Fn, opts: FnOptions)`: add a benchmark todo to the todo map +- `get todos(): Task[]`: (getter) tasks todos as an array + +### `Task` + +A class that represents each benchmark task in Tinybench. It keeps track of the +results, name, Bench instance, the task function and the number of times the task +function has been executed. + +- `constructor(bench: Bench, name: string, fn: Fn, opts: FnOptions = {})` +- `bench: Bench` +- `name: string`: task name +- `fn: Fn`: the task function +- `opts: FnOptions`: Task options +- `runs: number`: the number of times the task function has been executed +- `result?: TaskResult`: the result object +- `async run()`: run the current task and write the results in `Task.result` object +- `async warmup()`: warm up the current task +- `setResult(result: Partial)`: change the result object values +- `reset()`: reset the task to make the `Task.runs` a zero-value and remove the `Task.result` object + +```ts +export interface FnOptions { + /** + * An optional function that is run before iterations of this task begin + */ + beforeAll?: (this: Task) => void | Promise; + + /** + * An optional function that is run before each iteration of this task + */ + beforeEach?: (this: Task) => void | Promise; + + /** + * An optional function that is run after each iteration of this task + */ + afterEach?: (this: Task) => void | Promise; + + /** + * An optional function that is run after all iterations of this task end + */ + afterAll?: (this: Task) => void | Promise; +} +``` + +## `TaskResult` + +the benchmark task result object. + +```ts +export type TaskResult = { + + /* + * the last error that was thrown while running the task + */ + error?: unknown; + + /** + * The amount of time in milliseconds to run the benchmark task (cycle). + */ + totalTime: number; + + /** + * the minimum value in the samples + */ + min: number; + /** + * the maximum value in the samples + */ + max: number; + + /** + * the number of operations per second + */ + hz: number; + + /** + * how long each operation takes (ms) + */ + period: number; + + /** + * task samples of each task iteration time (ms) + */ + samples: number[]; + + /** + * samples mean/average (estimate of the population mean) + */ + mean: number; + + /** + * samples variance (estimate of the population variance) + */ + variance: number; + + /** + * samples standard deviation (estimate of the population standard deviation) + */ + sd: number; + + /** + * standard error of the mean (a.k.a. the standard deviation of the sampling distribution of the sample mean) + */ + sem: number; + + /** + * degrees of freedom + */ + df: number; + + /** + * critical value of the samples + */ + critical: number; + + /** + * margin of error + */ + moe: number; + + /** + * relative margin of error + */ + rme: number; + + /** + * p75 percentile + */ + p75: number; + + /** + * p99 percentile + */ + p99: number; + + /** + * p995 percentile + */ + p995: number; + + /** + * p999 percentile + */ + p999: number; +}; +``` + +### `Events` + +Both the `Task` and `Bench` objects extend the `EventTarget` object, so you can attach listeners to different types of events +in each class instance using the universal `addEventListener` and +`removeEventListener`. + +```ts +/** + * Bench events + */ +export type BenchEvents = + | "abort" // when a signal aborts + | "complete" // when running a benchmark finishes + | "error" // when the benchmark task throws + | "reset" // when the reset function gets called + | "start" // when running the benchmarks gets started + | "warmup" // when the benchmarks start getting warmed up (before start) + | "cycle" // when running each benchmark task gets done (cycle) + | "add" // when a Task gets added to the Bench + | "remove" // when a Task gets removed of the Bench + | "todo"; // when a todo Task gets added to the Bench + +/** + * task events + */ +export type TaskEvents = + | "abort" + | "complete" + | "error" + | "reset" + | "start" + | "warmup" + | "cycle"; +``` + +For instance: + +```js +// runs on each benchmark task's cycle +bench.addEventListener("cycle", (e) => { + const task = e.task!; +}); + +// runs only on this benchmark task's cycle +task.addEventListener("cycle", (e) => { + const task = e.task!; +}); +``` + +### `BenchEvent` + +```ts +export type BenchEvent = Event & { + task: Task | null; +}; +``` + +### `process.hrtime` +if you want more accurate results for nodejs with `process.hrtime`, then import + the `hrtimeNow` function from the library and pass it to the `Bench` options. + +```ts +import { hrtimeNow } from 'tinybench'; +``` +It may make your benchmarks slower, check #42. + +## Concurrency + +- When `mode` is set to `null` (default), concurrency is disabled. +- When `mode` is set to 'task', each task's iterations (calls of a task function) run concurrently. +- When `mode` is set to 'bench', different tasks within the bench run concurrently. Concurrent cycles. + +```ts +// options way (recommended) +bench.threshold = 10 // The maximum number of concurrent tasks to run. Defaults to Infinity. +bench.concurrency = "task" // The concurrency mode to determine how tasks are run. +// await bench.warmup() +await bench.run() + +// standalone method way +// await bench.warmupConcurrently(10, "task") +await bench.runConcurrently(10, "task") // with runConcurrently, mode is set to 'bench' by default +``` + +## Prior art + +- [Benchmark.js](https://github.com/bestiejs/benchmark.js) +- [Mitata](https://github.com/evanwashere/mitata/) +- [Bema](https://github.com/prisma-labs/bema) + +## Authors + +|
Mohammad Bagher
| +| ------------------------------------------------------------------------------------------------------------------------------------------------ | + +## Credits + +|
Uzlopak
|
poyoho
| +| ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | + +## Contributing + +Feel free to create issues/discussions and then PRs for the project! + +## Sponsors + +Your sponsorship can make a huge difference in continuing our work in open source! + +

+ + + +

diff --git a/sdk/typescript/node_modules/tinybench/package.json b/sdk/typescript/node_modules/tinybench/package.json new file mode 100644 index 0000000..6b73a81 --- /dev/null +++ b/sdk/typescript/node_modules/tinybench/package.json @@ -0,0 +1,27 @@ +{ + "name": "tinybench", + "version": "2.9.0", + "type": "module", + "packageManager": "pnpm@8.4.0", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "exports": { + "require": "./dist/index.cjs", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "files": [ + "dist/**" + ], + "repository": "tinylibs/tinybench", + "license": "MIT", + "keywords": [ + "benchmark", + "tinylibs", + "tiny" + ], + "scripts": { + "publish": "npm run build && clean-publish" + } +} diff --git a/sdk/typescript/node_modules/tinyexec/LICENSE b/sdk/typescript/node_modules/tinyexec/LICENSE new file mode 100644 index 0000000..558eb6a --- /dev/null +++ b/sdk/typescript/node_modules/tinyexec/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Tinylibs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/tinyexec/README.md b/sdk/typescript/node_modules/tinyexec/README.md new file mode 100644 index 0000000..0933ab6 --- /dev/null +++ b/sdk/typescript/node_modules/tinyexec/README.md @@ -0,0 +1,256 @@ +# tinyexec 📟 + +> A minimal package for executing commands + +This package was created to provide a minimal way of interacting with child +processes without having to manually deal with streams, piping, etc. + +## Installing + +```sh +$ npm i -S tinyexec +``` + +## Usage + +A process can be spawned and awaited like so: + +```ts +import {x} from 'tinyexec'; + +const result = await x('ls', ['-l']); + +// result.stdout - the stdout as a string +// result.stderr - the stderr as a string +// result.exitCode - the process exit code as a number +``` + +You may also iterate over the lines of output via an async loop: + +```ts +import {x} from 'tinyexec'; + +const proc = x('ls', ['-l']); + +for await (const line of proc) { + // line will be from stderr/stdout in the order you'd see it in a term +} +``` + +### Options + +Options can be passed to have finer control over spawning of the process: + +```ts +await x('ls', [], { + timeout: 1000 +}); +``` + +The options object can have the following properties: + +- `signal` - an `AbortSignal` to allow aborting of the execution +- `timeout` - time in milliseconds at which the process will be forceably killed +- `persist` - if `true`, the process will continue after the host exits +- `stdin` - another `Result` can be used as the input to this process +- `nodeOptions` - any valid options to node's underlying `spawn` function +- `throwOnError` - if true, non-zero exit codes will throw an error + +### Piping to another process + +You can pipe a process to another via the `pipe` method: + +```ts +const proc1 = x('ls', ['-l']); +const proc2 = proc1.pipe('grep', ['.js']); +const result = await proc2; + +console.log(result.stdout); +``` + +`pipe` takes the same options as a regular execution. For example, you can +pass a timeout to the pipe call: + +```ts +proc1.pipe('grep', ['.js'], { + timeout: 2000 +}); +``` + +### Killing a process + +You can kill the process via the `kill` method: + +```ts +const proc = x('ls'); + +proc.kill(); + +// or with a signal +proc.kill('SIGHUP'); +``` + +### Node modules/binaries + +By default, node's available binaries from `node_modules` will be accessible +in your command. + +For example, in a repo which has `eslint` installed: + +```ts +await x('eslint', ['.']); +``` + +In this example, `eslint` will come from the locally installed `node_modules`. + +### Using an abort signal + +An abort signal can be passed to a process in order to abort it at a later +time. This will result in the process being killed and `aborted` being set +to `true`. + +```ts +const aborter = new AbortController(); +const proc = x('node', ['./foo.mjs'], { + signal: aborter.signal +}); + +// elsewhere... +aborter.abort(); + +await proc; + +proc.aborted; // true +proc.killed; // true +``` + +### Using with command strings + +If you need to continue supporting commands as strings (e.g. "command arg0 arg1"), +you can use [args-tokenizer](https://github.com/TrySound/args-tokenizer), +a lightweight library for parsing shell command strings into an array. + +```ts +import {x} from 'tinyexec'; +import {tokenizeArgs} from 'args-tokenizer'; + +const commandString = 'echo "Hello, World!"'; +const [command, ...args] = tokenizeArgs(commandString); +const result = await x(command, args); + +result.stdout; // Hello, World! +``` + +## API + +Calling `x(command[, args])` returns an awaitable `Result` which has the +following API methods and properties available: + +### `pipe(command[, args[, options]])` + +Pipes the current command to another. For example: + +```ts +x('ls', ['-l']) + .pipe('grep', ['js']); +``` + +The parameters are as follows: + +- `command` - the command to execute (_without any arguments_) +- `args` - an array of arguments +- `options` - options object + +### `process` + +The underlying node `ChildProcess`. For example: + +```ts +const proc = x('ls'); + +proc.process; // ChildProcess; +``` + +### `kill([signal])` + +Kills the current process with the specified signal. By default, this will +use the `SIGTERM` signal. + +For example: + +```ts +const proc = x('ls'); + +proc.kill(); +``` + +### `pid` + +The current process ID. For example: + +```ts +const proc = x('ls'); + +proc.pid; // number +``` + +### `aborted` + +Whether the process has been aborted or not (via the `signal` originally +passed in the options object). + +For example: + +```ts +const proc = x('ls'); + +proc.aborted; // bool +``` + +### `killed` + +Whether the process has been killed or not (e.g. via `kill()` or an abort +signal). + +For example: + +```ts +const proc = x('ls'); + +proc.killed; // bool +``` + +### `exitCode` + +The exit code received when the process completed execution. + +For example: + +```ts +const proc = x('ls'); + +proc.exitCode; // number (e.g. 1) +``` + +## Comparison with other libraries + +`tinyexec` aims to provide a lightweight layer on top of Node's own +`child_process` API. + +Some clear benefits compared to other libraries are that `tinyexec` will be much lighter, have a much +smaller footprint and will have a less abstract interface (less "magic"). It +will also have equal security and cross-platform support to popular +alternatives. + +There are various features other libraries include which we are unlikely +to ever implement, as they would prevent us from providing a lightweight layer. + +For example, if you'd like write scripts rather than individual commands, and +prefer to use templating, we'd definitely recommend +[zx](https://github.com/google/zx). zx is a much higher level library which +does some of the same work `tinyexec` does but behind a template string +interface. + +Similarly, libraries like `execa` will provide helpers for various things +like passing files as input to processes. We opt not to support features like +this since many of them are easy to do yourself (using Node's own APIs). diff --git a/sdk/typescript/node_modules/tinyexec/package.json b/sdk/typescript/node_modules/tinyexec/package.json new file mode 100644 index 0000000..58b21b5 --- /dev/null +++ b/sdk/typescript/node_modules/tinyexec/package.json @@ -0,0 +1,66 @@ +{ + "name": "tinyexec", + "version": "0.3.2", + "type": "module", + "description": "A minimal library for executing processes in Node", + "main": "./dist/main.js", + "files": [ + "dist", + "!dist/node_modules", + "!dist/cjs/test", + "!dist/esm/test" + ], + "scripts": { + "build": "npm run build:types && tsup", + "build:types": "tsc", + "dev": "tsup --watch", + "format": "prettier --write src", + "format:check": "prettier --check src", + "lint": "eslint src", + "prepare": "npm run build", + "test": "npm run build && c8 node --test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tinylibs/tinyexec.git" + }, + "keywords": [ + "execa", + "exec", + "tiny", + "child_process", + "spawn" + ], + "author": "James Garbutt (https://github.com/43081j)", + "license": "MIT", + "bugs": { + "url": "https://github.com/tinylibs/tinyexec/issues" + }, + "homepage": "https://github.com/tinylibs/tinyexec#readme", + "devDependencies": { + "@eslint/js": "^9.0.0", + "@types/cross-spawn": "^6.0.6", + "@types/node": "^20.12.7", + "c8": "^9.1.0", + "cross-spawn": "^7.0.3", + "eslint-config-google": "^0.14.0", + "prettier": "^3.2.5", + "tsup": "^8.1.0", + "typescript": "^5.4.5", + "typescript-eslint": "^7.7.0" + }, + "exports": { + ".": { + "import": { + "types": "./dist/main.d.ts", + "default": "./dist/main.js" + }, + "require": { + "types": "./dist/main.d.cts", + "default": "./dist/main.cjs" + } + }, + "./package.json": "./package.json" + }, + "types": "./dist/main.d.ts" +} diff --git a/sdk/typescript/node_modules/tinyglobby/LICENSE b/sdk/typescript/node_modules/tinyglobby/LICENSE new file mode 100644 index 0000000..8657364 --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Madeline Gurriarán + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/tinyglobby/README.md b/sdk/typescript/node_modules/tinyglobby/README.md new file mode 100644 index 0000000..15695e6 --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/README.md @@ -0,0 +1,25 @@ +# tinyglobby + +[![npm version](https://img.shields.io/npm/v/tinyglobby.svg?maxAge=3600)](https://npmjs.com/package/tinyglobby) +[![monthly downloads](https://img.shields.io/npm/dm/tinyglobby.svg?maxAge=3600)](https://npmjs.com/package/tinyglobby) + +A fast and minimal alternative to globby and fast-glob, meant to behave the same way. + +Both globby and fast-glob present some behavior no other globbing lib has, +which makes it hard to manually replace with something smaller and better. + +This library uses only two subdependencies, compared to `globby`'s [23](https://npmgraph.js.org/?q=globby@14.1.0) +and `fast-glob`'s [17](https://npmgraph.js.org/?q=fast-glob@3.3.3). + +## Usage + +```js +import { glob, globSync } from 'tinyglobby'; + +await glob(['files/*.ts', '!**/*.d.ts'], { cwd: 'src' }); +globSync('src/**/*.ts', { ignore: '**/*.d.ts' }); +``` + +## Documentation + +Visit https://superchupu.dev/tinyglobby to read the full documentation. diff --git a/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/LICENSE b/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/LICENSE new file mode 100644 index 0000000..bb7fdee --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/LICENSE @@ -0,0 +1,7 @@ +Copyright 2023 Abdullah Atta + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/README.md b/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/README.md new file mode 100644 index 0000000..5c70530 --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/README.md @@ -0,0 +1,91 @@ +

+ + +

The Fastest Directory Crawler & Globber for NodeJS

+

+ + + + + + + + +

+

+ +⚡ **The Fastest:** Nothing similar (in the NodeJS world) beats `fdir` in speed. It can easily crawl a directory containing **1 million files in < 1 second.** + +💡 **Stupidly Easy:** `fdir` uses expressive Builder pattern to build the crawler increasing code readability. + +🤖 **Zero Dependencies\*:** `fdir` only uses NodeJS `fs` & `path` modules. + +🕺 **Astonishingly Small:** < 2KB in size gzipped & minified. + +🖮 **Hackable:** Extending `fdir` is extremely simple now that the new Builder API is here. Feel free to experiment around. + +_\* `picomatch` must be installed manually by the user to support globbing._ + +## 🚄 Quickstart + +### Installation + +You can install using `npm`: + +```sh +$ npm i fdir +``` + +or Yarn: + +```sh +$ yarn add fdir +``` + +### Usage + +```ts +import { fdir } from "fdir"; + +// create the builder +const api = new fdir().withFullPaths().crawl("path/to/dir"); + +// get all files in a directory synchronously +const files = api.sync(); + +// or asynchronously +api.withPromise().then((files) => { + // do something with the result here. +}); +``` + +## Documentation: + +Documentation for all methods is available [here](/documentation.md). + +## 📊 Benchmarks: + +Please check the benchmark against the latest version [here](/BENCHMARKS.md). + +## 🙏Used by: + +`fdir` is downloaded over 200k+ times a week by projects around the world. Here's a list of some notable projects using `fdir` in production: + +> Note: if you think your project should be here, feel free to open an issue. Notable is anything with a considerable amount of GitHub stars. + +1. [rollup/plugins](https://github.com/rollup/plugins) +2. [SuperchupuDev/tinyglobby](https://github.com/SuperchupuDev/tinyglobby) +3. [pulumi/pulumi](https://github.com/pulumi/pulumi) +4. [dotenvx/dotenvx](https://github.com/dotenvx/dotenvx) +5. [mdn/yari](https://github.com/mdn/yari) +6. [streetwriters/notesnook](https://github.com/streetwriters/notesnook) +7. [imba/imba](https://github.com/imba/imba) +8. [moroshko/react-scanner](https://github.com/moroshko/react-scanner) +9. [netlify/build](https://github.com/netlify/build) +10. [yassinedoghri/astro-i18next](https://github.com/yassinedoghri/astro-i18next) +11. [selfrefactor/rambda](https://github.com/selfrefactor/rambda) +12. [whyboris/Video-Hub-App](https://github.com/whyboris/Video-Hub-App) + +## 🦮 LICENSE + +Copyright © 2024 Abdullah Atta under MIT. [Read full text here.](https://github.com/thecodrr/fdir/raw/master/LICENSE) diff --git a/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/package.json b/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/package.json new file mode 100644 index 0000000..e229dff --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/node_modules/fdir/package.json @@ -0,0 +1,103 @@ +{ + "name": "fdir", + "version": "6.5.0", + "description": "The fastest directory crawler & globbing alternative to glob, fast-glob, & tiny-glob. Crawls 1m files in < 1s", + "main": "./dist/index.cjs", + "types": "./dist/index.d.cts", + "type": "module", + "scripts": { + "prepublishOnly": "npm run test && npm run build", + "build": "tsdown", + "format": "prettier --write src __tests__ benchmarks", + "test": "vitest run __tests__/", + "test:coverage": "vitest run --coverage __tests__/", + "test:watch": "vitest __tests__/", + "bench": "ts-node benchmarks/benchmark.js", + "bench:glob": "ts-node benchmarks/glob-benchmark.ts", + "bench:fdir": "ts-node benchmarks/fdir-benchmark.ts", + "release": "./scripts/release.sh" + }, + "engines": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/thecodrr/fdir.git" + }, + "keywords": [ + "util", + "os", + "sys", + "fs", + "walk", + "crawler", + "directory", + "files", + "io", + "tiny-glob", + "glob", + "fast-glob", + "speed", + "javascript", + "nodejs" + ], + "author": "thecodrr ", + "license": "MIT", + "bugs": { + "url": "https://github.com/thecodrr/fdir/issues" + }, + "homepage": "https://github.com/thecodrr/fdir#readme", + "devDependencies": { + "@types/glob": "^8.1.0", + "@types/mock-fs": "^4.13.4", + "@types/node": "^20.9.4", + "@types/picomatch": "^4.0.0", + "@types/tap": "^15.0.11", + "@vitest/coverage-v8": "^0.34.6", + "all-files-in-tree": "^1.1.2", + "benny": "^3.7.1", + "csv-to-markdown-table": "^1.3.1", + "expect": "^29.7.0", + "fast-glob": "^3.3.2", + "fdir1": "npm:fdir@1.2.0", + "fdir2": "npm:fdir@2.1.0", + "fdir3": "npm:fdir@3.4.2", + "fdir4": "npm:fdir@4.1.0", + "fdir5": "npm:fdir@5.0.0", + "fs-readdir-recursive": "^1.1.0", + "get-all-files": "^4.1.0", + "glob": "^10.3.10", + "klaw-sync": "^6.0.0", + "mock-fs": "^5.2.0", + "picomatch": "^4.0.2", + "prettier": "^3.5.3", + "recur-readdir": "0.0.1", + "recursive-files": "^1.0.2", + "recursive-fs": "^2.1.0", + "recursive-readdir": "^2.2.3", + "rrdir": "^12.1.0", + "systeminformation": "^5.21.17", + "tiny-glob": "^0.2.9", + "ts-node": "^10.9.1", + "tsdown": "^0.12.5", + "typescript": "^5.3.2", + "vitest": "^0.34.6", + "walk-sync": "^3.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + }, + "module": "./dist/index.mjs", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./package.json": "./package.json" + } +} diff --git a/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/LICENSE b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/LICENSE new file mode 100644 index 0000000..3608dca --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/README.md b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/README.md new file mode 100644 index 0000000..0764496 --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/README.md @@ -0,0 +1,738 @@ +

Picomatch

+ +

+ +version + + +test status + + +coverage status + + +downloads + +

+ +
+
+ +

+Blazing fast and accurate glob matcher written in JavaScript.
+No dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. +

+ +
+
+ +## Why picomatch? + +* **Lightweight** - No dependencies +* **Minimal** - Tiny API surface. Main export is a function that takes a glob pattern and returns a matcher function. +* **Fast** - Loads in about 2ms (that's several times faster than a [single frame of a HD movie](http://www.endmemo.com/sconvert/framespersecondframespermillisecond.php) at 60fps) +* **Performant** - Use the returned matcher function to speed up repeat matching (like when watching files) +* **Accurate matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories, [advanced globbing](#advanced-globbing) with extglobs, braces, and POSIX brackets, and support for escaping special characters with `\` or quotes. +* **Well tested** - Thousands of unit tests + +See the [library comparison](#library-comparisons) to other libraries. + +
+
+ +## Table of Contents + +
Click to expand + +- [Install](#install) +- [Usage](#usage) +- [API](#api) + * [picomatch](#picomatch) + * [.test](#test) + * [.matchBase](#matchbase) + * [.isMatch](#ismatch) + * [.parse](#parse) + * [.scan](#scan) + * [.compileRe](#compilere) + * [.makeRe](#makere) + * [.toRegex](#toregex) +- [Options](#options) + * [Picomatch options](#picomatch-options) + * [Scan Options](#scan-options) + * [Options Examples](#options-examples) +- [Globbing features](#globbing-features) + * [Basic globbing](#basic-globbing) + * [Advanced globbing](#advanced-globbing) + * [Braces](#braces) + * [Matching special characters as literals](#matching-special-characters-as-literals) +- [Library Comparisons](#library-comparisons) +- [Benchmarks](#benchmarks) +- [Philosophies](#philosophies) +- [About](#about) + * [Author](#author) + * [License](#license) + +_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_ + +
+ +
+
+ +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +npm install --save picomatch +``` + +
+ +## Usage + +The main export is a function that takes a glob pattern and an options object and returns a function for matching strings. + +```js +const pm = require('picomatch'); +const isMatch = pm('*.js'); + +console.log(isMatch('abcd')); //=> false +console.log(isMatch('a.js')); //=> true +console.log(isMatch('a.md')); //=> false +console.log(isMatch('a/b.js')); //=> false +``` + +
+ +## API + +### [picomatch](lib/picomatch.js#L31) + +Creates a matcher function from one or more glob patterns. The returned function takes a string to match as its first argument, and returns true if the string is a match. The returned matcher function also takes a boolean as the second argument that, when true, returns an object with additional information. + +**Params** + +* `globs` **{String|Array}**: One or more glob patterns. +* `options` **{Object=}** +* `returns` **{Function=}**: Returns a matcher function. + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch(glob[, options]); + +const isMatch = picomatch('*.!(*a)'); +console.log(isMatch('a.a')); //=> false +console.log(isMatch('a.b')); //=> true +``` + +**Example without node.js** + +For environments without `node.js`, `picomatch/posix` provides you a dependency-free matcher, without automatic OS detection. + +```js +const picomatch = require('picomatch/posix'); +// the same API, defaulting to posix paths +const isMatch = picomatch('a/*'); +console.log(isMatch('a\\b')); //=> false +console.log(isMatch('a/b')); //=> true + +// you can still configure the matcher function to accept windows paths +const isMatch = picomatch('a/*', { options: windows }); +console.log(isMatch('a\\b')); //=> true +console.log(isMatch('a/b')); //=> true +``` + +### [.test](lib/picomatch.js#L116) + +Test `input` with the given `regex`. This is used by the main `picomatch()` function to test the input string. + +**Params** + +* `input` **{String}**: String to test. +* `regex` **{RegExp}** +* `returns` **{Object}**: Returns an object with matching info. + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.test(input, regex[, options]); + +console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); +// { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } +``` + +### [.matchBase](lib/picomatch.js#L160) + +Match the basename of a filepath. + +**Params** + +* `input` **{String}**: String to test. +* `glob` **{RegExp|String}**: Glob pattern or regex created by [.makeRe](#makeRe). +* `returns` **{Boolean}** + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.matchBase(input, glob[, options]); +console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true +``` + +### [.isMatch](lib/picomatch.js#L182) + +Returns true if **any** of the given glob `patterns` match the specified `string`. + +**Params** + +* **{String|Array}**: str The string to test. +* **{String|Array}**: patterns One or more glob patterns to use for matching. +* **{Object}**: See available [options](#options). +* `returns` **{Boolean}**: Returns true if any patterns match `str` + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.isMatch(string, patterns[, options]); + +console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true +console.log(picomatch.isMatch('a.a', 'b.*')); //=> false +``` + +### [.parse](lib/picomatch.js#L198) + +Parse a glob pattern to create the source string for a regular expression. + +**Params** + +* `pattern` **{String}** +* `options` **{Object}** +* `returns` **{Object}**: Returns an object with useful properties and output to be used as a regex source string. + +**Example** + +```js +const picomatch = require('picomatch'); +const result = picomatch.parse(pattern[, options]); +``` + +### [.scan](lib/picomatch.js#L230) + +Scan a glob pattern to separate the pattern into segments. + +**Params** + +* `input` **{String}**: Glob pattern to scan. +* `options` **{Object}** +* `returns` **{Object}**: Returns an object with + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.scan(input[, options]); + +const result = picomatch.scan('!./foo/*.js'); +console.log(result); +{ prefix: '!./', + input: '!./foo/*.js', + start: 3, + base: 'foo', + glob: '*.js', + isBrace: false, + isBracket: false, + isGlob: true, + isExtglob: false, + isGlobstar: false, + negated: true } +``` + +### [.compileRe](lib/picomatch.js#L244) + +Compile a regular expression from the `state` object returned by the +[parse()](#parse) method. + +**Params** + +* `state` **{Object}** +* `options` **{Object}** +* `returnOutput` **{Boolean}**: Intended for implementors, this argument allows you to return the raw output from the parser. +* `returnState` **{Boolean}**: Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. +* `returns` **{RegExp}** + +### [.makeRe](lib/picomatch.js#L285) + +Create a regular expression from a parsed glob pattern. + +**Params** + +* `state` **{String}**: The object returned from the `.parse` method. +* `options` **{Object}** +* `returnOutput` **{Boolean}**: Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. +* `returnState` **{Boolean}**: Implementors may use this argument to return the state from the parsed glob with the returned regular expression. +* `returns` **{RegExp}**: Returns a regex created from the given pattern. + +**Example** + +```js +const picomatch = require('picomatch'); +const state = picomatch.parse('*.js'); +// picomatch.compileRe(state[, options]); + +console.log(picomatch.compileRe(state)); +//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ +``` + +### [.toRegex](lib/picomatch.js#L320) + +Create a regular expression from the given regex source string. + +**Params** + +* `source` **{String}**: Regular expression source string. +* `options` **{Object}** +* `returns` **{RegExp}** + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.toRegex(source[, options]); + +const { output } = picomatch.parse('*.js'); +console.log(picomatch.toRegex(output)); +//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ +``` + +
+ +## Options + +### Picomatch options + +The following options may be used with the main `picomatch()` function or any of the methods on the picomatch API. + +| **Option** | **Type** | **Default value** | **Description** | +| --- | --- | --- | --- | +| `basename` | `boolean` | `false` | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes. For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. | +| `bash` | `boolean` | `false` | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). | +| `capture` | `boolean` | `undefined` | Return regex matches in supporting methods. | +| `contains` | `boolean` | `undefined` | Allows glob to match any part of the given string(s). | +| `cwd` | `string` | `process.cwd()` | Current working directory. Used by `picomatch.split()` | +| `debug` | `boolean` | `undefined` | Debug regular expressions when an error is thrown. | +| `dot` | `boolean` | `false` | Enable dotfile matching. By default, dotfiles are ignored unless a `.` is explicitly defined in the pattern, or `options.dot` is true | +| `expandRange` | `function` | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. | +| `failglob` | `boolean` | `false` | Throws an error if no matches are found. Based on the bash option of the same name. | +| `fastpaths` | `boolean` | `true` | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. | +| `flags` | `string` | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. | +| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. | +| `ignore` | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. | +| `keepQuotes` | `boolean` | `false` | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes. | +| `literalBrackets` | `boolean` | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. | +| `matchBase` | `boolean` | `false` | Alias for `basename` | +| `maxLength` | `number` | `65536` | Limit the max length of the input string. An error is thrown if the input string is longer than this value. | +| `nobrace` | `boolean` | `false` | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. | +| `nobracket` | `boolean` | `undefined` | Disable matching with regex brackets. | +| `nocase` | `boolean` | `false` | Make matching case-insensitive. Equivalent to the regex `i` flag. Note that this option is overridden by the `flags` option. | +| `nodupes` | `boolean` | `true` | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. | +| `noext` | `boolean` | `false` | Alias for `noextglob` | +| `noextglob` | `boolean` | `false` | Disable support for matching with extglobs (like `+(a\|b)`) | +| `noglobstar` | `boolean` | `false` | Disable support for matching nested directories with globstars (`**`) | +| `nonegate` | `boolean` | `false` | Disable support for negating with leading `!` | +| `noquantifiers` | `boolean` | `false` | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. | +| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. | +| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. | +| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. | +| `posix` | `boolean` | `false` | Support POSIX character classes ("posix brackets"). | +| `posixSlashes` | `boolean` | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself | +| `prepend` | `boolean` | `undefined` | String to prepend to the generated regex used for matching. | +| `regex` | `boolean` | `false` | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). | +| `strictBrackets` | `boolean` | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. | +| `strictSlashes` | `boolean` | `undefined` | When true, picomatch won't match trailing slashes with single stars. | +| `unescape` | `boolean` | `undefined` | Remove backslashes preceding escaped characters in the glob pattern. By default, backslashes are retained. | +| `unixify` | `boolean` | `undefined` | Alias for `posixSlashes`, for backwards compatibility. | +| `windows` | `boolean` | `false` | Also accept backslashes as the path separator. | + +### Scan Options + +In addition to the main [picomatch options](#picomatch-options), the following options may also be used with the [.scan](#scan) method. + +| **Option** | **Type** | **Default value** | **Description** | +| --- | --- | --- | --- | +| `tokens` | `boolean` | `false` | When `true`, the returned object will include an array of tokens (objects), representing each path "segment" in the scanned glob pattern | +| `parts` | `boolean` | `false` | When `true`, the returned object will include an array of strings representing each path "segment" in the scanned glob pattern. This is automatically enabled when `options.tokens` is true | + +**Example** + +```js +const picomatch = require('picomatch'); +const result = picomatch.scan('!./foo/*.js', { tokens: true }); +console.log(result); +// { +// prefix: '!./', +// input: '!./foo/*.js', +// start: 3, +// base: 'foo', +// glob: '*.js', +// isBrace: false, +// isBracket: false, +// isGlob: true, +// isExtglob: false, +// isGlobstar: false, +// negated: true, +// maxDepth: 2, +// tokens: [ +// { value: '!./', depth: 0, isGlob: false, negated: true, isPrefix: true }, +// { value: 'foo', depth: 1, isGlob: false }, +// { value: '*.js', depth: 1, isGlob: true } +// ], +// slashes: [ 2, 6 ], +// parts: [ 'foo', '*.js' ] +// } +``` + +
+ +### Options Examples + +#### options.expandRange + +**Type**: `function` + +**Default**: `undefined` + +Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need. + +**Example** + +The following example shows how to create a glob that matches a folder + +```js +const fill = require('fill-range'); +const regex = pm.makeRe('foo/{01..25}/bar', { + expandRange(a, b) { + return `(${fill(a, b, { toRegex: true })})`; + } +}); + +console.log(regex); +//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/ + +console.log(regex.test('foo/00/bar')) // false +console.log(regex.test('foo/01/bar')) // true +console.log(regex.test('foo/10/bar')) // true +console.log(regex.test('foo/22/bar')) // true +console.log(regex.test('foo/25/bar')) // true +console.log(regex.test('foo/26/bar')) // false +``` + +#### options.format + +**Type**: `function` + +**Default**: `undefined` + +Custom function for formatting strings before they're matched. + +**Example** + +```js +// strip leading './' from strings +const format = str => str.replace(/^\.\//, ''); +const isMatch = picomatch('foo/*.js', { format }); +console.log(isMatch('./foo/bar.js')); //=> true +``` + +#### options.onMatch + +```js +const onMatch = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onMatch }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +#### options.onIgnore + +```js +const onIgnore = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onIgnore, ignore: 'f*' }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +#### options.onResult + +```js +const onResult = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onResult, ignore: 'f*' }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +
+
+ +## Globbing features + +* [Basic globbing](#basic-globbing) (Wildcard matching) +* [Advanced globbing](#advanced-globbing) (extglobs, posix brackets, brace matching) + +### Basic globbing + +| **Character** | **Description** | +| --- | --- | +| `*` | Matches any character zero or more times, excluding path separators. Does _not match_ path separators or hidden files or directories ("dotfiles"), unless explicitly enabled by setting the `dot` option to `true`. | +| `**` | Matches any character zero or more times, including path separators. Note that `**` will only match path separators (`/`, and `\\` with the `windows` option) when they are the only characters in a path segment. Thus, `foo**/bar` is equivalent to `foo*/bar`, and `foo/a**b/bar` is equivalent to `foo/a*b/bar`, and _more than two_ consecutive stars in a glob path segment are regarded as _a single star_. Thus, `foo/***/bar` is equivalent to `foo/*/bar`. | +| `?` | Matches any character excluding path separators one time. Does _not match_ path separators or leading dots. | +| `[abc]` | Matches any characters inside the brackets. For example, `[abc]` would match the characters `a`, `b` or `c`, and nothing else. | + +#### Matching behavior vs. Bash + +Picomatch's matching features and expected results in unit tests are based on Bash's unit tests and the Bash 4.3 specification, with the following exceptions: + +* Bash will match `foo/bar/baz` with `*`. Picomatch only matches nested directories with `**`. +* Bash greedily matches with negated extglobs. For example, Bash 4.3 says that `!(foo)*` should match `foo` and `foobar`, since the trailing `*` bracktracks to match the preceding pattern. This is very memory-inefficient, and IMHO, also incorrect. Picomatch would return `false` for both `foo` and `foobar`. + +
+ +### Advanced globbing + +* [extglobs](#extglobs) +* [POSIX brackets](#posix-brackets) +* [Braces](#brace-expansion) + +#### Extglobs + +| **Pattern** | **Description** | +| --- | --- | +| `@(pattern)` | Match _only one_ consecutive occurrence of `pattern` | +| `*(pattern)` | Match _zero or more_ consecutive occurrences of `pattern` | +| `+(pattern)` | Match _one or more_ consecutive occurrences of `pattern` | +| `?(pattern)` | Match _zero or **one**_ consecutive occurrences of `pattern` | +| `!(pattern)` | Match _anything but_ `pattern` | + +**Examples** + +```js +const pm = require('picomatch'); + +// *(pattern) matches ZERO or more of "pattern" +console.log(pm.isMatch('a', 'a*(z)')); // true +console.log(pm.isMatch('az', 'a*(z)')); // true +console.log(pm.isMatch('azzz', 'a*(z)')); // true + +// +(pattern) matches ONE or more of "pattern" +console.log(pm.isMatch('a', 'a+(z)')); // false +console.log(pm.isMatch('az', 'a+(z)')); // true +console.log(pm.isMatch('azzz', 'a+(z)')); // true + +// supports multiple extglobs +console.log(pm.isMatch('foo.bar', '!(foo).!(bar)')); // false + +// supports nested extglobs +console.log(pm.isMatch('foo.bar', '!(!(foo)).!(!(bar))')); // true +``` + +#### POSIX brackets + +POSIX classes are disabled by default. Enable this feature by setting the `posix` option to true. + +**Enable POSIX bracket support** + +```js +console.log(pm.makeRe('[[:word:]]+', { posix: true })); +//=> /^(?:(?=.)[A-Za-z0-9_]+\/?)$/ +``` + +**Supported POSIX classes** + +The following named POSIX bracket expressions are supported: + +* `[:alnum:]` - Alphanumeric characters, equ `[a-zA-Z0-9]` +* `[:alpha:]` - Alphabetical characters, equivalent to `[a-zA-Z]`. +* `[:ascii:]` - ASCII characters, equivalent to `[\\x00-\\x7F]`. +* `[:blank:]` - Space and tab characters, equivalent to `[ \\t]`. +* `[:cntrl:]` - Control characters, equivalent to `[\\x00-\\x1F\\x7F]`. +* `[:digit:]` - Numerical digits, equivalent to `[0-9]`. +* `[:graph:]` - Graph characters, equivalent to `[\\x21-\\x7E]`. +* `[:lower:]` - Lowercase letters, equivalent to `[a-z]`. +* `[:print:]` - Print characters, equivalent to `[\\x20-\\x7E ]`. +* `[:punct:]` - Punctuation and symbols, equivalent to `[\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~]`. +* `[:space:]` - Extended space characters, equivalent to `[ \\t\\r\\n\\v\\f]`. +* `[:upper:]` - Uppercase letters, equivalent to `[A-Z]`. +* `[:word:]` - Word characters (letters, numbers and underscores), equivalent to `[A-Za-z0-9_]`. +* `[:xdigit:]` - Hexadecimal digits, equivalent to `[A-Fa-f0-9]`. + +See the [Bash Reference Manual](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) for more information. + +### Braces + +Picomatch does not do brace expansion. For [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) and advanced matching with braces, use [micromatch](https://github.com/micromatch/micromatch) instead. Picomatch has very basic support for braces. + +### Matching special characters as literals + +If you wish to match the following special characters in a filepath, and you want to use these characters in your glob pattern, they must be escaped with backslashes or quotes: + +**Special Characters** + +Some characters that are used for matching in regular expressions are also regarded as valid file path characters on some platforms. + +To match any of the following characters as literals: `$^*+?()[] + +Examples: + +```js +console.log(pm.makeRe('foo/bar \\(1\\)')); +console.log(pm.makeRe('foo/bar \\(1\\)')); +``` + +
+
+ +## Library Comparisons + +The following table shows which features are supported by [minimatch](https://github.com/isaacs/minimatch), [micromatch](https://github.com/micromatch/micromatch), [picomatch](https://github.com/micromatch/picomatch), [nanomatch](https://github.com/micromatch/nanomatch), [extglob](https://github.com/micromatch/extglob), [braces](https://github.com/micromatch/braces), and [expand-brackets](https://github.com/micromatch/expand-brackets). + +| **Feature** | `minimatch` | `micromatch` | `picomatch` | `nanomatch` | `extglob` | `braces` | `expand-brackets` | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Wildcard matching (`*?+`) | ✔ | ✔ | ✔ | ✔ | - | - | - | +| Advancing globbing | ✔ | ✔ | ✔ | - | - | - | - | +| Brace _matching_ | ✔ | ✔ | ✔ | - | - | ✔ | - | +| Brace _expansion_ | ✔ | ✔ | - | - | - | ✔ | - | +| Extglobs | partial | ✔ | ✔ | - | ✔ | - | - | +| Posix brackets | - | ✔ | ✔ | - | - | - | ✔ | +| Regular expression syntax | - | ✔ | ✔ | ✔ | ✔ | - | ✔ | +| File system operations | - | - | - | - | - | - | - | + +
+
+ +## Benchmarks + +Performance comparison of picomatch and minimatch. + +_(Pay special attention to the last three benchmarks. Minimatch freezes on long ranges.)_ + +``` +# .makeRe star (*) + picomatch x 4,449,159 ops/sec ±0.24% (97 runs sampled) + minimatch x 632,772 ops/sec ±0.14% (98 runs sampled) + +# .makeRe star; dot=true (*) + picomatch x 3,500,079 ops/sec ±0.26% (99 runs sampled) + minimatch x 564,916 ops/sec ±0.23% (96 runs sampled) + +# .makeRe globstar (**) + picomatch x 3,261,000 ops/sec ±0.27% (98 runs sampled) + minimatch x 1,664,766 ops/sec ±0.20% (100 runs sampled) + +# .makeRe globstars (**/**/**) + picomatch x 3,284,469 ops/sec ±0.18% (97 runs sampled) + minimatch x 1,435,880 ops/sec ±0.34% (95 runs sampled) + +# .makeRe with leading star (*.txt) + picomatch x 3,100,197 ops/sec ±0.35% (99 runs sampled) + minimatch x 428,347 ops/sec ±0.42% (94 runs sampled) + +# .makeRe - basic braces ({a,b,c}*.txt) + picomatch x 443,578 ops/sec ±1.33% (89 runs sampled) + minimatch x 107,143 ops/sec ±0.35% (94 runs sampled) + +# .makeRe - short ranges ({a..z}*.txt) + picomatch x 415,484 ops/sec ±0.76% (96 runs sampled) + minimatch x 14,299 ops/sec ±0.26% (96 runs sampled) + +# .makeRe - medium ranges ({1..100000}*.txt) + picomatch x 395,020 ops/sec ±0.87% (89 runs sampled) + minimatch x 2 ops/sec ±4.59% (10 runs sampled) + +# .makeRe - long ranges ({1..10000000}*.txt) + picomatch x 400,036 ops/sec ±0.83% (90 runs sampled) + minimatch (FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory) +``` + +
+
+ +## Philosophies + +The goal of this library is to be blazing fast, without compromising on accuracy. + +**Accuracy** + +The number one of goal of this library is accuracy. However, it's not unusual for different glob implementations to have different rules for matching behavior, even with simple wildcard matching. It gets increasingly more complicated when combinations of different features are combined, like when extglobs are combined with globstars, braces, slashes, and so on: `!(**/{a,b,*/c})`. + +Thus, given that there is no canonical glob specification to use as a single source of truth when differences of opinion arise regarding behavior, sometimes we have to implement our best judgement and rely on feedback from users to make improvements. + +**Performance** + +Although this library performs well in benchmarks, and in most cases it's faster than other popular libraries we benchmarked against, we will always choose accuracy over performance. It's not helpful to anyone if our library is faster at returning the wrong answer. + +
+
+ +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2017-present, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). diff --git a/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/index.js b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/index.js new file mode 100644 index 0000000..a753b1d --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/index.js @@ -0,0 +1,17 @@ +'use strict'; + +const pico = require('./lib/picomatch'); +const utils = require('./lib/utils'); + +function picomatch(glob, options, returnState = false) { + // default to os.platform() + if (options && (options.windows === null || options.windows === undefined)) { + // don't mutate the original options object + options = { ...options, windows: utils.isWindows() }; + } + + return pico(glob, options, returnState); +} + +Object.assign(picomatch, pico); +module.exports = picomatch; diff --git a/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/package.json b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/package.json new file mode 100644 index 0000000..372e27e --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/package.json @@ -0,0 +1,83 @@ +{ + "name": "picomatch", + "description": "Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.", + "version": "4.0.3", + "homepage": "https://github.com/micromatch/picomatch", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "funding": "https://github.com/sponsors/jonschlinkert", + "repository": "micromatch/picomatch", + "bugs": { + "url": "https://github.com/micromatch/picomatch/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "posix.js", + "lib" + ], + "sideEffects": false, + "main": "index.js", + "engines": { + "node": ">=12" + }, + "scripts": { + "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .", + "mocha": "mocha --reporter dot", + "test": "npm run lint && npm run mocha", + "test:ci": "npm run test:cover", + "test:cover": "nyc npm run mocha" + }, + "devDependencies": { + "eslint": "^8.57.0", + "fill-range": "^7.0.1", + "gulp-format-md": "^2.0.0", + "mocha": "^10.4.0", + "nyc": "^15.1.0", + "time-require": "github:jonschlinkert/time-require" + }, + "keywords": [ + "glob", + "match", + "picomatch" + ], + "nyc": { + "reporter": [ + "html", + "lcov", + "text-summary" + ] + }, + "verb": { + "toc": { + "render": true, + "method": "preWrite", + "maxdepth": 3 + }, + "layout": "empty", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "related": { + "list": [ + "braces", + "micromatch" + ] + }, + "reflinks": [ + "braces", + "expand-brackets", + "extglob", + "fill-range", + "micromatch", + "minimatch", + "nanomatch", + "picomatch" + ] + } +} diff --git a/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/posix.js b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/posix.js new file mode 100644 index 0000000..d2f2bc5 --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/node_modules/picomatch/posix.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./lib/picomatch'); diff --git a/sdk/typescript/node_modules/tinyglobby/package.json b/sdk/typescript/node_modules/tinyglobby/package.json new file mode 100644 index 0000000..d0247c2 --- /dev/null +++ b/sdk/typescript/node_modules/tinyglobby/package.json @@ -0,0 +1,73 @@ +{ + "name": "tinyglobby", + "version": "0.2.15", + "description": "A fast and minimal alternative to globby and fast-glob", + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.cts", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist" + ], + "author": "Superchupu", + "license": "MIT", + "keywords": [ + "glob", + "patterns", + "fast", + "implementation" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/SuperchupuDev/tinyglobby.git" + }, + "bugs": { + "url": "https://github.com/SuperchupuDev/tinyglobby/issues" + }, + "homepage": "https://superchupu.dev/tinyglobby", + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + }, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "devDependencies": { + "@biomejs/biome": "^2.2.3", + "@types/node": "^24.3.1", + "@types/picomatch": "^4.0.2", + "fast-glob": "^3.3.3", + "fs-fixture": "^2.8.1", + "glob": "^11.0.3", + "tinybench": "^5.0.1", + "tsdown": "^0.14.2", + "typescript": "^5.9.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "publishConfig": { + "provenance": true + }, + "scripts": { + "bench": "node benchmark/bench.ts", + "bench:setup": "node benchmark/setup.ts", + "build": "tsdown", + "check": "biome check", + "check:fix": "biome check --write --unsafe", + "format": "biome format --write", + "lint": "biome lint", + "test": "node --test \"test/**/*.ts\"", + "test:coverage": "node --test --experimental-test-coverage \"test/**/*.ts\"", + "test:only": "node --test --test-only \"test/**/*.ts\"", + "typecheck": "tsc --noEmit" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/tinypool/LICENSE b/sdk/typescript/node_modules/tinypool/LICENSE new file mode 100644 index 0000000..9026cdf --- /dev/null +++ b/sdk/typescript/node_modules/tinypool/LICENSE @@ -0,0 +1,24 @@ +The MIT License (MIT) + +Copyright (c) 2020 James M Snell and the Piscina contributors + +Piscina contributors listed at https://github.com/jasnell/piscina#the-team and +in the README file. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/tinypool/README.md b/sdk/typescript/node_modules/tinypool/README.md new file mode 100644 index 0000000..829cc43 --- /dev/null +++ b/sdk/typescript/node_modules/tinypool/README.md @@ -0,0 +1,21 @@ + +# Tinypool - the node.js worker pool 🧵 + +> Piscina: A fast, efficient Node.js Worker Thread Pool implementation + +Tinypool is a fork of piscina. What we try to achieve in this library, is to eliminate some dependencies and features that our target users don't need (currently, our main user will be Vitest). Tinypool's install size (38KB) can then be smaller than Piscina's install size (6MB). If you need features like [utilization](https://github.com/piscinajs/piscina#property-utilization-readonly) or [NAPI](https://github.com/piscinajs/piscina#thread-priority-on-linux-systems), [Piscina](https://github.com/piscinajs/piscina) is a better choice for you. We think that Piscina is an amazing library, and we may try to upstream some of the dependencies optimization in this fork. + +- ✅ Smaller install size, 38KB +- ✅ Minimal +- ✅ No dependencies +- ✅ Physical cores instead of Logical cores with [physical-cpu-count](https://www.npmjs.com/package/physical-cpu-count) +- ✅ Supports `worker_threads` and `child_process` +- ❌ No utilization +- ❌ No NAPI + +- Written in TypeScript, and ESM support only. For Node.js 14.x and higher. + +_In case you need more tiny libraries like tinypool or tinyspy, please consider submitting an [RFC](https://github.com/tinylibs/rfcs)_ + +## Docs +Read **[full docs](https://github.com/tinylibs/tinypool#readme)** on GitHub. diff --git a/sdk/typescript/node_modules/tinypool/package.json b/sdk/typescript/node_modules/tinypool/package.json new file mode 100644 index 0000000..2617836 --- /dev/null +++ b/sdk/typescript/node_modules/tinypool/package.json @@ -0,0 +1,30 @@ +{ + "name": "tinypool", + "version": "0.8.4", + "description": "A minimal and tiny Node.js Worker Thread Pool implementation, a fork of piscina, but with fewer features", + "type": "module", + "main": "./dist/esm/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist/**" + ], + "packageManager": "pnpm@8.4.0", + "repository": { + "type": "git", + "url": "git+https://github.com/tinylibs/tinypool.git" + }, + "keywords": [ + "fast", + "worker threads", + "thread pool" + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/tinylibs/tinypool/issues" + }, + "homepage": "https://github.com/tinylibs/tinypool#readme", + "engines": { + "node": ">=14.0.0" + } +} diff --git a/sdk/typescript/node_modules/tree-kill/LICENSE b/sdk/typescript/node_modules/tree-kill/LICENSE new file mode 100644 index 0000000..aa86c2d --- /dev/null +++ b/sdk/typescript/node_modules/tree-kill/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Peter Krumins + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/tree-kill/README.md b/sdk/typescript/node_modules/tree-kill/README.md new file mode 100644 index 0000000..59a00ea --- /dev/null +++ b/sdk/typescript/node_modules/tree-kill/README.md @@ -0,0 +1,89 @@ +Tree Kill +========= + +Kill all processes in the process tree, including the root process. + +Examples +======= + +Kill all the descendent processes of the process with pid `1`, including the process with pid `1` itself: +```js +var kill = require('tree-kill'); +kill(1); +``` + +Send a signal other than SIGTERM.: +```js +var kill = require('tree-kill'); +kill(1, 'SIGKILL'); +``` + +Run a callback when done killing the processes. Passes an error argument if there was an error. +```js +var kill = require('tree-kill'); +kill(1, 'SIGKILL', function(err) { + // Do things +}); +``` + +You can also install tree-kill globally and use it as a command: +```sh +tree-kill 1 # sends SIGTERM to process 1 and its descendents +tree-kill 1 SIGTERM # same +tree-kill 1 SIGKILL # sends KILL instead of TERMINATE +``` + +Methods +======= + +## require('tree-kill')(pid, [signal], [callback]); + +Sends signal `signal` to all children processes of the process with pid `pid`, including `pid`. Signal defaults to `SIGTERM`. + +For Linux, this uses `ps -o pid --no-headers --ppid PID` to find the parent pids of `PID`. + +For Darwin/OSX, this uses `pgrep -P PID` to find the parent pids of `PID`. + +For Windows, this uses `'taskkill /pid PID /T /F'` to kill the process tree. Note that on Windows, sending the different kinds of POSIX signals is not possible. + +Install +======= + +With [npm](https://npmjs.org) do: + +``` +npm install tree-kill +``` + +License +======= + +MIT + +Changelog +========= + + +## [1.2.2] - 2019-12-11 +### Changed +- security fix: sanitize `pid` parameter to fix arbitrary code execution vulnerability + +## [1.2.1] - 2018-11-05 +### Changed +- added missing LICENSE file +- updated TypeScript definitions + +## [1.2.0] - 2017-09-19 +### Added +- TypeScript definitions +### Changed +- `kill(pid, callback)` works. Before you had to use `kill(pid, signal, callback)` + +## [1.1.0] - 2016-05-13 +### Added +- A `tree-kill` CLI + +## [1.0.0] - 2015-09-17 +### Added +- optional callback +- Darwin support diff --git a/sdk/typescript/node_modules/tree-kill/cli.js b/sdk/typescript/node_modules/tree-kill/cli.js new file mode 100644 index 0000000..1acb815 --- /dev/null +++ b/sdk/typescript/node_modules/tree-kill/cli.js @@ -0,0 +1,14 @@ +#!/usr/bin/env node +kill = require('.') +try { + kill(process.argv[2], process.argv[3], function(err){ + if (err) { + console.log(err.message) + process.exit(1) + } + }) +} +catch (err) { + console.log(err.message) + process.exit(1) +} diff --git a/sdk/typescript/node_modules/tree-kill/index.d.ts b/sdk/typescript/node_modules/tree-kill/index.d.ts new file mode 100644 index 0000000..e0b1302 --- /dev/null +++ b/sdk/typescript/node_modules/tree-kill/index.d.ts @@ -0,0 +1,13 @@ +/** + * Kills process identified by `pid` and all its children + * + * @param pid + * @param signal 'SIGTERM' by default + * @param callback + */ +declare function treeKill(pid: number, callback?: (error?: Error) => void): void; +declare function treeKill(pid: number, signal?: string | number, callback?: (error?: Error) => void): void; + +declare namespace treeKill {} + +export = treeKill; diff --git a/sdk/typescript/node_modules/tree-kill/index.js b/sdk/typescript/node_modules/tree-kill/index.js new file mode 100644 index 0000000..8df6a0f --- /dev/null +++ b/sdk/typescript/node_modules/tree-kill/index.js @@ -0,0 +1,118 @@ +'use strict'; + +var childProcess = require('child_process'); +var spawn = childProcess.spawn; +var exec = childProcess.exec; + +module.exports = function (pid, signal, callback) { + if (typeof signal === 'function' && callback === undefined) { + callback = signal; + signal = undefined; + } + + pid = parseInt(pid); + if (Number.isNaN(pid)) { + if (callback) { + return callback(new Error("pid must be a number")); + } else { + throw new Error("pid must be a number"); + } + } + + var tree = {}; + var pidsToProcess = {}; + tree[pid] = []; + pidsToProcess[pid] = 1; + + switch (process.platform) { + case 'win32': + exec('taskkill /pid ' + pid + ' /T /F', callback); + break; + case 'darwin': + buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { + return spawn('pgrep', ['-P', parentPid]); + }, function () { + killAll(tree, signal, callback); + }); + break; + // case 'sunos': + // buildProcessTreeSunOS(pid, tree, pidsToProcess, function () { + // killAll(tree, signal, callback); + // }); + // break; + default: // Linux + buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { + return spawn('ps', ['-o', 'pid', '--no-headers', '--ppid', parentPid]); + }, function () { + killAll(tree, signal, callback); + }); + break; + } +}; + +function killAll (tree, signal, callback) { + var killed = {}; + try { + Object.keys(tree).forEach(function (pid) { + tree[pid].forEach(function (pidpid) { + if (!killed[pidpid]) { + killPid(pidpid, signal); + killed[pidpid] = 1; + } + }); + if (!killed[pid]) { + killPid(pid, signal); + killed[pid] = 1; + } + }); + } catch (err) { + if (callback) { + return callback(err); + } else { + throw err; + } + } + if (callback) { + return callback(); + } +} + +function killPid(pid, signal) { + try { + process.kill(parseInt(pid, 10), signal); + } + catch (err) { + if (err.code !== 'ESRCH') throw err; + } +} + +function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) { + var ps = spawnChildProcessesList(parentPid); + var allData = ''; + ps.stdout.on('data', function (data) { + var data = data.toString('ascii'); + allData += data; + }); + + var onClose = function (code) { + delete pidsToProcess[parentPid]; + + if (code != 0) { + // no more parent processes + if (Object.keys(pidsToProcess).length == 0) { + cb(); + } + return; + } + + allData.match(/\d+/g).forEach(function (pid) { + pid = parseInt(pid, 10); + tree[parentPid].push(pid); + tree[pid] = []; + pidsToProcess[pid] = 1; + buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb); + }); + }; + + ps.on('close', onClose); +} diff --git a/sdk/typescript/node_modules/tree-kill/package.json b/sdk/typescript/node_modules/tree-kill/package.json new file mode 100644 index 0000000..fa37804 --- /dev/null +++ b/sdk/typescript/node_modules/tree-kill/package.json @@ -0,0 +1,51 @@ +{ + "name": "tree-kill", + "version": "1.2.2", + "description": "kill trees of processes", + "main": "index.js", + "types": "index.d.ts", + "bin": { + "tree-kill": "cli.js" + }, + "scripts": { + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "git://github.com/pkrumins/node-tree-kill.git" + }, + "homepage": "https://github.com/pkrumins/node-tree-kill", + "keywords": [ + "tree", + "trees", + "process", + "processes", + "kill", + "signal" + ], + "author": { + "name": "Peteris Krumins", + "email": "peteris.krumins@gmail.com", + "url": "http://www.catonmat.net" + }, + "contributors": [ + { + "name": "Todd Wolfson", + "email": "todd@twolfson.com", + "url": "http://twolfson.com/" + }, + { + "name": "William Hilton", + "email": "wmhilton@gmail.com", + "url": "http://wmhilton.com/" + }, + { + "name": "Fabrício Matté", + "url": "http://ultcombo.js.org/" + } + ], + "license": "MIT", + "devDependencies": { + "mocha": "^2.2.5" + } +} diff --git a/sdk/typescript/node_modules/tsup/LICENSE b/sdk/typescript/node_modules/tsup/LICENSE new file mode 100644 index 0000000..6b47a14 --- /dev/null +++ b/sdk/typescript/node_modules/tsup/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 EGOIST + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/tsup/README.md b/sdk/typescript/node_modules/tsup/README.md new file mode 100644 index 0000000..63e87c2 --- /dev/null +++ b/sdk/typescript/node_modules/tsup/README.md @@ -0,0 +1,75 @@ +> [!WARNING] +> This project is not actively maintained anymore. Please consider using [tsdown](https://github.com/rolldown/tsdown/) instead. Read more in [the migration guide](https://tsdown.dev/guide/migrate-from-tsup). + +# tsup + +[![npm version](https://badgen.net/npm/v/tsup)](https://npm.im/tsup) [![npm downloads](https://badgen.net/npm/dm/tsup)](https://npm.im/tsup) + +Bundle your TypeScript library with no config, powered by [esbuild](https://github.com/evanw/esbuild). + +## 👀 What can it bundle? + +Anything that's supported by Node.js natively, namely `.js`, `.json`, `.mjs`. And TypeScript `.ts`, `.tsx`. [CSS support is experimental](https://tsup.egoist.dev/#css-support). + +## ⚙️ Install + +Install it locally in your project folder: + +```bash +npm i tsup -D +# Or Yarn +yarn add tsup --dev +# Or pnpm +pnpm add tsup -D +``` + +You can also install it globally but it's not recommended. + +## 📖 Usage + +### Bundle files + +```bash +tsup [...files] +``` + +Files are written into `./dist`. + +You can bundle multiple files in one go: + +```bash +tsup src/index.ts src/cli.ts +``` + +This will output `dist/index.js` and `dist/cli.js`. + +## 📚 Documentation + +For complete usages, please dive into the [docs](https://tsup.egoist.dev). + +For all configuration options, please see [the API docs](https://jsdocs.io/package/tsup). + +## 💬 Discussions + +Head over to the [discussions](https://github.com/egoist/tsup/discussions) to share your ideas. + +## Sponsors + +

+ + + Ship UIs faster with automated workflows for Storybook + +

+ +

+sponsors +

+ +## Project Stats + +![Alt](https://repobeats.axiom.co/api/embed/4ef361ec8445b33c2dab451e1d23784015834c72.svg 'Repobeats analytics image') + +## License + +MIT © [EGOIST](https://github.com/sponsors/egoist) diff --git a/sdk/typescript/node_modules/tsup/assets/cjs_shims.js b/sdk/typescript/node_modules/tsup/assets/cjs_shims.js new file mode 100644 index 0000000..ea60383 --- /dev/null +++ b/sdk/typescript/node_modules/tsup/assets/cjs_shims.js @@ -0,0 +1,13 @@ +// Shim globals in cjs bundle +// There's a weird bug that esbuild will always inject importMetaUrl +// if we export it as `const importMetaUrl = ... __filename ...` +// But using a function will not cause this issue + +const getImportMetaUrl = () => + typeof document === "undefined" + ? new URL(`file:${__filename}`).href + : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') + ? document.currentScript.src + : new URL("main.js", document.baseURI).href; + +export const importMetaUrl = /* @__PURE__ */ getImportMetaUrl() diff --git a/sdk/typescript/node_modules/tsup/assets/esm_shims.js b/sdk/typescript/node_modules/tsup/assets/esm_shims.js new file mode 100644 index 0000000..c2c05d7 --- /dev/null +++ b/sdk/typescript/node_modules/tsup/assets/esm_shims.js @@ -0,0 +1,9 @@ +// Shim globals in esm bundle +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const getFilename = () => fileURLToPath(import.meta.url) +const getDirname = () => path.dirname(getFilename()) + +export const __dirname = /* @__PURE__ */ getDirname() +export const __filename = /* @__PURE__ */ getFilename() diff --git a/sdk/typescript/node_modules/tsup/assets/package.json b/sdk/typescript/node_modules/tsup/assets/package.json new file mode 100644 index 0000000..a438291 --- /dev/null +++ b/sdk/typescript/node_modules/tsup/assets/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/sdk/typescript/node_modules/tsup/package.json b/sdk/typescript/node_modules/tsup/package.json new file mode 100644 index 0000000..63a3118 --- /dev/null +++ b/sdk/typescript/node_modules/tsup/package.json @@ -0,0 +1,99 @@ +{ + "name": "tsup", + "version": "8.5.1", + "description": "Bundle your TypeScript library with no config, powered by esbuild", + "license": "MIT", + "homepage": "https://tsup.egoist.dev/", + "repository": { + "type": "git", + "url": "https://github.com/egoist/tsup.git" + }, + "author": "EGOIST", + "files": [ + "/assets", + "/dist", + "/schema.json" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + }, + "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.27.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "^0.7.6", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "devDependencies": { + "@microsoft/api-extractor": "^7.50.0", + "@rollup/plugin-json": "6.1.0", + "@swc/core": "1.10.18", + "@types/debug": "4.1.12", + "@types/node": "22.13.4", + "@types/resolve": "1.20.6", + "bumpp": "^10.0.3", + "flat": "6.0.1", + "postcss": "8.5.2", + "postcss-simple-vars": "7.0.1", + "prettier": "3.5.1", + "resolve": "1.22.10", + "rollup-plugin-dts": "6.1.1", + "sass": "1.85.0", + "strip-json-comments": "5.0.1", + "svelte": "5.19.9", + "svelte-preprocess": "6.0.3", + "terser": "^5.39.0", + "ts-essentials": "10.0.4", + "tsup": "8.3.6", + "typescript": "5.7.3", + "vitest": "3.0.6", + "wait-for-expect": "3.0.2" + }, + "engines": { + "node": ">=18" + }, + "scripts": { + "dev": "pnpm run build-fast --watch", + "build": "tsup src/cli-*.ts src/index.ts src/rollup.ts --clean --splitting", + "test": "pnpm run build && pnpm run test-only", + "format": "prettier --write .", + "test-only": "vitest run", + "build-fast": "pnpm run build --no-dts", + "release": "bumpp" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/tsup/schema.json b/sdk/typescript/node_modules/tsup/schema.json new file mode 100644 index 0000000..4dd3008 --- /dev/null +++ b/sdk/typescript/node_modules/tsup/schema.json @@ -0,0 +1,362 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "tsup", + "version": 1.1, + "anyOf": [ + { + "type": "object", + "required": ["tsup"], + "additionalProperties": true, + "properties": { + "tsup": { + "type": ["object", "array"], + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "$ref": "#/definitions/options" + }, + { + "type": "array", + "items": { + "additionalProperties": false, + "$ref": "#/definitions/options" + } + } + ] + } + } + }, + { + "type": ["object", "array"], + "oneOf": [ + { + "type": "object", + "$ref": "#/definitions/options" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/options" + } + } + ] + } + ], + "definitions": { + "options": { + "type": "object", + "markdownDescription": "Configuration options for [tsup](https://tsup.egoist.dev)", + "properties": { + "entry": { + "markdownDescription": "Files that each serve as an input to the bundling algorithm.\n\n---\nReferences:\n- [Entry Points](https://esbuild.github.io/api/#entry-points) - esbuild\n - [Multiple Entrypoints](https://tsup.egoist.dev/#multiple-entrypoints) - tsup", + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "object" + } + ] + }, + "treeshake": { + "markdownDescription": "By default esbuild already does treeshaking but this option allow you to perform additional treeshaking with Rollup and result in smaller bundle size.", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": ["smallest", "safest", "recommended"] + } + ] + }, + "name": { + "type": "string", + "description": "Optional config name to show in CLI output" + }, + "legacyOutput": { + "type": "boolean", + "description": "Output different formats to different folder instead of using different extension" + }, + "target": { + "markdownDescription": "This sets the target environment for the generated code\n\n---\nReferences:\n- [Target](https://esbuild.github.io/api/#target) - esbuild", + "default": "node14", + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "minify": { + "description": "When enabled, the generated code will be minified instead of pretty-printed.", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": ["terser"] + } + ] + }, + "minifyWhitespace": { + "type": "boolean" + }, + "minifyIdentifiers": { + "type": "boolean" + }, + "minifySyntax": { + "type": "boolean" + }, + "keepNames": { + "type": "boolean" + }, + "watch": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": ["string", "boolean"] + } + } + ] + }, + "ignoreWatch": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "onSuccess": { + "type": "string" + }, + "jsxFactory": { + "type": "string" + }, + "jsxFragment": { + "type": "string" + }, + "outDir": { + "type": "string" + }, + "format": { + "oneOf": [ + { + "enum": ["cjs", "iife", "esm"], + "type": "string" + }, + { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "enum": ["cjs", "iife", "esm"] + } + } + ] + }, + "swc": { + "type": "object" + }, + "globalName": { + "type": "string" + }, + "env": { + "type": "object" + }, + "define": { + "type": "object" + }, + "dts": { + "markdownDescription": "This will emit `./dist/index.js` and `./dist/index.d.ts`.\n\nIf you have multiple entry files, each entry will get a corresponding `.d.ts` file. So when you only want to generate declaration file for a single entry, use `--dts ` format, e.g. `--dts src/index.ts`.\n\n**Note** that `--dts` does not resolve external (aka in node_modules) types used in the `.d.ts file`, if that's somehow a requirement, try the experimental `--dts-resolve` flag instead.", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "type": "object", + "properties": { + "entry": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + } + } + } + ] + }, + "sourcemap": { + "oneOf": [ + { + "type": "boolean" + }, + { + "enum": ["inline"] + } + ] + }, + "noExternal": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Always bundle modules matching given patterns" + }, + "external": { + "description": "Don't bundle these modules", + "type": "array", + "items": { + "type": "string" + } + }, + "replaceNodeEnv": { + "type": "boolean", + "markdownDescription": "Replace `process.env.NODE_ENV` with `production` or `development` `production` when the bundled is minified, `development` otherwise" + }, + "splitting": { + "type": "boolean", + "default": true, + "markdownDescription": "You may want to disable code splitting sometimes: [`#255`](https://github.com/egoist/tsup/issues/255)" + }, + "clean": { + "description": "Clean output directory before each buil", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "silent": { + "type": "boolean", + "description": "Suppress non-error logs (excluding \"onSuccess\" process output)" + }, + "skipNodeModulesBundle": { + "type": "boolean", + "description": "Skip node_modules bundling" + }, + "pure": { + "markdownDescription": "See:\n- [Pure](https://esbuild.github.io/api/#pure) - esbuild", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "bundle": { + "default": true, + "type": "boolean", + "description": "Disable bundling, default to true" + }, + "inject": { + "markdownDescription": "This option allows you to automatically replace a global variable with an import from another file.\n\n---\nSee:\n- [Inject](https://esbuild.github.io/api/#inject) - esbuild", + "type": "array", + "items": { + "type": "string" + } + }, + "metafile": { + "type": "boolean", + "markdownDescription": "Emit esbuild metafile.\n\n---\nSee:\n- [Metafile](https://esbuild.github.io/api/#metafile) - esbuild" + }, + "footer": { + "type": "object", + "properties": { + "js": { + "type": "string" + }, + "css": { + "type": "string" + } + } + }, + "banner": { + "type": "object", + "properties": { + "js": { + "type": "string" + }, + "css": { + "type": "string" + } + } + }, + "platform": { + "description": "Target platform", + "type": "string", + "default": "node", + "enum": ["node", "browser", "neutral"] + }, + "config": { + "markdownDescription": "Disable config file with `false` or pass a custom config filename", + "type": ["boolean", "string"] + }, + "tsconfig": { + "type": "string", + "description": " Use a custom tsconfig" + }, + "injectStyle": { + "type": "boolean", + "default": false, + "description": "Inject CSS as style tags to document head" + }, + "shims": { + "type": "boolean", + "default": false, + "description": "Inject cjs and esm shims if needed" + } + } + } + } +} diff --git a/sdk/typescript/node_modules/typescript/LICENSE.txt b/sdk/typescript/node_modules/typescript/LICENSE.txt new file mode 100644 index 0000000..8746124 --- /dev/null +++ b/sdk/typescript/node_modules/typescript/LICENSE.txt @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/sdk/typescript/node_modules/typescript/README.md b/sdk/typescript/node_modules/typescript/README.md new file mode 100644 index 0000000..b6505f7 --- /dev/null +++ b/sdk/typescript/node_modules/typescript/README.md @@ -0,0 +1,50 @@ + +# TypeScript + +[![CI](https://github.com/microsoft/TypeScript/actions/workflows/ci.yml/badge.svg)](https://github.com/microsoft/TypeScript/actions/workflows/ci.yml) +[![npm version](https://badge.fury.io/js/typescript.svg)](https://www.npmjs.com/package/typescript) +[![Downloads](https://img.shields.io/npm/dm/typescript.svg)](https://www.npmjs.com/package/typescript) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/microsoft/TypeScript/badge)](https://securityscorecards.dev/viewer/?uri=github.com/microsoft/TypeScript) + + +[TypeScript](https://www.typescriptlang.org/) is a language for application-scale JavaScript. TypeScript adds optional types to JavaScript that support tools for large-scale JavaScript applications for any browser, for any host, on any OS. TypeScript compiles to readable, standards-based JavaScript. Try it out at the [playground](https://www.typescriptlang.org/play/), and stay up to date via [our blog](https://blogs.msdn.microsoft.com/typescript) and [Twitter account](https://twitter.com/typescript). + +Find others who are using TypeScript at [our community page](https://www.typescriptlang.org/community/). + +## Installing + +For the latest stable version: + +```bash +npm install -D typescript +``` + +For our nightly builds: + +```bash +npm install -D typescript@next +``` + +## Contribute + +There are many ways to [contribute](https://github.com/microsoft/TypeScript/blob/main/CONTRIBUTING.md) to TypeScript. +* [Submit bugs](https://github.com/microsoft/TypeScript/issues) and help us verify fixes as they are checked in. +* Review the [source code changes](https://github.com/microsoft/TypeScript/pulls). +* Engage with other TypeScript users and developers on [StackOverflow](https://stackoverflow.com/questions/tagged/typescript). +* Help each other in the [TypeScript Community Discord](https://discord.gg/typescript). +* Join the [#typescript](https://twitter.com/search?q=%23TypeScript) discussion on Twitter. +* [Contribute bug fixes](https://github.com/microsoft/TypeScript/blob/main/CONTRIBUTING.md). + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see +the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) +with any additional questions or comments. + +## Documentation + +* [TypeScript in 5 minutes](https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html) +* [Programming handbook](https://www.typescriptlang.org/docs/handbook/intro.html) +* [Homepage](https://www.typescriptlang.org/) + +## Roadmap + +For details on our planned features and future direction, please refer to our [roadmap](https://github.com/microsoft/TypeScript/wiki/Roadmap). diff --git a/sdk/typescript/node_modules/typescript/SECURITY.md b/sdk/typescript/node_modules/typescript/SECURITY.md new file mode 100644 index 0000000..b3c89ef --- /dev/null +++ b/sdk/typescript/node_modules/typescript/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). + + diff --git a/sdk/typescript/node_modules/typescript/ThirdPartyNoticeText.txt b/sdk/typescript/node_modules/typescript/ThirdPartyNoticeText.txt new file mode 100644 index 0000000..a857fb3 --- /dev/null +++ b/sdk/typescript/node_modules/typescript/ThirdPartyNoticeText.txt @@ -0,0 +1,193 @@ +/*!----------------- TypeScript ThirdPartyNotices ------------------------------------------------------- + +The TypeScript software incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +--------------------------------------------- +Third Party Code Components +-------------------------------------------- + +------------------- DefinitelyTyped -------------------- +This file is based on or incorporates material from the projects listed below (collectively "Third Party Code"). Microsoft is not the original author of the Third Party Code. The original copyright notice and the license, under which Microsoft received such Third Party Code, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft, not the third party, licenses the Third Party Code to you under the terms set forth in the EULA for the Microsoft Product. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. +DefinitelyTyped +This project is licensed under the MIT license. Copyrights are respective of each contributor listed at the beginning of each definition file. Provided for Informational Purposes Only + +MIT License +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------------- + +------------------- Unicode -------------------- +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, +http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and +http://www.unicode.org/utility/trac/browser/. + +Unicode Data Files do not include PDF online code charts under the +directory http://www.unicode.org/Public/. + +Software includes any source code published in the Unicode Standard +or under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, +http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and +http://www.unicode.org/utility/trac/browser/. + +NOTICE TO USER: Carefully read the following legal agreement. +BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. +IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1991-2017 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. +------------------------------------------------------------------------------------- + +-------------------Document Object Model----------------------------- +DOM + +W3C License +This work is being provided by the copyright holders under the following license. +By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. +Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following +on ALL copies of the work or portions thereof, including modifications: +* The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. +* Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included. +* Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived +from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)." +Disclaimers +THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR +FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT. +The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. +Title to copyright in this work will at all times remain with copyright holders. + +--------- + +DOM +Copyright © 2018 WHATWG (Apple, Google, Mozilla, Microsoft). This work is licensed under a Creative Commons Attribution 4.0 International License: Attribution 4.0 International +======================================================================= +Creative Commons Corporation ("Creative Commons") is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an "as-is" basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: + +wiki.creativecommons.org/Considerations_for_licensors Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor's permission is not necessary for any reason--for example, because of any applicable exception or limitation to copyright--then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More_considerations for the public: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= +Creative Commons Attribution 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 -- Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 -- Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: a. reproduce and Share the Licensed Material, in whole or in part; and b. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. 5. Downstream recipients. a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. b. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 -- License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: a. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. Section 4 -- Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 -- Disclaimer of Warranties and Limitation of Liability. a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 -- Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 -- Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 -- Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. ======================================================================= Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the "Licensor." Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. + +-------------------------------------------------------------------------------- + +----------------------Web Background Synchronization------------------------------ + +Web Background Synchronization Specification +Portions of spec © by W3C + +W3C Community Final Specification Agreement +To secure commitments from participants for the full text of a Community or Business Group Report, the group may call for voluntary commitments to the following terms; a "summary" is +available. See also the related "W3C Community Contributor License Agreement". +1. The Purpose of this Agreement. +This Agreement sets forth the terms under which I make certain copyright and patent rights available to you for your implementation of the Specification. +Any other capitalized terms not specifically defined herein have the same meaning as those terms have in the "W3C Patent Policy", and if not defined there, in the "W3C Process Document". +2. Copyrights. +2.1. Copyright Grant. I grant to you a perpetual (for the duration of the applicable copyright), worldwide, non-exclusive, no-charge, royalty-free, copyright license, without any obligation for accounting to me, to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, distribute, and implement the Specification to the full extent of my copyright interest in the Specification. +2.2. Attribution. As a condition of the copyright grant, you must include an attribution to the Specification in any derivative work you make based on the Specification. That attribution must include, at minimum, the Specification name and version number. +3. Patents. +3.1. Patent Licensing Commitment. I agree to license my Essential Claims under the W3C Community RF Licensing Requirements. This requirement includes Essential Claims that I own and any that I have the right to license without obligation of payment or other consideration to an unrelated third party. W3C Community RF Licensing Requirements obligations made concerning the Specification and described in this policy are binding on me for the life of the patents in question and encumber the patents containing Essential Claims, regardless of changes in participation status or W3C Membership. I also agree to license my Essential Claims under the W3C Community RF Licensing Requirements in derivative works of the Specification so long as all normative portions of the Specification are maintained and that this licensing commitment does not extend to any portion of the derivative work that was not included in the Specification. +3.2. Optional, Additional Patent Grant. In addition to the provisions of Section 3.1, I may also, at my option, make certain intellectual property rights infringed by implementations of the Specification, including Essential Claims, available by providing those terms via the W3C Web site. +4. No Other Rights. Except as specifically set forth in this Agreement, no other express or implied patent, trademark, copyright, or other property rights are granted under this Agreement, including by implication, waiver, or estoppel. +5. Antitrust Compliance. I acknowledge that I may compete with other participants, that I am under no obligation to implement the Specification, that each participant is free to develop competing technologies and standards, and that each party is free to license its patent rights to third parties, including for the purpose of enabling competing technologies and standards. +6. Non-Circumvention. I agree that I will not intentionally take or willfully assist any third party to take any action for the purpose of circumventing my obligations under this Agreement. +7. Transition to W3C Recommendation Track. The Specification developed by the Project may transition to the W3C Recommendation Track. The W3C Team is responsible for notifying me that a Corresponding Working Group has been chartered. I have no obligation to join the Corresponding Working Group. If the Specification developed by the Project transitions to the W3C Recommendation Track, the following terms apply: +7.1. If I join the Corresponding Working Group. If I join the Corresponding Working Group, I will be subject to all W3C rules, obligations, licensing commitments, and policies that govern that Corresponding Working Group. +7.2. If I Do Not Join the Corresponding Working Group. +7.2.1. Licensing Obligations to Resulting Specification. If I do not join the Corresponding Working Group, I agree to offer patent licenses according to the W3C Royalty-Free licensing requirements described in Section 5 of the W3C Patent Policy for the portions of the Specification included in the resulting Recommendation. This licensing commitment does not extend to any portion of an implementation of the Recommendation that was not included in the Specification. This licensing commitment may not be revoked but may be modified through the exclusion process defined in Section 4 of the W3C Patent Policy. I am not required to join the Corresponding Working Group to exclude patents from the W3C Royalty-Free licensing commitment, but must otherwise follow the normal exclusion procedures defined by the W3C Patent Policy. The W3C Team will notify me of any Call for Exclusion in the Corresponding Working Group as set forth in Section 4.5 of the W3C Patent Policy. +7.2.2. No Disclosure Obligation. If I do not join the Corresponding Working Group, I have no patent disclosure obligations outside of those set forth in Section 6 of the W3C Patent Policy. +8. Conflict of Interest. I will disclose significant relationships when those relationships might reasonably be perceived as creating a conflict of interest with my role. I will notify W3C of any change in my affiliation using W3C-provided mechanisms. +9. Representations, Warranties and Disclaimers. I represent and warrant that I am legally entitled to grant the rights and promises set forth in this Agreement. IN ALL OTHER RESPECTS THE SPECIFICATION IS PROVIDED “AS IS.” The entire risk as to implementing or otherwise using the Specification is assumed by the implementer and user. Except as stated herein, I expressly disclaim any warranties (express, implied, or otherwise), including implied warranties of merchantability, non-infringement, fitness for a particular purpose, or title, related to the Specification. IN NO EVENT WILL ANY PARTY BE LIABLE TO ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF ACTION OF ANY KIND WITH RESPECT TO THIS AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR NOT THE OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. All of my obligations under Section 3 regarding the transfer, successors in interest, or assignment of Granted Claims will be satisfied if I notify the transferee or assignee of any patent that I know contains Granted Claims of the obligations under Section 3. Nothing in this Agreement requires me to undertake a patent search. +10. Definitions. +10.1. Agreement. “Agreement” means this W3C Community Final Specification Agreement. +10.2. Corresponding Working Group. “Corresponding Working Group” is a W3C Working Group that is chartered to develop a Recommendation, as defined in the W3C Process Document, that takes the Specification as an input. +10.3. Essential Claims. “Essential Claims” shall mean all claims in any patent or patent application in any jurisdiction in the world that would necessarily be infringed by implementation of the Specification. A claim is necessarily infringed hereunder only when it is not possible to avoid infringing it because there is no non-infringing alternative for implementing the normative portions of the Specification. Existence of a non-infringing alternative shall be judged based on the state of the art at the time of the publication of the Specification. The following are expressly excluded from and shall not be deemed to constitute Essential Claims: +10.3.1. any claims other than as set forth above even if contained in the same patent as Essential Claims; and +10.3.2. claims which would be infringed only by: +portions of an implementation that are not specified in the normative portions of the Specification, or +enabling technologies that may be necessary to make or use any product or portion thereof that complies with the Specification and are not themselves expressly set forth in the Specification (e.g., semiconductor manufacturing technology, compiler technology, object-oriented technology, basic operating system technology, and the like); or +the implementation of technology developed elsewhere and merely incorporated by reference in the body of the Specification. +10.3.3. design patents and design registrations. +For purposes of this definition, the normative portions of the Specification shall be deemed to include only architectural and interoperability requirements. Optional features in the RFC 2119 sense are considered normative unless they are specifically identified as informative. Implementation examples or any other material that merely illustrate the requirements of the Specification are informative, rather than normative. +10.4. I, Me, or My. “I,” “me,” or “my” refers to the signatory. +10.5 Project. “Project” means the W3C Community Group or Business Group for which I executed this Agreement. +10.6. Specification. “Specification” means the Specification identified by the Project as the target of this agreement in a call for Final Specification Commitments. W3C shall provide the authoritative mechanisms for the identification of this Specification. +10.7. W3C Community RF Licensing Requirements. “W3C Community RF Licensing Requirements” license shall mean a non-assignable, non-sublicensable license to make, have made, use, sell, have sold, offer to sell, import, and distribute and dispose of implementations of the Specification that: +10.7.1. shall be available to all, worldwide, whether or not they are W3C Members; +10.7.2. shall extend to all Essential Claims owned or controlled by me; +10.7.3. may be limited to implementations of the Specification, and to what is required by the Specification; +10.7.4. may be conditioned on a grant of a reciprocal RF license (as defined in this policy) to all Essential Claims owned or controlled by the licensee. A reciprocal license may be required to be available to all, and a reciprocal license may itself be conditioned on a further reciprocal license from all. +10.7.5. may not be conditioned on payment of royalties, fees or other consideration; +10.7.6. may be suspended with respect to any licensee when licensor issued by licensee for infringement of claims essential to implement the Specification or any W3C Recommendation; +10.7.7. may not impose any further conditions or restrictions on the use of any technology, intellectual property rights, or other restrictions on behavior of the licensee, but may include reasonable, customary terms relating to operation or maintenance of the license relationship such as the following: choice of law and dispute resolution; +10.7.8. shall not be considered accepted by an implementer who manifests an intent not to accept the terms of the W3C Community RF Licensing Requirements license as offered by the licensor. +10.7.9. The RF license conforming to the requirements in this policy shall be made available by the licensor as long as the Specification is in effect. The term of such license shall be for the life of the patents in question. +I am encouraged to provide a contact from which licensing information can be obtained and other relevant licensing information. Any such information will be made publicly available. +10.8. You or Your. “You,” “you,” or “your” means any person or entity who exercises copyright or patent rights granted under this Agreement, and any person that person or entity controls. + +------------------------------------------------------------------------------------- + +------------------- WebGL ----------------------------- +Copyright (c) 2018 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Materials. + +THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +------------------------------------------------------ + +------------- End of ThirdPartyNotices ------------------------------------------- */ + diff --git a/sdk/typescript/node_modules/typescript/bin/tsc b/sdk/typescript/node_modules/typescript/bin/tsc new file mode 100644 index 0000000..19c62bf --- /dev/null +++ b/sdk/typescript/node_modules/typescript/bin/tsc @@ -0,0 +1,2 @@ +#!/usr/bin/env node +require('../lib/tsc.js') diff --git a/sdk/typescript/node_modules/typescript/bin/tsserver b/sdk/typescript/node_modules/typescript/bin/tsserver new file mode 100644 index 0000000..7143b6a --- /dev/null +++ b/sdk/typescript/node_modules/typescript/bin/tsserver @@ -0,0 +1,2 @@ +#!/usr/bin/env node +require('../lib/tsserver.js') diff --git a/sdk/typescript/node_modules/typescript/package.json b/sdk/typescript/node_modules/typescript/package.json new file mode 100644 index 0000000..cccb75d --- /dev/null +++ b/sdk/typescript/node_modules/typescript/package.json @@ -0,0 +1,120 @@ +{ + "name": "typescript", + "author": "Microsoft Corp.", + "homepage": "https://www.typescriptlang.org/", + "version": "5.9.3", + "license": "Apache-2.0", + "description": "TypeScript is a language for application scale JavaScript development", + "keywords": [ + "TypeScript", + "Microsoft", + "compiler", + "language", + "javascript" + ], + "bugs": { + "url": "https://github.com/microsoft/TypeScript/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/TypeScript.git" + }, + "main": "./lib/typescript.js", + "typings": "./lib/typescript.d.ts", + "bin": { + "tsc": "./bin/tsc", + "tsserver": "./bin/tsserver" + }, + "engines": { + "node": ">=14.17" + }, + "files": [ + "bin", + "lib", + "!lib/enu", + "LICENSE.txt", + "README.md", + "SECURITY.md", + "ThirdPartyNoticeText.txt", + "!**/.gitattributes" + ], + "devDependencies": { + "@dprint/formatter": "^0.4.1", + "@dprint/typescript": "0.93.4", + "@esfx/canceltoken": "^1.0.0", + "@eslint/js": "^9.20.0", + "@octokit/rest": "^21.1.1", + "@types/chai": "^4.3.20", + "@types/diff": "^7.0.1", + "@types/minimist": "^1.2.5", + "@types/mocha": "^10.0.10", + "@types/ms": "^0.7.34", + "@types/node": "latest", + "@types/source-map-support": "^0.5.10", + "@types/which": "^3.0.4", + "@typescript-eslint/rule-tester": "^8.24.1", + "@typescript-eslint/type-utils": "^8.24.1", + "@typescript-eslint/utils": "^8.24.1", + "azure-devops-node-api": "^14.1.0", + "c8": "^10.1.3", + "chai": "^4.5.0", + "chokidar": "^4.0.3", + "diff": "^7.0.0", + "dprint": "^0.49.0", + "esbuild": "^0.25.0", + "eslint": "^9.20.1", + "eslint-formatter-autolinkable-stylish": "^1.4.0", + "eslint-plugin-regexp": "^2.7.0", + "fast-xml-parser": "^4.5.2", + "glob": "^10.4.5", + "globals": "^15.15.0", + "hereby": "^1.10.0", + "jsonc-parser": "^3.3.1", + "knip": "^5.44.4", + "minimist": "^1.2.8", + "mocha": "^10.8.2", + "mocha-fivemat-progress-reporter": "^0.1.0", + "monocart-coverage-reports": "^2.12.1", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "playwright": "^1.50.1", + "source-map-support": "^0.5.21", + "tslib": "^2.8.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.24.1", + "which": "^3.0.1" + }, + "overrides": { + "typescript@*": "$typescript" + }, + "scripts": { + "test": "hereby runtests-parallel --light=false", + "test:eslint-rules": "hereby run-eslint-rules-tests", + "build": "npm run build:compiler && npm run build:tests", + "build:compiler": "hereby local", + "build:tests": "hereby tests", + "build:tests:notypecheck": "hereby tests --no-typecheck", + "clean": "hereby clean", + "gulp": "hereby", + "lint": "hereby lint", + "knip": "hereby knip", + "format": "dprint fmt", + "setup-hooks": "node scripts/link-hooks.mjs" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "crypto": false, + "buffer": false, + "source-map-support": false, + "inspector": false, + "perf_hooks": false + }, + "packageManager": "npm@8.19.4", + "volta": { + "node": "20.1.0", + "npm": "8.19.4" + }, + "gitHead": "c63de15a992d37f0d6cec03ac7631872838602cb" +} diff --git a/sdk/typescript/node_modules/vite-node/LICENSE b/sdk/typescript/node_modules/vite-node/LICENSE new file mode 100644 index 0000000..5ae481f --- /dev/null +++ b/sdk/typescript/node_modules/vite-node/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-Present Vitest Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/typescript/node_modules/vite-node/README.md b/sdk/typescript/node_modules/vite-node/README.md new file mode 100644 index 0000000..00340f6 --- /dev/null +++ b/sdk/typescript/node_modules/vite-node/README.md @@ -0,0 +1,186 @@ +

+ +

+ +

+vite-node +

+

+Vite as Node runtime.
The engine that powers Vitest and Nuxt 3 Dev SSR. +

+

+ +

+ +## Features + +- On-demand evaluation +- Vite's pipeline, plugins, resolve, aliasing +- Out-of-box ESM & TypeScript support +- Respect `vite.config.ts` +- Hot module replacement (HMR) +- Separate server/client architecture +- Top-level `await` +- Shims for `__dirname` and `__filename` in ESM +- Access to native node modules like `fs`, `path`, etc. + +## CLI Usage + +Run JS/TS file on Node.js using Vite's resolvers and transformers. + +```bash +npx vite-node index.ts +``` + +Options: + +```bash +npx vite-node -h +``` + +### Options via CLI + +[All `ViteNodeServer` options](https://github.com/vitest-dev/vitest/blob/main/packages/vite-node/src/types.ts#L92-L111) are supported by the CLI. They may be defined through the dot syntax, as shown below: + +```bash +npx vite-node --options.deps.inline="module-name" --options.deps.external="/module-regexp/" index.ts +``` + +Note that for options supporting RegExps, strings passed to the CLI must start _and_ end with a `/`; + +### Hashbang + +If you prefer to write scripts that don't need to be passed into Vite Node, you can declare it in the [hashbang](https://bash.cyberciti.biz/guide/Shebang). + +Simply add `#!/usr/bin/env vite-node --script` at the top of your file: + +_file.ts_ +```ts +#!/usr/bin/env vite-node --script + +console.log('argv:', process.argv.slice(2)) +``` + +And make the file executable: +```sh +chmod +x ./file.ts +``` + +Now, you can run the file without passing it into Vite Node: +```sh +$ ./file.ts hello +argv: [ 'hello' ] +``` + +Note that when using the `--script` option, Vite Node forwards every argument and option to the script to execute, even the one supported by Vite Node itself. + +## Programmatic Usage + +In Vite Node, the server and runner (client) are separated, so you can integrate them in different contexts (workers, cross-process, or remote) if needed. The demo below shows a simple example of having both (server and runner) running in the same context + +```ts +import { createServer } from 'vite' +import { ViteNodeServer } from 'vite-node/server' +import { ViteNodeRunner } from 'vite-node/client' +import { installSourcemapsSupport } from 'vite-node/source-map' + +// create vite server +const server = await createServer({ + optimizeDeps: { + // It's recommended to disable deps optimization + disabled: true, + }, +}) +// this is need to initialize the plugins +await server.pluginContainer.buildStart({}) + +// create vite-node server +const node = new ViteNodeServer(server) + +// fixes stacktraces in Errors +installSourcemapsSupport({ + getSourceMap: source => node.getSourceMap(source), +}) + +// create vite-node runner +const runner = new ViteNodeRunner({ + root: server.config.root, + base: server.config.base, + // when having the server and runner in a different context, + // you will need to handle the communication between them + // and pass to this function + fetchModule(id) { + return node.fetchModule(id) + }, + resolveId(id, importer) { + return node.resolveId(id, importer) + }, +}) + +// execute the file +await runner.executeFile('./example.ts') + +// close the vite server +await server.close() +``` + +## Debugging + +### Debug Transformation + +Sometimes you might want to inspect the transformed code to investigate issues. You can set environment variable `VITE_NODE_DEBUG_DUMP=true` to let vite-node write the transformed result of each module under `.vite-node/dump`. + +If you want to debug by modifying the dumped code, you can change the value of `VITE_NODE_DEBUG_DUMP` to `load` and search for the dumped files and use them for executing. + +```bash +VITE_NODE_DEBUG_DUMP=load vite-node example.ts +``` + +Or programmatically: + +```js +import { ViteNodeServer } from 'vite-node/server' + +const server = new ViteNodeServer(viteServer, { + debug: { + dumpModules: true, + loadDumppedModules: true, + } +}) +``` + +### Debug Execution + +If the process gets stuck, it might be because there are unresolvable circular dependencies. You can set `VITE_NODE_DEBUG_RUNNER=true` for vite-node to warn about this. + +```bash +VITE_NODE_DEBUG_RUNNER=true vite-node example.ts +``` + +Or programmatically: + +```js +import { ViteNodeRunner } from 'vite-node/client' + +const runner = new ViteNodeRunner({ + debug: true +}) +``` + +## Credits + +Based on [@pi0](https://github.com/pi0)'s brilliant idea of having a Vite server as the on-demand transforming service for [Nuxt's Vite SSR](https://github.com/nuxt/vite/pull/201). + +Thanks [@brillout](https://github.com/brillout) for kindly sharing this package name. + +## Sponsors + +

+ + + +

+ +## License + +[MIT](./LICENSE) License © 2021 [Anthony Fu](https://github.com/antfu) diff --git a/sdk/typescript/node_modules/vite-node/node_modules/pathe/LICENSE b/sdk/typescript/node_modules/vite-node/node_modules/pathe/LICENSE new file mode 100644 index 0000000..743af99 --- /dev/null +++ b/sdk/typescript/node_modules/vite-node/node_modules/pathe/LICENSE @@ -0,0 +1,44 @@ +MIT License + +Copyright (c) Pooya Parsa - Daniel Roe + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sdk/typescript/node_modules/vite-node/node_modules/pathe/README.md b/sdk/typescript/node_modules/vite-node/node_modules/pathe/README.md new file mode 100644 index 0000000..a2af0fd --- /dev/null +++ b/sdk/typescript/node_modules/vite-node/node_modules/pathe/README.md @@ -0,0 +1,69 @@ +# 🛣️ pathe + +> Universal filesystem path utils + +[![version][npm-v-src]][npm-v-href] +[![downloads][npm-d-src]][npm-d-href] +[![size][size-src]][size-href] + +> **❓ Why** +> +> For [historical reasons](https://docs.microsoft.com/en-us/archive/blogs/larryosterman/why-is-the-dos-path-character), windows followed MS-DOS and using backslash for separating paths rather than slash used for macOS, Linux, and other Posix operating systems. Nowadays, [Windows](https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN) supports both Slash and Backslash for paths. [Node.js's built in `path` module](https://nodejs.org/api/path.html) in the default operation of the path module varies based on the operating system on which a Node.js application is running. Specifically, when running on a Windows operating system, the path module will assume that Windows-style paths are being used. **This makes inconsistent code behavior between Windows and POSIX.** +> Compared to popular [upath](https://github.com/anodynos/upath), pathe is providing **identical exports** of Node.js with normalization on **all operations** and written in modern **ESM/Typescript** and has **no dependency on Node.js**! + +This package is a drop-in replacement of the Node.js's [path module](https://nodejs.org/api/path.html) module and ensures paths are normalized with slash `/` and work in environments including Node.js. + +## 💿 Usage + +Install using npm or yarn: + +```bash +# npm +npm i pathe + +# yarn +yarn add pathe + +# pnpm +pnpm i pathe +``` + +Import: + +```js +// ESM / Typescript +import { resolve } from 'pathe' + +// CommonJS +const { resolve } = require('pathe') +``` + +Read more about path utils from [Node.js documentation](https://nodejs.org/api/path.html) and rest assured behavior is ALWAYS like POSIX regardless of your input paths format and running platform! + +### Extra utilties + +Pathe exports some extra utilities that do not exist in standard Node.js [path module](https://nodejs.org/api/path.html). +In order to use them, you can import from `pathe/utils` subpath: + +```js +import { filename, normalizeAliases, resolveAlias } from 'pathe/utils' +``` + +## License + +MIT. Made with 💖 + +Some code used from Node.js project. See [LICENSE](./LICENSE). + + +[npm-v-src]: https://img.shields.io/npm/v/pathe?style=flat-square +[npm-v-href]: https://npmjs.com/package/pathe + +[npm-d-src]: https://img.shields.io/npm/dm/pathe?style=flat-square +[npm-d-href]: https://npmjs.com/package/pathe + +[github-actions-src]: https://img.shields.io/github/workflow/status/unjs/pathe/ci/main?style=flat-square +[github-actions-href]: https://github.com/unjs/pathe/actions?query=workflow%3Aci + +[size-src]: https://packagephobia.now.sh/badge?p=pathe +[size-href]: https://packagephobia.now.sh/result?p=pathe diff --git a/sdk/typescript/node_modules/vite-node/node_modules/pathe/package.json b/sdk/typescript/node_modules/vite-node/node_modules/pathe/package.json new file mode 100644 index 0000000..1b14f7d --- /dev/null +++ b/sdk/typescript/node_modules/vite-node/node_modules/pathe/package.json @@ -0,0 +1,48 @@ +{ + "name": "pathe", + "version": "1.1.2", + "description": "Universal filesystem path utils", + "repository": "unjs/pathe", + "license": "MIT", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./utils": { + "types": "./dist/utils.d.ts", + "import": "./dist/utils.mjs", + "require": "./dist/utils.cjs" + } + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.ts", + "files": [ + "dist", + "utils.d.ts" + ], + "devDependencies": { + "@types/node": "^20.10.8", + "@vitest/coverage-v8": "^1.1.3", + "changelogen": "^0.5.5", + "eslint": "^8.56.0", + "eslint-config-unjs": "^0.2.1", + "jiti": "^1.21.0", + "prettier": "^3.1.1", + "typescript": "^5.3.3", + "unbuild": "^2.0.0", + "vitest": "^1.1.3" + }, + "packageManager": "pnpm@8.14.0", + "scripts": { + "build": "unbuild", + "dev": "vitest", + "lint": "eslint --ext .ts . && prettier -c src test", + "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test -w", + "release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags", + "test": "pnpm lint && vitest run --coverage", + "test:types": "tsc --noEmit" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/vite-node/node_modules/pathe/utils.d.ts b/sdk/typescript/node_modules/vite-node/node_modules/pathe/utils.d.ts new file mode 100644 index 0000000..59cabd3 --- /dev/null +++ b/sdk/typescript/node_modules/vite-node/node_modules/pathe/utils.d.ts @@ -0,0 +1 @@ +export * from "./dist/utils"; diff --git a/sdk/typescript/node_modules/vite-node/package.json b/sdk/typescript/node_modules/vite-node/package.json new file mode 100644 index 0000000..979fbd0 --- /dev/null +++ b/sdk/typescript/node_modules/vite-node/package.json @@ -0,0 +1,95 @@ +{ + "name": "vite-node", + "type": "module", + "version": "1.6.1", + "description": "Vite as Node.js runtime", + "author": "Anthony Fu ", + "license": "MIT", + "funding": "https://opencollective.com/vitest", + "homepage": "https://github.com/vitest-dev/vitest/blob/main/packages/vite-node#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/vite-node" + }, + "bugs": { + "url": "https://github.com/vitest-dev/vitest/issues" + }, + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./client": { + "types": "./dist/client.d.ts", + "import": "./dist/client.mjs", + "require": "./dist/client.cjs" + }, + "./server": { + "types": "./dist/server.d.ts", + "import": "./dist/server.mjs", + "require": "./dist/server.cjs" + }, + "./utils": { + "types": "./dist/utils.d.ts", + "import": "./dist/utils.mjs", + "require": "./dist/utils.cjs" + }, + "./hmr": { + "types": "./dist/hmr.d.ts", + "import": "./dist/hmr.mjs", + "require": "./dist/hmr.cjs" + }, + "./source-map": { + "types": "./dist/source-map.d.ts", + "import": "./dist/source-map.mjs", + "require": "./dist/source-map.cjs" + }, + "./constants": { + "types": "./dist/constants.d.ts", + "import": "./dist/constants.mjs", + "require": "./dist/constants.cjs" + }, + "./*": "./*" + }, + "main": "./dist/index.mjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "*": [ + "./dist/*", + "./dist/index.d.ts" + ] + } + }, + "bin": { + "vite-node": "./vite-node.mjs" + }, + "files": [ + "*.d.ts", + "*.mjs", + "dist" + ], + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "devDependencies": { + "@jridgewell/trace-mapping": "^0.3.22", + "@types/debug": "^4.1.12" + }, + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch --watch.include 'src/**' -m inline", + "typecheck": "tsc --noEmit" + } +} \ No newline at end of file diff --git a/sdk/typescript/node_modules/vite-node/vite-node.mjs b/sdk/typescript/node_modules/vite-node/vite-node.mjs new file mode 100644 index 0000000..38bbdf5 --- /dev/null +++ b/sdk/typescript/node_modules/vite-node/vite-node.mjs @@ -0,0 +1,2 @@ +#!/usr/bin/env node +import('./dist/cli.mjs') diff --git a/sdk/typescript/node_modules/vite/LICENSE.md b/sdk/typescript/node_modules/vite/LICENSE.md new file mode 100644 index 0000000..70af4f8 --- /dev/null +++ b/sdk/typescript/node_modules/vite/LICENSE.md @@ -0,0 +1,3423 @@ +# Vite core license +Vite is released under the MIT license: + +MIT License + +Copyright (c) 2019-present, VoidZero Inc. and Vite contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +# Licenses of bundled dependencies +The published Vite artifact additionally contains code with the following licenses: +Apache-2.0, BSD-2-Clause, BlueOak-1.0.0, CC0-1.0, ISC, MIT + +# Bundled dependencies: +## @ampproject/remapping +License: Apache-2.0 +By: Justin Ridgewell +Repository: git+https://github.com/ampproject/remapping.git + +> Apache License +> Version 2.0, January 2004 +> http://www.apache.org/licenses/ +> +> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +> +> 1. Definitions. +> +> "License" shall mean the terms and conditions for use, reproduction, +> and distribution as defined by Sections 1 through 9 of this document. +> +> "Licensor" shall mean the copyright owner or entity authorized by +> the copyright owner that is granting the License. +> +> "Legal Entity" shall mean the union of the acting entity and all +> other entities that control, are controlled by, or are under common +> control with that entity. For the purposes of this definition, +> "control" means (i) the power, direct or indirect, to cause the +> direction or management of such entity, whether by contract or +> otherwise, or (ii) ownership of fifty percent (50%) or more of the +> outstanding shares, or (iii) beneficial ownership of such entity. +> +> "You" (or "Your") shall mean an individual or Legal Entity +> exercising permissions granted by this License. +> +> "Source" form shall mean the preferred form for making modifications, +> including but not limited to software source code, documentation +> source, and configuration files. +> +> "Object" form shall mean any form resulting from mechanical +> transformation or translation of a Source form, including but +> not limited to compiled object code, generated documentation, +> and conversions to other media types. +> +> "Work" shall mean the work of authorship, whether in Source or +> Object form, made available under the License, as indicated by a +> copyright notice that is included in or attached to the work +> (an example is provided in the Appendix below). +> +> "Derivative Works" shall mean any work, whether in Source or Object +> form, that is based on (or derived from) the Work and for which the +> editorial revisions, annotations, elaborations, or other modifications +> represent, as a whole, an original work of authorship. For the purposes +> of this License, Derivative Works shall not include works that remain +> separable from, or merely link (or bind by name) to the interfaces of, +> the Work and Derivative Works thereof. +> +> "Contribution" shall mean any work of authorship, including +> the original version of the Work and any modifications or additions +> to that Work or Derivative Works thereof, that is intentionally +> submitted to Licensor for inclusion in the Work by the copyright owner +> or by an individual or Legal Entity authorized to submit on behalf of +> the copyright owner. For the purposes of this definition, "submitted" +> means any form of electronic, verbal, or written communication sent +> to the Licensor or its representatives, including but not limited to +> communication on electronic mailing lists, source code control systems, +> and issue tracking systems that are managed by, or on behalf of, the +> Licensor for the purpose of discussing and improving the Work, but +> excluding communication that is conspicuously marked or otherwise +> designated in writing by the copyright owner as "Not a Contribution." +> +> "Contributor" shall mean Licensor and any individual or Legal Entity +> on behalf of whom a Contribution has been received by Licensor and +> subsequently incorporated within the Work. +> +> 2. Grant of Copyright License. Subject to the terms and conditions of +> this License, each Contributor hereby grants to You a perpetual, +> worldwide, non-exclusive, no-charge, royalty-free, irrevocable +> copyright license to reproduce, prepare Derivative Works of, +> publicly display, publicly perform, sublicense, and distribute the +> Work and such Derivative Works in Source or Object form. +> +> 3. Grant of Patent License. Subject to the terms and conditions of +> this License, each Contributor hereby grants to You a perpetual, +> worldwide, non-exclusive, no-charge, royalty-free, irrevocable +> (except as stated in this section) patent license to make, have made, +> use, offer to sell, sell, import, and otherwise transfer the Work, +> where such license applies only to those patent claims licensable +> by such Contributor that are necessarily infringed by their +> Contribution(s) alone or by combination of their Contribution(s) +> with the Work to which such Contribution(s) was submitted. If You +> institute patent litigation against any entity (including a +> cross-claim or counterclaim in a lawsuit) alleging that the Work +> or a Contribution incorporated within the Work constitutes direct +> or contributory patent infringement, then any patent licenses +> granted to You under this License for that Work shall terminate +> as of the date such litigation is filed. +> +> 4. Redistribution. You may reproduce and distribute copies of the +> Work or Derivative Works thereof in any medium, with or without +> modifications, and in Source or Object form, provided that You +> meet the following conditions: +> +> (a) You must give any other recipients of the Work or +> Derivative Works a copy of this License; and +> +> (b) You must cause any modified files to carry prominent notices +> stating that You changed the files; and +> +> (c) You must retain, in the Source form of any Derivative Works +> that You distribute, all copyright, patent, trademark, and +> attribution notices from the Source form of the Work, +> excluding those notices that do not pertain to any part of +> the Derivative Works; and +> +> (d) If the Work includes a "NOTICE" text file as part of its +> distribution, then any Derivative Works that You distribute must +> include a readable copy of the attribution notices contained +> within such NOTICE file, excluding those notices that do not +> pertain to any part of the Derivative Works, in at least one +> of the following places: within a NOTICE text file distributed +> as part of the Derivative Works; within the Source form or +> documentation, if provided along with the Derivative Works; or, +> within a display generated by the Derivative Works, if and +> wherever such third-party notices normally appear. The contents +> of the NOTICE file are for informational purposes only and +> do not modify the License. You may add Your own attribution +> notices within Derivative Works that You distribute, alongside +> or as an addendum to the NOTICE text from the Work, provided +> that such additional attribution notices cannot be construed +> as modifying the License. +> +> You may add Your own copyright statement to Your modifications and +> may provide additional or different license terms and conditions +> for use, reproduction, or distribution of Your modifications, or +> for any such Derivative Works as a whole, provided Your use, +> reproduction, and distribution of the Work otherwise complies with +> the conditions stated in this License. +> +> 5. Submission of Contributions. Unless You explicitly state otherwise, +> any Contribution intentionally submitted for inclusion in the Work +> by You to the Licensor shall be under the terms and conditions of +> this License, without any additional terms or conditions. +> Notwithstanding the above, nothing herein shall supersede or modify +> the terms of any separate license agreement you may have executed +> with Licensor regarding such Contributions. +> +> 6. Trademarks. This License does not grant permission to use the trade +> names, trademarks, service marks, or product names of the Licensor, +> except as required for reasonable and customary use in describing the +> origin of the Work and reproducing the content of the NOTICE file. +> +> 7. Disclaimer of Warranty. Unless required by applicable law or +> agreed to in writing, Licensor provides the Work (and each +> Contributor provides its Contributions) on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +> implied, including, without limitation, any warranties or conditions +> of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +> PARTICULAR PURPOSE. You are solely responsible for determining the +> appropriateness of using or redistributing the Work and assume any +> risks associated with Your exercise of permissions under this License. +> +> 8. Limitation of Liability. In no event and under no legal theory, +> whether in tort (including negligence), contract, or otherwise, +> unless required by applicable law (such as deliberate and grossly +> negligent acts) or agreed to in writing, shall any Contributor be +> liable to You for damages, including any direct, indirect, special, +> incidental, or consequential damages of any character arising as a +> result of this License or out of the use or inability to use the +> Work (including but not limited to damages for loss of goodwill, +> work stoppage, computer failure or malfunction, or any and all +> other commercial damages or losses), even if such Contributor +> has been advised of the possibility of such damages. +> +> 9. Accepting Warranty or Additional Liability. While redistributing +> the Work or Derivative Works thereof, You may choose to offer, +> and charge a fee for, acceptance of support, warranty, indemnity, +> or other liability obligations and/or rights consistent with this +> License. However, in accepting such obligations, You may act only +> on Your own behalf and on Your sole responsibility, not on behalf +> of any other Contributor, and only if You agree to indemnify, +> defend, and hold each Contributor harmless for any liability +> incurred by, or claims asserted against, such Contributor by reason +> of your accepting any such warranty or additional liability. +> +> END OF TERMS AND CONDITIONS +> +> APPENDIX: How to apply the Apache License to your work. +> +> To apply the Apache License to your work, attach the following +> boilerplate notice, with the fields enclosed by brackets "[]" +> replaced with your own identifying information. (Don't include +> the brackets!) The text should be enclosed in the appropriate +> comment syntax for the file format. We also recommend that a +> file or class name and description of purpose be included on the +> same "printed page" as the copyright notice for easier +> identification within third-party archives. +> +> Copyright [yyyy] [name of copyright owner] +> +> Licensed under the Apache License, Version 2.0 (the "License"); +> you may not use this file except in compliance with the License. +> You may obtain a copy of the License at +> +> http://www.apache.org/licenses/LICENSE-2.0 +> +> Unless required by applicable law or agreed to in writing, software +> distributed under the License is distributed on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +> See the License for the specific language governing permissions and +> limitations under the License. + +--------------------------------------- + +## @jridgewell/gen-mapping +License: MIT +By: Justin Ridgewell +Repository: https://github.com/jridgewell/gen-mapping + +> Copyright 2022 Justin Ridgewell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## @jridgewell/resolve-uri +License: MIT +By: Justin Ridgewell +Repository: https://github.com/jridgewell/resolve-uri + +> Copyright 2019 Justin Ridgewell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## @jridgewell/set-array +License: MIT +By: Justin Ridgewell +Repository: https://github.com/jridgewell/set-array + +> Copyright 2022 Justin Ridgewell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## @jridgewell/sourcemap-codec +License: MIT +By: Rich Harris +Repository: git+https://github.com/jridgewell/sourcemap-codec.git + +> The MIT License +> +> Copyright (c) 2015 Rich Harris +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## @jridgewell/trace-mapping +License: MIT +By: Justin Ridgewell +Repository: git+https://github.com/jridgewell/trace-mapping.git + +> Copyright 2022 Justin Ridgewell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## @nodelib/fs.scandir +License: MIT +Repository: https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.scandir + +> The MIT License (MIT) +> +> Copyright (c) Denis Malinochkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## @nodelib/fs.stat +License: MIT +Repository: https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.stat + +> The MIT License (MIT) +> +> Copyright (c) Denis Malinochkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## @nodelib/fs.walk +License: MIT +Repository: https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.walk + +> The MIT License (MIT) +> +> Copyright (c) Denis Malinochkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## @polka/compression +License: MIT +Repository: lukeed/polka + +--------------------------------------- + +## @polka/url +License: MIT +By: Luke Edwards +Repository: lukeed/polka + +--------------------------------------- + +## @rollup/plugin-alias +License: MIT +By: Johannes Stein +Repository: rollup/plugins + +> The MIT License (MIT) +> +> Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## @rollup/plugin-commonjs +License: MIT +By: Rich Harris +Repository: rollup/plugins + +> The MIT License (MIT) +> +> Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## @rollup/plugin-dynamic-import-vars +License: MIT +By: LarsDenBakker +Repository: rollup/plugins + +> The MIT License (MIT) +> +> Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## @rollup/pluginutils +License: MIT +By: Rich Harris +Repository: rollup/plugins + +> The MIT License (MIT) +> +> Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## ansi-regex +License: MIT +By: Sindre Sorhus +Repository: chalk/ansi-regex + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## anymatch +License: ISC +By: Elan Shanker +Repository: https://github.com/micromatch/anymatch + +> The ISC License +> +> Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## artichokie +License: MIT +By: sapphi-red, Evan You +Repository: git+https://github.com/sapphi-red/artichokie.git + +> MIT License +> +> Copyright (c) 2020-present, Yuxi (Evan) You +> Copyright (c) 2023-present, sapphi-red +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## astring +License: MIT +By: David Bonnet +Repository: https://github.com/davidbonnet/astring.git + +> Copyright (c) 2015, David Bonnet +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## balanced-match +License: MIT +By: Julian Gruber +Repository: git://github.com/juliangruber/balanced-match.git + +> (MIT) +> +> Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +> of the Software, and to permit persons to whom the Software is furnished to do +> so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## binary-extensions +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/binary-extensions + +> MIT License +> +> Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## brace-expansion +License: MIT +By: Julian Gruber +Repository: git://github.com/juliangruber/brace-expansion.git + +> MIT License +> +> Copyright (c) 2013 Julian Gruber +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## braces +License: MIT +By: Jon Schlinkert, Brian Woodward, Elan Shanker, Eugene Sharygin, hemanth.hm +Repository: micromatch/braces + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## cac +License: MIT +By: egoist +Repository: egoist/cac + +> The MIT License (MIT) +> +> Copyright (c) EGOIST <0x142857@gmail.com> (https://github.com/egoist) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## chokidar +License: MIT +By: Paul Miller, Elan Shanker +Repository: git+https://github.com/paulmillr/chokidar.git + +> The MIT License (MIT) +> +> Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the “Software”), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## commondir +License: MIT +By: James Halliday +Repository: http://github.com/substack/node-commondir.git + +> The MIT License +> +> Copyright (c) 2013 James Halliday (mail@substack.net) +> +> Permission is hereby granted, free of charge, +> to any person obtaining a copy of this software and +> associated documentation files (the "Software"), to +> deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, +> merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom +> the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice +> shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +> ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## connect +License: MIT +By: TJ Holowaychuk, Douglas Christopher Wilson, Jonathan Ong, Tim Caswell +Repository: senchalabs/connect + +> (The MIT License) +> +> Copyright (c) 2010 Sencha Inc. +> Copyright (c) 2011 LearnBoost +> Copyright (c) 2011-2014 TJ Holowaychuk +> Copyright (c) 2015 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## convert-source-map +License: MIT +By: Thorsten Lorenz +Repository: git://github.com/thlorenz/convert-source-map.git + +> Copyright 2013 Thorsten Lorenz. +> All rights reserved. +> +> Permission is hereby granted, free of charge, to any person +> obtaining a copy of this software and associated documentation +> files (the "Software"), to deal in the Software without +> restriction, including without limitation the rights to use, +> copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following +> conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +> OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## cors +License: MIT +By: Troy Goode +Repository: expressjs/cors + +> (The MIT License) +> +> Copyright (c) 2013 Troy Goode +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## cross-spawn +License: MIT +By: André Cruz +Repository: git@github.com:moxystudio/node-cross-spawn.git + +> The MIT License (MIT) +> +> Copyright (c) 2018 Made With MOXY Lda +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## cssesc +License: MIT +By: Mathias Bynens +Repository: https://github.com/mathiasbynens/cssesc.git + +> Copyright Mathias Bynens +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## debug +License: MIT +By: Josh Junon, TJ Holowaychuk, Nathan Rajlich, Andrew Rhyne +Repository: git://github.com/debug-js/debug.git + +> (The MIT License) +> +> Copyright (c) 2014-2017 TJ Holowaychuk +> Copyright (c) 2018-2021 Josh Junon +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software +> and associated documentation files (the 'Software'), to deal in the Software without restriction, +> including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +> and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial +> portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +> LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## define-lazy-prop +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/define-lazy-prop + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## dotenv +License: BSD-2-Clause +Repository: git://github.com/motdotla/dotenv.git + +> Copyright (c) 2015, Scott Motte +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions are met: +> +> * Redistributions of source code must retain the above copyright notice, this +> list of conditions and the following disclaimer. +> +> * Redistributions in binary form must reproduce the above copyright notice, +> this list of conditions and the following disclaimer in the documentation +> and/or other materials provided with the distribution. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------- + +## dotenv-expand +License: BSD-2-Clause +By: motdotla +Repository: https://github.com/motdotla/dotenv-expand + +> Copyright (c) 2016, Scott Motte +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions are met: +> +> * Redistributions of source code must retain the above copyright notice, this +> list of conditions and the following disclaimer. +> +> * Redistributions in binary form must reproduce the above copyright notice, +> this list of conditions and the following disclaimer in the documentation +> and/or other materials provided with the distribution. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------- + +## ee-first +License: MIT +By: Jonathan Ong, Douglas Christopher Wilson +Repository: jonathanong/ee-first + +> The MIT License (MIT) +> +> Copyright (c) 2014 Jonathan Ong me@jongleberry.com +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## encodeurl +License: MIT +By: Douglas Christopher Wilson +Repository: pillarjs/encodeurl + +> (The MIT License) +> +> Copyright (c) 2016 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## entities +License: BSD-2-Clause +By: Felix Boehm +Repository: git://github.com/fb55/entities.git + +> Copyright (c) Felix Böhm +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +> +> Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +> +> Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +> +> THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +> EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------- + +## es-module-lexer +License: MIT +By: Guy Bedford +Repository: git+https://github.com/guybedford/es-module-lexer.git + +> MIT License +> ----------- +> +> Copyright (C) 2018-2022 Guy Bedford +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## escape-html +License: MIT +Repository: component/escape-html + +> (The MIT License) +> +> Copyright (c) 2012-2013 TJ Holowaychuk +> Copyright (c) 2015 Andreas Lubbe +> Copyright (c) 2015 Tiancheng "Timothy" Gu +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## estree-walker +License: MIT +By: Rich Harris +Repository: https://github.com/Rich-Harris/estree-walker + +> Copyright (c) 2015-20 [these people](https://github.com/Rich-Harris/estree-walker/graphs/contributors) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## etag +License: MIT +By: Douglas Christopher Wilson, David Björklund +Repository: jshttp/etag + +> (The MIT License) +> +> Copyright (c) 2014-2016 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## eventemitter3 +License: MIT +By: Arnout Kazemier +Repository: git://github.com/primus/eventemitter3.git + +> The MIT License (MIT) +> +> Copyright (c) 2014 Arnout Kazemier +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## fast-glob +License: MIT +By: Denis Malinochkin +Repository: mrmlnc/fast-glob + +> The MIT License (MIT) +> +> Copyright (c) Denis Malinochkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## fastq +License: ISC +By: Matteo Collina +Repository: git+https://github.com/mcollina/fastq.git + +> Copyright (c) 2015-2020, Matteo Collina +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## fill-range +License: MIT +By: Jon Schlinkert, Edo Rivai, Paul Miller, Rouven Weßling +Repository: jonschlinkert/fill-range + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## finalhandler +License: MIT +By: Douglas Christopher Wilson +Repository: pillarjs/finalhandler + +> (The MIT License) +> +> Copyright (c) 2014-2017 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## follow-redirects +License: MIT +By: Ruben Verborgh, Olivier Lalonde, James Talmage +Repository: git@github.com:follow-redirects/follow-redirects.git + +> Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +> of the Software, and to permit persons to whom the Software is furnished to do +> so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +> IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## generic-names +License: MIT +By: Alexey Litvinov +Repository: git+https://github.com/css-modules/generic-names.git + +> The MIT License (MIT) +> +> Copyright (c) 2015 Alexey Litvinov +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## glob +License: ISC +By: Isaac Z. Schlueter +Repository: git://github.com/isaacs/node-glob.git + +> The ISC License +> +> Copyright (c) 2009-2023 Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## glob-parent +License: ISC +By: Gulp Team, Elan Shanker, Blaine Bublitz +Repository: gulpjs/glob-parent + +> The ISC License +> +> Copyright (c) 2015, 2019 Elan Shanker +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## http-proxy +License: MIT +By: Charlie Robbins, jcrugzz +Repository: https://github.com/http-party/node-http-proxy.git + +> node-http-proxy +> +> Copyright (c) 2010-2016 Charlie Robbins, Jarrett Cruger & the Contributors. +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## icss-utils +License: ISC +By: Glen Maddern +Repository: git+https://github.com/css-modules/icss-utils.git + +> ISC License (ISC) +> Copyright 2018 Glen Maddern +> +> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## is-binary-path +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/is-binary-path + +> MIT License +> +> Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## is-docker +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/is-docker + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## is-extglob +License: MIT +By: Jon Schlinkert +Repository: jonschlinkert/is-extglob + +> The MIT License (MIT) +> +> Copyright (c) 2014-2016, Jon Schlinkert +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## is-glob +License: MIT +By: Jon Schlinkert, Brian Woodward, Daniel Perez +Repository: micromatch/is-glob + +> The MIT License (MIT) +> +> Copyright (c) 2014-2017, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## is-number +License: MIT +By: Jon Schlinkert, Olsten Larck, Rouven Weßling +Repository: jonschlinkert/is-number + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## is-reference +License: MIT +By: Rich Harris +Repository: git+https://github.com/Rich-Harris/is-reference.git + +--------------------------------------- + +## is-wsl +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/is-wsl + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## isexe +License: ISC +By: Isaac Z. Schlueter +Repository: git+https://github.com/isaacs/isexe.git + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## js-tokens +License: MIT +By: Simon Lydell +Repository: lydell/js-tokens + +> The MIT License (MIT) +> +> Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Simon Lydell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## launch-editor +License: MIT +By: Evan You +Repository: git+https://github.com/yyx990803/launch-editor.git + +> The MIT License (MIT) +> +> Copyright (c) 2017-present, Yuxi (Evan) You +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## launch-editor-middleware +License: MIT +By: Evan You +Repository: git+https://github.com/yyx990803/launch-editor.git + +> The MIT License (MIT) +> +> Copyright (c) 2017-present, Yuxi (Evan) You +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## lilconfig +License: MIT +By: antonk52 +Repository: https://github.com/antonk52/lilconfig + +> MIT License +> +> Copyright (c) 2022 Anton Kastritskiy +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## loader-utils +License: MIT +By: Tobias Koppers @sokra +Repository: https://github.com/webpack/loader-utils.git + +> Copyright JS Foundation and other contributors +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## lodash.camelcase +License: MIT +By: John-David Dalton, Blaine Bublitz, Mathias Bynens +Repository: lodash/lodash + +> Copyright jQuery Foundation and other contributors +> +> Based on Underscore.js, copyright Jeremy Ashkenas, +> DocumentCloud and Investigative Reporters & Editors +> +> This software consists of voluntary contributions made by many +> individuals. For exact contribution history, see the revision history +> available at https://github.com/lodash/lodash +> +> The following license applies to all parts of this software except as +> documented below: +> +> ==== +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +> +> ==== +> +> Copyright and related rights for sample code are waived via CC0. Sample +> code is defined as all source code displayed within the prose of the +> documentation. +> +> CC0: http://creativecommons.org/publicdomain/zero/1.0/ +> +> ==== +> +> Files located in the node_modules and vendor directories are externally +> maintained libraries used by this software which have their own +> licenses; we recommend you read them, as their terms may differ from the +> terms above. + +--------------------------------------- + +## lru-cache +License: ISC +By: Isaac Z. Schlueter +Repository: git://github.com/isaacs/node-lru-cache.git + +> The ISC License +> +> Copyright (c) 2010-2023 Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## magic-string +License: MIT +By: Rich Harris +Repository: https://github.com/rich-harris/magic-string + +> Copyright 2018 Rich Harris +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## merge2 +License: MIT +Repository: git@github.com:teambition/merge2.git + +> The MIT License (MIT) +> +> Copyright (c) 2014-2020 Teambition +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## micromatch +License: MIT +By: Jon Schlinkert, Amila Welihinda, Bogdan Chadkin, Brian Woodward, Devon Govett, Elan Shanker, Fabrício Matté, Martin Kolárik, Olsten Larck, Paul Miller, Tom Byrer, Tyler Akins, Peter Bright, Kuba Juszczyk +Repository: micromatch/micromatch + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## minimatch +License: ISC +By: Isaac Z. Schlueter +Repository: git://github.com/isaacs/minimatch.git + +> The ISC License +> +> Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## minipass +License: ISC +By: Isaac Z. Schlueter +Repository: https://github.com/isaacs/minipass + +> The ISC License +> +> Copyright (c) 2017-2023 npm, Inc., Isaac Z. Schlueter, and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## mlly +License: MIT +Repository: unjs/mlly + +> MIT License +> +> Copyright (c) Pooya Parsa +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## mrmime +License: MIT +By: Luke Edwards +Repository: lukeed/mrmime + +> The MIT License (MIT) +> +> Copyright (c) Luke Edwards (https://lukeed.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## ms +License: MIT +Repository: zeit/ms + +> The MIT License (MIT) +> +> Copyright (c) 2016 Zeit, Inc. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## normalize-path +License: MIT +By: Jon Schlinkert, Blaine Bublitz +Repository: jonschlinkert/normalize-path + +> The MIT License (MIT) +> +> Copyright (c) 2014-2018, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## object-assign +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/object-assign + +> The MIT License (MIT) +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## on-finished +License: MIT +By: Douglas Christopher Wilson, Jonathan Ong +Repository: jshttp/on-finished + +> (The MIT License) +> +> Copyright (c) 2013 Jonathan Ong +> Copyright (c) 2014 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## open +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/open + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## parse5 +License: MIT +By: Ivan Nikulin, https://github.com/inikulin/parse5/graphs/contributors +Repository: git://github.com/inikulin/parse5.git + +> Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## parseurl +License: MIT +By: Douglas Christopher Wilson, Jonathan Ong +Repository: pillarjs/parseurl + +> (The MIT License) +> +> Copyright (c) 2014 Jonathan Ong +> Copyright (c) 2014-2017 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## path-key +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/path-key + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## path-scurry +License: BlueOak-1.0.0 +By: Isaac Z. Schlueter +Repository: git+https://github.com/isaacs/path-scurry + +> # Blue Oak Model License +> +> Version 1.0.0 +> +> ## Purpose +> +> This license gives everyone as much permission to work with +> this software as possible, while protecting contributors +> from liability. +> +> ## Acceptance +> +> In order to receive this license, you must agree to its +> rules. The rules of this license are both obligations +> under that agreement and conditions to your license. +> You must not do anything with this software that triggers +> a rule that you cannot or will not follow. +> +> ## Copyright +> +> Each contributor licenses you to do everything with this +> software that would otherwise infringe that contributor's +> copyright in it. +> +> ## Notices +> +> You must ensure that everyone who gets a copy of +> any part of this software from you, with or without +> changes, also gets the text of this license or a link to +> . +> +> ## Excuse +> +> If anyone notifies you in writing that you have not +> complied with [Notices](#notices), you can keep your +> license by taking all practical steps to comply within 30 +> days after the notice. If you do not do so, your license +> ends immediately. +> +> ## Patent +> +> Each contributor licenses you to do everything with this +> software that would otherwise infringe any patent claims +> they can license or become able to license. +> +> ## Reliability +> +> No contributor can revoke this license. +> +> ## No Liability +> +> ***As far as the law allows, this software comes as is, +> without any warranty or condition, and no contributor +> will be liable to anyone for any damages related to this +> software or this license, under any kind of legal claim.*** + +--------------------------------------- + +## periscopic +License: MIT +Repository: Rich-Harris/periscopic + +> Copyright (c) 2019 Rich Harris +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## picocolors +License: ISC +By: Alexey Raspopov +Repository: alexeyraspopov/picocolors + +> ISC License +> +> Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## picomatch +License: MIT +By: Jon Schlinkert +Repository: micromatch/picomatch + +> The MIT License (MIT) +> +> Copyright (c) 2017-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## pify +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/pify + +> The MIT License (MIT) +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## postcss-import +License: MIT +By: Maxime Thirouin +Repository: https://github.com/postcss/postcss-import.git + +> The MIT License (MIT) +> +> Copyright (c) 2014 Maxime Thirouin, Jason Campbell & Kevin Mårtensson +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## postcss-load-config +License: MIT +By: Michael Ciniawky, Ryan Dunckel, Mateusz Derks, Dalton Santos, Patrick Gilday, François Wouts +Repository: postcss/postcss-load-config + +> The MIT License (MIT) +> +> Copyright Michael Ciniawsky +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## postcss-modules +License: MIT +By: Alexander Madyankin +Repository: https://github.com/css-modules/postcss-modules.git + +> The MIT License (MIT) +> +> Copyright 2015-present Alexander Madyankin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## postcss-modules-extract-imports +License: ISC +By: Glen Maddern +Repository: https://github.com/css-modules/postcss-modules-extract-imports.git + +> Copyright 2015 Glen Maddern +> +> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## postcss-modules-local-by-default +License: MIT +By: Mark Dalgleish +Repository: https://github.com/css-modules/postcss-modules-local-by-default.git + +> The MIT License (MIT) +> +> Copyright 2015 Mark Dalgleish +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## postcss-modules-scope +License: ISC +By: Glen Maddern +Repository: https://github.com/css-modules/postcss-modules-scope.git + +> ISC License (ISC) +> +> Copyright (c) 2015, Glen Maddern +> +> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## postcss-modules-values +License: ISC +By: Glen Maddern +Repository: git+https://github.com/css-modules/postcss-modules-values.git + +> ISC License (ISC) +> +> Copyright (c) 2015, Glen Maddern +> +> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## postcss-selector-parser +License: MIT +By: Ben Briggs, Chris Eppstein +Repository: postcss/postcss-selector-parser + +> Copyright (c) Ben Briggs (http://beneb.info) +> +> Permission is hereby granted, free of charge, to any person +> obtaining a copy of this software and associated documentation +> files (the "Software"), to deal in the Software without +> restriction, including without limitation the rights to use, +> copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following +> conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +> OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## postcss-value-parser +License: MIT +By: Bogdan Chadkin +Repository: https://github.com/TrySound/postcss-value-parser.git + +> Copyright (c) Bogdan Chadkin +> +> Permission is hereby granted, free of charge, to any person +> obtaining a copy of this software and associated documentation +> files (the "Software"), to deal in the Software without +> restriction, including without limitation the rights to use, +> copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following +> conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +> OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## queue-microtask +License: MIT +By: Feross Aboukhadijeh +Repository: git://github.com/feross/queue-microtask.git + +> The MIT License (MIT) +> +> Copyright (c) Feross Aboukhadijeh +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## read-cache +License: MIT +By: Bogdan Chadkin +Repository: git+https://github.com/TrySound/read-cache.git + +> The MIT License (MIT) +> +> Copyright 2016 Bogdan Chadkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## readdirp +License: MIT +By: Thorsten Lorenz, Paul Miller +Repository: git://github.com/paulmillr/readdirp.git + +> MIT License +> +> Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## requires-port +License: MIT +By: Arnout Kazemier +Repository: https://github.com/unshiftio/requires-port + +> The MIT License (MIT) +> +> Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## resolve.exports +License: MIT +By: Luke Edwards +Repository: lukeed/resolve.exports + +> The MIT License (MIT) +> +> Copyright (c) Luke Edwards (lukeed.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## reusify +License: MIT +By: Matteo Collina +Repository: git+https://github.com/mcollina/reusify.git + +> The MIT License (MIT) +> +> Copyright (c) 2015 Matteo Collina +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## run-parallel +License: MIT +By: Feross Aboukhadijeh +Repository: git://github.com/feross/run-parallel.git + +> The MIT License (MIT) +> +> Copyright (c) Feross Aboukhadijeh +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## shebang-command +License: MIT +By: Kevin Mårtensson +Repository: kevva/shebang-command + +> MIT License +> +> Copyright (c) Kevin Mårtensson (github.com/kevva) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## shebang-regex +License: MIT +By: Sindre Sorhus +Repository: sindresorhus/shebang-regex + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## shell-quote +License: MIT +By: James Halliday +Repository: http://github.com/ljharb/shell-quote.git + +> The MIT License +> +> Copyright (c) 2013 James Halliday (mail@substack.net) +> +> Permission is hereby granted, free of charge, +> to any person obtaining a copy of this software and +> associated documentation files (the "Software"), to +> deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, +> merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom +> the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice +> shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +> ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## sirv +License: MIT +By: Luke Edwards +Repository: lukeed/sirv + +--------------------------------------- + +## statuses +License: MIT +By: Douglas Christopher Wilson, Jonathan Ong +Repository: jshttp/statuses + +> The MIT License (MIT) +> +> Copyright (c) 2014 Jonathan Ong +> Copyright (c) 2016 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## string-hash +License: CC0-1.0 +By: The Dark Sky Company +Repository: git://github.com/darkskyapp/string-hash.git + +--------------------------------------- + +## strip-ansi +License: MIT +By: Sindre Sorhus +Repository: chalk/strip-ansi + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## strip-literal +License: MIT +By: Anthony Fu +Repository: git+https://github.com/antfu/strip-literal.git + +> MIT License +> +> Copyright (c) 2022 Anthony Fu +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## to-regex-range +License: MIT +By: Jon Schlinkert, Rouven Weßling +Repository: micromatch/to-regex-range + +> The MIT License (MIT) +> +> Copyright (c) 2015-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## totalist +License: MIT +By: Luke Edwards +Repository: lukeed/totalist + +> The MIT License (MIT) +> +> Copyright (c) Luke Edwards (lukeed.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +--------------------------------------- + +## tsconfck +License: MIT +By: dominikg +Repository: git+https://github.com/dominikg/tsconfck.git + +> MIT License +> +> Copyright (c) 2021-present dominikg and [contributors](https://github.com/dominikg/tsconfck/graphs/contributors) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. +> +> -- Licenses for 3rd-party code included in tsconfck -- +> +> # strip-bom and strip-json-comments +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## ufo +License: MIT +Repository: unjs/ufo + +> MIT License +> +> Copyright (c) Pooya Parsa +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + +## unpipe +License: MIT +By: Douglas Christopher Wilson +Repository: stream-utils/unpipe + +> (The MIT License) +> +> Copyright (c) 2015 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## util-deprecate +License: MIT +By: Nathan Rajlich +Repository: git://github.com/TooTallNate/util-deprecate.git + +> (The MIT License) +> +> Copyright (c) 2014 Nathan Rajlich +> +> Permission is hereby granted, free of charge, to any person +> obtaining a copy of this software and associated documentation +> files (the "Software"), to deal in the Software without +> restriction, including without limitation the rights to use, +> copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following +> conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +> OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## utils-merge +License: MIT +By: Jared Hanson +Repository: git://github.com/jaredhanson/utils-merge.git + +> The MIT License (MIT) +> +> Copyright (c) 2013-2017 Jared Hanson +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## vary +License: MIT +By: Douglas Christopher Wilson +Repository: jshttp/vary + +> (The MIT License) +> +> Copyright (c) 2014-2017 Douglas Christopher Wilson +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## which +License: ISC +By: Isaac Z. Schlueter +Repository: git://github.com/isaacs/node-which.git + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------- + +## ws +License: MIT +By: Einar Otto Stangvik +Repository: git+https://github.com/websockets/ws.git + +> Copyright (c) 2011 Einar Otto Stangvik +> Copyright (c) 2013 Arnout Kazemier and contributors +> Copyright (c) 2016 Luigi Pinca and contributors +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- + +## yaml +License: ISC +By: Eemeli Aro +Repository: github:eemeli/yaml + +> Copyright Eemeli Aro +> +> Permission to use, copy, modify, and/or distribute this software for any purpose +> with or without fee is hereby granted, provided that the above copyright notice +> and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +> FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +> OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +> TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +> THIS SOFTWARE. diff --git a/sdk/typescript/node_modules/vite/README.md b/sdk/typescript/node_modules/vite/README.md new file mode 100644 index 0000000..28fb80b --- /dev/null +++ b/sdk/typescript/node_modules/vite/README.md @@ -0,0 +1,20 @@ +# vite ⚡ + +> Next Generation Frontend Tooling + +- 💡 Instant Server Start +- ⚡️ Lightning Fast HMR +- 🛠️ Rich Features +- 📦 Optimized Build +- 🔩 Universal Plugin Interface +- 🔑 Fully Typed APIs + +Vite (French word for "fast", pronounced `/vit/`) is a new breed of frontend build tool that significantly improves the frontend development experience. It consists of two major parts: + +- A dev server that serves your source files over [native ES modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules), with [rich built-in features](https://vite.dev/guide/features.html) and astonishingly fast [Hot Module Replacement (HMR)](https://vite.dev/guide/features.html#hot-module-replacement). + +- A [build command](https://vite.dev/guide/build.html) that bundles your code with [Rollup](https://rollupjs.org), pre-configured to output highly optimized static assets for production. + +In addition, Vite is highly extensible via its [Plugin API](https://vite.dev/guide/api-plugin.html) and [JavaScript API](https://vite.dev/guide/api-javascript.html) with full typing support. + +[Read the Docs to Learn More](https://vite.dev). diff --git a/sdk/typescript/node_modules/vite/bin/openChrome.applescript b/sdk/typescript/node_modules/vite/bin/openChrome.applescript new file mode 100644 index 0000000..9ce2293 --- /dev/null +++ b/sdk/typescript/node_modules/vite/bin/openChrome.applescript @@ -0,0 +1,95 @@ +(* +Copyright (c) 2015-present, Facebook, Inc. + +This source code is licensed under the MIT license found in the +LICENSE file at +https://github.com/facebookincubator/create-react-app/blob/master/LICENSE +*) + +property targetTab: null +property targetTabIndex: -1 +property targetWindow: null +property theProgram: "Google Chrome" + +on run argv + set theURL to item 1 of argv + + -- Allow requested program to be optional, + -- default to Google Chrome + if (count of argv) > 1 then + set theProgram to item 2 of argv + end if + + using terms from application "Google Chrome" + tell application theProgram + + if (count every window) = 0 then + make new window + end if + + -- 1: Looking for tab running debugger + -- then, Reload debugging tab if found + -- then return + set found to my lookupTabWithUrl(theURL) + if found then + set targetWindow's active tab index to targetTabIndex + tell targetTab to reload + tell targetWindow to activate + set index of targetWindow to 1 + return + end if + + -- 2: Looking for Empty tab + -- In case debugging tab was not found + -- We try to find an empty tab instead + set found to my lookupTabWithUrl("chrome://newtab/") + if found then + set targetWindow's active tab index to targetTabIndex + set URL of targetTab to theURL + tell targetWindow to activate + return + end if + + -- 3: Create new tab + -- both debugging and empty tab were not found + -- make a new tab with url + tell window 1 + activate + make new tab with properties {URL:theURL} + end tell + end tell + end using terms from +end run + +-- Function: +-- Lookup tab with given url +-- if found, store tab, index, and window in properties +-- (properties were declared on top of file) +on lookupTabWithUrl(lookupUrl) + using terms from application "Google Chrome" + tell application theProgram + -- Find a tab with the given url + set found to false + set theTabIndex to -1 + repeat with theWindow in every window + set theTabIndex to 0 + repeat with theTab in every tab of theWindow + set theTabIndex to theTabIndex + 1 + if (theTab's URL as string) contains lookupUrl then + -- assign tab, tab index, and window to properties + set targetTab to theTab + set targetTabIndex to theTabIndex + set targetWindow to theWindow + set found to true + exit repeat + end if + end repeat + + if found then + exit repeat + end if + end repeat + end tell + end using terms from + return found +end lookupTabWithUrl diff --git a/sdk/typescript/node_modules/vite/bin/vite.js b/sdk/typescript/node_modules/vite/bin/vite.js new file mode 100644 index 0000000..a9bbb9c --- /dev/null +++ b/sdk/typescript/node_modules/vite/bin/vite.js @@ -0,0 +1,61 @@ +#!/usr/bin/env node +import { performance } from 'node:perf_hooks' + +if (!import.meta.url.includes('node_modules')) { + try { + // only available as dev dependency + await import('source-map-support').then((r) => r.default.install()) + } catch (e) {} +} + +global.__vite_start_time = performance.now() + +// check debug mode first before requiring the CLI. +const debugIndex = process.argv.findIndex((arg) => /^(?:-d|--debug)$/.test(arg)) +const filterIndex = process.argv.findIndex((arg) => + /^(?:-f|--filter)$/.test(arg), +) +const profileIndex = process.argv.indexOf('--profile') + +if (debugIndex > 0) { + let value = process.argv[debugIndex + 1] + if (!value || value.startsWith('-')) { + value = 'vite:*' + } else { + // support debugging multiple flags with comma-separated list + value = value + .split(',') + .map((v) => `vite:${v}`) + .join(',') + } + process.env.DEBUG = `${ + process.env.DEBUG ? process.env.DEBUG + ',' : '' + }${value}` + + if (filterIndex > 0) { + const filter = process.argv[filterIndex + 1] + if (filter && !filter.startsWith('-')) { + process.env.VITE_DEBUG_FILTER = filter + } + } +} + +function start() { + return import('../dist/node/cli.js') +} + +if (profileIndex > 0) { + process.argv.splice(profileIndex, 1) + const next = process.argv[profileIndex] + if (next && !next.startsWith('-')) { + process.argv.splice(profileIndex, 1) + } + const inspector = await import('node:inspector').then((r) => r.default) + const session = (global.__vite_profile_session = new inspector.Session()) + session.connect() + session.post('Profiler.enable', () => { + session.post('Profiler.start', start) + }) +} else { + start() +} diff --git a/sdk/typescript/node_modules/vite/client.d.ts b/sdk/typescript/node_modules/vite/client.d.ts new file mode 100644 index 0000000..b2dd559 --- /dev/null +++ b/sdk/typescript/node_modules/vite/client.d.ts @@ -0,0 +1,256 @@ +/// + +// CSS modules +type CSSModuleClasses = { readonly [key: string]: string } + +declare module '*.module.css' { + const classes: CSSModuleClasses + export default classes +} +declare module '*.module.scss' { + const classes: CSSModuleClasses + export default classes +} +declare module '*.module.sass' { + const classes: CSSModuleClasses + export default classes +} +declare module '*.module.less' { + const classes: CSSModuleClasses + export default classes +} +declare module '*.module.styl' { + const classes: CSSModuleClasses + export default classes +} +declare module '*.module.stylus' { + const classes: CSSModuleClasses + export default classes +} +declare module '*.module.pcss' { + const classes: CSSModuleClasses + export default classes +} +declare module '*.module.sss' { + const classes: CSSModuleClasses + export default classes +} + +// CSS +declare module '*.css' {} +declare module '*.scss' {} +declare module '*.sass' {} +declare module '*.less' {} +declare module '*.styl' {} +declare module '*.stylus' {} +declare module '*.pcss' {} +declare module '*.sss' {} + +// Built-in asset types +// see `src/node/constants.ts` + +// images +declare module '*.apng' { + const src: string + export default src +} +declare module '*.bmp' { + const src: string + export default src +} +declare module '*.png' { + const src: string + export default src +} +declare module '*.jpg' { + const src: string + export default src +} +declare module '*.jpeg' { + const src: string + export default src +} +declare module '*.jfif' { + const src: string + export default src +} +declare module '*.pjpeg' { + const src: string + export default src +} +declare module '*.pjp' { + const src: string + export default src +} +declare module '*.gif' { + const src: string + export default src +} +declare module '*.svg' { + const src: string + export default src +} +declare module '*.ico' { + const src: string + export default src +} +declare module '*.webp' { + const src: string + export default src +} +declare module '*.avif' { + const src: string + export default src +} + +// media +declare module '*.mp4' { + const src: string + export default src +} +declare module '*.webm' { + const src: string + export default src +} +declare module '*.ogg' { + const src: string + export default src +} +declare module '*.mp3' { + const src: string + export default src +} +declare module '*.wav' { + const src: string + export default src +} +declare module '*.flac' { + const src: string + export default src +} +declare module '*.aac' { + const src: string + export default src +} +declare module '*.opus' { + const src: string + export default src +} +declare module '*.mov' { + const src: string + export default src +} +declare module '*.m4a' { + const src: string + export default src +} +declare module '*.vtt' { + const src: string + export default src +} + +// fonts +declare module '*.woff' { + const src: string + export default src +} +declare module '*.woff2' { + const src: string + export default src +} +declare module '*.eot' { + const src: string + export default src +} +declare module '*.ttf' { + const src: string + export default src +} +declare module '*.otf' { + const src: string + export default src +} + +// other +declare module '*.webmanifest' { + const src: string + export default src +} +declare module '*.pdf' { + const src: string + export default src +} +declare module '*.txt' { + const src: string + export default src +} + +// wasm?init +declare module '*.wasm?init' { + const initWasm: ( + options?: WebAssembly.Imports, + ) => Promise + export default initWasm +} + +// web worker +declare module '*?worker' { + const workerConstructor: { + new (options?: { name?: string }): Worker + } + export default workerConstructor +} + +declare module '*?worker&inline' { + const workerConstructor: { + new (options?: { name?: string }): Worker + } + export default workerConstructor +} + +declare module '*?worker&url' { + const src: string + export default src +} + +declare module '*?sharedworker' { + const sharedWorkerConstructor: { + new (options?: { name?: string }): SharedWorker + } + export default sharedWorkerConstructor +} + +declare module '*?sharedworker&inline' { + const sharedWorkerConstructor: { + new (options?: { name?: string }): SharedWorker + } + export default sharedWorkerConstructor +} + +declare module '*?sharedworker&url' { + const src: string + export default src +} + +declare module '*?raw' { + const src: string + export default src +} + +declare module '*?url' { + const src: string + export default src +} + +declare module '*?inline' { + const src: string + export default src +} + +declare interface VitePreloadErrorEvent extends Event { + payload: Error +} + +declare interface WindowEventMap { + 'vite:preloadError': VitePreloadErrorEvent +} diff --git a/sdk/typescript/node_modules/vite/index.cjs b/sdk/typescript/node_modules/vite/index.cjs new file mode 100644 index 0000000..55cff43 --- /dev/null +++ b/sdk/typescript/node_modules/vite/index.cjs @@ -0,0 +1,60 @@ +warnCjsUsage() + +// type utils +module.exports.defineConfig = (config) => config + +// proxy cjs utils (sync functions) +Object.assign(module.exports, require('./dist/node-cjs/publicUtils.cjs')) + +// async functions, can be redirect from ESM build +const asyncFunctions = [ + 'build', + 'createServer', + 'preview', + 'transformWithEsbuild', + 'resolveConfig', + 'optimizeDeps', + 'formatPostcssSourceMap', + 'loadConfigFromFile', + 'preprocessCSS', +] +asyncFunctions.forEach((name) => { + module.exports[name] = (...args) => + import('./dist/node/index.js').then((i) => i[name](...args)) +}) + +function warnCjsUsage() { + if (process.env.VITE_CJS_IGNORE_WARNING) return + const logLevelIndex = process.argv.findIndex((arg) => + /^(?:-l|--logLevel)/.test(arg), + ) + if (logLevelIndex > 0) { + const logLevelValue = process.argv[logLevelIndex + 1] + if (logLevelValue === 'silent' || logLevelValue === 'error') { + return + } + if (/silent|error/.test(process.argv[logLevelIndex])) { + return + } + } + const yellow = (str) => `\u001b[33m${str}\u001b[39m` + console.warn( + yellow( + `The CJS build of Vite's Node API is deprecated. See https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details.`, + ), + ) + if (process.env.VITE_CJS_TRACE) { + const e = {} + const stackTraceLimit = Error.stackTraceLimit + Error.stackTraceLimit = 100 + Error.captureStackTrace(e) + Error.stackTraceLimit = stackTraceLimit + console.log( + e.stack + .split('\n') + .slice(1) + .filter((line) => !line.includes('(node:')) + .join('\n'), + ) + } +} diff --git a/sdk/typescript/node_modules/vite/index.d.cts b/sdk/typescript/node_modules/vite/index.d.cts new file mode 100644 index 0000000..a68d51e --- /dev/null +++ b/sdk/typescript/node_modules/vite/index.d.cts @@ -0,0 +1,6 @@ +/** + * @deprecated The CJS build of Vite's Node API is deprecated. See https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details. + */ +declare const module: any + +export = module diff --git a/sdk/typescript/node_modules/vite/node_modules/.bin/esbuild b/sdk/typescript/node_modules/vite/node_modules/.bin/esbuild new file mode 120000 index 0000000..c83ac07 --- /dev/null +++ b/sdk/typescript/node_modules/vite/node_modules/.bin/esbuild @@ -0,0 +1 @@ +../esbuild/bin/esbuild \ No newline at end of file diff --git a/sdk/typescript/node_modules/vite/node_modules/@esbuild/linux-x64/README.md b/sdk/typescript/node_modules/vite/node_modules/@esbuild/linux-x64/README.md new file mode 100644 index 0000000..b2f1930 --- /dev/null +++ b/sdk/typescript/node_modules/vite/node_modules/@esbuild/linux-x64/README.md @@ -0,0 +1,3 @@ +# esbuild + +This is the Linux 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. diff --git a/sdk/typescript/node_modules/vite/node_modules/@esbuild/linux-x64/bin/esbuild b/sdk/typescript/node_modules/vite/node_modules/@esbuild/linux-x64/bin/esbuild new file mode 100644 index 0000000000000000000000000000000000000000..288f7689b96c1a15be4d696b31251bb8c6cd8aa2 GIT binary patch literal 9707520 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
PhnkVf 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

s{K6dh8CP)7NzA;cg*417N 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≀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
fcuX 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%0A?Bol?{CN{ypHktvUW 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

g)Pe)3w`-u{TSI`=$OT) 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 z

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

k46 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%0DNZC6YKj^OP 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

lp1nqEh|VuCYxNOX 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 s?La<1@#eIdZy1y{ z3GSszh5L2f-4AEbT`^H7c#-iBfutDp6pAJ=C>aC{nv3!M7%s5~eYP;^W<2JfFzGg2 z5dFeUm{GD&lA5@o2`QDpT6ENtn#J!-O7kWA2P7w49|GK>g5?%BD4*a_VZCbknx%fS1 zV$X9DUP2dW-=1{qHcWclQ`83gn`6={dLoQ|V!9Em-Yqk+uYvVLSSi|`iz|g+i2UL9 z<1@k^pJG2gA^h=?_T!GYsuLfQ$i4g9KaR6^pS`o06N=p5goy-G(RwFXpnXVxm(9)9iY z&It2XAC}!Ya}i{H-@)PG_}NzaVsM+ylRnZ;MH(Pg#hTPA)5n=m<2ex%`E$&VV7 z-$NtwJZyEuMCP}tKxV=GBDAt%JQ$U03qkELVbrrEacq42?$o&z4I1p^5w{+l?YTZY|ZI-OZlLL0riWT z!;Xl9-|bzc|CtW__D?tXeQ0$2{9hR^p}(%*@PC4# z&qJR0^&c92GVdk-_lrxPp>{f&xbzWSGtg~hUqv6erIO;Lk1D0<)BPXe^jS^?6C}Fb zkO=uJp?wdLe4u&|MW`o_U_UhGjJoJ>h~on%JLvOunxW4n=fuZfi^fkLs)zj3^=tYJ zYcln>YNq}}qfg!4ppXCLxb!*W*Xgq!$i?^>d7`3^+=4zdLWGSURZ7!m`r;6MCVQ9P z6G5LWp^r*|8Jj-e==_SdkT>}i6H-8*Nqrsk8FQS$->UrINT0vCNS_0J9P;gag=eeMBvL7z{LR`iiu&}R`IhtWrs()79S;Shb0uFgWy@bNQH z#?K(h9~*o8yidonSj*$I!!Ukkoams>wcQQ=b`1ZG^l9iI^w;(4@v~~Lsee{8^&c92 zQf>o%4m&X}eFpye{8J0$f<9~Et494zZb6?qCw){YO`rXL3(*Jj&t63z#$=N9OQz6g zKr`|!T|8uBm@g{ZgFai+9rSrS)!=W~S-+7!y-+>!pX&NGeU9H_>fbRee*K3=pVIlD z&sFJh>67_u^ilbhuHb?MhY2c-S==5u@?MkW(nTS%VAxQDz_4MkVLtU(46Kn^v3_rm^maL-;+MdXZk2WLL$|g9*qghna1Tv46e|Ee>rrr93seE)Z zl^+^SJ`8{+?;jtRCZQCZab%iGTs46@E@)Ch(_?8EL6Gf06Xcx-!UzJq66>^hiP;T) zb)giG=WyRdz@Zo|S1gt*zbZkXqZ!;+#wSOXad222}QCXf86WipeSRU#n1lN9>K@yq4r&067=2n9A>1$2wJh$9r%o`5j+L z0yU5B<)CK0KCu<(RC%Ui6=@ZujI_$E1pS19|B9L4vCz)%C{T2MM}lE~$6EZ_`5j?1 z-0aNnxX%v~f1jrEJF4m&`5m{h;RGj!L>}8c#pHJ+G~@f|!I2O`5=2tU$wh*BlEPX7 z-KGH5l$5Km*5x1#cH$w4_cVtQIKHgcN|g9{R5rf@!sI4QTZJ=5?0lk&G@m8bK3bG z!(KY_JBB@9ZJqEXxGj*huvU&By?Qc^Af?>9Q}R0|t5;R()j#;^hkJIi^fl_y-F&n| zJ({E*RrAr?>XBPLx(<(!A6z{Iv>qaj}FX{2B!1T zwd#?j9vzNH(2v!#f2n6b_eC+cdeopEea=UN)uX4?qxbpfc=hOh^=J(rx$sDBURb-< z>fMUq^v{~vo_Hhd{A)cuw&R_D1$%%SaIQI7B2D}k@-OB9oXLS`=U;p?5d%Ks7{}bu z^Kc`+=MTYv$37C9BKa5pb3OSiI?%*ppP=`lv;PwA{8#fYo=ezI_H+oFabFwQT_Ry$ zOxUsFkN38L3*3XszZd{Dt=gX4lH+MVKm4>p?GEK%6a-+~A{W~h(fJqGT}Q0M$iMiE zv@Ayc#c6-h`4@4nsoMtf0p_A2wn5J57E>$`rfk)#GYG$M=JKiB#wBMd6TZ@5{SWDkIb8UTiwj~>+d!VPO$p*a8Ukum%;v>*%6fASsI)2 zPwot-yxXMOMAQcWldumL0oY^$Yv}GEb;*|oSVknUX<@*Q4CN~m|F9uWfQ{31^aq`4 z(~VS{4O36!W@4^7ylL`HJ&3?`1via`4m1)O219GNKw?=WaraW*s<`giG!6yN;}K%+Gvtt|i0XaK!< zdIX@>0!ST@oz3AcS>nW-b;EYTdYk$hGLB*{S8+CSQ|x^|V7i|Be&{bg9Gq2+K{e>; za2?GaK%B0bjyV-43h|FoHfpaSf+6Q}5nltT@`&PpOaIoXgR_`Q3ov;@bCdro0OCcF zNM%f$BUwMon88P`mRsgh~q%RfM@XWcH7*R$%; z2YmDg_2>chXdNFNfk#^SpIr|OL3SjA{yp|LC;oMOkC$a|eo;hiuFxIef4?O^XuF?4 z>r0MuFx7d78Cq``Oj?`#pxv*IJ&<>DyFJ#qYX~FBbz=5Eb$-x04gls?M>>Y|ok0V0 zf&=DbQwUQr*TW=?7r{HO2f&sFvicNwx3(Xt#WXvUVTLb;t(`U_lWMM=AM`q^C6Jey zy7P{(xLu@4u>)Cc{)iuj1+sd4rZC6G6F~MJbvD@xU(sX_wm3g%?jh&@+do+L53L#9 z9Av(>y+QeoLE&T`bXADVj`Q^g{u77JQRnNQ-3JPH)ZnxPdHyp4ZmI*^nkz#Tw$Ins z0aQ!R*SD$E=j#u2Jvb`+8=Il>DblQX=j(TW7(wTM-Yj&sdV$V^Znf!L^0KBg{C8TC zAM{}2Ls4X^2|i89r%82`PtN={pRLplXlZu$KXIsM@=M4zw#m7s?95LcIUb_|jiY0TR;y3;Q;1qslXqd+S^NE4EBQqT4Ac3hw z&f{9-DF5;gS}u031wU9<9&vCCx!)qO;)tDvmlGAS#m>cOnM3Sk&JcDy|2VMYBYvA5 zx4fjeAzu7r*KC@@5g!baaSFr3@IS<5cP+bpFHk|v5#}Uyq-MOy)ILl;5xqsuZ>jjN zko?9$>0Hc`5BvbC?@Mt|{mV9n0>%9m1)#$sPSmrLLlP)F>B00ZhUlWYOp@sZK*Hu1 z_~a!GBB)z6C{66aI}NBG`h|lU83yWRnOwR7h^??_)i5_j{8Kkg&7^jSxk7XntpBOA zR0G$-A2U)ydW(d>WoR&LrW?bO(OTa5i*%1#i`H3sY5HX$;#V%C50&01^t<;M&~KN| zrr*)a4gJQzQ7uONnS+rZY`#N&^q3bdKOSGEA^v9hVG&#Y`?lfdx5tT?k31!OEMIRY8wVh$&Y{k>mcRF@Ef%J7}Bw2^5gc4Bjv|-b__GWEk82LmHa=N^1sHW z-v))&n2xNO#!QD`EV%}Xq+u%a?SBaI1xNe}D3 z28tUyIH>vYFGKMO0?u_B+dF(bJzN}{np562)FjWVsF9P6vBC};c_JZIX-Jxw8UHcF zv@*gWWk*AjWo#>f6bc(TJ<@O>`UR~AI598t!+OS!)bqn-poPp2lRD_(Y!)DP{75rN zgxL6!slpBC90hK; z%WHGP>(3f)NaSqtEBU#W5Fqkv;^()??*(6iB3~yvXutC(L;Lei3a7~9e3^F- z#OFGW>$=$T`wsx8^*;?$bHVXj4HxVV$1J~(K3hp&b&^I|85-rRW`-9JYy&xCw_M``XB8uzd?RK&38(ghJJD6_ixkxX2sC|p3)Fos{g4ae7yYc zl_ErL7q0@yt^ZE`_mCos{O?ulLm4bL-j?Tof6`#}|4ROM%gCp#tsSG|?LB663_Ctt zKHYJCXmmL2Gn3vh!y`hcjk3=i4w%*y4Ni}cF7KHU@-B=RA$2xgz$tNP+h=ya-g5iQ zW!ISbul2!+!$vOm;w^^*MZ`ip`%EF)=Mad;O_2fRPQie><0gARt^bE6{qJC(39)6G zntxW_5z8ew){<^)^qIV%eWqk zV5t|BB5N7!>`dU+XGBzF>09M1#g$hrX8J7!a>~ZwABw*fqGjC}3$Z zn0a1kOoUqu+#Aq6n2BIvFP2br02e!f+b_ES@O%wW4~c|#&5)=+HUeO00jNgB3U;1$ z=?~UpR6L2h$e_|%Ka9%amVcFsES;Bd$dRS3S7q%cN`pa&!(4sY1foXt2Dq#^v$*v} zgE>q}p($3-?y$E+hDonZ7$#G0w1>&x9@ktF+!HVQt;#R_oA~qo8PVh8Bm=pn{JBQ) zr(=JFd^x=syji3**D5I_7Ax_%;2MQte=}tBPw!f|v){j^7&zIrg917?!5Z?*wkG$w z+~gjlcc4@MZw)&>ghP}ef%)CI5HC99^Ga^?$Ff;Q$>-|;(t6`(1x_>L)QyH22RXo1 z3%CgRTnJDtwV$s6&82@Uf8HhX78XCC!Yoqa?~o@)%nd65Izkq5``jUo>T{c1Ns;4J;n088u6@E zeA+)sbB~p{JBVOrN1~NE6`oRdB-&E>aGrz&Vdz*@5ywu?lMspaZbUGoWMaMa?c!@| z6?>~9(U!>b1rjO5?Khu?BGE1)Z^3zp%Pek2%Bm|W60N+|k!YoaIl$aTN1~N#7>Smy zL3A*Z2XHXrm-HY~^+rdc<$Du}R@MBGyWy8Jy`Q$y(Oy}R9f>wwBGEntuXWl-B^d1; zyon!-wu2lt4nB)onrT+7IJCND+ZdD9(J~Wr zSXJ?Tb2|WrptLuxLMSbypWlL244x})oM?uy1BlCJ+s)9Y-ZwOwQ}0qrpL$n~(BX?s zG)sOi=x`&FWmh5XBk*|VVfVtZj1TmqtNLYvpwl3J;bbbC^N1K>@fLsLD7PCI^o3l6 zU)e=xFg=#AvS&(Im2q|rw5FB@xZxmiWz=qV+V{;}g!6kI6ibq8>0+A3ydt-q%h8AT@OFCPP#6PZi825;$^6u$eN9j4ncTt5mr}7-5a+Hd%4|H-dT;|iw zK%#GO{_KO#fyBP9Ioz?sRc}NPB`kx^Sp)Jlp(4w-93LWo`U!1L09KUz=}7#j+1w23$-ZY7 zvE7(TvHDg6UHb2;W<+L;`NeFFbLjXsA^yjZ8`b!eFbo={#3e)0P=16WhZ5PrOW_V> z0JsC^LU%XAny6!#;m<2ng?o5!n0VNP#KyBi-`%ziFGHWAKl14_`qQ_%;}PtErC-3YJ!p zjVk5ETo$AJcf{v(b%%ZawcT9s7(qIp1-&_^j@0Vn9DW}eP-hQ!;7!0Z0i^?`@tTpG zSP3IJQBcGRnD*}xtX>C9`xg5yR{9F~gra@HP-rAKF{3pW)3v(bl~{Y*nC|>Ph5&8s ztNrjcvI~5P8%3d=;g8?5AHRVs<%P&qZ%SD1o3ZzxlYTfQ(vFzI0~4uS5~c<3{Wi+$ zAmoHV|Mbmj@g<=btG-wa958s!BK~6WCBG5DbDl$2W!84P12@s5apuOblvLFEXgRGLuc=3=y14yKGxFS$7z`c1~WSV()naxA3#G?<0- z=N++br{5npDd9({Dr=m~ZWk+eRZn^eUAv3GfAm=$6z>0l2B2GmtIs#~|F3p6<51Me&9#q;NO~sdyO#G#+C}K#Egq|m;~}S$ zI>mfj#CDbtawXe^1WVWD_pV2dB?kLeaVR~#>OFxrtp>a^;75CzU>^h-dKMW|9|Wm` z+lP3$yzcRBKwMg?(TiAZ)fy6YwcEE*CHitcwzBAM7D#&bJXy_uuzwW%UoW>;^ZW1A zd==an!;HlJ$AhsSQItFUS0-H%Z9n>Kfd<)9`_YFaMpS-8w|9CPM9l+u8GfcNMLEJ< zAm4~NDfYg%%#Y$f&&}^UHi9X?YIGQrc6@A%NfTfK2^o_f%Oh2yk4;?r0{W$GN%1$o zdlOQ%hNSICeP1!`-`GAJ($Hu~qC+MLq|oL!?7Ky&p1@fSuX#t#M44j)gQtKAtjim< zP05&(n%nb!DOWlh<}aTChZB(wxfp1Z$bd1oyam73q{|ikZKG13@xq4V_KuSI4S?faMtMx}9r&b3CJ za>(}m`EP3vS^2(I`AmnXM*-~39%c&j(5G;GddWF~ zuB{|SCFa17nYYfj&-#QKliCF{2yxi=t8<8&*!KN=G}vL^Pd!&gMBWb&%=0d`heN}B z%_Ys*_c_0BQ}g@9TqPm-myieX;rWaCU4CH`<&?~+nNtOme{CO%Cf1dA!AQ=+zY4e$ z9bSRyFtu?kZJo=dxcN-4yd}%u->2Z5*YMHGq$=73G%VI`UCW*^ebejYlX}*GSE?pj zQ!Aj)T*%af9vby;O3xH2QbI#P1q!1y6BlAW&7iE!6#dZq3lo0517o0fEs}ikUEl_} z$h7S?Ft8#aR~fzy84r7LG^E+ah7xP+lrYPoAYns!GPT}}gtBgGy&$MUoP9I}lj&Z* zEX4%Fj2N^)9g7x1Gp@vI{-N>68H5Wq8*@C*tf1KyVY$Q*wt_1@zLDi`8QwaLO=amN zw&C_|}{;ZmL9MtShfl3b~8*pa;jMF!6&j z4hBzTG)r_P3ni6?2N|xqWTPs}Itf*TSi;6i+_Q9+?yK@r=KrHv?_^g=5L z%?M$dub~oDL}d%c(G6u6sT#^B!dCJ)VkDR*Ax9U^42?g-h>}!fqzqsziLHeBo#^WT z-5yH|;u=l31d~HFy$tdf80%4{!_5rx6qf!b^cBv0JRoJ9Z%fQNB8MAnCSIG7YWx3e!;1BzqeA zz^9oz?)tzr`zL6Z5$6*yPOvl@n_M|P6=Rl8sG)S`iPX@If2v=;6+Qj0ybL>F$s-B} z)_@t#+vd(fvD12dDj60uZq=@r$<@<}#1<}jJMeWZThO$4H^KXRn)yEE| zyYo52bQ2tK9ve(JN)LI1QdrKv0Z8x_-o-dpc}k2W>UQ9}&f5BMi2v;K2{=^A)a8(Z z=6J#&1(L@Tg69(moKHnQ&48~+@NA9Veq4Vp{}r#s}HRn%=p3w zK60S;>vs%lFZnqfwa=d#Lak%}dv; z-iRUb?L;|6dX;*#0FMO!Tk%-U3RcQ&Gg3aag}(CN9YOqizsRDD&!mjcWZNOZlvafK zPuh}1?F)$;nU2-EL=gKv3xW?kRGXlyfWAkG!U2t+s+1^8-UGIdv>K`rp9lUd7a8t7 zTip!@&h+ktj`Xgo3#N)cX-$h&OAWFwxfK~kGb9=})v&;Mpewuq!}IGQq3ZbbRJ|R! zwd`>2k8PNCk!$H;wVw2&m}PZALt~P>uij9OX$|(Ngz`bIrFe@6ZP(_eCN#FM+?QD1 z1(%6>_BDs&IEBZ#hDq}|Fna9iH>*bDJ!<-e{ceW6l#DU^y&>@%{@eDky^zDP=D#*A zo&V}N|7~@Mq7F}+A@kZk44L0P|BW>B-`3Dz(H;o@75mtw6aQD{zf6u{Gygqui1QzZ zJ?6i&)cp4u=fCmxsQzG<8P)OZW3Jg-si}FtDB<`n=J+nAa)MRNDCmk9y8iQ1ts}+} zA#&4`Yt0O0A2~4gM`cWbm9gRvN{KqXiULFu&y zR2f9H!zx0LCMDlu+vmK~3lm(kALQJmebi|x?xSX>Ng@(ucACRW2o{J(EWyoT5v3p4 z_POs~#-JFz*)drSd&5jtFaD_JkzzTj*tTD2vI=)Re0vdkAafPvU%bO9K0?~{zGL|L z|6zvTISxn*Plwu;;*>=gJAm$vam>|zH?CigO9Ax{(}ep?O>^|HyD<>bvFIK4JXL+z2nh;VT=pv*IJLCJCgO%h zgkt^mdS0S&iTkHm4V)`>$4zvtSqh&W8XTG7yW!JR*V5^U4WFg7{{>Hx=5B!$nck}5 zv*h-B)clMW$Zt1AUR>Y0{V%@KR2nB2tg;i^m1*zNHPMYGeD+?oo5s>#weU*2rO_Hb z68FsB31!D_`Uc!YH~ldwqMNQ7JzE~BM)yRO#_jZ2xSgieX_X5$WGfX47ZQWh=akI0 zp-lUyo~8U#Q4KUL7W^7olgibDaL7IQOFNHh6b9oZauY#D99H&Kz)gsyKyd@V(2n2wbx zzu0b^G36IZK1St#IYs=R=$$M?rhD4mxN#DBZ>wn)U{}SP%(^)3Ld5iH-F`otP~khT zkmxLeDe56iICPT2Q_eqkXlwEmnDB}Ca3X|X+iO)-Y&kd{N^67F1JXcz>3GwbH$a}e zNyH6mz~eplg+2ZpH}Y8NM_c*MRQ48cgrD$LL-AF*8HotE(X7f*m z+q3zKshWYBu@5(hX!)XuYXq!w`5#QfA%ifc0c!B$rI@S=Z0gM-y(E;Oum zrUOu2G$2_Eo-cqxYr*Si%!IFoj=QHK96Ee8M1lkc*8}0!$_??>g4#$N7M`H9YJn^T z52J+`<9o&(VT-|L;uAbSLaoyvC)X75;j0^H5!;+9d*0cp#0ykMmXquLL6XU-0A>U*I1@Uo5M5e zRBGrE_#Qg|qpe`=uVA}h1h((*A)OAxb_Wo=a{AF`f2(?jVR=M%h5hRkWa=Ty%O;MB z=Xy+X1OfJMre1AYg%Rllf_!ue%zk<& zMFBa3pqRY_mhvGAgyegd$2tC2Iq-kUQiK10!-U|#{|TxUQOy3uTn9Sh$oIz{1F%F5 zOyhs?0)zjONMK8k3K2UJ|1+Eb8_Q$K8;M^WA#Zk^EcoBr5Fh`HQzuDx!shrssx4s* ze=j&dJ5mJ(pUeY_Snic@(sd+4ur}pzhBwm(rex487c_g=&`jsrfeC=4W@2d6oQ3s? zp_vSrNf1z%JSzLgE9)I3d*%g0vg1FFAX({=AuNW^57~4u_|^I0yGKB>(HfX0*$=lH zlD+s*1hCd|fW1-c09MDulF^>CvF3+?eIcJtsc)WIl7c6US~qoz94w9KtxyY#-@zZr zeh-((pjNRgtkn)ok#)k*XlfOKTK5@h>BKwz6}7^)Q)n+R)IxrB9UuJphk?J&|8x+m z)$@i}<^PGm-|DWhi8XJI1AlSG*GK~U+bar~CYJj)L#*UTVCRJa)8mVpv)C_t2tcDf z=eB%&&FU@VYsM?hQ%sWbgi-9ZE|C<=2FnP=a2R6n8?v~kIRz9e45OIay6z06LBj#? zi%M$HxhIJReZ}k0pkFv$ya!HEkIv(xzo|#v)uXfc=vMWpoqCkXM>Eu;?@yGvj^U#c z^=P|#)PavCs7G(9M|)nwqhWZY7X8)@e*w{8yGjlgd~fgEsVx@j?+4@GOyh*Zzkf!y z>UAdc|17<~)6T$anSZrw_M^mVgnbuIgsveO^7e>L+2 z8FY)+VK{v^$R17^muT|Se%ONjtKT%fdYl$Lz8=5W=D)@V!k8__rQ*LP;Vp;#Mc51D z3sG^Pm?&qxTn-~R48R?#sX^Pu4NtFW)+Dn6%EOghr`O&kIY-XQ8O;n zTXB3M^M)H4BN|#^{@K^+=3;Q{pud89Ze8wR)>%&)X8i$Hh7hxk>>Og&a81EQ4+O0# z00_yPD>*)78k%Z=da~VVH~$4N|G5w_yK9(w8futpIJU|G^PNtyVcuUE2WD_H>>o;b zIH#4zUzmnuEGY%quT9P4;u1#(HhX+HsI|#Noc#89=nr2m)3cE@ThbuC7CL(%eZsd` z*I$MJ#Up&_J)q~MdJrVTn=?Qf*xutSN(ugnpkd!BfOqhHKuXXfZ3$!DHEF`SU#GvjyU&pYk|uYC2QgFkot-SFpx ze}(hsV~54&m22tOa1i`?9AQq^Fg1Vnsx|z%{oQbw1LMFvaC01(2g{#h!7*0Bi-*jg zw{;*=qWN<_kP^+G>BkCx7OVn)-qX+K&o?iO;7`U6Dz)PWebf%}rRobgmX9N>>KwiP z#Sxb@5kJ)uT7!GSzqDtQPK7q$+!Njg*;WnBfV)(%Snj69a* znG{Xb2WD`1|4lP-{b0R}uA; zcVq>XD4I}bj@}3qgPn1~BIVc8WuO>U zsFOM+te!R68?eQ+@9WyXzzc41mH=hjc&)1p-h{cBC zRCW4hHUNLpk!`rBV^7#UO%D|-#`=7)BDV?3#G+{UQ~2NRkN<)qiH0x?OPf)}jDaxh zpXd{CGx)GA0~4&Z&rl3&(c&9Z?9CaJWTu?LM(Xc{>VOpXZ*QRd$NCsfXbCz2GS|*nRs=5*a0>cLZKO^#9422Y zWCqD1Q3Tr!Kmx`3#y(IDf8j!{uplr>E{gK^Y{_rfcV?b-kgtG z8>D7Qgq|!Nq37{w2B*-(P))EaYK+E*Vjb+%A2q}5^moD)kdhIB6b{PM!MTEzVj=|r z3}By|tn_1zmO%zBB?c{}(P$}FfqTpZ_AB^-JO668e^?sulWF5;QWSpfS`Yl3`;-Ge znckdNS{eML34YQve&*0;KzL5$r+xGI*#n*e`hck~ab?h^=Lh@UCR{0l1r=y4={-F7 zfD;7P#0h{$`$dG00@q(#_e5AUoQoi}{%Hpp2>SwzqPBmwBjQDQXF0awFHIY;VZheL z*YuvPfGdgZ44jP(La%(Hv;9-($HocKl zb;-4bNn!ercVAoAY-WpQXNpj5TaRy@4o#8g-PSHY&=ryd{Vc$eu7JxNStD+3`~$cZ z$XM;^{V|T}{G9JQ;NBx~raZkqb0_Zi_&#R)JlXHM0t^OI;6FdPz>g?;O|IFT&bdT&V$OC5_c1D!A1?s^lCv`c93X zO{f{;Czs;~sx7sZ zzr{t{_U{GGYnQ#L{6q{aT72!ZM(q$X(-X+s=Yi9m@7;Xgz7cS0JA)#au$hl1{Mys| zvx45+@_j#R4$SZMlP7V<@ZKMJ*Z!Q}w94cAy5`4eV_^z!b5rhc*V68J4Leitdr4wm z!>;5J?LWlz1+7N3-#G%59+AE6dRIaAwyFOR{0CnH9>ZaUUvtQS$KdD52`f!=8%{`J z;GeZ=AjT?=Ty3#ZA6H{Pl@<<^pNNtZGrTz${Y+djj7TcQ>qU@uK*GmXMkx{YHn|dl z8>UHeWd`QWp6({Zj(I)5_j=k4)X6S)uPyGxw_s{;XK!=`>Opi)3A5Xy*{-FXY5&LI z3gU6YcJ_HR`n)}Pc>4|dd^h(8T(haG@MSB!@HVt|XTR>6wFu9k|I)v6)?8eB{9`aY zCZ>4;lYTDneVD&zE5yNXrxtqxU14Xv;^#5GDVvhV_%7R&GA59|$(wV- zPtwmZzMh*Jj{+?{zRwDLufcW!{;{^AvmW33`N)&(J%$6!r8w6nG@T+Etgk>RcR3EE5er?VV@U`ZAHGXE`3225YuEW)E-!|5EBEE?|)qF8p4~&SZCiq?K zaq@fk$1N9^yy)}O2;|tJ_)6=2Fe{w!sKZeE+6~66Fn2Y~3Sd_-;%|trl%AsPvppXD zef;B2=taAd2xn#l{hi_~eYj7=mB-hvG0Doj=Ft4(Hq#|4kaTV*F=>)|k0ojwOcF~R(*or5wKSG()S zvjQytxq_t&mRLl>PE^yg2T?8DC!`k2) zXVUr_nZP!O@t9!CHh&&zSLh2>&g{GRzi6yZw^tZzOIW=-v3GiyPbs zI-bn`g^M*{E{il4ipfFJ>Q7M0Y(ViKsrDV6z)F<#`wU+i&j%_tk{Er(EXbd34>-hK z``eAUyXj>me*_LUN?-dfwz#`vGCHWm9oieQ$S#g|LPESV@i#%b43FC zQygF?I)OFg#E5++=tp*1vp_P$TQ#jN$wmC(qm*zLSx~ixq5&2wEgQ^zAnE(oGG86D81q$0SMjCUt{!#ZqX~GVm$q|< z5e$q)YW+6jK)5&x2_}6NHowg#ueWS|OTJQd1*qWsMpUFxfbjxz+w~B|nBOAje?53? z{>Pk&{vR1@a-)|?L!RzPaAMT7X7@v_&w1b~rvJ?K#qgaep)@`CtX>zhQhbRu9Tp1g zn!|U-s_Ld@jZ8CZr0H1$bENj1nIGvn^JT8-(^;xds{L`#cOR;M%&RxqW+ znfBRV@sHv7Tdo#A-PPh}y|CSrYU+V^U|mb8&Oy$gQj{V ze`x;@HQ@Q_pibwz9L&&au3?7q7u00H@5Ntgbz_Jh!d+12{W-)AMh#H@-TKr}F=n5$ z3G1Od9h{I~VmP6FB&>;Hu#SQy3`-v6{)qX_>LCE_3BmS%betX%|6(&A03Xn52hRd= zxIcJj)QljVRLa28@#+0X)OHQ`fBZahLdYiBIU$6}a^>MCbHQ|?T+am}067q#uY%Vb=e&UCpNynf{2eJHtw>B1c`R)c4jkkTa(Z_ z&H{z7+RC}IK0gU%$1T$Fe>>X5-FSu}?uqsq;&+-K9-U_9hXc1c==^n!q4On6!ZH8+ zXCXQ}=7$*jN2~y4=^3*2&!po-E=D7UBXyQ3#7iFg!g~d*^u4Gp$-EUfQJw+gPD^1SfI-JuAVu8Lg|5IkT_;cBd-5%BiTN}8Z>jq?U~R??zio8)ydhO?7peJQf?rjAv5l}{oS|im#u@pAO>Z~vV>$o@l%tKzE7nzA#gU{{ z;}Ptb{=8}pYen~LKN2yqqPBWG=bu>EMD+mqD(okfxT7HjGF?Sije;zzyYh$ zU%7o_u+MncE1dI3J zf^1*GUR2_Sxr%D}5PP{gR}oIFs9Z&SZ*mn$nLUnNMToni_I8l`Or_!a4-l+eK-S{Q zwd{|R8xSWFqZw(qkjiKVB?WlCLRMKM7Tab`I6^t)$iY{jN=V_oF*(sS{{$>V=$6IA zT1l=N5);;?5kfK56>UyOZx-PtM`qgrKVm!1j>6T1yYvWyXlW$mOCBDe(3%@wxem&$C2y{|f`N*KlTHDvo6lcY2Pj{L># zz0sXep5J&O9lcyNg`iFh|1GJ^@Tc3#Lv`TavTWtHQ$C@wzp0v(X0MRns=75Q3l2eZ zqZy?oPgLb)kFq_*tWu<833_MNlkNcJ?DHv#LjOb&egg}T*mtU*<^y~5T!2&}^k{)} z9#um762_11=JWRR7(a98I>t|lH)qes@gnuc0 zbc#7#Fp@msBk5785pGlCcU!^kU?7k0J!{iAOwXNg(-O3x40rgk|B3Oecmw;AZ{bGX zSZi>l3>qS5t?>iHrEBn23C;mAs^&*!6LZ8Db@;cqYW5I|)Y7ROswpdQejC<}DI)2- z?=ewhr}~;&;?9$vYFlw6GR%+ocx?i_HtCr1q0j>c{YdYWrFaqMouchO5+8{B$MjFZ zw3_SjpPiPUy)oanDc|MU7;OhWD94LRiWL<;X8w-NhJ`B zn1Co8yMILDYT@`*A&F_bU%)aUXOeVU6cbz2I8BItGzq>%_V)2;-hkDCj0P(YH;Ndi z<4O_3dLvWQAvjB>HHCln5B3){>11rn;Gf{tj_x|`Ke~;f=&sf0vZe21d9ts~O=r2i z4e;6pVFF|L3w>aV8{Tl+CRI$&dT1og^HPjDi-ZjbM51}uKyQt~8 zi)nb|^n8Xg#Du0~$5ohptP>?~9Q#-Vw>6(XXfvlUC}QZmBY)75E!^L>u7o0e)@;Y} z`tu^ANdE)Y2r{^vXuulq(DDZj|3>T2LuUUz``c%=;=1?u-rxS|1K~Wizg;-y(Dt|Y zQbZ#D%U7b!-*-E-`A>e?VMfG?Q_P5nA0PGC;=gFCPRrxJlz;>BsvRr0!4+oZwireO zN{M2z~*l(%<~MZo#_Bn7Y#^E`sWLvkOimZ@n3*& zYo%AO-^^wXEf+N2xMIYAQ7w?O;dcC&0)2Wl7fb($_%C6G80-0_AHa`c>-1S)2)UoA z1G#_v$tHK-zJ}ak@n7QFZ_}XYred7a26IsHIon*$1v=KRlV&-nJZ74q@+ue*LR9Xu zIYed0`h4rC5Sg2|-`+MEwEm*XLF+rl8(Py|5d!zf`ve!UJ}(8Rmaflt0lU(_tyP-7 zth@#G+pCI*|2XUOPSUJ+>+_AWRUSs-2R|1QufG)}?sC8;vAee>af{dI*J93$;U9Cex*~P2@AM3Su zrqS6$@y)SIGZDj|cywy(fGm;wsFio)`42ee)?j*9%KC9!WFWX0sHze|4g}{2=>X)G@7dgpK5M{+Nv#T5GFVmv)kBk6kn0zBv(JjnB(%IY_ z=hjr{9cinr6({|c{3HJz{q?S((qEsxxf%U6<^Pucx_rE%N=*Irf_L@E;NrgDNR&J{ z{q=qfBU^vHl{ZFzt-_7cUvI#b)?YiGs5!);zrN7C{<`#?sL{JdTB`NetKr+5=vL0X zt=#bLb+>;Hk6OFie=C}8_G{&5HlyB7leuO}FKBwgMnB9xZv)PLwj(4vi~+x|rTr^3N@cbsF`Zkz+$BX1F0r2Yd?E!Ka4Y^DEH z9Hjn(MNEACN17E^{}JbdaQ$by(tm2G|9opx+?}Q=-eUbnWk_?_Utj^i3e?tr-i(r< zvxG2_`CXuIl()eVq?2F*6#WD?0i~$KNW_BnA?FIpQ?H?_A=Z9n2fy^^ACSW>0rou{ zD59;OsaaYL*x*}FEgw3SiPjQn$N&5|-TO!#;_w*aQ`?`$(XY?@MFn?TO1VE%>ULNJ z%8$U_B&NSotj8;glM_3V3IZLm9dJ>aC;RoX<7I=k!J5nE zBK((1XzhX)EQ)LhL_xrvl%Ku9HRn#4V?4cAv3^vnPiz(RYM>ddawgDnp2vStZUN3F z&n`yM{7pM~YNO#m^2pkr$+mqj-@6|+y@4n&vi7oMtixB~B-bWeCvN3QTm^$2;(1KW z9k4aXb-dKbB!w~xS-4?;a$aqUs_6>67*Xp^%nywHB}PSssHli1$O^&ZC**tUd4jB< zcaSF^3w*C@YhXdIpeK$cJI zFB`NtpwgEuJ`FfAXxlB-c<}fvx9=NkI^=|{(>(5?1Te47z>DR)CnsG8%{qPPI@@_ zqwL3>a0NcLUgc{D1&o6RYcKqPjLp?*io=8HaRbR+167~-(2?P6w@{9dL*`=`s^3HWp0{NREfP*t=JTE!#8Z?nw ztyXHyiM7@^v3BlH+3&e(hNuE4z&@>e0R6GHWV2r%yJ2@H*H*Z*H<#fPY`U=i9#nq7x5ermmdt>ps^L<@f$}RN&Os1%V3=Py+FLSM_Q5INy7q zm22KR_mS)0~!IvS#8pF={p6Th9Dx2HZ4rlPx0GCy$rK5*&A{OoUM-arJ&5XHcR zFZ|@ZO;(<3*?RV(5GZ@k4@We}_@}Q`$^@nvgPn=FIBbWr-rv4Tf)hJ(*82twb6Ds0 zApRGz^EQ3li#UEOXf-GvP#=5`B;-;9i_E=e06DtZK*nOL+Sqc5j z6>6Sc=*@X|4bjuVz3%Knz)EO59O%KB))6?VkS+Z4HW{^)*e^DF#+4`tm#sK>f#`)K zkWJZh$UjI<;F{MTS8zd31_v}GdjjV{=)W794_oCYt^&z76yOy9{BK#i|7?(Q40!XR zBJTTPv+qW-f}8!6d8CALyU=W)zjZe(roL;~-35Adj6(2)A6K(;hq-->w*bEn<$ z`rvDL-x7{dCxDhc8|H2-) zj%|$kTQ_2sTT#GXioJK27Id4elre)hky{$5zmk)`ts>^}9-*5CI~1P781{};qn;FvQiuo|n` zWv|9A=%U#u=J`owKinwjuQRi|I z#IC+oK93S{X1;bb7~{1o91HSS{$v*918Tz;%uKF}vGJ78t^A0Mr|9z}tpSVk z^CS)KG>XGOr&dD^AFhI(f?^Ef9>`|palgrVzEi`ThXb!jD`W$zgBtWf5-ns;h)M^oi&O3?k%#v91f7y6b(+3yUQ7d-0#9j5h8cGfQzud?C#%k z`^#m(uFOA^F4y#BwF3jSsqU=WhxT=-&e zBPuXaEZ+zIwpb!c>xi0Ed*dmC^DBMc966a#qsqw?^7~Yg$I6gf zmtz7;h_a($rkHjmzTcNP?L61ABdGgL_7!$-)cZr3%7VjGRm$qa53Q>ke`spfmR06NL8+0Wq4j+KLLxqa){D@Rs0%?J(aa!~*w%oFFKOnaHK6awEE#SM(3JK? zdNCny2awWW-3vxuo{Sr7KCfVWlE<@nBiw{C<-7r6I^8D)X!D74i9DGEG29o_0tX-6OqjRrHvTP z@x;%x!N5%_Wlsua5B^Jf6vyk;`TP4X-qsYkbDDy&o4Q)Pp8-&fFU1`{s%11QE~sA} zqm;nE9PqKCpF&y1|De2x0E9ebW?*a$yCo`vZ*$W-2*6Z^uI_dFzM~{aLsK%~P>ExH zI4OuuKvUSl6o|BVHN7*Se!$kSVyHMd5?3qQ$HCRbv==+$TP)((j1%7i_K`HchJ7Sc zeiusEOlt*g%aF1)1$+wMSC*Pwbz^Ru*5F@P^?SnA@Nx&*`wclG!RlSSt;w6yYAM(Q z`d2=bk1VJnXt#Y5U?6y2P6FuK+&+xjuqd6lR!wm0WeXkeE+krkTZ#X92H@l|KM+Q8 znrW1EEgdHU^h^YL5x-}F>OqA(u0UO?Uh8c20CE7rz{07@L&m>SWF%)Cg@VPAE-bMYin8uyhm7~n)NJ*UKg#cN`|0VHEVPrlg zuMp4B18*;n|B^Hh`dtJA-H2T1-(b+WVmb7$SRw_VTaKRs|5<4T{&O-4{Npn7Ib9dP zN`Sk|D7w0))4-GL@m-dlV%@tPhgWh2KF2u*h8uLl?W@|2DjK_U_<_Rnd8gyVG^T@H zeVgjUL1)gnX-0zmR#G)fT*^i3**1Eh1V0PKigLyu$!mvp#*06)Fg=xYf*cef0F(84 z>6VgsU-Tp`3EJ&|s?f$__c+ZU{PqAHJaAQ+3Qsw|F1ul&}cc zLDi=C5-)u;b7CWSh|?gI24}bvDo(G{b{z4X=4V$S z$O8+aqThpxobx$fd2_CRhWv{a+Z?`a?B)*Kt%`A(ZVjfBftoVdN{@dQ>EZFuRrI)> z^gvv<@(HeG*MkgYIPK!^R8*hZR1m#}A;u_MVFkgNOK$vTqgT%4fOOGwL(46k4@geI}#LSBl-6 zT%5(Z%7#@W9~D{C)kj%iA$*i8Y+vQ(ov##3Sy_o{5dYZzu2jA&wT8)eVwb1lC@t_W|x9k~r*^3%2xg*r$$TR~KsWI5pYhZw;V}q>@*j&|`K95!Tod zAM?WcOum_lU8RL~3F1mh@WOgkO1z*Y)DmLQn{%xcMw?#Hn(mT%e$*A!^1?i~YUSf| z++YR#>(I1`S_wkn)t3$O=Jb(DFb~etVkXbsm~I#j$|sl^hXdcXb{<2CvI*>Bmu%o+ z2%;xA1{}eV zUt51rXEjqu(tmD&qQ7|@7ZlI_oy-8lFVNH*mPQ5SWpx)|P)`x%SN0_0u|NBQ%tNka zw?INxK-ZrR)#z+sdS)rk4z|M{4d-Wf_Fh-ut~SiCvb1Bu2)F}(3JJIN6}aD~330Yq zTgED6aUMY}Y1pI7kaz3O&g8E*=SXRq+WBpdla*=KC$eWgDh*O3L-tPH{u`lJ;aHv9 zpO2O*S;K>w7HY`%=R(?BDHD_eoP=G!#q@P>qlsh%$?bcv1oe1x&XHo+s+~gx2>6A> zUdBtkUEh%(QBgvaF~q{#23RKg7<&RlVAY@w{d)X&@k5XQ0i{GeMhNs?s<{dmu4U(m zK1)T)bwfyz@~;p@>asDSNPRhtZx$$((LeZ8xm6Jtsn3QKso*54_L$e#v-fC0C4cq! zT3LY`YtwS-P}-3VY%V1sRz(dokr~Yw8Tf+Z$GV?iA^z2%!3oxwF={UYD>mx4-dwdg zASQ|Dujc+hL~UrtMwZ2bpq9U;c9HUVx;^U6LRB)VhTSXK6sxOh#?@@b`q8QxScbD1 zi;oFw#>p|7!DSp2AI3sNLl(s-Xb6cf+ z5T^U2NI7s=VQOP1SbS0ie+Q0|()Xy+i|`Yz|4@KY|0y*3&sz1-67|t?^-(?VLi!Is zQuOXE@Z6&^k{$qb<^q=G9 zJ1)X}wRMD{R>rmLDfAyH4_!m+^S)Y=IZXdi&yoM`Na9CNc>Z%S_K}Kw$s(!bm4}EJ ztXb+vw2=PuxO{Ui^&h(gaTU^kYNUkm!Kfn!q5nu>v}u9T}RR#jO4%g2zmX8N7QkLwzb2~ELw^NHK{3l~(ox>8PjtM+GZlIMCM2o|j5y}#S~ zyQgAuIp!t&z(G|Rad6DO_tKBChr)CzYIa;%h~ie47k_SQJkowvif4+yUT}`;-BP!6 z98!knRjw!mQ4`9BaSlhmFnAjk6?^=}@L+k6wDI^JufvZw$Ne|KI)rv5?lHl5zpj*R zgm^1C&ZP>j}kJmOhE7@5-mp=Rf)pwuSpFCRD&V6d{qrr`^sN(H4T zsHA=o$^l2#A?!C(4~CJj5-so-BDhf{s!XWb|EGqx&M7|@#*pi-K%EGJuCmGN+SZO7 zl-PJ()&9V{Gv<{KM5)83WvNnXz$r|u9X22l@A|U_{bA!!7vm39?SEv~78ou&5DS5B zoxXyj8DS`6nd9qkNaikl%dAsfa(OI$JiB5}EkcW>Ox>SN$s+Tvd@G zT|y9uP7kok?Dgeo9HAt{+Pr~@%A)1uFq_ zei!N-T1iu1ADXbTH(L~#C-3Yv_4IC7Q%6nxyz(3v`9`WSU=!*1|Pv&P@6s+54Scqv?c5sc>F0cKO>39hylBTbMP?^HXa?fM%kGt zm2D1qi8Wa79fv_2=r-nR+G}73CO#^_^pBnnOO4W2z>PLboz#V98f13(*zmHmx$9E$ zo7SlK5uWT%UAGRwPLjvp-{YT|T#)^?tA_HNN<}VLG?-Ws^@!fwMYV`#=b__vBP>@| zufKjQ`KfB2Brc$sW9@^UyBPD1D}G{>{2-WwAsND0p_gu;Kne8~6eEH?FiYo(QQL!p zSNNk=mv!;@Ym*^1JpMXL4Y-VRNz?7NE3e0+PPgM{ z1RN#?V^xa^>hrVfZ|US(+Ouu-*7Dt`4G)n+^uY!^cRg6olNuj-TDizk3I)&=@~;#D(ukrO*cSF9wDpXNuxK|KLGaKy&x! zoQj{yoD~Z&N0l8zTon>m;QU-HnB0X0{#+bK3C@;f*WlySH);F{D>@9TxmvP8fxnW> zq7l$3Mb>mlhs&A{22~EFVsO3tX)Yl!E~wx3IE&I}JejYIROQ$sv%y}BR9Ldo&TpzO z@NM#Buf63jaF6af4A=~ACZYr9CVH|rO@&1g`%@5Zm%)JUvqRc%e`;Vtoppai{ldp6 z4&jF4kYQvb_vDej%L-wcgj;`Oos3=#&u$kTorsRY_DhXG@Q0;NC3>h9ebWo`{nr;2 z_=jPLz3vInFne_>b+O0p;gl~nDD_odM&q&6!{jb71||pEphQ2KM5h9%0I**5bS+CE z7D^}k&bt7*KIRGrX&hSw&N+unU#iv`i=U7sPvS{~(Z5OmhqH5mkFq-Ye*#3~CEch{ zqliY|*g{(?QPHH35)fn;HyRN&UfNQ%DfLpLBoGBPxIwcnk48nMVryQtE%nmU)(QgE zM39SDP^&1d;{91eD_$xH*8IP}InT4%grI%@d^BgD=Q-CoGjrz5nVB;d*0Q=Xzl?6N zA`UFc+H5>F#qD`o^lkP^Va5twk)oSWns@*P113PG+j35CcrThdK}wEqkE8OyX{tY# z$eE!dQ`MGFESfga_2hKQ+x)rC)PIAG&vRp3U!3l_VAJQ$7R>fvNB7Z}kh^8~53G-s zZ;W`CLFmkO$&b*eyx5RVM@0BA>GF;%$6{L;)}(QxQJJ%m3f=i=pWUHR9l)OR)p@)NC} zmecTV=L6Bykm5PW!(QGV-$CeLwokD6TUNcPEAlX43MowNok;|rA*R;OUj>z3qe@+E z|4cW))Tr>eW~*??w}T4(pMPm(>62AV?9Km4I$TP3?CkTAZ3dCGz8>rNg8>`<&;$^o z@CQp}ZFE_*>Cp~e!klk{x`g;sB?%crN#S&s`qetVMpHLzu;kHAO4xuD`J@s(wJWP^ znN>pcK-1!ziJ3bFdngw@{vSpQR`HUGmS|<7qUqLvO2Tc>*fRECP>D6@olz$H7=L8G z_Fw0~5JJ{a?O*qzaIcBx?O5DGVgY~G(P){n1O90QH%(11j6RmL^`;qLQ(yaEj_%Uz zlM2omE*_?{(m9_t?2hT>UQdl?Xl!yn>cWsnGgztBpvJ#rUAim!NKVeM&m!OGCu#HQ zO3{QGgAJ6)^nEG_d0r)xdsxH19Ph$8FXHMx);qG!~g1$kC{AM3noQ*7>>Ryn!4F4z^1<;k7p^zwhw67pPvo; z?+i9x*YoZ9h9JCQ6N3)Hz63Ba$32C=ovYaSjib2_-wA2%w>{6VTVPFY32t;Gw#~@r zfs!psAu&r8SInF|hs#>K&WE-rNn2sH)-i?LcxsKg@9#s+2$ltmt%RM~RML zMCi_nqh7rZ3N8vS_+1_msbMvPRA)7NC(;9_B1=@Pze&9~Lbz}ApFFiP>doYA)oB^C z>ZuRvk&|xT#*T8j_>{IyD(0u!SR>f2t+Ot>hP2`?6JO%|%UUUju1+-ZtbaJ8c*~mj zQTn`pQl5HvY7zC$oWa_LqSGt5{7n6N!QbaqxTB0{qzYCyZ44GqvKUqQtJuv)y^0f+ z8>v?9+xn%wpj6AZSt&MmChMF6BFZx3vf(ViW%O@Uc%RJGTQbI#l+POW{$?I1qoacW zwSjgr#%?esO^?5CF}+gv%#<^D%cNs)aCuEmeVt$Wu9o%X?$(dwyH38(s{duPFxB(~ zC;N8%HK`_=Ixw1iPxDa85Hg+Hsr>Ch`K}k}Mgzr`2V*^%v7SOlFD(M^ilfQJi|B7O zd7~IcqT-bsHSZ|7ZWlX2g*AJ%e)x~~mzAW<-vR`my;69ON-9)M1e>v7sLQ^kQk(B) zki1dd!n1Zud)2U0jT?kPz2EkJwuLeNW=N#x8jeuuLiR zX{nK4Vbde6^eCquO;(HbO_3vsJp=Ww8bc5d1i(5&lxR`YBbwJ7tOYsG;MAdmhs1}u zaw6BV8CB)n2iY=lvPz5gGlZWXSsbejsPimL+d}Fr7Vd!pLoEe`TC?VV$ll%LX_W`$ z*-C%V|J{%wPpc)1Jgv5FGXGnEr$(Nm9?g)aius#$9S8`fN;N-j6ycyR16dz605u$u zMYIolYP)Zu{nURYH$$|mriDbi@-!n_`2R}*)&9}oH7{sUQD8;2B@ITkw<^orYg5xVFW zd#cM^O0=OX|kU7w-?US1b>Ncv~-u6A`!F2J1YKCB)ij7JMQX1G$$e^UWa#}vyr z;&RS^?M&RYSUX#1vX^~t)tI8(cq(uES+;H8VacG+l_X=8@ubxG&s=X6#gk*oI`QAR zybS-ou6NMAXbaplpT@L*Z$5V~1Sz`NLN{Xsn%5%Qt{!=L@gE)q(4X>4j&VviWyv5X z99h}ea9>UhrR|JAeV@u@3{j0!&0Z-62BQVzRGc}?w`!VghTSGH@k_^O-4_Vias<3C zQ$xsDd)E7ZcncHmSvHuQ9$0YPrJ|;Sb=OWOsaShTPfYm5eF5hFL`Q@mp3u~P>wmlP z=dagWW5c_L4Lppjm_SbmGRUCL$eKzWouk4t7G0`a2z*@c5+~F%mLfD`$ z*nZbvbg!CO?v}yiU5gCtffRYm9C1#h$m-0oiMm-f(% z6Z44FWsG_3aEtHxYD~ry{X#J1j`Eznvj6HQpBsZ}zSGbS@YpQP?a8x`q!s_U+ZhH;w)RCdl$&-50sKzf63uyE|6LvwP{><$=)8{T2 z4HQ}y^n6Plqto)YBceEaumVqQrNRYK;hyb~e!N${KjI61_{b8HvwZcL0O zSDD4|+Q`E}ZvlrRx4E_q_}@;8+z`S#Z2ImDJe8UQEBAm{j^?BBfB)=xg6-Vkvpb(1 zPG7p#KXR1SAiGLbLf(+-&QUr3MRNB>v@0|S-03tgUS2~4A%ESsoRGi9%0=@N6~Al} z*W>7ZZcref^M4&cx@X|$pZ$qgpPZ)liD^aeHLG6U1+{v8rvV6-m5S;SB`FS$ zbyjc{XHaVz{)tK{?_ZxIy^mw+5WSiom+m~o*lL>b^KKDTdyZw9@wm>L`Qqh``&!^X zzF-(Y22S1kyvGS^p&r_a!fq6o1(47Q>PaaVr|-whya&VRoXoR>TNoVi{jMdzO`{UAIv&r}r{6eO3()M% zP1fuKj>n_lXtZayA5q{rmXN8u!nlUzc51N{5lrtDmFRqzmprP8aOZi^)Dm07Q)ZxD zMK6l0(841W;NM=A`UxV!X*^uaVerhtIAw=gtuvunXZFkcqIj|dDcOXFi=+;7HX(Y$ zr&%S%k;To{rp}U8-d~Hnrfe-%*|~6oi=>OklS$Q9+S^$=&RuTHiN3%s9DlImXFZ4~ z=m80ib83w^pMrXrqK8d3$jLh3aCW;Ab}B72)$gpNi#GQHhN$u62MW~_EX&&O!XP!V z0sgnw4~V8J5gr_C(M2=rIo7R1W2sZ<_@1I($5BI}JW%o>{i!3NbSDfgqv#m37C976Gok5&&!SRX&36)5iFRdG)!h|m!q@b%r?g6 zj8v`0C2+b?oyDk5MM;hP6EsDytqY7&i}x6(T__BC<@kD!(saN|JHFjFEI9ZL!4ZNl zsCWx)XbPe|x;2Sz=`e&O>4)*Bv&o1j;KWKogo8j?iCl(5ttQ+T$j^~3)eC90CwPqj=VU8bt! zHFaSo{qUQ~6!P~*+TskPi3BdCOWoK{-xWSZ&6Ir zdSBjrtrU#RxnK1$r`C6M~wqdV_(lUfYll3Oq<&urpav*ee*+M1&MUvNcKs%fFs zIDe5PElZRn2X+fJuELB^Gb^Y->aDl$QD4Gi!m&g=IIB1^=LKre<~4nUK`8L+f@a&S z1qT5q$*)KSa;X|O0kz%og!Zb=LqRCrruP!ilzIi%N1a^Su17u#Hu`LAz{@+D06Cf6 zw(1Ud+x{Q_709LP8yX@K&?O^PX1~?S-s3sw`B3Wf_n_yj@aOI}0{yDL>`=G9e_P$~ z3NHF%mQBDRmBIR+Rae}L<&KLyJTUhJY-DoBm%ch~4?OJFDtg=7t(B37Kka(9<6nm; zELTH|*g%u&1@~H%LdZ7xiPe?#VA~Iy(4V3vN`8Mr71!<@ZRqc<~_GkdcLA17-hF4sX0M2iu+GyWlpKKX(}oMzUTTxbSRC!4owEd}bP z&itpusklZWMq@1b4@vNhCyL3!iQZ)HeNDz+*g}IZY>Rt)zfk4H{6s}-y_O0t#hUek zpB@EBumVD2j3r-;C%604eDui4_tLs<&B)!SA^Wi<{E@@J?M-3$qnIBo9*uZV1%4u_ zD>!8ut;hG(QRrU9qbW0a#$Q$xA5WPrfUG081({T}CLy0xRHYWQ+b*)y+183&)G0BO zHquC;TOcF*I6kIl)uU(eB0Z}fJ!^LKtPbmW1J6;f+3N8(AaW6QBQl4RFlx_=uu%v9 z=-?ev%T#XkD~={7a&$9cngF>w;R=iJFCvUh5rVV4a3k+Z_I{4K8cx?jP)TdD=}4@C z9Sr&LSz-t4*(6LD2|GB9ji1FQ;;b*T8!$==P%I?)?03$jQ#+gg=B<|6Wlv<}_r54y z_Bkz1cweI4&fcsk(c)_J260;ogA-^qHExQ64W)$nb^ccA2c-V`iSl@PtM7)?#~vh7 z58Y`Va^-`)e2anK?d4moy^j<&wReW&d}7# zU*VXy-PAIx1_+PkotgE9>{p{%r4tpGmh0C`eoQ+|c6{Tz`TS+Y8iS*{D4Ct9_XU1>*-CwpMnEzhfKiv){$S-7K z!EKvd+vz`3y#u_NEEBjuw)RH7l&HA%l3-Q`ywq9XPvwlhM|_MU)nBKr&5g{d6KhPF zCvh}op2ke`LuE)c@cB7++gVTqj|&!>7%@^Obg{0?`T^_eXWK;l>(kLaK$+*F9qE3V zUjs6~@-x2*Grx-UEArR1(bcPIyDJ(Q_gt)F({2;Jz43a81t6_Ta2s$ zraNSq=$2GBLr!Pc|C&I4GZxC)Fctgv*Aa{gVpr%0(5b6Lpv4-!m-p|(5X_F(lz8r2 z#vHup9VeI>8el?3e$X-yR;b9BDGRgE!!>^GY)BwOx=yL3Tqw1MsRj8~I;GauU!c^w z{d9*I?ej+cBM+n_euH|kx-x$# znE~NHZpe}%Um4LyLs@O$BdRv~N9N8Gq&aYI)_uu1YZi+Cua)Riu=hO@eZc!Co%G}Q zTi~<`jB_aAA9kZX3f;^pEA%8}rt4Z`R zQkBiw2*ZgqzfC9ODMZd>8^3IP*uvLO8IO6@n7|Y3fVem4y`x22P2|a`!uG#e4j7%^ zBZqlm?N5$5l|FBbvIY zjqf;4+A7ZM8CL?Yiy1Jp*CpmNURioGp9PzCW{;X>^+TMYw4(W*(UXK^%@6)$bnKBJqREuJNIX0HQ{dvCr1vbCu! zIN@7*5WyVg1&WDv{=?62r-C3)SG%$a5bA&VnptEGAw^WJdBHJi);@o@y4fup-5n5; z>2DS+V8uh=JUe7-AhR3Bjq7Lv|G%jrGPm>G`E`(4KO8c1{Q46fm5F(J>r#$sjD8~+~bw;25+NA|&gy@GScAFciWj(6}f3guA$!KG@+ z38jwycYNB1Ry(u(4dU015@dSD5Clu;jO}joeZ|l>0eBAsA)oyI1#W&N7N-qndi&s@ zAmh{aiv3|$tS|1LJ3RP&Po{(j%c{OM^J*%mN4#pd*!1##`PIOmh3zCg7W)&iqSn_D z?s4!5_E?V=_#$@y3T)WwF3>}Y$iHr4CIFZF)}1R9Ji}61UotiQ*YAKc2+ z{KHCh2miQugRuR{+SQds{kiT~a(S>>v`y@zwhSnCLE_OVOl3~1F0Z+&8asa6kUCFr zM@S1B4dHV?IY$03v@gj3s7o?v-aXs@sYGf!56y_-6UBiRUv`+5!e~IG% zg2Kxmx{sUCywd0K&o!qU*U8%Q>dMQQNH@sNvCB@U68`|#oy$H(PI=~Qt~Y@P%xi12 zRC|7SPI6*Fv*2dUN>L9JzOjO`y})w=OJeT>n|yZ7>} z2q}vToJzw@Atn{8dq+t51?L`AjhV?23+-B59Q8OxrwhQD}OIE4s$M)9h# zlX7refBC4(NJeZRX{vbb2MjIJ{BOYyW36h*E-gF|Y^K}Atv$UgurXW0r)59qk3VL* z&A=TWG6VnK+s&(U$t~D;S=J1k`RzVtAV6zpi?_AGYN}RE_XjlvF)CjFPgYHlzG{Nr zv{p&0I3=VOGnp{{=`T>-5H;TdS(CM~2g0WYy;o}R@JRwE#3;^ms7OvO5($irr(%#; ztOmcjdaUSL3HdRZyck2CrXm~DSMj!VE%uK;4$$P};gYB(47Wqi)&6aN(-gce=Zm|k zRel>T>NEZgA{PO*HaYPuz7-Sy7Y~TRwaGJSldP#RMgGI*e83eVv({4vRO=__pitTIdIYnZ8<+eo;vWhPlUJ4~NRhSIg}e5F>~p?mvldd?|1 zM!TVjkd^=I{ixOS-&#NG`5tmTm^L*(+9DWZ3r>Ow<8LiP$jMcaX>D3-TWb?Lie~J? z-~H3h$+ zdRwg?fHa-saTic9#sy$9HjbqfOlxd@*Gr~<6KH(pmWDcj&hB>sov?Swvl!$=wo6;Y zD76NRWxIqDXo`$Qv1oW?T|nGj4X2{yq4JxWtodY%CCh^?!)|UY!`)a8S(-JL{rYOZcb!Ak^zU4a{iu=p&kpK5&egf~jjTE!E7=)7&VFXj z3(RR^1=cRI?umFyIR(b%IiKZVuXyUz!g%WJBCJ93>x@{zF2=0 zjjv8G{J~%cJ39&z-K=~|!|y;DF*w2(1QVN{PvxQ8@hpC8&B5)M%<0zj(_D6gi!A4R z5$_kolHizq;F-8FKHiWv{&orP%!PKvm3zlid%wb`eH#AN*&hP|SZQner}iB`$o4D8 zsO%W?3qBSRrSw}`!VW)*1ljS}z%RIxFEiYiM)&2s&@Z_2!qRraEYI0MaJ=*r{4syy zH?DjF*WIUR7f0ZKb}qwjcmEh%$ji&wax_W280mfyH? zes(oCP|doiRrAOPVKtY0Nj2$n#nw%ZpZcJf0CGJ1F+K8=FWo;$zq}=*Up_-Z4j}@> zypx0mP>O!pQjQY3U4R?#f2u2rr>CT;X;l<=1W^X(-bn;33AEc??hJwasDIs*tnVA>sSnHHhbYZtBp>-XeXD)|GYAUHiH`T_;3}yW7cyMSxcu1BLF+5|wfC7E5BWHT1 z<`%u3uVREU&m5t!bG|5a&-}IVe$HevCuE*;;_+wPBS+{jZQ%eD3Ywi7K~9HsVT*Or zNsY*SF%V$HxQ{QTfrpHxyY<8AM>l&}`q4)-9@WTf3sp<*Rsl<^7>Am;Pjd`&?k&Ci zrmte<=s9lTZxhHFS?r9kpw_>CLqvPTKS-Sa%U#qtz7!pQS3RpOVHkuqn1joBjq+9H zKP_rFBLrks>PlAA7nIKwTyvhUNH}> z%^zXO*f}B74%?V;iZ<}2FWfO7Y(L`F0AS9YSHjo!Z+Jf)=dm^BO)i1WZr?AGSleIS zF33AvlK7xcOD@wf8S5L2A#$zcFTrM;;0G>Bay4}l=~yW0FlTi#qP%=$&X^^88bsEP zFMXcN;ry9rD6fMHzUN5f&y{|Pl*i>8E=059Cw~2WSD^tf`J-yi+G-LNU8e;L{)DKV zwE;Sd4Yp>D7JOOb6IXx4Z_0W$O7I^rJC^)=Jh?HJd?ucJ0}DBS^0~ASY6%daM8@4K zXV|^7n6|sy`4msxw}zyOWrqG)K$=(lb&}v@x_hw3pOM0vOPa_kxVX7zzwqv_zsT4J zac(UAsbJvpVUC}n5RkH+k6kZ?AQI{b)EjtfRa&~dq|MTYN}5Q8%I&1We}81HtJ}4G znRwy`o1PoQ&obPCYakPU(+h9!>DV2tfj8{E2K?gY+J-$aW9Ul%imwRY(&dW4G<@mv zgq>O`#Rr@v{Mw&Nv{FIH9Ra)Cf2n#{7{E@A{3&J@~jb@Qi7%u@B@9DnFrBB^#c#s+IkxKd>1 z@RZ_J*R<0n4V_XP0+B%3kMnNTm|>Y1UVV-k^&9%fS{w7{Z!qRF{^Q2HKOc}0&wFkp zpv`y3P|F7IJm$D}yxAD-g`v?wMP_4!FC(!(o|XVXl zHu)El0_*15qiAZ#FZaZfVB7S})lAR)I#`<12^V44-4F9`bu6)Yinw`A)YBhUa^!9c zs1Vn7;BhLwaXyEf$=AfeSUCRoWob@D55{7(9Evk@1Sjc^xww34Tnu~EIW&TA~ z?4)@IiJzmL1sf&lXh%@9UrmLYmrA)MOTCC03%~7(3~Xq1_epzw#4$N_F|l$A_TN-n zt(+_w!AqjPOA7dJo=jj-R|?hJBLBgA1Nd~GhNoWv!rcnrUcaQDYAlH|hHRI6J~You8Vh&YoYxOpXQ_8f+_;?|LX2nl(FxXY{{ z?o0vG36EN1$*-o8aE=q1qm5v8T-2?HN}CV|G+y4cpB#mz#E)-(3*sI0H~SLY2%8%5 ztUa=U>lqYP>(4{t{m3>KQ#bcFiS&ap&0g8gy8zfd-^qZgIy9QHyFTf`P0gI~$G0=b zkl7-NLR-vS?@;M`REz6(hYQ_q1`5HJE-PH<8z+;`?hhhfC|F!?`D)dNKs*L#xLZ$Z= zDm33(gFRH&5r0u5tMmW;xbV_U!}R?;kD^}=CD(}6*e(?cJh30-P_n3|K)3i7{E@FDcK^u=}Gg3a}X_5wfR5r-yg=<3mk>_?t`)s39 zw?-ZQW1@Xx2;q*@meujW--mbN7E`poI=J-2T9f+8ss61YMa|1{>cGX;?Uc$`s>SDh zEVX2dC5yHxcXGuzI=m7_&1a#F40KrIxQoTQ6%2$oV1zbFfoouhW5=J|v-Z%(!9I*mI%fi!sjP9s#t9V1m z6hdx59ptqri)aqny~YW#_^X(%MtG$vxguR?2Y@=isk4gY>!PX1rytg0ji6DMawTdFxfddONsBvWhfZI#7GmgRKC zBXoz(qi@rk%(+P;p(vli+++b6VmswI! zt|Wph9D<+-~GZY`+W3=P5rv3w&{wYIrY0q0_YsL zYV1%1xPJbOi$yQN)C(6zTLAlO7mTA<)8+b8G_Wkod zP7XA3n7vZaThX+vjrtKA+y)}UxS@#+reLn*e3KmPtxrf)tcz-9_Y=G-GowvTEK=0t zU;~j@4SMj|pR>H1>14Oq-FN@Zv#sMJ)$!Xtavcwj4aYy2)$#3xJ9j**ngyG)yqtG9F zN5Cy3i+N1HkYSlUBupot|3R!XvAIt2`Bcg0FvL~~f$&8Mfl+tyQ?&dRz2urUfP%bO zLx5O}!cVP^mmgmfne!)mJHO46Hepyib-yL$3-mHFM_rG*)h(VxL$=V@3mTn5PWxTH zYzwa%F0gp5E^=#XVLpvgEJq2fnI@O%x7PP~`ThFZP_7SAGF2*5`7$L97{Mdgt16h& z`PwI7pdbaXZUcnUi;;i6xrCeyP-9N4tXom#{gfyuDgmRX?D@FqVd-9}$D$aXpobBa z@jF*3G~?CKA8OIf^-uMxgHWm5-|@KX-{V&vjEVX&r|@Ugq}uYW_3!MQyFa<(<*!~j zL^%mvHtG~*e7{#l@qL)0aW)nq^pTX~G=Ke-he)M-vR31h=uk(!-$zOKE?U{35Do!X z9!xtYsi1B<+E${@U699bh z9gQT$nT(G`>Kg;_diYv?G<6JT=qcrlr*3gG_Hrb#FWIV61NT6Gum^#BI~oQDCrVrF zJiWueWV~dt$ebA{mwNR!vbdV?oTnDm?{3B=ok!yjGSv2YL^Fw&pE$IBfOTIw$&dYS zP*K=o@r!} zC4aW093mrAHmG(S|K)>K{bC1Yx9D$n{Tr;})^(Qr*^=^g3~{mrhw(JF4Ov*gc~l&AEvNBtYe?g~Cj$ePo6 zERbGgRWvQMFfYV}6W%ST}ri{`;FiG*`=g$#08I z?cg?LCd>bX0z?93Jvo=f=7Jho{d`-h(?EI zk!~0r@{>8zA#?bIDqo6g|L}NsDH=j8eC`w)f@564A{@kcFhioZSSbC|tr55R!ycqb zFiPIoLXxN`9~}tX6BzwI`~9 z=By1eA`hK&`|9R?aqkY%Lp*h_&8A}243|kj@>x{bY?A1?-*0y(6kC&~bv~;xn!4Wl zo?5ED1oL#=5;iTHzpf5<&uMAA9LIuaaUv9>WA?DuqjzQe`Sm~%j|2~b}ZLh|XmFDD*3M)naQ?PiD>70^k|Jz}Gw*Wv$Xy(NukbmC;vw?RL^$E3A zuX9ce)!)+)Sgx3g#(;%oQX^ZvGK2qZT0EnvhoefwC{S_`jtHl^t=!C5g(b^^yF`9$ zKK^NSE-z_Pn*32Q=O3d&%rRf1lM(yvYPdCj5azs`=}7VyQ>i{t@toyHg)@5!&z+Iz z><;~4lj+~8B7MH5vPcb|dP~4|7EAdbcxC*Z+VCMQ@Ykt7Z)B zOO%8{ni@$Epq)ESaQ7_z>}27FnJ%28Z@rZ?`U28*m#U`E{?Y$GrDXqb(wDZjQ|lW7 zZ>#Ll_0`9G|Hn53Y(Kq!HplNF-kW`Eo70b6=MKL&X$Ii`83adTVM}%IR|RRWPM)>gg$%IL8y%! ztC(ofxzBHDENhe12P#ED`O$C0C}A{<5#w9Nl}r#3!L8iUHcFUw%3z)7y0-xydGCSn z$isN+KYTA`v(_63P&;mjw9da`>Fd~*OfH$wwEfL`G(-i%_MK=j&TBgt)_Jyiw^|`! zfU$PyvikQ52IMeOYBVT?i;7p+OfuO|bmRLS{2bmdO zU_&{g@Ca1IsX_aYa5q!2rqoI&KZfZ_>}j!b?9b%e%?iSrDeoNhLBTuZ;=9bU1nQFH zkD!f{p^b*)LQY&Py*Eap@YFH)IiBizz4Jt8c&c^6%PS?AoBy3<48a>RVu+jQHZ|AB zL?2!w4c9n6_T;JA6w)Wv7(2~KYazKPZ26gh)Lk7J^rz!;*^e$*E|@B`cW@Mq12Tb_ zG5IN9Q=cbrpci;ke}g%W%z2TgXbMHsWrebWjCxmrSY2{)ocz%?Oe>=6-;eHrBK4za z$G>oK41VF_82rl5{3^`+D%P*aUtfx@US+5f8TV4O<2@W`2YxT=O_Gb_^M-CwuMUfa zFR)lRN=sX+;M4(PX(PrdDPI#weBD;O_0f*)qoW<~S44C9`B{IA6jT>xgOmD2%b&c; zE(a4DIg8p)qv3IZy{qPf|0eH*v5kPupfjJhI4DXI(Ub)aihF%AGROaPh;vYEvTukH z&}P4t&i?In!Pic1hDw$)Giif#4g(Ew8MkuAE_ zax?UP&OgGy_qwjb2+h*N=vIGJ0Xgjv-D)p!BcfYLe*6vbt#;TU`WkKC_PRgZygB$T zxK>ooUM_u#J2BsR{a)wR@1%J0?9GmMKM+V#K? zG-x}1a;2k196xbZD){J)jlY|x8W$6yb2)XpC7Jm*PVMDgc#`IyEA~L4;||dLi$vVy zTNY4M75L|#8pJP%%sG=4M+=Pufec)FZ#CG1o$&GZdhWsg7nhl^l=fgU+v?tV$ra`^ z;qPeW3T=D?Kg}E4=mGK1N`om6{4}x9w=TL3*leBk?_vX1H}uOlV0qTJOsj6rgHWQ; zOsk>`^9yhUVu1qovR1hObpl|x%R%f$2l3n0>z($3Klx7B6*-g4tzfv!cCUR`i%NFy zy9DSyH+==4v5*Hd5$?NGcBg$8dp~uWP#hXtJavc7oj2sXd)bW1j>Ydsh&}lyqwh2K zw@j^W>*Z?gYwPvsuY)Sg6(MWuwdkLcP^izq*#lqhaDckr0cvR*9Y9oRCkamE{Ex?K z#-Bb?Gj1p0>Hu4zEhJn~8Ls}bSL=m8=WbDTNR;`ocp}G}8+Puj-6U$)@8!QiMvbrA z9aIp3o2q-L5CYN;pP3ZIBB$k3)oR}zM$cFDSGS=FKmWI7(I0+w;SIr-q(}Fpelq!g zc7}iL=);ah_P0^EpJQSBBaFksTnGhXh=?7r1+f$c#MvfbHx?!saJnEC=4-`GUBAVW zrQ0m&&BAUCsMKmm-nBu1Oy0POBvDcH-H=Mx@hlyQd8Q&_S^wMUzn3@fhp@WH2C=%p zYXS!5`g4B;am0t+Cu;9IiZ%5MF-E zA895P+6bD$%$o4>P8f*7EH=GMXxhNo@k$3Igp0#aFxon%X;}x=y%k&dfD8T=_PJ%HJ8l_{TK;C%55!>8pTrt2&#?CW4(* zGV&eEHpuQzN?g`p7O7M$!!)Fk;7szNkmt61z>dDa{bXM5bGUF0!Cz9zY$s_ z($>k|D1u>L^u?BwlHl7&@pyNzXFA zgN?2yca{`d4uUiWIg3d(=q;+%dngDGTM5*aj&l-`j&G z^Y$B!Ln;y+mAvAA;{}I^1K_*!G&gRsukls9Hu*((nrWS`dXTJ`kqoZvFU`Q(>7H zn|z?8$tFEW-O)vnW>JCbGy1Cg5DuMkt4(4ez-(2q@JOR&jdgf#5KJzw^LRM)yZ4KE zu?7dP0i`PTzg8vqq2m~>s=R`OKe2smLvKqC@RRJ~PlWTKwPtK}xL5&-1g0 z|C<@NerDRAVYaD`Ib^`tBmTe2X0%`Yuzf?O{Bc3~ApZY1dURx-i|(MSAR^60=<{@v zqV;##i2+DAsW)E1Q@aFdJ{2|`5LtXYhtLI+KgCZYHRv=F!bv7Iqs;7Z8(a{wse%KQhg*{=h!QT}uPG9g}!@|(@JOJe%dPNV6&BD}Y zOvL&sOzn-Iw+E#RKf8tQo-=W$b3Or=HtjSM!;f<_;l2bpdqci!RkZx2h<6v$jeW(X zwdJcDI{lY!(#`|EQOoO5Z`2c#Z%2PTjl*d%$FB9qYP@;h`V$Oj&NDC|EV(Mw39q22 zBg>L0-RTrJ*&T1`j$Lp3ObeFqt`Dv2-g$x6)!^fgywUC0MDZ-Mw#+5WaoX{(YY(BG z823LrH)_18wZuzS5+zin&MU4;UC6Q5Ob$FtFu1u$5$k7R@6L|MvDRJ@>#^lPUFs*U zR|IvIUhMmqYLqPhTPzKov>XpxX5J2e86nWS&?}+7Ou1Wk4paZTxkU7OVo#?q^Mjh( zm3n#4E&{g0o(8tmW$!Gg*QbYSH8-W1E6}Yp)3d+$R;}t%nqB<<&ahWq4%oegej`CI zZ+-=>-tud;8ip@4p+ESX+#R8R@&(4f8_I+es?C4=qb|4qb$%q-vmLI}+3$8@Dj{xF zYXl9)2!6epMgU>MzEhRM%X{Dt^mX^AdSKrjk7i-th3TCk;CyOJ=ZBgtf7P^L8E;LG z>`SZFt>bd`X9|nl%l-^$9?d9wK^Y#I@$5SP#_{w~WVF_%bI@IKK;0=IvNleW*$GSuu66Tz zs4DOZqMv8^3ElFZ<~6J%?$zWHfVd=I`^0|ZOE-_(15<_#cp2j%6nVHKa1bK?!b!HV zL1OdQUmD78-|Y5i5vrE1UC}+^y?)6)Wt$W3Ue`bg{;1ALxU)_MDVITGI$TVkj-j!{ zwtkVh9+|OS+qZU1$K(02MEe(2<&Q_^Oi~q+@F*)Eks56ZtA#`0(y2uVVa3eK!YMNA z4&o;)xL0(kjY{Hi>?U4{Zhcj{{luFDb=1*u?sj8QT!2d%(~X+_wv6zow$6xO-%{o9 zrF;Z`X+taC*>@VR3f@&hKc;BcS4q>)EMyuMuGTc<47Xy2NIC#8UnHzf%}h@l)0((f z@Ph%Rm}opMWSAOFJ}H!&B0r_BdgqGF)>Krjnh+*PR!Gk8{f>rTykGNg4Oiw@D!*6I ze~r<#G@Y*yKlG+|z<}f`h`CpljOSJx&xqSdjQQ-`E}80Frc1vh6Vs6|FhbY3L)8M6 zV*eMH1bAcSOB!O4+=SfuaC#%ce=nTLeiZ+hKE79MEHCe!`$GGIk*j*({B56Q;rv~1 zJDhi+r~E=X()s)B+Mf>MZ`u9tU*f-pHE`ZhrEKtQPTAm%e?l8P@Pn(VifTLlm0#Jy zMtf3GOEt%*Qlo3PcSXMRn=Zb`Lxn<^ioYl^ob{sp5EUQ$E>jg##Fs6Y_4vEbzXL;UN8bLPXit5#~<;*iuE z<#4l@|5208J22QU6V?{DA%(Riw#Liw*RwsXt*_&3TO`(gtz=3mZijOfeXQfN{BbP| zKv8oPG3m41$hB|K*KsYAfTMd$FutLD=@+@?uY8FnI=+aNKN%yQIo|AF#J0XdC8NhA z-sm^c8$eB>GD4c~=^wv9Sf@@xTh-yjnd`9FAnah}6sJK;zM|m1$uD#(cKCrIUjr%Y zd|-vcFATawQ>)+XrYQ<|BSyX%1GMd;s<1E=#E@k{=14E|VF~L#@hxt8$62@9`PRl( zS<+)u<*(;gtH7T{LBQ{#ov0^0p_^vJUpG1a`mTC7dvlu-`0IS7UXa2wZE-;eTf}=? z>V`%=ETDU7kdC`W&0UNZYH9BOjQ?r!{%1ZA9~>H8`o-Uu&YwQ{s6tz@xlFrk%Nx(H zux&;YHDY}GebGGl5bDw3c^uWJ@Ids&l??Si`o4=%*s6Xd+WD&7vNR5&kP-p^ua-41 z!i$*xW@Dv_1;d!VvW?QLs6Bw>A9vx-FnY_aQCaZ0K{WGK@Cl3q0yu#NBaeXWOVnr3 z|D+DkKNw)Ezy}O_DB!j+xBmtB4E~MX`ZUETJ|O^KppDZNA`=1M6#@8O7$P_X9}|yf zfiHx&Q#pn~9b#PM{$MsZ{SObJhQyANM{G2aI4aLT?Nz?6elN+tC^Pp)$dicbM3G=- z5P&6&_&0)g)G+Xofr3YN4IW4NjnH1M* zz=_hOOy=cmv*f+CL7X}Hq4e|e-BOkWfvH(JqIe33V^xZk(Z1_FTh6N&q3sz?(SSO1 z-Ai{5OlBpRk1i8~qzCMWCY+v1zP(K_ouw95(}I}00)z(j(sY@c9j@kT6g92JEdaoS zwPiwnJQX>~8`v*izJA&-jPfOM4K@E<`r_i?!376>Oa6b4xkV9cSLLDZ>R1vz^NRG@ zCPdn(Go8kS$T7NFi3*wkW&sOJH89*i|EKR@6{IY5tWYk5bY59xgsJ+6r*nlF(jTtj zhhu@G_5crNZ(bsFfCU;_ctM)FT^y0ft!*Tj>2?kvidide2v;79v&X=RQnl6(il-K6 z-y2WelS5M58pH!U{NA@N<>ioHlMqfPy*MA1_dN4QRI*5O4o^e^+g>zd5P$ctKSaOl z4-kJ(--k+*#{=s3zB{qCpm9sHd<;}Y%D*m%?xGd+J-4OtP&R;v{oi6|0 z$sai#(JeqD>MghBB3t+8)Q7A`8U5dWTFEWGvX1|2IG&MyFo-W!AS&?YmZ-YU@uI#K zRSX}k)_}Zb`+`*P$Q)~M#9QAy%JwfCmy4yoZl0IHSrZF_6#^v?G3L5ZCkV+BXx94| z*a{`F+B=E7${#PP{Q7>WxB1ahG65%Xf%_ zZc|u;CvSGVPZP+#4p8A5N&IYX=k>ofA7Mfok-=z41)NG{qLn5A1%|1KW82eDK|A3~ zGxW|dBXzxRS(a|Gk!O^vl&p3bl)!p~kHSBI4xSiu9W<13~ zhS=~TH9UKzC;vDjDoYUHGFZ{LvczXyZpXTJA?I<_L5sk}X=NdG0bd zprztEVrmTXZX)fSS2gPZvL(o?22`)jBW34X8R-vrP@_s0lH!_$_2F`B>`}%cff@d} zfO87X&~Vkmh~STb>EcwA-zSQ{HXAI5n_e9QU%e zChoM%t_$l9J(?V#t-_$|No3aEL|1glOEC@yqHXI4T+kUI;-g^uM-JDmgX`_Waw7d) zOEE-f80!{vXy4FNx6#?5hoD27Eq853Rve71nm&8K1WWxTbXnY6eN9v>`C6bo3vae7 z>?|~c9rx`2;u;X%8*-FJlpmMazUt2pIz&1pNMhQvpe zK;sjt#G(dM8p1!PWZd}V-%)yW=8tbVsIay*W;|;P`Ny}MUzkh9M5TK^sCW!ojH=xA z)VjU1e?0lB)gL4v9LbnP zjSU3T3Q~nqfEz#q%|T#(cWEF^|M?koa8YY=u6=U`0m&~SwtrZ54Z1kg8Oc7_TpzgV z6F z!D6UC;hsNr^-%Nz^?MVls9&^eEyzjuyi~=295KNWc_bNyl!_%*4n^Qb{38ku!s%|< zi42W);Scj!bnENUj;_&(_qfyKAk?d;=VN06v?O7(FhTK}eV`Uatdk)i1q`rhYAzFm}&Z>yYq zD~gbOyGAMUtGs0c>^+% zURC*~$lL?@9xs10a?RWMu!zLx10vTv!!Jp3;ygO`-$oi5@`U_1?p*+v`yjUUAF+=A zpo4j5KvnKD@nNqN!>NEyZ5?+Vdsvy)jk=SWRLoT+0wbEoSiE0t?FGy>fsy)U)*SM8uEoA5ds z@V^%gg4x>G&MJ0yg#Az0=2%<6h+3-!>^Xn)0_R?`GITroQ{A&-m*K!2yA1 zjlm-$=6}Zw{&e{2#Qfe8zKV4oF94e+2LLvzXGr)~VYh^zd(ctHKRXs>%lB3U5LgjV z1Ziq+Aex2p{q@%|0xz%s2wk9z|HmTyWh;)^O&~_|9*D!qv4zekQ*(g65rO1oe@mkX zEKa4~ncQ@9r?aZ@@)`%b%|YuQBq4+XHHsB>!AorLGl1$0#DZt?!kH}U+*2E7%t+kztakSI`uC4qbG_ms0`7-;F zep39@kSU(qp`XI?SfYJ9yrAE#!)iO)4fTv*QYoL0c;;^*8IL|>xX3D%*S=jma7c$G z0e2yYF?E`y%r=2KHM@;M(bO+gzvgFSz3mV1(Y9ubl&8)%S{JmSfP3rXuJ{;)QV2H}gOFb>YyZ7kw zR(@t z^O#eI9^=aiCWwPV9%BnF;g9*@kA>lnCH&9~`=prkf%M@XZEi`E-u1EX(gM;uuWDA_Hd1v* z4X9q>xSkgU&rL!#p2K!qg6DR=vt8R$+)M3-+cp1RoyagI`y<%KaN5eqwgO)bS>w6S z>*qFpR;BJ}qrxg@@eoZ8EK$)qcTPB2W)5+gIm{B2GByrC(Hy_m`*;5=v|n$Yqke_) z3m-YkdYN(X`SwNZwFbTK_FC1n>okjA-l47XpPDICG)QNP+iabfD-L9)3NCNAse+#U zy&J^eg~*Su-5HThblDlX-}}^%+qa|#ax4B}-WvCL?arT92=a8e!#@T#=w#Dx@hjG~ zqN@CbD}R6pS#l=PMOHTa)68?VDmaenL~-`d%YNQBe{ig~HNCHN%6;<(FYk*RpsX|R zbCh+gy5bcabafUr|8>pIK(IcSuJy-cx;$eBA~HM@wZ7@ zRCXcwIz?p7E~Q_0zBnD6+ROs2n{JSO!70u}IO07RjV@BOJPo5mkyJB>Q|`QyIsU@a z_fTz{W^XPwEPlW#=8!*&?D?TUYv*(&-Fll)@(T4g%Yy|!Fgt?}lu_PzPrG5;_KZ}* z6>nJz$Tnuq4p(Y9eqxiUo%B$ORwdto->u9iw%qw8-;XBHe^QU*kC8c>)j8g2vE$@) z1bEQBi*$WfMH~1UORVgN_}eey8AW?}SIq_ful&}*e=s?~zh@S>6J}!1uF_sGG&E{< zf)q>daJ9(NU1@2cdP3;YFtwD6kTa__`KH)&pync9ojpHbV{39jvvcY%$nIoDylah@ z-&?YYj$Jtsba^gCcfS>MHz1ewmj@frf}5V`tGhkBlYW%C!j`JMStXnR6DYvlr5VPG zj+bwr)}Y8q)$ybsm)yDDnZ9@<3ijn3Apf_LvjTKLPLBRpK4-h4hQl*&h^q(Bqz{49lJTC|E5(wuDn6}{0p5^?KgJyW z`y&sQe=1(abPCzWMZhLw?6r|O%MKIZym(1ts5A2C)}byUOz`ee!sTlIcMN&6%l}lS zPhQ?7uJZX*?!U!*TRsZKXBl%G?F2g-7FWnZhy;z6V+*v9gNmSgi ztpR}ro$Lhe&0r@6pk?{tpQkf<5%V^Uw$cXL)JSYaFvA*yhmE7x<<-SkR?+5uYV+qo zn*r|{)DZHnzqMz#`3-9mSKJBt>3cMViPic3M;G9RbE}@HA57n$RkauwGcHH(nD!k_ zKNGS>5mdYpwM?Y{tYT+ z^3&hQD1+kO`6XN2;`_(`jE&1JG(>ov@i8w*Q8diAp}TvESs%Yuf6=s3EtKCqy4az> zoNg4Dq^iJ42*M74nUKWe7%gw#?aK2s|8q3|Z9V6IUS|Fu(_FX{LqmbvKkY_={ku`X z=GQ-4XZisiSX;Dec<^(>12roYm_oCKYWBjQ*#HIhofe|N^N;pwwm7TVY|KkfbuB_m zWtz{%bSi@tWAP3bR#X>q@H=g^uma*-r{L(xwU6zleBOvC)8ilC=CC7bk!m?)0XIS* zhZRG&-!i5BcgG};*|&Cl@|=AK5cRZ(NU5Mi)4vTYx?)C$uZ@K$?){4d4tQR*e>Xu* zTE#YP;u7D3GUwY2T_GaB3Fqf`f9(aR zt)G0!{4C?3-A+7=rEV9%hFc7+A7&aITYTjyw0fypefn3f)nIz2T^df$(Y;%ptyWv* zFb|bVtS~B#(_C6hqH5X&vc8s3P4B9}7GvR+_B} zqh5trhI-u_|Mptd5Re+N{%J^LJY{zyflwYZ7}>#$EyNl z^7MBw9TDFS|2h8s5jFPY-|~)AI})RXAaN+%NiNc|K)O>^v$62ZswN{qJj95_fqMJ+ zfBmb=c-pJnWD6r(mt{9%%QII!cqeqB9@=l(xm-+gVuuVIju=G}EB|ErI8?>wkD%ES zcE!jElINP#4`8Bx1Xb%id7W@(s;PhcXFl%AW_8k?zTp>%{}I1rHv`wi`+&`_zaGM- z*Dj@d^QC!(3o~#286o)864MgTK76n}m=;b}Pco+?jG3LJCY?o6~MG;BHzJQ~@Yv<~-n~nfV!EA-I7Eg3G;Q*kdblS==zNfMwk zOAKd3_lOI6dCLbF(Eqj&pbsDP-vQl!@Av>+zZ~AC-&@cF+#y z`dpCk^Zlls3=*z-)R1s7Nv!7`=`8Z(Fi59B<3#BrMx;9)PSazXYuU`4-h_J=(& z4qpC-{~IwiFYmGbHuw#{W$;H2+{NJi&&KvWT3f%;Bfn&GoWZZh-1s0&8Q3F#8FfOK zca}8i6U6L@H@pv}IzJfHwevJ6mgDY0`7K)*l0&D!-k>_VdO(Td=81(Ff_Nitzey$8 zgmjk_u0W|lqu`Pn^~7y(NySN5qR3kE~7S3Q9W?l+As|-y4F{W?mr283Q-29&E z=!*eg1b1TmKmrpCbvSSt75`dj1CVfbF0Mhs32nJQhrYV_#q_UUZqvVnB=f!e#mKdP zUdWL^DtG082X|znwY6s z3|Ih4tZd{Q($ID5`G&5AxrVO8ehs=d@3RYZ?Picpz8YEC_xxy6fpG#tY`W%4NYu^W z6B=7D`*$534Z7@TiDTB0nD89NO=6`MUR|2cEC$O^Q?-4@suaLi`)V7h%4UQSzF{G$q z3Gdw&J9So}3ov;>vD=wCRCFjCla&rw5d;^FC%@3*pi2F9!3jOY#pX~@&Y-cyV!?d1 z>fL{JvyMh2>@sbf7pY5d4s}7sr*H@%uR~q9fkV*7ECijb$${&#^g}iy_WnyqSKaGA zy=qc@@RB+=736vjE%(Bdamz~$jVo8(xHX>eMd<)cq z2~D8uy({o$@rJyJ&H+8VELJo+E0Y1MSY02v$d`1jk^S$LDA8_FVyZu|Dgq^ z?GicP5r}EAP6szaD6^ZhG`v>;=3txu4;3k)|M`xA+9X6nOcdG)6AdFBCbsd)VIqo< z%Z7_pa!+}1n+CSmrwY0FqA!LmJcKuuVFaC zqIIMakqkL99Mo;Lwe+;x_Yi3uC)N7h!uylFgZ4G;8WhyJqm=q!oQja^kG(ji?Q65q4*Rpe+z4H-QAb=x7z+s=&gEM zRaC6B3PzI~>-gvB6TSMw;VIK|qwBv=lj?AIe_Z)Tk!$v$QMI#vb5;2}k!!Z{S?Y5f z01scj?`VE&lhqSjm}XDbo}?bj{nxF4{rY;`p~?IK13%vS#|Uga9ilaa3T=R zL?=gJsjrkA>^)fg@f^7euK0-#^Qpeo}2k z|NaeU<9<9evh~c|V{u zC%oB3KKcY|_lDd*pWQ)i9=iis`sa&S3jJdlUu3Z!nVG`$gzi17$0#6M_HQ6(F{yn;_l={Jbw|IhWp zs^H3Bu&ORv{@e`W=xpyiNJ4@);>~}Tnt!F`3xWtsPpquaJ)%UgnYFg4@zNh_5+#{Z zts0Jc2chJ*s$aQ`0~_*p9%>2IC#YWVpK0}HmjYrz<<=JHEEQJB@;>wTP&;1USSkqJ zM*Y*0Vy&UX>wqMH*ZT5bCXNAqIb#-S_c~~-B}0xUF)<^WJO&!5SDW>kAhS-aFDVS` z)@arkI3IH0g)TPm980nmxfWx|zr~Ypj_LYa_@cXPFpt57PnsvV(pU0NKkq1qFvb4` z*Gw!Q2($4F<|I73f~ zvEI+OEoFc*>UIxA!^zkc5v~P=y%7V|O2k^pF6gk?5H84?K{q%4&-^=nD6|gFhu6O; zbkOuiy@6L~@!rJmiQe90MHr2s<^3PQ22dZaxYl80oAQFa0+++cm@U!5$QvItjBK@J z$W0_#{*A}(0x2D5XNN*BY$C|7iBV6gNdu%*qghBf*Bx#{n{v8{T=%r)d?7aMsjB3L z*w&4)jvYu>7Gh5&kukX1+Ub9E<@j~FDj{;+HT>m5Kr8k4?ou2Q9Ad_Al&r!?`MQ%W z_xCOLTUEne>|UL!4t=pI_vxzg_aoOi7tcznm2L?u<*H%OP-kGPTy^N*s&e14z4dZ~ zaIF0G$aPPUGjg5NR5%isO@a7jd>Ch%fm&_r#wf#yAG#x!`wwcAQA872s>(l@ajDFW zedTA>-a=}Y(|TqhwR-rTL&s&ikgt^YEtdaY7e9+ebfB&8#g;x09KNGx$D8FfokED9 z5TqF`}rAH&$;zw2Ub6J!j<-i+b7oi_x*Rmw{Q3dhHu~W zpOb}<&PY4_0rvKB?6-L5Kg=InZ;;>vFhHs5dAA+#L%|50vO*LuloTW!2XN-Ne(DIv zdD!U$H3fP~p`4*6C}*$&<=Rw3ux}C$SWT4E*weGY^FY5ZH7GJ%jpQeH{#^@)Swk+< z{7s2^T2OG+&KS;w_@@$Eq%qjykD4q(ycqixLfUBcAxwqaq?nViIVQnR-hZhXf)t;X2S~Dgm(;51=$OV6_Ep|4^nt z^+CR3neRBH4~}U-GNGzU{r}Fu3axQ&YW+*TA_#J__72$`SeV91^5rj zT?E2_&0tNSjfEyOOp~bOh9DP&Np#lKPo|!hZM(dyrn6@X&IJGq1fyH!$x%D|ikklY zr;S59Q%ugGyUywKHw4SvWnGl7_hQM1v_lqdHOX&%bH& zhIOs1K9XltazCK#H0Tm9{Lublim9Ih^H~c^eJk_T;Y|DqIRBZXo~=P`v)-VBCv@0DXyLE^lLZ(B1V`|iH4=~g+TXZ+QDLafWwoQ_t5(icr0{-zve2z z!{)ADDqz&Nc(<*6tVCc8Cw90bO{=i`SR&Lpx>^nX{*G^=DmuM;!_Z5Zi3%9FiE<5BQ%hUl z>eJGyt(|Rao$#q)kjaU`DoCq1)Shd!f?AoLn*aB=_BnS50kO~f{`q{!Irp4>*4}$f zd#$zC-rJ^SGK$`S__@iLKoA3=xB0JQ9HDESX~baE2$aP88UEqd!cW3W$Iq^rUjsio ztDFY&9yPBc9Y5V4G5qwf%b*-C|Nr1;(b4;WpGwnD%Nj*$j9C8Y#M{jva>|^Y=$0OA z&oNp_x+{6a2BN(wKl=T;UiMZSU%SCvCc_#EC_=Eot^%h$I2@Qdw&|d-pHk!754*{f z`$90CE{BT(c9i{*W+Es)oEo2JP4tmp)M@*V4c_Z7xiNpL_z_MCBY1w?2DWoe4zg7@ zuwI!}+l0Tyba1MS2KSZ__y6|4-sxza7qF@~ zY6xQn8)Z2DOw7+zKQ=zx8UaTI>PfzE&!3z}uL$Tsp zm`Vj|yd`|2Ns2=pmE1XV=Q1e>Or(GLrUd9hf*415_uzmcZ zyF#Jn-`Pi3-*DZvH`NtR5!i$I;JTZxn_j>FlsOH3r(RpnNe%m7Q+G`G+3D9#yA{w@ z>h_@2Eq(`9$mXLhU4yCGPk&R?1vqi z*YcMJY0r5d{d1OyDtL1)RH`^Fs^mF;VTGd&sci$p@l!a?=+8yN4C= zqZD>?MTzfkoMsV`HagG_*ZQF1BfC)(`8m6+Magdib6T!UvfgA&L_DLEy}PW!ha6AJ z!#duW&>gc%IiJk39>O>5st$@az82TK+vLq_i#KHlVf z<2tMJk_YX~x447N{bqLia_qdZ-8w4cee*3-Q7%J6M4K$Fz)U?zF!}{OmDM3YI#|F5 z6j&5ehMoE?Z~Oa}86JceRRrn?qpj^)*YVo%u+(sVGLy^z@ul~{n6Ka@^|O%=q>GZk zgl~K38WAir@FSn`oT|-Y=#AdgI+-Lc3aJh}4j>m=`lr`nZyqzy5Ba)*ef;U|@HX$& zryXCp*CWJ;Z7LZXO$1at1!JMxo&TyI=yx~f3uUbo%}6iU;McOyV6aP{8FA7(X2hi$ z=obib4@|Q;k;1=a(8=v&y{9rl$R8W%>=)Wa=v??JP+Q^TWd6+4dr84hi+^erBKpBftl$I0 zo|s9(ftx=FHJ_|%VSJ2O7@wVtW{rYnmQB(CU(Wf5)7|*)uU-m$D@YTb`yJ;3GnQFO zm=j#q8#M}eT}29JDXc!L6reW))LT8x0rWF~Zy6V401xjHVEdIqEL!S9q!MP7567X| zYp0(iq7<`-74}ddi?93*Ia)RCJu+8$j2H%!my~4uhzvQAB)mSuWPPJ`ugE&L6S72s zvjC|5gM5%ay3QIKpsQP#Alqxc2D*OySJ3stTe?J-c9l4O3VG?BvBiQzTrYCmLN@<& z*q?*_k1@aYmx%ygv0;K`ZJG~MX}2X0oXeq`-d!Jm?&4V`e6$00(MKieAC)k0Q{HvPyW<%xJB>zbH7K27gx^^VzQoBHu1=A|oVoW7^UOl=(NCnfAg z)z`&MjHxDaeuUIJ{R{-0ZDKZ>3H{eun9xH%d`FKKx<{+@s6UTdO;>n{0$(GTeRWu; zgzZlDm9u{z6$+vs!IL*=eAFKp6NE4c+cK@lx#+|s=;lpARiQKxhTTDtmUD6=cH$}S zyqFnt3gguD1SlLZ%WzA+Zv+}xf$*XfPKjT5yV`|SL5nU&a|yQg)U?_a1u0!SGoC(w ziZ=AVb+F$<@`Fb0(e<~Uy8bOQ8A^|@x~|<$_YOsdw8BW?`*74&7|qeGX%%#Qk>tGG z7JIlAMpuIRqdCjc@!uUcWr*C(R|O*X?tDZJOH%+={@rz>#ze)N)G{02Hn^5bWGv1ll7}m_`4Xm2%UIFI0z%gJj8#S_ zShI*GfA|Xe z!*P@IeFiY9I|gXnD+4h02KNSd!oNJYmf9lxikG=bM$Wz{r{e#|AG5Xf7v&F z{=i&k-#lO{DKmdSexn(EzTX&nvZ_2;SL0X?&91RHycbumiC!8WMhnnI!G4?ski0Tv)&UtIuhtGnvvQU7iF^)2FH@P`#b?+JwfcL(bPH$W!__5gU00{Q zutIlzf%pXTL$)XO20eIc#FWL$u?K5$|JLc4=j^*C*Apu{!`NsC8cKOA?*G{_SjS+d;byuAUF7sow;dks!2j`@E-lApo9M= zHp?_m9*1b5zST(y9juDcJj4X%-DWXcnX zTA#>>#Qf+RZv0tPEd4>^KD+4vI)2KfW_@VZv61>T>nLj*9ld1>QLHW7!|~BuFy6gr z*^dn_xi4e4c!|RpN4`Eu4@ETWrY^(hO4KcEu$s-f1_Ubj=L4yB_BVVeEc|f z&PM6v&v>Wi`x32@h0!2zVl=+*-G0&j4!Jbgg@``Sp(%4dYM@C95h+zeAtJlVdE_^u z>*F^5oD;sxO&V-G)&}BJSciWXUBf8%@4EMp@3K&jLd~Uu&CfON=e4RCT$?Hg9GNmS zz^(~s?Te>m3=$J22ZO|aH_0ydnVS|mZQxppE3;C->%NfzxYYT*v(5zgj|62E0B@fu^52gO@;At z<{R34N5{tqU2NlRgf0qx>++@{QLb6RH4U+4>4?Su*)FvmV3y6L*-+B@{!@;sl>K;3 z25LX44p4hl^s7-jrM2$jbl3rI$AH_j9Q+4;_<{cu?1z}wZ7=ZK??}ULcHmbiNU$gD z(rH+AWc*dIJMWr3WB1AVhPZL_zkSa%A&qx zgpv3_YX0Zu;Ip`Eg&RLMwS7t5z6OE?OapcHZOc`{lm#Wk!a{YMdc<{uu3z8DHKjaf znRNA1?;9sE0C4`*YBTt@-Gsq+)+Tdu7r968>(NQ>(PQq>S{^Y!%QH8qcw2h=qe$Wd zl5U-&`~S@T9~apFH5tNj^F@JhygNI?{(mwU!*km+{Xb2_@0AShKdHLT{vTECv;F^KVErvJCn+5b1l{@<9S^VD8G zo%h-QTOs`x{is~hK*&dbu(PY=W(zid!5vc+1yexNt?TF$l=;F=f){>W)3;L zNB4SKrQiy+QnhMrURU39_!rpP>_*E3u3p9`!I&asunAqZRvz)B&^GpCuhF{x==d$prhx~^oju)7Nf@qvcSL<)>)LF$Z|HJMcljh$%CkGN!Z|$fE!WzQ|qnK6?2}ycagp$6qMITu#=`7IB0&O32hGPwq+w z|9TG&3#{hvB=7F#E@?mCo_t)(ol|w4?dLCg_!6V+Weryv6jENa?-Iu^DR%-w{?BqmnYo#lCOdV)-aw6f0@-%vhvptFXwjX8EHyG~ z&!4G{pI2C+eB6%^Uj><14C1_~%9hFDNPI}oO1yg}Xqj!SY&niI$T@1_V;wbdLe9^$ z0q&rlT+~Wc6^=6<50Hj%{NiG0pHXj^@?E(Ps<~#OLoCr=rv$>o;0Ht%sQeCn9b`Hi^VL!ZEj)GH}rPWz%IfP`AXR)=aWLJm_af@$avMe_*l1Cvs~;}OLZk`2m04?H8$weMu53hl;sxAMoClfGM2TkdcM$q=QD~^ z*c*fCxb*JHzkQoyG#nl}MGa_Go{rL-S`9`?NjU|u%r88Dq>a%5>Q>*n2h=&=xrKZr zJNj&`qwgs4x1Lc0y{){l9((`bu4_f`aaPxgAklvhYC!R^R_8pw<>Y^hT8;DUS?m2P zuAmG{lx+FTt2ImxdzCS%&>xN>@iChtgO`W1->QgiM~Lt8mBV%e<)&9{rc1%1TB!*G zh78t3TINZhA}y^FD5cp{5ASHd#NWf5*>Y+&mDoL{N^p~!Q#h%!o(-`v5nRxwr*arf^Y2n*(jH$pVP2R zOa=Mh5&9F|&s31#A7j^ee;d22Nk~PzTq=P%ePf!y96dBmU>X8}nX2k*kVOfMkT<2Z zlgOm4v5)R5)TTqsL@GL&m`-u__d8^dlnY0-;f!KkX=-`3^^( zF0~_16W?b#gb^Tu!7^qrRzx9fQHI9n{ODR`Jo`T!MT|Dg?PNP7-r1F0pWyF5gqpqq zdl37X0hDcf!klT}!d5Ug>Z~Cfka4K_W%Zu7SkwN3YsyvRi!k}H;c@SjW_jmah=!yL zSTmEDap!H-e zRu-uR!2I)Lf*DfB3d1o1%(1fz+7EN!cx3jU`~HpsZ`xskowIaFg-cVxTEiG$R^kp> zO#V`{bG_zWKGMEwe*(oP%aid*Gb`qNR4ySv#g^zA_pk71n>}}DXK7wx1HUa^8McDY zxeaRLcWy~K_>eRi7C4R6J6r$p*p@_ce;V6Af3gqvaU)GIKjAO9g)i6WJtD9Ayl?Zh zcK1CuRWoyw@h&PC{?h7y3Kp~F39-+_*Vef?%hXqQ%wn5r2hK{n-nqr-m-hXP^!kT&rK>=3^N_K9x@q4rGKGg+WQiPkQbT8RI) zqZ9o2cpi0dgt71k|266g|Jju$q?Ou3yruWjHpC&iDD{hIhCfW7-drStwHsQ?pVzXKqxrX=Pai<&uSkLc@vY==@iv zRQ@IKc;U5DD|`p<^4`|5ma}jC_Wd|(gCZ5roIUP>iz?2kI6G3>$E6>!8YFkjMWN=N zyl%X`&$v+Y|JaucT(VvVds2W1Udq=fuxoWeq@|`X(lWKEqIBK#TAd+ZBd4QU`HpM& z+9d&@bAySTo(+T<7oVq*XTF~V>3~XcP1Pt{o7OZW&!DsjB#Ndc$R6^01)n-J_P?Mq zcFmeCm9ZPvY_Eu)vW8Sjrg1hrEG^foGIrS-uN^yPdpNd@!<5*+4|>E_Xw!hOZ7nCn zE~L4ZWSw3=D6UY)Daf|yF5gfE+b<2WTxGr01mD}Ki5r8y9{Lo0{Y$0Xx*%no?#be+ zN!7tQiWSNiwcfjKRm7)tgcpCnhLdB9b0hH{q&x3#Jt1nGmg z4P)s0o%_wwd?em{56(G7Ze!Bjc5x{r-zpjh^>!h^h5j-&Gy>X(1>Ov2MWo(oy#d{%7 zOn%l_V%1`A=NMmS6!ubCe@NMz?x-J9@l4eP6&H`WXj~zBqy7l#jC04;AB?`Zq`sfq za_PcU8T3tGxMp4ZnHBLK*f`~%!!@6_!Zlh&WXYe6=Mw0 zlrH$2{lAZ=j-h@XegNSQ2kcpr()7n^8St;}0{)zi`1(8M(|L!Cw&|xiWDK?bE2a>H_|p zjz`|#*cNKuX8kE^`)~yK+8Jv8hkkQln?ji3mQ#t3{hhLoI&_~!<_rK3F7%L87taGT7jtSN6;XX)Jz` zW&Q;uYP`Bj7KjP{`(ra$;AVH|NS9)o2LJQ^=`2v#HT+?M-{iv|EG)+JvKscO{R=YS zw_UY+`%^7+&O~5or!{h78W7DYWZDQR0P&Qap7wRW?E7hAwSGarH9o^ z_+z16^O^g|-47KxmYIO&`}FM3ft?*L9l>V(JaTq+YyET?+4VP~KDQ19Z;`VdT`Kfd zJnxT}?O8OP{G`}wlBN9x#E)LNJMw}i8V)wA28P|RxBW2cj1Rcwx-RXbXXaxc&9UZm zWgm?S?W=wC)B!&8bfO4d|Kb?Be*Rgm>nFIbPkejNER!65((R*30esU>(VE@+Z_ysF zH_22MOE&o(6|%t3-u=tKaFRhGUE)3Z;aB^cft4+XNgpLz*~++6dbz*8|H^D=k$HY5 z4n?t?w{lr-CEn)^&MIg+TtzYOip7d0B4D|9+HAdK%>RK<$LSWAu>rp0zd1Wgmb`sB zfk^24@F}R{HFd+=%jWF7>MtwKw5JdLQzQJEy2ILs&e_>~;m2pyA3@m{K0Ynb&ui-U zw`EBdDfUOy>!^zx_Ldmd!0igyvu>v;vpkF5a9$**+JDi1Z7R?no>SKhai zkQ@1x3U?i|B$;P+%;c99>yNt6AS zACY$Y1~uu>g$t?a!J|Oz7iVOU>c8B8PbJ^XsN}Z`%!;+F`1wYI_x z>_gI)&RHnW-)*T69fx=$-}{BzpKH?@sbnHhW=uekHZtTmm!qX^&b0^d2&=m%$1CKw zb53_dzBebAp2hQ?z04?2z9DB_hz#tk*8B}a@0~hH;a3X6w2($0zspdXr>o4yp zbN)+Mn}4&UDxMd!S}E_Zs2Xc4swNdgV&lQ{>idI^=G%EL2m^Z`z2SW~$NFh#W}%g# znfPU>+3j6us6N4TPa3Mv0|loK1_j?6oq^?8ae(FjnVgP-%4Fr4hshk|DmNsvuEW*f z+lOG9?B|^Ig;aB*UyYCHzw94i`g{yCFkpR&CtpK&|aN_Zn-%Tdx zF#&c1)DHbQA)6yd`-ruLYM|4txUvOTG%z+1WX?)fB&Ln7$oC?aX>bENPKgY(`>;nD zRpW!kR*<7}-=8dHE7v_5&LhqTbk9D2#EK14v8g<2HEl)y=BW3BNct_BZ|MBb>8HEc zfDrvuEjy+v9JfC??`#>7wP-LLMF!oUWbreku(*pEYjiMaEVha$jCDPD*7eeeSjwxz zi{I&i@Gk#ER2#j&LI>r9s`h8aH?t8D^xJd}ql@6ioBJ#^P3D>k8fIJ%h3h`a(7i|0IZ z7?RPyRLAIke6MgX%#NMqV|Elb-jmse*EU)sB_cj(C+-H}byHZNyrtUjx; zY_hbT-sD}to$`$4D8r@22q zO4|tV9$}+f-bvpGMu9IbLZ8I)PMRxb3Jb6?=}>-~_#e)V*N^T2>BB>TG|q=~h=Y`O zSODqQ4pNRm`m!Z}^zS)7q|dqWR(xrY77Eg?k*-a}4$`PZ0O=|Rsf7=sWltm_MFk0S zx$Jgs(7$&$Sg-9EndSY?hn44GZM^?(%N*fOK>wq=%D`<~vA#F-UJA;SSR; z2auKt($576yOzn7kyTYo{z9r>jV`SlY*Pd4-~ zFS(Uxl0(c7EwqqjPw zfYd>ZLT$betXwnvy^sH@p6e&hh{pfKrA$6|9#qqQYka-+o1NRQNFN|-b7}v9^+-pm zv1^D9dCULH8f&}P(pYBqX?1b9bV9x|9?^j=+i|z%otM$P_PK8Vx36FSIsak(uWU+3 zPqO~=cJDvkKAzBfYw3l#^`wMW(ZgB@du~Cv^um0jL`b`~fs1DeknM>c$k(NrRo<6| zd)*rT|5x>&zW4e!y_wPFF6%#y{^yH-bH%^8l`T^WE1Tc19}fS>+dd%lWR^GmpJWWd zas)Y-AzRcfyq4{ztYX+yBf)A4C6n`+@&iMF#w_DfpNCui=MVvb^;ZGT^`eNwWPrHhfk4 zIa9bR`Z5f2Acsw7Z3+FpUueM+R%4<_R(eyWe2_+L(=Xor$!dOOWOnfvBlc59?B91{ zZTo5bJ(BwIC~i;!5Pt&xI%yHQsbfoMaY4t6gh_I|Po}zR2{0!2pFb>F?GviD&?@9O zbGWN5ke?~QPxB1|_%%NNjv+6=QrbiLo8^9Df@MYcf!;T zL%h?Ry!Uo}9Mo(Y-a50UmtuBtv3L5O zI-q3OBKe)g-l==&ggCQEsT9SD3;lkW0EC)vzL(O!F7!KV*V!akYz1@5 zKPKb_D{5E2K+mU43l~$2zqT8;+aD5oo!0-Yq4%*AdY%4fu|!w(Q(aqoAv*1`d74j|IP}k`s)6bfxj;F$Cxy`%ua}Q z2Q#hl#;?+vzAnte6W678ul=V&Y>^4Z6NcE|rV#7j1v;Uc8F>g*#Q_oTW=$W`cw2E+ z-J#rPPw&%s+wiPhhiq@dWYVw1l@pPy>r*T-_gFxI7a@7L4Ly^ zug!$)eu)K3_tS0z*zDNqEN~~`b7``u^5^mqF_%9#??A+T&PTP16UKf$WU8)l|H?G1 zP1Z4m(qQjNPUdPGh})IvGrO{}xZV>n2Om8{a}UukW>sx27${-;{oIg7>6VrYN&l$M zKQBJy&`8VmY);4wauxXc`}A=-M5aOD%k2XavDrf1jzvi*MJ7J7{JVttMinW{r#~b z$qW8=KJ*P9U_p%5LzK`=cz~lSNVeMHEwc3Rz0m&-pZ-lg{dQ zD8X&9jWhPSL7}q+r8s-#|o_w(O6*tH%Sg( z(FXfhL;0vOwz^{R4$g@{m(I7M72DpdDBUof2H4h-rf(d(Fl!Tuy#bkC zxfi^wIx0yf|FzTy(>G!Y zsNy9)5nSxTg#f-{?i^wyiE2X@&7L&`k%NJ;;SVlQ&~p{`K?lE z%SI|^Kl|Lu*y4&|TVO!g-~!ly^@g)Qs$lj^@CSd%Na)(RZBu3GlIdsr!;cd-UvSw0 zmg6}z_AHz4uODADScjiWtTpaLT72PzyR_ubI7ut2*e5PXFBa0D4xcK6Bkz&tW z@#d|&aYcsyc`zaRWQy-l8s{BJ!!pJ9J_F^mz}5QB7vGbd_~wEr6JOhskv3J^@x`4a zSEa(7OpfHjhvd%$l6z(+$$dS%tzFwT85K9^P?qqpH&c@9{5O-|M-ulYjhXC zQ1WXv?VJ3nXdu5n)}3rhm{FO&{O;cZVtN-k`GsOB`Nd-RD*64+7kj5vas6(TN@>~8 z|B)oq@IcEp-a~8dIHEI|ygI=lRiIaUPtJGIhnaNx94R$ADa}o4eyY*wS<|qG`Wp5W zm6C?lDe|nrji6SeI|5pvTh9%I$R;OrX68E#jk+KS+I}y13 zxQoQcNR{`uiXamVA07rnEM<|?M5ksaq}1%{aD0Ikg-jZ2PBv{RS|J?HwsJc5+cB_m z?cu_T{}}%e!Loujq@^j?32|~_Vq0KDB-8uk^Sx8(-s!?DGa|lrj`eEQY^wX^o&Q0S zM9G2hZ}Vu(hC!W4G|m9|l5~i^^C?uA)T)rBTm}<%V6h}dnF?QF1S(t~YFhb)>0)PW zp?`lC7+RZoZDfC+n`gKosM;E-+A3ews^+h$YOS$O)t)Ksih%}Q1LMXF8(-C4ayK-%XrNQGFoKG8QnNPh zIx-qZWvE$i!>5idunmJT(wRqap3IsVx9ml5ZT`NKeqC`FEn0F|XRbKO;P_n8UGx5# z=Fv-F$q2Z{&;<^=(yuD@e_g+xLeS6Y*Fm~-`qgUMH~p%jfqvbKee~OA5c7*eg&2)| zY5G<6Q7{Om*-7d4(Qxym_B;}enpRzU;T`V6nXR}=3%B$PLPygtXpD#c6v>3sqwH4bu zM!ejL#oKWzme_RZBJ*AEQJW+gw5z3;4QC8l$>yz?OY@c-+_`xtr8lp87tJfg=tHmX zX&6YnyoErF8&wCY6HX1_xg@=#QQ_F~)VOVyGTzY=joUJBT}SYrv6MGg4%7L*(Ovzg z{VJhD_H-MHdUm%2`^r_(GKqnkBdgyecLl@PAGj}M;9hUe*5LKw_(N7yNB-e`psg`< zwNynOj=9w~{H}6_@vr89o1YydZ7r6ATQIG#6!A)eFO11-ICm;rgSc75Tf7tGRN7FV zRMi>Ln3t~ibwDZ_lMKyxkH4K_utb@y;@RL_nuFfsP0at%+kULEH^kRX{z zAM{T8kJr+Rtw{gzto?A{yx*j~arrF|+7ln-z3D&Zq?PsR(tmu5AFZ82(>5oP3aM+z zEYVn3?rr>Ubvu|7Pt6ddg6r~6N^FT_qVGqU;dJef@w5y6{Z!g#&POZ7AO!!~bS3zw zYsHEe_zRKTu_201ZRWSutr|b!-Po9>A)I{L@ot!VfFj>-aY~sV3tKlXVmE_@I%}m$0OMDsJ^S*GSy` z)^jOFH7q;Qa(MxkO%uN{wvIqsE-lbq(-Qu+j(J+4iY;S9i+hggSSkBy9MdBE(V(%h zrCxER+5}g7JvY2%TZp>T%f~#8AY}2?@4Jnm3+16FzhIjv9XG&1gyXgyq7Cfg?^wYotdE57>^h)Ni4*+=->+g#Qzmn|@^+5mO=?Ni=0=jZwtJ z%ZWjg_^@&M;bxyPeypB_fWL5nQ+_IG7Fjav(Z~~Zry3iqK>7}`-)zrzcoXGwy79yB zT}%~fC!5%W@@UyVza{BDNH%n%eL~eVN3ADw$-fKUdOu;_T&h%UsDw-ekR4l&=e(s{ ze}9rOjobUwP4LH;(qMe)sXk;|AA*Lc{+q0REQ7O(-AS zwY!DGO7@}MUiZBw&c`aUpI&ss`&u{6&Lk_!3rv-@3^=%0Ii`8JT%R1um;JbG(**z4iNUveh$)^pAZ27Qdp8a|&4M{^b7nB-)3N@hZRQM(4<+I3@x`ph zVLO=Sw%K>5P>OBL9^2o&N~A`$O)R%e_j2#548)U){fo)U3mx!7U1C*yb4BnCr>$v8 zN4a-m=WpWTv6eyi>H?N}Fx8D1uJo?G>m7FaY7=ivmii?BzkWF8#Go4nkRU&vw+uua z3qpRpw0LZl_ZeA4t)|?(+&}r!%J{r*=N~)-#^Hb1G04FI6Eiu;{xWGB?ZdNz_2&HJ zTBU3I@Ni4n8%))~tQ#a1BM?&{=Q=S}WT z-{EyfIN}r$EvBhzWvTP!%K}P zEt3#>?M}bl@dRoUiC-TMMb?M2Q3eD*N%NWrBx#;<`(6XX!vV>{!!}0CdS8)AHI`2_ zltU5kd?idspE57GHHBav1?Szmrkao#GBy9W>G$dQOuW@tF`A#wXOk|^Y%y7G4duhvIsA+w<-#G-jo>Mir;q4T#HF>xq2@&(g_eqlaT`d=FvMa)LEV zk)Y*|Qa=W_6)gCl+oGFc+ch~i>f2xyKjy8m|W`YvxL608IxLBMu`>=3JPXF_a7z6AQsAJPV>t^@1Et#u|+GT5M zvIMe84uB)(U^~3hSEe6XK5z60-e(NsHf$%yY!UT%bt8=iPXF!S&GaAKsH8D`5Yz%G z|LyxRzxFSOcq*!85IhGHMh4>IP+a>bnbD{*QrS}&jdCER4(9$=H^a78#6I|UmVocjdJt**6B!2W!^KQ(V81H`( zKab`A1uQ|{kv;naZf6!}k1P3P+6dFH<4WF`0l)9)Hv51vXrAJ3<&9r9PCJOd&(DB( zm>u=KD@s>|?i-P2-8j63i-q6Pt@Y#R5*n%@&2(t0&SawgOyrbnU_()T;r;w27(mOv zwbhi671b&XXG04WGMexD3Fx7Jyw1)67P_q?)Nh{)0(ryrV zO9X!Z=D&B0(Kb^eLyp^oT3i!9<-kBC2>0>+EOBxw;fS-)3DUgigjjXeScXNNwwY=l z;gb_zRl~P#<2YUVGsDE$3Ikj1DX;3 zDW7-Q5DrM>%r_QfvW}3|A>J*YIZmq5>S#_f<(c|Qwy9QE6ibtavtN}mjg&44&0PTp z$^Sr|8Z$ADm5}D3kcr!nJUn=3INq1dXb(F7TFJ_EyKZ(4>xQA}yyJ zy3(ANUR~@9IrIUFA**<&;3U%U*SW+Tb$!aK`r6W@0ij$rg2AJ{SgWfS5>y0UsS2B zrIdzP(XqNRc0TerxkFoIuSYlQGa08E?<|lu{0oH|ljw2<+-RsqDYx5srVL}XCc9KZ2S0FCwyw(6w`FHIEW)VP&fer%pgblG5CKS@DFK4sjvy@;mW@mjZ z4?dph7ITJ$D*-CHh1ZO`s0Kl#Bt`me5lIR?IH;62H*FWO( zOUn35ys;XMl8iMXf(Sb)NyH5gs9_9ki%m_dtt?$Ut;Pg8(sChjpe4-ZrAE?< z!E4wl3r~QIrB&K`nHUhOF&S^d**bRZ281ul;u7%s@3CffeW^>j4g5l##b-1&KD*Kd zV5V_xRh?WEf-!ku?oa zSt4M(=KM^vDNfcSS_YTaYAEAtqVLkyZHlUsS>w2G&8!0z0VBa@(C6dT@w|WOqHQrv zVG!l)e(0tEnUAO2Wgogf*QycqMKMFxu)) z)tp|rQEfZ1V!VYE0|U%G&HRO#lllNUhGU<4zgsR?cHVP z9(Np?LI4VqZGahjC zUucBMh@YDGCHY)ef4vP9$C*!e=aHB<^aTXF_>bn7Gs|bH{VR9&d#&`(ROugB`=KF?>NP!SFtdZxfi!j64xhv1tHRqhS{mfw#WF-|VDdh? zsTRA*dNTVTBapNQmfx%y8+%h0x+1i2zs%-pxWA^TGWK%iuy_-pZ;&GlFZhpjQ|fJ2AOBrx+>Ng!@AtU*+TrDtjim4?l` zXvj%2*O{`YA1(fKATKU}`!u@SgtPd6LW=)yP3QkV8~?XoMIY!#HT|ezMILtlR*(gE zM@rX5LJ>0aE@Cfb>zlH_D+j+kG2ZvMNa>4`Pllzn-qo_ZV2K7{EgT^}>TO|H0oMec zqp~kT{GE(dg(YKA$(Uy5o$GJ9U;wJ zZg%`C??apkzha{YZz9=Y+=m|7fq+eg0c$bu+fuRC;L+wtEaCkeE#Uo>KYm|+z-_BI zB{wBt-c=9zT$mE9#J#&20*?PqwfO6@M)6;R_^(0y*J}LdPU!HvtnOZ|8RQ4-T~H=C zGAGFzFHAcb^KvZS!LFC#51NKdiW8dKH05lN$q$%k$aLGM4_^g$`#X{kz-~_lQXB9* z8o>rB>2?Isfa0dI|;Bhu@w`yeLHLsJ}Lb8#Q zpc!gbr?wauo6{lgsHLvxZ1(562}dmv04pZ#>6%t1o+x4WDTtXJV>jfA*v1MrKZ31L zK2|xE8h%1etq5Br`E{(9`cMU%~cJWhEDj-7BCN~?c#1AIiJW?i->oq2 zV06)LQuomVyGz{zyN6wqBZ2ap9(VaoTXWGYb3R&QlJ#rXn)J3k@}74wYzdA(O!jQw0gWtaKZ6@2=d%9cx}%DAeDv>g5DXo{2$_&%4qo_7BAIZBs$%oqz}$}9@j zq`l)Utwyi7AzDp~9D`R77qGiLzn#5GZZkgJC0NIQT zwL7)T{RK}$In9G4)*GNF>~r|M8a}V89JVr2+7`O^=W0ny&Tme$>B=A35*R>1WX!Qp^A?Q{Vk_u-?_6tU7_^j^JH85+RFtl)>t7jLQnA*H zlrEor6-(j#{CqK74{?N|(x2sULsYtSWh68aD<%j|R}B6X-Ox{5aG*){Vs9xnm1No> zrK&o7TvZjZ)oLOcRWyL+gv+rXnN+I|HD}3SQM7>C?tN1H{%16a{++3M?|WE}*1m)P z_UEj8ZbM^Vp(r*nY%I4Zp0i*Q@fQ}s{kr{Ks(sF{b`n;=j1oMtDkjjXExvdhT~PRa z?jgDvhV=yiBHXOkqfcCxRt#eq;C5_|rFg-IvsHB6(UROY8ZCeJLpfA*OuvJgq=$+l zu}S6p4>SKa##id&OKcCt5*^UN9N@$!L|@Kmn*=&0fex-r@&PETy}Jd(6Pt`uBWIPG zsNKYcJsxX_Voa5bcs6?VEIljDIhl*?qXSndK!lVv0>``l8F zk1*kTm%>=s8)L0X4WQywsh+T! zR7))mQ_q~4!qj9vO=3#=(cAP#hpjWMSp#0Pc8q+%T2&6Vs!=R$bz>o1OvIVTl|}tVQp47Ya|omi#=_1cnnKj?5(8q*nUR+Jl>4HPy0arg{Z5VfWEQ z^S@QQKdy-0R+CkC7$m&&po*4?TK0KFq0}-3bj|F%gm$g2STV+E?k8Jij#0YuRY{v_QER~e>5NedB|1iG^R-5bhxJCQ~jh~Ucr6k$TpKLhmtvP^AcAKLLke{{uEZ^!SuLO(jG{CtZE@7NN~@}9WT zCWUPtzeQom8I0%StC^o6ZRajE1fE1wg=i}qNGUmMIoe4o)6Xxa@A1y!O0gN$HXf8aH#&6RvG$e1Egj3Hf1_Vs6T0^*G;N|; zY5*>j{Og*{75mJ@Zj1LBSMRs}j}P?YC;VwOuf==vKFEUTwng6^Hmr%#P^z4&8!sfge}r%XVws?93-czL^A~YY0e<8zF#C>feu=UhSyYt z1y5N|+$M`6m?dzHVU}=673N4p9WIwDbijCC(9yUvubvsjDnQYXHH_~8FeI6j%mHls!Zii;|IbVG)5aJ4*e>Un~AN46WQAgtyCgx&>2l$_8{$WP^C7$z> zRVTB*?5_7=dG=&16c5JphUX^tKkTkF&b&n@+Wv>9`${n9kNmd%4}Zyx;xFoLt5Y4UxA}ziUrAVR1g&~StvcU9I#!UHeMrR)(l-_akUq+`{yl1t z&PYP~uK>~lLF(loZC(MSQ9h(W4${kspnpGgkVYA#&r5>-oh(S|-?7}t|N52TYJp&V z@~-ROX%1G~qM%h5J6NwCul_xjgtda-M!!FE>X_xpt<<6ZaMke;d`Biy@zj z3mJqsg9(^qbkjZP^cv{s$Utd$`Lx)ybV^mUe%1b#@^2S9|5iy9__v#dyx6aug&p^= z*Z`iMtCe*e=Z&iK{ReuzMZMnQt$$qA-9Qzgnaiw6OtQj9| zXHVVH{$kmc?j5(phu%qx58<(Hw9ow0(}-~OW=sh+$!nFOBwz`anes1?VNpVyZ#o-7 z*f`SU*1#wx4Aw_ZJa;%I{)^uD&F>O%Fw!vhYX|DBu`28%!7#4_^G%Ind098j2x`>~ zlq96S*n8ngrbiekPSTN7hcddVm#zmEUI9jMJhC}RbCzue($X%U*{Dbmh(qa?D`b%V zfudn?LL<*K@;O$Lcf1x-CoxLKIOupYaj!x$;s&qpJf8;=N80!x`mS{JeOJ!ioR6M1 zNWXSA9rQKZPE%aNM1Kr>>xSL$D+$?xKz}g+$;~n-X+|z~twVrTswisI zN;%nAZCopKQWukx$AybHz$bh5rM8$s^9y&Z6Z}neV;HQn#>EzoiLNXh6K(r33vUj& zwLtj=ed_u#;oq(Ph{lq<`a>HVvirDWP;qcw)x+Bo*U24D))g+Sun8m=29@(xP1s-# z?O?+`QSvR!Tuqqyy`Qs8NJ&!1FyfxIy3`Slsmx+$O zR-jEzO4rRk_#E~@>Eq;w-B1ea{=whgb?>mFkaj;|7nyalkE|qf0{lcuH-+w+#qdrp z*fo8yW&WqI?yvmqUH7`eWK%hhFf{i9-t$pt?isonwvODH2n#X^>QxL@P_Hjh_h~ti z*t+(UEbuNW&!geCg^>i~)G+IrhW|~jHI@{I5o*38X0)$icU(+P#qvY!pt2thpWtbFy*+GXpxbmv`XGx&gG+QtIM zM6moyph#6^EL?E*^0ECo3Kbtq*xYpNt;B`uL+QrQTx}=Aq(f-#4cw^R+YLm=nDr0@j}+&9>gVag*zdy_cJ1 zyFa~X6y;M}dh5sHA2AA?8}HHALeT5It@t^Ph(4-uL5->n+<=wVVqxWwfOh0=C9#tj zF9qbIDk$LFuV5=tWUqY`w+O2)g(c93X%e?od8VM}-W7aXj?V7aN8iafi*tYm9*=VEqU|O*f3FHt4$!OuhYa-cFQ$Xwr zPu>_>gME+uC=f`aYq@Q;VZe+6hyPu3L{%9IFlT<^qvX!q&X95b+nz_=Na59SC^c|$(E~omY=JujT12wlzK7^H*V$hqsr%<(mlN5EI(KGEI&=2+(r3} z1^A4GOTD>|2EFwT4*HllfuT6VLUa9_$?!n`%G2^k=wDd9sdj2Y)731Tq5Z);?jhnA zbx6Z<>}_SGBT&^apXDMvjDC_iloM)tK)1}E778opy77!KyPooWm|kJteVHA)&vv?D zqW0UPPpm(j{%O}C%Gj(^ozAw^Oc_55+oPlN>IbU?K)NiExLigD1?U+C>}x(Gxa;RG zB^Gp(epSWw*9Xve)HSqxppEY1s>Dp_x==e}w$~~L13#lJ=)azN7X7kYsCg-Hzp{?I zsiW1QM7iLtvj~`^b*}wp!rU;`7xjmN{Nk+E*`3}`pL z(_tm*+%=h&ji1+FWipb&Gb#-F`@D8WOlVU*I@3MWyquqs-=IVM%(DIt zEUiDSojWwU^ZT#Sq1jaR^*V%oPGs=Q9`zRo9I{7#`zL-7ojq6x*{!qWBc=Ds?|VBN zIi>a0e;T?=slmqUXU`j*UD45&xZh${1HwltvN))eOZ}-5ORNP;mO}X|5!$=?42v;> zqCwZFY)js?T$H7!vPe&{I0u0om7v9vdiZ4H0dRA_I zQMBy$!!*3H(8cwS1>?~rcvstr5HaiR9jK%cx}a21xd75cF0YDMnnsUL7bXXie5nmHeB5vSpwdAef1+ZBV( z=2-BfY}Yfap6$HHzS<>+fnab?d1NeGEb}1ov-%SbO(af5hK1&zv2f!#H;={~ny^kL zgc%zyjD@8m>&(VzO2%`hK5(ke6uR;)q6t*AMh(G!QiZHjce(g@aX(pZ;{%qO#XoT| z?mCh#gr3aRfS$v6PRc5#hQ9OaI2%tCIb2T+qE;xejLq-hoMr0w(r1RK5|KeBe0)&$ zk)t?&EC0O?@4LUGHSs~m_fpir!s@PFncr*X#1J)Sd9Ab=l^MRUM<2K5ld3~RfGlp+ zv4*KfjS2MMfA7!2sM`;ye0)J;4cTnhCww=l ztY42?_;Ta{T$pP)kc)TXhaYx~Ya++sV*9>ML)3F-r)f%~$~zCy)9Wp!XcxFQV)@~# z68Gy9M%yD(GYk(6X;hUIsF6{o9wrLW^qPBB^R)vb84dH#XAp_dMe7o+u2rks^r@w` ziyNwlk}O?On)PRD&hn0VQ!DDRJ#mk`XS5FjA1t&FWS|1RO+Vn~TKJ{p`wDirL)^U= z3*QFqX$;C##ujTe*qpW!4QkEnDnsL-pv=o^v^IGF%0Wi<}2$YH$2Sy=gE zEC07QMnIuWwcu>vlZ3h0ZY!e`L4Dw*Y$!o2zx%4h5`+erGsIZ0wQnK&*MA%1U$c~RskbI(4U z86ZsFSHH{w1OrtTXX9zRG9l!Bzb_i#J3liGaID3m_ox93Otfn-69s011M{AReD?@u z?`kR>KQG()_nQB?_gb1SSEdhsLV4vO>&C?|X~X5`midrZ#*&2noLHt}{ri=J-yQQz z2O*cr!K*6=zgM9h#PqL`ACF3S zkRDfEWbv0xb-lgUd5QI4IZc7tLz=D3AQUChyDP$TcFLyUP)z!c8CG`Tzia8u$cwlz zx_yI-SM?sF28B=1`kne-g!87f){*j?FJCt69H!#-N9;l%0Q>X-cQ0QoRkI?U zM^5)qkSOS?<31)F{o7stYvlh`hvWJKb*2tqWr;WKeHwS1!09d(wmR&^(7k`4I7?o0 zStVH>KBQx8{2at}JK{>B;HucxG4@r(`gcjwu2@9bterP>bdL;vyK?ZFif1t^R?whH z{D|~kA)DqhW)t(`xBa-hvEz_i^EpGNHGcl{jXMvSF^~Qo;l|N$oY_zBraZ*=IyIKg zR^#W^m}MsRU>4MysMizHUz0zWDw(>YbC|C9``CZCq;pE*Bbt}aBo06KNa=Q(!+?9u zWaK=^i7c9XadusR67VoKejX^1G9#e+Y8py}f+R{R2XCkxyfz&rYb$$eB(MJ!CSZLp zhy5QXEs2}^yr%#v{V1gGMN8p7u+=*t)3M2d=TOiN2TYZPR-z%119siB?KMtRdqMpG z==WoVlV|jbU%WZ?di!etT@%0fdHHW5!?Nh|!uIEduM!j5)|LS;46M&0vOWm;eU@A7 zy!8{$(D`U?2QL_0gWP!1q9)8);vCfAL~8uU=5Ge42yVv@O!9JQ>F2OSpx5l z-n(_Bv#^)crjt-YT96p)(~(`Lhpg0iVf*-eBHkdxFY_=)z*^V1yLuzmy~PQUFVY*O zV8n7R*kAK!HvKi8Tkn3&@yBOkz7Y?;yFzDVjun{X{LXzgZr=z*79No3-cOQ=dRme% zRam6JSakc)S(mH%Xg{0f>Ek@OmfK-RlqZhcraUkf&w1o`Bg}vHHXSZxUBo*KiD=nz ze*2^c!m<3;_8*$b#4oR3D?3NEXt1z;5um4gOT9yHCcyZwPHdfIal_?a78t?xH0}6| z^L@xxXscsE6a<8biu>?BsxyA>ZO%C3XD{bw1PzdU-FgwpR|d1^>>^pE`XL^rwk z;ZjX5x|bDXT)O#1`wpp}8ccP{-)e*KI*y_Wpe#IQmXS!Kfny0vY=_0CFa4o}KbW0Z z;LcRxx0!5wt5)j0V8{!o;o3^qU7yfD>*`2BZE`&KB^`igvs^Nn|%Rq4!nZuji!^#_WsTX!G0t zySGpM5yVKm2a)1{HuHVjEEa8S9ZQoR{&4uQxVUI@@d={MQtv!9)<>RYn{QC-a@Ay7 zR};`w{c*IJZ+MNcvw0?Iyk({gQ)Dot0a>4k3|)~WaUK;pyUv$MriFRL81BoYLI=OG z);QsW{VyF4`yX_l6QX!)`b+;SulnvZoRSb#$BI@*e&WBz?&A;q4^dhxo-a_P^vSV1 zVkwk%Ki;8qS6f#owNF4P-#hO@sQn6*-tvR5&*>tjX*JlKo#IAt(Bv2L>=%j*@thwG z8=j?{v#nm;^J3E`ccxDKId^hJ{Lam3e#8b6e{;kx6N-4I{^bij!TgVOMz_0jZEUpbYL&9Y` zN?DXpFc81xMaqVD;kmV51AP-HMH%GQtEA0vDMd{LusV@R)hQ$_)HQw~k%4!65LoI* zg`@jL%YN721wvwd``NZFrhg8LF}!M8MI7J&%(ug3Y}rfDgg^Zt@M6wAkQMS%v}YTg zET<({3Y>$wz+v8u1*aQjFA#4qkfb!m=PSHP;{wGd^s+N11F(yLgYm5btYBLJJHq4-YBmjdxsAvLL3P(t=fSe&y)xB>7~ zRj(B|yKBKy12S|#25;woccB0=U&890prxuvX~j{k84c~D2IeJh#}W{!)v$eS!yRhF zt^Y|I3RT5p>aNtz4q|}nY_aN&=e>WH2JmwBH(?}|ITGKHUcmoS`B!s0DIaoro$?8p z{b>5<-u(sCJr*As=BZ3b-s^CirPiR@nRW~GhmDW%kNH z6sDB+$c`xv6hqe-L!`#xvCKIHOnCb-FhKpHePlvbj)}^yOO7AU(lC8&JK;gcc}dO` z{Ut^|cRt*=OYZEVebaKlK>LKWM*ih!8oB1#t{NF+1t|2unh$2?JIRfj>>Cu;)G{Bp z>5}d@@nbUoItx%Fel}qRA9p@3Ssy7H9(BzEW2+w z9I3u;$_XpR7IZ(MWGG8C950L8j7#_}nlUu2N}MIdhBK*y{YKdQ5nH0?MbDIgk>APS z?acko{g(L;Z?RgT`9ASddVlkzF!K36@e0$moxA*1dTaa;x_Q?N9n}BvDBASfr#quQjaMDdI`P#& zQDwkKBbvnOZ6Ae`EKNNnuz>&v0^OAWCu+!u=yC}6c}4F1Hta-yNGM%8<3RHXJDG5p zT{+$>+X&F~-p=Or@?Lx~lQQ_2DLo>!w!XKB_zek=)=k6RHQ_Nq1kcRRy|2k!{83j-|XbhF~jA=BTLrK=g3#_~-- zS9#P8Dk$tuj1SBYh#P5n#J9&cPCr*}jR+Sb4?IvB&X|UQi|LDX( zDgPa^82-FXf7)Hl0cvQe$w9w8*0Ivvni5Z6eij3D)B6haw33iu7GNrjRZs>N9NNhZ$I_Nr&BNq<10p$ z4943)K$G-mp}vgK9o{`H|IsL$>fC_=`qV$RLaRHV{p!y2N{VaO7Tn-~PGv{XrIIIh zCs8_Sj!cZ!CV%mqiGxhoHoS+SvS zgZJIxTu%mBu-+eI9D!N(UO;!P4s=sTp>yiyky2s8NJ7gTX;ce2&E}z!R zqWSF&Nc*w%{*UYVF*NvbIX{jLew;5_H9|AO1@W9S4=0;dk*KkVRL_gup!8p9sg15| zFi255H3uB3UA;6^VMm@XS3!E_LK#BHx%AA=3_Y_ydgdWx$SLeEyh--Oizt~89|TH9 z1)P2vLLkm@YJ|w22GvOEJ1PAlI&G)b!66Nim}lqXX-KI7)!wClkbd!%5m3d}6|omM z+EqN_K7GVz`ar+@+Se~*2LX4jx509%1Ib9)g-$~DU>EL9!yF(o{%0EI_<(bxu!!u3 zJAS`A^9BNv&csJ6U47h`*xI%adxV}`7l{wJvgq_I_Jr(zK$09jF_uD%%TR)nU8gqu zv2S-_BEG=cr0g0pK4@3_VIcj3$9Hd(>K`Ap4EBkLeFpq>sHPJg{CUdTjJ^{(n@07c zQNHiS$O?xnrcqCb`d{5BwP^%xIwxq;B(>>+J+$eZpiSw`5YM&3DdG6}+5aDF?*blG zb+wOYAc26y6A)|^kRVYLiy9O)5%QVf1kT_LM5T&KTP#SiV#_4~R00W;+i^HBDisu4 zvGqb*KZ}+hSH%R7B%l(&3l{|h(KC)0kSgIK`M>Yl=gcJpzxH|lJeqUPo_$?=?X}l! zuPwWMYf%ot2!QbLZ@Z7aOAK(*xoyIHejFlnCSgvI;D`>Ylb90Ky>e@9JW*zRg}P~N zlI0_U^d!p<$i{&@b0@lzC8K34hP@1o>C`yLU}I515p)|;C_v6f{z zbP)345_&nAN!``&f8y^o{M}4)sieo4RHBl;`I*!*gGs+pNqbe&cqWaMiXB>6plV*L zGTg!pSF18FtE6lu^;Ag4()lWB5tHU3DcIW7IRo>bb~@ zH`zsW|9nyQI}dU1?D)V!A0TClfUnMP;M~l|z?`z&Ym|LQt6U;z{%h=9d-UUbdCjK( zkV`ic;s46`9fMT);zC+7uLX>TKMte*i?2Z61E+xgQaEMK5Or!x?AV>KYtb&33d2R3 zIzJKlLix@tf4^NmU6sFghjJ>A@{L$&kn% zru_twD+-hV_e;)G|6J@S*BJ3!1He(W*n8RJ&;`Lf#SAb;|J&y)Wq4Le(GF7Mxknjh|VR;<(oJn(S=DB@UJXlxm4DNR*U#V=!uH=WPo-8>B=z-^YI&?!G6Dl90m9ThI+6r z2cu!z7nydm6dR+ABixc{U&0|Q#-N2tPMQHMve}H8a&*28HsPOo&bRGTBy)tA>{x^k zztKt6xg8~GR`&lRknCTeJ%xa$GTWIPJ8sS6V#gKuSv}9NP%2oP$_mawcm=-EOqq-w zb85ptYJyXeG;1cgQHS*Jlxu%W1-!v-Zz-mi8G9r}W4yumZCyuq1~aJ(+eRPTs@7U? zLi)mv^LMzD*>9{>W(NHGOm+wzlp4sG**a5L*$}!c>E};Cl|A%FR>T8xgH@G@G51$zIA-+H zb`CXCL#uh53|yg|1o|=+`sKec)lB+!9v15GW#}773r|*Yp{|pKDxtT`y#EEUhABq* z49W6xa8m*iSYJO3G^2NkR+cje&b&5qA}CuRuj}zC0PXeN=gW-* zKiuP34P6!!@Irmb0Vd!q1kg8AUU4)64#Q(Ta8t(ArZbI|2x#)GfS#}(NeR|dhskf* zZU~;BLLuf3TKAq3oIx;{;x&F}vC8 zXT+Z6e8+Psp1g@ZpJWt&=GngCj(;m$4X$^m+V_tSdQmZsOF0hAW4;`8QANBMu%zQT znUw<#7BipCHNq+XgthijqP=4qvU`MYRS>?fEQoJa0n+iU&Wiz)MT7!23ADiN=x{Uc zYS?Hk^mE<87}Wl~83V%d<`~S@DlX$Df+`RXqfx8uCf&tZu8r13khX}>J3(ZE(o_C+ zHi-Yk3eEvyuWfhcV8nA4PmTL4`ExNo&m{WfOREl?p$XUzQ13opSxUG6H45pd@mY$1 z*+Y59Ay@g9Q$Co;=FT=g4}0W4138P6ZV1TVr=X&i_{-o200}sJGlSzDAs=F{DP!`v zAt4fZEF^3oICEZMTOeWnjacB{Pf6gbN1W}T?b7)N|=} zT3?DerSa@+5idJcs&y@`zhhwYksb#d3%ijcWQqS4yb-^`2FyDQ;lGt^U9qP{@kGw8 zh6JG<1)b7V%)+5ETaEL z(~P@$G&Dxv3(mEe<#@LP{6mjW*iv3%93yF9CMh{U=A?7tk%lJW(g`$(q(j&D$fS5g z*)l8+7=yqD#Ehr)tCByjr9#WUsf;jk;*(Y=Rv7xd8_RMoE$PS2BPe*He!<2(OZI8- zr80HlE3Ef~4`3aBgcOz0D6R%QR%yC9oX)7){E?v6kk7QLzw>2f_vEsZmueN?%VNhq zQg(7o$tbT`;6lvjIf(;)2z#`u66Azh2sb#4a=Db-9ah=UPB$e$$#+2k1(aG%sXUeN z!2JlD6MJoZDEc${mxwpq3XX)zAskh%(oiuKqNvr&9SDbNic`JjsEpA;#J(-=9@>j; zc}@JHVhr*ZW}Jv4>paCjmUA|lK4#F#j>;&aR(F^Rd+DgK7A8ZNUNZOt{oq%>||%H;vf752+@16KDOrs zdJFi{&e%QFLHdv1D3gs=BSBX5zgAA5a1aPOzj2z6YBxD%zcJ>R{YPM;tR2tBcOJkc zNTGg1ORylocu(dfzVB$`mYPwxZ-WDbZ8&sVr5vz=A&t zkU9Ei9LjddRa0F+6;8EPuZjWI6j|AsImA zi2)!Y6G1<&xdQZKD(EdmA8j6QriAz-{E1fiFw64Lb*y^FwTqTVGv)isQ8EW5tvhH> z1g?Nz#o-1k@xCu{JRu+40l3pNR)MzC+2ec?6Re9dLb_J4g5&o)O>YAxmF48A^Ree_ zbq)({U?J3p22qvuFSZX4(#b??g#G@=jxYK@%#*`Tr72%x<`$K#@YW}+i;sQ+iY7Y* ze*xi3BPO8``w#!`OJeCrF(Z!xKRD|}AX$u){vHjXHl302aio#of3ma_A4EhiQ03N@ z|72k_9oe2o4T(d5Bxeg!^Is1FgZT%jCec5ee^3;62f_cWJ&#F}B2odZRRx6{%Grg> ziaY4$6jyj3{6T=tGfX~LUa4&p5htDMSnNr}deG4|D zq#1+pt5(%pDlblM2bcOL!7u#SY5E1WhkerYPX5hr!4p4eMi+*0FsHOv=hU$dBj~61 z-L1PC5S+RF?4-5iC}bnRUbxfRHd$mY%SD-sGb&SWCcU^1wyA!|s)JT!E0SoOk@l^1 z<0)^&5`=tAtB!TcivfWwqXks@_JcecqCSu&=T?n@%Dot_y1 zYX`jjEu4nGIDP>6L14|q#&CNaGe#xtq!ManN!u@J2kRat=wzqq{qTmlIhiyA`HTJ* zz5stQIrg`d-%(KaX<}ig?N~n3ZgbakK@h-tRM|e1Csw(SrVVh{B-)8CX+P9Y#C)LQ zb{ysWX4gR+z=*jBhw-VgHnv;c$CGx+YbU%){6PD8VjO?kWgV605mLI(@hZoncUyZU zwL$0~USo)!n!kH*jzjz|pzpCfM$Gx=TOn_sPgC$I(gX6LKt-V)PA09jwdxh`*S@ii@U)!qe_pHo=%7V}!nkjP*7bnOWq$ApEUA2XE6^#T^(nKU%{w;^$v4gV_ zP3*4O;{vj{kfrTUH}ddvm;7ocu1=aRG zeHvpnm5-uz&8ovK2n363%6fdZCR_B!bmpn-1&s6t+Is`H;yCmjJWgx&*oX{rH5p^_ zGo+93mPK9wm@E`lpKzAY>BHyj4f_Q03R~f#e1+wrjQI2M9)B%kz3@iB`INtXxT?e# zK=k-SC7*FkK%iF>2s^vO8Z+AWA48wCKs$UDrL6=$9vV&$NCp(mQ6}F@@kT>lB zBZ+s`lzY`WDPuLLR+shB^LJ-qH5hKffz84G$=}W1-O;ZIZku^Y=$eh+-vA|7uD6k` z4QO;mIN1LK8j6>DZ4Vj4NB z^iVN$B(Zeac^CQkO7JGBQTf;xn2^p(Nf^^7+1k^{wd+XA*47-H;=(=$5tQ)r<@V1g z`H6E>Qhx#JPu7k8a!Sje*YR_uRWXxpxDde?jHGKmoRSbmSk}DD@qz{12g%lk(HsiO z_<3^c-)#1Er`ORZ?RS&01*-E?OG*06zv3Rj^HZ{CnD!G0L_RoXtKk*{)V)!0FhxP` zoYsT=!Hef8Lctw=I743fmIUqwu9f@gmMCxEZmaNuWC!OZg@a4Ne1UGopR7 z=W{Jsxmv}K=s=LTvXngm&XY2OCD_|^5SzA{(z7_C2=dg|0%8ykz`s~~Zxr6Y{j9&k zN~SidrHIj!jR0?&+5cQwQdu_Jb+uOcD2fvr`MNpO#TQ*<1)ixi zQ|4D=10-W8>uWFeWy;W0OayvwHnN@pHFXEr$QKDH#kCVnh zENR5-jfZ4jjqq1U;kgNPx5CqYVq8p7Ed!_ zh{bb+Pb?mJ0&fY7n8ibC4nSR#pq9WT3cl;!j*UTYh!aY`0WzR&~R0bUr^ zQydO>4~=kZXppChhypwtxm)loACHn$%lKaKtRwL(s1Qx%S3XG4*Oy!>kRyr_jP{Nh zKa@DUx-f|v3Fv334bsW`^xpXgJweoN*4>SifUq}{(&t-`{hI+|kj>+-1AwU1>g-5Rn_`+aVY(CE0m5BZ@m5A`2EOLark}fwf_}@}7vDUP z(sk8jfWAjJJ}|#&aPPm6a7@>2z=4wzz~S19rqU}pKx~ryU0qtH=;x!N`mZf{n`=-7 z3kODguu|&&kPo|VoQOTEf_(V@(X7*Et5QFjo(18uCbJ@A5DRTQM`{^GOn9Q+K6w7&%72d^dGv7 zlbO=%U1VF6k2TV=<|VYCx2#bx)E%Lufn+vXL_SF>EdvEgMWnHtXI4 zYJBkA!8l&|#F3Oz*2hUoXWoRQw18uQ|HEV@a-{%(+O?%gZSQ>SjBmhi;<|MyKCOSMx{_n+y3w%VWnCLrkv~$AbzfXXyYXpFP!+xP zhbW+q)i@P}7&i>#QxLx?QqhZV#EtJMd}4e(RaM0?RsDUg4JwXrNnCAT?RCa?mtC7J z>FW5jwvCke%Z#b(!`Y~d%!YNlT@n3G{CR(kRP^aHapT*8Ppe8*wEy?f@ufw^*U7Gk z2{P}1+xxK^AKVPlt^SeP#_fyi)+l^hnyPDJOkMw|a?t7tyCMblL%W^v zUFnLOzn=KCHv0rnePSy5ZKNWPU6I1iXCf78Yvab3fKQC?QB~FZlcJ!ysVrvxPVH6W zQ)Iy_wWWb@{Pq{@Rx&qOkfx;Zji6(AVazQrezMwo*~L6B(j|}e-K|K767qiic|mJJ zXwW$XGkcdLe^#sbv*94V5N>J#X!2*P`84e(16_cf0^bFvCdar-{xXKYI(<7kApT98 ze}U1GBg6duWgm}EHS#VO*oLgF41+}WK`B*X20_%M(Fw&628C^hHlmm|gxj&%BkIS1 zy$n7k5{h)Fd=vYJAi&^rSqUgNi~&1K|Dp#5@52o!C^;vG7OGFkD?kEhhGy29ehs?UkC+-;ZHO{~d-|IY%IwDOrF(C{%^msf=L#(P)squCC!9P3k$T=?b~>

l`ImSf<6HLC3Z8?C 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

^AFfQCwGjTQi0-~*az%K?*MFur+ypn{>q2<7 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 z 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%0D{lP=G30P* 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