From 0106e79f3b2aff01831a93f31e4451106a5a82c7 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:43:24 -0800 Subject: [PATCH 001/115] Migrate deps.ts to import map in deno.jsonc --- packages/server/deno.jsonc | 12 +++++++ packages/server/deno.lock | 66 ++++++++++++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index df74b3688..7e0fefc60 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -1,5 +1,17 @@ { "tasks": { "build": "deno run -A build_npm.ts" + }, + "imports": { + "tiny-cbor": "npm:@levischuck/tiny-cbor@^0.2.2", + "@hexagon/base64": "npm:@hexagon/base64@^1.1.27", + "@levischuck/tiny-cbor": "npm:@levischuck/tiny-cbor@^0.2.2", + "@peculiar/asn1-android": "npm:@peculiar/asn1-android@^2.3.10", + "@peculiar/asn1-ecc": "npm:@peculiar/asn1-ecc@^2.3.8", + "@peculiar/asn1-rsa": "npm:@peculiar/asn1-rsa@^2.3.8", + "@peculiar/asn1-schema": "npm:@peculiar/asn1-schema@^2.3.8", + "@peculiar/asn1-x509": "npm:@peculiar/asn1-x509@^2.3.8", + "@simplewebauthn/types": "../types/src/index.ts", + "cross-fetch": "npm:cross-fetch@^4.0.0" } } diff --git a/packages/server/deno.lock b/packages/server/deno.lock index 6c99b9d77..15c8ee4d1 100644 --- a/packages/server/deno.lock +++ b/packages/server/deno.lock @@ -1,14 +1,11 @@ { - "version": "3", - "packages": { - "specifiers": { - "npm:@types/node": "npm:@types/node@18.16.19" - }, - "npm": { - "@types/node@18.16.19": { - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", - "dependencies": {} - } + "version": "4", + "specifiers": { + "npm:@types/node@*": "18.16.19" + }, + "npm": { + "@types/node@18.16.19": { + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" } }, "remote": { @@ -37,7 +34,9 @@ "https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", "https://deno.land/std@0.181.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", "https://deno.land/std@0.181.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.181.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", "https://deno.land/std@0.181.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", + "https://deno.land/std@0.181.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", "https://deno.land/std@0.181.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", "https://deno.land/std@0.181.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", "https://deno.land/std@0.181.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", @@ -119,6 +118,18 @@ "https://deno.land/x/deno_cache@0.4.1/http_cache.ts": "f632e0d6ec4a5d61ae3987737a72caf5fcdb93670d21032ddb78df41131360cd", "https://deno.land/x/deno_cache@0.4.1/mod.ts": "ef1cda9235a93b89cb175fe648372fc0f785add2a43aa29126567a05e3e36195", "https://deno.land/x/deno_cache@0.4.1/util.ts": "8cb686526f4be5205b92c819ca2ce82220aa0a8dd3613ef0913f6dc269dbbcfe", + "https://deno.land/x/deno_cache@0.6.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e", + "https://deno.land/x/deno_cache@0.6.2/cache.ts": "58b53c128b742757efcad10af9a3871f23b4e200674cb5b0ddf61164fb9b2fe7", + "https://deno.land/x/deno_cache@0.6.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0", + "https://deno.land/x/deno_cache@0.6.2/deps.ts": "12cca94516cf2d3ed42fccd4b721ecd8060679253f077d83057511045b0081aa", + "https://deno.land/x/deno_cache@0.6.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069", + "https://deno.land/x/deno_cache@0.6.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa", + "https://deno.land/x/deno_cache@0.6.2/file_fetcher.ts": "4f3e4a2c78a5ca1e4812099e5083f815a8525ab20d389b560b3517f6b1161dd6", + "https://deno.land/x/deno_cache@0.6.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd", + "https://deno.land/x/deno_cache@0.6.2/lib/deno_cache_dir.generated.js": "59f8defac32e8ebf2a30f7bc77e9d88f0e60098463fb1b75e00b9791a4bbd733", + "https://deno.land/x/deno_cache@0.6.2/lib/snippets/deno_cache_dir-a2aecaa9536c9402/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6", + "https://deno.land/x/deno_cache@0.6.2/mod.ts": "b4004287e1c6123d7f07fe9b5b3e94ce6d990c4102949a89c527c68b19627867", + "https://deno.land/x/deno_cache@0.6.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2", "https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66", "https://deno.land/x/dnt@0.38.0/lib/compiler.ts": "209ad2e1b294f93f87ec02ade9a0821f942d2e524104552d0aa8ff87021050a5", "https://deno.land/x/dnt@0.38.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", @@ -135,6 +146,21 @@ "https://deno.land/x/dnt@0.38.0/lib/utils.ts": "878b7ac7003a10c16e6061aa49dbef9b42bd43174853ebffc9b67ea47eeb11d8", "https://deno.land/x/dnt@0.38.0/mod.ts": "b13349fe77847cf58e26b40bcd58797a8cec5d71b31a1ca567071329c8489de1", "https://deno.land/x/dnt@0.38.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", + "https://deno.land/x/dnt@0.40.0/lib/compiler.ts": "7f4447531581896348b8a379ab94730856b42ae50d99043f2468328360293cb1", + "https://deno.land/x/dnt@0.40.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", + "https://deno.land/x/dnt@0.40.0/lib/mod.deps.ts": "8d6123c8e1162037e58aa8126686a03d1e2cffb250a8757bf715f80242097597", + "https://deno.land/x/dnt@0.40.0/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", + "https://deno.land/x/dnt@0.40.0/lib/package_json.ts": "607b0a4f44acad071a4c8533b312a27d6671eac8e6a23625c8350ce29eadb2ba", + "https://deno.land/x/dnt@0.40.0/lib/pkg/dnt_wasm.generated.js": "2694546844a50861d6d1610859afbf5130baca4dc6cf304541b7ec2d6d998142", + "https://deno.land/x/dnt@0.40.0/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "aba69a019a6da6f084898a6c7b903b8b583bc0dbd82bfb338449cf0b5bce58fd", + "https://deno.land/x/dnt@0.40.0/lib/shims.ts": "39e5c141f0315c0faf30b479b53f92b9078d92e1fd67ee34cc60b701d8e68dab", + "https://deno.land/x/dnt@0.40.0/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", + "https://deno.land/x/dnt@0.40.0/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", + "https://deno.land/x/dnt@0.40.0/lib/transform.deps.ts": "2e159661e1c5c650de9a573babe0e319349fe493105157307ec2ad2f6a52c94e", + "https://deno.land/x/dnt@0.40.0/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", + "https://deno.land/x/dnt@0.40.0/lib/utils.ts": "224f15f33e7226a2fd991e438d0291d7ed8c7889807efa2e1ecb67d2d1db6720", + "https://deno.land/x/dnt@0.40.0/mod.ts": "ae1890fbe592e4797e7dd88c1e270f22b8334878e9bf187c4e11ae75746fe778", + "https://deno.land/x/dnt@0.40.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", "https://deno.land/x/tiny_cbor@0.2.2/cbor/cbor.ts": "b10fc7cd694887111cbcb9da87f0235cc954ee377b7122af3bbaccd422460e72", "https://deno.land/x/tiny_cbor@0.2.2/cbor/cbor_internal.ts": "0cde2b1d2cb08503b6f44c1789736376eac2f5d0ed10db9f73b16caa356c8bd7", "https://deno.land/x/tiny_cbor@0.2.2/index.ts": "a45c8abd3874ab05dea33af17b2da88376364d6966fcbf2c5da5520a0a9b9d98", @@ -144,8 +170,16 @@ "https://deno.land/x/ts_morph@18.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", "https://deno.land/x/ts_morph@18.0.0/common/ts_morph_common.js": "845671ca951073400ce142f8acefa2d39ea9a51e29ca80928642f3f8cf2b7700", "https://deno.land/x/ts_morph@18.0.0/common/typescript.js": "d5c598b6a2db2202d0428fca5fd79fc9a301a71880831a805d778797d2413c59", + "https://deno.land/x/ts_morph@20.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", + "https://deno.land/x/ts_morph@20.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", + "https://deno.land/x/ts_morph@20.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", + "https://deno.land/x/ts_morph@20.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", + "https://deno.land/x/ts_morph@20.0.0/common/ts_morph_common.js": "2325f94f61dc5f3f98a1dab366dc93048d11b1433d718b10cfc6ee5a1cfebe8f", + "https://deno.land/x/ts_morph@20.0.0/common/typescript.js": "b9edf0a451685d13e0467a7ed4351d112b74bd1e256b915a2b941054e31c1736", "https://deno.land/x/wasmbuild@0.14.1/cache.ts": "89eea5f3ce6035a1164b3e655c95f21300498920575ade23161421f5b01967f4", "https://deno.land/x/wasmbuild@0.14.1/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02", + "https://deno.land/x/wasmbuild@0.15.1/cache.ts": "9d01b5cb24e7f2a942bbd8d14b093751fa690a6cde8e21709ddc97667e6669ed", + "https://deno.land/x/wasmbuild@0.15.1/loader.ts": "8c2fc10e21678e42f84c5135d8ab6ab7dc92424c3f05d2354896a29ccfd02a63", "https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20", "https://esm.sh/@peculiar/asn1-android@2.3.10": "5840990eabf2bb7b8caaa637dbcb2839c2f3c7eec035e4de15757f0905d356b7", "https://esm.sh/@peculiar/asn1-ecc@2.3.8": "eb524e991d210eae5d20171443cb3aceb08317e0a9f0ac845fc381d408d733c0", @@ -164,5 +198,17 @@ "https://esm.sh/v135/pvtsutils@1.3.5/denonext/pvtsutils.mjs": "016782b990e2652a326cf1d8984c2adc4552171da902cc73dc8e12ffdbe3a100", "https://esm.sh/v135/pvutils@1.1.3/denonext/pvutils.mjs": "ad156a239ec0f1aa99f123fab44abc292c87d4fd6969d7af264436630457523c", "https://esm.sh/v135/tslib@2.6.2/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1" + }, + "workspace": { + "dependencies": [ + "npm:@hexagon/base64@^1.1.27", + "npm:@levischuck/tiny-cbor@~0.2.2", + "npm:@peculiar/asn1-android@^2.3.10", + "npm:@peculiar/asn1-ecc@^2.3.8", + "npm:@peculiar/asn1-rsa@^2.3.8", + "npm:@peculiar/asn1-schema@^2.3.8", + "npm:@peculiar/asn1-x509@^2.3.8", + "npm:cross-fetch@4" + ] } } From c4b672dc0335abca0fe95d45dcf3060dee365178 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:43:44 -0800 Subject: [PATCH 002/115] Update dnt build script --- packages/server/build_npm.ts | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/packages/server/build_npm.ts b/packages/server/build_npm.ts index 1645b91f5..42b7cad9a 100644 --- a/packages/server/build_npm.ts +++ b/packages/server/build_npm.ts @@ -1,4 +1,4 @@ -import { build, emptyDir } from 'https://deno.land/x/dnt@0.38.0/mod.ts'; +import { build, emptyDir } from 'https://deno.land/x/dnt@0.40.0/mod.ts'; const outDir = './npm'; @@ -16,6 +16,7 @@ await build({ { name: '.', path: './src/index.ts' }, { name: './helpers', path: './src/helpers/index.ts' }, ], + importMap: './deno.jsonc', outDir, shims: { deno: { @@ -66,38 +67,6 @@ await build({ }, // Map from Deno package to NPM package for Node build mappings: { - 'https://deno.land/x/b64@1.1.27/src/base64.js': { - name: '@hexagon/base64', - version: '^1.1.27', - }, - 'https://esm.sh/cross-fetch@4.0.0': { - name: 'cross-fetch', - version: '^4.0.0', - }, - 'https://esm.sh/@peculiar/asn1-schema@2.3.8': { - name: '@peculiar/asn1-schema', - version: '^2.3.8', - }, - 'https://esm.sh/@peculiar/asn1-x509@2.3.8': { - name: '@peculiar/asn1-x509', - version: '^2.3.8', - }, - 'https://esm.sh/@peculiar/asn1-ecc@2.3.8': { - name: '@peculiar/asn1-ecc', - version: '^2.3.8', - }, - 'https://esm.sh/@peculiar/asn1-rsa@2.3.8': { - name: '@peculiar/asn1-rsa', - version: '^2.3.8', - }, - 'https://esm.sh/@peculiar/asn1-android@2.3.10': { - name: '@peculiar/asn1-android', - version: '^2.3.10', - }, - 'https://deno.land/x/tiny_cbor@0.2.2/index.ts': { - name: '@levischuck/tiny-cbor', - version: '^0.2.2', - }, // Mapping for '../../types/src/index.ts' in deps.ts '../types/src/index.ts': { name: '@simplewebauthn/types', From e839c9dd8de664adce8378eb0243c6d896c1f2ff Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:45:56 -0800 Subject: [PATCH 003/115] Migrate imports away from deps.ts --- .../generateAuthenticationOptions.ts | 3 ++- .../verifyAuthenticationResponse.test.ts | 2 +- .../authentication/verifyAuthenticationResponse.ts | 3 ++- .../server/src/helpers/convertCertBufferToPEM.ts | 3 ++- .../src/helpers/convertX509PublicKeyToCOSE.ts | 14 +++++--------- .../server/src/helpers/decodeClientDataJSON.ts | 3 ++- packages/server/src/helpers/fetch.ts | 2 +- packages/server/src/helpers/getCertificateInfo.ts | 3 ++- packages/server/src/helpers/isCertRevoked.ts | 5 +++-- packages/server/src/helpers/iso/isoBase64URL.ts | 4 ++-- packages/server/src/helpers/iso/isoCBOR.ts | 2 +- .../src/helpers/iso/isoCrypto/getWebCrypto.ts | 2 +- .../helpers/iso/isoCrypto/unwrapEC2Signature.ts | 4 +++- packages/server/src/helpers/logging.ts | 2 -- packages/server/src/helpers/parseBackupFlags.ts | 2 +- .../server/src/helpers/validateCertificatePath.ts | 3 ++- .../src/helpers/validateExtFIDOGenCEAAGUID.ts | 4 +++- packages/server/src/metadata/mdsTypes.ts | 2 +- .../src/metadata/verifyAttestationWithMetadata.ts | 3 ++- .../registration/generateRegistrationOptions.ts | 3 ++- .../verifications/tpm/verifyAttestationTPM.ts | 5 +++-- .../verifications/verifyAttestationAndroidKey.ts | 5 ++++- .../verifyAttestationAndroidSafetyNet.test.ts | 2 +- .../verifications/verifyAttestationApple.ts | 4 +++- .../verifyRegistrationResponse.test.ts | 2 +- .../src/registration/verifyRegistrationResponse.ts | 3 ++- 26 files changed, 52 insertions(+), 38 deletions(-) diff --git a/packages/server/src/authentication/generateAuthenticationOptions.ts b/packages/server/src/authentication/generateAuthenticationOptions.ts index bea8a8222..de19c5f88 100644 --- a/packages/server/src/authentication/generateAuthenticationOptions.ts +++ b/packages/server/src/authentication/generateAuthenticationOptions.ts @@ -4,7 +4,8 @@ import type { Base64URLString, PublicKeyCredentialRequestOptionsJSON, UserVerificationRequirement, -} from '../deps.ts'; +} from '@simplewebauthn/types'; + import { isoBase64URL, isoUint8Array } from '../helpers/iso/index.ts'; import { generateChallenge } from '../helpers/generateChallenge.ts'; diff --git a/packages/server/src/authentication/verifyAuthenticationResponse.test.ts b/packages/server/src/authentication/verifyAuthenticationResponse.test.ts index 551c7f8c1..bcaf07510 100644 --- a/packages/server/src/authentication/verifyAuthenticationResponse.test.ts +++ b/packages/server/src/authentication/verifyAuthenticationResponse.test.ts @@ -5,6 +5,7 @@ import { assertRejects, } from 'https://deno.land/std@0.198.0/assert/mod.ts'; import { returnsNext, stub } from 'https://deno.land/std@0.198.0/testing/mock.ts'; +import { AuthenticationResponseJSON, WebAuthnCredential } from '@simplewebauthn/types'; import { verifyAuthenticationResponse } from './verifyAuthenticationResponse.ts'; @@ -14,7 +15,6 @@ import { parseAuthenticatorData, } from '../helpers/parseAuthenticatorData.ts'; import { toHash } from '../helpers/toHash.ts'; -import { AuthenticationResponseJSON, WebAuthnCredential } from '../deps.ts'; import { isoBase64URL, isoUint8Array } from '../helpers/iso/index.ts'; import { assertObjectMatch } from 'https://deno.land/std@0.198.0/assert/assert_object_match.ts'; import { assertFalse } from 'https://deno.land/std@0.198.0/assert/assert_false.ts'; diff --git a/packages/server/src/authentication/verifyAuthenticationResponse.ts b/packages/server/src/authentication/verifyAuthenticationResponse.ts index 4a8267e57..703c02e58 100644 --- a/packages/server/src/authentication/verifyAuthenticationResponse.ts +++ b/packages/server/src/authentication/verifyAuthenticationResponse.ts @@ -4,7 +4,8 @@ import type { CredentialDeviceType, UserVerificationRequirement, WebAuthnCredential, -} from '../deps.ts'; +} from '@simplewebauthn/types'; + import { decodeClientDataJSON } from '../helpers/decodeClientDataJSON.ts'; import { toHash } from '../helpers/toHash.ts'; import { verifySignature } from '../helpers/verifySignature.ts'; diff --git a/packages/server/src/helpers/convertCertBufferToPEM.ts b/packages/server/src/helpers/convertCertBufferToPEM.ts index 6e7d5fc9f..126621e88 100644 --- a/packages/server/src/helpers/convertCertBufferToPEM.ts +++ b/packages/server/src/helpers/convertCertBufferToPEM.ts @@ -1,4 +1,5 @@ -import type { Base64URLString } from '../deps.ts'; +import type { Base64URLString } from '@simplewebauthn/types'; + import { isoBase64URL } from './iso/index.ts'; /** diff --git a/packages/server/src/helpers/convertX509PublicKeyToCOSE.ts b/packages/server/src/helpers/convertX509PublicKeyToCOSE.ts index 0f87f38e9..2bdf19afa 100644 --- a/packages/server/src/helpers/convertX509PublicKeyToCOSE.ts +++ b/packages/server/src/helpers/convertX509PublicKeyToCOSE.ts @@ -1,12 +1,6 @@ -import { - AsnParser, - Certificate, - ECParameters, - id_ecPublicKey, - id_secp256r1, - id_secp384r1, - RSAPublicKey, -} from '../deps.ts'; +import { AsnParser } from '@peculiar/asn1-schema'; +import { Certificate } from '@peculiar/asn1-x509'; +import { ECParameters, id_ecPublicKey, id_secp256r1, id_secp384r1 } from '@peculiar/asn1-ecc'; import { COSECRV, COSEKEYS, @@ -15,6 +9,8 @@ import { COSEPublicKeyEC2, COSEPublicKeyRSA, } from './cose.ts'; +import { RSAPublicKey } from '@peculiar/asn1-rsa'; + import { mapX509SignatureAlgToCOSEAlg } from './mapX509SignatureAlgToCOSEAlg.ts'; export function convertX509PublicKeyToCOSE( diff --git a/packages/server/src/helpers/decodeClientDataJSON.ts b/packages/server/src/helpers/decodeClientDataJSON.ts index 8230f42bd..a3a334101 100644 --- a/packages/server/src/helpers/decodeClientDataJSON.ts +++ b/packages/server/src/helpers/decodeClientDataJSON.ts @@ -1,5 +1,6 @@ +import type { Base64URLString } from '@simplewebauthn/types'; + import { isoBase64URL } from './iso/index.ts'; -import type { Base64URLString } from '../deps.ts'; /** * Decode an authenticator's base64url-encoded clientDataJSON to JSON diff --git a/packages/server/src/helpers/fetch.ts b/packages/server/src/helpers/fetch.ts index 14f1d233a..8df5f245e 100644 --- a/packages/server/src/helpers/fetch.ts +++ b/packages/server/src/helpers/fetch.ts @@ -1,4 +1,4 @@ -import { crossFetch } from '../deps.ts'; +import { fetch as crossFetch } from 'cross-fetch'; /** * A simple method for requesting data via standard `fetch`. Should work diff --git a/packages/server/src/helpers/getCertificateInfo.ts b/packages/server/src/helpers/getCertificateInfo.ts index b6f6f98fa..b40687e6e 100644 --- a/packages/server/src/helpers/getCertificateInfo.ts +++ b/packages/server/src/helpers/getCertificateInfo.ts @@ -1,4 +1,5 @@ -import { AsnParser, BasicConstraints, Certificate, id_ce_basicConstraints } from '../deps.ts'; +import { AsnParser } from '@peculiar/asn1-schema'; +import { BasicConstraints, Certificate, id_ce_basicConstraints } from '@peculiar/asn1-x509'; export type CertificateInfo = { issuer: Issuer; diff --git a/packages/server/src/helpers/isCertRevoked.ts b/packages/server/src/helpers/isCertRevoked.ts index a4f8a9d54..d32c6000a 100644 --- a/packages/server/src/helpers/isCertRevoked.ts +++ b/packages/server/src/helpers/isCertRevoked.ts @@ -1,5 +1,5 @@ +import { AsnParser } from '@peculiar/asn1-schema'; import { - AsnParser, AuthorityKeyIdentifier, Certificate, CertificateList, @@ -8,7 +8,8 @@ import { id_ce_cRLDistributionPoints, id_ce_subjectKeyIdentifier, SubjectKeyIdentifier, -} from '../deps.ts'; +} from '@peculiar/asn1-x509'; + import { isoUint8Array } from './iso/index.ts'; import { fetch } from './fetch.ts'; diff --git a/packages/server/src/helpers/iso/isoBase64URL.ts b/packages/server/src/helpers/iso/isoBase64URL.ts index 5c2388d49..bc22ff4b4 100644 --- a/packages/server/src/helpers/iso/isoBase64URL.ts +++ b/packages/server/src/helpers/iso/isoBase64URL.ts @@ -1,5 +1,5 @@ -import { base64 } from '../../deps.ts'; -import type { Base64URLString } from '../../deps.ts'; +import base64 from '@hexagon/base64'; +import type { Base64URLString } from '@simplewebauthn/types'; /** * Decode from a Base64URL-encoded string to an ArrayBuffer. Best used when converting a diff --git a/packages/server/src/helpers/iso/isoCBOR.ts b/packages/server/src/helpers/iso/isoCBOR.ts index aa0b5fbd4..d48ca49c4 100644 --- a/packages/server/src/helpers/iso/isoCBOR.ts +++ b/packages/server/src/helpers/iso/isoCBOR.ts @@ -1,4 +1,4 @@ -import { tinyCbor } from '../../deps.ts'; +import * as tinyCbor from 'tiny-cbor'; /** * Whatever CBOR encoder is used should keep CBOR data the same length when data is re-encoded diff --git a/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts b/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts index 97616534a..fffdc2acc 100644 --- a/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts +++ b/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts @@ -1,4 +1,4 @@ -import type { Crypto } from '../../../deps.ts'; +import type { Crypto } from '@simplewebauthn/types'; let webCrypto: Crypto | undefined = undefined; diff --git a/packages/server/src/helpers/iso/isoCrypto/unwrapEC2Signature.ts b/packages/server/src/helpers/iso/isoCrypto/unwrapEC2Signature.ts index 40387152a..d317d2134 100644 --- a/packages/server/src/helpers/iso/isoCrypto/unwrapEC2Signature.ts +++ b/packages/server/src/helpers/iso/isoCrypto/unwrapEC2Signature.ts @@ -1,4 +1,6 @@ -import { AsnParser, ECDSASigValue } from '../../../deps.ts'; +import { AsnParser } from '@peculiar/asn1-schema'; +import { ECDSASigValue } from '@peculiar/asn1-ecc'; + import { COSECRV } from '../../cose.ts'; import { isoUint8Array } from '../index.ts'; diff --git a/packages/server/src/helpers/logging.ts b/packages/server/src/helpers/logging.ts index a46821e92..b06fdcb25 100644 --- a/packages/server/src/helpers/logging.ts +++ b/packages/server/src/helpers/logging.ts @@ -1,5 +1,3 @@ -// import { debug, Debugger } from '../deps.ts'; - // const defaultLogger = debug('SimpleWebAuthn'); /** diff --git a/packages/server/src/helpers/parseBackupFlags.ts b/packages/server/src/helpers/parseBackupFlags.ts index ea3a93f23..029a09fdd 100644 --- a/packages/server/src/helpers/parseBackupFlags.ts +++ b/packages/server/src/helpers/parseBackupFlags.ts @@ -1,4 +1,4 @@ -import type { CredentialDeviceType } from '../deps.ts'; +import type { CredentialDeviceType } from '@simplewebauthn/types'; /** * Make sense of Bits 3 and 4 in authenticator indicating: diff --git a/packages/server/src/helpers/validateCertificatePath.ts b/packages/server/src/helpers/validateCertificatePath.ts index ae1e9d05a..db93627a1 100644 --- a/packages/server/src/helpers/validateCertificatePath.ts +++ b/packages/server/src/helpers/validateCertificatePath.ts @@ -1,4 +1,5 @@ -import { AsnSerializer } from '../deps.ts'; +import { AsnSerializer } from '@peculiar/asn1-schema'; + import { isCertRevoked } from './isCertRevoked.ts'; import { verifySignature } from './verifySignature.ts'; import { mapX509SignatureAlgToCOSEAlg } from './mapX509SignatureAlgToCOSEAlg.ts'; diff --git a/packages/server/src/helpers/validateExtFIDOGenCEAAGUID.ts b/packages/server/src/helpers/validateExtFIDOGenCEAAGUID.ts index cc1404cac..e99208886 100644 --- a/packages/server/src/helpers/validateExtFIDOGenCEAAGUID.ts +++ b/packages/server/src/helpers/validateExtFIDOGenCEAAGUID.ts @@ -1,4 +1,6 @@ -import { AsnParser, Extensions, OctetString } from '../deps.ts'; +import { AsnParser, OctetString } from '@peculiar/asn1-schema'; +import { Extensions } from '@peculiar/asn1-x509'; + import { isoUint8Array } from './iso/index.ts'; /** diff --git a/packages/server/src/metadata/mdsTypes.ts b/packages/server/src/metadata/mdsTypes.ts index db0a64d0c..185fd58bb 100644 --- a/packages/server/src/metadata/mdsTypes.ts +++ b/packages/server/src/metadata/mdsTypes.ts @@ -1,4 +1,4 @@ -import type { Base64URLString } from '../deps.ts'; +import type { Base64URLString } from '@simplewebauthn/types'; /** * Metadata Service structures diff --git a/packages/server/src/metadata/verifyAttestationWithMetadata.ts b/packages/server/src/metadata/verifyAttestationWithMetadata.ts index 37afab786..e9b73e025 100644 --- a/packages/server/src/metadata/verifyAttestationWithMetadata.ts +++ b/packages/server/src/metadata/verifyAttestationWithMetadata.ts @@ -1,4 +1,5 @@ -import type { Base64URLString } from '../deps.ts'; +import type { Base64URLString } from '@simplewebauthn/types'; + import type { AlgSign, MetadataStatement } from '../metadata/mdsTypes.ts'; import { convertCertBufferToPEM } from '../helpers/convertCertBufferToPEM.ts'; import { validateCertificatePath } from '../helpers/validateCertificatePath.ts'; diff --git a/packages/server/src/registration/generateRegistrationOptions.ts b/packages/server/src/registration/generateRegistrationOptions.ts index beba2d0c5..05f596932 100644 --- a/packages/server/src/registration/generateRegistrationOptions.ts +++ b/packages/server/src/registration/generateRegistrationOptions.ts @@ -7,7 +7,8 @@ import type { COSEAlgorithmIdentifier, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialParameters, -} from '../deps.ts'; +} from '@simplewebauthn/types'; + import { generateChallenge } from '../helpers/generateChallenge.ts'; import { generateUserID } from '../helpers/generateUserID.ts'; import { isoBase64URL, isoUint8Array } from '../helpers/iso/index.ts'; diff --git a/packages/server/src/registration/verifications/tpm/verifyAttestationTPM.ts b/packages/server/src/registration/verifications/tpm/verifyAttestationTPM.ts index 8b59d9c5c..d61926ca1 100644 --- a/packages/server/src/registration/verifications/tpm/verifyAttestationTPM.ts +++ b/packages/server/src/registration/verifications/tpm/verifyAttestationTPM.ts @@ -1,12 +1,13 @@ +import { AsnParser } from '@peculiar/asn1-schema'; import { - AsnParser, Certificate, ExtendedKeyUsage, id_ce_extKeyUsage, id_ce_subjectAltName, Name, SubjectAlternativeName, -} from '../../../deps.ts'; +} from '@peculiar/asn1-x509'; + import type { AttestationFormatVerifierOpts } from '../../verifyRegistrationResponse.ts'; import { decodeCredentialPublicKey } from '../../../helpers/decodeCredentialPublicKey.ts'; import { diff --git a/packages/server/src/registration/verifications/verifyAttestationAndroidKey.ts b/packages/server/src/registration/verifications/verifyAttestationAndroidKey.ts index 109bcf09f..e51ddb3bf 100644 --- a/packages/server/src/registration/verifications/verifyAttestationAndroidKey.ts +++ b/packages/server/src/registration/verifications/verifyAttestationAndroidKey.ts @@ -1,4 +1,7 @@ -import { AsnParser, Certificate, id_ce_keyDescription, KeyDescription } from '../../deps.ts'; +import { AsnParser } from '@peculiar/asn1-schema'; +import { Certificate } from '@peculiar/asn1-x509'; +import { id_ce_keyDescription, KeyDescription } from '@peculiar/asn1-android'; + import type { AttestationFormatVerifierOpts } from '../verifyRegistrationResponse.ts'; import { convertCertBufferToPEM } from '../../helpers/convertCertBufferToPEM.ts'; import { validateCertificatePath } from '../../helpers/validateCertificatePath.ts'; diff --git a/packages/server/src/registration/verifications/verifyAttestationAndroidSafetyNet.test.ts b/packages/server/src/registration/verifications/verifyAttestationAndroidSafetyNet.test.ts index 39ea6360b..ecf34f5f4 100644 --- a/packages/server/src/registration/verifications/verifyAttestationAndroidSafetyNet.test.ts +++ b/packages/server/src/registration/verifications/verifyAttestationAndroidSafetyNet.test.ts @@ -1,7 +1,7 @@ import { assert, assertRejects } from 'https://deno.land/std@0.198.0/assert/mod.ts'; import { FakeTime } from 'https://deno.land/std@0.198.0/testing/time.ts'; +import { RegistrationResponseJSON } from '@simplewebauthn/types'; -import { RegistrationResponseJSON } from '../../deps.ts'; import { verifyAttestationAndroidSafetyNet } from './verifyAttestationAndroidSafetyNet.ts'; import { decodeAttestationObject } from '../../helpers/decodeAttestationObject.ts'; diff --git a/packages/server/src/registration/verifications/verifyAttestationApple.ts b/packages/server/src/registration/verifications/verifyAttestationApple.ts index 98276ca4a..4167bba15 100644 --- a/packages/server/src/registration/verifications/verifyAttestationApple.ts +++ b/packages/server/src/registration/verifications/verifyAttestationApple.ts @@ -1,4 +1,6 @@ -import { AsnParser, Certificate } from '../../deps.ts'; +import { AsnParser } from '@peculiar/asn1-schema'; +import { Certificate } from '@peculiar/asn1-x509'; + import type { AttestationFormatVerifierOpts } from '../verifyRegistrationResponse.ts'; import { validateCertificatePath } from '../../helpers/validateCertificatePath.ts'; import { convertCertBufferToPEM } from '../../helpers/convertCertBufferToPEM.ts'; diff --git a/packages/server/src/registration/verifyRegistrationResponse.test.ts b/packages/server/src/registration/verifyRegistrationResponse.test.ts index 382b222c0..b440f1167 100644 --- a/packages/server/src/registration/verifyRegistrationResponse.test.ts +++ b/packages/server/src/registration/verifyRegistrationResponse.test.ts @@ -5,8 +5,8 @@ import { assertRejects, } from 'https://deno.land/std@0.198.0/assert/mod.ts'; import { returnsNext, stub } from 'https://deno.land/std@0.198.0/testing/mock.ts'; +import { RegistrationResponseJSON } from '@simplewebauthn/types'; -import { RegistrationResponseJSON } from '../deps.ts'; import { verifyRegistrationResponse } from './verifyRegistrationResponse.ts'; import { _decodeAttestationObjectInternals, diff --git a/packages/server/src/registration/verifyRegistrationResponse.ts b/packages/server/src/registration/verifyRegistrationResponse.ts index f4ef75c03..a1aa9f55b 100644 --- a/packages/server/src/registration/verifyRegistrationResponse.ts +++ b/packages/server/src/registration/verifyRegistrationResponse.ts @@ -3,7 +3,8 @@ import type { CredentialDeviceType, RegistrationResponseJSON, WebAuthnCredential, -} from '../deps.ts'; +} from '@simplewebauthn/types'; + import { AttestationFormat, AttestationStatement, From 9a8436975f122123cb2b155c58505a7842159e9d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:50:25 -0800 Subject: [PATCH 004/115] Delete deps.ts from server --- packages/server/src/deps.ts | 57 ------------------------------------- 1 file changed, 57 deletions(-) delete mode 100644 packages/server/src/deps.ts diff --git a/packages/server/src/deps.ts b/packages/server/src/deps.ts deleted file mode 100644 index 2913e22f6..000000000 --- a/packages/server/src/deps.ts +++ /dev/null @@ -1,57 +0,0 @@ -// @simplewebauthn/types -export type { - AttestationConveyancePreference, - AuthenticationExtensionsClientInputs, - AuthenticationResponseJSON, - AuthenticatorSelectionCriteria, - AuthenticatorTransportFuture, - Base64URLString, - COSEAlgorithmIdentifier, - CredentialDeviceType, - Crypto, - PublicKeyCredentialCreationOptionsJSON, - PublicKeyCredentialParameters, - PublicKeyCredentialRequestOptionsJSON, - RegistrationResponseJSON, - UserVerificationRequirement, - WebAuthnCredential, -} from '../../types/src/index.ts'; - -// tiny_cbor (a.k.a. tiny-cbor in Node land) -export * as tinyCbor from 'https://deno.land/x/tiny_cbor@0.2.2/index.ts'; - -// b64 (a.k.a. @hexagon/base64 in Node land) -export { default as base64 } from 'https://deno.land/x/b64@1.1.27/src/base64.js'; - -// cross-fetch -export { fetch as crossFetch } from 'https://esm.sh/cross-fetch@4.0.0'; - -// @peculiar libraries -export { AsnParser, AsnSerializer, OctetString } from 'https://esm.sh/@peculiar/asn1-schema@2.3.8'; -export { - AuthorityKeyIdentifier, - BasicConstraints, - Certificate, - CertificateList, - CRLDistributionPoints, - ExtendedKeyUsage, - Extensions, - id_ce_authorityKeyIdentifier, - id_ce_basicConstraints, - id_ce_cRLDistributionPoints, - id_ce_extKeyUsage, - id_ce_subjectAltName, - id_ce_subjectKeyIdentifier, - Name, - SubjectAlternativeName, - SubjectKeyIdentifier, -} from 'https://esm.sh/@peculiar/asn1-x509@2.3.8'; -export { - ECDSASigValue, - ECParameters, - id_ecPublicKey, - id_secp256r1, - id_secp384r1, -} from 'https://esm.sh/@peculiar/asn1-ecc@2.3.8'; -export { RSAPublicKey } from 'https://esm.sh/@peculiar/asn1-rsa@2.3.8'; -export { id_ce_keyDescription, KeyDescription } from 'https://esm.sh/@peculiar/asn1-android@2.3.10'; From d0e86484f06e22e1ceafbfa993f6aa289bda3ba4 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:52:43 -0800 Subject: [PATCH 005/115] Copy deno fmt settings into server and types --- packages/server/deno.jsonc | 4 ++++ packages/types/deno.jsonc | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index 7e0fefc60..1ea8e7d3a 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -2,6 +2,10 @@ "tasks": { "build": "deno run -A build_npm.ts" }, + "fmt": { + "singleQuote": true, + "lineWidth": 100 + }, "imports": { "tiny-cbor": "npm:@levischuck/tiny-cbor@^0.2.2", "@hexagon/base64": "npm:@hexagon/base64@^1.1.27", diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index df74b3688..e17644ede 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -1,5 +1,9 @@ { "tasks": { "build": "deno run -A build_npm.ts" + }, + "fmt": { + "singleQuote": true, + "lineWidth": 100 } } From 69a4693e2bcab0874b449493d36510b39e4ee060 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:52:52 -0800 Subject: [PATCH 006/115] Remove superfluous root deno.jsonc --- deno.lock | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 deno.lock diff --git a/deno.lock b/deno.lock deleted file mode 100644 index ec9548b2c..000000000 --- a/deno.lock +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2", - "remote": {}, - "npm": { - "specifiers": { - "@types/node": "@types/node@18.16.19" - }, - "packages": { - "@types/node@18.16.19": { - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", - "dependencies": {} - } - } - } -} From b6ae2ec2d0e8c2e3cf65c30c69524de1f077a79e Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:53:07 -0800 Subject: [PATCH 007/115] Run pnpm install from root --- pnpm-lock.yaml | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7317617b..608d00136 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,11 +107,11 @@ importers: version: 4.0.0(encoding@0.1.13) devDependencies: '@deno/shim-deno-test': - specifier: ~0.4.0 - version: 0.4.0 + specifier: ~0.5.0 + version: 0.5.0 '@types/node': - specifier: ^18.11.9 - version: 18.17.8 + specifier: ^20.9.0 + version: 20.17.6 picocolors: specifier: ^1.0.0 version: 1.0.0 @@ -358,8 +358,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@deno/shim-deno-test@0.4.0': - resolution: {integrity: sha512-oYWcD7CpERZy/TXMTM9Tgh1HD/POHlbY9WpzmAk+5H8DohcxG415Qws8yLGlim3EaKBT2v3lJv01x4G0BosnaQ==} + '@deno/shim-deno-test@0.5.0': + resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} '@emnapi/core@1.3.1': resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} @@ -868,9 +868,6 @@ packages: '@types/minimist@1.2.2': resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - '@types/node@18.17.8': - resolution: {integrity: sha512-Av/7MqX/iNKwT9Tr60V85NqMnsmh8ilfJoBlIVibkXfitk9Q22D9Y5mSpm+FvG5DET7EbVfB40bOiLzKgYFgPw==} - '@types/node@20.17.6': resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} @@ -4049,7 +4046,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@deno/shim-deno-test@0.4.0': {} + '@deno/shim-deno-test@0.5.0': {} '@emnapi/core@1.3.1': dependencies: @@ -4864,8 +4861,6 @@ snapshots: '@types/minimist@1.2.2': {} - '@types/node@18.17.8': {} - '@types/node@20.17.6': dependencies: undici-types: 6.19.8 @@ -4874,7 +4869,7 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 18.17.8 + '@types/node': 20.17.6 '@types/stack-utils@2.0.1': {} From a807a991c7d9ffc10f6f1f21212b05a774688fb5 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:53:25 -0800 Subject: [PATCH 008/115] Try to specify formatting settings in lint-staged --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab8b2d31b..a96643085 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "lint-staged": { "*.{ts,js}": [ "deno lint", - "deno fmt", + "deno fmt -c ./deno.jsonc", "git add" ] } From b54f37e068e5a6603a63703bdfa06ef4643ec505 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 15:53:43 -0800 Subject: [PATCH 009/115] Use non-Homebrew Deno install for now --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index aa6d1ce87..c619c7b59 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "typescript.tsdk": "node_modules/typescript/lib", "editor.formatOnSave": true, - "deno.path": "/opt/homebrew/bin/deno", + "deno.path": "${userHome}/.deno/bin/deno", "deno.enablePaths": [ "./packages/server", "./packages/types" From d17a490054947c5fcaab7a0028ca72cd094af531 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 16:08:17 -0800 Subject: [PATCH 010/115] Update types dnt to same version --- packages/types/build_npm.ts | 2 +- packages/types/deno.lock | 41 +++++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/packages/types/build_npm.ts b/packages/types/build_npm.ts index 3085264ec..2f8309ab7 100644 --- a/packages/types/build_npm.ts +++ b/packages/types/build_npm.ts @@ -1,4 +1,4 @@ -import { build, emptyDir } from 'https://deno.land/x/dnt@0.38.0/mod.ts'; +import { build, emptyDir } from 'https://deno.land/x/dnt@0.40.0/mod.ts'; const outDir = './npm'; const lernaPackageJSON: { version: string } = JSON.parse( diff --git a/packages/types/deno.lock b/packages/types/deno.lock index 2a20d2780..4b2d9c486 100644 --- a/packages/types/deno.lock +++ b/packages/types/deno.lock @@ -1,5 +1,5 @@ { - "version": "2", + "version": "4", "remote": { "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", @@ -23,7 +23,9 @@ "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", "https://deno.land/std@0.181.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", "https://deno.land/std@0.181.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.181.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", "https://deno.land/std@0.181.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", + "https://deno.land/std@0.181.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", "https://deno.land/std@0.181.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", "https://deno.land/std@0.181.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", "https://deno.land/std@0.181.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", @@ -64,6 +66,18 @@ "https://deno.land/x/deno_cache@0.4.1/http_cache.ts": "f632e0d6ec4a5d61ae3987737a72caf5fcdb93670d21032ddb78df41131360cd", "https://deno.land/x/deno_cache@0.4.1/mod.ts": "ef1cda9235a93b89cb175fe648372fc0f785add2a43aa29126567a05e3e36195", "https://deno.land/x/deno_cache@0.4.1/util.ts": "8cb686526f4be5205b92c819ca2ce82220aa0a8dd3613ef0913f6dc269dbbcfe", + "https://deno.land/x/deno_cache@0.6.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e", + "https://deno.land/x/deno_cache@0.6.2/cache.ts": "58b53c128b742757efcad10af9a3871f23b4e200674cb5b0ddf61164fb9b2fe7", + "https://deno.land/x/deno_cache@0.6.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0", + "https://deno.land/x/deno_cache@0.6.2/deps.ts": "12cca94516cf2d3ed42fccd4b721ecd8060679253f077d83057511045b0081aa", + "https://deno.land/x/deno_cache@0.6.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069", + "https://deno.land/x/deno_cache@0.6.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa", + "https://deno.land/x/deno_cache@0.6.2/file_fetcher.ts": "4f3e4a2c78a5ca1e4812099e5083f815a8525ab20d389b560b3517f6b1161dd6", + "https://deno.land/x/deno_cache@0.6.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd", + "https://deno.land/x/deno_cache@0.6.2/lib/deno_cache_dir.generated.js": "59f8defac32e8ebf2a30f7bc77e9d88f0e60098463fb1b75e00b9791a4bbd733", + "https://deno.land/x/deno_cache@0.6.2/lib/snippets/deno_cache_dir-a2aecaa9536c9402/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6", + "https://deno.land/x/deno_cache@0.6.2/mod.ts": "b4004287e1c6123d7f07fe9b5b3e94ce6d990c4102949a89c527c68b19627867", + "https://deno.land/x/deno_cache@0.6.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2", "https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66", "https://deno.land/x/dnt@0.38.0/lib/compiler.ts": "209ad2e1b294f93f87ec02ade9a0821f942d2e524104552d0aa8ff87021050a5", "https://deno.land/x/dnt@0.38.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", @@ -80,13 +94,36 @@ "https://deno.land/x/dnt@0.38.0/lib/utils.ts": "878b7ac7003a10c16e6061aa49dbef9b42bd43174853ebffc9b67ea47eeb11d8", "https://deno.land/x/dnt@0.38.0/mod.ts": "b13349fe77847cf58e26b40bcd58797a8cec5d71b31a1ca567071329c8489de1", "https://deno.land/x/dnt@0.38.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", + "https://deno.land/x/dnt@0.40.0/lib/compiler.ts": "7f4447531581896348b8a379ab94730856b42ae50d99043f2468328360293cb1", + "https://deno.land/x/dnt@0.40.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", + "https://deno.land/x/dnt@0.40.0/lib/mod.deps.ts": "8d6123c8e1162037e58aa8126686a03d1e2cffb250a8757bf715f80242097597", + "https://deno.land/x/dnt@0.40.0/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", + "https://deno.land/x/dnt@0.40.0/lib/package_json.ts": "607b0a4f44acad071a4c8533b312a27d6671eac8e6a23625c8350ce29eadb2ba", + "https://deno.land/x/dnt@0.40.0/lib/pkg/dnt_wasm.generated.js": "2694546844a50861d6d1610859afbf5130baca4dc6cf304541b7ec2d6d998142", + "https://deno.land/x/dnt@0.40.0/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "aba69a019a6da6f084898a6c7b903b8b583bc0dbd82bfb338449cf0b5bce58fd", + "https://deno.land/x/dnt@0.40.0/lib/shims.ts": "39e5c141f0315c0faf30b479b53f92b9078d92e1fd67ee34cc60b701d8e68dab", + "https://deno.land/x/dnt@0.40.0/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", + "https://deno.land/x/dnt@0.40.0/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", + "https://deno.land/x/dnt@0.40.0/lib/transform.deps.ts": "2e159661e1c5c650de9a573babe0e319349fe493105157307ec2ad2f6a52c94e", + "https://deno.land/x/dnt@0.40.0/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", + "https://deno.land/x/dnt@0.40.0/lib/utils.ts": "224f15f33e7226a2fd991e438d0291d7ed8c7889807efa2e1ecb67d2d1db6720", + "https://deno.land/x/dnt@0.40.0/mod.ts": "ae1890fbe592e4797e7dd88c1e270f22b8334878e9bf187c4e11ae75746fe778", + "https://deno.land/x/dnt@0.40.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", "https://deno.land/x/ts_morph@18.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", "https://deno.land/x/ts_morph@18.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", "https://deno.land/x/ts_morph@18.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", "https://deno.land/x/ts_morph@18.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", "https://deno.land/x/ts_morph@18.0.0/common/ts_morph_common.js": "845671ca951073400ce142f8acefa2d39ea9a51e29ca80928642f3f8cf2b7700", "https://deno.land/x/ts_morph@18.0.0/common/typescript.js": "d5c598b6a2db2202d0428fca5fd79fc9a301a71880831a805d778797d2413c59", + "https://deno.land/x/ts_morph@20.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", + "https://deno.land/x/ts_morph@20.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", + "https://deno.land/x/ts_morph@20.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", + "https://deno.land/x/ts_morph@20.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", + "https://deno.land/x/ts_morph@20.0.0/common/ts_morph_common.js": "2325f94f61dc5f3f98a1dab366dc93048d11b1433d718b10cfc6ee5a1cfebe8f", + "https://deno.land/x/ts_morph@20.0.0/common/typescript.js": "b9edf0a451685d13e0467a7ed4351d112b74bd1e256b915a2b941054e31c1736", "https://deno.land/x/wasmbuild@0.14.1/cache.ts": "89eea5f3ce6035a1164b3e655c95f21300498920575ade23161421f5b01967f4", - "https://deno.land/x/wasmbuild@0.14.1/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02" + "https://deno.land/x/wasmbuild@0.14.1/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02", + "https://deno.land/x/wasmbuild@0.15.1/cache.ts": "9d01b5cb24e7f2a942bbd8d14b093751fa690a6cde8e21709ddc97667e6669ed", + "https://deno.land/x/wasmbuild@0.15.1/loader.ts": "8c2fc10e21678e42f84c5135d8ab6ab7dc92424c3f05d2354896a29ccfd02a63" } } From 814eb716ea94244aecbe8112f8f9296b030bef6b Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:09:59 -0800 Subject: [PATCH 011/115] Remove files to prepare for a Deno + JSR future --- lerna.json | 19 - nx.json | 36 - package.json | 50 - packages/types/package.json | 17 - pnpm-lock.yaml | 8071 ----------------------------------- pnpm-workspace.yaml | 4 - tsconfig.json | 22 - 7 files changed, 8219 deletions(-) delete mode 100644 lerna.json delete mode 100644 nx.json delete mode 100644 package.json delete mode 100644 packages/types/package.json delete mode 100644 pnpm-lock.yaml delete mode 100644 pnpm-workspace.yaml delete mode 100644 tsconfig.json diff --git a/lerna.json b/lerna.json deleted file mode 100644 index c2bf71a53..000000000 --- a/lerna.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "11.0.0", - "npmClient": "pnpm", - "command": { - "publish": { - "ignoreChanges": [ - "*.config.js", - ".gitignore" - ], - "message": "chore(release): publish %s" - } - }, - "packages": [ - "packages/browser", - "packages/server", - "packages/types" - ], - "$schema": "node_modules/lerna/schemas/lerna-schema.json" -} diff --git a/nx.json b/nx.json deleted file mode 100644 index 5572d2bf7..000000000 --- a/nx.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "tasksRunnerOptions": { - "default": { - "options": { - "cacheableOperations": [ - "build", - "test" - ] - } - } - }, - "targetDefaults": { - "build": { - "outputs": [ - "{workspaceRoot}/dist", - "{workspaceRoot}/npm" - ] - } - }, - "pluginsConfig": { - "@nrwl/js": { - "analyzeSourceFiles": false - } - }, - "$schema": "./node_modules/nx/schemas/nx-schema.json", - "namedInputs": { - "default": [ - "{projectRoot}/**/*", - "sharedGlobals" - ], - "sharedGlobals": [], - "production": [ - "default" - ] - } -} diff --git a/package.json b/package.json deleted file mode 100644 index a96643085..000000000 --- a/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "simplewebauthn-monorepo", - "version": "0.0.0", - "private": true, - "scripts": { - "bootstrap-monorepo": "./bootstrap.sh", - "clean": "rm -rf ./packages/**/node_modules && rm -rf ./packages/**/dist && rm -rf ./packages/**/npm", - "lint": "deno lint packages/**/src/**/*.ts example/**/*.ts", - "test": "pnpm run test:browser; pnpm run test:server", - "test:browser": "lerna run test --scope=@simplewebauthn/browser", - "test:server": "lerna run test --scope=@simplewebauthn/server", - "build:types": "lerna run build --scope=@simplewebauthn/types", - "build:browser": "lerna run build --scope=@simplewebauthn/browser", - "build:server": "lerna run build --scope=@simplewebauthn/server", - "update-version": "lerna version --no-push", - "publish:types": "pnpm run build:types && (cd packages/types/npm; pnpm publish)", - "publish:browser": "pnpm run build:browser && (cd packages/browser; pnpm publish)", - "publish:server": "pnpm run build:server && (cd packages/server/npm; pnpm publish)", - "dev:browser": "lerna run test:watch --scope=@simplewebauthn/browser", - "dev:server": "lerna run test:watch --scope=@simplewebauthn/server" - }, - "devDependencies": { - "@types/jest": "^29.5.14", - "@types/node": "^20.0.0", - "husky": "^9.1.6", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "lerna": "^8.1.9", - "lint-staged": "^15.2.10", - "nodemon": "^3.1.7", - "nx": "^20.0.8", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "ts-morph": "^24.0.0", - "ts-node": "^10.9.2", - "typescript": "^5.6.3" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - "lint-staged": { - "*.{ts,js}": [ - "deno lint", - "deno fmt -c ./deno.jsonc", - "git add" - ] - } -} diff --git a/packages/types/package.json b/packages/types/package.json deleted file mode 100644 index 3f48c65c2..000000000 --- a/packages/types/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@simplewebauthn/types", - "version": "11.0.0", - "description": "Lerna/npm wrapper around Deno for @simplewebauthn/types", - "scripts": { - "build": "deno task build", - "extract-dom-types": "ts-node extract-dom-types.ts" - }, - "lerna": { - "command": { - "publish": { - "directory": "./npm" - } - } - }, - "gitHead": "33ccf8c6c9add811c87d3089e24156c2342b3498" -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 608d00136..000000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,8071 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - devDependencies: - '@types/jest': - specifier: ^29.5.14 - version: 29.5.14 - '@types/node': - specifier: ^20.0.0 - version: 20.17.6 - husky: - specifier: ^9.1.6 - version: 9.1.6 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0 - lerna: - specifier: ^8.1.9 - version: 8.1.9(encoding@0.1.13) - lint-staged: - specifier: ^15.2.10 - version: 15.2.10 - nodemon: - specifier: ^3.1.7 - version: 3.1.7 - nx: - specifier: ^20.0.8 - version: 20.0.8 - rimraf: - specifier: ^6.0.1 - version: 6.0.1 - ts-jest: - specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.22.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.22.10))(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3) - ts-morph: - specifier: ^24.0.0 - version: 24.0.0 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.6)(typescript@5.6.3) - typescript: - specifier: ^5.6.3 - version: 5.6.3 - - packages/browser: - dependencies: - '@simplewebauthn/types': - specifier: workspace:^ - version: link:../types/npm - devDependencies: - '@rollup/plugin-node-resolve': - specifier: ^13.0.0 - version: 13.0.0(rollup@2.52.1) - '@rollup/plugin-terser': - specifier: ^0.4.3 - version: 0.4.3(rollup@2.52.1) - '@rollup/plugin-typescript': - specifier: ^8.2.1 - version: 8.2.1(rollup@2.52.1)(tslib@2.6.2)(typescript@5.6.3) - rollup: - specifier: ^2.52.1 - version: 2.52.1 - rollup-plugin-version-injector: - specifier: ^1.3.3 - version: 1.3.3 - tslib: - specifier: ^2.6.2 - version: 2.6.2 - - packages/server/npm: - dependencies: - '@hexagon/base64': - specifier: ^1.1.27 - version: 1.1.27 - '@levischuck/tiny-cbor': - specifier: ^0.2.2 - version: 0.2.2 - '@peculiar/asn1-android': - specifier: ^2.3.10 - version: 2.3.10 - '@peculiar/asn1-ecc': - specifier: ^2.3.8 - version: 2.3.8 - '@peculiar/asn1-rsa': - specifier: ^2.3.8 - version: 2.3.8 - '@peculiar/asn1-schema': - specifier: ^2.3.8 - version: 2.3.8 - '@peculiar/asn1-x509': - specifier: ^2.3.8 - version: 2.3.8 - '@simplewebauthn/types': - specifier: ^11.0.0 - version: 11.0.0 - cross-fetch: - specifier: ^4.0.0 - version: 4.0.0(encoding@0.1.13) - devDependencies: - '@deno/shim-deno-test': - specifier: ~0.5.0 - version: 0.5.0 - '@types/node': - specifier: ^20.9.0 - version: 20.17.6 - picocolors: - specifier: ^1.0.0 - version: 1.0.0 - - packages/types/npm: {} - -packages: - - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - - '@babel/code-frame@7.22.10': - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} - engines: {node: '>=6.9.0'} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.22.9': - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.26.2': - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.22.10': - resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.0': - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.22.10': - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.22.10': - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-environment-visitor@7.22.5': - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.22.5': - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.22.5': - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.22.9': - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.22.5': - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.22.5': - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.5': - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.22.5': - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.22.10': - resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.26.0': - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.22.10': - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.22.10': - resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.26.2': - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.22.5': - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.22.5': - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/template@7.22.5': - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.22.10': - resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.22.10': - resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@deno/shim-deno-test@0.5.0': - resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} - - '@emnapi/core@1.3.1': - resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} - - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} - - '@hexagon/base64@1.1.27': - resolution: {integrity: sha512-PdUmzpvcUM3Rh39kvz9RdbPVYhMjBjdV7Suw7ZduP7urRLsZR8l5tzgSWKm7TExwBYDFwTnYrZbnE0rQ3N5NLQ==} - - '@hutson/parse-repository-url@3.0.2': - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@isaacs/string-locale-compare@1.1.0': - resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} - - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@29.6.0': - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@29.6.1': - resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.19': - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@lerna/create@8.1.9': - resolution: {integrity: sha512-DPnl5lPX4v49eVxEbJnAizrpMdMTBz1qykZrAbBul9rfgk531v8oAt+Pm6O/rpAleRombNM7FJb5rYGzBJatOQ==} - engines: {node: '>=18.0.0'} - - '@levischuck/tiny-cbor@0.2.2': - resolution: {integrity: sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw==} - - '@napi-rs/wasm-runtime@0.2.4': - resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/agent@2.2.2': - resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/arborist@7.5.4': - resolution: {integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true - - '@npmcli/fs@3.1.0': - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/fs@3.1.1': - resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/git@5.0.8': - resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/installed-package-contents@2.0.2': - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - '@npmcli/installed-package-contents@2.1.0': - resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - '@npmcli/map-workspaces@3.0.6': - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/metavuln-calculator@7.1.1': - resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/name-from-folder@2.0.0': - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/node-gyp@3.0.0': - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/package-json@5.2.0': - resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/promise-spawn@7.0.2': - resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/query@3.1.0': - resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/redact@2.0.1': - resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/run-script@8.1.0': - resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@nx/devkit@20.0.8': - resolution: {integrity: sha512-MRUGgWSMzYtdwtolvWL5EZlX+7xYgu7JIXf1+3rmZU5adMmlqWKrIbyvDf53XocQlT8oxx/xXTEFHhIymGTQCg==} - peerDependencies: - nx: '>= 19 <= 21' - - '@nx/nx-darwin-arm64@20.0.8': - resolution: {integrity: sha512-tDoafq5YUyOwxR1Y796WXA6j49OLJRO7TA/Fym52SSuD3AULbgo3/X5XeY6oL2PWM044CuUVrp3V4cIDUtyJpA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@nx/nx-darwin-x64@20.0.8': - resolution: {integrity: sha512-bvfZ6VhSvOpPV00veaJDO1a4X+f0dn8S1A73/2ThbGZrZLAQIFrA8v+ysax+bfCGRHNdtlAL+f7TG2buh/4BRg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@nx/nx-freebsd-x64@20.0.8': - resolution: {integrity: sha512-AdOme0o/pTFy+TutIOAamuGTqbh6nOLrkNEX8f4ogfDRH+k/WvjRQ4z4ne58wf/2EVXua4jKTIEipIZAP/Ad1w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@nx/nx-linux-arm-gnueabihf@20.0.8': - resolution: {integrity: sha512-PYf7Z30A1TCZq9HVUP6JjT3ghTLYkaBpR6vDwiGWUV/exuNmhUgfYW6TiTpiSArXwnAgSIbaoGe537iEvYzA7A==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@nx/nx-linux-arm64-gnu@20.0.8': - resolution: {integrity: sha512-3VpvhjmNR78HVxGzpWiwqZsG5sNvLUv2Qfohtxyc3561o8VU41R9Onf/LJmbbZvmdDaPvvXQp3rs0OXT4i7T1g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@nx/nx-linux-arm64-musl@20.0.8': - resolution: {integrity: sha512-3Z7fTJGG8h4VCHhD8Ix0zr6eFMfa1y3YDlzm8Clxu4Enzz0pEsUrT+ph6qrsArnIyUgiCowSi8+xgHFg7V/F1Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@nx/nx-linux-x64-gnu@20.0.8': - resolution: {integrity: sha512-Uttl1RHzWpjZgdzowCUNjC6/b3YhZR31wyXWgVF4PDWpDVgy4EigGc19tdrvv8pUVKQFuj0uaSTPUklguN7c3A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@nx/nx-linux-x64-musl@20.0.8': - resolution: {integrity: sha512-llc6ywSPaOWQzEzD73USyAXd/y3Slu+GHS02IsQqZeA23EIOEzhvEeeeKgs4F8LKuFW/TpV6T5IhvSHw9/mvBg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@nx/nx-win32-arm64-msvc@20.0.8': - resolution: {integrity: sha512-GhPVVNrL0QcQ3B6r0P0Dta3TIesJz7uso7iI5rCZ/oOGa02UsT4NkQBpIhxYQZ4TnHYNy84g4rHtYHrSlpDlEw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@nx/nx-win32-x64-msvc@20.0.8': - resolution: {integrity: sha512-yLlcgM0zFdmsExdLv8O2g5FWQ6d2vyN5OynKV+F5BrWHC4LvrqyYJ99y++5bLFoEi19RYIK6sLnzGIRSF6dHGg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@octokit/auth-token@3.0.4': - resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} - engines: {node: '>= 14'} - - '@octokit/core@4.2.4': - resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} - engines: {node: '>= 14'} - - '@octokit/endpoint@7.0.6': - resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} - engines: {node: '>= 14'} - - '@octokit/graphql@5.0.6': - resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} - engines: {node: '>= 14'} - - '@octokit/openapi-types@18.0.0': - resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} - - '@octokit/plugin-enterprise-rest@6.0.1': - resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} - - '@octokit/plugin-paginate-rest@6.1.2': - resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=4' - - '@octokit/plugin-request-log@1.0.4': - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' - - '@octokit/plugin-rest-endpoint-methods@7.2.3': - resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=3' - - '@octokit/request-error@3.0.3': - resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} - engines: {node: '>= 14'} - - '@octokit/request@6.2.8': - resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} - engines: {node: '>= 14'} - - '@octokit/rest@19.0.11': - resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} - engines: {node: '>= 14'} - - '@octokit/tsconfig@1.0.2': - resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} - - '@octokit/types@10.0.0': - resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} - - '@octokit/types@9.3.2': - resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} - - '@peculiar/asn1-android@2.3.10': - resolution: {integrity: sha512-z9Rx9cFJv7UUablZISe7uksNbFJCq13hO0yEAOoIpAymALTLlvUOSLnGiQS7okPaM5dP42oTLhezH6XDXRXjGw==} - - '@peculiar/asn1-ecc@2.3.8': - resolution: {integrity: sha512-Ah/Q15y3A/CtxbPibiLM/LKcMbnLTdUdLHUgdpB5f60sSvGkXzxJCu5ezGTFHogZXWNX3KSmYqilCrfdmBc6pQ==} - - '@peculiar/asn1-rsa@2.3.8': - resolution: {integrity: sha512-ES/RVEHu8VMYXgrg3gjb1m/XG0KJWnV4qyZZ7mAg7rrF3VTmRbLxO8mk+uy0Hme7geSMebp+Wvi2U6RLLEs12Q==} - - '@peculiar/asn1-schema@2.3.8': - resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} - - '@peculiar/asn1-x509@2.3.8': - resolution: {integrity: sha512-voKxGfDU1c6r9mKiN5ZUsZWh3Dy1BABvTM3cimf0tztNwyMJPhiXY94eRTgsMQe6ViLfT6EoXxkWVzcm3mFAFw==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rollup/plugin-node-resolve@13.0.0': - resolution: {integrity: sha512-41X411HJ3oikIDivT5OKe9EZ6ud6DXudtfNrGbC4nniaxx2esiWjkLOzgnZsWq1IM8YIeL2rzRGLZLBjlhnZtQ==} - engines: {node: '>= 10.0.0'} - peerDependencies: - rollup: ^2.42.0 - - '@rollup/plugin-terser@0.4.3': - resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.x || ^3.x - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-typescript@8.2.1': - resolution: {integrity: sha512-Qd2E1pleDR4bwyFxqbjt4eJf+wB0UKVMLc7/BAFDGVdAXQMCsD4DUv5/7/ww47BZCYxWtJqe1Lo0KVNswBJlRw==} - engines: {node: '>=8.0.0'} - peerDependencies: - rollup: ^2.14.0 - tslib: '*' - typescript: '>=3.7.0' - - '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - '@sigstore/bundle@2.3.2': - resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/core@1.1.0': - resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/protobuf-specs@0.3.2': - resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/sign@2.3.2': - resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/tuf@2.3.4': - resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/verify@1.2.1': - resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@simplewebauthn/types@11.0.0': - resolution: {integrity: sha512-b2o0wC5u2rWts31dTgBkAtSNKGX0cvL6h8QedNsKmj8O4QoLFQFR3DBVBUlpyVEhYKA+mXGUaXbcOc4JdQ3HzA==} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sinonjs/commons@3.0.0': - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - - '@ts-morph/common@0.25.0': - resolution: {integrity: sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==} - - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@tufjs/canonical-json@2.0.0': - resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@tufjs/models@2.0.1': - resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - - '@types/babel__core@7.20.1': - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} - - '@types/babel__generator@7.6.4': - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - - '@types/babel__template@7.4.1': - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - - '@types/babel__traverse@7.20.1': - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} - - '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - - '@types/graceful-fs@4.1.6': - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - - '@types/istanbul-lib-coverage@2.0.4': - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - - '@types/istanbul-lib-report@3.0.0': - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - - '@types/istanbul-reports@3.0.1': - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - - '@types/jest@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} - - '@types/jsdom@20.0.1': - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - - '@types/minimatch@3.0.5': - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - - '@types/minimist@1.2.2': - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - - '@types/node@20.17.6': - resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} - - '@types/normalize-package-data@2.4.1': - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - - '@types/resolve@1.17.1': - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - - '@types/stack-utils@2.0.1': - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - - '@types/tough-cookie@4.0.2': - resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} - - '@types/yargs-parser@21.0.0': - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - - '@types/yargs@17.0.24': - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} - - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - - '@yarnpkg/parsers@3.0.0-rc.46': - resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} - engines: {node: '>=14.15.0'} - - '@zkochan/js-yaml@0.0.7': - resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} - hasBin: true - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - - acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - - acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} - engines: {node: '>=18'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - - array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - - asn1js@3.0.5: - resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} - engines: {node: '>=12.0.0'} - - async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - - bin-links@4.0.4: - resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - byte-size@8.1.1: - resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} - engines: {node: '>=12.17'} - - cacache@18.0.4: - resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} - engines: {node: ^16.14.0 || >=18.0.0} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001522: - resolution: {integrity: sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==} - - caniuse-lite@1.0.30001677: - resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.0: - resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} - engines: {node: '>=10'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - - cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - - cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - - cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} - - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - cmd-shim@6.0.3: - resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - columnify@1.6.0: - resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} - engines: {node: '>=8.0.0'} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - - compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} - - conventional-changelog-core@5.0.1: - resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} - engines: {node: '>=14'} - - conventional-changelog-preset-loader@3.0.0: - resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} - engines: {node: '>=14'} - - conventional-changelog-writer@6.0.1: - resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} - engines: {node: '>=14'} - hasBin: true - - conventional-commits-filter@3.0.0: - resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} - engines: {node: '>=14'} - - conventional-commits-parser@4.0.0: - resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} - engines: {node: '>=14'} - hasBin: true - - conventional-recommended-bump@7.0.1: - resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} - engines: {node: '>=14'} - hasBin: true - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - - dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} - - dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - - dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - - detect-indent@5.0.0: - resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} - engines: {node: '>=4'} - - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - - diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - - dotenv-expand@11.0.6: - resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} - engines: {node: '>=12'} - - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-to-chromium@1.4.496: - resolution: {integrity: sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==} - - electron-to-chromium@1.5.50: - resolution: {integrity: sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==} - - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} - engines: {node: '>=4'} - hasBin: true - - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - execa@5.0.0: - resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} - engines: {node: '>=10'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - front-matter@4.0.2: - resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} - engines: {node: '>=18'} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true - - get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - - get-stream@6.0.0: - resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} - engines: {node: '>=10'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - git-raw-commits@3.0.0: - resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} - engines: {node: '>=14'} - hasBin: true - - git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} - - git-semver-tags@5.0.1: - resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} - engines: {node: '>=14'} - hasBin: true - - git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - - git-url-parse@14.0.0: - resolution: {integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==} - - gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} - engines: {node: 20 || >=22} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} - - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - - husky@9.1.6: - resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} - engines: {node: '>=18'} - hasBin: true - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - - ignore-walk@6.0.5: - resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - ini@4.1.3: - resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - init-package-json@6.0.3: - resolution: {integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==} - engines: {node: ^16.14.0 || >=18.0.0} - - inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - - ipaddr.js@2.1.0: - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} - engines: {node: '>= 10'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - - is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} - - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} - - is-stream@2.0.0: - resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} - engines: {node: '>=8'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - - jackspeak@2.3.0: - resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} - engines: {node: '>=14'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.0.2: - resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} - engines: {node: 20 || >=22} - - jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true - - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@29.6.2: - resolution: {integrity: sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.6.2: - resolution: {integrity: sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - - jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - json-stringify-nice@1.1.4: - resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - just-diff-apply@5.5.0: - resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} - - just-diff@6.0.2: - resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - lerna@8.1.9: - resolution: {integrity: sha512-ZRFlRUBB2obm+GkbTR7EbgTMuAdni6iwtTQTMy7LIrQ4UInG44LyfRepljtgUxh4HA0ltzsvWfPkd5J1DKGCeQ==} - engines: {node: '>=18.0.0'} - hasBin: true - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - libnpmaccess@8.0.6: - resolution: {integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==} - engines: {node: ^16.14.0 || >=18.0.0} - - libnpmpublish@9.0.9: - resolution: {integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==} - engines: {node: ^16.14.0 || >=18.0.0} - - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lint-staged@15.2.10: - resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} - engines: {node: '>=18.12.0'} - hasBin: true - - listr2@8.2.5: - resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} - engines: {node: '>=18.0.0'} - - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - - load-json-file@6.2.0: - resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} - engines: {node: '>=8'} - - locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} - - lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.0.2: - resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} - engines: {node: 20 || >=22} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - make-fetch-happen@13.0.1: - resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} - engines: {node: ^16.14.0 || >=18.0.0} - - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - - meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - - minimatch@3.0.5: - resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass-collect@2.0.1: - resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass-fetch@3.0.4: - resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} - - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp@10.2.0: - resolution: {integrity: sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true - - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - - node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - - node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - - nodemon@3.1.7: - resolution: {integrity: sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==} - engines: {node: '>=10'} - hasBin: true - - nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - - nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-install-checks@6.2.0: - resolution: {integrity: sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-package-arg@11.0.2: - resolution: {integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==} - engines: {node: ^16.14.0 || >=18.0.0} - - npm-packlist@8.0.2: - resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-pick-manifest@9.1.0: - resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} - engines: {node: ^16.14.0 || >=18.0.0} - - npm-registry-fetch@17.1.0: - resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} - engines: {node: ^16.14.0 || >=18.0.0} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - - nx@20.0.8: - resolution: {integrity: sha512-cMtb+u5Eji7Xm9xMHZkRXMcO8GH6FFqS2+nMgtLUZ/+ZmquEgoV8mbsKVw1u1sJ6osOpWAu9OwXcilwtvSOoBw==} - hasBin: true - peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-map-series@2.1.0: - resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} - engines: {node: '>=8'} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - p-pipe@3.1.0: - resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} - engines: {node: '>=8'} - - p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - - p-reduce@2.1.0: - resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} - engines: {node: '>=8'} - - p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - - p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - p-waterfall@2.1.1: - resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} - engines: {node: '>=8'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - pacote@18.0.6: - resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-conflict-json@3.0.1: - resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - - parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} - - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - - pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - proc-log@4.2.0: - resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - proggy@2.0.0: - resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - promise-all-reject-late@1.0.1: - resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} - - promise-call-limit@3.0.2: - resolution: {integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==} - - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - promzard@1.0.0: - resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - - pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - - punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - - pure-rand@6.0.2: - resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} - - pvtsutils@1.3.5: - resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} - - pvutils@1.1.3: - resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} - engines: {node: '>=6.0.0'} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - - read-cmd-shim@4.0.0: - resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - - read@2.1.0: - resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - read@3.0.1: - resolution: {integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - - resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true - - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} - hasBin: true - - rollup-plugin-version-injector@1.3.3: - resolution: {integrity: sha512-+Rrf0xIFHkwFGuMfphVlAOtd9FlhHFh3vrDwamJ6+YR3IxebRHGVT879qwWzZ1CpWMCLlngb2MmHW5wC5EJqvg==} - - rollup@2.52.1: - resolution: {integrity: sha512-/SPqz8UGnp4P1hq6wc9gdTqA2bXQXGx13TtoL03GBm6qGRI6Hm3p4Io7GeiHNLl0BsQAne1JNYY+q/apcY933w==} - engines: {node: '>=10.0.0'} - hasBin: true - - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - sigstore@2.3.1: - resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} - engines: {node: ^16.14.0 || >=18.0.0} - - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - smob@1.4.0: - resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} - - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} - engines: {node: '>= 14'} - - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - sort-keys@2.0.0: - resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} - engines: {node: '>=4'} - - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - - split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - - split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - ssri@10.0.6: - resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strong-log-transformer@2.1.0: - resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} - engines: {node: '>=4'} - hasBin: true - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - temp-dir@1.0.0: - resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} - engines: {node: '>=4'} - - terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} - engines: {node: '>=10'} - hasBin: true - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} - engines: {node: '>=12.0.0'} - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - - tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - - treeverse@3.0.0: - resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - - ts-jest@29.2.5: - resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - - ts-morph@24.0.0: - resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tuf-js@2.2.1: - resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} - engines: {node: ^16.14.0 || >=18.0.0} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@0.4.1: - resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} - engines: {node: '>=6'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true - - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - universal-user-agent@6.0.0: - resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - - upath@2.0.1: - resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} - engines: {node: '>=4'} - - update-browserslist-db@1.0.11: - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} - - walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} - - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - write-json-file@3.2.0: - resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} - engines: {node: '>=6'} - - write-pkg@4.0.0: - resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} - engines: {node: '>=8'} - - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@2.5.1: - resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} - engines: {node: '>= 14'} - hasBin: true - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@ampproject/remapping@2.2.1': - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.22.10': - dependencies: - '@babel/highlight': 7.22.10 - chalk: 2.4.2 - - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.0.0 - - '@babel/compat-data@7.22.9': {} - - '@babel/compat-data@7.26.2': {} - - '@babel/core@7.22.10': - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) - '@babel/helpers': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 - convert-source-map: 1.9.0 - debug: 4.3.7(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.26.0': - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.22.10': - dependencies: - '@babel/types': 7.22.10 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/generator@7.26.2': - dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 - - '@babel/helper-compilation-targets@7.22.10': - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-compilation-targets@7.25.9': - dependencies: - '@babel/compat-data': 7.26.2 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-environment-visitor@7.22.5': {} - - '@babel/helper-function-name@7.22.5': - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.10 - - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.22.10 - - '@babel/helper-module-imports@7.22.5': - dependencies: - '@babel/types': 7.22.10 - - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.22.5': {} - - '@babel/helper-simple-access@7.22.5': - dependencies: - '@babel/types': 7.22.10 - - '@babel/helper-split-export-declaration@7.22.6': - dependencies: - '@babel/types': 7.22.10 - - '@babel/helper-string-parser@7.22.5': {} - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.22.5': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-option@7.22.5': {} - - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helpers@7.22.10': - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.26.0': - dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 - - '@babel/highlight@7.22.10': - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - - '@babel/parser@7.22.10': - dependencies: - '@babel/types': 7.22.10 - - '@babel/parser@7.26.2': - dependencies: - '@babel/types': 7.26.0 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.10)': - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/template@7.22.5': - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 - - '@babel/template@7.25.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 - - '@babel/traverse@7.22.10': - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 - debug: 4.3.7(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.25.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 - debug: 4.3.7(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.22.10': - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - - '@babel/types@7.26.0': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@bcoe/v8-coverage@0.2.3': {} - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@deno/shim-deno-test@0.5.0': {} - - '@emnapi/core@1.3.1': - dependencies: - '@emnapi/wasi-threads': 1.0.1 - tslib: 2.6.2 - - '@emnapi/runtime@1.3.1': - dependencies: - tslib: 2.6.2 - - '@emnapi/wasi-threads@1.0.1': - dependencies: - tslib: 2.6.2 - - '@hexagon/base64@1.1.27': {} - - '@hutson/parse-repository-url@3.0.2': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@isaacs/string-locale-compare@1.1.0': {} - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.17.6 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 20.17.6 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@29.6.0': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.22.10 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@29.6.1': - dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.17.6 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.17.6 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - - '@jridgewell/gen-mapping@0.3.3': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.1': {} - - '@jridgewell/set-array@1.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.19': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@lerna/create@8.1.9(encoding@0.1.13)(typescript@5.6.3)': - dependencies: - '@npmcli/arborist': 7.5.4 - '@npmcli/package-json': 5.2.0 - '@npmcli/run-script': 8.1.0 - '@nx/devkit': 20.0.8(nx@20.0.8) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11(encoding@0.1.13) - aproba: 2.0.0 - byte-size: 8.1.1 - chalk: 4.1.0 - clone-deep: 4.0.1 - cmd-shim: 6.0.3 - color-support: 1.1.3 - columnify: 1.6.0 - console-control-strings: 1.1.0 - conventional-changelog-core: 5.0.1 - conventional-recommended-bump: 7.0.1 - cosmiconfig: 9.0.0(typescript@5.6.3) - dedent: 1.5.3 - execa: 5.0.0 - fs-extra: 11.2.0 - get-stream: 6.0.0 - git-url-parse: 14.0.0 - glob-parent: 6.0.2 - globby: 11.1.0 - graceful-fs: 4.2.11 - has-unicode: 2.0.1 - ini: 1.3.8 - init-package-json: 6.0.3 - inquirer: 8.2.6 - is-ci: 3.0.1 - is-stream: 2.0.0 - js-yaml: 4.1.0 - libnpmpublish: 9.0.9 - load-json-file: 6.2.0 - lodash: 4.17.21 - make-dir: 4.0.0 - minimatch: 3.0.5 - multimatch: 5.0.0 - node-fetch: 2.6.7(encoding@0.1.13) - npm-package-arg: 11.0.2 - npm-packlist: 8.0.2 - npm-registry-fetch: 17.1.0 - nx: 20.0.8 - p-map: 4.0.0 - p-map-series: 2.1.0 - p-queue: 6.6.2 - p-reduce: 2.1.0 - pacote: 18.0.6 - pify: 5.0.0 - read-cmd-shim: 4.0.0 - resolve-from: 5.0.0 - rimraf: 4.4.1 - semver: 7.6.3 - set-blocking: 2.0.0 - signal-exit: 3.0.7 - slash: 3.0.0 - ssri: 10.0.6 - string-width: 4.2.3 - strip-ansi: 6.0.1 - strong-log-transformer: 2.1.0 - tar: 6.2.1 - temp-dir: 1.0.0 - upath: 2.0.1 - uuid: 10.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.1 - wide-align: 1.1.5 - write-file-atomic: 5.0.1 - write-pkg: 4.0.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - babel-plugin-macros - - bluebird - - debug - - encoding - - supports-color - - typescript - - '@levischuck/tiny-cbor@0.2.2': {} - - '@napi-rs/wasm-runtime@0.2.4': - dependencies: - '@emnapi/core': 1.3.1 - '@emnapi/runtime': 1.3.1 - '@tybys/wasm-util': 0.9.0 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - '@npmcli/agent@2.2.2': - dependencies: - agent-base: 7.1.1 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - lru-cache: 10.0.1 - socks-proxy-agent: 8.0.4 - transitivePeerDependencies: - - supports-color - - '@npmcli/arborist@7.5.4': - dependencies: - '@isaacs/string-locale-compare': 1.1.0 - '@npmcli/fs': 3.1.1 - '@npmcli/installed-package-contents': 2.1.0 - '@npmcli/map-workspaces': 3.0.6 - '@npmcli/metavuln-calculator': 7.1.1 - '@npmcli/name-from-folder': 2.0.0 - '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.0 - '@npmcli/query': 3.1.0 - '@npmcli/redact': 2.0.1 - '@npmcli/run-script': 8.1.0 - bin-links: 4.0.4 - cacache: 18.0.4 - common-ancestor-path: 1.0.1 - hosted-git-info: 7.0.2 - json-parse-even-better-errors: 3.0.2 - json-stringify-nice: 1.1.4 - lru-cache: 10.4.3 - minimatch: 9.0.5 - nopt: 7.2.1 - npm-install-checks: 6.2.0 - npm-package-arg: 11.0.2 - npm-pick-manifest: 9.1.0 - npm-registry-fetch: 17.1.0 - pacote: 18.0.6 - parse-conflict-json: 3.0.1 - proc-log: 4.2.0 - proggy: 2.0.0 - promise-all-reject-late: 1.0.1 - promise-call-limit: 3.0.2 - read-package-json-fast: 3.0.2 - semver: 7.6.3 - ssri: 10.0.6 - treeverse: 3.0.0 - walk-up-path: 3.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - - '@npmcli/fs@3.1.0': - dependencies: - semver: 7.6.3 - - '@npmcli/fs@3.1.1': - dependencies: - semver: 7.6.3 - - '@npmcli/git@5.0.8': - dependencies: - '@npmcli/promise-spawn': 7.0.2 - ini: 4.1.3 - lru-cache: 10.0.1 - npm-pick-manifest: 9.1.0 - proc-log: 4.2.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.6.3 - which: 4.0.0 - transitivePeerDependencies: - - bluebird - - '@npmcli/installed-package-contents@2.0.2': - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - - '@npmcli/installed-package-contents@2.1.0': - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - - '@npmcli/map-workspaces@3.0.6': - dependencies: - '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.3 - minimatch: 9.0.5 - read-package-json-fast: 3.0.2 - - '@npmcli/metavuln-calculator@7.1.1': - dependencies: - cacache: 18.0.4 - json-parse-even-better-errors: 3.0.2 - pacote: 18.0.6 - proc-log: 4.2.0 - semver: 7.6.3 - transitivePeerDependencies: - - bluebird - - supports-color - - '@npmcli/name-from-folder@2.0.0': {} - - '@npmcli/node-gyp@3.0.0': {} - - '@npmcli/package-json@5.2.0': - dependencies: - '@npmcli/git': 5.0.8 - glob: 10.3.3 - hosted-git-info: 7.0.2 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 6.0.2 - proc-log: 4.2.0 - semver: 7.6.3 - transitivePeerDependencies: - - bluebird - - '@npmcli/promise-spawn@7.0.2': - dependencies: - which: 4.0.0 - - '@npmcli/query@3.1.0': - dependencies: - postcss-selector-parser: 6.1.2 - - '@npmcli/redact@2.0.1': {} - - '@npmcli/run-script@8.1.0': - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.0 - '@npmcli/promise-spawn': 7.0.2 - node-gyp: 10.2.0 - proc-log: 4.2.0 - which: 4.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - - '@nx/devkit@20.0.8(nx@20.0.8)': - dependencies: - ejs: 3.1.10 - enquirer: 2.3.6 - ignore: 5.2.4 - minimatch: 9.0.3 - nx: 20.0.8 - semver: 7.6.3 - tmp: 0.2.1 - tslib: 2.6.2 - yargs-parser: 21.1.1 - - '@nx/nx-darwin-arm64@20.0.8': - optional: true - - '@nx/nx-darwin-x64@20.0.8': - optional: true - - '@nx/nx-freebsd-x64@20.0.8': - optional: true - - '@nx/nx-linux-arm-gnueabihf@20.0.8': - optional: true - - '@nx/nx-linux-arm64-gnu@20.0.8': - optional: true - - '@nx/nx-linux-arm64-musl@20.0.8': - optional: true - - '@nx/nx-linux-x64-gnu@20.0.8': - optional: true - - '@nx/nx-linux-x64-musl@20.0.8': - optional: true - - '@nx/nx-win32-arm64-msvc@20.0.8': - optional: true - - '@nx/nx-win32-x64-msvc@20.0.8': - optional: true - - '@octokit/auth-token@3.0.4': {} - - '@octokit/core@4.2.4(encoding@0.1.13)': - dependencies: - '@octokit/auth-token': 3.0.4 - '@octokit/graphql': 5.0.6(encoding@0.1.13) - '@octokit/request': 6.2.8(encoding@0.1.13) - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - - '@octokit/endpoint@7.0.6': - dependencies: - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - - '@octokit/graphql@5.0.6(encoding@0.1.13)': - dependencies: - '@octokit/request': 6.2.8(encoding@0.1.13) - '@octokit/types': 9.3.2 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - - '@octokit/openapi-types@18.0.0': {} - - '@octokit/plugin-enterprise-rest@6.0.1': {} - - '@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4(encoding@0.1.13))': - dependencies: - '@octokit/core': 4.2.4(encoding@0.1.13) - '@octokit/tsconfig': 1.0.2 - '@octokit/types': 9.3.2 - - '@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4(encoding@0.1.13))': - dependencies: - '@octokit/core': 4.2.4(encoding@0.1.13) - - '@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4(encoding@0.1.13))': - dependencies: - '@octokit/core': 4.2.4(encoding@0.1.13) - '@octokit/types': 10.0.0 - - '@octokit/request-error@3.0.3': - dependencies: - '@octokit/types': 9.3.2 - deprecation: 2.3.1 - once: 1.4.0 - - '@octokit/request@6.2.8(encoding@0.1.13)': - dependencies: - '@octokit/endpoint': 7.0.6 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - node-fetch: 2.7.0(encoding@0.1.13) - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - - '@octokit/rest@19.0.11(encoding@0.1.13)': - dependencies: - '@octokit/core': 4.2.4(encoding@0.1.13) - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4(encoding@0.1.13)) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4(encoding@0.1.13)) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4(encoding@0.1.13)) - transitivePeerDependencies: - - encoding - - '@octokit/tsconfig@1.0.2': {} - - '@octokit/types@10.0.0': - dependencies: - '@octokit/openapi-types': 18.0.0 - - '@octokit/types@9.3.2': - dependencies: - '@octokit/openapi-types': 18.0.0 - - '@peculiar/asn1-android@2.3.10': - dependencies: - '@peculiar/asn1-schema': 2.3.8 - asn1js: 3.0.5 - tslib: 2.6.2 - - '@peculiar/asn1-ecc@2.3.8': - dependencies: - '@peculiar/asn1-schema': 2.3.8 - '@peculiar/asn1-x509': 2.3.8 - asn1js: 3.0.5 - tslib: 2.6.2 - - '@peculiar/asn1-rsa@2.3.8': - dependencies: - '@peculiar/asn1-schema': 2.3.8 - '@peculiar/asn1-x509': 2.3.8 - asn1js: 3.0.5 - tslib: 2.6.2 - - '@peculiar/asn1-schema@2.3.8': - dependencies: - asn1js: 3.0.5 - pvtsutils: 1.3.5 - tslib: 2.6.2 - - '@peculiar/asn1-x509@2.3.8': - dependencies: - '@peculiar/asn1-schema': 2.3.8 - asn1js: 3.0.5 - ipaddr.js: 2.1.0 - pvtsutils: 1.3.5 - tslib: 2.6.2 - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@rollup/plugin-node-resolve@13.0.0(rollup@2.52.1)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.52.1) - '@types/resolve': 1.17.1 - builtin-modules: 3.3.0 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.4 - rollup: 2.52.1 - - '@rollup/plugin-terser@0.4.3(rollup@2.52.1)': - dependencies: - serialize-javascript: 6.0.1 - smob: 1.4.0 - terser: 5.19.2 - optionalDependencies: - rollup: 2.52.1 - - '@rollup/plugin-typescript@8.2.1(rollup@2.52.1)(tslib@2.6.2)(typescript@5.6.3)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.52.1) - resolve: 1.22.4 - rollup: 2.52.1 - tslib: 2.6.2 - typescript: 5.6.3 - - '@rollup/pluginutils@3.1.0(rollup@2.52.1)': - dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.52.1 - - '@sigstore/bundle@2.3.2': - dependencies: - '@sigstore/protobuf-specs': 0.3.2 - - '@sigstore/core@1.1.0': {} - - '@sigstore/protobuf-specs@0.3.2': {} - - '@sigstore/sign@2.3.2': - dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 - make-fetch-happen: 13.0.1 - proc-log: 4.2.0 - promise-retry: 2.0.1 - transitivePeerDependencies: - - supports-color - - '@sigstore/tuf@2.3.4': - dependencies: - '@sigstore/protobuf-specs': 0.3.2 - tuf-js: 2.2.1 - transitivePeerDependencies: - - supports-color - - '@sigstore/verify@1.2.1': - dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 - - '@simplewebauthn/types@11.0.0': {} - - '@sinclair/typebox@0.27.8': {} - - '@sinonjs/commons@3.0.0': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.0 - - '@tootallnate/once@2.0.0': {} - - '@ts-morph/common@0.25.0': - dependencies: - minimatch: 9.0.5 - path-browserify: 1.0.1 - tinyglobby: 0.2.10 - - '@tsconfig/node10@1.0.9': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - - '@tufjs/canonical-json@2.0.0': {} - - '@tufjs/models@2.0.1': - dependencies: - '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.5 - - '@tybys/wasm-util@0.9.0': - dependencies: - tslib: 2.6.2 - - '@types/babel__core@7.20.1': - dependencies: - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 - - '@types/babel__generator@7.6.4': - dependencies: - '@babel/types': 7.22.10 - - '@types/babel__template@7.4.1': - dependencies: - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 - - '@types/babel__traverse@7.20.1': - dependencies: - '@babel/types': 7.22.10 - - '@types/estree@0.0.39': {} - - '@types/graceful-fs@4.1.6': - dependencies: - '@types/node': 20.17.6 - - '@types/istanbul-lib-coverage@2.0.4': {} - - '@types/istanbul-lib-report@3.0.0': - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - - '@types/istanbul-reports@3.0.1': - dependencies: - '@types/istanbul-lib-report': 3.0.0 - - '@types/jest@29.5.14': - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - - '@types/jsdom@20.0.1': - dependencies: - '@types/node': 20.17.6 - '@types/tough-cookie': 4.0.2 - parse5: 7.1.2 - - '@types/minimatch@3.0.5': {} - - '@types/minimist@1.2.2': {} - - '@types/node@20.17.6': - dependencies: - undici-types: 6.19.8 - - '@types/normalize-package-data@2.4.1': {} - - '@types/resolve@1.17.1': - dependencies: - '@types/node': 20.17.6 - - '@types/stack-utils@2.0.1': {} - - '@types/tough-cookie@4.0.2': {} - - '@types/yargs-parser@21.0.0': {} - - '@types/yargs@17.0.24': - dependencies: - '@types/yargs-parser': 21.0.0 - - '@yarnpkg/lockfile@1.1.0': {} - - '@yarnpkg/parsers@3.0.0-rc.46': - dependencies: - js-yaml: 3.14.1 - tslib: 2.6.2 - - '@zkochan/js-yaml@0.0.7': - dependencies: - argparse: 2.0.1 - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - abab@2.0.6: {} - - abbrev@1.1.1: {} - - abbrev@2.0.0: {} - - acorn-globals@7.0.1: - dependencies: - acorn: 8.10.0 - acorn-walk: 8.2.0 - - acorn-walk@8.2.0: {} - - acorn@8.10.0: {} - - add-stream@1.0.0: {} - - agent-base@6.0.2: - dependencies: - debug: 4.3.7(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - agent-base@7.1.1: - dependencies: - debug: 4.3.7(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ansi-colors@4.1.3: {} - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-escapes@7.0.0: - dependencies: - environment: 1.1.0 - - ansi-regex@5.0.1: {} - - ansi-regex@6.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - aproba@2.0.0: {} - - arg@4.1.3: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-differ@3.0.0: {} - - array-ify@1.0.0: {} - - array-union@2.1.0: {} - - arrify@1.0.1: {} - - arrify@2.0.1: {} - - asn1js@3.0.5: - dependencies: - pvtsutils: 1.3.5 - pvutils: 1.1.3 - tslib: 2.6.2 - - async@3.2.4: {} - - asynckit@0.4.0: {} - - axios@1.7.7: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - babel-jest@29.7.0(@babel/core@7.22.10): - dependencies: - '@babel/core': 7.22.10 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.22.10) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@29.6.3: - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.10 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 - - babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.10): - dependencies: - '@babel/core': 7.22.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) - - babel-preset-jest@29.6.3(@babel/core@7.22.10): - dependencies: - '@babel/core': 7.22.10 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) - - balanced-match@1.0.2: {} - - base64-js@1.5.1: {} - - before-after-hook@2.2.3: {} - - bin-links@4.0.4: - dependencies: - cmd-shim: 6.0.3 - npm-normalize-package-bin: 3.0.1 - read-cmd-shim: 4.0.0 - write-file-atomic: 5.0.1 - - binary-extensions@2.2.0: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.21.10: - dependencies: - caniuse-lite: 1.0.30001522 - electron-to-chromium: 1.4.496 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) - - browserslist@4.24.2: - dependencies: - caniuse-lite: 1.0.30001677 - electron-to-chromium: 1.5.50 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) - - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - - buffer-from@1.1.2: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - builtin-modules@3.3.0: {} - - byte-size@8.1.1: {} - - cacache@18.0.4: - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.3 - glob: 10.3.3 - lru-cache: 10.0.1 - minipass: 7.1.2 - minipass-collect: 2.0.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.6 - tar: 6.2.1 - unique-filename: 3.0.0 - - callsites@3.1.0: {} - - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001522: {} - - caniuse-lite@1.0.30001677: {} - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - char-regex@1.0.2: {} - - chardet@0.7.0: {} - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chownr@2.0.0: {} - - ci-info@3.8.0: {} - - ci-info@4.0.0: {} - - cjs-module-lexer@1.2.3: {} - - clean-stack@2.2.0: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-spinners@2.6.1: {} - - cli-spinners@2.9.0: {} - - cli-truncate@4.0.0: - dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 - - cli-width@3.0.0: {} - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - clone@1.0.4: {} - - cmd-shim@6.0.3: {} - - co@4.6.0: {} - - code-block-writer@13.0.3: {} - - collect-v8-coverage@1.0.2: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - color-support@1.1.3: {} - - colorette@2.0.20: {} - - columnify@1.6.0: - dependencies: - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@12.1.0: {} - - commander@2.20.3: {} - - common-ancestor-path@1.0.1: {} - - compare-func@2.0.0: - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - - concat-map@0.0.1: {} - - concat-stream@2.0.0: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - - console-control-strings@1.1.0: {} - - conventional-changelog-angular@7.0.0: - dependencies: - compare-func: 2.0.0 - - conventional-changelog-core@5.0.1: - dependencies: - add-stream: 1.0.0 - conventional-changelog-writer: 6.0.1 - conventional-commits-parser: 4.0.0 - dateformat: 3.0.3 - get-pkg-repo: 4.2.1 - git-raw-commits: 3.0.0 - git-remote-origin-url: 2.0.0 - git-semver-tags: 5.0.1 - normalize-package-data: 3.0.3 - read-pkg: 3.0.0 - read-pkg-up: 3.0.0 - - conventional-changelog-preset-loader@3.0.0: {} - - conventional-changelog-writer@6.0.1: - dependencies: - conventional-commits-filter: 3.0.0 - dateformat: 3.0.3 - handlebars: 4.7.8 - json-stringify-safe: 5.0.1 - meow: 8.1.2 - semver: 7.6.3 - split: 1.0.1 - - conventional-commits-filter@3.0.0: - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 - - conventional-commits-parser@4.0.0: - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - meow: 8.1.2 - split2: 3.2.2 - - conventional-recommended-bump@7.0.1: - dependencies: - concat-stream: 2.0.0 - conventional-changelog-preset-loader: 3.0.0 - conventional-commits-filter: 3.0.0 - conventional-commits-parser: 4.0.0 - git-raw-commits: 3.0.0 - git-semver-tags: 5.0.1 - meow: 8.1.2 - - convert-source-map@1.9.0: {} - - convert-source-map@2.0.0: {} - - core-util-is@1.0.3: {} - - cosmiconfig@9.0.0(typescript@5.6.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.6.3 - - create-jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - create-require@1.1.1: {} - - cross-fetch@4.0.0(encoding@0.1.13): - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - cssesc@3.0.0: {} - - cssom@0.3.8: {} - - cssom@0.5.0: {} - - cssstyle@2.3.0: - dependencies: - cssom: 0.3.8 - - dargs@7.0.0: {} - - data-urls@3.0.2: - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - - dateformat@3.0.3: {} - - dateformat@4.6.3: {} - - debug@4.3.7(supports-color@5.5.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 - - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - - decimal.js@10.4.3: {} - - dedent@1.5.3: {} - - deepmerge@4.3.1: {} - - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - define-lazy-prop@2.0.0: {} - - delayed-stream@1.0.0: {} - - deprecation@2.3.1: {} - - detect-indent@5.0.0: {} - - detect-newline@3.1.0: {} - - diff-sequences@29.4.3: {} - - diff-sequences@29.6.3: {} - - diff@4.0.2: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - domexception@4.0.0: - dependencies: - webidl-conversions: 7.0.0 - - dot-prop@5.3.0: - dependencies: - is-obj: 2.0.0 - - dotenv-expand@11.0.6: - dependencies: - dotenv: 16.4.5 - - dotenv@16.4.5: {} - - duplexer@0.1.2: {} - - eastasianwidth@0.2.0: {} - - ejs@3.1.10: - dependencies: - jake: 10.8.7 - - electron-to-chromium@1.4.496: {} - - electron-to-chromium@1.5.50: {} - - emittery@0.13.1: {} - - emoji-regex@10.4.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - enquirer@2.3.6: - dependencies: - ansi-colors: 4.1.3 - - entities@4.5.0: {} - - env-paths@2.2.1: {} - - envinfo@7.13.0: {} - - environment@1.1.0: {} - - err-code@2.0.3: {} - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - escalade@3.1.1: {} - - escalade@3.2.0: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@2.0.0: {} - - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - esprima@4.0.1: {} - - estraverse@5.3.0: {} - - estree-walker@1.0.1: {} - - esutils@2.0.3: {} - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.1: {} - - execa@5.0.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@8.0.1: - 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 - - exit@0.1.2: {} - - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - - exponential-backoff@3.1.1: {} - - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - fast-json-stable-stringify@2.1.0: {} - - fastq@1.15.0: - dependencies: - reusify: 1.0.4 - - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - - fdir@6.4.2(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@2.1.0: - dependencies: - locate-path: 2.0.0 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - follow-redirects@1.15.9: {} - - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - front-matter@4.0.2: - dependencies: - js-yaml: 3.14.1 - - fs-constants@1.0.0: {} - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs-minipass@3.0.3: - dependencies: - minipass: 7.1.2 - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.1: {} - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-east-asian-width@1.3.0: {} - - get-package-type@0.1.0: {} - - get-pkg-repo@4.2.1: - dependencies: - '@hutson/parse-repository-url': 3.0.2 - hosted-git-info: 4.1.0 - through2: 2.0.5 - yargs: 16.2.0 - - get-port@5.1.1: {} - - get-stream@6.0.0: {} - - get-stream@6.0.1: {} - - get-stream@8.0.1: {} - - git-raw-commits@3.0.0: - dependencies: - dargs: 7.0.0 - meow: 8.1.2 - split2: 3.2.2 - - git-remote-origin-url@2.0.0: - dependencies: - gitconfiglocal: 1.0.0 - pify: 2.3.0 - - git-semver-tags@5.0.1: - dependencies: - meow: 8.1.2 - semver: 7.6.3 - - git-up@7.0.0: - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 - - git-url-parse@14.0.0: - dependencies: - git-up: 7.0.0 - - gitconfiglocal@1.0.0: - dependencies: - ini: 1.3.8 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.3.3: - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.0 - minimatch: 9.0.5 - minipass: 7.1.2 - path-scurry: 1.10.1 - - glob@10.4.5: - dependencies: - foreground-child: 3.1.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@11.0.0: - dependencies: - foreground-child: 3.1.1 - jackspeak: 4.0.2 - minimatch: 10.0.1 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@9.3.5: - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.10.1 - - globals@11.12.0: {} - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - graceful-fs@4.2.11: {} - - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - - hard-rejection@2.1.0: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-unicode@2.0.1: {} - - has@1.0.3: - dependencies: - function-bind: 1.1.1 - - hosted-git-info@2.8.9: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - - hosted-git-info@7.0.2: - dependencies: - lru-cache: 10.0.1 - - html-encoding-sniffer@3.0.0: - dependencies: - whatwg-encoding: 2.0.0 - - html-escaper@2.0.2: {} - - http-cache-semantics@4.1.1: {} - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.5: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - human-signals@5.0.0: {} - - husky@9.1.6: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - ieee754@1.2.1: {} - - ignore-by-default@1.0.1: {} - - ignore-walk@6.0.5: - dependencies: - minimatch: 9.0.5 - - ignore@5.2.4: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-local@3.1.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ini@1.3.8: {} - - ini@4.1.3: {} - - init-package-json@6.0.3: - dependencies: - '@npmcli/package-json': 5.2.0 - npm-package-arg: 11.0.2 - promzard: 1.0.0 - read: 3.0.1 - semver: 7.6.3 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.1 - transitivePeerDependencies: - - bluebird - - inquirer@8.2.6: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 - - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - - ipaddr.js@2.1.0: {} - - is-arrayish@0.2.1: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 - - is-ci@3.0.1: - dependencies: - ci-info: 3.8.0 - - is-core-module@2.13.0: - dependencies: - has: 1.0.3 - - is-docker@2.2.1: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-fullwidth-code-point@4.0.0: {} - - is-fullwidth-code-point@5.0.0: - dependencies: - get-east-asian-width: 1.3.0 - - is-generator-fn@2.1.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-interactive@1.0.0: {} - - is-lambda@1.0.1: {} - - is-module@1.0.0: {} - - is-number@7.0.0: {} - - is-obj@2.0.0: {} - - is-plain-obj@1.1.0: {} - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - - is-plain-object@5.0.0: {} - - is-potential-custom-element-name@1.0.1: {} - - is-ssh@1.4.0: - dependencies: - protocols: 2.0.1 - - is-stream@2.0.0: {} - - is-stream@2.0.1: {} - - is-stream@3.0.0: {} - - is-text-path@1.0.1: - dependencies: - text-extensions: 1.9.0 - - is-unicode-supported@0.1.0: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - isarray@1.0.0: {} - - isexe@2.0.0: {} - - isexe@3.1.1: {} - - isobject@3.0.1: {} - - istanbul-lib-coverage@3.2.0: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.22.10 - '@babel/parser': 7.22.10 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.2 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.3.7(supports-color@5.5.0) - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.6: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jackspeak@2.3.0: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.0.2: - dependencies: - '@isaacs/cliui': 8.0.2 - - jake@10.8.7: - dependencies: - async: 3.2.4 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - jest-changed-files@29.7.0: - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - - jest-circus@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.3 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)): - dependencies: - '@babel/core': 7.22.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.22.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.17.6 - ts-node: 10.9.2(@types/node@20.17.6)(typescript@5.6.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-diff@29.6.2: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.2 - - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-docblock@29.7.0: - dependencies: - detect-newline: 3.1.0 - - jest-each@29.7.0: - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - - jest-environment-jsdom@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/jsdom': 20.0.1 - '@types/node': 20.17.6 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jsdom: 20.0.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jest-environment-node@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - jest-get-type@29.4.3: {} - - jest-get-type@29.6.3: {} - - jest-haste-map@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.17.6 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-leak-detector@29.7.0: - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-matcher-utils@29.7.0: - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.22.10 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - jest-util: 29.7.0 - - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: - jest-resolve: 29.7.0 - - jest-regex-util@29.6.3: {} - - jest-resolve-dependencies@29.7.0: - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - jest-resolve@29.7.0: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.4 - resolve.exports: 2.0.2 - slash: 3.0.0 - - jest-runner@29.7.0: - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - - jest-runtime@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) - '@babel/types': 7.22.10 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - jest-util@29.6.2: - dependencies: - '@jest/types': 29.6.1 - '@types/node': 20.17.6 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-validate@29.7.0: - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - - jest-watcher@29.7.0: - dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.6 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - - jest-worker@29.7.0: - dependencies: - '@types/node': 20.17.6 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsbn@1.1.0: {} - - jsdom@20.0.3: - dependencies: - abab: 2.0.6 - acorn: 8.10.0 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.4.3 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.13.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jsesc@2.5.2: {} - - jsesc@3.0.2: {} - - json-parse-better-errors@1.0.2: {} - - json-parse-even-better-errors@2.3.1: {} - - json-parse-even-better-errors@3.0.0: {} - - json-parse-even-better-errors@3.0.2: {} - - json-stringify-nice@1.1.4: {} - - json-stringify-safe@5.0.1: {} - - json5@2.2.3: {} - - jsonc-parser@3.2.0: {} - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonparse@1.3.1: {} - - just-diff-apply@5.5.0: {} - - just-diff@6.0.2: {} - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - lerna@8.1.9(encoding@0.1.13): - dependencies: - '@lerna/create': 8.1.9(encoding@0.1.13)(typescript@5.6.3) - '@npmcli/arborist': 7.5.4 - '@npmcli/package-json': 5.2.0 - '@npmcli/run-script': 8.1.0 - '@nx/devkit': 20.0.8(nx@20.0.8) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11(encoding@0.1.13) - aproba: 2.0.0 - byte-size: 8.1.1 - chalk: 4.1.0 - clone-deep: 4.0.1 - cmd-shim: 6.0.3 - color-support: 1.1.3 - columnify: 1.6.0 - console-control-strings: 1.1.0 - conventional-changelog-angular: 7.0.0 - conventional-changelog-core: 5.0.1 - conventional-recommended-bump: 7.0.1 - cosmiconfig: 9.0.0(typescript@5.6.3) - dedent: 1.5.3 - envinfo: 7.13.0 - execa: 5.0.0 - fs-extra: 11.2.0 - get-port: 5.1.1 - get-stream: 6.0.0 - git-url-parse: 14.0.0 - glob-parent: 6.0.2 - globby: 11.1.0 - graceful-fs: 4.2.11 - has-unicode: 2.0.1 - import-local: 3.1.0 - ini: 1.3.8 - init-package-json: 6.0.3 - inquirer: 8.2.6 - is-ci: 3.0.1 - is-stream: 2.0.0 - jest-diff: 29.6.2 - js-yaml: 4.1.0 - libnpmaccess: 8.0.6 - libnpmpublish: 9.0.9 - load-json-file: 6.2.0 - lodash: 4.17.21 - make-dir: 4.0.0 - minimatch: 3.0.5 - multimatch: 5.0.0 - node-fetch: 2.6.7(encoding@0.1.13) - npm-package-arg: 11.0.2 - npm-packlist: 8.0.2 - npm-registry-fetch: 17.1.0 - nx: 20.0.8 - p-map: 4.0.0 - p-map-series: 2.1.0 - p-pipe: 3.1.0 - p-queue: 6.6.2 - p-reduce: 2.1.0 - p-waterfall: 2.1.1 - pacote: 18.0.6 - pify: 5.0.0 - read-cmd-shim: 4.0.0 - resolve-from: 5.0.0 - rimraf: 4.4.1 - semver: 7.6.3 - set-blocking: 2.0.0 - signal-exit: 3.0.7 - slash: 3.0.0 - ssri: 10.0.6 - string-width: 4.2.3 - strip-ansi: 6.0.1 - strong-log-transformer: 2.1.0 - tar: 6.2.1 - temp-dir: 1.0.0 - typescript: 5.6.3 - upath: 2.0.1 - uuid: 10.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.1 - wide-align: 1.1.5 - write-file-atomic: 5.0.1 - write-pkg: 4.0.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - babel-plugin-macros - - bluebird - - debug - - encoding - - supports-color - - leven@3.1.0: {} - - libnpmaccess@8.0.6: - dependencies: - npm-package-arg: 11.0.2 - npm-registry-fetch: 17.1.0 - transitivePeerDependencies: - - supports-color - - libnpmpublish@9.0.9: - dependencies: - ci-info: 4.0.0 - normalize-package-data: 6.0.2 - npm-package-arg: 11.0.2 - npm-registry-fetch: 17.1.0 - proc-log: 4.2.0 - semver: 7.6.3 - sigstore: 2.3.1 - ssri: 10.0.6 - transitivePeerDependencies: - - supports-color - - lilconfig@3.1.2: {} - - lines-and-columns@1.2.4: {} - - lines-and-columns@2.0.3: {} - - lint-staged@15.2.10: - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - debug: 4.3.7(supports-color@5.5.0) - execa: 8.0.1 - lilconfig: 3.1.2 - listr2: 8.2.5 - micromatch: 4.0.8 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.5.1 - transitivePeerDependencies: - - supports-color - - listr2@8.2.5: - dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.0 - - load-json-file@4.0.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - - load-json-file@6.2.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 5.2.0 - strip-bom: 4.0.0 - type-fest: 0.6.0 - - locate-path@2.0.0: - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - lodash.ismatch@4.4.0: {} - - lodash.memoize@4.1.2: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - log-update@6.1.0: - dependencies: - ansi-escapes: 7.0.0 - cli-cursor: 5.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 - - lru-cache@10.0.1: {} - - lru-cache@10.4.3: {} - - lru-cache@11.0.2: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - make-dir@2.1.0: - dependencies: - pify: 4.0.1 - semver: 5.7.2 - - make-dir@4.0.0: - dependencies: - semver: 7.6.3 - - make-error@1.3.6: {} - - make-fetch-happen@13.0.1: - dependencies: - '@npmcli/agent': 2.2.2 - cacache: 18.0.4 - http-cache-semantics: 4.1.1 - is-lambda: 1.0.1 - minipass: 7.1.2 - minipass-fetch: 3.0.4 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - proc-log: 4.2.0 - promise-retry: 2.0.1 - ssri: 10.0.6 - transitivePeerDependencies: - - supports-color - - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - meow@8.1.2: - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.4 - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mimic-fn@2.1.0: {} - - mimic-fn@4.0.0: {} - - mimic-function@5.0.1: {} - - min-indent@1.0.1: {} - - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - - minimatch@3.0.5: - dependencies: - brace-expansion: 1.1.11 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - minimatch@8.0.4: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - - minimist@1.2.8: {} - - minipass-collect@2.0.1: - dependencies: - minipass: 7.1.2 - - minipass-fetch@3.0.4: - dependencies: - minipass: 7.1.2 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@4.2.8: {} - - minipass@5.0.0: {} - - minipass@7.1.2: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp@1.0.4: {} - - modify-values@1.0.1: {} - - ms@2.1.3: {} - - multimatch@5.0.0: - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - - mute-stream@0.0.8: {} - - mute-stream@1.0.0: {} - - natural-compare@1.4.0: {} - - negotiator@0.6.3: {} - - neo-async@2.6.2: {} - - node-fetch@2.6.7(encoding@0.1.13): - dependencies: - whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - - node-fetch@2.7.0(encoding@0.1.13): - dependencies: - whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - - node-gyp@10.2.0: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 10.4.5 - graceful-fs: 4.2.11 - make-fetch-happen: 13.0.1 - nopt: 7.2.1 - proc-log: 4.2.0 - semver: 7.6.3 - tar: 6.2.1 - which: 4.0.0 - transitivePeerDependencies: - - supports-color - - node-int64@0.4.0: {} - - node-machine-id@1.1.12: {} - - node-releases@2.0.13: {} - - node-releases@2.0.18: {} - - nodemon@3.1.7: - dependencies: - chokidar: 3.5.3 - debug: 4.3.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 7.6.3 - simple-update-notifier: 2.0.0 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - - nopt@1.0.10: - dependencies: - abbrev: 1.1.1 - - nopt@7.2.1: - dependencies: - abbrev: 2.0.0 - - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.4 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.13.0 - semver: 7.6.3 - validate-npm-package-license: 3.0.4 - - normalize-package-data@6.0.2: - dependencies: - hosted-git-info: 7.0.2 - semver: 7.6.3 - validate-npm-package-license: 3.0.4 - - normalize-path@3.0.0: {} - - npm-bundled@3.0.0: - dependencies: - npm-normalize-package-bin: 3.0.1 - - npm-install-checks@6.2.0: - dependencies: - semver: 7.6.3 - - npm-normalize-package-bin@3.0.1: {} - - npm-package-arg@11.0.2: - dependencies: - hosted-git-info: 7.0.2 - proc-log: 4.2.0 - semver: 7.6.3 - validate-npm-package-name: 5.0.1 - - npm-packlist@8.0.2: - dependencies: - ignore-walk: 6.0.5 - - npm-pick-manifest@9.1.0: - dependencies: - npm-install-checks: 6.2.0 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 11.0.2 - semver: 7.6.3 - - npm-registry-fetch@17.1.0: - dependencies: - '@npmcli/redact': 2.0.1 - jsonparse: 1.3.1 - make-fetch-happen: 13.0.1 - minipass: 7.1.2 - minipass-fetch: 3.0.4 - minizlib: 2.1.2 - npm-package-arg: 11.0.2 - proc-log: 4.2.0 - transitivePeerDependencies: - - supports-color - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@5.1.0: - dependencies: - path-key: 4.0.0 - - nwsapi@2.2.7: {} - - nx@20.0.8: - dependencies: - '@napi-rs/wasm-runtime': 0.2.4 - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.7 - axios: 1.7.7 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 8.0.1 - dotenv: 16.4.5 - dotenv-expand: 11.0.6 - enquirer: 2.3.6 - figures: 3.2.0 - flat: 5.0.2 - front-matter: 4.0.2 - ignore: 5.2.4 - jest-diff: 29.6.2 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 9.0.3 - node-machine-id: 1.1.12 - npm-run-path: 4.0.1 - open: 8.4.2 - ora: 5.3.0 - semver: 7.6.3 - string-width: 4.2.3 - tar-stream: 2.2.0 - tmp: 0.2.1 - tsconfig-paths: 4.2.0 - tslib: 2.6.2 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@nx/nx-darwin-arm64': 20.0.8 - '@nx/nx-darwin-x64': 20.0.8 - '@nx/nx-freebsd-x64': 20.0.8 - '@nx/nx-linux-arm-gnueabihf': 20.0.8 - '@nx/nx-linux-arm64-gnu': 20.0.8 - '@nx/nx-linux-arm64-musl': 20.0.8 - '@nx/nx-linux-x64-gnu': 20.0.8 - '@nx/nx-linux-x64-musl': 20.0.8 - '@nx/nx-win32-arm64-msvc': 20.0.8 - '@nx/nx-win32-x64-msvc': 20.0.8 - transitivePeerDependencies: - - debug - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - ora@5.3.0: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - os-tmpdir@1.0.2: {} - - p-finally@1.0.0: {} - - p-limit@1.3.0: - dependencies: - p-try: 1.0.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@2.0.0: - dependencies: - p-limit: 1.3.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-map-series@2.1.0: {} - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-pipe@3.1.0: {} - - p-queue@6.6.2: - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - - p-reduce@2.1.0: {} - - p-timeout@3.2.0: - dependencies: - p-finally: 1.0.0 - - p-try@1.0.0: {} - - p-try@2.2.0: {} - - p-waterfall@2.1.1: - dependencies: - p-reduce: 2.1.0 - - package-json-from-dist@1.0.1: {} - - pacote@18.0.6: - dependencies: - '@npmcli/git': 5.0.8 - '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/package-json': 5.2.0 - '@npmcli/promise-spawn': 7.0.2 - '@npmcli/run-script': 8.1.0 - cacache: 18.0.4 - fs-minipass: 3.0.3 - minipass: 7.1.2 - npm-package-arg: 11.0.2 - npm-packlist: 8.0.2 - npm-pick-manifest: 9.1.0 - npm-registry-fetch: 17.1.0 - proc-log: 4.2.0 - promise-retry: 2.0.1 - sigstore: 2.3.1 - ssri: 10.0.6 - tar: 6.2.1 - transitivePeerDependencies: - - bluebird - - supports-color - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-conflict-json@3.0.1: - dependencies: - json-parse-even-better-errors: 3.0.2 - just-diff: 6.0.2 - just-diff-apply: 5.5.0 - - parse-json@4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.22.10 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-path@7.0.0: - dependencies: - protocols: 2.0.1 - - parse-url@8.1.0: - dependencies: - parse-path: 7.0.0 - - parse5@7.1.2: - dependencies: - entities: 4.5.0 - - path-browserify@1.0.1: {} - - path-exists@3.0.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-scurry@1.10.1: - dependencies: - lru-cache: 10.0.1 - minipass: 7.1.2 - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-scurry@2.0.0: - dependencies: - lru-cache: 11.0.2 - minipass: 7.1.2 - - path-type@3.0.0: - dependencies: - pify: 3.0.0 - - path-type@4.0.0: {} - - picocolors@1.0.0: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - pidtree@0.6.0: {} - - pify@2.3.0: {} - - pify@3.0.0: {} - - pify@4.0.1: {} - - pify@5.0.0: {} - - pirates@4.0.6: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - pretty-format@29.6.2: - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - - proc-log@4.2.0: {} - - process-nextick-args@2.0.1: {} - - proggy@2.0.0: {} - - promise-all-reject-late@1.0.1: {} - - promise-call-limit@3.0.2: {} - - promise-inflight@1.0.1: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - promzard@1.0.0: - dependencies: - read: 2.1.0 - - protocols@2.0.1: {} - - proxy-from-env@1.1.0: {} - - psl@1.9.0: {} - - pstree.remy@1.1.8: {} - - punycode@2.3.0: {} - - pure-rand@6.0.2: {} - - pvtsutils@1.3.5: - dependencies: - tslib: 2.6.2 - - pvutils@1.1.3: {} - - querystringify@2.2.0: {} - - queue-microtask@1.2.3: {} - - quick-lru@4.0.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - react-is@18.2.0: {} - - read-cmd-shim@4.0.0: {} - - read-package-json-fast@3.0.2: - dependencies: - json-parse-even-better-errors: 3.0.2 - npm-normalize-package-bin: 3.0.1 - - read-pkg-up@3.0.0: - dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 - - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@3.0.0: - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - - read@2.1.0: - dependencies: - mute-stream: 1.0.0 - - read@3.0.1: - dependencies: - mute-stream: 1.0.0 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - - require-directory@2.1.1: {} - - requires-port@1.0.0: {} - - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve.exports@2.0.2: {} - - resolve@1.22.4: - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - - retry@0.12.0: {} - - reusify@1.0.4: {} - - rfdc@1.4.1: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rimraf@4.4.1: - dependencies: - glob: 9.3.5 - - rimraf@6.0.1: - dependencies: - glob: 11.0.0 - package-json-from-dist: 1.0.1 - - rollup-plugin-version-injector@1.3.3: - dependencies: - chalk: 4.1.2 - dateformat: 4.6.3 - lodash: 4.17.21 - - rollup@2.52.1: - optionalDependencies: - fsevents: 2.3.3 - - run-async@2.4.1: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rxjs@7.8.1: - dependencies: - tslib: 2.6.2 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - - semver@5.7.2: {} - - semver@6.3.1: {} - - semver@7.6.3: {} - - serialize-javascript@6.0.1: - dependencies: - randombytes: 2.1.0 - - set-blocking@2.0.0: {} - - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - sigstore@2.3.1: - dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 - '@sigstore/sign': 2.3.2 - '@sigstore/tuf': 2.3.4 - '@sigstore/verify': 1.2.1 - transitivePeerDependencies: - - supports-color - - simple-update-notifier@2.0.0: - dependencies: - semver: 7.6.3 - - sisteransi@1.0.5: {} - - slash@3.0.0: {} - - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - - slice-ansi@7.1.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 - - smart-buffer@4.2.0: {} - - smob@1.4.0: {} - - socks-proxy-agent@8.0.4: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - - socks@2.8.3: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - - sort-keys@2.0.0: - dependencies: - is-plain-obj: 1.1.0 - - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - - spdx-exceptions@2.3.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - - spdx-license-ids@3.0.13: {} - - split2@3.2.2: - dependencies: - readable-stream: 3.6.2 - - split@1.0.1: - dependencies: - through: 2.3.8 - - sprintf-js@1.0.3: {} - - sprintf-js@1.1.3: {} - - ssri@10.0.6: - dependencies: - minipass: 7.1.2 - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - - string-argv@0.3.2: {} - - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string-width@7.2.0: - dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - - strip-bom@3.0.0: {} - - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-final-newline@3.0.0: {} - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - - strip-json-comments@3.1.1: {} - - strong-log-transformer@2.1.0: - dependencies: - duplexer: 0.1.2 - minimist: 1.2.8 - through: 2.3.8 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - symbol-tree@3.2.4: {} - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - temp-dir@1.0.0: {} - - terser@5.19.2: - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - - text-extensions@1.9.0: {} - - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - - through@2.3.8: {} - - tinyglobby@0.2.10: - dependencies: - fdir: 6.4.2(picomatch@4.0.2) - picomatch: 4.0.2 - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - - tmp@0.2.1: - dependencies: - rimraf: 3.0.2 - - tmpl@1.0.5: {} - - to-fast-properties@2.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - touch@3.1.0: - dependencies: - nopt: 1.0.10 - - tough-cookie@4.1.3: - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@0.0.3: {} - - tr46@3.0.0: - dependencies: - punycode: 2.3.0 - - treeverse@3.0.0: {} - - trim-newlines@3.0.1: {} - - ts-jest@29.2.5(@babel/core@7.22.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.22.10))(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3)) - jest-util: 29.6.2 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.6.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.22.10 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.22.10) - - ts-morph@24.0.0: - dependencies: - '@ts-morph/common': 0.25.0 - code-block-writer: 13.0.3 - - ts-node@10.9.2(@types/node@20.17.6)(typescript@5.6.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.17.6 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@2.6.2: {} - - tuf-js@2.2.1: - dependencies: - '@tufjs/models': 2.0.1 - debug: 4.3.7(supports-color@5.5.0) - make-fetch-happen: 13.0.1 - transitivePeerDependencies: - - supports-color - - type-detect@4.0.8: {} - - type-fest@0.18.1: {} - - type-fest@0.21.3: {} - - type-fest@0.4.1: {} - - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - - typedarray@0.0.6: {} - - typescript@5.6.3: {} - - uglify-js@3.19.3: - optional: true - - undefsafe@2.0.5: {} - - undici-types@6.19.8: {} - - unique-filename@3.0.0: - dependencies: - unique-slug: 4.0.0 - - unique-slug@4.0.0: - dependencies: - imurmurhash: 0.1.4 - - universal-user-agent@6.0.0: {} - - universalify@0.2.0: {} - - universalify@2.0.0: {} - - upath@2.0.1: {} - - update-browserslist-db@1.0.11(browserslist@4.21.10): - dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 - - update-browserslist-db@1.1.1(browserslist@4.24.2): - dependencies: - browserslist: 4.24.2 - escalade: 3.2.0 - picocolors: 1.1.1 - - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - util-deprecate@1.0.2: {} - - uuid@10.0.0: {} - - v8-compile-cache-lib@3.0.1: {} - - v8-to-istanbul@9.1.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - validate-npm-package-name@5.0.1: {} - - w3c-xmlserializer@4.0.0: - dependencies: - xml-name-validator: 4.0.0 - - walk-up-path@3.0.1: {} - - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - - webidl-conversions@3.0.1: {} - - webidl-conversions@7.0.0: {} - - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@3.0.0: {} - - whatwg-url@11.0.0: - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - which@4.0.0: - dependencies: - isexe: 3.1.1 - - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - - wordwrap@1.0.0: {} - - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrap-ansi@9.0.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 7.2.0 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - write-file-atomic@2.4.3: - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - write-file-atomic@5.0.1: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.1.0 - - write-json-file@3.2.0: - dependencies: - detect-indent: 5.0.0 - graceful-fs: 4.2.11 - make-dir: 2.1.0 - pify: 4.0.1 - sort-keys: 2.0.0 - write-file-atomic: 2.4.3 - - write-pkg@4.0.0: - dependencies: - sort-keys: 2.0.0 - type-fest: 0.4.1 - write-json-file: 3.2.0 - - ws@8.13.0: {} - - xml-name-validator@4.0.0: {} - - xmlchars@2.2.0: {} - - xtend@4.0.2: {} - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yaml@2.5.1: {} - - yargs-parser@20.2.4: {} - - yargs-parser@21.1.1: {} - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yn@3.1.1: {} - - yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 2f80b56ab..000000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -packages: - - "packages/browser" - - "packages/server/npm" - - "packages/types/npm" diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 1db0ac95b..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2018", - "lib": [ - "ES2018" - ], - "module": "commonjs", - "esModuleInterop": true, - "declaration": true, - "sourceMap": true, - "allowSyntheticDefaultImports": true, - "strict": true - }, - "exclude": [ - "node_modules", - "example", - "**/*.test.ts", - "**/setupTests.ts", - "**/__mocks__/*", - "**/dist/*" - ] -} From 0bd8c1432049fdeae7a84965af80bd6bf56710b0 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:14:19 -0800 Subject: [PATCH 012/115] Go back to Homebrew Deno --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index c619c7b59..aa6d1ce87 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "typescript.tsdk": "node_modules/typescript/lib", "editor.formatOnSave": true, - "deno.path": "${userHome}/.deno/bin/deno", + "deno.path": "/opt/homebrew/bin/deno", "deno.enablePaths": [ "./packages/server", "./packages/types" From a53432fc45ce57383f39e477777e16890afa320e Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:14:51 -0800 Subject: [PATCH 013/115] Set up Deno workspace --- deno.jsonc | 12 ++- deno.lock | 244 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 deno.lock diff --git a/deno.jsonc b/deno.jsonc index 79f5f7bc0..52dfb90e1 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -2,5 +2,15 @@ "fmt": { "singleQuote": true, "lineWidth": 100 - } + }, + "imports": { + "@deno/cache-dir": "jsr:@deno/cache-dir@^0.13.2", + "@std/path": "jsr:@std/path@^1.0.8", + "ts-morph": "npm:ts-morph@^24.0.0", + "typescript": "npm:typescript@^5.6.3" + }, + "workspace": [ + "./packages/server", + "./packages/types" + ] } diff --git a/deno.lock b/deno.lock new file mode 100644 index 000000000..2500527e6 --- /dev/null +++ b/deno.lock @@ -0,0 +1,244 @@ +{ + "version": "4", + "specifiers": { + "jsr:@deno/cache-dir@~0.13.2": "0.13.2", + "jsr:@deno/graph@~0.73.1": "0.73.1", + "jsr:@std/assert@0.223": "0.223.0", + "jsr:@std/bytes@0.223": "0.223.0", + "jsr:@std/fmt@0.223": "0.223.0", + "jsr:@std/fs@0.223": "0.223.0", + "jsr:@std/io@0.223": "0.223.0", + "jsr:@std/path@0.223": "0.223.0", + "jsr:@std/path@^1.0.8": "1.0.8", + "npm:@hexagon/base64@^1.1.27": "1.1.28", + "npm:@levischuck/tiny-cbor@~0.2.2": "0.2.2", + "npm:@peculiar/asn1-android@^2.3.10": "2.3.13", + "npm:@peculiar/asn1-ecc@^2.3.8": "2.3.14", + "npm:@peculiar/asn1-rsa@^2.3.8": "2.3.13", + "npm:@peculiar/asn1-schema@^2.3.8": "2.3.13", + "npm:@peculiar/asn1-x509@^2.3.8": "2.3.13", + "npm:cross-fetch@4": "4.0.0", + "npm:ts-morph@24": "24.0.0", + "npm:typescript@^5.6.3": "5.6.3" + }, + "jsr": { + "@deno/cache-dir@0.13.2": { + "integrity": "c22419dfe27ab85f345bee487aaaadba498b005cce3644e9d2528db035c5454d", + "dependencies": [ + "jsr:@deno/graph", + "jsr:@std/fmt", + "jsr:@std/fs", + "jsr:@std/io", + "jsr:@std/path@0.223" + ] + }, + "@deno/graph@0.73.1": { + "integrity": "cd69639d2709d479037d5ce191a422eabe8d71bb68b0098344f6b07411c84d41" + }, + "@std/assert@0.223.0": { + "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" + }, + "@std/bytes@0.223.0": { + "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" + }, + "@std/fmt@0.223.0": { + "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" + }, + "@std/fs@0.223.0": { + "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c" + }, + "@std/io@0.223.0": { + "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", + "dependencies": [ + "jsr:@std/assert", + "jsr:@std/bytes" + ] + }, + "@std/path@0.223.0": { + "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", + "dependencies": [ + "jsr:@std/assert" + ] + }, + "@std/path@1.0.8": { + "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" + } + }, + "npm": { + "@hexagon/base64@1.1.28": { + "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==" + }, + "@levischuck/tiny-cbor@0.2.2": { + "integrity": "sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw==" + }, + "@peculiar/asn1-android@2.3.13": { + "integrity": "sha512-0VTNazDGKrLS6a3BwTDZanqq6DR/I3SbvmDMuS8Be+OYpvM6x1SRDh9AGDsHVnaCOIztOspCPc6N1m+iUv1Xxw==", + "dependencies": [ + "@peculiar/asn1-schema", + "asn1js", + "tslib" + ] + }, + "@peculiar/asn1-ecc@2.3.14": { + "integrity": "sha512-zWPyI7QZto6rnLv6zPniTqbGaLh6zBpJyI46r1yS/bVHJXT2amdMHCRRnbV5yst2H8+ppXG6uXu/M6lKakiQ8w==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib" + ] + }, + "@peculiar/asn1-rsa@2.3.13": { + "integrity": "sha512-wBNQqCyRtmqvXkGkL4DR3WxZhHy8fDiYtOjTeCd7SFE5F6GBeafw3EJ94PX/V0OJJrjQ40SkRY2IZu3ZSyBqcg==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib" + ] + }, + "@peculiar/asn1-schema@2.3.13": { + "integrity": "sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==", + "dependencies": [ + "asn1js", + "pvtsutils", + "tslib" + ] + }, + "@peculiar/asn1-x509@2.3.13": { + "integrity": "sha512-PfeLQl2skXmxX2/AFFCVaWU8U6FKW1Db43mgBhShCOFS1bVxqtvusq1hVjfuEcuSQGedrLdCSvTgabluwN/M9A==", + "dependencies": [ + "@peculiar/asn1-schema", + "asn1js", + "ipaddr.js", + "pvtsutils", + "tslib" + ] + }, + "@ts-morph/common@0.25.0": { + "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", + "dependencies": [ + "minimatch", + "path-browserify", + "tinyglobby" + ] + }, + "asn1js@3.0.5": { + "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "dependencies": [ + "pvtsutils", + "pvutils", + "tslib" + ] + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion@2.0.1": { + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": [ + "balanced-match" + ] + }, + "code-block-writer@13.0.3": { + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==" + }, + "cross-fetch@4.0.0": { + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": [ + "node-fetch" + ] + }, + "fdir@6.4.2_picomatch@4.0.2": { + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dependencies": [ + "picomatch" + ] + }, + "ipaddr.js@2.2.0": { + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==" + }, + "minimatch@9.0.5": { + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": [ + "brace-expansion" + ] + }, + "node-fetch@2.7.0": { + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": [ + "whatwg-url" + ] + }, + "path-browserify@1.0.1": { + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "picomatch@4.0.2": { + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + }, + "pvtsutils@1.3.5": { + "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", + "dependencies": [ + "tslib" + ] + }, + "pvutils@1.1.3": { + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==" + }, + "tinyglobby@0.2.10_picomatch@4.0.2": { + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dependencies": [ + "fdir", + "picomatch" + ] + }, + "tr46@0.0.3": { + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "ts-morph@24.0.0": { + "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", + "dependencies": [ + "@ts-morph/common", + "code-block-writer" + ] + }, + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "typescript@5.6.3": { + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==" + }, + "webidl-conversions@3.0.1": { + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url@5.0.0": { + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": [ + "tr46", + "webidl-conversions" + ] + } + }, + "workspace": { + "dependencies": [ + "jsr:@deno/cache-dir@~0.13.2", + "jsr:@std/path@^1.0.8", + "npm:ts-morph@24", + "npm:typescript@^5.6.3" + ], + "members": { + "packages/server": { + "dependencies": [ + "npm:@hexagon/base64@^1.1.27", + "npm:@levischuck/tiny-cbor@~0.2.2", + "npm:@peculiar/asn1-android@^2.3.10", + "npm:@peculiar/asn1-ecc@^2.3.8", + "npm:@peculiar/asn1-rsa@^2.3.8", + "npm:@peculiar/asn1-schema@^2.3.8", + "npm:@peculiar/asn1-x509@^2.3.8", + "npm:cross-fetch@4" + ] + } + } + } +} From 55e1747b842be67b8eeec645899f731d781be859 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:15:26 -0800 Subject: [PATCH 014/115] Get extract-dom-types working with Deno --- packages/types/deno.jsonc | 3 ++- packages/types/extract-dom-types.ts | 24 +++++++++++++++++------- packages/types/src/dom.ts | 23 +++++++++++++++-------- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index e17644ede..c6e9f1c0c 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -1,6 +1,7 @@ { "tasks": { - "build": "deno run -A build_npm.ts" + "build": "deno run -A build_npm.ts", + "extract-dom-types": "deno run -A extract-dom-types.ts" }, "fmt": { "singleQuote": true, diff --git a/packages/types/extract-dom-types.ts b/packages/types/extract-dom-types.ts index d6ec8e0c8..286506e97 100644 --- a/packages/types/extract-dom-types.ts +++ b/packages/types/extract-dom-types.ts @@ -4,6 +4,8 @@ * package.json in the root of the monorepo. This is why `npm run build` here will run this file * before finally building the package using dnt. */ +import { DenoDir } from '@deno/cache-dir'; +import { join } from '@std/path'; // n.b. ts-morph is a sibling devDependency of typescript, so that the module // loader will resolve our project's typescript package, not the transient // dependency of ts-morph. We only want to reference our typescript dependency @@ -41,11 +43,19 @@ const types = [ 'UserVerificationRequirement', ]; -const project = new Project({ skipAddingFilesFromTsConfig: true }); -const domSourcePath = 'typescript/lib/lib.dom.d.ts'; -const domSourceFile = project.addSourceFileAtPath( - require.resolve(domSourcePath), +// Construct the path to TypeScript in Deno's cache +const denoDir = new DenoDir(); +const domSourcePath = join( + denoDir.root, + `npm/registry.npmjs.org/typescript/${version}/lib/lib.dom.d.ts`, ); + +// Check that the file exists +Deno.statSync(domSourcePath); + +// Begin extracting types +const project = new Project({ skipAddingFilesFromTsConfig: true }); +const domSourceFile = project.addSourceFileAtPath(domSourcePath); const resolvedNodes = new Set(); const unresolvedNodes = new Set( types.map((type) => { @@ -88,9 +98,9 @@ const outputSourceFile = project.createSourceFile(`src/dom.ts`, undefined, { }); outputSourceFile.addStatements([ `/**`, - ` * Generated from typescript@${version} ${domSourcePath}`, - ` * To regenerate, run the following command from the project root:`, - ` * npx lerna --scope=@simplewebauthn/types exec -- npm run extract-dom-types`, + ` * Generated from typescript@${version}`, + ` * To regenerate, run the following command from the package root:`, + ` * deno task extract-dom-types`, ` */`, `// BEGIN CODEGEN`, ]); diff --git a/packages/types/src/dom.ts b/packages/types/src/dom.ts index 1aa76ec4b..2ac97aae6 100644 --- a/packages/types/src/dom.ts +++ b/packages/types/src/dom.ts @@ -1,7 +1,7 @@ /** - * Generated from typescript@5.1.6 typescript/lib/lib.dom.d.ts - * To regenerate, run the following command from the project root: - * npx lerna --scope=@simplewebauthn/types exec -- npm run extract-dom-types + * Generated from typescript@5.6.3 + * To regenerate, run the following command from the package root: + * deno task extract-dom-types */ // BEGIN CODEGEN /** @@ -26,8 +26,11 @@ export interface AuthenticatorAssertionResponse extends AuthenticatorResponse { export interface AuthenticatorAttestationResponse extends AuthenticatorResponse { /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/attestationObject) */ readonly attestationObject: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getAuthenticatorData) */ getAuthenticatorData(): ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKey) */ getPublicKey(): ArrayBuffer | null; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKeyAlgorithm) */ getPublicKeyAlgorithm(): COSEAlgorithmIdentifier; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getTransports) */ getTransports(): string[]; @@ -37,6 +40,7 @@ export interface AuthenticationExtensionsClientInputs { appid?: string; credProps?: boolean; hmacCreateSecret?: boolean; + minPinLength?: boolean; } export interface AuthenticationExtensionsClientOutputs { @@ -80,6 +84,7 @@ export interface Crypto { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential) */ export interface PublicKeyCredential extends Credential { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/authenticatorAttachment) */ readonly authenticatorAttachment: string | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/rawId) */ readonly rawId: ArrayBuffer; @@ -160,7 +165,9 @@ export interface SubtleCrypto { /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */ exportKey(format: "jwk", key: CryptoKey): Promise; exportKey(format: Exclude, key: CryptoKey): Promise; + exportKey(format: KeyFormat, key: CryptoKey): Promise; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */ + generateKey(algorithm: "Ed25519", extractable: boolean, keyUsages: ReadonlyArray<"sign" | "verify">): Promise; generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray): Promise; generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: ReadonlyArray): Promise; generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: KeyUsage[]): Promise; @@ -279,6 +286,11 @@ export interface JsonWebKey { y?: string; } +export interface CryptoKeyPair { + privateKey: CryptoKey; + publicKey: CryptoKey; +} + export interface RsaHashedKeyGenParams extends RsaKeyGenParams { hash: HashAlgorithmIdentifier; } @@ -287,11 +299,6 @@ export interface EcKeyGenParams extends Algorithm { namedCurve: NamedCurve; } -export interface CryptoKeyPair { - privateKey: CryptoKey; - publicKey: CryptoKey; -} - export interface AesKeyGenParams extends Algorithm { length: number; } From 0523a6744b1f39dece5a821f6ba88a29e1cf3870 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:15:43 -0800 Subject: [PATCH 015/115] Add JSR meta to types --- packages/types/deno.jsonc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index c6e9f1c0c..f1dd7ce36 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -1,4 +1,7 @@ { + "name": "@simplewebauthn/types", + "version": "11.0.0", + "exports": "./src/index.ts", "tasks": { "build": "deno run -A build_npm.ts", "extract-dom-types": "deno run -A extract-dom-types.ts" From 29d24532f19eef944732eb51e525dfbf5732a29a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:16:00 -0800 Subject: [PATCH 016/115] Migrate some root devDeps to browser package.json --- packages/browser/package.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/browser/package.json b/packages/browser/package.json index 745513f44..dab7887ef 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -37,8 +37,14 @@ "@rollup/plugin-node-resolve": "^13.0.0", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^8.2.1", + "@types/jest": "^29.5.14", + "@types/node": "^20.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "rimraf": "^6.0.1", "rollup": "^2.52.1", "rollup-plugin-version-injector": "^1.3.3", + "ts-jest": "^29.2.5", "tslib": "^2.6.2" }, "type": "module", From 761fa8dafaba30faa54e20cbee83a821990fc918 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:21:30 -0800 Subject: [PATCH 017/115] Specify files to include --- packages/types/.npmignore | 7 ------- packages/types/deno.jsonc | 7 +++++++ 2 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 packages/types/.npmignore diff --git a/packages/types/.npmignore b/packages/types/.npmignore deleted file mode 100644 index d2360e98b..000000000 --- a/packages/types/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -src -node_modules -coverage -.gitignore -tsconfig.json -*.config.js -__mocks__ diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index f1dd7ce36..2392ebac7 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -9,5 +9,12 @@ "fmt": { "singleQuote": true, "lineWidth": 100 + }, + "publish": { + "include": [ + "README.md", + "LICENSE.md", + "src/**/*.ts" + ] } } From 35aedd96dc94eddf11e853890c0e236fa9d60e95 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:22:11 -0800 Subject: [PATCH 018/115] Mark this an alpha release --- packages/types/deno.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index 2392ebac7..a032021fa 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -1,6 +1,6 @@ { "name": "@simplewebauthn/types", - "version": "11.0.0", + "version": "11.0.0-alpha1", "exports": "./src/index.ts", "tasks": { "build": "deno run -A build_npm.ts", From bfb115cdc9480655210dde176effea03935cfadf Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:46:22 -0800 Subject: [PATCH 019/115] Clean up types package --- packages/types/README.md | 18 ++++++++++---- packages/types/build_npm.ts | 49 ------------------------------------- 2 files changed, 13 insertions(+), 54 deletions(-) delete mode 100644 packages/types/build_npm.ts diff --git a/packages/types/README.md b/packages/types/README.md index ea728c4d9..ff5c7f22f 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -7,22 +7,30 @@ TypeScript typings for **@simplewebauthn/server** and **@simplewebauthn/browser* - [Installation](#installation) - [Node LTS 20.x or higher](#node-lts-20x-or-higher) - - [Deno v1.33.x or higher](#deno-v133x-or-higher) + - [Deno v1.43.x or higher](#deno-v143x-or-higher) ## Installation ### Node LTS 20.x or higher -This package is available on **npm**: +This package can be installed from **npm** or **jsr**: ```sh -npm install @simplewebauthn/types +$ npm install @simplewebauthn/types ``` -### Deno v1.33.x or higher +```sh +$ npx jsr add @simplewebauthn/types +``` + +### Deno v1.43.x or higher -It is also available for import into Deno projects from **deno.land/x**: +It is available for import into Deno projects from **deno.land/x** or **jsr**: ```ts import {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; ``` + +```sh +$ deno add jsr:@simplewebauthn/types +``` diff --git a/packages/types/build_npm.ts b/packages/types/build_npm.ts deleted file mode 100644 index 2f8309ab7..000000000 --- a/packages/types/build_npm.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { build, emptyDir } from 'https://deno.land/x/dnt@0.40.0/mod.ts'; - -const outDir = './npm'; -const lernaPackageJSON: { version: string } = JSON.parse( - await Deno.readTextFile('./package.json'), -); - -await emptyDir(outDir); - -await build({ - entryPoints: [ - { name: '.', path: './src/index.ts' }, - ], - outDir, - shims: {}, - // Keeping declarations in a single types/ directory to mimic the original file structure - declaration: 'separate', - test: false, - // package.json values - package: { - name: '@simplewebauthn/types', - version: lernaPackageJSON.version, - description: 'TypeScript types used by the @simplewebauthn series of libraries', - license: 'MIT', - author: 'Matthew Miller ', - repository: { - type: 'git', - url: 'git+https://github.com/MasterKale/SimpleWebAuthn.git', - directory: 'packages/types', - }, - homepage: 'https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/types#readme', - publishConfig: { - access: 'public', - }, - bugs: { - url: 'https://github.com/MasterKale/SimpleWebAuthn/issues', - }, - keywords: [ - 'typescript', - 'webauthn', - 'passkeys', - 'fido', - 'types', - ], - }, -}); - -Deno.copyFileSync('LICENSE.md', `${outDir}/LICENSE.md`); -Deno.copyFileSync('README.md', `${outDir}/README.md`); From 0222187d7e0b88dbfa9e9490b02f89330a17924a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:53:51 -0800 Subject: [PATCH 020/115] Remove unnecessary deno.lock --- packages/types/deno.lock | 129 --------------------------------------- 1 file changed, 129 deletions(-) delete mode 100644 packages/types/deno.lock diff --git a/packages/types/deno.lock b/packages/types/deno.lock deleted file mode 100644 index 4b2d9c486..000000000 --- a/packages/types/deno.lock +++ /dev/null @@ -1,129 +0,0 @@ -{ - "version": "4", - "remote": { - "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", - "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", - "https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", - "https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", - "https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", - "https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", - "https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", - "https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", - "https://deno.land/std@0.140.0/hash/sha256.ts": "803846c7a5a8a5a97f31defeb37d72f519086c880837129934f5d6f72102a8e8", - "https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", - "https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", - "https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", - "https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", - "https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", - "https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", - "https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d", - "https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44", - "https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", - "https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757", - "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", - "https://deno.land/std@0.181.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.181.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.181.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", - "https://deno.land/std@0.181.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", - "https://deno.land/std@0.181.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", - "https://deno.land/std@0.181.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", - "https://deno.land/std@0.181.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", - "https://deno.land/std@0.181.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", - "https://deno.land/std@0.181.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.181.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.181.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", - "https://deno.land/std@0.181.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.181.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.181.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", - "https://deno.land/std@0.181.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", - "https://deno.land/std@0.181.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.181.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", - "https://deno.land/std@0.182.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.182.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.182.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", - "https://deno.land/std@0.182.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", - "https://deno.land/std@0.182.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", - "https://deno.land/std@0.182.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", - "https://deno.land/std@0.182.0/fs/walk.ts": "920be35a7376db6c0b5b1caf1486fb962925e38c9825f90367f8f26b5e5d0897", - "https://deno.land/std@0.182.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.182.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.182.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", - "https://deno.land/std@0.182.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.182.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.182.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", - "https://deno.land/std@0.182.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", - "https://deno.land/std@0.182.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.182.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", - "https://deno.land/x/code_block_writer@12.0.0/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5", - "https://deno.land/x/code_block_writer@12.0.0/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff", - "https://deno.land/x/deno_cache@0.4.1/auth_tokens.ts": "5fee7e9155e78cedf3f6ff3efacffdb76ac1a76c86978658d9066d4fb0f7326e", - "https://deno.land/x/deno_cache@0.4.1/cache.ts": "51f72f4299411193d780faac8c09d4e8cbee951f541121ef75fcc0e94e64c195", - "https://deno.land/x/deno_cache@0.4.1/deno_dir.ts": "f2a9044ce8c7fe1109004cda6be96bf98b08f478ce77e7a07f866eff1bdd933f", - "https://deno.land/x/deno_cache@0.4.1/deps.ts": "8974097d6c17e65d9a82d39377ae8af7d94d74c25c0cbb5855d2920e063f2343", - "https://deno.land/x/deno_cache@0.4.1/dirs.ts": "d2fa473ef490a74f2dcb5abb4b9ab92a48d2b5b6320875df2dee64851fa64aa9", - "https://deno.land/x/deno_cache@0.4.1/disk_cache.ts": "1f3f5232cba4c56412d93bdb324c624e95d5dd179d0578d2121e3ccdf55539f9", - "https://deno.land/x/deno_cache@0.4.1/file_fetcher.ts": "07a6c5f8fd94bf50a116278cc6012b4921c70d2251d98ce1c9f3c352135c39f7", - "https://deno.land/x/deno_cache@0.4.1/http_cache.ts": "f632e0d6ec4a5d61ae3987737a72caf5fcdb93670d21032ddb78df41131360cd", - "https://deno.land/x/deno_cache@0.4.1/mod.ts": "ef1cda9235a93b89cb175fe648372fc0f785add2a43aa29126567a05e3e36195", - "https://deno.land/x/deno_cache@0.4.1/util.ts": "8cb686526f4be5205b92c819ca2ce82220aa0a8dd3613ef0913f6dc269dbbcfe", - "https://deno.land/x/deno_cache@0.6.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e", - "https://deno.land/x/deno_cache@0.6.2/cache.ts": "58b53c128b742757efcad10af9a3871f23b4e200674cb5b0ddf61164fb9b2fe7", - "https://deno.land/x/deno_cache@0.6.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0", - "https://deno.land/x/deno_cache@0.6.2/deps.ts": "12cca94516cf2d3ed42fccd4b721ecd8060679253f077d83057511045b0081aa", - "https://deno.land/x/deno_cache@0.6.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069", - "https://deno.land/x/deno_cache@0.6.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa", - "https://deno.land/x/deno_cache@0.6.2/file_fetcher.ts": "4f3e4a2c78a5ca1e4812099e5083f815a8525ab20d389b560b3517f6b1161dd6", - "https://deno.land/x/deno_cache@0.6.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd", - "https://deno.land/x/deno_cache@0.6.2/lib/deno_cache_dir.generated.js": "59f8defac32e8ebf2a30f7bc77e9d88f0e60098463fb1b75e00b9791a4bbd733", - "https://deno.land/x/deno_cache@0.6.2/lib/snippets/deno_cache_dir-a2aecaa9536c9402/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6", - "https://deno.land/x/deno_cache@0.6.2/mod.ts": "b4004287e1c6123d7f07fe9b5b3e94ce6d990c4102949a89c527c68b19627867", - "https://deno.land/x/deno_cache@0.6.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2", - "https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66", - "https://deno.land/x/dnt@0.38.0/lib/compiler.ts": "209ad2e1b294f93f87ec02ade9a0821f942d2e524104552d0aa8ff87021050a5", - "https://deno.land/x/dnt@0.38.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", - "https://deno.land/x/dnt@0.38.0/lib/mod.deps.ts": "30367fc68bcd2acf3b7020cf5cdd26f817f7ac9ac35c4bfb6c4551475f91bc3e", - "https://deno.land/x/dnt@0.38.0/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", - "https://deno.land/x/dnt@0.38.0/lib/package_json.ts": "61f35b06e374ed39ca776d29d67df4be7ee809d0bca29a8239687556c6d027c2", - "https://deno.land/x/dnt@0.38.0/lib/pkg/dnt_wasm.generated.js": "82aeecfb055af0b2700e1e9b886e4a44fe3bf9cd11a9c4195cb169f53a134b15", - "https://deno.land/x/dnt@0.38.0/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "a6b95adc943a68d513fe8ed9ec7d260ac466b7a4bced4e942f733e494bb9f1be", - "https://deno.land/x/dnt@0.38.0/lib/shims.ts": "df1bd4d9a196dca4b2d512b1564fff64ac6c945189a273d706391f87f210d7e6", - "https://deno.land/x/dnt@0.38.0/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", - "https://deno.land/x/dnt@0.38.0/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", - "https://deno.land/x/dnt@0.38.0/lib/transform.deps.ts": "e42f2bdef46d098453bdba19261a67cf90b583f5d868f7fe83113c1380d9b85c", - "https://deno.land/x/dnt@0.38.0/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", - "https://deno.land/x/dnt@0.38.0/lib/utils.ts": "878b7ac7003a10c16e6061aa49dbef9b42bd43174853ebffc9b67ea47eeb11d8", - "https://deno.land/x/dnt@0.38.0/mod.ts": "b13349fe77847cf58e26b40bcd58797a8cec5d71b31a1ca567071329c8489de1", - "https://deno.land/x/dnt@0.38.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", - "https://deno.land/x/dnt@0.40.0/lib/compiler.ts": "7f4447531581896348b8a379ab94730856b42ae50d99043f2468328360293cb1", - "https://deno.land/x/dnt@0.40.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", - "https://deno.land/x/dnt@0.40.0/lib/mod.deps.ts": "8d6123c8e1162037e58aa8126686a03d1e2cffb250a8757bf715f80242097597", - "https://deno.land/x/dnt@0.40.0/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", - "https://deno.land/x/dnt@0.40.0/lib/package_json.ts": "607b0a4f44acad071a4c8533b312a27d6671eac8e6a23625c8350ce29eadb2ba", - "https://deno.land/x/dnt@0.40.0/lib/pkg/dnt_wasm.generated.js": "2694546844a50861d6d1610859afbf5130baca4dc6cf304541b7ec2d6d998142", - "https://deno.land/x/dnt@0.40.0/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "aba69a019a6da6f084898a6c7b903b8b583bc0dbd82bfb338449cf0b5bce58fd", - "https://deno.land/x/dnt@0.40.0/lib/shims.ts": "39e5c141f0315c0faf30b479b53f92b9078d92e1fd67ee34cc60b701d8e68dab", - "https://deno.land/x/dnt@0.40.0/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", - "https://deno.land/x/dnt@0.40.0/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", - "https://deno.land/x/dnt@0.40.0/lib/transform.deps.ts": "2e159661e1c5c650de9a573babe0e319349fe493105157307ec2ad2f6a52c94e", - "https://deno.land/x/dnt@0.40.0/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", - "https://deno.land/x/dnt@0.40.0/lib/utils.ts": "224f15f33e7226a2fd991e438d0291d7ed8c7889807efa2e1ecb67d2d1db6720", - "https://deno.land/x/dnt@0.40.0/mod.ts": "ae1890fbe592e4797e7dd88c1e270f22b8334878e9bf187c4e11ae75746fe778", - "https://deno.land/x/dnt@0.40.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", - "https://deno.land/x/ts_morph@18.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", - "https://deno.land/x/ts_morph@18.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", - "https://deno.land/x/ts_morph@18.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", - "https://deno.land/x/ts_morph@18.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", - "https://deno.land/x/ts_morph@18.0.0/common/ts_morph_common.js": "845671ca951073400ce142f8acefa2d39ea9a51e29ca80928642f3f8cf2b7700", - "https://deno.land/x/ts_morph@18.0.0/common/typescript.js": "d5c598b6a2db2202d0428fca5fd79fc9a301a71880831a805d778797d2413c59", - "https://deno.land/x/ts_morph@20.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", - "https://deno.land/x/ts_morph@20.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", - "https://deno.land/x/ts_morph@20.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", - "https://deno.land/x/ts_morph@20.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", - "https://deno.land/x/ts_morph@20.0.0/common/ts_morph_common.js": "2325f94f61dc5f3f98a1dab366dc93048d11b1433d718b10cfc6ee5a1cfebe8f", - "https://deno.land/x/ts_morph@20.0.0/common/typescript.js": "b9edf0a451685d13e0467a7ed4351d112b74bd1e256b915a2b941054e31c1736", - "https://deno.land/x/wasmbuild@0.14.1/cache.ts": "89eea5f3ce6035a1164b3e655c95f21300498920575ade23161421f5b01967f4", - "https://deno.land/x/wasmbuild@0.14.1/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02", - "https://deno.land/x/wasmbuild@0.15.1/cache.ts": "9d01b5cb24e7f2a942bbd8d14b093751fa690a6cde8e21709ddc97667e6669ed", - "https://deno.land/x/wasmbuild@0.15.1/loader.ts": "8c2fc10e21678e42f84c5135d8ab6ab7dc92424c3f05d2354896a29ccfd02a63" - } -} From 91cb7ec6218171b1201dc6da4b27a36fede847f4 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 4 Nov 2024 22:54:56 -0800 Subject: [PATCH 021/115] Remove build task from types --- packages/types/deno.jsonc | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index a032021fa..6948fc24c 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -3,7 +3,6 @@ "version": "11.0.0-alpha1", "exports": "./src/index.ts", "tasks": { - "build": "deno run -A build_npm.ts", "extract-dom-types": "deno run -A extract-dom-types.ts" }, "fmt": { From 18d16447224da9fb93d5c4b1a674b2f20ee856b5 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 09:14:49 -0800 Subject: [PATCH 022/115] Skip building server with dnt for JSR --- packages/server/.npmignore | 8 ---- packages/server/build_npm.ts | 83 ------------------------------------ packages/server/deno.jsonc | 19 ++++++++- 3 files changed, 18 insertions(+), 92 deletions(-) delete mode 100644 packages/server/.npmignore delete mode 100644 packages/server/build_npm.ts diff --git a/packages/server/.npmignore b/packages/server/.npmignore deleted file mode 100644 index b41a7a772..000000000 --- a/packages/server/.npmignore +++ /dev/null @@ -1,8 +0,0 @@ -src -node_modules -coverage -.gitignore -tsconfig.json -*.config.js -__mocks__ -.env diff --git a/packages/server/build_npm.ts b/packages/server/build_npm.ts deleted file mode 100644 index 42b7cad9a..000000000 --- a/packages/server/build_npm.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { build, emptyDir } from 'https://deno.land/x/dnt@0.40.0/mod.ts'; - -const outDir = './npm'; - -const lernaPackageJSON: { version: string } = JSON.parse( - Deno.readTextFileSync('./package.json'), -); -const typesPackageJSON: { version: string } = JSON.parse( - Deno.readTextFileSync('../types/npm/package.json'), -); - -await emptyDir(outDir); - -await build({ - entryPoints: [ - { name: '.', path: './src/index.ts' }, - { name: './helpers', path: './src/helpers/index.ts' }, - ], - importMap: './deno.jsonc', - outDir, - shims: { - deno: { - test: 'dev', - }, - }, - // TODO: Re-enable if https://github.com/denoland/dnt/issues/331 can get resolved - typeCheck: false, - // package.json values - package: { - name: '@simplewebauthn/server', - version: lernaPackageJSON.version, - description: 'SimpleWebAuthn for Servers', - license: 'MIT', - author: 'Matthew Miller ', - repository: { - type: 'git', - url: 'git+https://github.com/MasterKale/SimpleWebAuthn.git', - directory: 'packages/server', - }, - homepage: 'https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/server#readme', - publishConfig: { - access: 'public', - }, - engines: { - node: '>=20.0.0', - }, - bugs: { - url: 'https://github.com/MasterKale/SimpleWebAuthn/issues', - }, - keywords: [ - 'typescript', - 'webauthn', - 'passkeys', - 'fido', - 'node', - ], - typesVersions: { - '*': { - '.': [ - 'esm/index.d.ts', - ], - 'helpers': [ - 'esm/helpers/index.d.ts', - ], - }, - }, - }, - // Map from Deno package to NPM package for Node build - mappings: { - // Mapping for '../../types/src/index.ts' in deps.ts - '../types/src/index.ts': { - name: '@simplewebauthn/types', - version: `^${typesPackageJSON.version}`, - }, - }, - // TypeScript tsconfig.json config - compilerOptions: { - lib: ['ES2021'], - }, -}); - -Deno.copyFileSync('LICENSE.md', `${outDir}/LICENSE.md`); -Deno.copyFileSync('README.md', `${outDir}/README.md`); diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index 1ea8e7d3a..9c603bda5 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -1,6 +1,13 @@ { + "name": "@simplewebauthn/server", + "version": "11.0.0-alpha1", + "exports": { + ".": "./src/index.ts", + "./helpers": "./src/helpers/index.ts" + }, "tasks": { - "build": "deno run -A build_npm.ts" + "test": "deno test -A src/", + "test:watch": "deno test -A --watch src/" }, "fmt": { "singleQuote": true, @@ -17,5 +24,15 @@ "@peculiar/asn1-x509": "npm:@peculiar/asn1-x509@^2.3.8", "@simplewebauthn/types": "../types/src/index.ts", "cross-fetch": "npm:cross-fetch@^4.0.0" + }, + "publish": { + "include": [ + "README.md", + "LICENSE.md", + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.test.ts" + ] } } From 57acee8c7d955f793aa18c4e3039c4498048154d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 09:44:49 -0800 Subject: [PATCH 023/115] Install test libraries --- deno.jsonc | 2 ++ deno.lock | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index 52dfb90e1..79ad4bf1e 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -5,7 +5,9 @@ }, "imports": { "@deno/cache-dir": "jsr:@deno/cache-dir@^0.13.2", + "@std/assert": "jsr:@std/assert@^1.0.7", "@std/path": "jsr:@std/path@^1.0.8", + "@std/testing": "jsr:@std/testing@^1.0.4", "ts-morph": "npm:ts-morph@^24.0.0", "typescript": "npm:typescript@^5.6.3" }, diff --git a/deno.lock b/deno.lock index 2500527e6..eb98fb2ef 100644 --- a/deno.lock +++ b/deno.lock @@ -4,12 +4,19 @@ "jsr:@deno/cache-dir@~0.13.2": "0.13.2", "jsr:@deno/graph@~0.73.1": "0.73.1", "jsr:@std/assert@0.223": "0.223.0", + "jsr:@std/assert@^1.0.7": "1.0.7", + "jsr:@std/async@^1.0.8": "1.0.8", "jsr:@std/bytes@0.223": "0.223.0", + "jsr:@std/data-structures@^1.0.4": "1.0.4", "jsr:@std/fmt@0.223": "0.223.0", "jsr:@std/fs@0.223": "0.223.0", + "jsr:@std/fs@^1.0.5": "1.0.5", + "jsr:@std/internal@^1.0.5": "1.0.5", "jsr:@std/io@0.223": "0.223.0", "jsr:@std/path@0.223": "0.223.0", + "jsr:@std/path@^1.0.7": "1.0.8", "jsr:@std/path@^1.0.8": "1.0.8", + "jsr:@std/testing@^1.0.4": "1.0.4", "npm:@hexagon/base64@^1.1.27": "1.1.28", "npm:@levischuck/tiny-cbor@~0.2.2": "0.2.2", "npm:@peculiar/asn1-android@^2.3.10": "2.3.13", @@ -27,7 +34,7 @@ "dependencies": [ "jsr:@deno/graph", "jsr:@std/fmt", - "jsr:@std/fs", + "jsr:@std/fs@0.223", "jsr:@std/io", "jsr:@std/path@0.223" ] @@ -38,30 +45,62 @@ "@std/assert@0.223.0": { "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" }, + "@std/assert@1.0.7": { + "integrity": "64ce9fac879e0b9f3042a89b3c3f8ccfc9c984391af19e2087513a79d73e28c3", + "dependencies": [ + "jsr:@std/internal" + ] + }, + "@std/async@1.0.8": { + "integrity": "c057c5211a0f1d12e7dcd111ab430091301b8d64b4250052a79d277383bc3ba7" + }, "@std/bytes@0.223.0": { "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" }, + "@std/data-structures@1.0.4": { + "integrity": "fa0e20c11eb9ba673417450915c750a0001405a784e2a4e0c3725031681684a0" + }, "@std/fmt@0.223.0": { "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" }, "@std/fs@0.223.0": { "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c" }, + "@std/fs@1.0.5": { + "integrity": "41806ad6823d0b5f275f9849a2640d87e4ef67c51ee1b8fb02426f55e02fd44e", + "dependencies": [ + "jsr:@std/path@^1.0.7" + ] + }, + "@std/internal@1.0.5": { + "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" + }, "@std/io@0.223.0": { "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", "dependencies": [ - "jsr:@std/assert", + "jsr:@std/assert@0.223", "jsr:@std/bytes" ] }, "@std/path@0.223.0": { "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", "dependencies": [ - "jsr:@std/assert" + "jsr:@std/assert@0.223" ] }, "@std/path@1.0.8": { "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" + }, + "@std/testing@1.0.4": { + "integrity": "ca1368d720b183f572d40c469bb9faf09643ddd77b54f8b44d36ae6b94940576", + "dependencies": [ + "jsr:@std/assert@^1.0.7", + "jsr:@std/async", + "jsr:@std/data-structures", + "jsr:@std/fs@^1.0.5", + "jsr:@std/internal", + "jsr:@std/path@^1.0.8" + ] } }, "npm": { @@ -222,7 +261,9 @@ "workspace": { "dependencies": [ "jsr:@deno/cache-dir@~0.13.2", + "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", + "jsr:@std/testing@^1.0.4", "npm:ts-morph@24", "npm:typescript@^5.6.3" ], From 8d157c279ad7f562b11c9682a590f4f192f03397 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 09:44:59 -0800 Subject: [PATCH 024/115] Remove outdated deno.lock from server --- packages/server/deno.lock | 214 -------------------------------------- 1 file changed, 214 deletions(-) delete mode 100644 packages/server/deno.lock diff --git a/packages/server/deno.lock b/packages/server/deno.lock deleted file mode 100644 index 15c8ee4d1..000000000 --- a/packages/server/deno.lock +++ /dev/null @@ -1,214 +0,0 @@ -{ - "version": "4", - "specifiers": { - "npm:@types/node@*": "18.16.19" - }, - "npm": { - "@types/node@18.16.19": { - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" - } - }, - "remote": { - "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", - "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", - "https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", - "https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", - "https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", - "https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", - "https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", - "https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", - "https://deno.land/std@0.140.0/hash/sha256.ts": "803846c7a5a8a5a97f31defeb37d72f519086c880837129934f5d6f72102a8e8", - "https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", - "https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", - "https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", - "https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", - "https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", - "https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", - "https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d", - "https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44", - "https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", - "https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757", - "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", - "https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1", - "https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118", - "https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", - "https://deno.land/std@0.181.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.181.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.181.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", - "https://deno.land/std@0.181.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", - "https://deno.land/std@0.181.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", - "https://deno.land/std@0.181.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", - "https://deno.land/std@0.181.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", - "https://deno.land/std@0.181.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", - "https://deno.land/std@0.181.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.181.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.181.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", - "https://deno.land/std@0.181.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.181.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.181.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", - "https://deno.land/std@0.181.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", - "https://deno.land/std@0.181.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.181.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", - "https://deno.land/std@0.182.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.182.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.182.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", - "https://deno.land/std@0.182.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", - "https://deno.land/std@0.182.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", - "https://deno.land/std@0.182.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", - "https://deno.land/std@0.182.0/fs/walk.ts": "920be35a7376db6c0b5b1caf1486fb962925e38c9825f90367f8f26b5e5d0897", - "https://deno.land/std@0.182.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.182.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.182.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", - "https://deno.land/std@0.182.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.182.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.182.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", - "https://deno.land/std@0.182.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", - "https://deno.land/std@0.182.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.182.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", - "https://deno.land/std@0.198.0/_util/diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", - "https://deno.land/std@0.198.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", - "https://deno.land/std@0.198.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", - "https://deno.land/std@0.198.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", - "https://deno.land/std@0.198.0/assert/assert_almost_equals.ts": "e15ca1f34d0d5e0afae63b3f5d975cbd18335a132e42b0c747d282f62ad2cd6c", - "https://deno.land/std@0.198.0/assert/assert_array_includes.ts": "6856d7f2c3544bc6e62fb4646dfefa3d1df5ff14744d1bca19f0cbaf3b0d66c9", - "https://deno.land/std@0.198.0/assert/assert_equals.ts": "a0ee60574e437bcab2dcb79af9d48dc88845f8fd559468d9c21b15fd638ef943", - "https://deno.land/std@0.198.0/assert/assert_exists.ts": "407cb6b9fb23a835cd8d5ad804e2e2edbbbf3870e322d53f79e1c7a512e2efd7", - "https://deno.land/std@0.198.0/assert/assert_false.ts": "a9962749f4bf5844e3fa494257f1de73d69e4fe0e82c34d0099287552163a2dc", - "https://deno.land/std@0.198.0/assert/assert_instance_of.ts": "09fd297352a5b5bbb16da2b5e1a0d8c6c44da5447772648622dcc7df7af1ddb8", - "https://deno.land/std@0.198.0/assert/assert_is_error.ts": "b4eae4e5d182272efc172bf28e2e30b86bb1650cd88aea059e5d2586d4160fb9", - "https://deno.land/std@0.198.0/assert/assert_match.ts": "c4083f80600bc190309903c95e397a7c9257ff8b5ae5c7ef91e834704e672e9b", - "https://deno.land/std@0.198.0/assert/assert_not_equals.ts": "9f1acab95bd1f5fc9a1b17b8027d894509a745d91bac1718fdab51dc76831754", - "https://deno.land/std@0.198.0/assert/assert_not_instance_of.ts": "0c14d3dfd9ab7a5276ed8ed0b18c703d79a3d106102077ec437bfe7ed912bd22", - "https://deno.land/std@0.198.0/assert/assert_not_match.ts": "3796a5b0c57a1ce6c1c57883dd4286be13a26f715ea662318ab43a8491a13ab0", - "https://deno.land/std@0.198.0/assert/assert_not_strict_equals.ts": "ca6c6d645e95fbc873d25320efeb8c4c6089a9a5e09f92d7c1c4b6e935c2a6ad", - "https://deno.land/std@0.198.0/assert/assert_object_match.ts": "d8fc2867cfd92eeacf9cea621e10336b666de1874a6767b5ec48988838370b54", - "https://deno.land/std@0.198.0/assert/assert_rejects.ts": "45c59724de2701e3b1f67c391d6c71c392363635aad3f68a1b3408f9efca0057", - "https://deno.land/std@0.198.0/assert/assert_strict_equals.ts": "5cf29b38b3f8dece95287325723272aa04e04dbf158d886d662fa594fddc9ed3", - "https://deno.land/std@0.198.0/assert/assert_string_includes.ts": "b821d39ebf5cb0200a348863c86d8c4c4b398e02012ce74ad15666fc4b631b0c", - "https://deno.land/std@0.198.0/assert/assert_throws.ts": "63784e951475cb7bdfd59878cd25a0931e18f6dc32a6077c454b2cd94f4f4bcd", - "https://deno.land/std@0.198.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", - "https://deno.land/std@0.198.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", - "https://deno.land/std@0.198.0/assert/fail.ts": "c36353d7ae6e1f7933d45f8ea51e358c8c4b67d7e7502028598fe1fea062e278", - "https://deno.land/std@0.198.0/assert/mod.ts": "08d55a652c22c5da0215054b21085cec25a5da47ce4a6f9de7d9ad36df35bdee", - "https://deno.land/std@0.198.0/assert/unimplemented.ts": "d56fbeecb1f108331a380f72e3e010a1f161baa6956fd0f7cf3e095ae1a4c75a", - "https://deno.land/std@0.198.0/assert/unreachable.ts": "4600dc0baf7d9c15a7f7d234f00c23bca8f3eba8b140286aaca7aa998cf9a536", - "https://deno.land/std@0.198.0/async/delay.ts": "a6142eb44cdd856b645086af2b811b1fcce08ec06bb7d50969e6a872ee9b8659", - "https://deno.land/std@0.198.0/collections/_comparators.ts": "fa7f9a44cea1d270098a2a5a6f8bb30c61b595c1b1f983bd67c6297d766adffa", - "https://deno.land/std@0.198.0/collections/binary_search_node.ts": "8d99dd95901d73a0edbe105826ef7ce0e1111ce184d2d0410dbfda172c9ebf35", - "https://deno.land/std@0.198.0/collections/binary_search_tree.ts": "c3588493fd3b090453fade1903db19cbe398490db6a40a0574d7abdaa87ba652", - "https://deno.land/std@0.198.0/collections/red_black_node.ts": "eb766a69d82132fc4f1789eb3dc753781da7c3b0938756256be3764c9941e3ac", - "https://deno.land/std@0.198.0/collections/red_black_tree.ts": "e78d2aa89d23410079ad1f26e8bf95f05c84c8f8a9ef9c9ae41b312d7062b861", - "https://deno.land/std@0.198.0/fmt/colors.ts": "a7eecffdf3d1d54db890723b303847b6e0a1ab4b528ba6958b8f2e754cf1b3bc", - "https://deno.land/std@0.198.0/testing/_test_suite.ts": "30f018feeb3835f12ab198d8a518f9089b1bcb2e8c838a8b615ab10d5005465c", - "https://deno.land/std@0.198.0/testing/_time.ts": "fecaf6fc7277d240d11b0de2e93b1c93ebbb4a3a61f0cb0b1741f66f69a4d22b", - "https://deno.land/std@0.198.0/testing/asserts.ts": "b4e4b1359393aeff09e853e27901a982c685cb630df30426ed75496961931946", - "https://deno.land/std@0.198.0/testing/bdd.ts": "3f446df5ef8e856a869e8eec54c8482590415741ff0b6358a00c43486cc15769", - "https://deno.land/std@0.198.0/testing/mock.ts": "4c52b8312d159179fdd9d9a1b35e342ee4e1a1248f29e5c7f57fb4011c3f55ed", - "https://deno.land/std@0.198.0/testing/time.ts": "a46fbfd61e6f011f15a63c8078399b1f7fa848d2c0c526f253b0535f5c3e7f45", - "https://deno.land/x/b64@1.1.27/src/base64.js": "9e10b98e4203d030bc913913a2e4683b4842aff337bc9ec2643a28dfe04b5fc4", - "https://deno.land/x/code_block_writer@12.0.0/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5", - "https://deno.land/x/code_block_writer@12.0.0/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff", - "https://deno.land/x/deno_cache@0.4.1/auth_tokens.ts": "5fee7e9155e78cedf3f6ff3efacffdb76ac1a76c86978658d9066d4fb0f7326e", - "https://deno.land/x/deno_cache@0.4.1/cache.ts": "51f72f4299411193d780faac8c09d4e8cbee951f541121ef75fcc0e94e64c195", - "https://deno.land/x/deno_cache@0.4.1/deno_dir.ts": "f2a9044ce8c7fe1109004cda6be96bf98b08f478ce77e7a07f866eff1bdd933f", - "https://deno.land/x/deno_cache@0.4.1/deps.ts": "8974097d6c17e65d9a82d39377ae8af7d94d74c25c0cbb5855d2920e063f2343", - "https://deno.land/x/deno_cache@0.4.1/dirs.ts": "d2fa473ef490a74f2dcb5abb4b9ab92a48d2b5b6320875df2dee64851fa64aa9", - "https://deno.land/x/deno_cache@0.4.1/disk_cache.ts": "1f3f5232cba4c56412d93bdb324c624e95d5dd179d0578d2121e3ccdf55539f9", - "https://deno.land/x/deno_cache@0.4.1/file_fetcher.ts": "07a6c5f8fd94bf50a116278cc6012b4921c70d2251d98ce1c9f3c352135c39f7", - "https://deno.land/x/deno_cache@0.4.1/http_cache.ts": "f632e0d6ec4a5d61ae3987737a72caf5fcdb93670d21032ddb78df41131360cd", - "https://deno.land/x/deno_cache@0.4.1/mod.ts": "ef1cda9235a93b89cb175fe648372fc0f785add2a43aa29126567a05e3e36195", - "https://deno.land/x/deno_cache@0.4.1/util.ts": "8cb686526f4be5205b92c819ca2ce82220aa0a8dd3613ef0913f6dc269dbbcfe", - "https://deno.land/x/deno_cache@0.6.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e", - "https://deno.land/x/deno_cache@0.6.2/cache.ts": "58b53c128b742757efcad10af9a3871f23b4e200674cb5b0ddf61164fb9b2fe7", - "https://deno.land/x/deno_cache@0.6.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0", - "https://deno.land/x/deno_cache@0.6.2/deps.ts": "12cca94516cf2d3ed42fccd4b721ecd8060679253f077d83057511045b0081aa", - "https://deno.land/x/deno_cache@0.6.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069", - "https://deno.land/x/deno_cache@0.6.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa", - "https://deno.land/x/deno_cache@0.6.2/file_fetcher.ts": "4f3e4a2c78a5ca1e4812099e5083f815a8525ab20d389b560b3517f6b1161dd6", - "https://deno.land/x/deno_cache@0.6.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd", - "https://deno.land/x/deno_cache@0.6.2/lib/deno_cache_dir.generated.js": "59f8defac32e8ebf2a30f7bc77e9d88f0e60098463fb1b75e00b9791a4bbd733", - "https://deno.land/x/deno_cache@0.6.2/lib/snippets/deno_cache_dir-a2aecaa9536c9402/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6", - "https://deno.land/x/deno_cache@0.6.2/mod.ts": "b4004287e1c6123d7f07fe9b5b3e94ce6d990c4102949a89c527c68b19627867", - "https://deno.land/x/deno_cache@0.6.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2", - "https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66", - "https://deno.land/x/dnt@0.38.0/lib/compiler.ts": "209ad2e1b294f93f87ec02ade9a0821f942d2e524104552d0aa8ff87021050a5", - "https://deno.land/x/dnt@0.38.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", - "https://deno.land/x/dnt@0.38.0/lib/mod.deps.ts": "30367fc68bcd2acf3b7020cf5cdd26f817f7ac9ac35c4bfb6c4551475f91bc3e", - "https://deno.land/x/dnt@0.38.0/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", - "https://deno.land/x/dnt@0.38.0/lib/package_json.ts": "61f35b06e374ed39ca776d29d67df4be7ee809d0bca29a8239687556c6d027c2", - "https://deno.land/x/dnt@0.38.0/lib/pkg/dnt_wasm.generated.js": "82aeecfb055af0b2700e1e9b886e4a44fe3bf9cd11a9c4195cb169f53a134b15", - "https://deno.land/x/dnt@0.38.0/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "a6b95adc943a68d513fe8ed9ec7d260ac466b7a4bced4e942f733e494bb9f1be", - "https://deno.land/x/dnt@0.38.0/lib/shims.ts": "df1bd4d9a196dca4b2d512b1564fff64ac6c945189a273d706391f87f210d7e6", - "https://deno.land/x/dnt@0.38.0/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", - "https://deno.land/x/dnt@0.38.0/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", - "https://deno.land/x/dnt@0.38.0/lib/transform.deps.ts": "e42f2bdef46d098453bdba19261a67cf90b583f5d868f7fe83113c1380d9b85c", - "https://deno.land/x/dnt@0.38.0/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", - "https://deno.land/x/dnt@0.38.0/lib/utils.ts": "878b7ac7003a10c16e6061aa49dbef9b42bd43174853ebffc9b67ea47eeb11d8", - "https://deno.land/x/dnt@0.38.0/mod.ts": "b13349fe77847cf58e26b40bcd58797a8cec5d71b31a1ca567071329c8489de1", - "https://deno.land/x/dnt@0.38.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", - "https://deno.land/x/dnt@0.40.0/lib/compiler.ts": "7f4447531581896348b8a379ab94730856b42ae50d99043f2468328360293cb1", - "https://deno.land/x/dnt@0.40.0/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", - "https://deno.land/x/dnt@0.40.0/lib/mod.deps.ts": "8d6123c8e1162037e58aa8126686a03d1e2cffb250a8757bf715f80242097597", - "https://deno.land/x/dnt@0.40.0/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", - "https://deno.land/x/dnt@0.40.0/lib/package_json.ts": "607b0a4f44acad071a4c8533b312a27d6671eac8e6a23625c8350ce29eadb2ba", - "https://deno.land/x/dnt@0.40.0/lib/pkg/dnt_wasm.generated.js": "2694546844a50861d6d1610859afbf5130baca4dc6cf304541b7ec2d6d998142", - "https://deno.land/x/dnt@0.40.0/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "aba69a019a6da6f084898a6c7b903b8b583bc0dbd82bfb338449cf0b5bce58fd", - "https://deno.land/x/dnt@0.40.0/lib/shims.ts": "39e5c141f0315c0faf30b479b53f92b9078d92e1fd67ee34cc60b701d8e68dab", - "https://deno.land/x/dnt@0.40.0/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", - "https://deno.land/x/dnt@0.40.0/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", - "https://deno.land/x/dnt@0.40.0/lib/transform.deps.ts": "2e159661e1c5c650de9a573babe0e319349fe493105157307ec2ad2f6a52c94e", - "https://deno.land/x/dnt@0.40.0/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", - "https://deno.land/x/dnt@0.40.0/lib/utils.ts": "224f15f33e7226a2fd991e438d0291d7ed8c7889807efa2e1ecb67d2d1db6720", - "https://deno.land/x/dnt@0.40.0/mod.ts": "ae1890fbe592e4797e7dd88c1e270f22b8334878e9bf187c4e11ae75746fe778", - "https://deno.land/x/dnt@0.40.0/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", - "https://deno.land/x/tiny_cbor@0.2.2/cbor/cbor.ts": "b10fc7cd694887111cbcb9da87f0235cc954ee377b7122af3bbaccd422460e72", - "https://deno.land/x/tiny_cbor@0.2.2/cbor/cbor_internal.ts": "0cde2b1d2cb08503b6f44c1789736376eac2f5d0ed10db9f73b16caa356c8bd7", - "https://deno.land/x/tiny_cbor@0.2.2/index.ts": "a45c8abd3874ab05dea33af17b2da88376364d6966fcbf2c5da5520a0a9b9d98", - "https://deno.land/x/ts_morph@18.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", - "https://deno.land/x/ts_morph@18.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", - "https://deno.land/x/ts_morph@18.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", - "https://deno.land/x/ts_morph@18.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", - "https://deno.land/x/ts_morph@18.0.0/common/ts_morph_common.js": "845671ca951073400ce142f8acefa2d39ea9a51e29ca80928642f3f8cf2b7700", - "https://deno.land/x/ts_morph@18.0.0/common/typescript.js": "d5c598b6a2db2202d0428fca5fd79fc9a301a71880831a805d778797d2413c59", - "https://deno.land/x/ts_morph@20.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", - "https://deno.land/x/ts_morph@20.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", - "https://deno.land/x/ts_morph@20.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", - "https://deno.land/x/ts_morph@20.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", - "https://deno.land/x/ts_morph@20.0.0/common/ts_morph_common.js": "2325f94f61dc5f3f98a1dab366dc93048d11b1433d718b10cfc6ee5a1cfebe8f", - "https://deno.land/x/ts_morph@20.0.0/common/typescript.js": "b9edf0a451685d13e0467a7ed4351d112b74bd1e256b915a2b941054e31c1736", - "https://deno.land/x/wasmbuild@0.14.1/cache.ts": "89eea5f3ce6035a1164b3e655c95f21300498920575ade23161421f5b01967f4", - "https://deno.land/x/wasmbuild@0.14.1/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02", - "https://deno.land/x/wasmbuild@0.15.1/cache.ts": "9d01b5cb24e7f2a942bbd8d14b093751fa690a6cde8e21709ddc97667e6669ed", - "https://deno.land/x/wasmbuild@0.15.1/loader.ts": "8c2fc10e21678e42f84c5135d8ab6ab7dc92424c3f05d2354896a29ccfd02a63", - "https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20", - "https://esm.sh/@peculiar/asn1-android@2.3.10": "5840990eabf2bb7b8caaa637dbcb2839c2f3c7eec035e4de15757f0905d356b7", - "https://esm.sh/@peculiar/asn1-ecc@2.3.8": "eb524e991d210eae5d20171443cb3aceb08317e0a9f0ac845fc381d408d733c0", - "https://esm.sh/@peculiar/asn1-rsa@2.3.8": "22dc64c7d9cf4e33e3c33c319e7185d0eacf2d22505174f3955a0bbc89e8b822", - "https://esm.sh/@peculiar/asn1-schema@2.3.8": "f6523c00d07906aee44b7e49015161e194507a9d68cc0ae57c8bce08a7e1cb2e", - "https://esm.sh/@peculiar/asn1-x509@2.3.8": "22e1e9aa9006b43cf627bd4ab7b3566140c907636e48cec7f234075d7358aa02", - "https://esm.sh/cross-fetch@4.0.0": "455ae44f37acd1ed33e9449c428750b6129152532aeccd3de69bd19005a38331", - "https://esm.sh/v132/cross-fetch@4.0.0/denonext/cross-fetch.mjs": "238eae32034ab217cdbef10b812c7357f61ab2730c58207f4cf9135e9dec7a61", - "https://esm.sh/v135/@peculiar/asn1-android@2.3.10/denonext/asn1-android.mjs": "6eb3691895b655e7d19ebc696daada6b6d18d08286b383e2c8258ff59f124397", - "https://esm.sh/v135/@peculiar/asn1-ecc@2.3.8/denonext/asn1-ecc.mjs": "badf4a8fd101357e263b00e46ef191eba2c129933d66f2136af484a2cefd2b32", - "https://esm.sh/v135/@peculiar/asn1-rsa@2.3.8/denonext/asn1-rsa.mjs": "7464876430ea6c7f15dc191440cc963d4d900d75b2555457f97a27ae44d90284", - "https://esm.sh/v135/@peculiar/asn1-schema@2.3.8/denonext/asn1-schema.mjs": "38e998eae72df5018b54a2e4bbd75adea986dc8c5655247cb03da861f314d50d", - "https://esm.sh/v135/@peculiar/asn1-x509@2.3.8/denonext/asn1-x509.mjs": "7dcf12c3ae2f3bf63158d057b60a8a95b5a4041c69325da03c075e12ce9c0f21", - "https://esm.sh/v135/asn1js@3.0.5/denonext/asn1js.mjs": "82d0da865ca1875486c26f86b51c80183e73fcedd32586eaeeb5980c16458c53", - "https://esm.sh/v135/ipaddr.js@2.1.0/denonext/ipaddr.mjs": "214c1ee845e73e7c51ba673b36e7e6b9c5d8e8fb1fc19443444ad9cec44adf7e", - "https://esm.sh/v135/pvtsutils@1.3.5/denonext/pvtsutils.mjs": "016782b990e2652a326cf1d8984c2adc4552171da902cc73dc8e12ffdbe3a100", - "https://esm.sh/v135/pvutils@1.1.3/denonext/pvutils.mjs": "ad156a239ec0f1aa99f123fab44abc292c87d4fd6969d7af264436630457523c", - "https://esm.sh/v135/tslib@2.6.2/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1" - }, - "workspace": { - "dependencies": [ - "npm:@hexagon/base64@^1.1.27", - "npm:@levischuck/tiny-cbor@~0.2.2", - "npm:@peculiar/asn1-android@^2.3.10", - "npm:@peculiar/asn1-ecc@^2.3.8", - "npm:@peculiar/asn1-rsa@^2.3.8", - "npm:@peculiar/asn1-schema@^2.3.8", - "npm:@peculiar/asn1-x509@^2.3.8", - "npm:cross-fetch@4" - ] - } -} From 8a538f94400d18d4204d87d2a798e50057a424c0 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 09:45:18 -0800 Subject: [PATCH 025/115] Remove old server package.json --- packages/server/package.json | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 packages/server/package.json diff --git a/packages/server/package.json b/packages/server/package.json deleted file mode 100644 index 0bd146110..000000000 --- a/packages/server/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@simplewebauthn/server", - "version": "11.0.0", - "description": "Lerna/npm wrapper around Deno for @simplewebauthn/server", - "scripts": { - "build": "deno task build", - "build:lerna-debug": "deno task build > output.txt; cat output.txt; rm output.txt", - "test": "deno test -A src/", - "test:watch": "deno test -A --watch src/" - }, - "lerna": { - "command": { - "publish": { - "directory": "./npm" - } - } - }, - "gitHead": "ba039fdd5fdff87f78d3bd246e9bea5f7aa39ccb" -} From df27c1bd55f3b4720569eace5a85fb7f3ae38214 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 09:45:34 -0800 Subject: [PATCH 026/115] Update tests to use @std libs --- .../generateAuthenticationOptions.test.ts | 2 +- .../verifyAuthenticationResponse.test.ts | 11 ++++++----- .../server/src/helpers/convertAAGUIDToString.test.ts | 2 +- .../server/src/helpers/convertCOSEtoPKCS.test.ts | 2 +- .../src/helpers/convertCertBufferToPEM.test.ts | 2 +- .../server/src/helpers/convertPEMToBytes.test.ts | 2 +- .../src/helpers/decodeAttestationObject.test.ts | 2 +- .../helpers/decodeAuthenticatorExtensions.test.ts | 2 +- .../server/src/helpers/decodeClientDataJSON.test.ts | 2 +- .../server/src/helpers/generateChallenge.test.ts | 2 +- packages/server/src/helpers/generateUserID.test.ts | 2 +- .../src/helpers/iso/isoCrypto/getWebCrypto.test.ts | 4 ++-- .../src/helpers/iso/isoCrypto/verifyEC2.test.ts | 2 +- .../src/helpers/iso/isoCrypto/verifyOKP.test.ts | 2 +- .../src/helpers/parseAuthenticatorData.test.ts | 2 +- packages/server/src/helpers/parseBackupFlags.test.ts | 3 +-- packages/server/src/helpers/toHash.test.ts | 2 +- packages/server/src/index.test.ts | 2 +- .../metadata/verifyAttestationWithMetadata.test.ts | 2 +- packages/server/src/metadata/verifyJWT.test.ts | 4 ++-- .../registration/generateRegistrationOptions.test.ts | 4 ++-- .../verifications/tpm/verifyAttestationTPM.test.ts | 4 ++-- .../verifyAttestationAndroidKey.test.ts | 2 +- .../verifyAttestationAndroidSafetyNet.test.ts | 6 +++--- .../verifications/verifyAttestationApple.test.ts | 4 ++-- .../verifications/verifyAttestationPacked.test.ts | 2 +- .../registration/verifyRegistrationResponse.test.ts | 12 +++--------- .../server/src/services/metadataService.e2e.test.ts | 2 +- packages/server/src/services/metadataService.test.ts | 11 +++-------- packages/server/src/services/settingsService.test.ts | 2 +- 30 files changed, 46 insertions(+), 57 deletions(-) diff --git a/packages/server/src/authentication/generateAuthenticationOptions.test.ts b/packages/server/src/authentication/generateAuthenticationOptions.test.ts index 1916d35da..c18a81b63 100644 --- a/packages/server/src/authentication/generateAuthenticationOptions.test.ts +++ b/packages/server/src/authentication/generateAuthenticationOptions.test.ts @@ -1,4 +1,4 @@ -import { assert, assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert, assertEquals } from '@std/assert'; import { isoBase64URL } from '../helpers/iso/index.ts'; diff --git a/packages/server/src/authentication/verifyAuthenticationResponse.test.ts b/packages/server/src/authentication/verifyAuthenticationResponse.test.ts index bcaf07510..7496d3ffd 100644 --- a/packages/server/src/authentication/verifyAuthenticationResponse.test.ts +++ b/packages/server/src/authentication/verifyAuthenticationResponse.test.ts @@ -2,10 +2,13 @@ import { assert, assertEquals, assertExists, + assertFalse, + assertObjectMatch, assertRejects, -} from 'https://deno.land/std@0.198.0/assert/mod.ts'; -import { returnsNext, stub } from 'https://deno.land/std@0.198.0/testing/mock.ts'; -import { AuthenticationResponseJSON, WebAuthnCredential } from '@simplewebauthn/types'; +} from '@std/assert'; +import { returnsNext, stub } from '@std/testing/mock'; +import type { AuthenticationResponseJSON, WebAuthnCredential } from '@simplewebauthn/types'; +import {} from '@std/assert'; import { verifyAuthenticationResponse } from './verifyAuthenticationResponse.ts'; @@ -16,8 +19,6 @@ import { } from '../helpers/parseAuthenticatorData.ts'; import { toHash } from '../helpers/toHash.ts'; import { isoBase64URL, isoUint8Array } from '../helpers/iso/index.ts'; -import { assertObjectMatch } from 'https://deno.land/std@0.198.0/assert/assert_object_match.ts'; -import { assertFalse } from 'https://deno.land/std@0.198.0/assert/assert_false.ts'; Deno.test('should verify an assertion response', async () => { const verification = await verifyAuthenticationResponse({ diff --git a/packages/server/src/helpers/convertAAGUIDToString.test.ts b/packages/server/src/helpers/convertAAGUIDToString.test.ts index 3848fb5b9..6dcdb91db 100644 --- a/packages/server/src/helpers/convertAAGUIDToString.test.ts +++ b/packages/server/src/helpers/convertAAGUIDToString.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { convertAAGUIDToString } from './convertAAGUIDToString.ts'; import { isoUint8Array } from './iso/index.ts'; diff --git a/packages/server/src/helpers/convertCOSEtoPKCS.test.ts b/packages/server/src/helpers/convertCOSEtoPKCS.test.ts index 2f1a0e82a..26ea9522c 100644 --- a/packages/server/src/helpers/convertCOSEtoPKCS.test.ts +++ b/packages/server/src/helpers/convertCOSEtoPKCS.test.ts @@ -1,4 +1,4 @@ -import { assertThrows } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertThrows } from '@std/assert'; import { isoCBOR } from './iso/index.ts'; diff --git a/packages/server/src/helpers/convertCertBufferToPEM.test.ts b/packages/server/src/helpers/convertCertBufferToPEM.test.ts index 163dc4e76..d542a1bc1 100644 --- a/packages/server/src/helpers/convertCertBufferToPEM.test.ts +++ b/packages/server/src/helpers/convertCertBufferToPEM.test.ts @@ -1,4 +1,4 @@ -import { assert, assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert, assertEquals } from '@std/assert'; import { convertCertBufferToPEM } from './convertCertBufferToPEM.ts'; diff --git a/packages/server/src/helpers/convertPEMToBytes.test.ts b/packages/server/src/helpers/convertPEMToBytes.test.ts index d6e73d03f..0e63c9267 100644 --- a/packages/server/src/helpers/convertPEMToBytes.test.ts +++ b/packages/server/src/helpers/convertPEMToBytes.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { isoBase64URL } from './iso/index.ts'; import { convertPEMToBytes } from './convertPEMToBytes.ts'; diff --git a/packages/server/src/helpers/decodeAttestationObject.test.ts b/packages/server/src/helpers/decodeAttestationObject.test.ts index 063a691a7..8d03a6b7b 100644 --- a/packages/server/src/helpers/decodeAttestationObject.test.ts +++ b/packages/server/src/helpers/decodeAttestationObject.test.ts @@ -1,4 +1,4 @@ -import { assert, assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert, assertEquals } from '@std/assert'; import { decodeAttestationObject } from './decodeAttestationObject.ts'; import { isoBase64URL } from './iso/index.ts'; diff --git a/packages/server/src/helpers/decodeAuthenticatorExtensions.test.ts b/packages/server/src/helpers/decodeAuthenticatorExtensions.test.ts index 3e1a4e80b..407b5508d 100644 --- a/packages/server/src/helpers/decodeAuthenticatorExtensions.test.ts +++ b/packages/server/src/helpers/decodeAuthenticatorExtensions.test.ts @@ -1,4 +1,4 @@ -import { assertObjectMatch } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertObjectMatch } from '@std/assert'; import { decodeAuthenticatorExtensions } from './decodeAuthenticatorExtensions.ts'; import { isoUint8Array } from './iso/index.ts'; diff --git a/packages/server/src/helpers/decodeClientDataJSON.test.ts b/packages/server/src/helpers/decodeClientDataJSON.test.ts index 9f22bcb48..eefecb0d7 100644 --- a/packages/server/src/helpers/decodeClientDataJSON.test.ts +++ b/packages/server/src/helpers/decodeClientDataJSON.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { decodeClientDataJSON } from './decodeClientDataJSON.ts'; diff --git a/packages/server/src/helpers/generateChallenge.test.ts b/packages/server/src/helpers/generateChallenge.test.ts index 6479b553f..2af123eae 100644 --- a/packages/server/src/helpers/generateChallenge.test.ts +++ b/packages/server/src/helpers/generateChallenge.test.ts @@ -1,4 +1,4 @@ -import { assert, assertNotEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert, assertNotEquals } from '@std/assert'; import { generateChallenge } from './generateChallenge.ts'; diff --git a/packages/server/src/helpers/generateUserID.test.ts b/packages/server/src/helpers/generateUserID.test.ts index b15cab84c..fc0e1ffbf 100644 --- a/packages/server/src/helpers/generateUserID.test.ts +++ b/packages/server/src/helpers/generateUserID.test.ts @@ -1,4 +1,4 @@ -import { assert, assertNotEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert, assertNotEquals } from '@std/assert'; import { generateUserID } from './generateUserID.ts'; diff --git a/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts b/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts index 9ab0ad270..89309275e 100644 --- a/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts +++ b/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.test.ts @@ -1,5 +1,5 @@ -import { assertEquals, assertRejects } from 'https://deno.land/std@0.198.0/assert/mod.ts'; -import { returnsNext, stub } from 'https://deno.land/std@0.198.0/testing/mock.ts'; +import { assertEquals, assertRejects } from '@std/assert'; +import { returnsNext, stub } from '@std/testing/mock'; import { _getWebCryptoInternals, getWebCrypto, MissingWebCrypto } from './getWebCrypto.ts'; diff --git a/packages/server/src/helpers/iso/isoCrypto/verifyEC2.test.ts b/packages/server/src/helpers/iso/isoCrypto/verifyEC2.test.ts index 6346e8fa1..96378b2e8 100644 --- a/packages/server/src/helpers/iso/isoCrypto/verifyEC2.test.ts +++ b/packages/server/src/helpers/iso/isoCrypto/verifyEC2.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert } from '@std/assert'; import { COSEALG, COSECRV, COSEKEYS, COSEKTY, COSEPublicKeyEC2 } from '../../cose.ts'; import { verifyEC2 } from './verifyEC2.ts'; diff --git a/packages/server/src/helpers/iso/isoCrypto/verifyOKP.test.ts b/packages/server/src/helpers/iso/isoCrypto/verifyOKP.test.ts index 23ea2aa49..e45341757 100644 --- a/packages/server/src/helpers/iso/isoCrypto/verifyOKP.test.ts +++ b/packages/server/src/helpers/iso/isoCrypto/verifyOKP.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert } from '@std/assert'; import { COSEALG, COSECRV, COSEKEYS, COSEKTY, COSEPublicKeyOKP } from '../../cose.ts'; import { verifyOKP } from './verifyOKP.ts'; diff --git a/packages/server/src/helpers/parseAuthenticatorData.test.ts b/packages/server/src/helpers/parseAuthenticatorData.test.ts index d794bbc0c..66faa95b1 100644 --- a/packages/server/src/helpers/parseAuthenticatorData.test.ts +++ b/packages/server/src/helpers/parseAuthenticatorData.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { parseAuthenticatorData } from './parseAuthenticatorData.ts'; import { AuthenticationExtensionsAuthenticatorOutputs } from './decodeAuthenticatorExtensions.ts'; diff --git a/packages/server/src/helpers/parseBackupFlags.test.ts b/packages/server/src/helpers/parseBackupFlags.test.ts index 479e967b7..b472887f3 100644 --- a/packages/server/src/helpers/parseBackupFlags.test.ts +++ b/packages/server/src/helpers/parseBackupFlags.test.ts @@ -1,7 +1,6 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals, assertThrows } from '@std/assert'; import { InvalidBackupFlags, parseBackupFlags } from './parseBackupFlags.ts'; -import { assertThrows } from 'https://deno.land/std@0.198.0/assert/assert_throws.ts'; Deno.test('should return single-device cred, not backed up', () => { const parsed = parseBackupFlags({ be: false, bs: false }); diff --git a/packages/server/src/helpers/toHash.test.ts b/packages/server/src/helpers/toHash.test.ts index 306b81aee..a9bf7fc66 100644 --- a/packages/server/src/helpers/toHash.test.ts +++ b/packages/server/src/helpers/toHash.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { toHash } from './toHash.ts'; diff --git a/packages/server/src/index.test.ts b/packages/server/src/index.test.ts index 672f7f720..1b97f3882 100644 --- a/packages/server/src/index.test.ts +++ b/packages/server/src/index.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert } from '@std/assert'; import * as index from './index.ts'; diff --git a/packages/server/src/metadata/verifyAttestationWithMetadata.test.ts b/packages/server/src/metadata/verifyAttestationWithMetadata.test.ts index 934791ee1..a12a12703 100644 --- a/packages/server/src/metadata/verifyAttestationWithMetadata.test.ts +++ b/packages/server/src/metadata/verifyAttestationWithMetadata.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { verifyAttestationWithMetadata } from './verifyAttestationWithMetadata.ts'; import { MetadataStatement } from '../metadata/mdsTypes.ts'; diff --git a/packages/server/src/metadata/verifyJWT.test.ts b/packages/server/src/metadata/verifyJWT.test.ts index 5be7cdf2e..1e42685b6 100644 --- a/packages/server/src/metadata/verifyJWT.test.ts +++ b/packages/server/src/metadata/verifyJWT.test.ts @@ -1,4 +1,4 @@ -import { assert, assertFalse } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert, assertFalse } from '@std/assert'; import { verifyJWT } from './verifyJWT.ts'; import { convertPEMToBytes } from '../helpers/convertPEMToBytes.ts'; @@ -24,7 +24,7 @@ Deno.test('should fail to verify a JWT with a bad signature', async () => { * aren't one of two supported combinations. In this test the key curve is * P-384 and the hash alg is SHA-256... * - * See https://deno.land/x/deno@v1.36.1/ext/crypto/00_crypto.js?source#L1338 + * See https://deno.land/x/deno@v2.0.4/ext/crypto/00_crypto.js?source#L1317 * * I raised an issue about this here: * https://github.com/denoland/deno/issues/20198 diff --git a/packages/server/src/registration/generateRegistrationOptions.test.ts b/packages/server/src/registration/generateRegistrationOptions.test.ts index 6f8282e1a..7f1d041c9 100644 --- a/packages/server/src/registration/generateRegistrationOptions.test.ts +++ b/packages/server/src/registration/generateRegistrationOptions.test.ts @@ -1,5 +1,5 @@ -import { assertEquals, assertRejects } from 'https://deno.land/std@0.198.0/assert/mod.ts'; -import { returnsNext, stub } from 'https://deno.land/std@0.198.0/testing/mock.ts'; +import { assertEquals, assertRejects } from '@std/assert'; +import { returnsNext, stub } from '@std/testing/mock'; import { generateRegistrationOptions } from './generateRegistrationOptions.ts'; import { _generateChallengeInternals } from '../helpers/generateChallenge.ts'; diff --git a/packages/server/src/registration/verifications/tpm/verifyAttestationTPM.test.ts b/packages/server/src/registration/verifications/tpm/verifyAttestationTPM.test.ts index 903d42d70..d6382274c 100644 --- a/packages/server/src/registration/verifications/tpm/verifyAttestationTPM.test.ts +++ b/packages/server/src/registration/verifications/tpm/verifyAttestationTPM.test.ts @@ -1,5 +1,5 @@ -import { assertEquals, assertRejects } from 'https://deno.land/std@0.198.0/assert/mod.ts'; -import { FakeTime } from 'https://deno.land/std@0.198.0/testing/time.ts'; +import { assertEquals, assertRejects } from '@std/assert'; +import { FakeTime } from '@std/testing/time'; import { verifyRegistrationResponse } from '../../verifyRegistrationResponse.ts'; diff --git a/packages/server/src/registration/verifications/verifyAttestationAndroidKey.test.ts b/packages/server/src/registration/verifications/verifyAttestationAndroidKey.test.ts index da2f07f39..bd10add6c 100644 --- a/packages/server/src/registration/verifications/verifyAttestationAndroidKey.test.ts +++ b/packages/server/src/registration/verifications/verifyAttestationAndroidKey.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { SettingsService } from '../../services/settingsService.ts'; import { verifyRegistrationResponse } from '../verifyRegistrationResponse.ts'; diff --git a/packages/server/src/registration/verifications/verifyAttestationAndroidSafetyNet.test.ts b/packages/server/src/registration/verifications/verifyAttestationAndroidSafetyNet.test.ts index ecf34f5f4..29992efe1 100644 --- a/packages/server/src/registration/verifications/verifyAttestationAndroidSafetyNet.test.ts +++ b/packages/server/src/registration/verifications/verifyAttestationAndroidSafetyNet.test.ts @@ -1,6 +1,6 @@ -import { assert, assertRejects } from 'https://deno.land/std@0.198.0/assert/mod.ts'; -import { FakeTime } from 'https://deno.land/std@0.198.0/testing/time.ts'; -import { RegistrationResponseJSON } from '@simplewebauthn/types'; +import { assert, assertRejects } from '@std/assert'; +import { FakeTime } from '@std/testing/time'; +import type { RegistrationResponseJSON } from '@simplewebauthn/types'; import { verifyAttestationAndroidSafetyNet } from './verifyAttestationAndroidSafetyNet.ts'; diff --git a/packages/server/src/registration/verifications/verifyAttestationApple.test.ts b/packages/server/src/registration/verifications/verifyAttestationApple.test.ts index 06637212f..1b9b73626 100644 --- a/packages/server/src/registration/verifications/verifyAttestationApple.test.ts +++ b/packages/server/src/registration/verifications/verifyAttestationApple.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { verifyRegistrationResponse } from '../verifyRegistrationResponse.ts'; @@ -8,7 +8,7 @@ import { verifyRegistrationResponse } from '../verifyRegistrationResponse.ts'; * aren't one of two supported combinations. In this test the key curve is * P-384 and the hash alg is SHA-256... * - * See https://deno.land/x/deno@v1.36.1/ext/crypto/00_crypto.js?source#L1338 + * See https://deno.land/x/deno@v2.0.4/ext/crypto/00_crypto.js?source#L1317 * * I raised an issue about this here: * https://github.com/denoland/deno/issues/20198 diff --git a/packages/server/src/registration/verifications/verifyAttestationPacked.test.ts b/packages/server/src/registration/verifications/verifyAttestationPacked.test.ts index 8586c9ff2..2605d23f3 100644 --- a/packages/server/src/registration/verifications/verifyAttestationPacked.test.ts +++ b/packages/server/src/registration/verifications/verifyAttestationPacked.test.ts @@ -1,4 +1,4 @@ -import { assertEquals, assertRejects } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals, assertRejects } from '@std/assert'; import { verifyRegistrationResponse } from '../verifyRegistrationResponse.ts'; diff --git a/packages/server/src/registration/verifyRegistrationResponse.test.ts b/packages/server/src/registration/verifyRegistrationResponse.test.ts index b440f1167..a6f7cdcc2 100644 --- a/packages/server/src/registration/verifyRegistrationResponse.test.ts +++ b/packages/server/src/registration/verifyRegistrationResponse.test.ts @@ -1,11 +1,6 @@ -import { - assert, - assertEquals, - assertFalse, - assertRejects, -} from 'https://deno.land/std@0.198.0/assert/mod.ts'; -import { returnsNext, stub } from 'https://deno.land/std@0.198.0/testing/mock.ts'; -import { RegistrationResponseJSON } from '@simplewebauthn/types'; +import { assert, assertEquals, assertFalse, assertObjectMatch, assertRejects } from '@std/assert'; +import { returnsNext, stub } from '@std/testing/mock'; +import type { RegistrationResponseJSON } from '@simplewebauthn/types'; import { verifyRegistrationResponse } from './verifyRegistrationResponse.ts'; import { @@ -23,7 +18,6 @@ import { toHash } from '../helpers/toHash.ts'; import { isoBase64URL, isoUint8Array } from '../helpers/iso/index.ts'; import { COSEKEYS } from '../helpers/cose.ts'; import { SettingsService } from '../services/settingsService.ts'; -import { assertObjectMatch } from 'https://deno.land/std@0.198.0/assert/assert_object_match.ts'; /** * Clear out root certs for android-key since responses were captured from FIDO Conformance testing diff --git a/packages/server/src/services/metadataService.e2e.test.ts b/packages/server/src/services/metadataService.e2e.test.ts index 25f2cdc46..2c192516c 100644 --- a/packages/server/src/services/metadataService.e2e.test.ts +++ b/packages/server/src/services/metadataService.e2e.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assert } from '@std/assert'; import { BaseMetadataService } from './metadataService.ts'; diff --git a/packages/server/src/services/metadataService.test.ts b/packages/server/src/services/metadataService.test.ts index a26ec7ec1..e8a3fb4d9 100644 --- a/packages/server/src/services/metadataService.test.ts +++ b/packages/server/src/services/metadataService.test.ts @@ -1,11 +1,6 @@ -import { assertEquals, assertRejects } from 'https://deno.land/std@0.198.0/assert/mod.ts'; -import { afterEach, beforeEach, describe, it } from 'https://deno.land/std@0.198.0/testing/bdd.ts'; -import { - assertSpyCallArg, - assertSpyCalls, - Stub, - stub, -} from 'https://deno.land/std@0.198.0/testing/mock.ts'; +import { assertEquals, assertRejects } from '@std/assert'; +import { afterEach, beforeEach, describe, it } from '@std/testing/bdd'; +import { assertSpyCallArg, assertSpyCalls, type Stub, stub } from '@std/testing/mock'; import { _fetchInternals } from '../helpers/fetch.ts'; diff --git a/packages/server/src/services/settingsService.test.ts b/packages/server/src/services/settingsService.test.ts index b92bdb1df..918a9791c 100644 --- a/packages/server/src/services/settingsService.test.ts +++ b/packages/server/src/services/settingsService.test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.198.0/assert/mod.ts'; +import { assertEquals } from '@std/assert'; import { SettingsService } from './settingsService.ts'; import { convertPEMToBytes } from '../helpers/convertPEMToBytes.ts'; From 8687305383cb7e72732fb8980fa290fd25eea589 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 10:06:31 -0800 Subject: [PATCH 027/115] Get stricter about types in MetadataService --- .../server/src/services/metadataService.ts | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/server/src/services/metadataService.ts b/packages/server/src/services/metadataService.ts index 0fe267dae..0bca4a6d5 100644 --- a/packages/server/src/services/metadataService.ts +++ b/packages/server/src/services/metadataService.ts @@ -41,13 +41,22 @@ type VerificationMode = 'permissive' | 'strict'; const log = getLogger('MetadataService'); +interface MetadataService { + initialize(opts?: { + mdsServers?: string[]; + statements?: MetadataStatement[]; + verificationMode?: VerificationMode; + }): Promise; + getStatement(aaguid: string | Uint8Array): Promise; +} + /** - * A basic service for coordinating interactions with the FIDO Metadata Service. This includes BLOB - * download and parsing, and on-demand requesting and caching of individual metadata statements. + * An implementation of `MetadataService` that can download and parse BLOBs, and support on-demand + * requesting and caching of individual metadata statements. * * https://fidoalliance.org/metadata/ */ -export class BaseMetadataService { +export class BaseMetadataService implements MetadataService { private mdsCache: { [url: string]: CachedMDS } = {}; private statementCache: { [aaguid: string]: CachedBLOBEntry } = {}; private state: SERVICE_STATE = SERVICE_STATE.DISABLED; @@ -326,5 +335,10 @@ export class BaseMetadataService { } } -// Export a service singleton -export const MetadataService = new BaseMetadataService(); +/** + * A basic service for coordinating interactions with the FIDO Metadata Service. This includes BLOB + * download and parsing, and on-demand requesting and caching of individual metadata statements. + * + * https://fidoalliance.org/metadata/ + */ +export const MetadataService: MetadataService = new BaseMetadataService(); From ee5effa1c18a0ec75d5172f201c801fafd6d1e35 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 10:14:00 -0800 Subject: [PATCH 028/115] Get more explicit about typing in SettingsService --- .../server/src/services/settingsService.ts | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/server/src/services/settingsService.ts b/packages/server/src/services/settingsService.ts index 980e9767e..5cd567524 100644 --- a/packages/server/src/services/settingsService.ts +++ b/packages/server/src/services/settingsService.ts @@ -11,7 +11,15 @@ import { GlobalSign_Root_CA_R3 } from './defaultRootCerts/mds.ts'; type RootCertIdentifier = AttestationFormat | 'mds'; -class BaseSettingsService { +interface SettingsService { + setRootCertificates(opts: { + identifier: RootCertIdentifier; + certificates: (Uint8Array | string)[]; + }): void; + getRootCertificates(opts: { identifier: RootCertIdentifier }): string[]; +} + +class BaseSettingsService implements SettingsService { // Certificates are stored as PEM-formatted strings private pemCertificates: Map; @@ -53,7 +61,21 @@ class BaseSettingsService { } } -export const SettingsService = new BaseSettingsService(); +/** + * A basic service for specifying acceptable root certificates for all supported attestation + * statement formats. + * + * In addition, default root certificates are included for the following statement formats: + * + * - `'android-key'` + * - `'android-safetynet'` + * - `'apple'` + * - `'android-mds'` + * + * These can be overwritten as needed by setting alternative root certificates for their format + * identifier using `setRootCertificates()`. + */ +export const SettingsService: SettingsService = new BaseSettingsService(); // Initialize default certificates SettingsService.setRootCertificates({ From 881a0b894193e15f1b64188b2a232536032a2d26 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 10:18:55 -0800 Subject: [PATCH 029/115] Update server README --- packages/server/README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/server/README.md b/packages/server/README.md index d7eddad6c..3b20525dc 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -5,7 +5,7 @@ - [Installation](#installation) - [Node LTS 20.x or higher](#node-lts-20x-or-higher) - - [Deno v1.33.x or higher](#deno-v133x-or-higher) + - [Deno v1.43.x or higher](#deno-v143x-or-higher) - [Usage](#usage) - [Supported Attestation Formats](#supported-attestation-formats) @@ -13,21 +13,29 @@ ### Node LTS 20.x or higher -This package is available on **npm** and supports **both CommonJS and -[ECMAScript modules (ESM)](https://nodejs.org/api/esm.html#enabling)** projects: +This package can be installed from **NPM** (with support for **both CommonJS and +[ECMAScript modules (ESM)](https://nodejs.org/api/esm.html#enabling)** projects) or **JSR**: ```sh -npm install @simplewebauthn/server +$ npm install @simplewebauthn/server ``` -### Deno v1.33.x or higher +```sh +$ npx jsr add @simplewebauthn/server +``` + +### Deno v1.43.x or higher -It is also available for import into Deno projects from **deno.land/x**: +It is also available for import into Deno projects from **deno.land/x** or **JSR**: ```ts import {...} from 'https://deno.land/x/simplewebauthn/deno/server.ts'; ``` +```sh +$ deno add jsr:@simplewebauthn/server +``` + ## Usage You can find in-depth documentation on this package here: From 7e75de361ae997d366cdc3a1394c3ccc68d30681 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 10:19:13 -0800 Subject: [PATCH 030/115] Update types README --- packages/types/README.md | 4 ++-- packages/types/deno.jsonc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/types/README.md b/packages/types/README.md index ff5c7f22f..532868537 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -13,7 +13,7 @@ TypeScript typings for **@simplewebauthn/server** and **@simplewebauthn/browser* ### Node LTS 20.x or higher -This package can be installed from **npm** or **jsr**: +This package can be installed from **NPM** or **JSR**: ```sh $ npm install @simplewebauthn/types @@ -25,7 +25,7 @@ $ npx jsr add @simplewebauthn/types ### Deno v1.43.x or higher -It is available for import into Deno projects from **deno.land/x** or **jsr**: +It is available for import into Deno projects from **deno.land/x** or **JSR**: ```ts import {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index 6948fc24c..df36f3cd4 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -1,6 +1,6 @@ { "name": "@simplewebauthn/types", - "version": "11.0.0-alpha1", + "version": "11.0.0-alpha2", "exports": "./src/index.ts", "tasks": { "extract-dom-types": "deno run -A extract-dom-types.ts" From b168a90072ae66c47bc6adc18599e281fdf8ba81 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 11:01:34 -0800 Subject: [PATCH 031/115] Remove explicit types from server/deno.jsonc --- packages/server/deno.jsonc | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index 9c603bda5..369839ab5 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -22,7 +22,6 @@ "@peculiar/asn1-rsa": "npm:@peculiar/asn1-rsa@^2.3.8", "@peculiar/asn1-schema": "npm:@peculiar/asn1-schema@^2.3.8", "@peculiar/asn1-x509": "npm:@peculiar/asn1-x509@^2.3.8", - "@simplewebauthn/types": "../types/src/index.ts", "cross-fetch": "npm:cross-fetch@^4.0.0" }, "publish": { From 699d0fbf6ca197ebecd4bbeedd4654ecea50562e Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 11:41:17 -0800 Subject: [PATCH 032/115] Try to understand how to reference types for JSR --- packages/server/deno.jsonc | 1 + packages/server/src/foo.ts | 3 +++ packages/types/src/index.ts | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 packages/server/src/foo.ts diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index 369839ab5..1c4e65166 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -22,6 +22,7 @@ "@peculiar/asn1-rsa": "npm:@peculiar/asn1-rsa@^2.3.8", "@peculiar/asn1-schema": "npm:@peculiar/asn1-schema@^2.3.8", "@peculiar/asn1-x509": "npm:@peculiar/asn1-x509@^2.3.8", + "@simplewebauthn/types": "jsr:@simplewebauthn/types@^11.0.0-alpha1", "cross-fetch": "npm:cross-fetch@^4.0.0" }, "publish": { diff --git a/packages/server/src/foo.ts b/packages/server/src/foo.ts new file mode 100644 index 000000000..88d3d9612 --- /dev/null +++ b/packages/server/src/foo.ts @@ -0,0 +1,3 @@ +import { haha } from '@simplewebauthn/types'; + +const val: haha = 'lol'; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 20de00409..d141b463e 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -255,3 +255,5 @@ export interface PublicKeyCredentialFuture extends PublicKeyCredential { * - `"multiDevice"` credentials can be backed up */ export type CredentialDeviceType = 'singleDevice' | 'multiDevice'; + +export type haha = 'lol'; From 714813e37d6b31705579915c8965a070549e477d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 11:41:51 -0800 Subject: [PATCH 033/115] Increment server to alpha2 --- packages/server/deno.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index 1c4e65166..9a20b6dd0 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -1,6 +1,6 @@ { "name": "@simplewebauthn/server", - "version": "11.0.0-alpha1", + "version": "11.0.0-alpha2", "exports": { ".": "./src/index.ts", "./helpers": "./src/helpers/index.ts" From 887e246389d5d2db37363fa0773c16d9856cd51a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 11:59:04 -0800 Subject: [PATCH 034/115] Explicitly suggest installing types from JSR too --- packages/server/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/README.md b/packages/server/README.md index 3b20525dc..b6c0d7037 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -21,7 +21,7 @@ $ npm install @simplewebauthn/server ``` ```sh -$ npx jsr add @simplewebauthn/server +$ npx jsr add @simplewebauthn/server @simplewebauthn/types ``` ### Deno v1.43.x or higher @@ -33,7 +33,7 @@ import {...} from 'https://deno.land/x/simplewebauthn/deno/server.ts'; ``` ```sh -$ deno add jsr:@simplewebauthn/server +$ deno add jsr:@simplewebauthn/server jsr:@simplewebauthn/types ``` ## Usage From e527963c5fd26adc995a525d2a62e920cb270ac0 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 12:16:05 -0800 Subject: [PATCH 035/115] Drop Deno v1.46 testing from CI --- .github/workflows/ciChecks.yml | 95 +++++++++++++++++----------------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/.github/workflows/ciChecks.yml b/.github/workflows/ciChecks.yml index b43daf31d..487915745 100644 --- a/.github/workflows/ciChecks.yml +++ b/.github/workflows/ciChecks.yml @@ -5,66 +5,65 @@ name: CI Checks on: push: - branches: [ master, beta ] + branches: [master, beta] pull_request: - branches: [ master, beta ] + branches: [master, beta] jobs: unit_tests: - runs-on: ubuntu-latest strategy: matrix: - node-version: [ 20, 22 ] - deno-version: [ 'v1.46.x', 'v2.0.x' ] + node-version: [20, 22] + deno-version: ['v2.0.x'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - # Install Node - - name: Setup Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - - name: Confirm installed Node version - run: node -v + # Install Node + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - name: Confirm installed Node version + run: node -v - # Install Deno - - name: Setup Deno ${{ matrix.deno-version }} - uses: denoland/setup-deno@v2 - with: - deno-version: ${{ matrix.deno-version }} - - name: Confirm installed Deno version - run: deno -V + # Install Deno + - name: Setup Deno ${{ matrix.deno-version }} + uses: denoland/setup-deno@v2 + with: + deno-version: ${{ matrix.deno-version }} + - name: Confirm installed Deno version + run: deno -V - # Install pnpm w/cache for quicker installs - # https://github.com/pnpm/action-setup#use-cache-to-reduce-installation-time - - name: Setup pnpm 9.12.3 - uses: pnpm/action-setup@v4 - with: - version: 9.12.3 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - name: Setup pnpm cache - uses: actions/cache@v4 - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- + # Install pnpm w/cache for quicker installs + # https://github.com/pnpm/action-setup#use-cache-to-reduce-installation-time + - name: Setup pnpm 9.12.3 + uses: pnpm/action-setup@v4 + with: + version: 9.12.3 + run_install: false + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- - # Install deps - - name: Install dependencies - run: pnpm install + # Install deps + - name: Install dependencies + run: pnpm install - # Build and test packages - - name: Build & test @simplewebauthn/types - run: npm run build:types # browser tests will need this to be built - - name: Build & test @simplewebauthn/server - run: npm run build:server # dnt will test everything in Node too - - name: Test @simplewebauthn/browser - run: npm run test:browser + # Build and test packages + - name: Build & test @simplewebauthn/types + run: npm run build:types # browser tests will need this to be built + - name: Build & test @simplewebauthn/server + run: npm run build:server # dnt will test everything in Node too + - name: Test @simplewebauthn/browser + run: npm run test:browser From 193fa9f47ca2cfae01729c67b49d8a9681591e4f Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 12:30:22 -0800 Subject: [PATCH 036/115] Update root deno.lock --- deno.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/deno.lock b/deno.lock index eb98fb2ef..bafdfb824 100644 --- a/deno.lock +++ b/deno.lock @@ -270,6 +270,7 @@ "members": { "packages/server": { "dependencies": [ + "jsr:@simplewebauthn/types@^11.0.0-alpha1", "npm:@hexagon/base64@^1.1.27", "npm:@levischuck/tiny-cbor@~0.2.2", "npm:@peculiar/asn1-android@^2.3.10", From a42cde37542c1e4121ac3ff5990a9469f5fba53d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 12:39:20 -0800 Subject: [PATCH 037/115] Try to set up Deno caching --- .github/workflows/ciChecks.yml | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ciChecks.yml b/.github/workflows/ciChecks.yml index 487915745..0f5385186 100644 --- a/.github/workflows/ciChecks.yml +++ b/.github/workflows/ciChecks.yml @@ -37,28 +37,23 @@ jobs: - name: Confirm installed Deno version run: deno -V - # Install pnpm w/cache for quicker installs - # https://github.com/pnpm/action-setup#use-cache-to-reduce-installation-time - - name: Setup pnpm 9.12.3 - uses: pnpm/action-setup@v4 - with: - version: 9.12.3 - run_install: false - - name: Get pnpm store directory + # Set up caching for quicker installs + - name: Get DENO_DIR store directory shell: bash + # Expecting "DENO_DIR location: /Users/matt/Library/Caches/deno" somewhere in `deno info` run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - name: Setup pnpm cache + echo "DENO_DIR=$(deno info | grep "DENO_DIR" | awk '{print $3}')" >> $GITHUB_ENV + - name: Setup Deno cache uses: actions/cache@v4 with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: ${{ env.DENO_DIR }} + key: ${{ runner.os }}-deno-dir-${{ hashFiles('**/deno.lock') }} restore-keys: | - ${{ runner.os }}-pnpm-store- + ${{ runner.os }}-deno-dir- # Install deps - name: Install dependencies - run: pnpm install + run: deno install # Build and test packages - name: Build & test @simplewebauthn/types From 616ba2fa78b1d8a0870065b3f11c09851cced6d2 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 12:46:43 -0800 Subject: [PATCH 038/115] Try to just get server tests running --- .github/workflows/ciChecks.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ciChecks.yml b/.github/workflows/ciChecks.yml index 0f5385186..94e56365a 100644 --- a/.github/workflows/ciChecks.yml +++ b/.github/workflows/ciChecks.yml @@ -56,9 +56,7 @@ jobs: run: deno install # Build and test packages - - name: Build & test @simplewebauthn/types - run: npm run build:types # browser tests will need this to be built - name: Build & test @simplewebauthn/server - run: npm run build:server # dnt will test everything in Node too - - name: Test @simplewebauthn/browser - run: npm run test:browser + run: cd packages/server && deno task test + # - name: Test @simplewebauthn/browser + # run: npm run test:browser From 81a9d6d067e98ccb6eced0de2e3026a63a737d67 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 13:04:17 -0800 Subject: [PATCH 039/115] Remove test type --- packages/server/src/foo.ts | 3 --- packages/types/src/index.ts | 2 -- 2 files changed, 5 deletions(-) delete mode 100644 packages/server/src/foo.ts diff --git a/packages/server/src/foo.ts b/packages/server/src/foo.ts deleted file mode 100644 index 88d3d9612..000000000 --- a/packages/server/src/foo.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { haha } from '@simplewebauthn/types'; - -const val: haha = 'lol'; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index d141b463e..20de00409 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -255,5 +255,3 @@ export interface PublicKeyCredentialFuture extends PublicKeyCredential { * - `"multiDevice"` credentials can be backed up */ export type CredentialDeviceType = 'singleDevice' | 'multiDevice'; - -export type haha = 'lol'; From 65a0f7142c7140ea6213656f40359a620bc12f0f Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 13:51:03 -0800 Subject: [PATCH 040/115] Create a deno.jsonc for browser --- .vscode/settings.json | 1 + deno.jsonc | 1 + packages/browser/deno.jsonc | 26 ++++++++++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 packages/browser/deno.jsonc diff --git a/.vscode/settings.json b/.vscode/settings.json index aa6d1ce87..d253835fa 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,7 @@ "editor.formatOnSave": true, "deno.path": "/opt/homebrew/bin/deno", "deno.enablePaths": [ + "./packages/browser", "./packages/server", "./packages/types" ], diff --git a/deno.jsonc b/deno.jsonc index 79ad4bf1e..1741c45b2 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -12,6 +12,7 @@ "typescript": "npm:typescript@^5.6.3" }, "workspace": [ + "./packages/browser", "./packages/server", "./packages/types" ] diff --git a/packages/browser/deno.jsonc b/packages/browser/deno.jsonc new file mode 100644 index 000000000..4cbdd81f9 --- /dev/null +++ b/packages/browser/deno.jsonc @@ -0,0 +1,26 @@ +{ + "name": "@simplewebauthn/browser", + "version": "11.0.0-alpha2", + "exports": "./src/index.ts", + "tasks": { + "build": "rimraf dist && rollup -c", + "test": "deno test -A src/", + "test:watch": "deno test -A --watch src/" + }, + "fmt": { + "singleQuote": true, + "lineWidth": 100 + }, + "imports": { + "@simplewebauthn/types": "jsr:@simplewebauthn/types@^11.0.0-alpha1" + }, + "publish": { + "include": ["./src/**/*.ts"], + "exclude": [ + "./src/**/*.test.ts", + "./src/setupTests.ts", + "./src/**/__mocks__", + "./src/**/__jest__" + ] + } +} From 662e2b3723863ff4274358f1eee11695945c8503 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 14:05:13 -0800 Subject: [PATCH 041/115] Sprinkle in some file extensions into Browser --- .../browserSupportsWebAuthnAutofill.ts | 2 +- .../helpers/identifyAuthenticationError.ts | 4 ++-- .../src/helpers/identifyRegistrationError.ts | 4 ++-- .../platformAuthenticatorIsAvailable.test.ts | 2 +- .../platformAuthenticatorIsAvailable.ts | 2 +- .../toPublicKeyCredentialDescriptor.ts | 8 ++++++-- .../src/helpers/webAuthnAbortService.test.ts | 2 +- packages/browser/src/index.test.ts | 2 +- packages/browser/src/index.ts | 20 +++++++++---------- .../src/methods/startAuthentication.test.ts | 18 ++++++++--------- .../src/methods/startAuthentication.ts | 16 +++++++-------- .../src/methods/startRegistration.test.ts | 13 ++++++------ .../browser/src/methods/startRegistration.ts | 14 ++++++------- 13 files changed, 56 insertions(+), 51 deletions(-) diff --git a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts index b1312abe8..93866fe20 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts @@ -1,6 +1,6 @@ import { PublicKeyCredentialFuture } from '@simplewebauthn/types'; -import { browserSupportsWebAuthn } from './browserSupportsWebAuthn'; +import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.ts'; /** * Determine if the browser supports conditional UI, so that WebAuthn credentials can diff --git a/packages/browser/src/helpers/identifyAuthenticationError.ts b/packages/browser/src/helpers/identifyAuthenticationError.ts index 78732b28f..b49fbbf13 100644 --- a/packages/browser/src/helpers/identifyAuthenticationError.ts +++ b/packages/browser/src/helpers/identifyAuthenticationError.ts @@ -1,5 +1,5 @@ -import { isValidDomain } from './isValidDomain'; -import { WebAuthnError } from './webAuthnError'; +import { isValidDomain } from './isValidDomain.ts'; +import { WebAuthnError } from './webAuthnError.ts'; /** * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.get()` diff --git a/packages/browser/src/helpers/identifyRegistrationError.ts b/packages/browser/src/helpers/identifyRegistrationError.ts index 56597e4d3..a93574ed4 100644 --- a/packages/browser/src/helpers/identifyRegistrationError.ts +++ b/packages/browser/src/helpers/identifyRegistrationError.ts @@ -1,5 +1,5 @@ -import { isValidDomain } from './isValidDomain'; -import { WebAuthnError } from './webAuthnError'; +import { isValidDomain } from './isValidDomain.ts'; +import { WebAuthnError } from './webAuthnError.ts'; /** * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.create()` diff --git a/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts b/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts index 6f2b91dd1..1857191bc 100644 --- a/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts +++ b/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts @@ -1,4 +1,4 @@ -import { platformAuthenticatorIsAvailable } from './platformAuthenticatorIsAvailable'; +import { platformAuthenticatorIsAvailable } from './platformAuthenticatorIsAvailable.ts'; const mockIsUVPAA = jest.fn(); diff --git a/packages/browser/src/helpers/platformAuthenticatorIsAvailable.ts b/packages/browser/src/helpers/platformAuthenticatorIsAvailable.ts index 269789cde..bc5d1af53 100644 --- a/packages/browser/src/helpers/platformAuthenticatorIsAvailable.ts +++ b/packages/browser/src/helpers/platformAuthenticatorIsAvailable.ts @@ -1,4 +1,4 @@ -import { browserSupportsWebAuthn } from './browserSupportsWebAuthn'; +import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.ts'; /** * Determine whether the browser can communicate with a built-in authenticator, like diff --git a/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts b/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts index 39a7a5d32..d84ad5128 100644 --- a/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts +++ b/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts @@ -1,6 +1,10 @@ -import type { PublicKeyCredentialDescriptorJSON } from '@simplewebauthn/types'; +import type { + AuthenticatorTransport, + PublicKeyCredentialDescriptor, + PublicKeyCredentialDescriptorJSON, +} from '@simplewebauthn/types'; -import { base64URLStringToBuffer } from './base64URLStringToBuffer'; +import { base64URLStringToBuffer } from './base64URLStringToBuffer.ts'; export function toPublicKeyCredentialDescriptor( descriptor: PublicKeyCredentialDescriptorJSON, diff --git a/packages/browser/src/helpers/webAuthnAbortService.test.ts b/packages/browser/src/helpers/webAuthnAbortService.test.ts index 87d2535e2..57fd693a0 100644 --- a/packages/browser/src/helpers/webAuthnAbortService.test.ts +++ b/packages/browser/src/helpers/webAuthnAbortService.test.ts @@ -1,4 +1,4 @@ -import { WebAuthnAbortService } from './webAuthnAbortService'; +import { WebAuthnAbortService } from './webAuthnAbortService.ts'; test('should create a new abort signal every time', () => { const signal1 = WebAuthnAbortService.createNewAbortSignal(); diff --git a/packages/browser/src/index.test.ts b/packages/browser/src/index.test.ts index b1a1a5d70..674540855 100644 --- a/packages/browser/src/index.test.ts +++ b/packages/browser/src/index.test.ts @@ -1,4 +1,4 @@ -import * as index from './index'; +import * as index from './index.ts'; test('should export method `startRegistration`', () => { expect(index.startRegistration).toBeDefined(); diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts index fdb3e551c..ff305c311 100644 --- a/packages/browser/src/index.ts +++ b/packages/browser/src/index.ts @@ -2,15 +2,15 @@ * @packageDocumentation * @module @simplewebauthn/browser */ -import { startRegistration } from './methods/startRegistration'; -import { startAuthentication } from './methods/startAuthentication'; -import { browserSupportsWebAuthn } from './helpers/browserSupportsWebAuthn'; -import { platformAuthenticatorIsAvailable } from './helpers/platformAuthenticatorIsAvailable'; -import { browserSupportsWebAuthnAutofill } from './helpers/browserSupportsWebAuthnAutofill'; -import { base64URLStringToBuffer } from './helpers/base64URLStringToBuffer'; -import { bufferToBase64URLString } from './helpers/bufferToBase64URLString'; -import { WebAuthnAbortService } from './helpers/webAuthnAbortService'; -import { WebAuthnError } from './helpers/webAuthnError'; +import { startRegistration } from './methods/startRegistration.ts'; +import { startAuthentication } from './methods/startAuthentication.ts'; +import { browserSupportsWebAuthn } from './helpers/browserSupportsWebAuthn.ts'; +import { platformAuthenticatorIsAvailable } from './helpers/platformAuthenticatorIsAvailable.ts'; +import { browserSupportsWebAuthnAutofill } from './helpers/browserSupportsWebAuthnAutofill.ts'; +import { base64URLStringToBuffer } from './helpers/base64URLStringToBuffer.ts'; +import { bufferToBase64URLString } from './helpers/bufferToBase64URLString.ts'; +import { WebAuthnAbortService } from './helpers/webAuthnAbortService.ts'; +import { WebAuthnError } from './helpers/webAuthnError.ts'; export { base64URLStringToBuffer, @@ -24,4 +24,4 @@ export { WebAuthnError, }; -export type { WebAuthnErrorCode } from './helpers/webAuthnError'; +export type { WebAuthnErrorCode } from './helpers/webAuthnError.ts'; diff --git a/packages/browser/src/methods/startAuthentication.test.ts b/packages/browser/src/methods/startAuthentication.test.ts index a251b425c..46aac1c9e 100644 --- a/packages/browser/src/methods/startAuthentication.test.ts +++ b/packages/browser/src/methods/startAuthentication.test.ts @@ -5,15 +5,15 @@ import { PublicKeyCredentialRequestOptionsJSON, } from '@simplewebauthn/types'; -import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn'; -import { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill'; -import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer'; -import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString'; -import { WebAuthnError } from '../helpers/webAuthnError'; -import { generateCustomError } from '../helpers/__jest__/generateCustomError'; -import { WebAuthnAbortService } from '../helpers/webAuthnAbortService'; - -import { startAuthentication } from './startAuthentication'; +import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.ts'; +import { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill.ts'; +import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.ts'; +import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.ts'; +import { WebAuthnError } from '../helpers/webAuthnError.ts'; +import { generateCustomError } from '../helpers/__jest__/generateCustomError.ts'; +import { WebAuthnAbortService } from '../helpers/webAuthnAbortService.ts'; + +import { startAuthentication } from './startAuthentication.ts'; jest.mock('../helpers/browserSupportsWebAuthn'); jest.mock('../helpers/browserSupportsWebAuthnAutofill'); diff --git a/packages/browser/src/methods/startAuthentication.ts b/packages/browser/src/methods/startAuthentication.ts index f477581ef..4f6010d69 100644 --- a/packages/browser/src/methods/startAuthentication.ts +++ b/packages/browser/src/methods/startAuthentication.ts @@ -4,14 +4,14 @@ import { PublicKeyCredentialRequestOptionsJSON, } from '@simplewebauthn/types'; -import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString'; -import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer'; -import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn'; -import { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill'; -import { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor'; -import { identifyAuthenticationError } from '../helpers/identifyAuthenticationError'; -import { WebAuthnAbortService } from '../helpers/webAuthnAbortService'; -import { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment'; +import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.ts'; +import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.ts'; +import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.ts'; +import { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill.ts'; +import { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.ts'; +import { identifyAuthenticationError } from '../helpers/identifyAuthenticationError.ts'; +import { WebAuthnAbortService } from '../helpers/webAuthnAbortService.ts'; +import { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.ts'; export type StartAuthenticationOpts = { optionsJSON: PublicKeyCredentialRequestOptionsJSON; diff --git a/packages/browser/src/methods/startRegistration.test.ts b/packages/browser/src/methods/startRegistration.test.ts index 3a945468b..f214d621b 100644 --- a/packages/browser/src/methods/startRegistration.test.ts +++ b/packages/browser/src/methods/startRegistration.test.ts @@ -4,13 +4,14 @@ import { PublicKeyCredentialCreationOptionsJSON, RegistrationCredential, } from '@simplewebauthn/types'; -import { generateCustomError } from '../helpers/__jest__/generateCustomError'; -import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn'; -import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer'; -import { WebAuthnError } from '../helpers/webAuthnError'; -import { WebAuthnAbortService } from '../helpers/webAuthnAbortService'; -import { startRegistration } from './startRegistration'; +import { generateCustomError } from '../helpers/__jest__/generateCustomError.ts'; +import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.ts'; +import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.ts'; +import { WebAuthnError } from '../helpers/webAuthnError.ts'; +import { WebAuthnAbortService } from '../helpers/webAuthnAbortService.ts'; + +import { startRegistration } from './startRegistration.ts'; jest.mock('../helpers/browserSupportsWebAuthn'); diff --git a/packages/browser/src/methods/startRegistration.ts b/packages/browser/src/methods/startRegistration.ts index ab71d7ef2..0e82e7bb4 100644 --- a/packages/browser/src/methods/startRegistration.ts +++ b/packages/browser/src/methods/startRegistration.ts @@ -5,13 +5,13 @@ import { RegistrationResponseJSON, } from '@simplewebauthn/types'; -import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString'; -import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer'; -import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn'; -import { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor'; -import { identifyRegistrationError } from '../helpers/identifyRegistrationError'; -import { WebAuthnAbortService } from '../helpers/webAuthnAbortService'; -import { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment'; +import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.ts'; +import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.ts'; +import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.ts'; +import { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.ts'; +import { identifyRegistrationError } from '../helpers/identifyRegistrationError.ts'; +import { WebAuthnAbortService } from '../helpers/webAuthnAbortService.ts'; +import { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.ts'; export type StartRegistrationOpts = { optionsJSON: PublicKeyCredentialCreationOptionsJSON; From f3c4335fee9b6d9d2e19dcb04c32f23255c2a656 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 14:05:46 -0800 Subject: [PATCH 042/115] Port browserSupportsWebAuthn tests to Deno --- .../helpers/browserSupportsWebAuthn.test.ts | 38 ++++++++----------- .../src/helpers/browserSupportsWebAuthn.ts | 4 +- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/packages/browser/src/helpers/browserSupportsWebAuthn.test.ts b/packages/browser/src/helpers/browserSupportsWebAuthn.test.ts index dcd5c7c96..605dbd38b 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthn.test.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthn.test.ts @@ -1,33 +1,25 @@ -import { browserSupportsWebAuthn } from './browserSupportsWebAuthn'; +/// +import { assert, assertFalse, assertEquals } from '@std/assert'; -beforeEach(() => { - // @ts-ignore 2741 - window.PublicKeyCredential = jest.fn().mockReturnValue(() => {}); -}); +import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.ts'; -test('should return true when browser supports WebAuthn', () => { - expect(browserSupportsWebAuthn()).toBe(true); +Deno.test('should return true when browser supports WebAuthn', () => { + // @ts-ignore: Stubbing out PublicKeyCredential so it exists + globalThis.PublicKeyCredential = () => {}; + assert(browserSupportsWebAuthn()) }); -test('should return false when browser does not support WebAuthn', () => { +Deno.test('should return false when browser does not support WebAuthn', () => { // This looks weird but it appeases the linter so it's _fiiiine_ - delete (window as { PublicKeyCredential: unknown }).PublicKeyCredential; - expect(browserSupportsWebAuthn()).toBe(false); + delete (globalThis as { PublicKeyCredential: unknown }).PublicKeyCredential; + assertFalse(browserSupportsWebAuthn()) }); -test('should return false when window is undefined', () => { +Deno.test('should return false when window is undefined', () => { // Make window undefined as it is in node environments. - const windowSpy = jest.spyOn( - global, - 'window', - 'get', - ); - // @ts-ignore: Intentionally making window unavailable - windowSpy.mockImplementation(() => undefined); - - expect(window).toBe(undefined); - expect(browserSupportsWebAuthn()).toBe(false); + // @ts-ignore: Intentionally making globalThis unavailable + globalThis = undefined; - // Restore original window value. - windowSpy.mockRestore(); + assertEquals(globalThis, undefined); + assertFalse(browserSupportsWebAuthn()) }); diff --git a/packages/browser/src/helpers/browserSupportsWebAuthn.ts b/packages/browser/src/helpers/browserSupportsWebAuthn.ts index 706862d23..f37c449dc 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthn.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthn.ts @@ -3,7 +3,7 @@ */ export function browserSupportsWebAuthn(): boolean { return ( - window?.PublicKeyCredential !== undefined && - typeof window.PublicKeyCredential === 'function' + globalThis?.PublicKeyCredential !== undefined && + typeof globalThis.PublicKeyCredential === 'function' ); } From 10dfc5ed0a4c45dca8772ae8d41f0800adc804f7 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 14:06:13 -0800 Subject: [PATCH 043/115] Port browserSupportsWebAuthnAutofill tests to Deno --- .../browserSupportsWebAuthnAutofill.test.ts | 38 +++++++++---------- .../browserSupportsWebAuthnAutofill.ts | 2 +- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.test.ts b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.test.ts index 57ce6473a..3f93f100f 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.test.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.test.ts @@ -1,35 +1,33 @@ -import { browserSupportsWebAuthnAutofill } from './browserSupportsWebAuthnAutofill'; +/// +import { assert, assertFalse } from '@std/assert'; +import { spy } from '@std/testing/mock'; -// Mock "isConditionalMediationAvailable" -const mockICMA = jest.fn(); +import { browserSupportsWebAuthnAutofill } from './browserSupportsWebAuthnAutofill.ts'; -beforeEach(() => { - mockICMA.mockReset(); +Deno.test('should return true when conditional mediation is supported', async () => { + // @ts-ignore: Stubbing out PublicKeyCredential so it exists + globalThis.PublicKeyCredential = () => {}; + globalThis.PublicKeyCredential.isConditionalMediationAvailable = spy(async () => true); - // @ts-ignore 2741 - window.PublicKeyCredential = jest.fn().mockReturnValue(() => {}); - window.PublicKeyCredential.isConditionalMediationAvailable = mockICMA - .mockResolvedValue(true); -}); - -test('should return true when conditional mediation is supported', async () => { const supportsAutofill = await browserSupportsWebAuthnAutofill(); - expect(supportsAutofill).toEqual(true); + assert(supportsAutofill); }); -test('should return false when conditional mediation is not supported', async () => { - mockICMA.mockResolvedValue(false); +Deno.test('should return false when conditional mediation is not supported', async () => { + // @ts-ignore: Stubbing out PublicKeyCredential so it exists + globalThis.PublicKeyCredential = () => {}; + globalThis.PublicKeyCredential.isConditionalMediationAvailable = spy(async () => false); const supportsAutofill = await browserSupportsWebAuthnAutofill(); - expect(supportsAutofill).toEqual(false); + assertFalse(supportsAutofill); }); -test('should return false when browser does not support WebAuthn', async () => { - // This looks weird but it appeases the linter so it's _fiiiine_ - delete (window as { PublicKeyCredential: unknown }).PublicKeyCredential; +Deno.test('should return false when browser does not support WebAuthn', async () => { + // @ts-ignore: We know what we're doing so it's _fiiiine_ + delete globalThis.PublicKeyCredential; const supportsAutofill = await browserSupportsWebAuthnAutofill(); - expect(supportsAutofill).toEqual(false); + assertFalse(supportsAutofill); }); diff --git a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts index 93866fe20..1b98c72cc 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts @@ -17,7 +17,7 @@ export function browserSupportsWebAuthnAutofill(): Promise { * want. I think I'm fine with this for now since it's _supposed_ to be temporary, until TS types * have a chance to catch up. */ - const globalPublicKeyCredential = window + const globalPublicKeyCredential = globalThis .PublicKeyCredential as unknown as PublicKeyCredentialFuture; if (globalPublicKeyCredential.isConditionalMediationAvailable === undefined) { From 8ace2c4c3a6db68a5997b94ae9f3d8b50121ce32 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 14:09:38 -0800 Subject: [PATCH 044/115] Port platformAuthenticatorIsAvailable tests --- .../platformAuthenticatorIsAvailable.test.ts | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts b/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts index 1857191bc..2c0b81e90 100644 --- a/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts +++ b/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts @@ -1,34 +1,33 @@ -import { platformAuthenticatorIsAvailable } from './platformAuthenticatorIsAvailable.ts'; - -const mockIsUVPAA = jest.fn(); +/// +import { assert, assertFalse, assertEquals } from '@std/assert'; +import { spy } from '@std/testing/mock'; -beforeEach(() => { - mockIsUVPAA.mockReset(); +import { platformAuthenticatorIsAvailable } from './platformAuthenticatorIsAvailable.ts'; - // @ts-ignore 2741 - window.PublicKeyCredential = jest.fn().mockReturnValue(() => {}); - window.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable = mockIsUVPAA - .mockResolvedValue(true); -}); +Deno.test('should return true when platform authenticator is available', async () => { + // @ts-ignore: Stubbing out PublicKeyCredential so it exists + globalThis.PublicKeyCredential = () => {}; + globalThis.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable = spy(async () => true); -test('should return true when platform authenticator is available', async () => { const isAvailable = await platformAuthenticatorIsAvailable(); - expect(isAvailable).toEqual(true); + assert(isAvailable); }); -test('should return false when platform authenticator is unavailable', async () => { - mockIsUVPAA.mockResolvedValue(false); +Deno.test('should return false when platform authenticator is unavailable', async () => { + // @ts-ignore: Stubbing out PublicKeyCredential so it exists + globalThis.PublicKeyCredential = () => {}; + globalThis.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable = spy(async () => false); const isAvailable = await platformAuthenticatorIsAvailable(); - expect(isAvailable).toEqual(false); + assertFalse(isAvailable); }); -test('should return false when browser does not support WebAuthn', async () => { - // This looks weird but it appeases the linter so it's _fiiiine_ - delete (window as { PublicKeyCredential: unknown }).PublicKeyCredential; +Deno.test('should return false when browser does not support WebAuthn', async () => { + // @ts-ignore: We know what we're doing so it's _fiiiine_ + delete globalThis.PublicKeyCredential; const isAvailable = await platformAuthenticatorIsAvailable(); - expect(isAvailable).toEqual(false); + assertFalse(isAvailable); }); From a6eedce60ec1569ae4a1a2b743f6bc50c66b7469 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 14:14:40 -0800 Subject: [PATCH 045/115] Port WebAuthnAbortService tests to Deno --- .../src/helpers/webAuthnAbortService.test.ts | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/packages/browser/src/helpers/webAuthnAbortService.test.ts b/packages/browser/src/helpers/webAuthnAbortService.test.ts index 57fd693a0..59d2a87a2 100644 --- a/packages/browser/src/helpers/webAuthnAbortService.test.ts +++ b/packages/browser/src/helpers/webAuthnAbortService.test.ts @@ -1,50 +1,53 @@ +import { assertEquals, assertNotEquals, assertInstanceOf } from '@std/assert'; +import { assertSpyCalls, spy } from '@std/testing/mock'; + import { WebAuthnAbortService } from './webAuthnAbortService.ts'; -test('should create a new abort signal every time', () => { +Deno.test('should create a new abort signal every time', () => { const signal1 = WebAuthnAbortService.createNewAbortSignal(); const signal2 = WebAuthnAbortService.createNewAbortSignal(); - expect(signal2).not.toBe(signal1); + assertNotEquals(signal2, signal1); }); -test('should call abort() with AbortError on existing controller when creating a new signal', () => { +Deno.test('should call abort() with AbortError on existing controller when creating a new signal', () => { // Populate `.controller` WebAuthnAbortService.createNewAbortSignal(); // Spy on the existing instance of AbortController - const abortSpy = jest.fn(); + const abortSpy = spy(); // @ts-ignore: Ignore the fact that `controller` is private WebAuthnAbortService.controller.abort = abortSpy; // Generate a new signal, which should call `abort()` on the existing controller WebAuthnAbortService.createNewAbortSignal(); - expect(abortSpy).toHaveBeenCalledTimes(1); + assertSpyCalls(abortSpy, 1); // Make sure we raise an AbortError so it can be detected correctly - const abortReason = abortSpy.mock.calls[0][0]; - expect(abortReason).toBeInstanceOf(Error); - expect(abortReason.name).toEqual('AbortError'); + const abortReason = abortSpy.calls.at(0)?.args[0]; + assertInstanceOf(abortReason, Error); + assertEquals(abortReason.name, 'AbortError'); }); -test('should cancel active WebAuthn ceremony when manually cancelled', () => { +Deno.test('should cancel active WebAuthn ceremony when manually cancelled', () => { // Populate `.controller` WebAuthnAbortService.createNewAbortSignal(); // Spy on the existing instance of AbortController - const abortSpy = jest.fn(); + const abortSpy = spy(); // @ts-ignore: Ignore the fact that `controller` is private WebAuthnAbortService.controller.abort = abortSpy; // Cancel the in-flight ceremony, which should call `abort()` on the existing controller WebAuthnAbortService.cancelCeremony(); - expect(abortSpy).toHaveBeenCalledTimes(1); + assertSpyCalls(abortSpy, 1); // Make sure we raise an AbortError so it can be detected correctly - const abortReason = abortSpy.mock.calls[0][0]; - expect(abortReason).toBeInstanceOf(Error); - expect(abortReason.name).toEqual('AbortError'); + const abortReason = abortSpy.calls.at(0)?.args[0]; + assertInstanceOf(abortReason, Error); + assertEquals(abortReason.name, 'AbortError'); // Ensure that we don't set up a new AbortController because it's unnecessary to do so // @ts-ignore: Ignore the fact that `controller` is private - expect(WebAuthnAbortService.controller).toBeUndefined(); + assertEquals(WebAuthnAbortService.controller, undefined); }); From 08e07ba1cc3c09b4dcad45b28f3fe92e9d580788 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 14:16:20 -0800 Subject: [PATCH 046/115] Update index tests to Deno --- packages/browser/src/index.test.ts | 35 ++++++++++++++++-------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/browser/src/index.test.ts b/packages/browser/src/index.test.ts index 674540855..ff219554a 100644 --- a/packages/browser/src/index.test.ts +++ b/packages/browser/src/index.test.ts @@ -1,33 +1,36 @@ +/// +import { assert } from '@std/assert'; + import * as index from './index.ts'; -test('should export method `startRegistration`', () => { - expect(index.startRegistration).toBeDefined(); +Deno.test('should export method `startRegistration`', () => { + assert(index.startRegistration); }); -test('should export method `startAuthentication`', () => { - expect(index.startAuthentication).toBeDefined(); +Deno.test('should export method `startAuthentication`', () => { + assert(index.startAuthentication); }); -test('should export method `browserSupportsWebAuthn`', () => { - expect(index.browserSupportsWebAuthn).toBeDefined(); +Deno.test('should export method `browserSupportsWebAuthn`', () => { + assert(index.browserSupportsWebAuthn); }); -test('should export method `browserSupportsWebAuthnAutofill`', () => { - expect(index.browserSupportsWebAuthnAutofill).toBeDefined(); +Deno.test('should export method `browserSupportsWebAuthnAutofill`', () => { + assert(index.browserSupportsWebAuthnAutofill); }); -test('should export method `platformAuthenticatorIsAvailable`', () => { - expect(index.platformAuthenticatorIsAvailable).toBeDefined(); +Deno.test('should export method `platformAuthenticatorIsAvailable`', () => { + assert(index.platformAuthenticatorIsAvailable); }); -test('should export method `base64URLStringToBuffer`', () => { - expect(index.base64URLStringToBuffer).toBeDefined(); +Deno.test('should export method `base64URLStringToBuffer`', () => { + assert(index.base64URLStringToBuffer); }); -test('should export method `bufferToBase64URLString`', () => { - expect(index.bufferToBase64URLString).toBeDefined(); +Deno.test('should export method `bufferToBase64URLString`', () => { + assert(index.bufferToBase64URLString); }); -test('should export singleton `WebAuthnAbortService`', () => { - expect(index.WebAuthnAbortService).toBeDefined(); +Deno.test('should export singleton `WebAuthnAbortService`', () => { + assert(index.WebAuthnAbortService); }); From 250650812cf53e9e1fae2db7950669aa3eed64dd Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 15:23:56 -0800 Subject: [PATCH 047/115] Make it possible to stub browserSupportsWebAuthn --- .../src/helpers/__mocks__/browserSupportsWebAuthn.ts | 2 -- .../helpers/__mocks__/browserSupportsWebAuthnAutofill.ts | 2 -- packages/browser/src/helpers/browserSupportsWebAuthn.ts | 9 +++++++-- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 packages/browser/src/helpers/__mocks__/browserSupportsWebAuthn.ts delete mode 100644 packages/browser/src/helpers/__mocks__/browserSupportsWebAuthnAutofill.ts diff --git a/packages/browser/src/helpers/__mocks__/browserSupportsWebAuthn.ts b/packages/browser/src/helpers/__mocks__/browserSupportsWebAuthn.ts deleted file mode 100644 index 5751167fa..000000000 --- a/packages/browser/src/helpers/__mocks__/browserSupportsWebAuthn.ts +++ /dev/null @@ -1,2 +0,0 @@ -// We just need a simple mock so we can control whether this returns `true` or `false` -export const browserSupportsWebAuthn = jest.fn(); diff --git a/packages/browser/src/helpers/__mocks__/browserSupportsWebAuthnAutofill.ts b/packages/browser/src/helpers/__mocks__/browserSupportsWebAuthnAutofill.ts deleted file mode 100644 index 311b635e3..000000000 --- a/packages/browser/src/helpers/__mocks__/browserSupportsWebAuthnAutofill.ts +++ /dev/null @@ -1,2 +0,0 @@ -// We just need a simple mock so we can control whether this returns `true` or `false` -export const browserSupportsWebAuthnAutofill = jest.fn(); diff --git a/packages/browser/src/helpers/browserSupportsWebAuthn.ts b/packages/browser/src/helpers/browserSupportsWebAuthn.ts index f37c449dc..719102001 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthn.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthn.ts @@ -2,8 +2,13 @@ * Determine if the browser is capable of Webauthn */ export function browserSupportsWebAuthn(): boolean { - return ( + return _browserSupportsWebAuthnInternals.stubThis(( globalThis?.PublicKeyCredential !== undefined && typeof globalThis.PublicKeyCredential === 'function' - ); + )); } + +// Make it possible to stub the return value during testing +export const _browserSupportsWebAuthnInternals = { + stubThis: (value: boolean) => value, +}; From 0408a4fd7670c9b3fe454993e05344659aca5e78 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 16:13:13 -0800 Subject: [PATCH 048/115] Migrate registration tests to Deno --- .../src/helpers/identifyRegistrationError.ts | 4 +- .../src/methods/startRegistration.test.ts | 908 ++++++++++-------- 2 files changed, 500 insertions(+), 412 deletions(-) diff --git a/packages/browser/src/helpers/identifyRegistrationError.ts b/packages/browser/src/helpers/identifyRegistrationError.ts index a93574ed4..2a8c7dfb4 100644 --- a/packages/browser/src/helpers/identifyRegistrationError.ts +++ b/packages/browser/src/helpers/identifyRegistrationError.ts @@ -97,11 +97,11 @@ export function identifyRegistrationError({ cause: error, }); } else if (error.name === 'SecurityError') { - const effectiveDomain = window.location.hostname; + const effectiveDomain = globalThis.location.hostname; if (!isValidDomain(effectiveDomain)) { // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 7) return new WebAuthnError({ - message: `${window.location.hostname} is an invalid domain`, + message: `${globalThis.location.hostname} is an invalid domain`, code: 'ERROR_INVALID_DOMAIN', cause: error, }); diff --git a/packages/browser/src/methods/startRegistration.test.ts b/packages/browser/src/methods/startRegistration.test.ts index f214d621b..bf2596398 100644 --- a/packages/browser/src/methods/startRegistration.test.ts +++ b/packages/browser/src/methods/startRegistration.test.ts @@ -1,26 +1,21 @@ +/// +import { assertEquals, assertInstanceOf, assertRejects, assertStringIncludes } from '@std/assert'; +import { assertSpyCalls, type Spy, spy, stub } from '@std/testing/mock'; +import { afterEach, beforeEach, describe, it } from '@std/testing/bdd'; import { AuthenticationExtensionsClientInputs, AuthenticationExtensionsClientOutputs, PublicKeyCredentialCreationOptionsJSON, - RegistrationCredential, } from '@simplewebauthn/types'; import { generateCustomError } from '../helpers/__jest__/generateCustomError.ts'; -import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.ts'; +import { _browserSupportsWebAuthnInternals } from '../helpers/browserSupportsWebAuthn.ts'; import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.ts'; import { WebAuthnError } from '../helpers/webAuthnError.ts'; import { WebAuthnAbortService } from '../helpers/webAuthnAbortService.ts'; import { startRegistration } from './startRegistration.ts'; -jest.mock('../helpers/browserSupportsWebAuthn'); - -const mockNavigatorCreate = window.navigator.credentials.create as jest.Mock; -const mockSupportsWebauthn = browserSupportsWebAuthn as jest.Mock; - -const mockAttestationObject = 'mockAtte'; -const mockClientDataJSON = 'mockClie'; - const goodOpts1: PublicKeyCredentialCreationOptionsJSON = { challenge: '1T6uHri4OAQ', attestation: 'direct', @@ -49,294 +44,306 @@ const goodOpts1: PublicKeyCredentialCreationOptionsJSON = { ], }; -beforeEach(() => { - // Stub out a response so the method won't throw - mockNavigatorCreate.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ response: {}, getClientExtensionResults: () => ({}) }); - }); - }); +/** + * A basic method we can resolve when mocking `navigator.credentials.create()` so _something_ gets + * returned + */ +const defaultCreateResponse = async (...args: any[]) => ({ + response: {}, + getClientExtensionResults: () => ({}), +}); - mockSupportsWebauthn.mockReturnValue(true); +describe('Method: startRegistration', () => { + let createSpy: Spy; - // Reset the abort service so we get an accurate call count - WebAuthnAbortService.cancelCeremony(); -}); + beforeEach(() => { + // Stub out a response so the method won't throw + createSpy = spy(defaultCreateResponse); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; -afterEach(() => { - mockNavigatorCreate.mockReset(); - mockSupportsWebauthn.mockReset(); -}); + // Assume WebAuthn is available + _browserSupportsWebAuthnInternals.stubThis = spy(() => true); + }); -test('should convert options before passing to navigator.credentials.create(...)', async () => { - await startRegistration({ optionsJSON: goodOpts1 }); - - const argsPublicKey = mockNavigatorCreate.mock.calls[0][0].publicKey; - const credId = argsPublicKey.excludeCredentials[0].id; - - // Make sure challenge and user.id are converted to Buffers - expect(new Uint8Array(argsPublicKey.challenge)).toEqual( - new Uint8Array([213, 62, 174, 30, 184, 184, 56, 4]), - ); - expect(new Uint8Array(argsPublicKey.user.id)).toEqual( - new Uint8Array([127, 138, 93, 203, 119, 233, 3, 126]), - ); - - // Confirm construction of excludeCredentials array - expect(credId instanceof ArrayBuffer).toEqual(true); - expect(credId.byteLength).toEqual(64); - expect(argsPublicKey.excludeCredentials[0].type).toEqual('public-key'); - expect(argsPublicKey.excludeCredentials[0].transports).toEqual(['internal']); -}); + afterEach(() => { + // Reset the abort service so we get an accurate call count + WebAuthnAbortService.cancelCeremony(); + }); -test('should return base64url-encoded response values', async () => { - mockNavigatorCreate.mockImplementation( - (): Promise => { - return new Promise((resolve) => { - resolve({ - id: '6mUg8GzxDxs', - rawId: base64URLStringToBuffer('6mUg8GzxDxs'), - response: { - attestationObject: Buffer.from(mockAttestationObject, 'ascii'), - clientDataJSON: Buffer.from(mockClientDataJSON, 'ascii'), - getTransports: () => [], - getAuthenticatorData: () => new Uint8Array(), - getPublicKey: () => null, - getPublicKeyAlgorithm: () => -999, - }, - getClientExtensionResults: () => ({}), - type: 'public-key', - authenticatorAttachment: '', - }); - }); - }, - ); + it('should convert options before passing to navigator.credentials.create(...)', async () => { + await startRegistration({ optionsJSON: goodOpts1 }); + + const args = createSpy.calls.at(0)?.args[0] as CredentialCreationOptions; + const argsPublicKey = args.publicKey!; + const credId = argsPublicKey.excludeCredentials?.[0].id; + + // Make sure challenge and user.id are converted to Buffers + assertEquals( + new Uint8Array(argsPublicKey.challenge as ArrayBuffer), + new Uint8Array([213, 62, 174, 30, 184, 184, 56, 4]), + ); + assertEquals( + new Uint8Array(argsPublicKey.user.id as ArrayBuffer), + new Uint8Array([127, 138, 93, 203, 119, 233, 3, 126]), + ); + + // Confirm construction of excludeCredentials array + assertInstanceOf(credId, ArrayBuffer); + assertEquals(credId.byteLength, 64); + assertEquals(argsPublicKey.excludeCredentials?.[0].type, 'public-key'); + assertEquals(argsPublicKey.excludeCredentials?.[0].transports, ['internal']); + }); - const response = await startRegistration({ optionsJSON: goodOpts1 }); + it('should return base64url-encoded response values', async () => { + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { + create: async () => ({ + id: '6mUg8GzxDxs', + rawId: base64URLStringToBuffer('6mUg8GzxDxs'), + response: { + attestationObject: new Uint8Array([1, 2, 3, 4]), + clientDataJSON: new Uint8Array([5, 6, 7, 8]), + getTransports: () => [], + getAuthenticatorData: () => new Uint8Array(), + getPublicKey: () => null, + getPublicKeyAlgorithm: () => -999, + }, + getClientExtensionResults: () => ({}), + type: 'public-key', + authenticatorAttachment: '', + }), + }; - expect(response.rawId).toEqual('6mUg8GzxDxs'); - expect(response.response.attestationObject).toEqual('bW9ja0F0dGU'); - expect(response.response.clientDataJSON).toEqual('bW9ja0NsaWU'); -}); + const response = await startRegistration({ optionsJSON: goodOpts1 }); -test("should throw error if WebAuthn isn't supported", async () => { - mockSupportsWebauthn.mockReturnValue(false); + assertEquals(response.rawId, '6mUg8GzxDxs'); + assertEquals(response.response.attestationObject, 'AQIDBA'); + assertEquals(response.response.clientDataJSON, 'BQYHCA'); + }); - await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects.toThrow( - 'WebAuthn is not supported in this browser', - ); -}); + it("should throw error if WebAuthn isn't supported", async () => { + _browserSupportsWebAuthnInternals.stubThis = spy(() => false); -test('should throw error if attestation is cancelled for some reason', async () => { - mockNavigatorCreate.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve(null); - }); + await assertRejects( + () => startRegistration({ optionsJSON: goodOpts1 }), + Error, + 'WebAuthn is not supported in this browser', + ); }); - await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects.toThrow( - 'Registration was not completed', - ); -}); + it('should throw error if attestation is cancelled for some reason', async () => { + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: spy(async () => null) }; -test('should send extensions to authenticator if present in options', async () => { - const extensions: AuthenticationExtensionsClientInputs = { - credProps: true, - appid: 'appidHere', - // @ts-ignore: Send arbitrary extensions - uvm: true, - // @ts-ignore: Send arbitrary extensions - appidExclude: 'appidExcludeHere', - }; - const optsWithExts: PublicKeyCredentialCreationOptionsJSON = { - ...goodOpts1, - extensions, - }; - await startRegistration({ optionsJSON: optsWithExts }); - - const argsExtensions = mockNavigatorCreate.mock.calls[0][0].publicKey.extensions; - - expect(argsExtensions).toEqual(extensions); -}); + await assertRejects( + () => startRegistration({ optionsJSON: goodOpts1 }), + Error, + 'Registration was not completed', + ); + }); -test('should not set any extensions if not present in options', async () => { - await startRegistration({ optionsJSON: goodOpts1 }); + it('should send extensions to authenticator if present in options', async () => { + const extensions: AuthenticationExtensionsClientInputs = { + credProps: true, + appid: 'appidHere', + // @ts-ignore: Send arbitrary extensions + uvm: true, + // @ts-ignore: Send arbitrary extensions + appidExclude: 'appidExcludeHere', + }; - const argsExtensions = mockNavigatorCreate.mock.calls[0][0].publicKey.extensions; + const optsWithExts: PublicKeyCredentialCreationOptionsJSON = { + ...goodOpts1, + extensions, + }; - expect(argsExtensions).toEqual(undefined); -}); + await startRegistration({ optionsJSON: optsWithExts }); -test('should include extension results', async () => { - const extResults: AuthenticationExtensionsClientOutputs = { - appid: true, - credProps: { - rk: true, - }, - }; + const args = createSpy.calls.at(0)?.args[0] as CredentialCreationOptions; + const argsPublicKey = args.publicKey!; + const argsExtensions = argsPublicKey.extensions; - // Mock extension return values from authenticator - mockNavigatorCreate.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ response: {}, getClientExtensionResults: () => extResults }); - }); + assertEquals(argsExtensions, extensions); }); - // Extensions aren't present in this object, but it doesn't matter since we're faking the response - const response = await startRegistration({ optionsJSON: goodOpts1 }); + it('should not set any extensions if not present in options', async () => { + await startRegistration({ optionsJSON: goodOpts1 }); - expect(response.clientExtensionResults).toEqual(extResults); -}); - -test('should include extension results when no extensions specified', async () => { - const response = await startRegistration({ optionsJSON: goodOpts1 }); + const args = createSpy.calls.at(0)?.args[0] as CredentialCreationOptions; + const argsPublicKey = args.publicKey!; + const argsExtensions = argsPublicKey.extensions; - expect(response.clientExtensionResults).toEqual({}); -}); + assertEquals(argsExtensions, undefined); + }); -test('should support "cable" transport in excludeCredentials', async () => { - const opts: PublicKeyCredentialCreationOptionsJSON = { - ...goodOpts1, - excludeCredentials: [ - { - ...goodOpts1.excludeCredentials![0], - transports: ['cable'], + it('should include extension results', async () => { + const extResults: AuthenticationExtensionsClientOutputs = { + appid: true, + credProps: { + rk: true, }, - ], - }; + }; - await startRegistration({ optionsJSON: opts }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { + create: async () => ({ response: {}, getClientExtensionResults: () => extResults }), + }; - expect( - mockNavigatorCreate.mock.calls[0][0].publicKey.excludeCredentials[0] - .transports[0], - ).toEqual('cable'); -}); + const response = await startRegistration({ optionsJSON: goodOpts1 }); -test('should return "cable" transport from response', async () => { - mockNavigatorCreate.mockResolvedValue({ - id: '6mUg8GzxDxs', - rawId: base64URLStringToBuffer('6mUg8GzxDxs'), - response: { - attestationObject: Buffer.from(mockAttestationObject, 'ascii'), - clientDataJSON: Buffer.from(mockClientDataJSON, 'ascii'), - getTransports: () => ['cable'], - }, - getClientExtensionResults: () => ({}), - type: 'webauthn.create', + assertEquals(response.clientExtensionResults, extResults); }); - const regResponse = await startRegistration({ optionsJSON: goodOpts1 }); + it('should include extension results when no extensions specified', async () => { + const response = await startRegistration({ optionsJSON: goodOpts1 }); - expect(regResponse.response.transports).toEqual(['cable']); -}); + assertEquals(response.clientExtensionResults, {}); + }); -test('should cancel an existing call when executed again', async () => { - const abortSpy = jest.spyOn(AbortController.prototype, 'abort'); + it('should support "cable" transport in excludeCredentials', async () => { + const opts: PublicKeyCredentialCreationOptionsJSON = { + ...goodOpts1, + excludeCredentials: [ + { + ...goodOpts1.excludeCredentials![0], + transports: ['cable'], + }, + ], + }; - // Fire off a request and immediately attempt a second one - startRegistration({ optionsJSON: goodOpts1 }); - await startRegistration({ optionsJSON: goodOpts1 }); - expect(abortSpy).toHaveBeenCalledTimes(1); -}); + await startRegistration({ optionsJSON: opts }); + + const args = createSpy.calls.at(0)?.args[0] as CredentialCreationOptions; + const argsPublicKey = args.publicKey!; + + assertEquals( + argsPublicKey?.excludeCredentials?.[0].transports?.[0], + 'cable', + ); + }); + + it('should return "cable" transport from response', async () => { + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { + create: async () => ({ + id: '6mUg8GzxDxs', + rawId: base64URLStringToBuffer('6mUg8GzxDxs'), + response: { + attestationObject: new Uint8Array([1, 2, 3, 4]), + clientDataJSON: new Uint8Array([1, 2, 3, 4]), + getTransports: () => ['cable'], + }, + getClientExtensionResults: () => ({}), + type: 'webauthn.create', + }), + }; + + const regResponse = await startRegistration({ optionsJSON: goodOpts1 }); -test('should return authenticatorAttachment if present', async () => { - // Mock extension return values from authenticator - mockNavigatorCreate.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ + assertEquals(regResponse.response.transports, ['cable']); + }); + + it('should cancel an existing call when executed again', async () => { + const abortSpy = spy(AbortController.prototype, 'abort'); + + // Fire off a request and immediately attempt a second one + startRegistration({ optionsJSON: goodOpts1 }); + await startRegistration({ optionsJSON: goodOpts1 }); + assertSpyCalls(abortSpy, 1); + }); + + it('should return authenticatorAttachment if present', async () => { + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { + create: async () => ({ response: {}, getClientExtensionResults: () => {}, authenticatorAttachment: 'cross-platform', - }); - }); - }); + }), + }; - const response = await startRegistration({ optionsJSON: goodOpts1 }); + const response = await startRegistration({ optionsJSON: goodOpts1 }); - expect(response.authenticatorAttachment).toEqual('cross-platform'); -}); + assertEquals(response.authenticatorAttachment, 'cross-platform'); + }); -test('should return convenience values if getters present', async () => { - /** - * I call them "convenience values" because the getters for public key algorithm, - * public key bytes, and authenticator data are alternative ways to access information - * that's already buried in the response. - */ - // Mock extension return values from authenticator - mockNavigatorCreate.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ + it('should return convenience values if getters present', async () => { + /** + * I call them "convenience values" because the getters for public key algorithm, + * public key bytes, and authenticator data are alternative ways to access information + * that's already buried in the response. + */ + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { + create: async () => ({ response: { getPublicKeyAlgorithm: () => 777, getPublicKey: () => new Uint8Array([0, 0, 0, 0]).buffer, getAuthenticatorData: () => new Uint8Array([0, 0, 0, 0]).buffer, }, getClientExtensionResults: () => {}, - }); - }); - }); + }), + }; - const response = await startRegistration({ optionsJSON: goodOpts1 }); + const response = await startRegistration({ optionsJSON: goodOpts1 }); - expect(response.response.publicKeyAlgorithm).toEqual(777); - expect(response.response.publicKey).toEqual('AAAAAA'); - expect(response.response.authenticatorData).toEqual('AAAAAA'); -}); + assertEquals(response.response.publicKeyAlgorithm, 777); + assertEquals(response.response.publicKey, 'AAAAAA'); + assertEquals(response.response.authenticatorData, 'AAAAAA'); + }); -test('should not return convenience values if getters missing', async () => { - /** - * I call them "convenience values" because the getters for public key algorithm, - * public key bytes, and authenticator data are alternative ways to access information - * that's already buried in the response. - */ - // Mock extension return values from authenticator - mockNavigatorCreate.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ + it('should not return convenience values if getters missing', async () => { + /** + * I call them "convenience values" because the getters for public key algorithm, + * public key bytes, and authenticator data are alternative ways to access information + * that's already buried in the response. + */ + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { + create: async () => ({ response: {}, getClientExtensionResults: () => {}, - }); - }); - }); + }), + }; - const response = await startRegistration({ optionsJSON: goodOpts1 }); + const response = await startRegistration({ optionsJSON: goodOpts1 }); - expect(response.response.publicKeyAlgorithm).toBeUndefined(); - expect(response.response.publicKey).toBeUndefined(); - expect(response.response.authenticatorData).toBeUndefined(); -}); + assertEquals(response.response.publicKeyAlgorithm, undefined); + assertEquals(response.response.publicKey, undefined); + assertEquals(response.response.authenticatorData, undefined); + }); -test('should survive browser extensions that intercept WebAuthn and incorrectly implement public key value getters', async () => { - /** - * 1Password browser extension v2.15.1 (the one that introduced passkeys support) seemed to have - * implemented the following methods on AuthenticatorAttestationResponse... - * - * - getPublicKeyAlgorithm() - * - getPublicKey() - * - getAuthenticatorData() - * - * ...But when you attempt to call them as methods they'll error out with `TypeError`'s: - * - * Safari: - * > TypeError: Can only call AuthenticatorAttestationResponse.getPublicKeyAlgorithm on instances - * > of AuthenticatorAttestationResponse - * - * Chrome: - * > TypeError: Illegal invocation - * - * Firefox: - * > N/A (it handled it fine for some reason) - * - * Make sure `startRegistration()` can survive this scenario. - * - * See https://github.com/MasterKale/SimpleWebAuthn/issues/438 for more context. - */ - - // Mock extension return values from the browser extension intercepting WebAuthn - mockNavigatorCreate.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ + it('should survive browser extensions that intercept WebAuthn and incorrectly implement public key value getters', async () => { + /** + * 1Password browser extension v2.15.1 (the one that introduced passkeys support) seemed to have + * implemented the following methods on AuthenticatorAttestationResponse... + * + * - getPublicKeyAlgorithm() + * - getPublicKey() + * - getAuthenticatorData() + * + * ...But when you attempt to call them as methods they'll error out with `TypeError`'s: + * + * Safari: + * > TypeError: Can only call AuthenticatorAttestationResponse.getPublicKeyAlgorithm on instances + * > of AuthenticatorAttestationResponse + * + * Chrome: + * > TypeError: Illegal invocation + * + * Firefox: + * > N/A (it handled it fine for some reason) + * + * Make sure `startRegistration()` can survive this scenario. + * + * See https://github.com/MasterKale/SimpleWebAuthn/issues/438 for more context. + */ + + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { + create: async () => ({ + // Mock extension return values from the browser extension intercepting WebAuthn response: { getPublicKeyAlgorithm: () => { throw new Error('I throw for some reason'); @@ -349,54 +356,70 @@ test('should survive browser extensions that intercept WebAuthn and incorrectly }, }, getClientExtensionResults: () => {}, - }); - }); - }); + }), + }; - await expect(startRegistration({ optionsJSON: goodOpts1 })).resolves; + // Quiet down the `console.warn()` output when the getters above throw + const stubConsoleWarn = stub(console, 'warn'); - const response = await startRegistration({ optionsJSON: goodOpts1 }); + const response = await startRegistration({ optionsJSON: goodOpts1 }); - expect(response.response.publicKeyAlgorithm).toBeUndefined(); - expect(response.response.publicKey).toBeUndefined(); - expect(response.response.authenticatorData).toBeUndefined(); -}); + assertEquals(response.response.publicKeyAlgorithm, undefined); + assertEquals(response.response.publicKey, undefined); + assertEquals(response.response.authenticatorData, undefined); + + stubConsoleWarn.restore(); + }); -test('should automatically register a.k.a. Conditional Create', async () => { - await startRegistration({ optionsJSON: goodOpts1, useAutoRegister: true }); + it('should automatically register a.k.a. Conditional Create', async () => { + await startRegistration({ optionsJSON: goodOpts1, useAutoRegister: true }); - // The most important bit - expect(mockNavigatorCreate.mock.calls[0][0].mediation).toEqual('conditional'); + const args = createSpy.calls.at(0)?.args[0] as CredentialCreationOptions; + const argsMediation = (args as any).mediation; + + // The most important bit + assertEquals(argsMediation, 'conditional'); + }); }); describe('WebAuthnError', () => { - describe('AbortError', () => { - const AbortError = generateCustomError('AbortError'); - /** - * We can't actually test this because nothing in startRegistration() propagates the abort - * signal. But if you invoked WebAuthn via this and then manually sent an abort signal I guess - * this will catch. - * - * As a matter of fact I couldn't actually get any browser to respect the abort signal... - */ - test.skip('should identify abort signal', async () => { - mockNavigatorCreate.mockRejectedValueOnce(AbortError); - - const rejected = await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/abort signal/i); - rejected.toThrow(/AbortError/); - rejected.toHaveProperty('code', 'ERROR_CEREMONY_ABORTED'); - rejected.toHaveProperty('cause', AbortError); - }); + beforeEach(() => { + _browserSupportsWebAuthnInternals.stubThis = spy(() => true); }); + // describe('AbortError', () => { + // const AbortError = generateCustomError('AbortError'); + // /** + // * We can't actually test this because nothing in startRegistration() propagates the abort + // * signal. But if you invoked WebAuthn via this and then manually sent an abort signal I guess + // * this will catch. + // * + // * As a matter of fact I couldn't actually get any browser to respect the abort signal... + // */ + // Deno.test('should identify abort signal', async () => { + // mockNavigatorCreate.mockRejectedValueOnce(AbortError); + + // const rejected = await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects; + // rejected.toThrow(WebAuthnError); + // rejected.toThrow(/abort signal/i); + // rejected.toThrow(/AbortError/); + // rejected.toHaveProperty('code', 'ERROR_CEREMONY_ABORTED'); + // rejected.toHaveProperty('cause', AbortError); + // }); + // }); + describe('ConstraintError', () => { const ConstraintError = generateCustomError('ConstraintError'); - test('should identify unsupported discoverable credentials', async () => { - mockNavigatorCreate.mockRejectedValueOnce(ConstraintError); + beforeEach(() => { + const createSpy = spy(async () => { + throw ConstraintError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; + }); + it('should identify unsupported discoverable credentials', async () => { const opts: PublicKeyCredentialCreationOptionsJSON = { ...goodOpts1, authenticatorSelection: { @@ -405,21 +428,23 @@ describe('WebAuthnError', () => { }, }; - const rejected = await expect(startRegistration({ optionsJSON: opts })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/discoverable credentials were required/i); - rejected.toThrow(/no available authenticator supported/i); - rejected.toHaveProperty('name', 'ConstraintError'); - rejected.toHaveProperty( - 'code', - 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT', + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: opts }), + WebAuthnError, ); - rejected.toHaveProperty('cause', ConstraintError); - }); - test('should identify unsupported user verification', async () => { - mockNavigatorCreate.mockRejectedValueOnce(ConstraintError); + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes( + rejected.message.toLowerCase(), + 'discoverable credentials were required', + ); + assertStringIncludes(rejected.message.toLowerCase(), 'no available authenticator supported'); + assertEquals(rejected.name, 'ConstraintError'); + assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT'); + assertEquals(rejected.cause, ConstraintError); + }); + it('should identify unsupported user verification', async () => { const opts: PublicKeyCredentialCreationOptionsJSON = { ...goodOpts1, authenticatorSelection: { @@ -427,21 +452,20 @@ describe('WebAuthnError', () => { }, }; - const rejected = await expect(startRegistration({ optionsJSON: opts })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/user verification was required/i); - rejected.toThrow(/no available authenticator supported/i); - rejected.toHaveProperty('name', 'ConstraintError'); - rejected.toHaveProperty( - 'code', - 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT', + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: opts }), + WebAuthnError, ); - rejected.toHaveProperty('cause', ConstraintError); - }); - test('should identify unsupported user verification during auto registration', async () => { - mockNavigatorCreate.mockRejectedValueOnce(ConstraintError); + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), 'user verification was required'); + assertStringIncludes(rejected.message.toLowerCase(), 'no available authenticator supported'); + assertEquals(rejected.name, 'ConstraintError'); + assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT'); + assertEquals(rejected.cause, ConstraintError); + }); + it('should identify unsupported user verification during auto registration', async () => { const opts: PublicKeyCredentialCreationOptionsJSON = { ...goodOpts1, authenticatorSelection: { @@ -449,41 +473,51 @@ describe('WebAuthnError', () => { }, }; - const rejected = await expect(startRegistration({ optionsJSON: opts, useAutoRegister: true })) - .rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/user verification was required during automatic registration/i); - rejected.toThrow(/could not be performed/i); - rejected.toHaveProperty('name', 'ConstraintError'); - rejected.toHaveProperty( - 'code', - 'ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE', + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: opts, useAutoRegister: true }), + WebAuthnError, + ); + + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes( + rejected.message.toLowerCase(), + 'user verification was required during automatic registration', ); - rejected.toHaveProperty('cause', ConstraintError); + assertStringIncludes(rejected.message.toLowerCase(), 'could not be performed'); + assertEquals(rejected.name, 'ConstraintError'); + assertEquals(rejected.code, 'ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE'); + assertEquals(rejected.cause, ConstraintError); }); }); describe('InvalidStateError', () => { const InvalidStateError = generateCustomError('InvalidStateError'); - test('should identify re-registration attempt', async () => { - mockNavigatorCreate.mockRejectedValueOnce(InvalidStateError); - - const rejected = await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/authenticator/i); - rejected.toThrow(/previously registered/i); - rejected.toHaveProperty('name', 'InvalidStateError'); - rejected.toHaveProperty( - 'code', - 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED', + beforeEach(() => { + const createSpy = spy(async () => { + throw InvalidStateError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; + }); + + it('should identify re-registration attempt', async () => { + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: goodOpts1 }), + WebAuthnError, ); - rejected.toHaveProperty('cause', InvalidStateError); + + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), 'authenticator'); + assertStringIncludes(rejected.message.toLowerCase(), 'previously registered'); + assertEquals(rejected.name, 'InvalidStateError'); + assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED'); + assertEquals(rejected.cause, InvalidStateError); }); }); describe('NotAllowedError', () => { - test('should pass through error message (iOS Safari - Operation failed)', async () => { + it('should pass through error message (iOS Safari - Operation failed)', async () => { /** * Thrown when biometric is not enrolled, or a Safari bug prevents conditional UI from being * aborted properly between page reloads. @@ -494,17 +528,26 @@ describe('WebAuthnError', () => { 'NotAllowedError', 'Operation failed.', ); - mockNavigatorCreate.mockRejectedValueOnce(NotAllowedError); - - const rejected = await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(Error); - rejected.toThrow(/operation failed/i); - rejected.toHaveProperty('name', 'NotAllowedError'); - rejected.toHaveProperty('code', 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); - rejected.toHaveProperty('cause', NotAllowedError); + + const createSpy = spy(async () => { + throw NotAllowedError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; + + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: goodOpts1 }), + WebAuthnError, + ); + + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), 'operation failed'); + assertEquals(rejected.name, 'NotAllowedError'); + assertEquals(rejected.code, 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); + assertEquals(rejected.cause, NotAllowedError); }); - test('should pass through error message (Chrome M110 - Bad TLS Cert)', async () => { + it('should pass through error message (Chrome M110 - Bad TLS Cert)', async () => { /** * Starting from Chrome M110, WebAuthn is blocked if the site is being displayed on a URL with * TLS certificate issues. This includes during development. @@ -515,104 +558,132 @@ describe('WebAuthnError', () => { 'NotAllowedError', 'WebAuthn is not supported on sites with TLS certificate errors.', ); - mockNavigatorCreate.mockRejectedValueOnce(NotAllowedError); - - const rejected = await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(Error); - rejected.toThrow(/sites with TLS certificate errors/i); - rejected.toHaveProperty('name', 'NotAllowedError'); - rejected.toHaveProperty('code', 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); - rejected.toHaveProperty('cause', NotAllowedError); + + const createSpy = spy(async () => { + throw NotAllowedError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; + + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: goodOpts1 }), + WebAuthnError, + ); + + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), 'sites with tls certificate errors'); + assertEquals(rejected.name, 'NotAllowedError'); + assertEquals(rejected.code, 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); + assertEquals(rejected.cause, NotAllowedError); }); }); describe('NotSupportedError', () => { const NotSupportedError = generateCustomError('NotSupportedError'); - test('should identify missing "public-key" entries in pubKeyCredParams', async () => { - mockNavigatorCreate.mockRejectedValueOnce(NotSupportedError); + beforeEach(() => { + const createSpy = spy(async () => { + throw NotSupportedError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; + }); + it('should identify missing "public-key" entries in pubKeyCredParams', async () => { const opts = { ...goodOpts1, pubKeyCredParams: [], }; - const rejected = await expect(startRegistration({ optionsJSON: opts })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/pubKeyCredParams/i); - rejected.toThrow(/public-key/i); - rejected.toHaveProperty('name', 'NotSupportedError'); - rejected.toHaveProperty('code', 'ERROR_MALFORMED_PUBKEYCREDPARAMS'); - rejected.toHaveProperty('cause', NotSupportedError); - }); + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: opts }), + WebAuthnError, + ); - test('should identify no authenticator supports algs in pubKeyCredParams', async () => { - mockNavigatorCreate.mockRejectedValueOnce(NotSupportedError); + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), 'pubkeycredparams'); + assertStringIncludes(rejected.message.toLowerCase(), 'public-key'); + assertEquals(rejected.name, 'NotSupportedError'); + assertEquals(rejected.code, 'ERROR_MALFORMED_PUBKEYCREDPARAMS'); + assertEquals(rejected.cause, NotSupportedError); + }); + it('should identify no authenticator supports algs in pubKeyCredParams', async () => { const opts: PublicKeyCredentialCreationOptionsJSON = { ...goodOpts1, pubKeyCredParams: [{ alg: -7, type: 'public-key' }], }; - const rejected = await expect(startRegistration({ optionsJSON: opts })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/No available authenticator/i); - rejected.toThrow(/pubKeyCredParams/i); - rejected.toHaveProperty('name', 'NotSupportedError'); - rejected.toHaveProperty( - 'code', - 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG', + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: opts }), + WebAuthnError, ); - rejected.toHaveProperty('cause', NotSupportedError); + + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), 'no available authenticator'); + assertStringIncludes(rejected.message.toLowerCase(), 'pubkeycredparams'); + assertEquals(rejected.name, 'NotSupportedError'); + assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG'); + assertEquals(rejected.cause, NotSupportedError); }); }); describe('SecurityError', () => { const SecurityError = generateCustomError('SecurityError'); - let _originalHostName: string; - beforeEach(() => { - _originalHostName = window.location.hostname; - }); + const createSpy = spy(async () => { + throw SecurityError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; - afterEach(() => { - window.location.hostname = _originalHostName; + // @ts-ignore + globalThis.location = { hostname: '' } as unknown; }); - test('should identify invalid domain', async () => { - window.location.hostname = '1.2.3.4'; + it('should identify invalid domain', async () => { + globalThis.location.hostname = '1.2.3.4'; - mockNavigatorCreate.mockRejectedValueOnce(SecurityError); + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: goodOpts1 }), + WebAuthnError, + ); - const rejected = await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrowError(WebAuthnError); - rejected.toThrow(/1\.2\.3\.4/); - rejected.toThrow(/invalid domain/i); - rejected.toHaveProperty('name', 'SecurityError'); - rejected.toHaveProperty('code', 'ERROR_INVALID_DOMAIN'); - rejected.toHaveProperty('cause', SecurityError); + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), '1.2.3.4'); + assertStringIncludes(rejected.message.toLowerCase(), 'invalid domain'); + assertEquals(rejected.name, 'SecurityError'); + assertEquals(rejected.code, 'ERROR_INVALID_DOMAIN'); + assertEquals(rejected.cause, SecurityError); }); - test('should identify invalid RP ID', async () => { - window.location.hostname = 'simplewebauthn.com'; + it('should identify invalid RP ID', async () => { + globalThis.location.hostname = 'simplewebauthn.com'; - mockNavigatorCreate.mockRejectedValueOnce(SecurityError); + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: goodOpts1 }), + WebAuthnError, + ); - const rejected = await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrowError(WebAuthnError); - rejected.toThrow(goodOpts1.rp.id); - rejected.toThrow(/invalid for this domain/i); - rejected.toHaveProperty('name', 'SecurityError'); - rejected.toHaveProperty('code', 'ERROR_INVALID_RP_ID'); - rejected.toHaveProperty('cause', SecurityError); + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), `${goodOpts1.rp.id}`); + assertStringIncludes(rejected.message.toLowerCase(), 'invalid for this domain'); + assertEquals(rejected.name, 'SecurityError'); + assertEquals(rejected.code, 'ERROR_INVALID_RP_ID'); + assertEquals(rejected.cause, SecurityError); }); }); describe('TypeError', () => { - test('should identify malformed user ID', async () => { + it('should identify malformed user ID', async () => { const typeError = new TypeError('user id is bad'); - mockNavigatorCreate.mockRejectedValueOnce(typeError); + + const createSpy = spy(async () => { + throw typeError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; const opts = { ...goodOpts1, @@ -623,30 +694,47 @@ describe('WebAuthnError', () => { }, }; - const rejected = await expect(startRegistration({ optionsJSON: opts })).rejects; - rejected.toThrowError(WebAuthnError); - rejected.toThrow(/user id/i); - rejected.toThrow(/not between 1 and 64 characters/i); - rejected.toHaveProperty('name', 'TypeError'); - rejected.toHaveProperty('code', 'ERROR_INVALID_USER_ID_LENGTH'); - rejected.toHaveProperty('cause', typeError); + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: opts }), + WebAuthnError, + ); + + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), `user id`); + assertStringIncludes(rejected.message.toLowerCase(), 'not between 1 and 64 characters'); + assertEquals(rejected.name, 'TypeError'); + assertEquals(rejected.code, 'ERROR_INVALID_USER_ID_LENGTH'); + assertEquals(rejected.cause, typeError); }); }); describe('UnknownError', () => { const UnknownError = generateCustomError('UnknownError'); - test('should identify potential authenticator issues', async () => { - mockNavigatorCreate.mockRejectedValueOnce(UnknownError); - - const rejected = await expect(startRegistration({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/authenticator/i); - rejected.toThrow(/unable to process the specified options/i); - rejected.toThrow(/could not create a new credential/i); - rejected.toHaveProperty('name', 'UnknownError'); - rejected.toHaveProperty('code', 'ERROR_AUTHENTICATOR_GENERAL_ERROR'); - rejected.toHaveProperty('cause', UnknownError); + beforeEach(() => { + const createSpy = spy(async () => { + throw UnknownError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { create: createSpy }; + }); + + it('should identify potential authenticator issues', async () => { + const rejected = await assertRejects( + () => startRegistration({ optionsJSON: goodOpts1 }), + WebAuthnError, + ); + + assertInstanceOf(rejected, WebAuthnError); + assertStringIncludes(rejected.message.toLowerCase(), `authenticator`); + assertStringIncludes( + rejected.message.toLowerCase(), + 'unable to process the specified options', + ); + assertStringIncludes(rejected.message.toLowerCase(), 'could not create a new credential'); + assertEquals(rejected.name, 'UnknownError'); + assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_GENERAL_ERROR'); + assertEquals(rejected.cause, UnknownError); }); }); }); From 118f0aba465e5ca1de4adbcbf7e89c6b6ec5ceb4 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 22:25:50 -0800 Subject: [PATCH 049/115] Enable stubbing browserSupportsWebAuthnAutofill --- .../helpers/browserSupportsWebAuthnAutofill.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts index 1b98c72cc..77a1257c9 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts @@ -8,7 +8,9 @@ import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.ts'; */ export function browserSupportsWebAuthnAutofill(): Promise { if (!browserSupportsWebAuthn()) { - return new Promise((resolve) => resolve(false)); + return _browserSupportsWebAuthnAutofillInternals.stubThis( + new Promise((resolve) => resolve(false)), + ); } /** @@ -21,8 +23,17 @@ export function browserSupportsWebAuthnAutofill(): Promise { .PublicKeyCredential as unknown as PublicKeyCredentialFuture; if (globalPublicKeyCredential.isConditionalMediationAvailable === undefined) { - return new Promise((resolve) => resolve(false)); + return _browserSupportsWebAuthnAutofillInternals.stubThis( + new Promise((resolve) => resolve(false)), + ); } - return globalPublicKeyCredential.isConditionalMediationAvailable(); + return _browserSupportsWebAuthnAutofillInternals.stubThis( + globalPublicKeyCredential.isConditionalMediationAvailable(), + ); } + +// Make it possible to stub the return value during testing +export const _browserSupportsWebAuthnAutofillInternals = { + stubThis: (value: Promise) => value, +}; From c6f28c3522e58e2b4c2dbc8b8789e0a50189da73 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 22:26:03 -0800 Subject: [PATCH 050/115] Delete Jest configs --- packages/browser/jest-environment.js | 29 ---------------------------- packages/browser/jest.config.js | 7 ------- packages/browser/src/setupTests.ts | 27 -------------------------- 3 files changed, 63 deletions(-) delete mode 100644 packages/browser/jest-environment.js delete mode 100644 packages/browser/jest.config.js delete mode 100644 packages/browser/src/setupTests.ts diff --git a/packages/browser/jest-environment.js b/packages/browser/jest-environment.js deleted file mode 100644 index 61cf72747..000000000 --- a/packages/browser/jest-environment.js +++ /dev/null @@ -1,29 +0,0 @@ -import { TestEnvironment } from 'jest-environment-jsdom'; - -/** - * Set up a custom JSDOM-based test environment for Jest so we can add things JSDOM doesn't support - */ -class CustomTestEnvironment extends TestEnvironment { - async setup() { - await super.setup(); - /** - * JSDOM doesn't implement TextEncoder so we need to fake it with Node's - * - * Solved thanks to https://stackoverflow.com/a/57713960/2133271 - */ - if (typeof this.global.TextEncoder === 'undefined') { - const { TextEncoder } = await import('util'); - this.global.TextEncoder = TextEncoder; - } - - /** - * Add support for TextDecoder to JSDOM - */ - if (typeof this.global.TextDecoder === 'undefined') { - const { TextDecoder } = await import('util'); - this.global.TextDecoder = TextDecoder; - } - } -} - -export default CustomTestEnvironment; diff --git a/packages/browser/jest.config.js b/packages/browser/jest.config.js deleted file mode 100644 index 8cfc5e43d..000000000 --- a/packages/browser/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - preset: 'ts-jest', - collectCoverageFrom: ['/src/**/*.{js,ts}'], - coverageDirectory: 'coverage', - testEnvironment: '/jest-environment.js', - setupFilesAfterEnv: ['/src/setupTests.ts'], -}; diff --git a/packages/browser/src/setupTests.ts b/packages/browser/src/setupTests.ts deleted file mode 100644 index db41d5742..000000000 --- a/packages/browser/src/setupTests.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Silence some console output -// jest.spyOn(console, 'log').mockImplementation(); -// jest.spyOn(console, 'debug').mockImplementation(); -// jest.spyOn(console, 'error').mockImplementation(); -jest.spyOn(console, 'warn').mockImplementation(); - -/** - * JSDom doesn't seem to support `credentials`, so let's define them here so we can mock their - * implementations in specific tests. - */ -Object.defineProperty(globalThis.window.navigator, 'credentials', { - writable: true, - value: { - create: jest.fn(), - get: jest.fn(), - }, -}); - -/** - * Allow for setting values to `window.location.hostname` - */ -Object.defineProperty(window, 'location', { - writable: true, - value: { - hostname: '', - }, -}); From e3efafd7400e549a486379bd8f8fe6bf1670d199 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 22:30:05 -0800 Subject: [PATCH 051/115] Manually run `deno fmt` on browser --- .../src/helpers/browserSupportsWebAuthn.test.ts | 8 ++++---- .../browser/src/helpers/browserSupportsWebAuthn.ts | 6 +++--- .../helpers/platformAuthenticatorIsAvailable.test.ts | 10 +++++++--- .../browser/src/helpers/webAuthnAbortService.test.ts | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/browser/src/helpers/browserSupportsWebAuthn.test.ts b/packages/browser/src/helpers/browserSupportsWebAuthn.test.ts index 605dbd38b..ef681e21e 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthn.test.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthn.test.ts @@ -1,18 +1,18 @@ /// -import { assert, assertFalse, assertEquals } from '@std/assert'; +import { assert, assertEquals, assertFalse } from '@std/assert'; import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.ts'; Deno.test('should return true when browser supports WebAuthn', () => { // @ts-ignore: Stubbing out PublicKeyCredential so it exists globalThis.PublicKeyCredential = () => {}; - assert(browserSupportsWebAuthn()) + assert(browserSupportsWebAuthn()); }); Deno.test('should return false when browser does not support WebAuthn', () => { // This looks weird but it appeases the linter so it's _fiiiine_ delete (globalThis as { PublicKeyCredential: unknown }).PublicKeyCredential; - assertFalse(browserSupportsWebAuthn()) + assertFalse(browserSupportsWebAuthn()); }); Deno.test('should return false when window is undefined', () => { @@ -21,5 +21,5 @@ Deno.test('should return false when window is undefined', () => { globalThis = undefined; assertEquals(globalThis, undefined); - assertFalse(browserSupportsWebAuthn()) + assertFalse(browserSupportsWebAuthn()); }); diff --git a/packages/browser/src/helpers/browserSupportsWebAuthn.ts b/packages/browser/src/helpers/browserSupportsWebAuthn.ts index 719102001..dc0b4c130 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthn.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthn.ts @@ -2,10 +2,10 @@ * Determine if the browser is capable of Webauthn */ export function browserSupportsWebAuthn(): boolean { - return _browserSupportsWebAuthnInternals.stubThis(( + return _browserSupportsWebAuthnInternals.stubThis( globalThis?.PublicKeyCredential !== undefined && - typeof globalThis.PublicKeyCredential === 'function' - )); + typeof globalThis.PublicKeyCredential === 'function', + ); } // Make it possible to stub the return value during testing diff --git a/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts b/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts index 2c0b81e90..c48d33ff2 100644 --- a/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts +++ b/packages/browser/src/helpers/platformAuthenticatorIsAvailable.test.ts @@ -1,5 +1,5 @@ /// -import { assert, assertFalse, assertEquals } from '@std/assert'; +import { assert, assertEquals, assertFalse } from '@std/assert'; import { spy } from '@std/testing/mock'; import { platformAuthenticatorIsAvailable } from './platformAuthenticatorIsAvailable.ts'; @@ -7,7 +7,9 @@ import { platformAuthenticatorIsAvailable } from './platformAuthenticatorIsAvail Deno.test('should return true when platform authenticator is available', async () => { // @ts-ignore: Stubbing out PublicKeyCredential so it exists globalThis.PublicKeyCredential = () => {}; - globalThis.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable = spy(async () => true); + globalThis.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable = spy(async () => + true + ); const isAvailable = await platformAuthenticatorIsAvailable(); @@ -17,7 +19,9 @@ Deno.test('should return true when platform authenticator is available', async ( Deno.test('should return false when platform authenticator is unavailable', async () => { // @ts-ignore: Stubbing out PublicKeyCredential so it exists globalThis.PublicKeyCredential = () => {}; - globalThis.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable = spy(async () => false); + globalThis.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable = spy(async () => + false + ); const isAvailable = await platformAuthenticatorIsAvailable(); diff --git a/packages/browser/src/helpers/webAuthnAbortService.test.ts b/packages/browser/src/helpers/webAuthnAbortService.test.ts index 59d2a87a2..ccc221b68 100644 --- a/packages/browser/src/helpers/webAuthnAbortService.test.ts +++ b/packages/browser/src/helpers/webAuthnAbortService.test.ts @@ -1,4 +1,4 @@ -import { assertEquals, assertNotEquals, assertInstanceOf } from '@std/assert'; +import { assertEquals, assertInstanceOf, assertNotEquals } from '@std/assert'; import { assertSpyCalls, spy } from '@std/testing/mock'; import { WebAuthnAbortService } from './webAuthnAbortService.ts'; From 00cdb23455c99b5c31f03c3bf214a1a05eecc3bc Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 5 Nov 2024 22:49:40 -0800 Subject: [PATCH 052/115] Clean up stubbing in registration tests --- .../src/methods/startRegistration.test.ts | 144 ++++++++---------- 1 file changed, 65 insertions(+), 79 deletions(-) diff --git a/packages/browser/src/methods/startRegistration.test.ts b/packages/browser/src/methods/startRegistration.test.ts index bf2596398..091181555 100644 --- a/packages/browser/src/methods/startRegistration.test.ts +++ b/packages/browser/src/methods/startRegistration.test.ts @@ -63,7 +63,7 @@ describe('Method: startRegistration', () => { globalThis.navigator.credentials = { create: createSpy }; // Assume WebAuthn is available - _browserSupportsWebAuthnInternals.stubThis = spy(() => true); + _browserSupportsWebAuthnInternals.stubThis = () => true; }); afterEach(() => { @@ -96,24 +96,21 @@ describe('Method: startRegistration', () => { }); it('should return base64url-encoded response values', async () => { - // @ts-ignore: Super lame, making me stub out credman like this - globalThis.navigator.credentials = { - create: async () => ({ - id: '6mUg8GzxDxs', - rawId: base64URLStringToBuffer('6mUg8GzxDxs'), - response: { - attestationObject: new Uint8Array([1, 2, 3, 4]), - clientDataJSON: new Uint8Array([5, 6, 7, 8]), - getTransports: () => [], - getAuthenticatorData: () => new Uint8Array(), - getPublicKey: () => null, - getPublicKeyAlgorithm: () => -999, - }, - getClientExtensionResults: () => ({}), - type: 'public-key', - authenticatorAttachment: '', - }), - }; + globalThis.navigator.credentials.create = async () => ({ + id: '6mUg8GzxDxs', + rawId: base64URLStringToBuffer('6mUg8GzxDxs'), + response: { + attestationObject: new Uint8Array([1, 2, 3, 4]), + clientDataJSON: new Uint8Array([5, 6, 7, 8]), + getTransports: () => [], + getAuthenticatorData: () => new Uint8Array(), + getPublicKey: () => null, + getPublicKeyAlgorithm: () => -999, + }, + getClientExtensionResults: () => ({}), + type: 'public-key', + authenticatorAttachment: '', + }); const response = await startRegistration({ optionsJSON: goodOpts1 }); @@ -123,7 +120,7 @@ describe('Method: startRegistration', () => { }); it("should throw error if WebAuthn isn't supported", async () => { - _browserSupportsWebAuthnInternals.stubThis = spy(() => false); + _browserSupportsWebAuthnInternals.stubThis = () => false; await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), @@ -133,8 +130,7 @@ describe('Method: startRegistration', () => { }); it('should throw error if attestation is cancelled for some reason', async () => { - // @ts-ignore: Super lame, making me stub out credman like this - globalThis.navigator.credentials = { create: spy(async () => null) }; + globalThis.navigator.credentials.create = async () => null; await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), @@ -186,9 +182,10 @@ describe('Method: startRegistration', () => { }; // @ts-ignore: Super lame, making me stub out credman like this - globalThis.navigator.credentials = { - create: async () => ({ response: {}, getClientExtensionResults: () => extResults }), - }; + globalThis.navigator.credentials.create = async () => ({ + response: {}, + getClientExtensionResults: () => extResults, + }); const response = await startRegistration({ optionsJSON: goodOpts1 }); @@ -224,20 +221,17 @@ describe('Method: startRegistration', () => { }); it('should return "cable" transport from response', async () => { - // @ts-ignore: Super lame, making me stub out credman like this - globalThis.navigator.credentials = { - create: async () => ({ - id: '6mUg8GzxDxs', - rawId: base64URLStringToBuffer('6mUg8GzxDxs'), - response: { - attestationObject: new Uint8Array([1, 2, 3, 4]), - clientDataJSON: new Uint8Array([1, 2, 3, 4]), - getTransports: () => ['cable'], - }, - getClientExtensionResults: () => ({}), - type: 'webauthn.create', - }), - }; + globalThis.navigator.credentials.create = async () => ({ + id: '6mUg8GzxDxs', + rawId: base64URLStringToBuffer('6mUg8GzxDxs'), + response: { + attestationObject: new Uint8Array([1, 2, 3, 4]), + clientDataJSON: new Uint8Array([1, 2, 3, 4]), + getTransports: () => ['cable'], + }, + getClientExtensionResults: () => ({}), + type: 'webauthn.create', + }); const regResponse = await startRegistration({ optionsJSON: goodOpts1 }); @@ -255,13 +249,11 @@ describe('Method: startRegistration', () => { it('should return authenticatorAttachment if present', async () => { // @ts-ignore: Super lame, making me stub out credman like this - globalThis.navigator.credentials = { - create: async () => ({ - response: {}, - getClientExtensionResults: () => {}, - authenticatorAttachment: 'cross-platform', - }), - }; + globalThis.navigator.credentials.create = async () => ({ + response: {}, + getClientExtensionResults: () => {}, + authenticatorAttachment: 'cross-platform', + }); const response = await startRegistration({ optionsJSON: goodOpts1 }); @@ -275,16 +267,14 @@ describe('Method: startRegistration', () => { * that's already buried in the response. */ // @ts-ignore: Super lame, making me stub out credman like this - globalThis.navigator.credentials = { - create: async () => ({ - response: { - getPublicKeyAlgorithm: () => 777, - getPublicKey: () => new Uint8Array([0, 0, 0, 0]).buffer, - getAuthenticatorData: () => new Uint8Array([0, 0, 0, 0]).buffer, - }, - getClientExtensionResults: () => {}, - }), - }; + globalThis.navigator.credentials.create = async () => ({ + response: { + getPublicKeyAlgorithm: () => 777, + getPublicKey: () => new Uint8Array([0, 0, 0, 0]).buffer, + getAuthenticatorData: () => new Uint8Array([0, 0, 0, 0]).buffer, + }, + getClientExtensionResults: () => {}, + }); const response = await startRegistration({ optionsJSON: goodOpts1 }); @@ -300,12 +290,10 @@ describe('Method: startRegistration', () => { * that's already buried in the response. */ // @ts-ignore: Super lame, making me stub out credman like this - globalThis.navigator.credentials = { - create: async () => ({ - response: {}, - getClientExtensionResults: () => {}, - }), - }; + globalThis.navigator.credentials.create = async () => ({ + response: {}, + getClientExtensionResults: () => {}, + }); const response = await startRegistration({ optionsJSON: goodOpts1 }); @@ -341,23 +329,21 @@ describe('Method: startRegistration', () => { */ // @ts-ignore: Super lame, making me stub out credman like this - globalThis.navigator.credentials = { - create: async () => ({ - // Mock extension return values from the browser extension intercepting WebAuthn - response: { - getPublicKeyAlgorithm: () => { - throw new Error('I throw for some reason'); - }, - getPublicKey: () => { - throw new Error('I also throw for some reason'); - }, - getAuthenticatorData: () => { - throw new Error('I throw for some reason too'); - }, + globalThis.navigator.credentials.create = async () => ({ + // Mock extension return values from the browser extension intercepting WebAuthn + response: { + getPublicKeyAlgorithm: () => { + throw new Error('I throw for some reason'); }, - getClientExtensionResults: () => {}, - }), - }; + getPublicKey: () => { + throw new Error('I also throw for some reason'); + }, + getAuthenticatorData: () => { + throw new Error('I throw for some reason too'); + }, + }, + getClientExtensionResults: () => {}, + }); // Quiet down the `console.warn()` output when the getters above throw const stubConsoleWarn = stub(console, 'warn'); @@ -384,7 +370,7 @@ describe('Method: startRegistration', () => { describe('WebAuthnError', () => { beforeEach(() => { - _browserSupportsWebAuthnInternals.stubThis = spy(() => true); + _browserSupportsWebAuthnInternals.stubThis = () => true; }); // describe('AbortError', () => { From c567bba133d3b5b695b16dcb2e55dd6f2091cb9d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 09:04:53 -0800 Subject: [PATCH 053/115] Refine registration tests --- .../src/helpers/identifyRegistrationError.ts | 4 +- .../src/methods/startRegistration.test.ts | 59 ++++++------------- 2 files changed, 20 insertions(+), 43 deletions(-) diff --git a/packages/browser/src/helpers/identifyRegistrationError.ts b/packages/browser/src/helpers/identifyRegistrationError.ts index 2a8c7dfb4..a93574ed4 100644 --- a/packages/browser/src/helpers/identifyRegistrationError.ts +++ b/packages/browser/src/helpers/identifyRegistrationError.ts @@ -97,11 +97,11 @@ export function identifyRegistrationError({ cause: error, }); } else if (error.name === 'SecurityError') { - const effectiveDomain = globalThis.location.hostname; + const effectiveDomain = window.location.hostname; if (!isValidDomain(effectiveDomain)) { // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 7) return new WebAuthnError({ - message: `${globalThis.location.hostname} is an invalid domain`, + message: `${window.location.hostname} is an invalid domain`, code: 'ERROR_INVALID_DOMAIN', cause: error, }); diff --git a/packages/browser/src/methods/startRegistration.test.ts b/packages/browser/src/methods/startRegistration.test.ts index 091181555..2b75b19fa 100644 --- a/packages/browser/src/methods/startRegistration.test.ts +++ b/packages/browser/src/methods/startRegistration.test.ts @@ -417,13 +417,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: opts }), WebAuthnError, + 'Discoverable credentials were required' ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes( - rejected.message.toLowerCase(), - 'discoverable credentials were required', - ); assertStringIncludes(rejected.message.toLowerCase(), 'no available authenticator supported'); assertEquals(rejected.name, 'ConstraintError'); assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT'); @@ -441,10 +437,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: opts }), WebAuthnError, + 'User verification was required' ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), 'user verification was required'); assertStringIncludes(rejected.message.toLowerCase(), 'no available authenticator supported'); assertEquals(rejected.name, 'ConstraintError'); assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT'); @@ -462,13 +457,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: opts, useAutoRegister: true }), WebAuthnError, + 'User verification was required during automatic registration', ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes( - rejected.message.toLowerCase(), - 'user verification was required during automatic registration', - ); assertStringIncludes(rejected.message.toLowerCase(), 'could not be performed'); assertEquals(rejected.name, 'ConstraintError'); assertEquals(rejected.code, 'ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE'); @@ -491,11 +482,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, + 'authenticator was previously registered' ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), 'authenticator'); - assertStringIncludes(rejected.message.toLowerCase(), 'previously registered'); assertEquals(rejected.name, 'InvalidStateError'); assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED'); assertEquals(rejected.cause, InvalidStateError); @@ -524,10 +513,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, + 'Operation failed' ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), 'operation failed'); assertEquals(rejected.name, 'NotAllowedError'); assertEquals(rejected.code, 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); assertEquals(rejected.cause, NotAllowedError); @@ -554,10 +542,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, + 'sites with TLS certificate errors' ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), 'sites with tls certificate errors'); assertEquals(rejected.name, 'NotAllowedError'); assertEquals(rejected.code, 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); assertEquals(rejected.cause, NotAllowedError); @@ -584,11 +571,10 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: opts }), WebAuthnError, + 'pubKeyCredParams', ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), 'pubkeycredparams'); - assertStringIncludes(rejected.message.toLowerCase(), 'public-key'); + assertStringIncludes(rejected.message, 'public-key'); assertEquals(rejected.name, 'NotSupportedError'); assertEquals(rejected.code, 'ERROR_MALFORMED_PUBKEYCREDPARAMS'); assertEquals(rejected.cause, NotSupportedError); @@ -603,11 +589,10 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: opts }), WebAuthnError, + 'No available authenticator', ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), 'no available authenticator'); - assertStringIncludes(rejected.message.toLowerCase(), 'pubkeycredparams'); + assertStringIncludes(rejected.message, 'pubKeyCredParams'); assertEquals(rejected.name, 'NotSupportedError'); assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG'); assertEquals(rejected.cause, NotSupportedError); @@ -626,6 +611,8 @@ describe('WebAuthnError', () => { // @ts-ignore globalThis.location = { hostname: '' } as unknown; + // @ts-ignore + globalThis.window = globalThis; }); it('should identify invalid domain', async () => { @@ -634,11 +621,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, + '1.2.3.4 is an invalid domain' ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), '1.2.3.4'); - assertStringIncludes(rejected.message.toLowerCase(), 'invalid domain'); assertEquals(rejected.name, 'SecurityError'); assertEquals(rejected.code, 'ERROR_INVALID_DOMAIN'); assertEquals(rejected.cause, SecurityError); @@ -650,11 +635,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, + `RP ID "${goodOpts1.rp.id}" is invalid for this domain`, ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), `${goodOpts1.rp.id}`); - assertStringIncludes(rejected.message.toLowerCase(), 'invalid for this domain'); assertEquals(rejected.name, 'SecurityError'); assertEquals(rejected.code, 'ERROR_INVALID_RP_ID'); assertEquals(rejected.cause, SecurityError); @@ -683,11 +666,9 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: opts }), WebAuthnError, + 'User ID was not between 1 and 64 characters', ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), `user id`); - assertStringIncludes(rejected.message.toLowerCase(), 'not between 1 and 64 characters'); assertEquals(rejected.name, 'TypeError'); assertEquals(rejected.code, 'ERROR_INVALID_USER_ID_LENGTH'); assertEquals(rejected.cause, typeError); @@ -709,15 +690,11 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, + 'authenticator', ); - assertInstanceOf(rejected, WebAuthnError); - assertStringIncludes(rejected.message.toLowerCase(), `authenticator`); - assertStringIncludes( - rejected.message.toLowerCase(), - 'unable to process the specified options', - ); - assertStringIncludes(rejected.message.toLowerCase(), 'could not create a new credential'); + assertStringIncludes(rejected.message, 'unable to process the specified options'); + assertStringIncludes(rejected.message, 'could not create a new credential'); assertEquals(rejected.name, 'UnknownError'); assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_GENERAL_ERROR'); assertEquals(rejected.cause, UnknownError); From a41f6bdb4e5b82b5afbc981432a29f0f2652e402 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 09:05:07 -0800 Subject: [PATCH 054/115] Await assertRejects in metadata test --- packages/server/src/services/metadataService.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/services/metadataService.test.ts b/packages/server/src/services/metadataService.test.ts index e8a3fb4d9..c2a0a4bc2 100644 --- a/packages/server/src/services/metadataService.test.ts +++ b/packages/server/src/services/metadataService.test.ts @@ -77,7 +77,7 @@ describe('Method: getStatement()', () => { statements: [], }); - assertRejects( + await assertRejects( () => MetadataService.getStatement('not-a-real-aaguid'), ); }); From 7e9877248e771977234f8459fbbe9cfd071dcdf7 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 09:05:26 -0800 Subject: [PATCH 055/115] Improve browserSupportsWebAuthnAutofill test --- packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts index 77a1257c9..d7409b43b 100644 --- a/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts +++ b/packages/browser/src/helpers/browserSupportsWebAuthnAutofill.ts @@ -22,7 +22,7 @@ export function browserSupportsWebAuthnAutofill(): Promise { const globalPublicKeyCredential = globalThis .PublicKeyCredential as unknown as PublicKeyCredentialFuture; - if (globalPublicKeyCredential.isConditionalMediationAvailable === undefined) { + if (globalPublicKeyCredential?.isConditionalMediationAvailable === undefined) { return _browserSupportsWebAuthnAutofillInternals.stubThis( new Promise((resolve) => resolve(false)), ); From d1d27376e264cb62c71462bbe3dab0a45d4490ae Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 09:05:42 -0800 Subject: [PATCH 056/115] Migrate authentication tests --- .../src/methods/startAuthentication.test.ts | 864 ++++++++++-------- 1 file changed, 469 insertions(+), 395 deletions(-) diff --git a/packages/browser/src/methods/startAuthentication.test.ts b/packages/browser/src/methods/startAuthentication.test.ts index 46aac1c9e..16e48c80a 100644 --- a/packages/browser/src/methods/startAuthentication.test.ts +++ b/packages/browser/src/methods/startAuthentication.test.ts @@ -1,3 +1,15 @@ +/// +import { + assert, + assertEquals, + assertExists, + assertInstanceOf, + assertRejects, + assertStringIncludes, +} from '@std/assert'; +import { assertSpyCalls, type Spy, spy, stub } from '@std/testing/mock'; +import { afterEach, beforeEach, describe, it } from '@std/testing/bdd'; +import { JSDOM } from 'jsdom'; import { AuthenticationCredential, AuthenticationExtensionsClientInputs, @@ -5,8 +17,8 @@ import { PublicKeyCredentialRequestOptionsJSON, } from '@simplewebauthn/types'; -import { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.ts'; -import { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill.ts'; +import { _browserSupportsWebAuthnInternals } from '../helpers/browserSupportsWebAuthn.ts'; +import { _browserSupportsWebAuthnAutofillInternals } from '../helpers/browserSupportsWebAuthnAutofill.ts'; import { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.ts'; import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.ts'; import { WebAuthnError } from '../helpers/webAuthnError.ts'; @@ -15,20 +27,9 @@ import { WebAuthnAbortService } from '../helpers/webAuthnAbortService.ts'; import { startAuthentication } from './startAuthentication.ts'; -jest.mock('../helpers/browserSupportsWebAuthn'); -jest.mock('../helpers/browserSupportsWebAuthnAutofill'); - -const mockNavigatorGet = window.navigator.credentials.get as jest.Mock; -const mockSupportsWebAuthn = browserSupportsWebAuthn as jest.Mock; -const mockSupportsAutofill = browserSupportsWebAuthnAutofill as jest.Mock; - -const mockAuthenticatorData = 'mockAuthenticatorData'; -const mockClientDataJSON = 'mockClientDataJSON'; -const mockSignature = 'mockSignature'; -const mockUserHandle = 'f4pdy3fpA34'; - // With ASCII challenge const goodOpts1: PublicKeyCredentialRequestOptionsJSON = { + rpId: 'example.com', challenge: '1T6uHri4OAQ', allowCredentials: [ { @@ -47,392 +48,429 @@ const goodOpts2UTF8: PublicKeyCredentialRequestOptionsJSON = { timeout: 1, }; -beforeEach(() => { - // Stub out a response so the method won't throw - mockNavigatorGet.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ - response: {}, - getClientExtensionResults: () => ({}), - }); - }); - }); +const defaultGetResponse = async (...args: any[]) => ({ + response: {}, + getClientExtensionResults: () => ({}), +}); - mockSupportsWebAuthn.mockReturnValue(true); - mockSupportsAutofill.mockResolvedValue(true); +describe('Method: startAuthentication()', () => { + let getSpy: Spy; - // Reset the abort service so we get an accurate call count - WebAuthnAbortService.cancelCeremony(); -}); + beforeEach(() => { + // Stub out a response so the method won't throw + getSpy = spy(defaultGetResponse); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { get: getSpy }; -afterEach(() => { - mockNavigatorGet.mockReset(); - mockSupportsWebAuthn.mockReset(); - mockSupportsAutofill.mockReset(); -}); + // Assume WebAuthn is available + _browserSupportsWebAuthnInternals.stubThis = () => true; + // Assume conditional UI is supported + _browserSupportsWebAuthnAutofillInternals.stubThis = async () => true; + }); -test('should convert options before passing to navigator.credentials.get(...)', async () => { - await startAuthentication({ optionsJSON: goodOpts1 }); + afterEach(() => { + // Reset the abort service so we get an accurate call count + WebAuthnAbortService.cancelCeremony(); + }); - const argsPublicKey = mockNavigatorGet.mock.calls[0][0].publicKey; - const credId = argsPublicKey.allowCredentials[0].id; + it('should convert options before passing to navigator.credentials.get(...)', async () => { + await startAuthentication({ optionsJSON: goodOpts1 }); - expect(new Uint8Array(argsPublicKey.challenge)).toEqual( - new Uint8Array([213, 62, 174, 30, 184, 184, 56, 4]), - ); - // Make sure the credential ID is an ArrayBuffer with a length of 64 - expect(credId instanceof ArrayBuffer).toEqual(true); - expect(credId.byteLength).toEqual(64); -}); + const args = getSpy.calls.at(0)?.args[0] as CredentialRequestOptions; + const argsPublicKey = args.publicKey!; + const credId = argsPublicKey.allowCredentials?.[0].id; -test('should support optional allowCredential', async () => { - await startAuthentication({ - optionsJSON: { - challenge: '1T6uHri4OAQ', - timeout: 1, - }, + assertEquals( + new Uint8Array(argsPublicKey.challenge as ArrayBuffer), + new Uint8Array([213, 62, 174, 30, 184, 184, 56, 4]), + ); + // Make sure the credential ID is an ArrayBuffer with a length of 64 + assertInstanceOf(credId, ArrayBuffer); + assertEquals(credId.byteLength, 64); }); - expect(mockNavigatorGet.mock.calls[0][0].allowCredentials).toEqual(undefined); -}); + it('should support optional allowCredential', async () => { + await startAuthentication({ + optionsJSON: { + challenge: '1T6uHri4OAQ', + timeout: 1, + }, + }); -test('should convert allow allowCredential to undefined when empty', async () => { - await startAuthentication({ - optionsJSON: { - challenge: '1T6uHri4OAQ', - timeout: 1, - allowCredentials: [], - }, + const args = getSpy.calls.at(0)?.args[0] as CredentialRequestOptions; + const argsPublicKey = args.publicKey!; + + assertEquals(argsPublicKey.allowCredentials, undefined); }); - expect(mockNavigatorGet.mock.calls[0][0].allowCredentials).toEqual(undefined); -}); -test('should return base64url-encoded response values', async () => { - mockNavigatorGet.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ - id: 'foobar', - rawId: Buffer.from('foobar', 'ascii'), - response: { - authenticatorData: Buffer.from(mockAuthenticatorData, 'ascii'), - clientDataJSON: Buffer.from(mockClientDataJSON, 'ascii'), - signature: Buffer.from(mockSignature, 'ascii'), - userHandle: base64URLStringToBuffer(mockUserHandle), - }, - getClientExtensionResults: () => ({}), - type: 'public-key', - authenticatorAttachment: '', - }); + it('should convert allow allowCredential to undefined when empty', async () => { + await startAuthentication({ + optionsJSON: { + challenge: '1T6uHri4OAQ', + timeout: 1, + allowCredentials: [], + }, }); + + const args = getSpy.calls.at(0)?.args[0] as CredentialRequestOptions; + const argsPublicKey = args.publicKey!; + + assertEquals(argsPublicKey.allowCredentials, undefined); }); - const response = await startAuthentication({ optionsJSON: goodOpts1 }); + it('should return base64url-encoded response values', async () => { + globalThis.navigator.credentials.get = async () => ({ + id: 'foobar', + rawId: new Uint8Array([0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72]), + response: { + authenticatorData: new Uint8Array([1, 2, 3, 4]), + clientDataJSON: new Uint8Array([5, 6, 7, 8]), + signature: new Uint8Array([9, 0, 1, 2]), + userHandle: new Uint8Array([3, 4, 5, 6]), + }, + getClientExtensionResults: () => ({}), + type: 'public-key', + authenticatorAttachment: '', + }); - expect(response.rawId).toEqual('Zm9vYmFy'); - expect(response.response.authenticatorData).toEqual( - 'bW9ja0F1dGhlbnRpY2F0b3JEYXRh', - ); - expect(response.response.clientDataJSON).toEqual('bW9ja0NsaWVudERhdGFKU09O'); - expect(response.response.signature).toEqual('bW9ja1NpZ25hdHVyZQ'); - expect(response.response.userHandle).toEqual('f4pdy3fpA34'); -}); + const response = await startAuthentication({ optionsJSON: goodOpts1 }); -test("should throw error if WebAuthn isn't supported", async () => { - mockSupportsWebAuthn.mockReturnValue(false); + assertEquals(response.rawId, 'Zm9vYmFy'); + assertEquals(response.response.authenticatorData, 'AQIDBA'); + assertEquals(response.response.clientDataJSON, 'BQYHCA'); + assertEquals(response.response.signature, 'CQABAg'); + assertEquals(response.response.userHandle, 'AwQFBg'); + }); - await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects.toThrow( - 'WebAuthn is not supported in this browser', - ); -}); + it("should throw error if WebAuthn isn't supported", async () => { + _browserSupportsWebAuthnInternals.stubThis = () => false; -test('should throw error if assertion is cancelled for some reason', async () => { - mockNavigatorGet.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve(null); - }); + await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1 }), + Error, + 'WebAuthn is not supported in this browser', + ); }); - await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects.toThrow( - 'Authentication was not completed', - ); -}); + it('should throw error if assertion is cancelled for some reason', async () => { + globalThis.navigator.credentials.get = async () => null; -test('should handle UTF-8 challenges', async () => { - await startAuthentication({ optionsJSON: goodOpts2UTF8 }); - - const argsPublicKey = mockNavigatorGet.mock.calls[0][0].publicKey; - - expect(new Uint8Array(argsPublicKey.challenge)).toEqual( - new Uint8Array([ - 227, - 130, - 132, - 227, - 130, - 140, - 227, - 130, - 132, - 227, - 130, - 140, - 227, - 129, - 160, - 227, - 129, - 156, - ]), - ); -}); + await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1 }), + Error, + 'Authentication was not completed', + ); + }); -test('should send extensions to authenticator if present in options', async () => { - const extensions: AuthenticationExtensionsClientInputs = { - credProps: true, - appid: 'appidHere', - // @ts-ignore: Send arbitrary extensions - uvm: true, - // @ts-ignore: Send arbitrary extensions - appidExclude: 'appidExcludeHere', - }; - const optsWithExts: PublicKeyCredentialRequestOptionsJSON = { - ...goodOpts1, - extensions, - }; - await startAuthentication({ optionsJSON: optsWithExts }); - - const argsExtensions = mockNavigatorGet.mock.calls[0][0].publicKey.extensions; - - expect(argsExtensions).toEqual(extensions); -}); + it('should handle UTF-8 challenges', async () => { + await startAuthentication({ optionsJSON: goodOpts2UTF8 }); + + const args = getSpy.calls.at(0)?.args[0] as CredentialRequestOptions; + const argsPublicKey = args.publicKey!; + + assertEquals( + new Uint8Array(argsPublicKey.challenge as ArrayBuffer), + new Uint8Array([ + 227, + 130, + 132, + 227, + 130, + 140, + 227, + 130, + 132, + 227, + 130, + 140, + 227, + 129, + 160, + 227, + 129, + 156, + ]), + ); + }); -test('should not set any extensions if not present in options', async () => { - await startAuthentication({ optionsJSON: goodOpts1 }); + it('should send extensions to authenticator if present in options', async () => { + const extensions: AuthenticationExtensionsClientInputs = { + credProps: true, + appid: 'appidHere', + // @ts-ignore: Send arbitrary extensions + uvm: true, + // @ts-ignore: Send arbitrary extensions + appidExclude: 'appidExcludeHere', + }; + const optsWithExts: PublicKeyCredentialRequestOptionsJSON = { + ...goodOpts1, + extensions, + }; + await startAuthentication({ optionsJSON: optsWithExts }); + + const args = getSpy.calls.at(0)?.args[0] as CredentialRequestOptions; + const argsPublicKey = args.publicKey!; + const argsExtensions = argsPublicKey.extensions; + + assertEquals(argsExtensions, extensions); + }); - const argsExtensions = mockNavigatorGet.mock.calls[0][0].publicKey.extensions; + it('should not set any extensions if not present in options', async () => { + await startAuthentication({ optionsJSON: goodOpts1 }); - expect(argsExtensions).toEqual(undefined); -}); + const args = getSpy.calls.at(0)?.args[0] as CredentialRequestOptions; + const argsPublicKey = args.publicKey!; + const argsExtensions = argsPublicKey.extensions; -test('should include extension results', async () => { - const extResults: AuthenticationExtensionsClientOutputs = { - appid: true, - credProps: { - rk: true, - }, - }; + assertEquals(argsExtensions, undefined); + }); + + it('should include extension results', async () => { + const extResults: AuthenticationExtensionsClientOutputs = { + appid: true, + credProps: { + rk: true, + }, + }; - // Mock extension return values from authenticator - mockNavigatorGet.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ response: {}, getClientExtensionResults: () => extResults }); + // Mock extension return values from authenticator + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials.get = async () => ({ + response: {}, + getClientExtensionResults: () => extResults, }); + + // Extensions aren't present in this object, but it doesn't matter since we're faking the response + const response = await startAuthentication({ optionsJSON: goodOpts1 }); + + assertEquals(response.clientExtensionResults, extResults); }); - // Extensions aren't present in this object, but it doesn't matter since we're faking the response - const response = await startAuthentication({ optionsJSON: goodOpts1 }); + it('should include extension results when no extensions specified', async () => { + const response = await startAuthentication({ optionsJSON: goodOpts1 }); - expect(response.clientExtensionResults).toEqual(extResults); -}); + assertEquals(response.clientExtensionResults, {}); + }); -test('should include extension results when no extensions specified', async () => { - const response = await startAuthentication({ optionsJSON: goodOpts1 }); + it('should support "cable" transport', async () => { + const opts: PublicKeyCredentialRequestOptionsJSON = { + ...goodOpts1, + allowCredentials: [ + { + ...goodOpts1.allowCredentials![0], + transports: ['cable'], + }, + ], + }; - expect(response.clientExtensionResults).toEqual({}); -}); + await startAuthentication({ optionsJSON: opts }); -test('should support "cable" transport', async () => { - const opts: PublicKeyCredentialRequestOptionsJSON = { - ...goodOpts1, - allowCredentials: [ - { - ...goodOpts1.allowCredentials![0], - transports: ['cable'], - }, - ], - }; + const args = getSpy.calls.at(0)?.args[0] as CredentialRequestOptions; + const argsPublicKey = args.publicKey!; - await startAuthentication({ optionsJSON: opts }); + assertEquals(argsPublicKey.allowCredentials?.[0]?.transports?.[0], 'cable'); + }); - expect( - mockNavigatorGet.mock.calls[0][0].publicKey.allowCredentials[0] - .transports[0], - ).toEqual( - 'cable', - ); -}); + it('should cancel an existing call when executed again', async () => { + const abortSpy = spy(AbortController.prototype, 'abort'); -test('should cancel an existing call when executed again', async () => { - const abortSpy = jest.spyOn(AbortController.prototype, 'abort'); + // Fire off a request and immediately attempt a second one + startAuthentication({ optionsJSON: goodOpts1 }); + await startAuthentication({ optionsJSON: goodOpts1 }); + assertSpyCalls(abortSpy, 1); + }); - // Fire off a request and immediately attempt a second one - startAuthentication({ optionsJSON: goodOpts1 }); - await startAuthentication({ optionsJSON: goodOpts1 }); - expect(abortSpy).toHaveBeenCalledTimes(1); -}); + it('should set up autofill a.k.a. Conditional UI', async () => { + const opts: PublicKeyCredentialRequestOptionsJSON = { + ...goodOpts1, + allowCredentials: [ + { + ...goodOpts1.allowCredentials![0], + transports: ['cable'], + }, + ], + }; + + // Prepare a simple HTML doc + const dom = new JSDOM(` +
+ + + +
+ `); + globalThis.document = dom.window.document; + + // @ts-ignore: Pretend this is a browser that + globalThis.PublicKeyCredential = () => {}; + _browserSupportsWebAuthnAutofillInternals.stubThis = async () => true; + + await startAuthentication({ optionsJSON: opts, useBrowserAutofill: true }); + + const args = getSpy.calls.at(0)?.args[0] as CredentialRequestOptions; + const argsPublicKey = args.publicKey!; + + // The most important bit + assertEquals(args.mediation, 'conditional'); + // The latest version of https://github.com/w3c/webauthn/pull/1576 says allowCredentials should + // be an "empty list", as opposed to being undefined + assertExists(argsPublicKey.allowCredentials); + assertEquals(argsPublicKey.allowCredentials.length, 0); + + // @ts-ignore: Cleanup + delete globalThis.PublicKeyCredential; + // @ts-ignore: Cleanup + delete globalThis.document; + }); -test('should set up autofill a.k.a. Conditional UI', async () => { - const opts: PublicKeyCredentialRequestOptionsJSON = { - ...goodOpts1, - allowCredentials: [ - { - ...goodOpts1.allowCredentials![0], - transports: ['cable'], - }, - ], - }; - document.body.innerHTML = ` -
- - - -
- `; - - await startAuthentication({ optionsJSON: opts, useBrowserAutofill: true }); - - // The most important bit - expect(mockNavigatorGet.mock.calls[0][0].mediation).toEqual('conditional'); - // The latest version of https://github.com/w3c/webauthn/pull/1576 says allowCredentials should - // be an "empty list", as opposed to being undefined - expect(mockNavigatorGet.mock.calls[0][0].publicKey.allowCredentials) - .toBeDefined(); - expect(mockNavigatorGet.mock.calls[0][0].publicKey.allowCredentials.length) - .toEqual(0); -}); + it('should set up conditional UI if "webauthn" is the only autocomplete token', async () => { + /** + * According to WHATWG "webauthn" can be the only token in the autocomplete attribute: + * https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill-detail-tokens + */ + const dom = new JSDOM(` +
+ + + +
+ `); + globalThis.document = dom.window.document; + + // We just want to ensure that `startAuthentication()` doesn't error out here + const resp = await startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true }); + assert(resp); + + // @ts-ignore: Cleanup + delete globalThis.document; + }); -test('should set up conditional UI if "webauthn" is the only autocomplete token', async () => { - /** - * According to WHATWG "webauthn" can be the only token in the autocomplete attribute: - * https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill-detail-tokens - */ - document.body.innerHTML = ` -
- - - -
- `; + it('should throw error if autofill not supported', async () => { + _browserSupportsWebAuthnAutofillInternals.stubThis = async () => false; - await expect(startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true })).resolves; -}); + await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true }), + Error, + 'does not support WebAuthn autofill', + ); + }); -test('should throw error if autofill not supported', async () => { - mockSupportsAutofill.mockResolvedValue(false); + it('should throw error if no acceptable is found', async () => { + // is missing "webauthn" from the autocomplete attribute + const dom = new JSDOM(` +
+ + + +
+ `); + globalThis.document = dom.window.document; + + await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true }), + Error, + 'No ', + ); + + // @ts-ignore: Cleanup + delete globalThis.document; + }); - const rejected = await expect( - startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true }), - ).rejects; - rejected.toThrow(Error); - rejected.toThrow(/does not support webauthn autofill/i); -}); + it('should not throw error when autofill input verification flag is false', async () => { + // No suitable is present in the "light DOM", which would normally raise... + const dom = new JSDOM(''); + globalThis.document = dom.window.document; -test('should throw error if no acceptable is found', async () => { - // is missing "webauthn" from the autocomplete attribute - document.body.innerHTML = ` -
+ // ...But a suitable IS inside of a web component's "shadow DOM" and we know it + const swanAutofill = globalThis.document.querySelector('swan-autofill'); + const shadowRoot = swanAutofill!.attachShadow({ mode: 'open' }); + shadowRoot.innerHTML = ` - - -
- `; - - const rejected = await expect( - startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true }), - ).rejects; - rejected.toThrow(Error); - rejected.toThrow(/no /i); -}); - -test('should not throw error when autofill input verification flag is false', async () => { - // No suitable is present in the "light DOM", which would normally raise... - document.body.innerHTML = ''; - - // ...But a suitable IS inside of a web component's "shadow DOM" and we know it - const swanAutofill = document.querySelector('swan-autofill'); - const shadowRoot = swanAutofill!.attachShadow({ mode: 'open' }); - shadowRoot.innerHTML = ` - - - `; - - await expect( - startAuthentication({ + + `; + + // We just want to ensure that `startAuthentication()` doesn't error out here + const resp = await startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true, verifyBrowserAutofillInput: false, - }), - ).resolves; -}); + }); + assert(resp); -test('should throw error if "webauthn" is not final autocomplete token', async () => { - /** - * According to WHATWG "webauthn" must be the final token in the autocomplete attribute when - * multiple tokens are present: - * https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill-detail-tokens - */ - document.body.innerHTML = ` -
- - - -
- `; - - const rejected = await expect( - startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true }), - ).rejects; - rejected.toThrow(Error); - rejected.toThrow(/no /i); -}); + // @ts-ignore: Cleanup + delete globalThis.document; + }); -test('should return authenticatorAttachment if present', async () => { - // Mock extension return values from authenticator - mockNavigatorGet.mockImplementation((): Promise => { - return new Promise((resolve) => { - resolve({ - response: {}, - getClientExtensionResults: () => {}, - authenticatorAttachment: 'cross-platform', - }); - }); + it('should throw error if "webauthn" is not final autocomplete token', async () => { + /** + * According to WHATWG "webauthn" must be the final token in the autocomplete attribute when + * multiple tokens are present: + * https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill-detail-tokens + */ + const dom = new JSDOM(` +
+ + + +
+ `); + globalThis.document = dom.window.document; + + await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1, useBrowserAutofill: true }), + Error, + 'No ', + ); + + // @ts-ignore: Cleanup + delete globalThis.document; }); - const response = await startAuthentication({ optionsJSON: goodOpts1 }); + it('should return authenticatorAttachment if present', async () => { + // Mock extension return values from authenticator + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials.get = async () => ({ + response: {}, + getClientExtensionResults: () => {}, + authenticatorAttachment: 'cross-platform', + }); + + const response = await startAuthentication({ optionsJSON: goodOpts1 }); - expect(response.authenticatorAttachment).toEqual('cross-platform'); + assertEquals(response.authenticatorAttachment, 'cross-platform'); + }); }); describe('WebAuthnError', () => { - describe('AbortError', () => { - const AbortError = generateCustomError('AbortError'); - - /** - * We can't actually test this because nothing in startAuthentication() propagates the abort - * signal. But if you invoked WebAuthn via this and then manually sent an abort signal I guess - * this will catch. - * - * As a matter of fact I couldn't actually get any browser to respect the abort signal... - */ - test.skip('should identify abort signal', async () => { - mockNavigatorGet.mockRejectedValueOnce(AbortError); - - const rejected = await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/abort signal/i); - rejected.toHaveProperty('name', 'AbortError'); - rejected.toHaveProperty('code', 'ERROR_CEREMONY_ABORTED'); - rejected.toHaveProperty('cause', AbortError); - }); - }); + // describe('AbortError', () => { + // const AbortError = generateCustomError('AbortError'); + + // /** + // * We can't actually test this because nothing in startAuthentication() propagates the abort + // * signal. But if you invoked WebAuthn via this and then manually sent an abort signal I guess + // * this will catch. + // * + // * As a matter of fact I couldn't actually get any browser to respect the abort signal... + // */ + // it.skip('should identify abort signal', async () => { + // mockNavigatorGet.mockRejectedValueOnce(AbortError); + + // const rejected = await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects; + // rejected.toThrow(WebAuthnError); + // rejected.toThrow(/abort signal/i); + // rejected.toHaveProperty('name', 'AbortError'); + // rejected.toHaveProperty('code', 'ERROR_CEREMONY_ABORTED'); + // rejected.toHaveProperty('cause', AbortError); + // }); + // }); describe('NotAllowedError', () => { - test('should pass through error message (iOS Safari - Operation failed)', async () => { + it('should pass through error message (iOS Safari - Operation failed)', async () => { /** * Thrown when biometric is not enrolled, or a Safari bug prevents conditional UI from being * aborted properly between page reloads. @@ -443,17 +481,26 @@ describe('WebAuthnError', () => { 'NotAllowedError', 'Operation failed.', ); - mockNavigatorGet.mockRejectedValueOnce(NotAllowedError); - - const rejected = await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(Error); - rejected.toThrow(/operation failed/i); - rejected.toHaveProperty('name', 'NotAllowedError'); - rejected.toHaveProperty('code', 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); - rejected.toHaveProperty('cause', NotAllowedError); + + const getSpy = spy(async () => { + throw NotAllowedError; + }); + + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { get: getSpy }; + + const rejected = await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1 }), + WebAuthnError, + 'Operation failed', + ); + + assertEquals(rejected.name, 'NotAllowedError'); + assertEquals(rejected.code, 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); + assertEquals(rejected.cause, NotAllowedError); }); - test('should pass through error message (Chrome M110 - Bad TLS Cert)', async () => { + it('should pass through error message (Chrome M110 - Bad TLS Cert)', async () => { /** * Starting from Chrome M110, WebAuthn is blocked if the site is being displayed on a URL with * TLS certificate issues. This includes during development. @@ -464,73 +511,100 @@ describe('WebAuthnError', () => { 'NotAllowedError', 'WebAuthn is not supported on sites with TLS certificate errors.', ); - mockNavigatorGet.mockRejectedValueOnce(NotAllowedError); - - const rejected = await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(Error); - rejected.toThrow(/sites with TLS certificate errors/i); - rejected.toHaveProperty('name', 'NotAllowedError'); - rejected.toHaveProperty('code', 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); - rejected.toHaveProperty('cause', NotAllowedError); + + const getSpy = spy(async () => { + throw NotAllowedError; + }); + + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { get: getSpy }; + + const rejected = await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1 }), + WebAuthnError, + 'sites with TLS certificate errors', + ); + + assertEquals(rejected.name, 'NotAllowedError'); + assertEquals(rejected.code, 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY'); + assertEquals(rejected.cause, NotAllowedError); }); }); describe('SecurityError', () => { const SecurityError = generateCustomError('SecurityError'); - let _originalHostName: string; - beforeEach(() => { - _originalHostName = window.location.hostname; - }); + const getSpy = spy(async () => { + throw SecurityError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { get: getSpy }; - afterEach(() => { - window.location.hostname = _originalHostName; + // @ts-ignore + globalThis.location = { hostname: '' } as unknown; + // @ts-ignore + globalThis.window = globalThis; }); - test('should identify invalid domain', async () => { - window.location.hostname = '1.2.3.4'; + it('should identify invalid domain', async () => { + globalThis.location.hostname = '1.2.3.4'; - mockNavigatorGet.mockRejectedValueOnce(SecurityError); + const rejected = await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1 }), + WebAuthnError, + '1.2.3.4 is an invalid domain' + ); - const rejected = await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrowError(WebAuthnError); - rejected.toThrow(/1\.2\.3\.4/); - rejected.toThrow(/invalid domain/i); - rejected.toHaveProperty('name', 'SecurityError'); - rejected.toHaveProperty('code', 'ERROR_INVALID_DOMAIN'); - rejected.toHaveProperty('cause', SecurityError); + assertEquals(rejected.name, 'SecurityError'); + assertEquals(rejected.code, 'ERROR_INVALID_DOMAIN'); + assertEquals(rejected.cause, SecurityError); }); - test('should identify invalid RP ID', async () => { - window.location.hostname = 'simplewebauthn.com'; + it('should identify invalid RP ID', async () => { + globalThis.location.hostname = 'simplewebauthn.com'; - mockNavigatorGet.mockRejectedValueOnce(SecurityError); + const rejected = await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1 }), + WebAuthnError, + `RP ID "${goodOpts1.rpId}" is invalid for this domain` + ); - const rejected = await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrowError(WebAuthnError); - rejected.toThrow(goodOpts1.rpId); - rejected.toThrow(/invalid for this domain/i); - rejected.toHaveProperty('name', 'SecurityError'); - rejected.toHaveProperty('code', 'ERROR_INVALID_RP_ID'); - rejected.toHaveProperty('cause', SecurityError); + assertEquals(rejected.name, 'SecurityError'); + assertEquals(rejected.code, 'ERROR_INVALID_RP_ID'); + assertEquals(rejected.cause, SecurityError); }); }); describe('UnknownError', () => { const UnknownError = generateCustomError('UnknownError'); - test('should identify potential authenticator issues', async () => { - mockNavigatorGet.mockRejectedValueOnce(UnknownError); - - const rejected = await expect(startAuthentication({ optionsJSON: goodOpts1 })).rejects; - rejected.toThrow(WebAuthnError); - rejected.toThrow(/authenticator/i); - rejected.toThrow(/unable to process the specified options/i); - rejected.toThrow(/could not create a new assertion signature/i); - rejected.toHaveProperty('name', 'UnknownError'); - rejected.toHaveProperty('code', 'ERROR_AUTHENTICATOR_GENERAL_ERROR'); - rejected.toHaveProperty('cause', UnknownError); + beforeEach(() => { + const getSpy = spy(async () => { + throw UnknownError; + }); + // @ts-ignore: Super lame, making me stub out credman like this + globalThis.navigator.credentials = { get: getSpy }; + + // @ts-ignore + globalThis.location = { hostname: '' } as unknown; + // @ts-ignore + globalThis.window = globalThis; + }); + + it('should identify potential authenticator issues', async () => { + const rejected = await assertRejects( + () => startAuthentication({ optionsJSON: goodOpts1 }), + WebAuthnError, + 'authenticator', + ); + + assertStringIncludes(rejected.message, 'unable to process the specified options'); + assertStringIncludes(rejected.message, 'could not create a new assertion signature'); + + assertEquals(rejected.name, 'UnknownError'); + assertEquals(rejected.code, 'ERROR_AUTHENTICATOR_GENERAL_ERROR'); + assertEquals(rejected.cause, UnknownError); }); }); }); From f17dd16600d4e10892cd8c21018193b2e4f7cffc Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 09:05:58 -0800 Subject: [PATCH 057/115] Commit introduction of jsdom for tests --- deno.jsonc | 1 + deno.lock | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 211 insertions(+), 3 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index 1741c45b2..eaca79a8d 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -8,6 +8,7 @@ "@std/assert": "jsr:@std/assert@^1.0.7", "@std/path": "jsr:@std/path@^1.0.8", "@std/testing": "jsr:@std/testing@^1.0.4", + "jsdom": "npm:jsdom@^25.0.1", "ts-morph": "npm:ts-morph@^24.0.0", "typescript": "npm:typescript@^5.6.3" }, diff --git a/deno.lock b/deno.lock index bafdfb824..6f75ee301 100644 --- a/deno.lock +++ b/deno.lock @@ -25,6 +25,7 @@ "npm:@peculiar/asn1-schema@^2.3.8": "2.3.13", "npm:@peculiar/asn1-x509@^2.3.8": "2.3.13", "npm:cross-fetch@4": "4.0.0", + "npm:jsdom@^25.0.1": "25.0.1", "npm:ts-morph@24": "24.0.0", "npm:typescript@^5.6.3": "5.6.3" }, @@ -162,6 +163,12 @@ "tinyglobby" ] }, + "agent-base@7.1.1": { + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": [ + "debug" + ] + }, "asn1js@3.0.5": { "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", "dependencies": [ @@ -170,6 +177,9 @@ "tslib" ] }, + "asynckit@0.4.0": { + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "balanced-match@1.0.2": { "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, @@ -182,31 +192,149 @@ "code-block-writer@13.0.3": { "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==" }, + "combined-stream@1.0.8": { + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": [ + "delayed-stream" + ] + }, "cross-fetch@4.0.0": { "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dependencies": [ "node-fetch" ] }, + "cssstyle@4.1.0": { + "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "dependencies": [ + "rrweb-cssom" + ] + }, + "data-urls@5.0.0": { + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dependencies": [ + "whatwg-mimetype", + "whatwg-url@14.0.0" + ] + }, + "debug@4.3.7": { + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": [ + "ms" + ] + }, + "decimal.js@10.4.3": { + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "delayed-stream@1.0.0": { + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "entities@4.5.0": { + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, "fdir@6.4.2_picomatch@4.0.2": { "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "dependencies": [ "picomatch" ] }, + "form-data@4.0.1": { + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": [ + "asynckit", + "combined-stream", + "mime-types" + ] + }, + "html-encoding-sniffer@4.0.0": { + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dependencies": [ + "whatwg-encoding" + ] + }, + "http-proxy-agent@7.0.2": { + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": [ + "agent-base", + "debug" + ] + }, + "https-proxy-agent@7.0.5": { + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": [ + "agent-base", + "debug" + ] + }, + "iconv-lite@0.6.3": { + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": [ + "safer-buffer" + ] + }, "ipaddr.js@2.2.0": { "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==" }, + "is-potential-custom-element-name@1.0.1": { + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "jsdom@25.0.1": { + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dependencies": [ + "cssstyle", + "data-urls", + "decimal.js", + "form-data", + "html-encoding-sniffer", + "http-proxy-agent", + "https-proxy-agent", + "is-potential-custom-element-name", + "nwsapi", + "parse5", + "rrweb-cssom", + "saxes", + "symbol-tree", + "tough-cookie", + "w3c-xmlserializer", + "webidl-conversions@7.0.0", + "whatwg-encoding", + "whatwg-mimetype", + "whatwg-url@14.0.0", + "ws", + "xml-name-validator" + ] + }, + "mime-db@1.52.0": { + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types@2.1.35": { + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": [ + "mime-db" + ] + }, "minimatch@9.0.5": { "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": [ "brace-expansion" ] }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node-fetch@2.7.0": { "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": [ - "whatwg-url" + "whatwg-url@5.0.0" + ] + }, + "nwsapi@2.2.13": { + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==" + }, + "parse5@7.2.1": { + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dependencies": [ + "entities" ] }, "path-browserify@1.0.1": { @@ -215,6 +343,9 @@ "picomatch@4.0.2": { "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" }, + "punycode@2.3.1": { + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, "pvtsutils@1.3.5": { "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", "dependencies": [ @@ -224,6 +355,21 @@ "pvutils@1.1.3": { "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==" }, + "rrweb-cssom@0.7.1": { + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==" + }, + "safer-buffer@2.1.2": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saxes@6.0.0": { + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dependencies": [ + "xmlchars" + ] + }, + "symbol-tree@3.2.4": { + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "tinyglobby@0.2.10_picomatch@4.0.2": { "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", "dependencies": [ @@ -231,9 +377,30 @@ "picomatch" ] }, + "tldts-core@6.1.58": { + "integrity": "sha512-dR936xmhBm7AeqHIhCWwK765gZ7dFyL+IqLSFAjJbFlUXGMLCb8i2PzlzaOuWBuplBTaBYseSb565nk/ZEM0Bg==" + }, + "tldts@6.1.58": { + "integrity": "sha512-MQJrJhjHOYGYb8DobR6Y4AdDbd4TYkyQ+KBDVc5ODzs1cbrvPpfN1IemYi9jfipJ/vR1YWvrDli0hg1y19VRoA==", + "dependencies": [ + "tldts-core" + ] + }, + "tough-cookie@5.0.0": { + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "dependencies": [ + "tldts" + ] + }, "tr46@0.0.3": { "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "tr46@5.0.0": { + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dependencies": [ + "punycode" + ] + }, "ts-morph@24.0.0": { "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", "dependencies": [ @@ -247,15 +414,49 @@ "typescript@5.6.3": { "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==" }, + "w3c-xmlserializer@5.0.0": { + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dependencies": [ + "xml-name-validator" + ] + }, "webidl-conversions@3.0.1": { "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, + "webidl-conversions@7.0.0": { + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-encoding@3.1.1": { + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": [ + "iconv-lite" + ] + }, + "whatwg-mimetype@4.0.0": { + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==" + }, + "whatwg-url@14.0.0": { + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dependencies": [ + "tr46@5.0.0", + "webidl-conversions@7.0.0" + ] + }, "whatwg-url@5.0.0": { "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": [ - "tr46", - "webidl-conversions" + "tr46@0.0.3", + "webidl-conversions@3.0.1" ] + }, + "ws@8.18.0": { + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==" + }, + "xml-name-validator@5.0.0": { + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==" + }, + "xmlchars@2.2.0": { + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" } }, "workspace": { @@ -264,10 +465,16 @@ "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", "jsr:@std/testing@^1.0.4", + "npm:jsdom@^25.0.1", "npm:ts-morph@24", "npm:typescript@^5.6.3" ], "members": { + "packages/browser": { + "dependencies": [ + "jsr:@simplewebauthn/types@^11.0.0-alpha1" + ] + }, "packages/server": { "dependencies": [ "jsr:@simplewebauthn/types@^11.0.0-alpha1", From f16544e0422f653eb4aa60c3de83050ea138e73d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 22:36:15 -0800 Subject: [PATCH 058/115] Keep package.json around as a .txt file for now --- packages/browser/{package.json => package.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/browser/{package.json => package.txt} (100%) diff --git a/packages/browser/package.json b/packages/browser/package.txt similarity index 100% rename from packages/browser/package.json rename to packages/browser/package.txt From ab0331c51a30a6c771d504fe2777ba892924f279 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 22:37:34 -0800 Subject: [PATCH 059/115] Re-enable browser tests --- .github/workflows/ciChecks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ciChecks.yml b/.github/workflows/ciChecks.yml index 94e56365a..fb6eed64c 100644 --- a/.github/workflows/ciChecks.yml +++ b/.github/workflows/ciChecks.yml @@ -58,5 +58,5 @@ jobs: # Build and test packages - name: Build & test @simplewebauthn/server run: cd packages/server && deno task test - # - name: Test @simplewebauthn/browser - # run: npm run test:browser + - name: Test @simplewebauthn/browser + run: cd packages/browser && deno task test From df177045e0be3bebc61e6d3272af57b0ed0b7517 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 22:40:45 -0800 Subject: [PATCH 060/115] Tweak CI step name --- .github/workflows/ciChecks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ciChecks.yml b/.github/workflows/ciChecks.yml index fb6eed64c..df49c06d7 100644 --- a/.github/workflows/ciChecks.yml +++ b/.github/workflows/ciChecks.yml @@ -56,7 +56,7 @@ jobs: run: deno install # Build and test packages - - name: Build & test @simplewebauthn/server + - name: Test @simplewebauthn/server run: cd packages/server && deno task test - name: Test @simplewebauthn/browser run: cd packages/browser && deno task test From ef6bd1be81bb90e918a5aab00c5212e7753ec551 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 22:43:31 -0800 Subject: [PATCH 061/115] Refine includes and excludes --- packages/browser/deno.jsonc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/browser/deno.jsonc b/packages/browser/deno.jsonc index 4cbdd81f9..de64817d7 100644 --- a/packages/browser/deno.jsonc +++ b/packages/browser/deno.jsonc @@ -15,11 +15,14 @@ "@simplewebauthn/types": "jsr:@simplewebauthn/types@^11.0.0-alpha1" }, "publish": { - "include": ["./src/**/*.ts"], + "include": [ + "README.md", + "LICENSE.md", + "./src/**/*.ts" + ], "exclude": [ "./src/**/*.test.ts", "./src/setupTests.ts", - "./src/**/__mocks__", "./src/**/__jest__" ] } From e505770325f8d55e973357536bbc8fc43df35f1f Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 8 Nov 2024 22:45:38 -0800 Subject: [PATCH 062/115] Add explicit typing to WebAuthnAbortService --- .../browser/src/helpers/webAuthnAbortService.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/browser/src/helpers/webAuthnAbortService.ts b/packages/browser/src/helpers/webAuthnAbortService.ts index 395ceeaac..8ed915fc3 100644 --- a/packages/browser/src/helpers/webAuthnAbortService.ts +++ b/packages/browser/src/helpers/webAuthnAbortService.ts @@ -1,4 +1,9 @@ -class BaseWebAuthnAbortService { +interface WebAuthnAbortService { + createNewAbortSignal(): AbortSignal; + cancelCeremony(): void; +} + +class BaseWebAuthnAbortService implements WebAuthnAbortService { private controller: AbortController | undefined; /** @@ -6,7 +11,7 @@ class BaseWebAuthnAbortService { * reload the page. This is automatically called whenever `startRegistration()` and * `startAuthentication()` are called. */ - createNewAbortSignal() { + createNewAbortSignal(): AbortSignal { // Abort any existing calls to navigator.credentials.create() or navigator.credentials.get() if (this.controller) { const abortError = new Error( @@ -25,7 +30,7 @@ class BaseWebAuthnAbortService { /** * Manually cancel any active WebAuthn registration or authentication attempt. */ - cancelCeremony() { + cancelCeremony(): void { if (this.controller) { const abortError = new Error( 'Manually cancelling existing WebAuthn API call', @@ -45,4 +50,4 @@ class BaseWebAuthnAbortService { * developers building projects that use client-side routing to better control the behavior of * their UX in response to router navigation events. */ -export const WebAuthnAbortService = new BaseWebAuthnAbortService(); +export const WebAuthnAbortService: WebAuthnAbortService = new BaseWebAuthnAbortService(); From c64e01febc3b0bf55fd371b3629a638abe70092e Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 9 Nov 2024 16:56:11 -0800 Subject: [PATCH 063/115] Delete old docs and homepage --- DOCS.md | 20 ------ homepage/index.html | 154 -------------------------------------------- 2 files changed, 174 deletions(-) delete mode 100644 DOCS.md delete mode 100644 homepage/index.html diff --git a/DOCS.md b/DOCS.md deleted file mode 100644 index 49e7fb432..000000000 --- a/DOCS.md +++ /dev/null @@ -1,20 +0,0 @@ -# API Docs - -![WebAuthn](https://img.shields.io/badge/WebAuthn-Simplified-blueviolet?style=for-the-badge&logo=WebAuthn) -[![npm (scoped)](https://img.shields.io/npm/v/@simplewebauthn/server?style=for-the-badge&logo=npm)](https://www.npmjs.com/search?q=simplewebauthn) - -Please check out the links in the sidebar for package-specific documentation. - -## Homepage - -Visit the SimpleWebAuthn homepage at https://simplewebauthn.dev - -## Github - -Source code is hosted on Github and can be viewed -[here](https://github.com/MasterKale/SimpleWebAuthn). - -## NPM - -All three packages can be found on NPM under the -[@simplewebauthn](https://www.npmjs.com/search?q=simplewebauthn) scope. diff --git a/homepage/index.html b/homepage/index.html deleted file mode 100644 index edb0b9b1e..000000000 --- a/homepage/index.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - SimpleWebAuthn - - - -
-

SimpleWebAuthn

-

WebAuthn, Simplified

- -

- A collection of TypeScript-first libraries for simpler WebAuthn integration. Supports - modern browsers and Node. -

- -

@simplewebauthn npm packages

-

- browser - server - typescript-types -

- -

additional links

-

- API Documentation - github -

-
- - - From 3dd7c11c0db3506846109c5553609bcc21648fdf Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 9 Nov 2024 16:56:20 -0800 Subject: [PATCH 064/115] Remove pnpm bootstrap script --- bootstrap.sh | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100755 bootstrap.sh diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index f3f7366ec..000000000 --- a/bootstrap.sh +++ /dev/null @@ -1,10 +0,0 @@ -# Install root dependencies without trying to link workspace packages -pnpm install --ignore-workspace -# Build types so server can build -pnpm run build:types --skip-nx-cache -# If we can't run tests on a fresh pull then it might mean we need to refresh the Deno lock file -pnpm run test:server --skip-nx-cache -# If we can build server then the repo is probably ready for dev -pnpm run build:server --skip-nx-cache -# Link all the workspace packages as usual with a standard install -pnpm install From e7f9c8f8dd59b66594aa6c9c6e62dd15c5d7b85e Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 12 Nov 2024 16:08:00 -0800 Subject: [PATCH 065/115] Remove @deno/cache-dir --- deno.jsonc | 1 - deno.lock | 51 ++------------------------------------------------- 2 files changed, 2 insertions(+), 50 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index eaca79a8d..47769f69d 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -4,7 +4,6 @@ "lineWidth": 100 }, "imports": { - "@deno/cache-dir": "jsr:@deno/cache-dir@^0.13.2", "@std/assert": "jsr:@std/assert@^1.0.7", "@std/path": "jsr:@std/path@^1.0.8", "@std/testing": "jsr:@std/testing@^1.0.4", diff --git a/deno.lock b/deno.lock index 6f75ee301..08fbf988b 100644 --- a/deno.lock +++ b/deno.lock @@ -1,19 +1,11 @@ { "version": "4", "specifiers": { - "jsr:@deno/cache-dir@~0.13.2": "0.13.2", - "jsr:@deno/graph@~0.73.1": "0.73.1", - "jsr:@std/assert@0.223": "0.223.0", "jsr:@std/assert@^1.0.7": "1.0.7", "jsr:@std/async@^1.0.8": "1.0.8", - "jsr:@std/bytes@0.223": "0.223.0", "jsr:@std/data-structures@^1.0.4": "1.0.4", - "jsr:@std/fmt@0.223": "0.223.0", - "jsr:@std/fs@0.223": "0.223.0", "jsr:@std/fs@^1.0.5": "1.0.5", "jsr:@std/internal@^1.0.5": "1.0.5", - "jsr:@std/io@0.223": "0.223.0", - "jsr:@std/path@0.223": "0.223.0", "jsr:@std/path@^1.0.7": "1.0.8", "jsr:@std/path@^1.0.8": "1.0.8", "jsr:@std/testing@^1.0.4": "1.0.4", @@ -30,22 +22,6 @@ "npm:typescript@^5.6.3": "5.6.3" }, "jsr": { - "@deno/cache-dir@0.13.2": { - "integrity": "c22419dfe27ab85f345bee487aaaadba498b005cce3644e9d2528db035c5454d", - "dependencies": [ - "jsr:@deno/graph", - "jsr:@std/fmt", - "jsr:@std/fs@0.223", - "jsr:@std/io", - "jsr:@std/path@0.223" - ] - }, - "@deno/graph@0.73.1": { - "integrity": "cd69639d2709d479037d5ce191a422eabe8d71bb68b0098344f6b07411c84d41" - }, - "@std/assert@0.223.0": { - "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" - }, "@std/assert@1.0.7": { "integrity": "64ce9fac879e0b9f3042a89b3c3f8ccfc9c984391af19e2087513a79d73e28c3", "dependencies": [ @@ -55,18 +31,9 @@ "@std/async@1.0.8": { "integrity": "c057c5211a0f1d12e7dcd111ab430091301b8d64b4250052a79d277383bc3ba7" }, - "@std/bytes@0.223.0": { - "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" - }, "@std/data-structures@1.0.4": { "integrity": "fa0e20c11eb9ba673417450915c750a0001405a784e2a4e0c3725031681684a0" }, - "@std/fmt@0.223.0": { - "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" - }, - "@std/fs@0.223.0": { - "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c" - }, "@std/fs@1.0.5": { "integrity": "41806ad6823d0b5f275f9849a2640d87e4ef67c51ee1b8fb02426f55e02fd44e", "dependencies": [ @@ -76,29 +43,16 @@ "@std/internal@1.0.5": { "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" }, - "@std/io@0.223.0": { - "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", - "dependencies": [ - "jsr:@std/assert@0.223", - "jsr:@std/bytes" - ] - }, - "@std/path@0.223.0": { - "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", - "dependencies": [ - "jsr:@std/assert@0.223" - ] - }, "@std/path@1.0.8": { "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" }, "@std/testing@1.0.4": { "integrity": "ca1368d720b183f572d40c469bb9faf09643ddd77b54f8b44d36ae6b94940576", "dependencies": [ - "jsr:@std/assert@^1.0.7", + "jsr:@std/assert", "jsr:@std/async", "jsr:@std/data-structures", - "jsr:@std/fs@^1.0.5", + "jsr:@std/fs", "jsr:@std/internal", "jsr:@std/path@^1.0.8" ] @@ -461,7 +415,6 @@ }, "workspace": { "dependencies": [ - "jsr:@deno/cache-dir@~0.13.2", "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", "jsr:@std/testing@^1.0.4", From 61e6d7fa02995dfd76e91d35e298a32772984c4e Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Wed, 20 Nov 2024 23:00:05 -0800 Subject: [PATCH 066/115] Reinstall dnt --- deno.jsonc | 1 + deno.lock | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index 47769f69d..27e970b55 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -4,6 +4,7 @@ "lineWidth": 100 }, "imports": { + "@deno/dnt": "jsr:@deno/dnt@^0.41.3", "@std/assert": "jsr:@std/assert@^1.0.7", "@std/path": "jsr:@std/path@^1.0.8", "@std/testing": "jsr:@std/testing@^1.0.4", diff --git a/deno.lock b/deno.lock index 08fbf988b..79c36c106 100644 --- a/deno.lock +++ b/deno.lock @@ -1,14 +1,32 @@ { "version": "4", "specifiers": { + "jsr:@david/code-block-writer@^13.0.2": "13.0.3", + "jsr:@deno/cache-dir@~0.10.3": "0.10.3", + "jsr:@deno/dnt@~0.41.3": "0.41.3", + "jsr:@std/assert@0.223": "0.223.0", + "jsr:@std/assert@0.226": "0.226.0", "jsr:@std/assert@^1.0.7": "1.0.7", "jsr:@std/async@^1.0.8": "1.0.8", + "jsr:@std/bytes@0.223": "0.223.0", "jsr:@std/data-structures@^1.0.4": "1.0.4", + "jsr:@std/fmt@0.223": "0.223.0", + "jsr:@std/fmt@1": "1.0.3", + "jsr:@std/fs@0.223": "0.223.0", + "jsr:@std/fs@1": "1.0.5", "jsr:@std/fs@^1.0.5": "1.0.5", + "jsr:@std/fs@~0.229.3": "0.229.3", "jsr:@std/internal@^1.0.5": "1.0.5", + "jsr:@std/io@0.223": "0.223.0", + "jsr:@std/path@0.223": "0.223.0", + "jsr:@std/path@1": "1.0.8", + "jsr:@std/path@1.0.0-rc.1": "1.0.0-rc.1", "jsr:@std/path@^1.0.7": "1.0.8", "jsr:@std/path@^1.0.8": "1.0.8", + "jsr:@std/path@~0.225.2": "0.225.2", "jsr:@std/testing@^1.0.4": "1.0.4", + "jsr:@ts-morph/bootstrap@0.24": "0.24.0", + "jsr:@ts-morph/common@0.24": "0.24.0", "npm:@hexagon/base64@^1.1.27": "1.1.28", "npm:@levischuck/tiny-cbor@~0.2.2": "0.2.2", "npm:@peculiar/asn1-android@^2.3.10": "2.3.13", @@ -22,6 +40,35 @@ "npm:typescript@^5.6.3": "5.6.3" }, "jsr": { + "@david/code-block-writer@13.0.3": { + "integrity": "f98c77d320f5957899a61bfb7a9bead7c6d83ad1515daee92dbacc861e13bb7f" + }, + "@deno/cache-dir@0.10.3": { + "integrity": "eb022f84ecc49c91d9d98131c6e6b118ff63a29e343624d058646b9d50404776", + "dependencies": [ + "jsr:@std/fmt@0.223", + "jsr:@std/fs@0.223", + "jsr:@std/io", + "jsr:@std/path@0.223" + ] + }, + "@deno/dnt@0.41.3": { + "integrity": "b2ef2c8a5111eef86cb5bfcae103d6a2938e8e649e2461634a7befb7fc59d6d2", + "dependencies": [ + "jsr:@david/code-block-writer", + "jsr:@deno/cache-dir", + "jsr:@std/fmt@1", + "jsr:@std/fs@1", + "jsr:@std/path@1", + "jsr:@ts-morph/bootstrap" + ] + }, + "@std/assert@0.223.0": { + "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" + }, + "@std/assert@0.226.0": { + "integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3" + }, "@std/assert@1.0.7": { "integrity": "64ce9fac879e0b9f3042a89b3c3f8ccfc9c984391af19e2087513a79d73e28c3", "dependencies": [ @@ -31,9 +78,27 @@ "@std/async@1.0.8": { "integrity": "c057c5211a0f1d12e7dcd111ab430091301b8d64b4250052a79d277383bc3ba7" }, + "@std/bytes@0.223.0": { + "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" + }, "@std/data-structures@1.0.4": { "integrity": "fa0e20c11eb9ba673417450915c750a0001405a784e2a4e0c3725031681684a0" }, + "@std/fmt@0.223.0": { + "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" + }, + "@std/fmt@1.0.3": { + "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" + }, + "@std/fs@0.223.0": { + "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c" + }, + "@std/fs@0.229.3": { + "integrity": "783bca21f24da92e04c3893c9e79653227ab016c48e96b3078377ebd5222e6eb", + "dependencies": [ + "jsr:@std/path@1.0.0-rc.1" + ] + }, "@std/fs@1.0.5": { "integrity": "41806ad6823d0b5f275f9849a2640d87e4ef67c51ee1b8fb02426f55e02fd44e", "dependencies": [ @@ -43,19 +108,54 @@ "@std/internal@1.0.5": { "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" }, + "@std/io@0.223.0": { + "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", + "dependencies": [ + "jsr:@std/assert@0.223", + "jsr:@std/bytes" + ] + }, + "@std/path@0.223.0": { + "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", + "dependencies": [ + "jsr:@std/assert@0.223" + ] + }, + "@std/path@0.225.2": { + "integrity": "0f2db41d36b50ef048dcb0399aac720a5348638dd3cb5bf80685bf2a745aa506", + "dependencies": [ + "jsr:@std/assert@0.226" + ] + }, + "@std/path@1.0.0-rc.1": { + "integrity": "b8c00ae2f19106a6bb7cbf1ab9be52aa70de1605daeb2dbdc4f87a7cbaf10ff6" + }, "@std/path@1.0.8": { "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" }, "@std/testing@1.0.4": { "integrity": "ca1368d720b183f572d40c469bb9faf09643ddd77b54f8b44d36ae6b94940576", "dependencies": [ - "jsr:@std/assert", + "jsr:@std/assert@^1.0.7", "jsr:@std/async", "jsr:@std/data-structures", - "jsr:@std/fs", + "jsr:@std/fs@^1.0.5", "jsr:@std/internal", "jsr:@std/path@^1.0.8" ] + }, + "@ts-morph/bootstrap@0.24.0": { + "integrity": "a826a2ef7fa8a7c3f1042df2c034d20744d94da2ee32bf29275bcd4dffd3c060", + "dependencies": [ + "jsr:@ts-morph/common" + ] + }, + "@ts-morph/common@0.24.0": { + "integrity": "12b625b8e562446ba658cdbe9ad77774b4bd96b992ae8bd34c60dbf24d06c1f3", + "dependencies": [ + "jsr:@std/fs@~0.229.3", + "jsr:@std/path@~0.225.2" + ] } }, "npm": { @@ -415,6 +515,7 @@ }, "workspace": { "dependencies": [ + "jsr:@deno/dnt@~0.41.3", "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", "jsr:@std/testing@^1.0.4", From a345338aa46acf393d5de2bee7320f0b3174d9cd Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Wed, 20 Nov 2024 23:00:55 -0800 Subject: [PATCH 067/115] Reinstate types dnt build --- packages/types/build_npm.ts | 47 +++++++++++++++++++++++++++++++++++++ packages/types/deno.jsonc | 1 + 2 files changed, 48 insertions(+) create mode 100644 packages/types/build_npm.ts diff --git a/packages/types/build_npm.ts b/packages/types/build_npm.ts new file mode 100644 index 000000000..efbf0c9a6 --- /dev/null +++ b/packages/types/build_npm.ts @@ -0,0 +1,47 @@ +import { build, emptyDir } from '@deno/dnt'; + +const outDir = './npm'; +const denoJSON: { version: string } = JSON.parse( + Deno.readTextFileSync('./deno.jsonc'), +); + +await emptyDir(outDir); + +await build({ + entryPoints: ['./src/index.ts'], + outDir, + shims: {}, + // Keeping declarations in a single types/ directory to mimic the original file structure + declaration: 'separate', + test: false, + // package.json values + package: { + name: '@simplewebauthn/types', + version: denoJSON.version, + description: 'TypeScript types used by the @simplewebauthn series of libraries', + license: 'MIT', + author: 'Matthew Miller ', + repository: { + type: 'git', + url: 'git+https://github.com/MasterKale/SimpleWebAuthn.git', + directory: 'packages/types', + }, + homepage: 'https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/types#readme', + publishConfig: { + access: 'public', + }, + bugs: { + url: 'https://github.com/MasterKale/SimpleWebAuthn/issues', + }, + keywords: [ + 'typescript', + 'webauthn', + 'passkeys', + 'fido', + 'types', + ], + }, +}); + +Deno.copyFileSync('LICENSE.md', `${outDir}/LICENSE.md`); +Deno.copyFileSync('README.md', `${outDir}/README.md`); diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index df36f3cd4..70d805910 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -3,6 +3,7 @@ "version": "11.0.0-alpha2", "exports": "./src/index.ts", "tasks": { + "build": "deno run -A build_npm.ts", "extract-dom-types": "deno run -A extract-dom-types.ts" }, "fmt": { From 618f2e01425dafef72c676fed0fb51799d2f8a27 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 21 Nov 2024 08:09:59 -0800 Subject: [PATCH 068/115] Update deno.lock --- deno.lock | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/deno.lock b/deno.lock index 79c36c106..4b8b3e4e0 100644 --- a/deno.lock +++ b/deno.lock @@ -4,6 +4,7 @@ "jsr:@david/code-block-writer@^13.0.2": "13.0.3", "jsr:@deno/cache-dir@~0.10.3": "0.10.3", "jsr:@deno/dnt@~0.41.3": "0.41.3", + "jsr:@deno/graph@~0.73.1": "0.73.1", "jsr:@std/assert@0.223": "0.223.0", "jsr:@std/assert@0.226": "0.226.0", "jsr:@std/assert@^1.0.7": "1.0.7", @@ -46,6 +47,7 @@ "@deno/cache-dir@0.10.3": { "integrity": "eb022f84ecc49c91d9d98131c6e6b118ff63a29e343624d058646b9d50404776", "dependencies": [ + "jsr:@deno/graph", "jsr:@std/fmt@0.223", "jsr:@std/fs@0.223", "jsr:@std/io", @@ -63,6 +65,9 @@ "jsr:@ts-morph/bootstrap" ] }, + "@deno/graph@0.73.1": { + "integrity": "cd69639d2709d479037d5ce191a422eabe8d71bb68b0098344f6b07411c84d41" + }, "@std/assert@0.223.0": { "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" }, From ac22a5d4f424a1b5e7a168a4c7654508fb62af2d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 21 Nov 2024 08:10:38 -0800 Subject: [PATCH 069/115] Understand Deno's monorepo linking better --- deno.lock | 6 ------ packages/browser/deno.jsonc | 4 +--- packages/server/deno.jsonc | 1 - 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/deno.lock b/deno.lock index 4b8b3e4e0..6504e9737 100644 --- a/deno.lock +++ b/deno.lock @@ -529,14 +529,8 @@ "npm:typescript@^5.6.3" ], "members": { - "packages/browser": { - "dependencies": [ - "jsr:@simplewebauthn/types@^11.0.0-alpha1" - ] - }, "packages/server": { "dependencies": [ - "jsr:@simplewebauthn/types@^11.0.0-alpha1", "npm:@hexagon/base64@^1.1.27", "npm:@levischuck/tiny-cbor@~0.2.2", "npm:@peculiar/asn1-android@^2.3.10", diff --git a/packages/browser/deno.jsonc b/packages/browser/deno.jsonc index de64817d7..e74ecd40b 100644 --- a/packages/browser/deno.jsonc +++ b/packages/browser/deno.jsonc @@ -11,9 +11,7 @@ "singleQuote": true, "lineWidth": 100 }, - "imports": { - "@simplewebauthn/types": "jsr:@simplewebauthn/types@^11.0.0-alpha1" - }, + "imports": {}, "publish": { "include": [ "README.md", diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index 9a20b6dd0..6d49b628e 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -22,7 +22,6 @@ "@peculiar/asn1-rsa": "npm:@peculiar/asn1-rsa@^2.3.8", "@peculiar/asn1-schema": "npm:@peculiar/asn1-schema@^2.3.8", "@peculiar/asn1-x509": "npm:@peculiar/asn1-x509@^2.3.8", - "@simplewebauthn/types": "jsr:@simplewebauthn/types@^11.0.0-alpha1", "cross-fetch": "npm:cross-fetch@^4.0.0" }, "publish": { From 7cc3818b53bc912f98ddf257913159fdb50dc4aa Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 21 Nov 2024 09:09:37 -0800 Subject: [PATCH 070/115] Reinstate server dnt build --- packages/server/build_npm.ts | 83 ++++++++++++++++++++++++++++++++++++ packages/server/deno.jsonc | 1 + 2 files changed, 84 insertions(+) create mode 100644 packages/server/build_npm.ts diff --git a/packages/server/build_npm.ts b/packages/server/build_npm.ts new file mode 100644 index 000000000..b8a4c4776 --- /dev/null +++ b/packages/server/build_npm.ts @@ -0,0 +1,83 @@ +import { build, emptyDir } from '@deno/dnt'; + +const outDir = './npm'; + +const denoJSON: { version: string } = JSON.parse( + Deno.readTextFileSync('./deno.jsonc'), +); +const typesDenoJSON: { version: string } = JSON.parse( + Deno.readTextFileSync('../types/deno.jsonc'), +); + +await emptyDir(outDir); + +await build({ + entryPoints: [ + { name: '.', path: './src/index.ts' }, + { name: './helpers', path: './src/helpers/index.ts' }, + ], + outDir, + importMap: './deno.jsonc', + shims: { + deno: { + test: 'dev', + }, + }, + // TODO: Re-enable if https://github.com/denoland/dnt/issues/331 can get resolved + typeCheck: false, + // TODO: Re-enable if https://github.com/denoland/dnt/issues/430 can get resolved + test: false, + // package.json values + package: { + name: '@simplewebauthn/server', + version: denoJSON.version, + description: 'SimpleWebAuthn for Servers', + license: 'MIT', + author: 'Matthew Miller ', + repository: { + type: 'git', + url: 'git+https://github.com/MasterKale/SimpleWebAuthn.git', + directory: 'packages/server', + }, + homepage: 'https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/server#readme', + publishConfig: { + access: 'public', + }, + engines: { + node: '>=20.0.0', + }, + bugs: { + url: 'https://github.com/MasterKale/SimpleWebAuthn/issues', + }, + keywords: [ + 'typescript', + 'webauthn', + 'passkeys', + 'fido', + 'node', + ], + typesVersions: { + '*': { + '.': [ + 'esm/index.d.ts', + ], + 'helpers': [ + 'esm/helpers/index.d.ts', + ], + }, + }, + dependencies: { + // Deno workspaces maps this identifier locally, make sure it's defined in the NPM package + '@simplewebauthn/types': `^${typesDenoJSON.version}`, + } + }, + // Map from Deno package to NPM package for Node build + mappings: {}, + // TypeScript tsconfig.json config + compilerOptions: { + lib: ['ES2021'], + }, +}); + +Deno.copyFileSync('LICENSE.md', `${outDir}/LICENSE.md`); +Deno.copyFileSync('README.md', `${outDir}/README.md`); diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index 6d49b628e..784831c39 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -6,6 +6,7 @@ "./helpers": "./src/helpers/index.ts" }, "tasks": { + "build": "deno task test && deno run -A build_npm.ts", "test": "deno test -A src/", "test:watch": "deno test -A --watch src/" }, From b9e538137995c65b2d9bb59b0a0c1c9cc6a6634a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 21 Nov 2024 09:23:02 -0800 Subject: [PATCH 071/115] Add browser dnt build --- packages/browser/build_npm.ts | 70 +++++++++++++++++++++++++++++++++++ packages/browser/deno.jsonc | 4 +- 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 packages/browser/build_npm.ts diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts new file mode 100644 index 000000000..8ab6d9df0 --- /dev/null +++ b/packages/browser/build_npm.ts @@ -0,0 +1,70 @@ +import { build, emptyDir } from '@deno/dnt'; + +const outDir = './npm'; + +const denoJSON: { version: string } = JSON.parse( + Deno.readTextFileSync('./deno.jsonc'), +); +const typesDenoJSON: { version: string } = JSON.parse( + Deno.readTextFileSync('../types/deno.jsonc'), +); + +await emptyDir(outDir); + +await build({ + entryPoints: ['./src/index.ts'], + outDir, + importMap: './deno.jsonc', + shims: { + deno: { + test: 'dev', + }, + }, + // TODO: Re-enable if https://github.com/denoland/dnt/issues/331 can get resolved + typeCheck: false, + // TODO: Re-enable if https://github.com/denoland/dnt/issues/430 can get resolved + test: false, + // package.json values + package: { + name: '@simplewebauthn/browser', + version: denoJSON.version, + description: 'SimpleWebAuthn for Browsers', + license: 'MIT', + author: 'Matthew Miller ', + repository: { + type: 'git', + url: 'git+https://github.com/MasterKale/SimpleWebAuthn.git', + directory: 'packages/browser', + }, + homepage: 'https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/browser#readme', + publishConfig: { + access: 'public', + }, + bugs: { + url: 'https://github.com/MasterKale/SimpleWebAuthn/issues', + }, + keywords: [ + 'typescript', + 'webauthn', + 'passkeys', + 'fido', + 'umd' + ], + dependencies: { + // Deno workspaces maps this identifier locally, make sure it's defined in the NPM package + '@simplewebauthn/types': `^${typesDenoJSON.version}`, + } + }, + // Map from Deno package to NPM package for Node build + mappings: {}, + // TypeScript tsconfig.json config + compilerOptions: { + lib: ['ES2022', 'DOM'], + }, +}); + +Deno.copyFileSync('LICENSE.md', `${outDir}/LICENSE.md`); +Deno.copyFileSync('README.md', `${outDir}/README.md`); + +// TODO: Use dnt output as Rollup input to generate a UMD bundle +// See https://rollupjs.org/javascript-api/ diff --git a/packages/browser/deno.jsonc b/packages/browser/deno.jsonc index e74ecd40b..3ba6da38c 100644 --- a/packages/browser/deno.jsonc +++ b/packages/browser/deno.jsonc @@ -3,7 +3,8 @@ "version": "11.0.0-alpha2", "exports": "./src/index.ts", "tasks": { - "build": "rimraf dist && rollup -c", + "build:rollup": "rimraf dist && rollup -c", + "build": "deno task test && deno run -A build_npm.ts", "test": "deno test -A src/", "test:watch": "deno test -A --watch src/" }, @@ -20,7 +21,6 @@ ], "exclude": [ "./src/**/*.test.ts", - "./src/setupTests.ts", "./src/**/__jest__" ] } From 6d5641d89313c066ee5fc2765e6ad4b4e60a1421 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 15:34:54 -0800 Subject: [PATCH 072/115] Get an initial UMD build going --- deno.jsonc | 3 + deno.lock | 222 ++++++++++++++++++++++++++++++++++ packages/browser/build_npm.ts | 184 ++++++++++++++++++++-------- packages/browser/deno.jsonc | 3 +- 4 files changed, 360 insertions(+), 52 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index 27e970b55..1c50895b0 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -5,10 +5,13 @@ }, "imports": { "@deno/dnt": "jsr:@deno/dnt@^0.41.3", + "@rollup/plugin-terser": "npm:@rollup/plugin-terser@^0.4.4", "@std/assert": "jsr:@std/assert@^1.0.7", "@std/path": "jsr:@std/path@^1.0.8", "@std/testing": "jsr:@std/testing@^1.0.4", "jsdom": "npm:jsdom@^25.0.1", + "rollup": "npm:rollup@^4.27.3", + "rollup-plugin-version-injector": "npm:rollup-plugin-version-injector@^1.3.3", "ts-morph": "npm:ts-morph@^24.0.0", "typescript": "npm:typescript@^5.6.3" }, diff --git a/deno.lock b/deno.lock index 6504e9737..647c32b2e 100644 --- a/deno.lock +++ b/deno.lock @@ -35,8 +35,11 @@ "npm:@peculiar/asn1-rsa@^2.3.8": "2.3.13", "npm:@peculiar/asn1-schema@^2.3.8": "2.3.13", "npm:@peculiar/asn1-x509@^2.3.8": "2.3.13", + "npm:@rollup/plugin-terser@~0.4.4": "0.4.4_rollup@4.27.3", "npm:cross-fetch@4": "4.0.0", "npm:jsdom@^25.0.1": "25.0.1", + "npm:rollup-plugin-version-injector@^1.3.3": "1.3.3", + "npm:rollup@^4.27.3": "4.27.3", "npm:ts-morph@24": "24.0.0", "npm:typescript@^5.6.3": "5.6.3" }, @@ -167,6 +170,37 @@ "@hexagon/base64@1.1.28": { "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==" }, + "@jridgewell/gen-mapping@0.3.5": { + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": [ + "@jridgewell/set-array", + "@jridgewell/sourcemap-codec", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/resolve-uri@3.1.2": { + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/set-array@1.2.1": { + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" + }, + "@jridgewell/source-map@0.3.6": { + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dependencies": [ + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/sourcemap-codec@1.5.0": { + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "@jridgewell/trace-mapping@0.3.25": { + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": [ + "@jridgewell/resolve-uri", + "@jridgewell/sourcemap-codec" + ] + }, "@levischuck/tiny-cbor@0.2.2": { "integrity": "sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw==" }, @@ -214,6 +248,69 @@ "tslib" ] }, + "@rollup/plugin-terser@0.4.4_rollup@4.27.3": { + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dependencies": [ + "rollup", + "serialize-javascript", + "smob", + "terser" + ] + }, + "@rollup/rollup-android-arm-eabi@4.27.3": { + "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==" + }, + "@rollup/rollup-android-arm64@4.27.3": { + "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==" + }, + "@rollup/rollup-darwin-arm64@4.27.3": { + "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==" + }, + "@rollup/rollup-darwin-x64@4.27.3": { + "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==" + }, + "@rollup/rollup-freebsd-arm64@4.27.3": { + "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==" + }, + "@rollup/rollup-freebsd-x64@4.27.3": { + "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==" + }, + "@rollup/rollup-linux-arm-gnueabihf@4.27.3": { + "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==" + }, + "@rollup/rollup-linux-arm-musleabihf@4.27.3": { + "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==" + }, + "@rollup/rollup-linux-arm64-gnu@4.27.3": { + "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==" + }, + "@rollup/rollup-linux-arm64-musl@4.27.3": { + "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==" + }, + "@rollup/rollup-linux-powerpc64le-gnu@4.27.3": { + "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==" + }, + "@rollup/rollup-linux-riscv64-gnu@4.27.3": { + "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==" + }, + "@rollup/rollup-linux-s390x-gnu@4.27.3": { + "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==" + }, + "@rollup/rollup-linux-x64-gnu@4.27.3": { + "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==" + }, + "@rollup/rollup-linux-x64-musl@4.27.3": { + "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==" + }, + "@rollup/rollup-win32-arm64-msvc@4.27.3": { + "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==" + }, + "@rollup/rollup-win32-ia32-msvc@4.27.3": { + "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==" + }, + "@rollup/rollup-win32-x64-msvc@4.27.3": { + "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==" + }, "@ts-morph/common@0.25.0": { "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", "dependencies": [ @@ -222,12 +319,24 @@ "tinyglobby" ] }, + "@types/estree@1.0.6": { + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, + "acorn@8.14.0": { + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" + }, "agent-base@7.1.1": { "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dependencies": [ "debug" ] }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": [ + "color-convert" + ] + }, "asn1js@3.0.5": { "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", "dependencies": [ @@ -248,15 +357,37 @@ "balanced-match" ] }, + "buffer-from@1.1.2": { + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "chalk@4.1.2": { + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": [ + "ansi-styles", + "supports-color" + ] + }, "code-block-writer@13.0.3": { "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==" }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": [ + "color-name" + ] + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "combined-stream@1.0.8": { "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": [ "delayed-stream" ] }, + "commander@2.20.3": { + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "cross-fetch@4.0.0": { "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dependencies": [ @@ -276,6 +407,9 @@ "whatwg-url@14.0.0" ] }, + "dateformat@4.6.3": { + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + }, "debug@4.3.7": { "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": [ @@ -305,6 +439,12 @@ "mime-types" ] }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" + }, + "has-flag@4.0.0": { + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "html-encoding-sniffer@4.0.0": { "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dependencies": [ @@ -363,6 +503,9 @@ "xml-name-validator" ] }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "mime-db@1.52.0": { "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, @@ -414,9 +557,51 @@ "pvutils@1.1.3": { "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==" }, + "randombytes@2.1.0": { + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": [ + "safe-buffer" + ] + }, + "rollup-plugin-version-injector@1.3.3": { + "integrity": "sha512-+Rrf0xIFHkwFGuMfphVlAOtd9FlhHFh3vrDwamJ6+YR3IxebRHGVT879qwWzZ1CpWMCLlngb2MmHW5wC5EJqvg==", + "dependencies": [ + "chalk", + "dateformat", + "lodash" + ] + }, + "rollup@4.27.3": { + "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==", + "dependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-powerpc64le-gnu", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-msvc", + "@types/estree", + "fsevents" + ] + }, "rrweb-cssom@0.7.1": { "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==" }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "safer-buffer@2.1.2": { "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, @@ -426,9 +611,43 @@ "xmlchars" ] }, + "serialize-javascript@6.0.2": { + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": [ + "randombytes" + ] + }, + "smob@1.5.0": { + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" + }, + "source-map-support@0.5.21": { + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": [ + "buffer-from", + "source-map" + ] + }, + "source-map@0.6.1": { + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color@7.2.0": { + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": [ + "has-flag" + ] + }, "symbol-tree@3.2.4": { "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "terser@5.36.0": { + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dependencies": [ + "@jridgewell/source-map", + "acorn", + "commander", + "source-map-support" + ] + }, "tinyglobby@0.2.10_picomatch@4.0.2": { "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", "dependencies": [ @@ -524,7 +743,10 @@ "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", "jsr:@std/testing@^1.0.4", + "npm:@rollup/plugin-terser@~0.4.4", "npm:jsdom@^25.0.1", + "npm:rollup-plugin-version-injector@^1.3.3", + "npm:rollup@^4.27.3", "npm:ts-morph@24", "npm:typescript@^5.6.3" ], diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index 8ab6d9df0..c8cc557f9 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -1,4 +1,7 @@ import { build, emptyDir } from '@deno/dnt'; +import { type InputOption, type OutputOptions, rollup, type RollupBuild } from 'rollup'; +import terser from '@rollup/plugin-terser'; +import versionInjector from 'rollup-plugin-version-injector'; const outDir = './npm'; @@ -9,62 +12,141 @@ const typesDenoJSON: { version: string } = JSON.parse( Deno.readTextFileSync('../types/deno.jsonc'), ); -await emptyDir(outDir); +/** + * ESM and CJS builds + */ +async function buildESMAndCJS() { + await emptyDir(outDir); -await build({ - entryPoints: ['./src/index.ts'], - outDir, - importMap: './deno.jsonc', - shims: { - deno: { - test: 'dev', + await build({ + entryPoints: ['./src/index.ts'], + outDir, + importMap: './deno.jsonc', + shims: { + deno: { + test: 'dev', + }, }, - }, - // TODO: Re-enable if https://github.com/denoland/dnt/issues/331 can get resolved - typeCheck: false, - // TODO: Re-enable if https://github.com/denoland/dnt/issues/430 can get resolved - test: false, - // package.json values - package: { - name: '@simplewebauthn/browser', - version: denoJSON.version, - description: 'SimpleWebAuthn for Browsers', - license: 'MIT', - author: 'Matthew Miller ', - repository: { - type: 'git', - url: 'git+https://github.com/MasterKale/SimpleWebAuthn.git', - directory: 'packages/browser', + // TODO: Re-enable if https://github.com/denoland/dnt/issues/331 can get resolved + typeCheck: false, + // TODO: Re-enable if https://github.com/denoland/dnt/issues/430 can get resolved + test: false, + // package.json values + package: { + name: '@simplewebauthn/browser', + version: denoJSON.version, + description: 'SimpleWebAuthn for Browsers', + license: 'MIT', + author: 'Matthew Miller ', + repository: { + type: 'git', + url: 'git+https://github.com/MasterKale/SimpleWebAuthn.git', + directory: 'packages/browser', + }, + homepage: 'https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/browser#readme', + publishConfig: { + access: 'public', + }, + bugs: { + url: 'https://github.com/MasterKale/SimpleWebAuthn/issues', + }, + keywords: [ + 'typescript', + 'webauthn', + 'passkeys', + 'fido', + 'umd', + ], + dependencies: { + // Deno workspaces maps this identifier locally, make sure it's defined in the NPM package + '@simplewebauthn/types': `^${typesDenoJSON.version}`, + }, }, - homepage: 'https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/browser#readme', - publishConfig: { - access: 'public', + // Map from Deno package to NPM package for Node build + mappings: {}, + // TypeScript tsconfig.json config + compilerOptions: { + lib: ['ES2022', 'DOM'], }, - bugs: { - url: 'https://github.com/MasterKale/SimpleWebAuthn/issues', + }); + + Deno.copyFileSync('LICENSE.md', `${outDir}/LICENSE.md`); + Deno.copyFileSync('README.md', `${outDir}/README.md`); +} + +/** + * UMD build + */ +async function buildUMD() { + // Rollup plugin to clean `tslib` comment in `UMD` bundle targeting `ES5` + const cleanTslibCommentInUMDBundleTargetingES5 = () => { + return { + name: 'cleanTslibCommentInUMDBundleTargetingES5', + renderChunk: async (code: string) => { + const comment = ` +/*! ***************************************************************************** + 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. + ***************************************************************************** */`; + return code.indexOf(comment) > -1 ? code.replace(comment, '') : null; + }, + }; + }; + + // @ts-ignore: yes, `versionInjector()` is callable + const swanVersionInjector = versionInjector({ + packageJson: `${outDir}/package.json`, + injectInComments: { + fileRegexp: /\.(js)$/, + // [@simplewebauthn/browser@2.1.0] + tag: '[@simplewebauthn/browser@{version}]', }, - keywords: [ - 'typescript', - 'webauthn', - 'passkeys', - 'fido', - 'umd' + }); + + const rollupInputOptions: InputOption = `${outDir}/esm/index.js`; + const rollupOutputOptions: OutputOptions = { + dir: `${outDir}`, + format: 'umd', + name: 'SimpleWebAuthnBrowser', + entryFileNames: 'bundle/[name].es5.umd.min.js', + plugins: [ + // TODO: Figure out how to get this back up and running + // typescript({ tsconfig: './tsconfig.es5.json' }), + // @ts-ignore: yes, `terser()` is callable + terser(), + // TODO: Figure out how to get this back up and running + // cleanTslibCommentInUMDBundleTargetingES5(), + swanVersionInjector, ], - dependencies: { - // Deno workspaces maps this identifier locally, make sure it's defined in the NPM package - '@simplewebauthn/types': `^${typesDenoJSON.version}`, - } - }, - // Map from Deno package to NPM package for Node build - mappings: {}, - // TypeScript tsconfig.json config - compilerOptions: { - lib: ['ES2022', 'DOM'], - }, -}); + }; + + let bundle: RollupBuild; + try { + // Process inputs + bundle = await rollup({ input: rollupInputOptions }); + + // an array of file names this bundle depends on + // console.log(bundle.watchFiles); + + // Write the bundle to file + await bundle.write(rollupOutputOptions); -Deno.copyFileSync('LICENSE.md', `${outDir}/LICENSE.md`); -Deno.copyFileSync('README.md', `${outDir}/README.md`); + // Close the bundle + await bundle.close(); + } catch (error) { + throw new Error('Failed to generate Rollup bundle', { cause: error }); + } +} -// TODO: Use dnt output as Rollup input to generate a UMD bundle -// See https://rollupjs.org/javascript-api/ +await buildESMAndCJS(); +await buildUMD(); diff --git a/packages/browser/deno.jsonc b/packages/browser/deno.jsonc index 3ba6da38c..e3350f010 100644 --- a/packages/browser/deno.jsonc +++ b/packages/browser/deno.jsonc @@ -3,8 +3,9 @@ "version": "11.0.0-alpha2", "exports": "./src/index.ts", "tasks": { - "build:rollup": "rimraf dist && rollup -c", + "build:rollup-old": "rimraf dist && rollup -c", "build": "deno task test && deno run -A build_npm.ts", + "build:debug": "deno run -A build_npm.ts", "test": "deno test -A src/", "test:watch": "deno test -A --watch src/" }, From bdd0b304d9e05b1d46e02003d602690ebf054aa4 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 21:19:48 -0800 Subject: [PATCH 073/115] Try to get Rollup working on dnt output again --- deno.jsonc | 1 + deno.lock | 63 +++++++++++++++++++++++++++++++++++ packages/browser/build_npm.ts | 34 +++++++++++-------- 3 files changed, 84 insertions(+), 14 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index 1c50895b0..016481bea 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -5,6 +5,7 @@ }, "imports": { "@deno/dnt": "jsr:@deno/dnt@^0.41.3", + "@rollup/plugin-node-resolve": "npm:@rollup/plugin-node-resolve@^15.3.0", "@rollup/plugin-terser": "npm:@rollup/plugin-terser@^0.4.4", "@std/assert": "jsr:@std/assert@^1.0.7", "@std/path": "jsr:@std/path@^1.0.8", diff --git a/deno.lock b/deno.lock index 647c32b2e..172eda461 100644 --- a/deno.lock +++ b/deno.lock @@ -35,6 +35,7 @@ "npm:@peculiar/asn1-rsa@^2.3.8": "2.3.13", "npm:@peculiar/asn1-schema@^2.3.8": "2.3.13", "npm:@peculiar/asn1-x509@^2.3.8": "2.3.13", + "npm:@rollup/plugin-node-resolve@^15.3.0": "15.3.0_rollup@4.27.3", "npm:@rollup/plugin-terser@~0.4.4": "0.4.4_rollup@4.27.3", "npm:cross-fetch@4": "4.0.0", "npm:jsdom@^25.0.1": "25.0.1", @@ -248,6 +249,17 @@ "tslib" ] }, + "@rollup/plugin-node-resolve@15.3.0_rollup@4.27.3": { + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "dependencies": [ + "@rollup/pluginutils", + "@types/resolve", + "deepmerge", + "is-module", + "resolve", + "rollup" + ] + }, "@rollup/plugin-terser@0.4.4_rollup@4.27.3": { "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dependencies": [ @@ -257,6 +269,15 @@ "terser" ] }, + "@rollup/pluginutils@5.1.3_rollup@4.27.3": { + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dependencies": [ + "@types/estree", + "estree-walker", + "picomatch", + "rollup" + ] + }, "@rollup/rollup-android-arm-eabi@4.27.3": { "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==" }, @@ -322,6 +343,9 @@ "@types/estree@1.0.6": { "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, + "@types/resolve@1.20.2": { + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + }, "acorn@8.14.0": { "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, @@ -419,12 +443,18 @@ "decimal.js@10.4.3": { "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, + "deepmerge@4.3.1": { + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, "delayed-stream@1.0.0": { "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "entities@4.5.0": { "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, + "estree-walker@2.0.2": { + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "fdir@6.4.2_picomatch@4.0.2": { "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "dependencies": [ @@ -442,9 +472,18 @@ "fsevents@2.3.3": { "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" }, + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, "has-flag@4.0.0": { "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "hasown@2.0.2": { + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": [ + "function-bind" + ] + }, "html-encoding-sniffer@4.0.0": { "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dependencies": [ @@ -474,6 +513,15 @@ "ipaddr.js@2.2.0": { "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==" }, + "is-core-module@2.15.1": { + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": [ + "hasown" + ] + }, + "is-module@1.0.0": { + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, "is-potential-custom-element-name@1.0.1": { "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, @@ -542,6 +590,9 @@ "path-browserify@1.0.1": { "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, "picomatch@4.0.2": { "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" }, @@ -563,6 +614,14 @@ "safe-buffer" ] }, + "resolve@1.22.8": { + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": [ + "is-core-module", + "path-parse", + "supports-preserve-symlinks-flag" + ] + }, "rollup-plugin-version-injector@1.3.3": { "integrity": "sha512-+Rrf0xIFHkwFGuMfphVlAOtd9FlhHFh3vrDwamJ6+YR3IxebRHGVT879qwWzZ1CpWMCLlngb2MmHW5wC5EJqvg==", "dependencies": [ @@ -636,6 +695,9 @@ "has-flag" ] }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "symbol-tree@3.2.4": { "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, @@ -743,6 +805,7 @@ "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", "jsr:@std/testing@^1.0.4", + "npm:@rollup/plugin-node-resolve@^15.3.0", "npm:@rollup/plugin-terser@~0.4.4", "npm:jsdom@^25.0.1", "npm:rollup-plugin-version-injector@^1.3.3", diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index c8cc557f9..cb090cfe2 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -1,7 +1,8 @@ import { build, emptyDir } from '@deno/dnt'; -import { type InputOption, type OutputOptions, rollup, type RollupBuild } from 'rollup'; +import { rollup, type RollupOptions, type OutputOptions } from 'rollup'; import terser from '@rollup/plugin-terser'; import versionInjector from 'rollup-plugin-version-injector'; +import nodeResolve from '@rollup/plugin-node-resolve'; const outDir = './npm'; @@ -67,6 +68,7 @@ async function buildESMAndCJS() { // TypeScript tsconfig.json config compilerOptions: { lib: ['ES2022', 'DOM'], + target: 'ES2021', }, }); @@ -113,33 +115,37 @@ async function buildUMD() { }, }); - const rollupInputOptions: InputOption = `${outDir}/esm/index.js`; - const rollupOutputOptions: OutputOptions = { - dir: `${outDir}`, - format: 'umd', - name: 'SimpleWebAuthnBrowser', - entryFileNames: 'bundle/[name].es5.umd.min.js', + const rollupOptions: RollupOptions = { + input: `${outDir}/esm/index.js`, + output: { + dir: `${outDir}`, + format: 'umd', + name: 'SimpleWebAuthnBrowser', + entryFileNames: 'bundle/[name].es5.umd.min.js', + plugins: [ + // @ts-ignore: `terser()` is callable + terser(), + cleanTslibCommentInUMDBundleTargetingES5(), + ], + }, plugins: [ // TODO: Figure out how to get this back up and running // typescript({ tsconfig: './tsconfig.es5.json' }), - // @ts-ignore: yes, `terser()` is callable - terser(), - // TODO: Figure out how to get this back up and running - // cleanTslibCommentInUMDBundleTargetingES5(), + // @ts-ignore: `nodeResolve()` is callable + nodeResolve(), swanVersionInjector, ], }; - let bundle: RollupBuild; try { // Process inputs - bundle = await rollup({ input: rollupInputOptions }); + const bundle = await rollup(rollupOptions); // an array of file names this bundle depends on // console.log(bundle.watchFiles); // Write the bundle to file - await bundle.write(rollupOutputOptions); + await bundle.write(rollupOptions.output as OutputOptions); // Close the bundle await bundle.close(); From 26ffb71f6f21793fb3fea5b2bc72533dc55c463c Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 21:20:08 -0800 Subject: [PATCH 074/115] Pull in CommonJS Rollup plugin --- deno.jsonc | 1 + deno.lock | 30 ++++++++++++++++++++++++++++++ packages/browser/build_npm.ts | 3 +++ 3 files changed, 34 insertions(+) diff --git a/deno.jsonc b/deno.jsonc index 016481bea..9ec6a5c53 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -5,6 +5,7 @@ }, "imports": { "@deno/dnt": "jsr:@deno/dnt@^0.41.3", + "@rollup/plugin-commonjs": "npm:@rollup/plugin-commonjs@^28.0.1", "@rollup/plugin-node-resolve": "npm:@rollup/plugin-node-resolve@^15.3.0", "@rollup/plugin-terser": "npm:@rollup/plugin-terser@^0.4.4", "@std/assert": "jsr:@std/assert@^1.0.7", diff --git a/deno.lock b/deno.lock index 172eda461..f1139da12 100644 --- a/deno.lock +++ b/deno.lock @@ -35,6 +35,7 @@ "npm:@peculiar/asn1-rsa@^2.3.8": "2.3.13", "npm:@peculiar/asn1-schema@^2.3.8": "2.3.13", "npm:@peculiar/asn1-x509@^2.3.8": "2.3.13", + "npm:@rollup/plugin-commonjs@^28.0.1": "28.0.1_rollup@4.27.3_picomatch@4.0.2", "npm:@rollup/plugin-node-resolve@^15.3.0": "15.3.0_rollup@4.27.3", "npm:@rollup/plugin-terser@~0.4.4": "0.4.4_rollup@4.27.3", "npm:cross-fetch@4": "4.0.0", @@ -249,6 +250,19 @@ "tslib" ] }, + "@rollup/plugin-commonjs@28.0.1_rollup@4.27.3_picomatch@4.0.2": { + "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", + "dependencies": [ + "@rollup/pluginutils", + "commondir", + "estree-walker", + "fdir", + "is-reference", + "magic-string", + "picomatch", + "rollup" + ] + }, "@rollup/plugin-node-resolve@15.3.0_rollup@4.27.3": { "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dependencies": [ @@ -412,6 +426,9 @@ "commander@2.20.3": { "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "commondir@1.0.1": { + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, "cross-fetch@4.0.0": { "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dependencies": [ @@ -525,6 +542,12 @@ "is-potential-custom-element-name@1.0.1": { "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, + "is-reference@1.2.1": { + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dependencies": [ + "@types/estree" + ] + }, "jsdom@25.0.1": { "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", "dependencies": [ @@ -554,6 +577,12 @@ "lodash@4.17.21": { "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "magic-string@0.30.13": { + "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==", + "dependencies": [ + "@jridgewell/sourcemap-codec" + ] + }, "mime-db@1.52.0": { "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, @@ -805,6 +834,7 @@ "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", "jsr:@std/testing@^1.0.4", + "npm:@rollup/plugin-commonjs@^28.0.1", "npm:@rollup/plugin-node-resolve@^15.3.0", "npm:@rollup/plugin-terser@~0.4.4", "npm:jsdom@^25.0.1", diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index cb090cfe2..479a96420 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -2,6 +2,7 @@ import { build, emptyDir } from '@deno/dnt'; import { rollup, type RollupOptions, type OutputOptions } from 'rollup'; import terser from '@rollup/plugin-terser'; import versionInjector from 'rollup-plugin-version-injector'; +import commonJS from '@rollup/plugin-commonjs'; import nodeResolve from '@rollup/plugin-node-resolve'; const outDir = './npm'; @@ -131,6 +132,8 @@ async function buildUMD() { plugins: [ // TODO: Figure out how to get this back up and running // typescript({ tsconfig: './tsconfig.es5.json' }), + // @ts-ignore: `commonJS()` is callable + commonJS(), // @ts-ignore: `nodeResolve()` is callable nodeResolve(), swanVersionInjector, From 65365269e6e7f6c11f197fc5b7f053db0b758391 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 22:19:31 -0800 Subject: [PATCH 075/115] Incorporate Babel into Rollup --- deno.jsonc | 2 + deno.lock | 936 ++++++++++++++++++++++++++++++++++ packages/browser/build_npm.ts | 26 +- 3 files changed, 957 insertions(+), 7 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index 9ec6a5c53..ec38913a7 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -4,7 +4,9 @@ "lineWidth": 100 }, "imports": { + "@babel/preset-env": "npm:@babel/preset-env@^7.26.0", "@deno/dnt": "jsr:@deno/dnt@^0.41.3", + "@rollup/plugin-babel": "npm:@rollup/plugin-babel@^6.0.4", "@rollup/plugin-commonjs": "npm:@rollup/plugin-commonjs@^28.0.1", "@rollup/plugin-node-resolve": "npm:@rollup/plugin-node-resolve@^15.3.0", "@rollup/plugin-terser": "npm:@rollup/plugin-terser@^0.4.4", diff --git a/deno.lock b/deno.lock index f1139da12..8c342facb 100644 --- a/deno.lock +++ b/deno.lock @@ -28,6 +28,7 @@ "jsr:@std/testing@^1.0.4": "1.0.4", "jsr:@ts-morph/bootstrap@0.24": "0.24.0", "jsr:@ts-morph/common@0.24": "0.24.0", + "npm:@babel/preset-env@^7.26.0": "7.26.0_@babel+core@7.26.0", "npm:@hexagon/base64@^1.1.27": "1.1.28", "npm:@levischuck/tiny-cbor@~0.2.2": "0.2.2", "npm:@peculiar/asn1-android@^2.3.10": "2.3.13", @@ -35,6 +36,7 @@ "npm:@peculiar/asn1-rsa@^2.3.8": "2.3.13", "npm:@peculiar/asn1-schema@^2.3.8": "2.3.13", "npm:@peculiar/asn1-x509@^2.3.8": "2.3.13", + "npm:@rollup/plugin-babel@^6.0.4": "6.0.4_@babel+core@7.26.0_rollup@4.27.3", "npm:@rollup/plugin-commonjs@^28.0.1": "28.0.1_rollup@4.27.3_picomatch@4.0.2", "npm:@rollup/plugin-node-resolve@^15.3.0": "15.3.0_rollup@4.27.3", "npm:@rollup/plugin-terser@~0.4.4": "0.4.4_rollup@4.27.3", @@ -169,6 +171,777 @@ } }, "npm": { + "@ampproject/remapping@2.3.0": { + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": [ + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping" + ] + }, + "@babel/code-frame@7.26.2": { + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dependencies": [ + "@babel/helper-validator-identifier", + "js-tokens", + "picocolors" + ] + }, + "@babel/compat-data@7.26.2": { + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==" + }, + "@babel/core@7.26.0": { + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dependencies": [ + "@ampproject/remapping", + "@babel/code-frame", + "@babel/generator", + "@babel/helper-compilation-targets", + "@babel/helper-module-transforms", + "@babel/helpers", + "@babel/parser", + "@babel/template", + "@babel/traverse", + "@babel/types", + "convert-source-map", + "debug", + "gensync", + "json5", + "semver" + ] + }, + "@babel/generator@7.26.2": { + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "dependencies": [ + "@babel/parser", + "@babel/types", + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping", + "jsesc" + ] + }, + "@babel/helper-annotate-as-pure@7.25.9": { + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/helper-builder-binary-assignment-operator-visitor@7.25.9": { + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-compilation-targets@7.25.9": { + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dependencies": [ + "@babel/compat-data", + "@babel/helper-validator-option", + "browserslist", + "lru-cache", + "semver" + ] + }, + "@babel/helper-create-class-features-plugin@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-member-expression-to-functions", + "@babel/helper-optimise-call-expression", + "@babel/helper-replace-supers", + "@babel/helper-skip-transparent-expression-wrappers", + "@babel/traverse", + "semver" + ] + }, + "@babel/helper-create-regexp-features-plugin@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "regexpu-core", + "semver" + ] + }, + "@babel/helper-define-polyfill-provider@0.6.3_@babel+core@7.26.0": { + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "debug", + "lodash.debounce", + "resolve" + ] + }, + "@babel/helper-member-expression-to-functions@7.25.9": { + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-module-imports@7.25.9": { + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-module-transforms@7.26.0_@babel+core@7.26.0": { + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@babel/helper-validator-identifier", + "@babel/traverse" + ] + }, + "@babel/helper-optimise-call-expression@7.25.9": { + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/helper-plugin-utils@7.25.9": { + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==" + }, + "@babel/helper-remap-async-to-generator@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-wrap-function", + "@babel/traverse" + ] + }, + "@babel/helper-replace-supers@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-member-expression-to-functions", + "@babel/helper-optimise-call-expression", + "@babel/traverse" + ] + }, + "@babel/helper-simple-access@7.25.9": { + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-skip-transparent-expression-wrappers@7.25.9": { + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-string-parser@7.25.9": { + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" + }, + "@babel/helper-validator-identifier@7.25.9": { + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + }, + "@babel/helper-validator-option@7.25.9": { + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==" + }, + "@babel/helper-wrap-function@7.25.9": { + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dependencies": [ + "@babel/template", + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helpers@7.26.0": { + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dependencies": [ + "@babel/template", + "@babel/types" + ] + }, + "@babel/parser@7.26.2": { + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers", + "@babel/plugin-transform-optional-chaining" + ] + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2_@babel+core@7.26.0": { + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dependencies": [ + "@babel/core" + ] + }, + "@babel/plugin-syntax-import-assertions@7.26.0_@babel+core@7.26.0": { + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-import-attributes@7.26.0_@babel+core@7.26.0": { + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-unicode-sets-regex@7.18.6_@babel+core@7.26.0": { + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-arrow-functions@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-async-generator-functions@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-remap-async-to-generator", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-async-to-generator@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@babel/helper-plugin-utils", + "@babel/helper-remap-async-to-generator" + ] + }, + "@babel/plugin-transform-block-scoped-functions@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-block-scoping@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-class-properties@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-class-static-block@7.26.0_@babel+core@7.26.0": { + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-classes@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/helper-replace-supers", + "@babel/traverse", + "globals" + ] + }, + "@babel/plugin-transform-computed-properties@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/template" + ] + }, + "@babel/plugin-transform-destructuring@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-dotall-regex@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-duplicate-keys@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-dynamic-import@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-exponentiation-operator@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "dependencies": [ + "@babel/core", + "@babel/helper-builder-binary-assignment-operator-visitor", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-export-namespace-from@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-for-of@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-function-name@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-json-strings@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-literals@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-logical-assignment-operators@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-member-expression-literals@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-modules-amd@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-modules-commonjs@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils", + "@babel/helper-simple-access" + ] + }, + "@babel/plugin-transform-modules-systemjs@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils", + "@babel/helper-validator-identifier", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-modules-umd@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-named-capturing-groups-regex@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-new-target@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-nullish-coalescing-operator@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-numeric-separator@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-object-rest-spread@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/plugin-transform-parameters" + ] + }, + "@babel/plugin-transform-object-super@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-replace-supers" + ] + }, + "@babel/plugin-transform-optional-catch-binding@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-optional-chaining@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-parameters@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-private-methods@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-private-property-in-object@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-property-literals@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-regenerator@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "regenerator-transform" + ] + }, + "@babel/plugin-transform-regexp-modifiers@7.26.0_@babel+core@7.26.0": { + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-reserved-words@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-shorthand-properties@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-spread@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-sticky-regex@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-template-literals@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-typeof-symbol@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-escapes@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-property-regex@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-regex@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-sets-regex@7.25.9_@babel+core@7.26.0": { + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/preset-env@7.26.0_@babel+core@7.26.0": { + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dependencies": [ + "@babel/compat-data", + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/helper-validator-option", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key", + "@babel/plugin-bugfix-safari-class-field-initializer-scope", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly", + "@babel/plugin-proposal-private-property-in-object", + "@babel/plugin-syntax-import-assertions", + "@babel/plugin-syntax-import-attributes", + "@babel/plugin-syntax-unicode-sets-regex", + "@babel/plugin-transform-arrow-functions", + "@babel/plugin-transform-async-generator-functions", + "@babel/plugin-transform-async-to-generator", + "@babel/plugin-transform-block-scoped-functions", + "@babel/plugin-transform-block-scoping", + "@babel/plugin-transform-class-properties", + "@babel/plugin-transform-class-static-block", + "@babel/plugin-transform-classes", + "@babel/plugin-transform-computed-properties", + "@babel/plugin-transform-destructuring", + "@babel/plugin-transform-dotall-regex", + "@babel/plugin-transform-duplicate-keys", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex", + "@babel/plugin-transform-dynamic-import", + "@babel/plugin-transform-exponentiation-operator", + "@babel/plugin-transform-export-namespace-from", + "@babel/plugin-transform-for-of", + "@babel/plugin-transform-function-name", + "@babel/plugin-transform-json-strings", + "@babel/plugin-transform-literals", + "@babel/plugin-transform-logical-assignment-operators", + "@babel/plugin-transform-member-expression-literals", + "@babel/plugin-transform-modules-amd", + "@babel/plugin-transform-modules-commonjs", + "@babel/plugin-transform-modules-systemjs", + "@babel/plugin-transform-modules-umd", + "@babel/plugin-transform-named-capturing-groups-regex", + "@babel/plugin-transform-new-target", + "@babel/plugin-transform-nullish-coalescing-operator", + "@babel/plugin-transform-numeric-separator", + "@babel/plugin-transform-object-rest-spread", + "@babel/plugin-transform-object-super", + "@babel/plugin-transform-optional-catch-binding", + "@babel/plugin-transform-optional-chaining", + "@babel/plugin-transform-parameters", + "@babel/plugin-transform-private-methods", + "@babel/plugin-transform-private-property-in-object", + "@babel/plugin-transform-property-literals", + "@babel/plugin-transform-regenerator", + "@babel/plugin-transform-regexp-modifiers", + "@babel/plugin-transform-reserved-words", + "@babel/plugin-transform-shorthand-properties", + "@babel/plugin-transform-spread", + "@babel/plugin-transform-sticky-regex", + "@babel/plugin-transform-template-literals", + "@babel/plugin-transform-typeof-symbol", + "@babel/plugin-transform-unicode-escapes", + "@babel/plugin-transform-unicode-property-regex", + "@babel/plugin-transform-unicode-regex", + "@babel/plugin-transform-unicode-sets-regex", + "@babel/preset-modules", + "babel-plugin-polyfill-corejs2", + "babel-plugin-polyfill-corejs3", + "babel-plugin-polyfill-regenerator", + "core-js-compat", + "semver" + ] + }, + "@babel/preset-modules@0.1.6-no-external-plugins_@babel+core@7.26.0": { + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/types", + "esutils" + ] + }, + "@babel/runtime@7.26.0": { + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": [ + "regenerator-runtime" + ] + }, + "@babel/template@7.25.9": { + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dependencies": [ + "@babel/code-frame", + "@babel/parser", + "@babel/types" + ] + }, + "@babel/traverse@7.25.9": { + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dependencies": [ + "@babel/code-frame", + "@babel/generator", + "@babel/parser", + "@babel/template", + "@babel/types", + "debug", + "globals" + ] + }, + "@babel/types@7.26.0": { + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dependencies": [ + "@babel/helper-string-parser", + "@babel/helper-validator-identifier" + ] + }, "@hexagon/base64@1.1.28": { "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==" }, @@ -250,6 +1023,15 @@ "tslib" ] }, + "@rollup/plugin-babel@6.0.4_@babel+core@7.26.0_rollup@4.27.3": { + "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@rollup/pluginutils", + "rollup" + ] + }, "@rollup/plugin-commonjs@28.0.1_rollup@4.27.3_picomatch@4.0.2": { "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", "dependencies": [ @@ -386,6 +1168,30 @@ "asynckit@0.4.0": { "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "babel-plugin-polyfill-corejs2@0.4.12_@babel+core@7.26.0": { + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dependencies": [ + "@babel/compat-data", + "@babel/core", + "@babel/helper-define-polyfill-provider", + "semver" + ] + }, + "babel-plugin-polyfill-corejs3@0.10.6_@babel+core@7.26.0": { + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dependencies": [ + "@babel/core", + "@babel/helper-define-polyfill-provider", + "core-js-compat" + ] + }, + "babel-plugin-polyfill-regenerator@0.6.3_@babel+core@7.26.0": { + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-define-polyfill-provider" + ] + }, "balanced-match@1.0.2": { "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, @@ -395,9 +1201,21 @@ "balanced-match" ] }, + "browserslist@4.24.2": { + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dependencies": [ + "caniuse-lite", + "electron-to-chromium", + "node-releases", + "update-browserslist-db" + ] + }, "buffer-from@1.1.2": { "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "caniuse-lite@1.0.30001677": { + "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==" + }, "chalk@4.1.2": { "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": [ @@ -429,6 +1247,15 @@ "commondir@1.0.1": { "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "convert-source-map@2.0.0": { + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "core-js-compat@3.39.0": { + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "dependencies": [ + "browserslist" + ] + }, "cross-fetch@4.0.0": { "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dependencies": [ @@ -466,12 +1293,21 @@ "delayed-stream@1.0.0": { "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "electron-to-chromium@1.5.50": { + "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==" + }, "entities@4.5.0": { "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, + "escalade@3.2.0": { + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + }, "estree-walker@2.0.2": { "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "esutils@2.0.3": { + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, "fdir@6.4.2_picomatch@4.0.2": { "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "dependencies": [ @@ -492,6 +1328,12 @@ "function-bind@1.1.2": { "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, + "gensync@1.0.0-beta.2": { + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "globals@11.12.0": { + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, "has-flag@4.0.0": { "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, @@ -548,6 +1390,9 @@ "@types/estree" ] }, + "js-tokens@4.0.0": { + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "jsdom@25.0.1": { "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", "dependencies": [ @@ -574,9 +1419,24 @@ "xml-name-validator" ] }, + "jsesc@3.0.2": { + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" + }, + "json5@2.2.3": { + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "lodash.debounce@4.0.8": { + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "lodash@4.17.21": { "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lru-cache@5.1.1": { + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": [ + "yallist" + ] + }, "magic-string@0.30.13": { "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==", "dependencies": [ @@ -607,6 +1467,9 @@ "whatwg-url@5.0.0" ] }, + "node-releases@2.0.18": { + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, "nwsapi@2.2.13": { "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==" }, @@ -622,6 +1485,9 @@ "path-parse@1.0.7": { "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, "picomatch@4.0.2": { "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" }, @@ -643,6 +1509,44 @@ "safe-buffer" ] }, + "regenerate-unicode-properties@10.2.0": { + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dependencies": [ + "regenerate" + ] + }, + "regenerate@1.4.2": { + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerator-runtime@0.14.1": { + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "regenerator-transform@0.15.2": { + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": [ + "@babel/runtime" + ] + }, + "regexpu-core@6.2.0": { + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dependencies": [ + "regenerate", + "regenerate-unicode-properties", + "regjsgen", + "regjsparser", + "unicode-match-property-ecmascript", + "unicode-match-property-value-ecmascript" + ] + }, + "regjsgen@0.8.0": { + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, + "regjsparser@0.12.0": { + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dependencies": [ + "jsesc" + ] + }, "resolve@1.22.8": { "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": [ @@ -699,6 +1603,9 @@ "xmlchars" ] }, + "semver@6.3.1": { + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, "serialize-javascript@6.0.2": { "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": [ @@ -783,6 +1690,30 @@ "typescript@5.6.3": { "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==" }, + "unicode-canonical-property-names-ecmascript@2.0.1": { + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==" + }, + "unicode-match-property-ecmascript@2.0.0": { + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": [ + "unicode-canonical-property-names-ecmascript", + "unicode-property-aliases-ecmascript" + ] + }, + "unicode-match-property-value-ecmascript@2.2.0": { + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==" + }, + "unicode-property-aliases-ecmascript@2.1.0": { + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + }, + "update-browserslist-db@1.1.1_browserslist@4.24.2": { + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dependencies": [ + "browserslist", + "escalade", + "picocolors" + ] + }, "w3c-xmlserializer@5.0.0": { "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dependencies": [ @@ -826,6 +1757,9 @@ }, "xmlchars@2.2.0": { "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "yallist@3.1.1": { + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } }, "workspace": { @@ -834,6 +1768,8 @@ "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", "jsr:@std/testing@^1.0.4", + "npm:@babel/preset-env@^7.26.0", + "npm:@rollup/plugin-babel@^6.0.4", "npm:@rollup/plugin-commonjs@^28.0.1", "npm:@rollup/plugin-node-resolve@^15.3.0", "npm:@rollup/plugin-terser@~0.4.4", diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index 479a96420..e87af6089 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -3,7 +3,8 @@ import { rollup, type RollupOptions, type OutputOptions } from 'rollup'; import terser from '@rollup/plugin-terser'; import versionInjector from 'rollup-plugin-version-injector'; import commonJS from '@rollup/plugin-commonjs'; -import nodeResolve from '@rollup/plugin-node-resolve'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import { babel, getBabelOutputPlugin } from '@rollup/plugin-babel'; const outDir = './npm'; @@ -120,23 +121,34 @@ async function buildUMD() { input: `${outDir}/esm/index.js`, output: { dir: `${outDir}`, - format: 'umd', + format: 'esm', name: 'SimpleWebAuthnBrowser', entryFileNames: 'bundle/[name].es5.umd.min.js', plugins: [ + getBabelOutputPlugin({ + moduleId: 'SimpleWebAuthnBrowser', + presets: [ + [ + '@babel/preset-env', + { + modules: 'umd', + targets: { + ie: '10', + }, + }, + ], + ], + }), // @ts-ignore: `terser()` is callable terser(), cleanTslibCommentInUMDBundleTargetingES5(), + swanVersionInjector, ], }, plugins: [ - // TODO: Figure out how to get this back up and running - // typescript({ tsconfig: './tsconfig.es5.json' }), // @ts-ignore: `commonJS()` is callable - commonJS(), - // @ts-ignore: `nodeResolve()` is callable + // commonJS(), nodeResolve(), - swanVersionInjector, ], }; From 224188c119e41db275c170742e97ac6c952b91d1 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:20:01 -0800 Subject: [PATCH 076/115] Finally figure out the UMD build --- deno.jsonc | 2 +- deno.lock | 34 ++++-------- packages/browser/build_npm.ts | 99 +++++++++++++++++++---------------- 3 files changed, 65 insertions(+), 70 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index ec38913a7..81431b52e 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -7,8 +7,8 @@ "@babel/preset-env": "npm:@babel/preset-env@^7.26.0", "@deno/dnt": "jsr:@deno/dnt@^0.41.3", "@rollup/plugin-babel": "npm:@rollup/plugin-babel@^6.0.4", - "@rollup/plugin-commonjs": "npm:@rollup/plugin-commonjs@^28.0.1", "@rollup/plugin-node-resolve": "npm:@rollup/plugin-node-resolve@^15.3.0", + "@rollup/plugin-replace": "npm:@rollup/plugin-replace@^6.0.1", "@rollup/plugin-terser": "npm:@rollup/plugin-terser@^0.4.4", "@std/assert": "jsr:@std/assert@^1.0.7", "@std/path": "jsr:@std/path@^1.0.8", diff --git a/deno.lock b/deno.lock index 8c342facb..1293b2c64 100644 --- a/deno.lock +++ b/deno.lock @@ -37,8 +37,8 @@ "npm:@peculiar/asn1-schema@^2.3.8": "2.3.13", "npm:@peculiar/asn1-x509@^2.3.8": "2.3.13", "npm:@rollup/plugin-babel@^6.0.4": "6.0.4_@babel+core@7.26.0_rollup@4.27.3", - "npm:@rollup/plugin-commonjs@^28.0.1": "28.0.1_rollup@4.27.3_picomatch@4.0.2", "npm:@rollup/plugin-node-resolve@^15.3.0": "15.3.0_rollup@4.27.3", + "npm:@rollup/plugin-replace@^6.0.1": "6.0.1_rollup@4.27.3", "npm:@rollup/plugin-terser@~0.4.4": "0.4.4_rollup@4.27.3", "npm:cross-fetch@4": "4.0.0", "npm:jsdom@^25.0.1": "25.0.1", @@ -1032,19 +1032,6 @@ "rollup" ] }, - "@rollup/plugin-commonjs@28.0.1_rollup@4.27.3_picomatch@4.0.2": { - "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", - "dependencies": [ - "@rollup/pluginutils", - "commondir", - "estree-walker", - "fdir", - "is-reference", - "magic-string", - "picomatch", - "rollup" - ] - }, "@rollup/plugin-node-resolve@15.3.0_rollup@4.27.3": { "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dependencies": [ @@ -1056,6 +1043,14 @@ "rollup" ] }, + "@rollup/plugin-replace@6.0.1_rollup@4.27.3": { + "integrity": "sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==", + "dependencies": [ + "@rollup/pluginutils", + "magic-string", + "rollup" + ] + }, "@rollup/plugin-terser@0.4.4_rollup@4.27.3": { "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dependencies": [ @@ -1244,9 +1239,6 @@ "commander@2.20.3": { "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "commondir@1.0.1": { - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, "convert-source-map@2.0.0": { "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, @@ -1384,12 +1376,6 @@ "is-potential-custom-element-name@1.0.1": { "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, - "is-reference@1.2.1": { - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dependencies": [ - "@types/estree" - ] - }, "js-tokens@4.0.0": { "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, @@ -1770,8 +1756,8 @@ "jsr:@std/testing@^1.0.4", "npm:@babel/preset-env@^7.26.0", "npm:@rollup/plugin-babel@^6.0.4", - "npm:@rollup/plugin-commonjs@^28.0.1", "npm:@rollup/plugin-node-resolve@^15.3.0", + "npm:@rollup/plugin-replace@^6.0.1", "npm:@rollup/plugin-terser@~0.4.4", "npm:jsdom@^25.0.1", "npm:rollup-plugin-version-injector@^1.3.3", diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index e87af6089..f643fed36 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -1,10 +1,10 @@ import { build, emptyDir } from '@deno/dnt'; -import { rollup, type RollupOptions, type OutputOptions } from 'rollup'; +import { type OutputOptions, rollup, type RollupOptions } from 'rollup'; import terser from '@rollup/plugin-terser'; import versionInjector from 'rollup-plugin-version-injector'; -import commonJS from '@rollup/plugin-commonjs'; import { nodeResolve } from '@rollup/plugin-node-resolve'; -import { babel, getBabelOutputPlugin } from '@rollup/plugin-babel'; +import { getBabelOutputPlugin } from '@rollup/plugin-babel'; +import replace from '@rollup/plugin-replace'; const outDir = './npm'; @@ -16,7 +16,7 @@ const typesDenoJSON: { version: string } = JSON.parse( ); /** - * ESM and CJS builds + * Generate ESM and CJS builds using Deno to Node Transform (dnt) */ async function buildESMAndCJS() { await emptyDir(outDir); @@ -79,52 +79,32 @@ async function buildESMAndCJS() { } /** - * UMD build + * Generate a UMD bundle using Rollup and Babel */ async function buildUMD() { - // Rollup plugin to clean `tslib` comment in `UMD` bundle targeting `ES5` - const cleanTslibCommentInUMDBundleTargetingES5 = () => { + // Rollup plugin to remove injected copyright notices + const cleanCopyrightCommentInUMDBundleTargetingES5 = () => { return { - name: 'cleanTslibCommentInUMDBundleTargetingES5', + name: 'cleanCopyrightCommentInUMDBundleTargetingES5', renderChunk: async (code: string) => { - const comment = ` -/*! ***************************************************************************** - 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. - ***************************************************************************** */`; + const comment = `/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */`; return code.indexOf(comment) > -1 ? code.replace(comment, '') : null; }, }; }; - // @ts-ignore: yes, `versionInjector()` is callable - const swanVersionInjector = versionInjector({ - packageJson: `${outDir}/package.json`, - injectInComments: { - fileRegexp: /\.(js)$/, - // [@simplewebauthn/browser@2.1.0] - tag: '[@simplewebauthn/browser@{version}]', - }, - }); - const rollupOptions: RollupOptions = { + // Process the ESM .js files generated by dnt input: `${outDir}/esm/index.js`, output: { dir: `${outDir}`, + // Output to ESM so Babel can take care of UMD generation format: 'esm', - name: 'SimpleWebAuthnBrowser', entryFileNames: 'bundle/[name].es5.umd.min.js', plugins: [ + /** + * Add polyfills/etc... as needed to target the lowest common denominator browser + */ getBabelOutputPlugin({ moduleId: 'SimpleWebAuthnBrowser', presets: [ @@ -132,33 +112,59 @@ async function buildUMD() { '@babel/preset-env', { modules: 'umd', - targets: { - ie: '10', - }, + /** + * Targeting IE 10 makes the bundle kinda big but at least with this + * `browserSupportsWebAuthn()` can return false + */ + targets: { ie: 10 }, }, ], ], }), - // @ts-ignore: `terser()` is callable + /** + * Strip out third-party copyright notices that might confuse people + */ + cleanCopyrightCommentInUMDBundleTargetingES5(), + /** + * Minify the bundled code + */ + // @ts-ignore: Rollup plugins are callable terser(), - cleanTslibCommentInUMDBundleTargetingES5(), - swanVersionInjector, + /** + * Add the package name and version to the top of the bundle + */ + // @ts-ignore: Rollup plugins are callable + versionInjector({ + packageJson: `${outDir}/package.json`, + injectInComments: { + fileRegexp: /\.(js)$/, + // [@simplewebauthn/browser@2.1.0] + tag: '[@simplewebauthn/browser@{version}]', + }, + }), ], }, plugins: [ - // @ts-ignore: `commonJS()` is callable - // commonJS(), + // @ts-ignore: Rollup plugins are callable + replace({ + preventAssignment: true, + values: { + // Replace Deno testing-mandated use of `globalThis` with more natural `window` + 'globalThis': 'window', + }, + // Replace all instances of the strings specified above + delimiters: ['', ''], + }), + // @ts-ignore: Rollup plugins are callable nodeResolve(), ], }; try { // Process inputs + // Generate a bundle const bundle = await rollup(rollupOptions); - // an array of file names this bundle depends on - // console.log(bundle.watchFiles); - // Write the bundle to file await bundle.write(rollupOptions.output as OutputOptions); @@ -169,5 +175,8 @@ async function buildUMD() { } } +/** + * Generate the builds + */ await buildESMAndCJS(); await buildUMD(); From c6c8381b0e800e12f73f43aaab4ed633e14ace7a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:24:39 -0800 Subject: [PATCH 077/115] Clean up Browser folder --- packages/browser/.npmignore | 7 --- packages/browser/package.txt | 52 ------------------ packages/browser/rollup.config.js | 86 ------------------------------ packages/browser/tsconfig.es5.json | 29 ---------- packages/browser/tsconfig.json | 28 ---------- 5 files changed, 202 deletions(-) delete mode 100644 packages/browser/.npmignore delete mode 100644 packages/browser/package.txt delete mode 100644 packages/browser/rollup.config.js delete mode 100644 packages/browser/tsconfig.es5.json delete mode 100644 packages/browser/tsconfig.json diff --git a/packages/browser/.npmignore b/packages/browser/.npmignore deleted file mode 100644 index 267496290..000000000 --- a/packages/browser/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -src -node_modules -coverage -.gitignore -tsconfig.* -*.config.js -__mocks__ diff --git a/packages/browser/package.txt b/packages/browser/package.txt deleted file mode 100644 index dab7887ef..000000000 --- a/packages/browser/package.txt +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "@simplewebauthn/browser", - "version": "11.0.0", - "description": "SimpleWebAuthn for Browsers", - "main": "dist/bundle/index.js", - "unpkg": "dist/bundle/index.umd.min.js", - "types": "dist/types/index.d.ts", - "author": "Matthew Miller ", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/MasterKale/SimpleWebAuthn.git", - "directory": "packages/browser" - }, - "homepage": "https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/browser#readme", - "publishConfig": { - "access": "public" - }, - "scripts": { - "build": "rimraf dist && rollup -c", - "test": "jest", - "test:watch": "jest --watch", - "test:coverage": "npm test -- --coverage", - "prepublish": "npm run build" - }, - "keywords": [ - "typescript", - "webauthn", - "passkeys", - "fido", - "umd" - ], - "dependencies": { - "@simplewebauthn/types": "workspace:^" - }, - "devDependencies": { - "@rollup/plugin-node-resolve": "^13.0.0", - "@rollup/plugin-terser": "^0.4.3", - "@rollup/plugin-typescript": "^8.2.1", - "@types/jest": "^29.5.14", - "@types/node": "^20.0.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "rimraf": "^6.0.1", - "rollup": "^2.52.1", - "rollup-plugin-version-injector": "^1.3.3", - "ts-jest": "^29.2.5", - "tslib": "^2.6.2" - }, - "type": "module", - "gitHead": "ba039fdd5fdff87f78d3bd246e9bea5f7aa39ccb" -} diff --git a/packages/browser/rollup.config.js b/packages/browser/rollup.config.js deleted file mode 100644 index 6f01689a3..000000000 --- a/packages/browser/rollup.config.js +++ /dev/null @@ -1,86 +0,0 @@ -import typescript from '@rollup/plugin-typescript'; -import nodeResolve from '@rollup/plugin-node-resolve'; -import terser from '@rollup/plugin-terser'; -import versionInjector from 'rollup-plugin-version-injector'; - -/** - * Rollup plugin to clean `tslib` comment in `UMD` bundle targeting `ES5` - */ -const cleanTslibCommentInUMDBundleTargetingES5 = () => { - return { - name: 'cleanTslibCommentInUMDBundleTargetingES5', - renderChunk: async (code) => { - const comment = ` -/*! ***************************************************************************** - 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. - ***************************************************************************** */`; - return code.indexOf(comment) > -1 ? code.replace(comment, '') : null; - }, - }; -}; - -const swanVersionInjector = versionInjector({ - injectInComments: { - fileRegexp: /\.(js)$/, - // [@simplewebauthn/browser@2.1.0] - tag: '[@simplewebauthn/browser@{version}]', - }, -}); - -/** - * Rollup configuration to generate the following: - * - ES2018 bundle - * - ES5 bundle - * - Type declarations - */ -export default [ - { - input: 'src/index.ts', - output: [ - { - dir: 'dist', - format: 'esm', - entryFileNames: 'bundle/[name].js', - preferConst: true, - }, - { - dir: 'dist', - format: 'umd', - name: 'SimpleWebAuthnBrowser', - entryFileNames: 'bundle/[name].umd.min.js', - plugins: [terser()], - }, - ], - plugins: [ - typescript({ tsconfig: './tsconfig.json' }), - nodeResolve(), - swanVersionInjector, - ], - }, - { - input: 'src/index.ts', - output: { - dir: 'dist', - format: 'umd', - name: 'SimpleWebAuthnBrowser', - entryFileNames: 'bundle/[name].es5.umd.min.js', - plugins: [terser(), cleanTslibCommentInUMDBundleTargetingES5()], - }, - plugins: [ - typescript({ tsconfig: './tsconfig.es5.json' }), - nodeResolve(), - swanVersionInjector, - ], - }, -]; diff --git a/packages/browser/tsconfig.es5.json b/packages/browser/tsconfig.es5.json deleted file mode 100644 index 186b4f4ee..000000000 --- a/packages/browser/tsconfig.es5.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "target": "ES5", - "module": "ESNext", - "moduleResolution": "node", - "lib": [ - "ES5", - "DOM" - ], - "baseUrl": "./src", - "declaration": false, - "declarationDir": null, - "declarationMap": false, - "downlevelIteration": true, - "removeComments": true, - "sourceMap": false, - "importHelpers": true, - "noEmit": true - }, - "include": [ - "./src/**/*.ts" - ], - "exclude": [ - "./src/**/*.test.ts", - "./src/setupTests.ts", - "./src/**/__mocks__" - ] -} diff --git a/packages/browser/tsconfig.json b/packages/browser/tsconfig.json deleted file mode 100644 index b96649d7e..000000000 --- a/packages/browser/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "target": "ES2021", - "module": "ESNext", - "moduleResolution": "node", - "lib": [ - "ES2022", - "DOM" - ], - "baseUrl": "./src", - "declaration": true, - "declarationDir": "./dist/types", - "declarationMap": false, - "removeComments": true, - "sourceMap": false, - "noEmit": true - }, - "include": [ - "./src/**/*.ts" - ], - "exclude": [ - "./src/**/*.test.ts", - "./src/setupTests.ts", - "./src/**/__mocks__", - "./src/**/__jest__" - ] -} From df8cca88b1ec0d6cf18a6dc749d86ac63b419cb2 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:24:55 -0800 Subject: [PATCH 078/115] Clean up some Browser Deno tasks --- packages/browser/deno.jsonc | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/browser/deno.jsonc b/packages/browser/deno.jsonc index e3350f010..dca373d58 100644 --- a/packages/browser/deno.jsonc +++ b/packages/browser/deno.jsonc @@ -3,9 +3,7 @@ "version": "11.0.0-alpha2", "exports": "./src/index.ts", "tasks": { - "build:rollup-old": "rimraf dist && rollup -c", "build": "deno task test && deno run -A build_npm.ts", - "build:debug": "deno run -A build_npm.ts", "test": "deno test -A src/", "test:watch": "deno test -A --watch src/" }, From 71778af56decd565b2ffab756caae3220dc7258b Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:27:58 -0800 Subject: [PATCH 079/115] Add deno.land/x Browser import shortcut --- deno/README.md | 4 ++++ deno/browser.ts | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 deno/browser.ts diff --git a/deno/README.md b/deno/README.md index b7104daa0..cbfd6206d 100644 --- a/deno/README.md +++ b/deno/README.md @@ -9,6 +9,10 @@ For example, to import the **server** or **types** packages into your Deno proje following to your **deps.ts** file: ```ts +import { + // ... +} from 'https://deno.land/x/simplewebauthn/deno/browser.ts'; + import { // ... } from 'https://deno.land/x/simplewebauthn/deno/server.ts'; diff --git a/deno/browser.ts b/deno/browser.ts new file mode 100644 index 000000000..3b890fd63 --- /dev/null +++ b/deno/browser.ts @@ -0,0 +1,2 @@ +// For simpler imports in Deno projects +export * from '../packages/browser/src/index.ts'; From 338d15baa28933676a24565caf88fb20c76838bc Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:33:40 -0800 Subject: [PATCH 080/115] Restore @deno/cache-dir --- deno.jsonc | 1 + deno.lock | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/deno.jsonc b/deno.jsonc index 81431b52e..34b297448 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -5,6 +5,7 @@ }, "imports": { "@babel/preset-env": "npm:@babel/preset-env@^7.26.0", + "@deno/cache-dir": "jsr:@deno/cache-dir@^0.13.2", "@deno/dnt": "jsr:@deno/dnt@^0.41.3", "@rollup/plugin-babel": "npm:@rollup/plugin-babel@^6.0.4", "@rollup/plugin-node-resolve": "npm:@rollup/plugin-node-resolve@^15.3.0", diff --git a/deno.lock b/deno.lock index 1293b2c64..62cd3a5e6 100644 --- a/deno.lock +++ b/deno.lock @@ -3,6 +3,7 @@ "specifiers": { "jsr:@david/code-block-writer@^13.0.2": "13.0.3", "jsr:@deno/cache-dir@~0.10.3": "0.10.3", + "jsr:@deno/cache-dir@~0.13.2": "0.13.2", "jsr:@deno/dnt@~0.41.3": "0.41.3", "jsr:@deno/graph@~0.73.1": "0.73.1", "jsr:@std/assert@0.223": "0.223.0", @@ -61,11 +62,20 @@ "jsr:@std/path@0.223" ] }, + "@deno/cache-dir@0.13.2": { + "integrity": "c22419dfe27ab85f345bee487aaaadba498b005cce3644e9d2528db035c5454d", + "dependencies": [ + "jsr:@std/fmt@0.223", + "jsr:@std/fs@0.223", + "jsr:@std/io", + "jsr:@std/path@0.223" + ] + }, "@deno/dnt@0.41.3": { "integrity": "b2ef2c8a5111eef86cb5bfcae103d6a2938e8e649e2461634a7befb7fc59d6d2", "dependencies": [ "jsr:@david/code-block-writer", - "jsr:@deno/cache-dir", + "jsr:@deno/cache-dir@~0.10.3", "jsr:@std/fmt@1", "jsr:@std/fs@1", "jsr:@std/path@1", @@ -1750,6 +1760,7 @@ }, "workspace": { "dependencies": [ + "jsr:@deno/cache-dir@~0.13.2", "jsr:@deno/dnt@~0.41.3", "jsr:@std/assert@^1.0.7", "jsr:@std/path@^1.0.8", From 50536b398475fcde9ace45ce1df4ecc2034a2e6e Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:35:06 -0800 Subject: [PATCH 081/115] Run `deno fmt packages/` --- packages/browser/build_npm.ts | 3 +- .../src/methods/startAuthentication.test.ts | 4 +- .../src/methods/startRegistration.test.ts | 12 +- packages/server/build_npm.ts | 2 +- packages/types/src/dom.ts | 463 +++++++++++------- 5 files changed, 293 insertions(+), 191 deletions(-) diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index f643fed36..72715c846 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -87,7 +87,8 @@ async function buildUMD() { return { name: 'cleanCopyrightCommentInUMDBundleTargetingES5', renderChunk: async (code: string) => { - const comment = `/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */`; + const comment = + `/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */`; return code.indexOf(comment) > -1 ? code.replace(comment, '') : null; }, }; diff --git a/packages/browser/src/methods/startAuthentication.test.ts b/packages/browser/src/methods/startAuthentication.test.ts index 16e48c80a..0e2a27113 100644 --- a/packages/browser/src/methods/startAuthentication.test.ts +++ b/packages/browser/src/methods/startAuthentication.test.ts @@ -553,7 +553,7 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startAuthentication({ optionsJSON: goodOpts1 }), WebAuthnError, - '1.2.3.4 is an invalid domain' + '1.2.3.4 is an invalid domain', ); assertEquals(rejected.name, 'SecurityError'); @@ -567,7 +567,7 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startAuthentication({ optionsJSON: goodOpts1 }), WebAuthnError, - `RP ID "${goodOpts1.rpId}" is invalid for this domain` + `RP ID "${goodOpts1.rpId}" is invalid for this domain`, ); assertEquals(rejected.name, 'SecurityError'); diff --git a/packages/browser/src/methods/startRegistration.test.ts b/packages/browser/src/methods/startRegistration.test.ts index 2b75b19fa..06a330b4c 100644 --- a/packages/browser/src/methods/startRegistration.test.ts +++ b/packages/browser/src/methods/startRegistration.test.ts @@ -417,7 +417,7 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: opts }), WebAuthnError, - 'Discoverable credentials were required' + 'Discoverable credentials were required', ); assertStringIncludes(rejected.message.toLowerCase(), 'no available authenticator supported'); @@ -437,7 +437,7 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: opts }), WebAuthnError, - 'User verification was required' + 'User verification was required', ); assertStringIncludes(rejected.message.toLowerCase(), 'no available authenticator supported'); @@ -482,7 +482,7 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, - 'authenticator was previously registered' + 'authenticator was previously registered', ); assertEquals(rejected.name, 'InvalidStateError'); @@ -513,7 +513,7 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, - 'Operation failed' + 'Operation failed', ); assertEquals(rejected.name, 'NotAllowedError'); @@ -542,7 +542,7 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, - 'sites with TLS certificate errors' + 'sites with TLS certificate errors', ); assertEquals(rejected.name, 'NotAllowedError'); @@ -621,7 +621,7 @@ describe('WebAuthnError', () => { const rejected = await assertRejects( () => startRegistration({ optionsJSON: goodOpts1 }), WebAuthnError, - '1.2.3.4 is an invalid domain' + '1.2.3.4 is an invalid domain', ); assertEquals(rejected.name, 'SecurityError'); diff --git a/packages/server/build_npm.ts b/packages/server/build_npm.ts index b8a4c4776..11feaeb9e 100644 --- a/packages/server/build_npm.ts +++ b/packages/server/build_npm.ts @@ -69,7 +69,7 @@ await build({ dependencies: { // Deno workspaces maps this identifier locally, make sure it's defined in the NPM package '@simplewebauthn/types': `^${typesDenoJSON.version}`, - } + }, }, // Map from Deno package to NPM package for Node build mappings: {}, diff --git a/packages/types/src/dom.ts b/packages/types/src/dom.ts index 2ac97aae6..b1cc87b4b 100644 --- a/packages/types/src/dom.ts +++ b/packages/types/src/dom.ts @@ -10,12 +10,12 @@ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse) */ export interface AuthenticatorAssertionResponse extends AuthenticatorResponse { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/authenticatorData) */ - readonly authenticatorData: ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/signature) */ - readonly signature: ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/userHandle) */ - readonly userHandle: ArrayBuffer | null; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/authenticatorData) */ + readonly authenticatorData: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/signature) */ + readonly signature: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/userHandle) */ + readonly userHandle: ArrayBuffer | null; } /** @@ -24,36 +24,36 @@ export interface AuthenticatorAssertionResponse extends AuthenticatorResponse { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse) */ export interface AuthenticatorAttestationResponse extends AuthenticatorResponse { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/attestationObject) */ - readonly attestationObject: ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getAuthenticatorData) */ - getAuthenticatorData(): ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKey) */ - getPublicKey(): ArrayBuffer | null; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKeyAlgorithm) */ - getPublicKeyAlgorithm(): COSEAlgorithmIdentifier; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getTransports) */ - getTransports(): string[]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/attestationObject) */ + readonly attestationObject: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getAuthenticatorData) */ + getAuthenticatorData(): ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKey) */ + getPublicKey(): ArrayBuffer | null; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKeyAlgorithm) */ + getPublicKeyAlgorithm(): COSEAlgorithmIdentifier; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getTransports) */ + getTransports(): string[]; } export interface AuthenticationExtensionsClientInputs { - appid?: string; - credProps?: boolean; - hmacCreateSecret?: boolean; - minPinLength?: boolean; + appid?: string; + credProps?: boolean; + hmacCreateSecret?: boolean; + minPinLength?: boolean; } export interface AuthenticationExtensionsClientOutputs { - appid?: boolean; - credProps?: CredentialPropertiesOutput; - hmacCreateSecret?: boolean; + appid?: boolean; + credProps?: CredentialPropertiesOutput; + hmacCreateSecret?: boolean; } export interface AuthenticatorSelectionCriteria { - authenticatorAttachment?: AuthenticatorAttachment; - requireResidentKey?: boolean; - residentKey?: ResidentKeyRequirement; - userVerification?: UserVerificationRequirement; + authenticatorAttachment?: AuthenticatorAttachment; + requireResidentKey?: boolean; + residentKey?: ResidentKeyRequirement; + userVerification?: UserVerificationRequirement; } /** @@ -62,20 +62,20 @@ export interface AuthenticatorSelectionCriteria { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto) */ export interface Crypto { - /** - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle) - */ - readonly subtle: SubtleCrypto; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues) */ - getRandomValues(array: T): T; - /** - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID) - */ - randomUUID(): `${string}-${string}-${string}-${string}-${string}`; + /** + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle) + */ + readonly subtle: SubtleCrypto; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues) */ + getRandomValues(array: T): T; + /** + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID) + */ + randomUUID(): `${string}-${string}-${string}-${string}-${string}`; } /** @@ -84,51 +84,51 @@ export interface Crypto { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential) */ export interface PublicKeyCredential extends Credential { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/authenticatorAttachment) */ - readonly authenticatorAttachment: string | null; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/rawId) */ - readonly rawId: ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/response) */ - readonly response: AuthenticatorResponse; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/getClientExtensionResults) */ - getClientExtensionResults(): AuthenticationExtensionsClientOutputs; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/authenticatorAttachment) */ + readonly authenticatorAttachment: string | null; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/rawId) */ + readonly rawId: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/response) */ + readonly response: AuthenticatorResponse; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/getClientExtensionResults) */ + getClientExtensionResults(): AuthenticationExtensionsClientOutputs; } export interface PublicKeyCredentialCreationOptions { - attestation?: AttestationConveyancePreference; - authenticatorSelection?: AuthenticatorSelectionCriteria; - challenge: BufferSource; - excludeCredentials?: PublicKeyCredentialDescriptor[]; - extensions?: AuthenticationExtensionsClientInputs; - pubKeyCredParams: PublicKeyCredentialParameters[]; - rp: PublicKeyCredentialRpEntity; - timeout?: number; - user: PublicKeyCredentialUserEntity; + attestation?: AttestationConveyancePreference; + authenticatorSelection?: AuthenticatorSelectionCriteria; + challenge: BufferSource; + excludeCredentials?: PublicKeyCredentialDescriptor[]; + extensions?: AuthenticationExtensionsClientInputs; + pubKeyCredParams: PublicKeyCredentialParameters[]; + rp: PublicKeyCredentialRpEntity; + timeout?: number; + user: PublicKeyCredentialUserEntity; } export interface PublicKeyCredentialDescriptor { - id: BufferSource; - transports?: AuthenticatorTransport[]; - type: PublicKeyCredentialType; + id: BufferSource; + transports?: AuthenticatorTransport[]; + type: PublicKeyCredentialType; } export interface PublicKeyCredentialParameters { - alg: COSEAlgorithmIdentifier; - type: PublicKeyCredentialType; + alg: COSEAlgorithmIdentifier; + type: PublicKeyCredentialType; } export interface PublicKeyCredentialRequestOptions { - allowCredentials?: PublicKeyCredentialDescriptor[]; - challenge: BufferSource; - extensions?: AuthenticationExtensionsClientInputs; - rpId?: string; - timeout?: number; - userVerification?: UserVerificationRequirement; + allowCredentials?: PublicKeyCredentialDescriptor[]; + challenge: BufferSource; + extensions?: AuthenticationExtensionsClientInputs; + rpId?: string; + timeout?: number; + userVerification?: UserVerificationRequirement; } export interface PublicKeyCredentialUserEntity extends PublicKeyCredentialEntity { - displayName: string; - id: BufferSource; + displayName: string; + id: BufferSource; } /** @@ -137,12 +137,12 @@ export interface PublicKeyCredentialUserEntity extends PublicKeyCredentialEntity * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorResponse) */ export interface AuthenticatorResponse { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorResponse/clientDataJSON) */ - readonly clientDataJSON: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorResponse/clientDataJSON) */ + readonly clientDataJSON: ArrayBuffer; } export interface CredentialPropertiesOutput { - rk?: boolean; + rk?: boolean; } /** @@ -152,36 +152,129 @@ export interface CredentialPropertiesOutput { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto) */ export interface SubtleCrypto { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt) */ - decrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits) */ - deriveBits(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, length: number): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey) */ - deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest) */ - digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt) */ - encrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */ - exportKey(format: "jwk", key: CryptoKey): Promise; - exportKey(format: Exclude, key: CryptoKey): Promise; - exportKey(format: KeyFormat, key: CryptoKey): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */ - generateKey(algorithm: "Ed25519", extractable: boolean, keyUsages: ReadonlyArray<"sign" | "verify">): Promise; - generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray): Promise; - generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: ReadonlyArray): Promise; - generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: KeyUsage[]): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey) */ - importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: ReadonlyArray): Promise; - importKey(format: Exclude, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign) */ - sign(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, data: BufferSource): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey) */ - unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify) */ - verify(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, signature: BufferSource, data: BufferSource): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey) */ - wrapKey(format: KeyFormat, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt) */ + decrypt( + algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits) */ + deriveBits( + algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, + baseKey: CryptoKey, + length: number, + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey) */ + deriveKey( + algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, + baseKey: CryptoKey, + derivedKeyType: + | AlgorithmIdentifier + | AesDerivedKeyParams + | HmacImportParams + | HkdfParams + | Pbkdf2Params, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest) */ + digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt) */ + encrypt( + algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */ + exportKey(format: 'jwk', key: CryptoKey): Promise; + exportKey(format: Exclude, key: CryptoKey): Promise; + exportKey(format: KeyFormat, key: CryptoKey): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */ + generateKey( + algorithm: 'Ed25519', + extractable: boolean, + keyUsages: ReadonlyArray<'sign' | 'verify'>, + ): Promise; + generateKey( + algorithm: RsaHashedKeyGenParams | EcKeyGenParams, + extractable: boolean, + keyUsages: ReadonlyArray, + ): Promise; + generateKey( + algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, + extractable: boolean, + keyUsages: ReadonlyArray, + ): Promise; + generateKey( + algorithm: AlgorithmIdentifier, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey) */ + importKey( + format: 'jwk', + keyData: JsonWebKey, + algorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: ReadonlyArray, + ): Promise; + importKey( + format: Exclude, + keyData: BufferSource, + algorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign) */ + sign( + algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey) */ + unwrapKey( + format: KeyFormat, + wrappedKey: BufferSource, + unwrappingKey: CryptoKey, + unwrapAlgorithm: + | AlgorithmIdentifier + | RsaOaepParams + | AesCtrParams + | AesCbcParams + | AesGcmParams, + unwrappedKeyAlgorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify) */ + verify( + algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, + key: CryptoKey, + signature: BufferSource, + data: BufferSource, + ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey) */ + wrapKey( + format: KeyFormat, + key: CryptoKey, + wrappingKey: CryptoKey, + wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + ): Promise; } /** @@ -190,37 +283,37 @@ export interface SubtleCrypto { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential) */ export interface Credential { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential/id) */ - readonly id: string; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential/type) */ - readonly type: string; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential/id) */ + readonly id: string; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential/type) */ + readonly type: string; } export interface PublicKeyCredentialRpEntity extends PublicKeyCredentialEntity { - id?: string; + id?: string; } export interface PublicKeyCredentialEntity { - name: string; + name: string; } export interface RsaOaepParams extends Algorithm { - label?: BufferSource; + label?: BufferSource; } export interface AesCtrParams extends Algorithm { - counter: BufferSource; - length: number; + counter: BufferSource; + length: number; } export interface AesCbcParams extends Algorithm { - iv: BufferSource; + iv: BufferSource; } export interface AesGcmParams extends Algorithm { - additionalData?: BufferSource; - iv: BufferSource; - tagLength?: number; + additionalData?: BufferSource; + iv: BufferSource; + tagLength?: number; } /** @@ -230,135 +323,143 @@ export interface AesGcmParams extends Algorithm { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey) */ export interface CryptoKey { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) */ - readonly algorithm: KeyAlgorithm; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) */ - readonly extractable: boolean; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) */ - readonly type: KeyType; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) */ - readonly usages: KeyUsage[]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) */ + readonly algorithm: KeyAlgorithm; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) */ + readonly extractable: boolean; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) */ + readonly type: KeyType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) */ + readonly usages: KeyUsage[]; } export interface EcdhKeyDeriveParams extends Algorithm { - public: CryptoKey; + public: CryptoKey; } export interface HkdfParams extends Algorithm { - hash: HashAlgorithmIdentifier; - info: BufferSource; - salt: BufferSource; + hash: HashAlgorithmIdentifier; + info: BufferSource; + salt: BufferSource; } export interface Pbkdf2Params extends Algorithm { - hash: HashAlgorithmIdentifier; - iterations: number; - salt: BufferSource; + hash: HashAlgorithmIdentifier; + iterations: number; + salt: BufferSource; } export interface AesDerivedKeyParams extends Algorithm { - length: number; + length: number; } export interface HmacImportParams extends Algorithm { - hash: HashAlgorithmIdentifier; - length?: number; + hash: HashAlgorithmIdentifier; + length?: number; } export interface JsonWebKey { - alg?: string; - crv?: string; - d?: string; - dp?: string; - dq?: string; - e?: string; - ext?: boolean; - k?: string; - key_ops?: string[]; - kty?: string; - n?: string; - oth?: RsaOtherPrimesInfo[]; - p?: string; - q?: string; - qi?: string; - use?: string; - x?: string; - y?: string; + alg?: string; + crv?: string; + d?: string; + dp?: string; + dq?: string; + e?: string; + ext?: boolean; + k?: string; + key_ops?: string[]; + kty?: string; + n?: string; + oth?: RsaOtherPrimesInfo[]; + p?: string; + q?: string; + qi?: string; + use?: string; + x?: string; + y?: string; } export interface CryptoKeyPair { - privateKey: CryptoKey; - publicKey: CryptoKey; + privateKey: CryptoKey; + publicKey: CryptoKey; } export interface RsaHashedKeyGenParams extends RsaKeyGenParams { - hash: HashAlgorithmIdentifier; + hash: HashAlgorithmIdentifier; } export interface EcKeyGenParams extends Algorithm { - namedCurve: NamedCurve; + namedCurve: NamedCurve; } export interface AesKeyGenParams extends Algorithm { - length: number; + length: number; } export interface HmacKeyGenParams extends Algorithm { - hash: HashAlgorithmIdentifier; - length?: number; + hash: HashAlgorithmIdentifier; + length?: number; } export interface RsaHashedImportParams extends Algorithm { - hash: HashAlgorithmIdentifier; + hash: HashAlgorithmIdentifier; } export interface EcKeyImportParams extends Algorithm { - namedCurve: NamedCurve; + namedCurve: NamedCurve; } export interface AesKeyAlgorithm extends KeyAlgorithm { - length: number; + length: number; } export interface RsaPssParams extends Algorithm { - saltLength: number; + saltLength: number; } export interface EcdsaParams extends Algorithm { - hash: HashAlgorithmIdentifier; + hash: HashAlgorithmIdentifier; } export interface Algorithm { - name: string; + name: string; } export interface KeyAlgorithm { - name: string; + name: string; } export interface RsaOtherPrimesInfo { - d?: string; - r?: string; - t?: string; + d?: string; + r?: string; + t?: string; } export interface RsaKeyGenParams extends Algorithm { - modulusLength: number; - publicExponent: BigInteger; + modulusLength: number; + publicExponent: BigInteger; } -export type AttestationConveyancePreference = "direct" | "enterprise" | "indirect" | "none"; -export type AuthenticatorTransport = "ble" | "hybrid" | "internal" | "nfc" | "usb"; +export type AttestationConveyancePreference = 'direct' | 'enterprise' | 'indirect' | 'none'; +export type AuthenticatorTransport = 'ble' | 'hybrid' | 'internal' | 'nfc' | 'usb'; export type COSEAlgorithmIdentifier = number; -export type UserVerificationRequirement = "discouraged" | "preferred" | "required"; -export type AuthenticatorAttachment = "cross-platform" | "platform"; -export type ResidentKeyRequirement = "discouraged" | "preferred" | "required"; +export type UserVerificationRequirement = 'discouraged' | 'preferred' | 'required'; +export type AuthenticatorAttachment = 'cross-platform' | 'platform'; +export type ResidentKeyRequirement = 'discouraged' | 'preferred' | 'required'; export type BufferSource = ArrayBufferView | ArrayBuffer; -export type PublicKeyCredentialType = "public-key"; +export type PublicKeyCredentialType = 'public-key'; export type AlgorithmIdentifier = Algorithm | string; -export type KeyUsage = "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey"; -export type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki"; -export type KeyType = "private" | "public" | "secret"; +export type KeyUsage = + | 'decrypt' + | 'deriveBits' + | 'deriveKey' + | 'encrypt' + | 'sign' + | 'unwrapKey' + | 'verify' + | 'wrapKey'; +export type KeyFormat = 'jwk' | 'pkcs8' | 'raw' | 'spki'; +export type KeyType = 'private' | 'public' | 'secret'; export type HashAlgorithmIdentifier = AlgorithmIdentifier; export type NamedCurve = string; export type BigInteger = Uint8Array; From a87cfb6ca02d385642d663fda035ec1081eaee1c Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:49:02 -0800 Subject: [PATCH 082/115] Add some console output from UMD build --- packages/browser/build_npm.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index 72715c846..ee756768b 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -82,6 +82,8 @@ async function buildESMAndCJS() { * Generate a UMD bundle using Rollup and Babel */ async function buildUMD() { + console.log('Building UMD bundle...'); + // Rollup plugin to remove injected copyright notices const cleanCopyrightCommentInUMDBundleTargetingES5 = () => { return { @@ -166,6 +168,7 @@ async function buildUMD() { // Generate a bundle const bundle = await rollup(rollupOptions); + console.log('Writing bundle...') // Write the bundle to file await bundle.write(rollupOptions.output as OutputOptions); @@ -174,6 +177,8 @@ async function buildUMD() { } catch (error) { throw new Error('Failed to generate Rollup bundle', { cause: error }); } + + console.log('Complete!'); } /** From 1781ff607a901bfb38f3a5a200c27203cb552177 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:56:25 -0800 Subject: [PATCH 083/115] Prepare publish tasks --- deno.jsonc | 10 ++++++++++ packages/browser/build_npm.ts | 2 +- packages/browser/deno.jsonc | 8 ++++++-- packages/server/deno.jsonc | 8 ++++++-- packages/types/deno.jsonc | 8 +++++++- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index 34b297448..398f4232b 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -1,4 +1,14 @@ { + "tasks": { + "test:browser": "(cd packages/browser; deno task test)", + "test:server": "(cd packages/server; deno task test)", + "build:types": "(cd packages/types; deno task build)", + "build:browser": "(cd packages/browser; deno task build)", + "build:server": "(cd packages/server; deno task build)", + "publish:types": "deno task build:types && (cd packages/types; deno task publish)", + "publish:browser": "deno task build:browser && (cd packages/browser; deno task publish)", + "publish:server": "deno task build:server && (cd packages/server; deno task publish)" + }, "fmt": { "singleQuote": true, "lineWidth": 100 diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index ee756768b..7c5062967 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -168,7 +168,7 @@ async function buildUMD() { // Generate a bundle const bundle = await rollup(rollupOptions); - console.log('Writing bundle...') + console.log('Writing bundle...'); // Write the bundle to file await bundle.write(rollupOptions.output as OutputOptions); diff --git a/packages/browser/deno.jsonc b/packages/browser/deno.jsonc index dca373d58..4cdaf4525 100644 --- a/packages/browser/deno.jsonc +++ b/packages/browser/deno.jsonc @@ -5,7 +5,10 @@ "tasks": { "build": "deno task test && deno run -A build_npm.ts", "test": "deno test -A src/", - "test:watch": "deno test -A --watch src/" + "test:watch": "deno test -A --watch src/", + "publish": "deno task publish:jsr && deno task publish:npm", + "publish:jsr": "deno publish", + "publish:npm": "(cd npm; npm publish)" }, "fmt": { "singleQuote": true, @@ -20,7 +23,8 @@ ], "exclude": [ "./src/**/*.test.ts", - "./src/**/__jest__" + "./src/**/__jest__", + "./npm" ] } } diff --git a/packages/server/deno.jsonc b/packages/server/deno.jsonc index 784831c39..cc2b3a818 100644 --- a/packages/server/deno.jsonc +++ b/packages/server/deno.jsonc @@ -8,7 +8,10 @@ "tasks": { "build": "deno task test && deno run -A build_npm.ts", "test": "deno test -A src/", - "test:watch": "deno test -A --watch src/" + "test:watch": "deno test -A --watch src/", + "publish": "deno task publish:jsr && deno task publish:npm", + "publish:jsr": "deno publish", + "publish:npm": "(cd npm; npm publish)" }, "fmt": { "singleQuote": true, @@ -32,7 +35,8 @@ "src/**/*.ts" ], "exclude": [ - "src/**/*.test.ts" + "src/**/*.test.ts", + "./npm" ] } } diff --git a/packages/types/deno.jsonc b/packages/types/deno.jsonc index 70d805910..0ee59dff9 100644 --- a/packages/types/deno.jsonc +++ b/packages/types/deno.jsonc @@ -4,7 +4,10 @@ "exports": "./src/index.ts", "tasks": { "build": "deno run -A build_npm.ts", - "extract-dom-types": "deno run -A extract-dom-types.ts" + "extract-dom-types": "deno run -A extract-dom-types.ts", + "publish": "deno task publish:jsr && deno task publish:npm", + "publish:jsr": "deno publish", + "publish:npm": "(cd npm; npm publish)" }, "fmt": { "singleQuote": true, @@ -15,6 +18,9 @@ "README.md", "LICENSE.md", "src/**/*.ts" + ], + "exclude": [ + "./npm" ] } } From b1c0b0247482c2db5c6c5b3437cadec86fbef591 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Fri, 22 Nov 2024 23:56:48 -0800 Subject: [PATCH 084/115] Prevent Deno from formatting extracted DOM types --- packages/types/extract-dom-types.ts | 1 + packages/types/src/dom.ts | 464 +++++++++++----------------- 2 files changed, 183 insertions(+), 282 deletions(-) diff --git a/packages/types/extract-dom-types.ts b/packages/types/extract-dom-types.ts index 286506e97..2c0ced542 100644 --- a/packages/types/extract-dom-types.ts +++ b/packages/types/extract-dom-types.ts @@ -97,6 +97,7 @@ const outputSourceFile = project.createSourceFile(`src/dom.ts`, undefined, { overwrite: true, }); outputSourceFile.addStatements([ + `// deno-fmt-ignore-file`, `/**`, ` * Generated from typescript@${version}`, ` * To regenerate, run the following command from the package root:`, diff --git a/packages/types/src/dom.ts b/packages/types/src/dom.ts index b1cc87b4b..265fe855a 100644 --- a/packages/types/src/dom.ts +++ b/packages/types/src/dom.ts @@ -1,3 +1,4 @@ +// deno-fmt-ignore-file /** * Generated from typescript@5.6.3 * To regenerate, run the following command from the package root: @@ -10,12 +11,12 @@ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse) */ export interface AuthenticatorAssertionResponse extends AuthenticatorResponse { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/authenticatorData) */ - readonly authenticatorData: ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/signature) */ - readonly signature: ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/userHandle) */ - readonly userHandle: ArrayBuffer | null; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/authenticatorData) */ + readonly authenticatorData: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/signature) */ + readonly signature: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAssertionResponse/userHandle) */ + readonly userHandle: ArrayBuffer | null; } /** @@ -24,36 +25,36 @@ export interface AuthenticatorAssertionResponse extends AuthenticatorResponse { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse) */ export interface AuthenticatorAttestationResponse extends AuthenticatorResponse { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/attestationObject) */ - readonly attestationObject: ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getAuthenticatorData) */ - getAuthenticatorData(): ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKey) */ - getPublicKey(): ArrayBuffer | null; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKeyAlgorithm) */ - getPublicKeyAlgorithm(): COSEAlgorithmIdentifier; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getTransports) */ - getTransports(): string[]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/attestationObject) */ + readonly attestationObject: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getAuthenticatorData) */ + getAuthenticatorData(): ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKey) */ + getPublicKey(): ArrayBuffer | null; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getPublicKeyAlgorithm) */ + getPublicKeyAlgorithm(): COSEAlgorithmIdentifier; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorAttestationResponse/getTransports) */ + getTransports(): string[]; } export interface AuthenticationExtensionsClientInputs { - appid?: string; - credProps?: boolean; - hmacCreateSecret?: boolean; - minPinLength?: boolean; + appid?: string; + credProps?: boolean; + hmacCreateSecret?: boolean; + minPinLength?: boolean; } export interface AuthenticationExtensionsClientOutputs { - appid?: boolean; - credProps?: CredentialPropertiesOutput; - hmacCreateSecret?: boolean; + appid?: boolean; + credProps?: CredentialPropertiesOutput; + hmacCreateSecret?: boolean; } export interface AuthenticatorSelectionCriteria { - authenticatorAttachment?: AuthenticatorAttachment; - requireResidentKey?: boolean; - residentKey?: ResidentKeyRequirement; - userVerification?: UserVerificationRequirement; + authenticatorAttachment?: AuthenticatorAttachment; + requireResidentKey?: boolean; + residentKey?: ResidentKeyRequirement; + userVerification?: UserVerificationRequirement; } /** @@ -62,20 +63,20 @@ export interface AuthenticatorSelectionCriteria { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto) */ export interface Crypto { - /** - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle) - */ - readonly subtle: SubtleCrypto; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues) */ - getRandomValues(array: T): T; - /** - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID) - */ - randomUUID(): `${string}-${string}-${string}-${string}-${string}`; + /** + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle) + */ + readonly subtle: SubtleCrypto; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues) */ + getRandomValues(array: T): T; + /** + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID) + */ + randomUUID(): `${string}-${string}-${string}-${string}-${string}`; } /** @@ -84,51 +85,51 @@ export interface Crypto { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential) */ export interface PublicKeyCredential extends Credential { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/authenticatorAttachment) */ - readonly authenticatorAttachment: string | null; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/rawId) */ - readonly rawId: ArrayBuffer; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/response) */ - readonly response: AuthenticatorResponse; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/getClientExtensionResults) */ - getClientExtensionResults(): AuthenticationExtensionsClientOutputs; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/authenticatorAttachment) */ + readonly authenticatorAttachment: string | null; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/rawId) */ + readonly rawId: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/response) */ + readonly response: AuthenticatorResponse; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/PublicKeyCredential/getClientExtensionResults) */ + getClientExtensionResults(): AuthenticationExtensionsClientOutputs; } export interface PublicKeyCredentialCreationOptions { - attestation?: AttestationConveyancePreference; - authenticatorSelection?: AuthenticatorSelectionCriteria; - challenge: BufferSource; - excludeCredentials?: PublicKeyCredentialDescriptor[]; - extensions?: AuthenticationExtensionsClientInputs; - pubKeyCredParams: PublicKeyCredentialParameters[]; - rp: PublicKeyCredentialRpEntity; - timeout?: number; - user: PublicKeyCredentialUserEntity; + attestation?: AttestationConveyancePreference; + authenticatorSelection?: AuthenticatorSelectionCriteria; + challenge: BufferSource; + excludeCredentials?: PublicKeyCredentialDescriptor[]; + extensions?: AuthenticationExtensionsClientInputs; + pubKeyCredParams: PublicKeyCredentialParameters[]; + rp: PublicKeyCredentialRpEntity; + timeout?: number; + user: PublicKeyCredentialUserEntity; } export interface PublicKeyCredentialDescriptor { - id: BufferSource; - transports?: AuthenticatorTransport[]; - type: PublicKeyCredentialType; + id: BufferSource; + transports?: AuthenticatorTransport[]; + type: PublicKeyCredentialType; } export interface PublicKeyCredentialParameters { - alg: COSEAlgorithmIdentifier; - type: PublicKeyCredentialType; + alg: COSEAlgorithmIdentifier; + type: PublicKeyCredentialType; } export interface PublicKeyCredentialRequestOptions { - allowCredentials?: PublicKeyCredentialDescriptor[]; - challenge: BufferSource; - extensions?: AuthenticationExtensionsClientInputs; - rpId?: string; - timeout?: number; - userVerification?: UserVerificationRequirement; + allowCredentials?: PublicKeyCredentialDescriptor[]; + challenge: BufferSource; + extensions?: AuthenticationExtensionsClientInputs; + rpId?: string; + timeout?: number; + userVerification?: UserVerificationRequirement; } export interface PublicKeyCredentialUserEntity extends PublicKeyCredentialEntity { - displayName: string; - id: BufferSource; + displayName: string; + id: BufferSource; } /** @@ -137,12 +138,12 @@ export interface PublicKeyCredentialUserEntity extends PublicKeyCredentialEntity * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorResponse) */ export interface AuthenticatorResponse { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorResponse/clientDataJSON) */ - readonly clientDataJSON: ArrayBuffer; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/AuthenticatorResponse/clientDataJSON) */ + readonly clientDataJSON: ArrayBuffer; } export interface CredentialPropertiesOutput { - rk?: boolean; + rk?: boolean; } /** @@ -152,129 +153,36 @@ export interface CredentialPropertiesOutput { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto) */ export interface SubtleCrypto { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt) */ - decrypt( - algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, - key: CryptoKey, - data: BufferSource, - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits) */ - deriveBits( - algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, - baseKey: CryptoKey, - length: number, - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey) */ - deriveKey( - algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, - baseKey: CryptoKey, - derivedKeyType: - | AlgorithmIdentifier - | AesDerivedKeyParams - | HmacImportParams - | HkdfParams - | Pbkdf2Params, - extractable: boolean, - keyUsages: KeyUsage[], - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest) */ - digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt) */ - encrypt( - algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, - key: CryptoKey, - data: BufferSource, - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */ - exportKey(format: 'jwk', key: CryptoKey): Promise; - exportKey(format: Exclude, key: CryptoKey): Promise; - exportKey(format: KeyFormat, key: CryptoKey): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */ - generateKey( - algorithm: 'Ed25519', - extractable: boolean, - keyUsages: ReadonlyArray<'sign' | 'verify'>, - ): Promise; - generateKey( - algorithm: RsaHashedKeyGenParams | EcKeyGenParams, - extractable: boolean, - keyUsages: ReadonlyArray, - ): Promise; - generateKey( - algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, - extractable: boolean, - keyUsages: ReadonlyArray, - ): Promise; - generateKey( - algorithm: AlgorithmIdentifier, - extractable: boolean, - keyUsages: KeyUsage[], - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey) */ - importKey( - format: 'jwk', - keyData: JsonWebKey, - algorithm: - | AlgorithmIdentifier - | RsaHashedImportParams - | EcKeyImportParams - | HmacImportParams - | AesKeyAlgorithm, - extractable: boolean, - keyUsages: ReadonlyArray, - ): Promise; - importKey( - format: Exclude, - keyData: BufferSource, - algorithm: - | AlgorithmIdentifier - | RsaHashedImportParams - | EcKeyImportParams - | HmacImportParams - | AesKeyAlgorithm, - extractable: boolean, - keyUsages: KeyUsage[], - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign) */ - sign( - algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, - key: CryptoKey, - data: BufferSource, - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey) */ - unwrapKey( - format: KeyFormat, - wrappedKey: BufferSource, - unwrappingKey: CryptoKey, - unwrapAlgorithm: - | AlgorithmIdentifier - | RsaOaepParams - | AesCtrParams - | AesCbcParams - | AesGcmParams, - unwrappedKeyAlgorithm: - | AlgorithmIdentifier - | RsaHashedImportParams - | EcKeyImportParams - | HmacImportParams - | AesKeyAlgorithm, - extractable: boolean, - keyUsages: KeyUsage[], - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify) */ - verify( - algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, - key: CryptoKey, - signature: BufferSource, - data: BufferSource, - ): Promise; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey) */ - wrapKey( - format: KeyFormat, - key: CryptoKey, - wrappingKey: CryptoKey, - wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, - ): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt) */ + decrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits) */ + deriveBits(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, length: number): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey) */ + deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest) */ + digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt) */ + encrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */ + exportKey(format: "jwk", key: CryptoKey): Promise; + exportKey(format: Exclude, key: CryptoKey): Promise; + exportKey(format: KeyFormat, key: CryptoKey): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */ + generateKey(algorithm: "Ed25519", extractable: boolean, keyUsages: ReadonlyArray<"sign" | "verify">): Promise; + generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray): Promise; + generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: ReadonlyArray): Promise; + generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: KeyUsage[]): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey) */ + importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: ReadonlyArray): Promise; + importKey(format: Exclude, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign) */ + sign(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, data: BufferSource): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey) */ + unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify) */ + verify(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, signature: BufferSource, data: BufferSource): Promise; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey) */ + wrapKey(format: KeyFormat, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams): Promise; } /** @@ -283,37 +191,37 @@ export interface SubtleCrypto { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential) */ export interface Credential { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential/id) */ - readonly id: string; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential/type) */ - readonly type: string; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential/id) */ + readonly id: string; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Credential/type) */ + readonly type: string; } export interface PublicKeyCredentialRpEntity extends PublicKeyCredentialEntity { - id?: string; + id?: string; } export interface PublicKeyCredentialEntity { - name: string; + name: string; } export interface RsaOaepParams extends Algorithm { - label?: BufferSource; + label?: BufferSource; } export interface AesCtrParams extends Algorithm { - counter: BufferSource; - length: number; + counter: BufferSource; + length: number; } export interface AesCbcParams extends Algorithm { - iv: BufferSource; + iv: BufferSource; } export interface AesGcmParams extends Algorithm { - additionalData?: BufferSource; - iv: BufferSource; - tagLength?: number; + additionalData?: BufferSource; + iv: BufferSource; + tagLength?: number; } /** @@ -323,143 +231,135 @@ export interface AesGcmParams extends Algorithm { * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey) */ export interface CryptoKey { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) */ - readonly algorithm: KeyAlgorithm; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) */ - readonly extractable: boolean; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) */ - readonly type: KeyType; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) */ - readonly usages: KeyUsage[]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) */ + readonly algorithm: KeyAlgorithm; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) */ + readonly extractable: boolean; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) */ + readonly type: KeyType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) */ + readonly usages: KeyUsage[]; } export interface EcdhKeyDeriveParams extends Algorithm { - public: CryptoKey; + public: CryptoKey; } export interface HkdfParams extends Algorithm { - hash: HashAlgorithmIdentifier; - info: BufferSource; - salt: BufferSource; + hash: HashAlgorithmIdentifier; + info: BufferSource; + salt: BufferSource; } export interface Pbkdf2Params extends Algorithm { - hash: HashAlgorithmIdentifier; - iterations: number; - salt: BufferSource; + hash: HashAlgorithmIdentifier; + iterations: number; + salt: BufferSource; } export interface AesDerivedKeyParams extends Algorithm { - length: number; + length: number; } export interface HmacImportParams extends Algorithm { - hash: HashAlgorithmIdentifier; - length?: number; + hash: HashAlgorithmIdentifier; + length?: number; } export interface JsonWebKey { - alg?: string; - crv?: string; - d?: string; - dp?: string; - dq?: string; - e?: string; - ext?: boolean; - k?: string; - key_ops?: string[]; - kty?: string; - n?: string; - oth?: RsaOtherPrimesInfo[]; - p?: string; - q?: string; - qi?: string; - use?: string; - x?: string; - y?: string; + alg?: string; + crv?: string; + d?: string; + dp?: string; + dq?: string; + e?: string; + ext?: boolean; + k?: string; + key_ops?: string[]; + kty?: string; + n?: string; + oth?: RsaOtherPrimesInfo[]; + p?: string; + q?: string; + qi?: string; + use?: string; + x?: string; + y?: string; } export interface CryptoKeyPair { - privateKey: CryptoKey; - publicKey: CryptoKey; + privateKey: CryptoKey; + publicKey: CryptoKey; } export interface RsaHashedKeyGenParams extends RsaKeyGenParams { - hash: HashAlgorithmIdentifier; + hash: HashAlgorithmIdentifier; } export interface EcKeyGenParams extends Algorithm { - namedCurve: NamedCurve; + namedCurve: NamedCurve; } export interface AesKeyGenParams extends Algorithm { - length: number; + length: number; } export interface HmacKeyGenParams extends Algorithm { - hash: HashAlgorithmIdentifier; - length?: number; + hash: HashAlgorithmIdentifier; + length?: number; } export interface RsaHashedImportParams extends Algorithm { - hash: HashAlgorithmIdentifier; + hash: HashAlgorithmIdentifier; } export interface EcKeyImportParams extends Algorithm { - namedCurve: NamedCurve; + namedCurve: NamedCurve; } export interface AesKeyAlgorithm extends KeyAlgorithm { - length: number; + length: number; } export interface RsaPssParams extends Algorithm { - saltLength: number; + saltLength: number; } export interface EcdsaParams extends Algorithm { - hash: HashAlgorithmIdentifier; + hash: HashAlgorithmIdentifier; } export interface Algorithm { - name: string; + name: string; } export interface KeyAlgorithm { - name: string; + name: string; } export interface RsaOtherPrimesInfo { - d?: string; - r?: string; - t?: string; + d?: string; + r?: string; + t?: string; } export interface RsaKeyGenParams extends Algorithm { - modulusLength: number; - publicExponent: BigInteger; + modulusLength: number; + publicExponent: BigInteger; } -export type AttestationConveyancePreference = 'direct' | 'enterprise' | 'indirect' | 'none'; -export type AuthenticatorTransport = 'ble' | 'hybrid' | 'internal' | 'nfc' | 'usb'; +export type AttestationConveyancePreference = "direct" | "enterprise" | "indirect" | "none"; +export type AuthenticatorTransport = "ble" | "hybrid" | "internal" | "nfc" | "usb"; export type COSEAlgorithmIdentifier = number; -export type UserVerificationRequirement = 'discouraged' | 'preferred' | 'required'; -export type AuthenticatorAttachment = 'cross-platform' | 'platform'; -export type ResidentKeyRequirement = 'discouraged' | 'preferred' | 'required'; +export type UserVerificationRequirement = "discouraged" | "preferred" | "required"; +export type AuthenticatorAttachment = "cross-platform" | "platform"; +export type ResidentKeyRequirement = "discouraged" | "preferred" | "required"; export type BufferSource = ArrayBufferView | ArrayBuffer; -export type PublicKeyCredentialType = 'public-key'; +export type PublicKeyCredentialType = "public-key"; export type AlgorithmIdentifier = Algorithm | string; -export type KeyUsage = - | 'decrypt' - | 'deriveBits' - | 'deriveKey' - | 'encrypt' - | 'sign' - | 'unwrapKey' - | 'verify' - | 'wrapKey'; -export type KeyFormat = 'jwk' | 'pkcs8' | 'raw' | 'spki'; -export type KeyType = 'private' | 'public' | 'secret'; +export type KeyUsage = "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey"; +export type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki"; +export type KeyType = "private" | "public" | "secret"; export type HashAlgorithmIdentifier = AlgorithmIdentifier; export type NamedCurve = string; export type BigInteger = Uint8Array; From f95fe715188ecfe679a10c8fddde5224643849bb Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 00:07:14 -0800 Subject: [PATCH 085/115] Support publishing browser to JSR --- deno.jsonc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/deno.jsonc b/deno.jsonc index 398f4232b..399dc920d 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -13,6 +13,14 @@ "singleQuote": true, "lineWidth": 100 }, + "compilerOptions": { + "lib": [ + "deno.ns", + "dom", + "dom.iterable", + "dom.asynciterable" + ] + }, "imports": { "@babel/preset-env": "npm:@babel/preset-env@^7.26.0", "@deno/cache-dir": "jsr:@deno/cache-dir@^0.13.2", From 370df5a08b791ba82b2b139ce3d96e85b256c131 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 00:18:29 -0800 Subject: [PATCH 086/115] Outline versioning script steps --- deno.jsonc | 1 + whatGotUpdated.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 whatGotUpdated.ts diff --git a/deno.jsonc b/deno.jsonc index 399dc920d..2e58320bf 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -1,5 +1,6 @@ { "tasks": { + "version": "deno run -A whatGotUpdated.ts", "test:browser": "(cd packages/browser; deno task test)", "test:server": "(cd packages/server; deno task test)", "build:types": "(cd packages/types; deno task build)", diff --git a/whatGotUpdated.ts b/whatGotUpdated.ts new file mode 100644 index 000000000..227fbd18e --- /dev/null +++ b/whatGotUpdated.ts @@ -0,0 +1,12 @@ +/** + * A script to determine which workspace packages contain code that's been updated since the last + * git tag version. These packages will become candidates for version bumps. + */ + +// TODO: Check which files have been updated since the last git tag + +// TODO: Determine which of the three packages have been changed + +// TODO: Read current versions from corresponding deno.jsonc files + +// Output package names and their current versions to consider incrementing From 46be6c31cda7bb91982701e7824e1852b29c595c Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 08:41:11 -0800 Subject: [PATCH 087/115] Rename deno.jsonc to deno.json JSON imports as per https://docs.deno.com/examples/importing-json/ won't recognize .jsonc files. There's an issue at https://github.com/denoland/deno/issues/20374 about supporting importing .jsonc/.json5 files as well but doesn't seem to have much momentum. Feels best not to fight this battle right now. --- .vscode/settings.json | 2 +- deno.jsonc => deno.json | 0 packages/browser/build_npm.ts | 2 +- packages/browser/{deno.jsonc => deno.json} | 0 packages/server/build_npm.ts | 2 +- packages/server/{deno.jsonc => deno.json} | 0 packages/types/{deno.jsonc => deno.json} | 0 7 files changed, 3 insertions(+), 3 deletions(-) rename deno.jsonc => deno.json (100%) rename packages/browser/{deno.jsonc => deno.json} (100%) rename packages/server/{deno.jsonc => deno.json} (100%) rename packages/types/{deno.jsonc => deno.json} (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json index d253835fa..f7526b561 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,7 +7,7 @@ "./packages/server", "./packages/types" ], - "deno.config": "./deno.jsonc", + "deno.config": "./deno.json", "editor.rulers": [ 100 ], diff --git a/deno.jsonc b/deno.json similarity index 100% rename from deno.jsonc rename to deno.json diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index 7c5062967..24810e8f6 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -24,7 +24,7 @@ async function buildESMAndCJS() { await build({ entryPoints: ['./src/index.ts'], outDir, - importMap: './deno.jsonc', + importMap: './deno.json', shims: { deno: { test: 'dev', diff --git a/packages/browser/deno.jsonc b/packages/browser/deno.json similarity index 100% rename from packages/browser/deno.jsonc rename to packages/browser/deno.json diff --git a/packages/server/build_npm.ts b/packages/server/build_npm.ts index 11feaeb9e..57b064aff 100644 --- a/packages/server/build_npm.ts +++ b/packages/server/build_npm.ts @@ -17,7 +17,7 @@ await build({ { name: './helpers', path: './src/helpers/index.ts' }, ], outDir, - importMap: './deno.jsonc', + importMap: './deno.json', shims: { deno: { test: 'dev', diff --git a/packages/server/deno.jsonc b/packages/server/deno.json similarity index 100% rename from packages/server/deno.jsonc rename to packages/server/deno.json diff --git a/packages/types/deno.jsonc b/packages/types/deno.json similarity index 100% rename from packages/types/deno.jsonc rename to packages/types/deno.json From 0d390887017141c6cac7bf2775de36fc12f4ada8 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 09:26:27 -0800 Subject: [PATCH 088/115] Use Deno's native JSON importing --- packages/browser/build_npm.ts | 11 ++++------- packages/server/build_npm.ts | 11 ++++------- packages/types/build_npm.ts | 6 +++--- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index 24810e8f6..067d38b2b 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -6,14 +6,11 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import { getBabelOutputPlugin } from '@rollup/plugin-babel'; import replace from '@rollup/plugin-replace'; -const outDir = './npm'; +import denoJSON from './deno.json' with { type: 'json' }; +import typesDenoJSON from '../types/deno.json' with { type: 'json' }; + -const denoJSON: { version: string } = JSON.parse( - Deno.readTextFileSync('./deno.jsonc'), -); -const typesDenoJSON: { version: string } = JSON.parse( - Deno.readTextFileSync('../types/deno.jsonc'), -); +const outDir = './npm'; /** * Generate ESM and CJS builds using Deno to Node Transform (dnt) diff --git a/packages/server/build_npm.ts b/packages/server/build_npm.ts index 57b064aff..edecaae27 100644 --- a/packages/server/build_npm.ts +++ b/packages/server/build_npm.ts @@ -1,13 +1,10 @@ import { build, emptyDir } from '@deno/dnt'; -const outDir = './npm'; +import denoJSON from './deno.json' with { type: 'json' }; +import typesDenoJSON from '../types/deno.json' with { type: 'json' }; + -const denoJSON: { version: string } = JSON.parse( - Deno.readTextFileSync('./deno.jsonc'), -); -const typesDenoJSON: { version: string } = JSON.parse( - Deno.readTextFileSync('../types/deno.jsonc'), -); +const outDir = './npm'; await emptyDir(outDir); diff --git a/packages/types/build_npm.ts b/packages/types/build_npm.ts index efbf0c9a6..909b8c10f 100644 --- a/packages/types/build_npm.ts +++ b/packages/types/build_npm.ts @@ -1,9 +1,9 @@ import { build, emptyDir } from '@deno/dnt'; +import denoJSON from './deno.json' with { type: 'json' }; + + const outDir = './npm'; -const denoJSON: { version: string } = JSON.parse( - Deno.readTextFileSync('./deno.jsonc'), -); await emptyDir(outDir); From 5338929f1c9b038140fbcbd123c8730ea81e7563 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 09:26:35 -0800 Subject: [PATCH 089/115] Commit minor deno.lock change --- deno.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/deno.lock b/deno.lock index 62cd3a5e6..e38f4f0a1 100644 --- a/deno.lock +++ b/deno.lock @@ -65,6 +65,7 @@ "@deno/cache-dir@0.13.2": { "integrity": "c22419dfe27ab85f345bee487aaaadba498b005cce3644e9d2528db035c5454d", "dependencies": [ + "jsr:@deno/graph", "jsr:@std/fmt@0.223", "jsr:@std/fs@0.223", "jsr:@std/io", From e3f05b0f2e22880c803d3f5ddc33652f81a96ea9 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 14:06:41 -0800 Subject: [PATCH 090/115] Finish initial versioning script --- whatGotUpdated.ts | 111 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 4 deletions(-) diff --git a/whatGotUpdated.ts b/whatGotUpdated.ts index 227fbd18e..0ff99989d 100644 --- a/whatGotUpdated.ts +++ b/whatGotUpdated.ts @@ -3,10 +3,113 @@ * git tag version. These packages will become candidates for version bumps. */ -// TODO: Check which files have been updated since the last git tag +// Grab workspace folders from root deno.json +import rootDenoJSON from './deno.json' with { type: 'json' }; -// TODO: Determine which of the three packages have been changed +// Trim relative path specifier so we end up with ["packages/browser", ...] +const workspaceDirs = rootDenoJSON.workspace.map((path) => path.substring(2)); -// TODO: Read current versions from corresponding deno.jsonc files +// Check which files have been updated since the last git tag +console.log('Getting latest version tag...'); +const latestTag = await getLatestVersionTag(); -// Output package names and their current versions to consider incrementing +console.log(`Getting files changed since tag ${latestTag}...`); +const changedFiles = await getChangedFilesSinceTag(latestTag); + +// Determine which of the three packages have been changed +console.log('Checking which workspace packages have changed...'); +const changedPackages = getChangedWorkspacePackages(changedFiles, workspaceDirs); + +/** + * Determine final output + */ +if (changedPackages.length < 1) { + console.log('✅ No workspace packages have been updated since the last version tag'); +} else { + console.log('The following workspace packages need new versions published:'); + + for (const matched of changedPackages) { + // Read current versions from corresponding deno.json files + const packageDenoJSONPath = `./${matched}/deno.json`; + const { default: packageDenoJSON } = await import(packageDenoJSONPath, { + with: { type: 'json' }, + }); + + // Output package names and their current versions to consider incrementing + const formattedMatched = `@simplewebauthn/${matched.split('/')[1]}`; + console.log( + `📦 ${formattedMatched} (current version: ${packageDenoJSON.version} @ ${packageDenoJSONPath})`, + ); + } +} + +/** + * Grab the latest version tag from Git + */ +async function getLatestVersionTag(): Promise { + const command = new Deno.Command('git', { + args: [ + 'describe', + '--tags', + '--abbrev=0', + ], + }); + + const { code, stdout, stderr } = await command.output(); + + if (code !== 0) { + throw new Error(new TextDecoder().decode(stderr)); + } + + const output = new TextDecoder().decode(stdout); + const toReturn = output.trim(); + + // Verify we got something back that looks like a typical version tag + if (!toReturn.match(/v\d+.\d+.\d+/i)) { + throw new Error(`Tag "${toReturn}" was not the expected version tag format of vXX.XX.XX`); + } + + return toReturn; +} + +/** + * Get the list of files changed since the provided version tag + */ +async function getChangedFilesSinceTag(tagName: string): Promise { + const command = new Deno.Command('git', { + args: [ + 'diff', + '--name-only', + `${tagName}..HEAD`, + ], + }); + + const { code, stdout, stderr } = await command.output(); + + if (code !== 0) { + throw new Error(new TextDecoder().decode(stderr)); + } + + const output = new TextDecoder().decode(stdout); + + const toReturn = output.split('\n'); + + return toReturn; +} + +/** + * Look through the list of files to figure out which workspace packages have changed + */ +function getChangedWorkspacePackages(changedFiles: string[], workspaceDirs: string[]): string[] { + const matchedPackages = new Set(); + + for (const file of changedFiles) { + for (const workspace of workspaceDirs) { + if (file.startsWith(workspace)) { + matchedPackages.add(workspace); + } + } + } + + return matchedPackages.values().toArray(); +} From dfacbd24c55585a3b15c19130e8678d1dc02e38e Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 14:06:49 -0800 Subject: [PATCH 091/115] Enable Deno across the entire repo --- .vscode/settings.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f7526b561..2b5b778ea 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,11 +2,7 @@ "typescript.tsdk": "node_modules/typescript/lib", "editor.formatOnSave": true, "deno.path": "/opt/homebrew/bin/deno", - "deno.enablePaths": [ - "./packages/browser", - "./packages/server", - "./packages/types" - ], + "deno.enable": true, "deno.config": "./deno.json", "editor.rulers": [ 100 From f6bd98a23a07b60b65145e9ff8b1f209bd5b4385 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 14:46:22 -0800 Subject: [PATCH 092/115] Update deployment handbook for new process --- HANDBOOK.md | 54 +++++++++++++++++++++++--------------- packages/browser/deno.json | 2 +- packages/server/deno.json | 2 +- packages/types/deno.json | 2 +- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/HANDBOOK.md b/HANDBOOK.md index 46902aea0..8c51f33e1 100644 --- a/HANDBOOK.md +++ b/HANDBOOK.md @@ -6,7 +6,7 @@ Notes for myself that I don't want cluttering up the README ### Step 0: Things you might have missed -#### Did you update the version of `"typescript"` in the monorepo's root **package.json** file? +#### Did you update to a newer version of **Deno**? Run this first to update **packages/types/dom.ts** then commit the changes: @@ -16,49 +16,61 @@ Run this first to update **packages/types/dom.ts** then commit the changes: ### Step 1: Determine which packages need to be published -Run this command, **but cancel out the first time!** Use it to determine which packages need entries -in CHANGELOG.md: +Run this command to determine which packages need entries in CHANGELOG.md: ``` -pnpm run update-version +deno task version ``` -### Step 2: Update CHANGELOG.md +### Step 2: Update package versions + +Update `"version"` in the following **deno.json** files for each package that needs a new release: + +- **@simplewebauthn/browser**: [packages/browser/deno.json](./packages/browser/deno.json) +- **@simplewebauthn/server**: [packages/server/deno.json](./packages/server/deno.json) +- **@simplewebauthn/types**: [packages/types/deno.json](./packages/types/deno.json) + +Continue using your best judgement on what an appropriate new version number should be. + +### Step 3: Update CHANGELOG.md Add entries to CHANGELOG.md for the packages determined in the step above. -### Step 3: Update package versions +### Step 4: Create a git tag for the chosen version -Re-run Step 1, **but go all the way through with it this time** so that the latest changes have an -entry in the CHANGELOG that gets bundled with the release: +Create a tag on HEAD for the new version number. -``` -pnpm run update-version -``` +### Step 4: Publish packages + +The following commands can be run from the root of the monorepo to build the respective package, +then **publish it to both NPM and JSR**. + +Publishing to **deno.land/x** will happen as part of the last step at the end of this handbook. -### Step 4: Need to publish `types`? +#### Need to publish @simplewebauthn/types? ``` -pnpm run publish:types +deno task publish:types ``` -### Step 5: Need to publish `browser`? +#### Need to publish @simplewebauthn/browser? ``` -pnpm run publish:browser +deno task publish:browser ``` -### Step 6: Need to publish `server`? +#### Need to publish @simplewebauthn/server? 1. - - [ ] Make sure the correct version of `types` is on NPM - - The `npm install` step that dnt performs while building the project pulls from NPM. The build - will fail if the version of `types` specified in `mappings` in **build_npm.ts** is unavailable. + - [ ] Make sure the correct version of **@simplewebauthn/types** is on NPM + - The `npm install` step that dnt performs while building **@simplewebauthn/server** pulls from + NPM. The build will fail if the version of **@simplewebauthn/types** specified in + [packages/types/deno.json](./packages/types/deno.json) is unavailable on NPM. ``` -pnpm run publish:server +deno task publish:server ``` -### Step 7: Push up `HEAD` to `origin` +### Step 5: Push up `HEAD` to `origin` Don't forget to push up the latest changes to `origin` when everything's been published! diff --git a/packages/browser/deno.json b/packages/browser/deno.json index 4cdaf4525..83ec5562d 100644 --- a/packages/browser/deno.json +++ b/packages/browser/deno.json @@ -6,7 +6,7 @@ "build": "deno task test && deno run -A build_npm.ts", "test": "deno test -A src/", "test:watch": "deno test -A --watch src/", - "publish": "deno task publish:jsr && deno task publish:npm", + "publish": "deno task build && deno task publish:jsr && deno task publish:npm", "publish:jsr": "deno publish", "publish:npm": "(cd npm; npm publish)" }, diff --git a/packages/server/deno.json b/packages/server/deno.json index cc2b3a818..e6aea3176 100644 --- a/packages/server/deno.json +++ b/packages/server/deno.json @@ -9,7 +9,7 @@ "build": "deno task test && deno run -A build_npm.ts", "test": "deno test -A src/", "test:watch": "deno test -A --watch src/", - "publish": "deno task publish:jsr && deno task publish:npm", + "publish": "deno task build && deno task publish:jsr && deno task publish:npm", "publish:jsr": "deno publish", "publish:npm": "(cd npm; npm publish)" }, diff --git a/packages/types/deno.json b/packages/types/deno.json index 0ee59dff9..b81027298 100644 --- a/packages/types/deno.json +++ b/packages/types/deno.json @@ -5,7 +5,7 @@ "tasks": { "build": "deno run -A build_npm.ts", "extract-dom-types": "deno run -A extract-dom-types.ts", - "publish": "deno task publish:jsr && deno task publish:npm", + "publish": "deno task build && deno task publish:jsr && deno task publish:npm", "publish:jsr": "deno publish", "publish:npm": "(cd npm; npm publish)" }, From b6eb5d34635894f31c1547383cdf0c77f8530db5 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 14:50:12 -0800 Subject: [PATCH 093/115] Add links to the various package repos --- HANDBOOK.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/HANDBOOK.md b/HANDBOOK.md index 8c51f33e1..27d2168af 100644 --- a/HANDBOOK.md +++ b/HANDBOOK.md @@ -43,9 +43,11 @@ Create a tag on HEAD for the new version number. ### Step 4: Publish packages The following commands can be run from the root of the monorepo to build the respective package, -then **publish it to both NPM and JSR**. +then **publish it to both [NPM](https://www.npmjs.com/search?q=%40simplewebauthn) and +[JSR](https://jsr.io/@simplewebauthn)**. -Publishing to **deno.land/x** will happen as part of the last step at the end of this handbook. +Publishing to **[deno.land/x](https://deno.land/x/simplewebauthn)** will happen as part of the last +step at the end of this handbook. #### Need to publish @simplewebauthn/types? From cdc6e1e5508532349d813642a740575d962307c4 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 14:51:43 -0800 Subject: [PATCH 094/115] Update version to -alpha3 --- HANDBOOK.md | 4 ++++ packages/browser/deno.json | 2 +- packages/server/deno.json | 2 +- packages/types/deno.json | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/HANDBOOK.md b/HANDBOOK.md index 27d2168af..1b342c422 100644 --- a/HANDBOOK.md +++ b/HANDBOOK.md @@ -32,10 +32,14 @@ Update `"version"` in the following **deno.json** files for each package that ne Continue using your best judgement on what an appropriate new version number should be. +Commit these changes. + ### Step 3: Update CHANGELOG.md Add entries to CHANGELOG.md for the packages determined in the step above. +Commit these changes. + ### Step 4: Create a git tag for the chosen version Create a tag on HEAD for the new version number. diff --git a/packages/browser/deno.json b/packages/browser/deno.json index 83ec5562d..7ed238ed6 100644 --- a/packages/browser/deno.json +++ b/packages/browser/deno.json @@ -1,6 +1,6 @@ { "name": "@simplewebauthn/browser", - "version": "11.0.0-alpha2", + "version": "11.0.0-alpha3", "exports": "./src/index.ts", "tasks": { "build": "deno task test && deno run -A build_npm.ts", diff --git a/packages/server/deno.json b/packages/server/deno.json index e6aea3176..6459fd1c3 100644 --- a/packages/server/deno.json +++ b/packages/server/deno.json @@ -1,6 +1,6 @@ { "name": "@simplewebauthn/server", - "version": "11.0.0-alpha2", + "version": "11.0.0-alpha3", "exports": { ".": "./src/index.ts", "./helpers": "./src/helpers/index.ts" diff --git a/packages/types/deno.json b/packages/types/deno.json index b81027298..3644d21e7 100644 --- a/packages/types/deno.json +++ b/packages/types/deno.json @@ -1,6 +1,6 @@ { "name": "@simplewebauthn/types", - "version": "11.0.0-alpha2", + "version": "11.0.0-alpha3", "exports": "./src/index.ts", "tasks": { "build": "deno run -A build_npm.ts", From 380f471021fb833c2b14446df6b5cd3252017f71 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 14:53:35 -0800 Subject: [PATCH 095/115] Update CHANGELOG for v11.0.0 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 390772dfd..382d340f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v11.0.0-alpha3 + +This build is **functionally identical** as v11.0.0. This one just involves massive monorepo +infrastructure changes that I'm putting through its paces. + ## v11.0.0 - The one that auto-registers Say hello to support for automatic passkey registration, support for valid conditional UI `` From 3afd91f42e0092d691661114a014fabd679a8638 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 15:02:00 -0800 Subject: [PATCH 096/115] Stop double-building when publishing --- deno.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deno.json b/deno.json index 2e58320bf..563290370 100644 --- a/deno.json +++ b/deno.json @@ -6,9 +6,9 @@ "build:types": "(cd packages/types; deno task build)", "build:browser": "(cd packages/browser; deno task build)", "build:server": "(cd packages/server; deno task build)", - "publish:types": "deno task build:types && (cd packages/types; deno task publish)", - "publish:browser": "deno task build:browser && (cd packages/browser; deno task publish)", - "publish:server": "deno task build:server && (cd packages/server; deno task publish)" + "publish:types": "(cd packages/types; deno task publish)", + "publish:browser": "(cd packages/browser; deno task publish)", + "publish:server": "(cd packages/server; deno task publish)" }, "fmt": { "singleQuote": true, From f778661affd7701ecfb8cccf90683f7baec1d9bf Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 15:04:24 -0800 Subject: [PATCH 097/115] Run `deno fmt` on packages --- packages/browser/build_npm.ts | 1 - packages/server/build_npm.ts | 1 - packages/types/build_npm.ts | 1 - 3 files changed, 3 deletions(-) diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index 067d38b2b..45dd5001d 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -9,7 +9,6 @@ import replace from '@rollup/plugin-replace'; import denoJSON from './deno.json' with { type: 'json' }; import typesDenoJSON from '../types/deno.json' with { type: 'json' }; - const outDir = './npm'; /** diff --git a/packages/server/build_npm.ts b/packages/server/build_npm.ts index edecaae27..54731cdd1 100644 --- a/packages/server/build_npm.ts +++ b/packages/server/build_npm.ts @@ -3,7 +3,6 @@ import { build, emptyDir } from '@deno/dnt'; import denoJSON from './deno.json' with { type: 'json' }; import typesDenoJSON from '../types/deno.json' with { type: 'json' }; - const outDir = './npm'; await emptyDir(outDir); diff --git a/packages/types/build_npm.ts b/packages/types/build_npm.ts index 909b8c10f..8bc60f0f2 100644 --- a/packages/types/build_npm.ts +++ b/packages/types/build_npm.ts @@ -2,7 +2,6 @@ import { build, emptyDir } from '@deno/dnt'; import denoJSON from './deno.json' with { type: 'json' }; - const outDir = './npm'; await emptyDir(outDir); From 8c6e4e566cf3f01a0d7f921415ca5b224de2ae65 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 15:12:57 -0800 Subject: [PATCH 098/115] Update browser and server READMs --- packages/browser/README.md | 27 +++++++++++++++++++++++++-- packages/server/README.md | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/browser/README.md b/packages/browser/README.md index 7ef312ec4..06c8755a1 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -8,9 +8,10 @@ - [@simplewebauthn/browser](#simplewebauthnbrowser) - [Installation](#installation) + - [Deno v1.43.x or higher](#deno-v143x-or-higher) - [UMD](#umd) - [ES5](#es5) - - [ES2018](#es2018) + - [ES2021](#es2021) - [Usage](#usage) ## Installation @@ -21,6 +22,28 @@ This package is available on **npm**: npm install @simplewebauthn/browser ``` +This package can be installed from **NPM** or **JSR**: + +```sh +$ npm install @simplewebauthn/browser +``` + +```sh +$ npx jsr add @simplewebauthn/browser +``` + +### Deno v1.43.x or higher + +It is also available for import into Deno projects from **deno.land/x** or **JSR**: + +```ts +import {...} from 'https://deno.land/x/simplewebauthn/deno/browser.ts'; +``` + +```sh +$ deno add jsr:@simplewebauthn/browser jsr:@simplewebauthn/types +``` + ### UMD This package can also be installed via **unpkg** by including the following script in your page's @@ -40,7 +63,7 @@ include the `ES5` version: ``` -#### ES2018 +#### ES2021 If you only need to support modern browsers, include the `ES2018` version: diff --git a/packages/server/README.md b/packages/server/README.md index b6c0d7037..0b71f6759 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -21,7 +21,7 @@ $ npm install @simplewebauthn/server ``` ```sh -$ npx jsr add @simplewebauthn/server @simplewebauthn/types +$ npx jsr add @simplewebauthn/server ``` ### Deno v1.43.x or higher From cdbeaea27aa625b66b142b1e1d6034852f789065 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 15:21:02 -0800 Subject: [PATCH 099/115] Replace lingering references to pnpm --- HANDBOOK.md | 2 +- README.md | 18 +++++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/HANDBOOK.md b/HANDBOOK.md index 1b342c422..9043ee8ee 100644 --- a/HANDBOOK.md +++ b/HANDBOOK.md @@ -11,7 +11,7 @@ Notes for myself that I don't want cluttering up the README Run this first to update **packages/types/dom.ts** then commit the changes: ``` -(cd packages/types; pnpm run extract-dom-types) +(cd packages/types; deno task extract-dom-types) ``` ### Step 1: Determine which packages need to be published diff --git a/README.md b/README.md index 81b235ad7..80d356fc5 100644 --- a/README.md +++ b/README.md @@ -98,29 +98,25 @@ request new features, or to suggest changes to existing features. Install the following before proceeding: -- **Node 20.x** -- **Deno v1.46.x** -- **pnpm 9.12.x** +- **Deno v2.0.x** After pulling down the code, set up dependencies: ```sh -$> pnpm run bootstrap-monorepo +$> deno install ``` To run unit tests for all workspace packages, use the `test` series of scripts: ```sh -# Run All tests -$> pnpm run test # Run an individual package's tests -$> pnpm run test:browser -$> pnpm run test:server +$> cd packages/browser/ && deno task test +$> cd packages/server/ && deno task test ``` -Tests can be run in watch mode with the `dev` series of scripts: +Tests can be run in watch mode with the `test:watch` series of scripts: ```sh -$> pnpm run dev:browser -$> pnpm run dev:server +$> cd packages/browser/ && deno task test:watch +$> cd packages/server/ && deno task test:watch ``` From 2a6a9c37b29d2e336902944ca3ad0512ad4c8e94 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 15:27:29 -0800 Subject: [PATCH 100/115] Delete VS Code tasks --- .vscode/tasks.json | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 .vscode/tasks.json diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 2315b08eb..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "build:server", - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [], - "label": "pnpm: build:server", - "detail": "pnpm run build:server" - }, - { - "type": "npm", - "script": "build:browser", - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [], - "label": "pnpm: build:browser", - "detail": "pnpm run build:browser" - }, - { - "type": "npm", - "script": "build:types", - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [], - "label": "pnpm: build:types", - "detail": "pnpm run build:types" - } - ] -} From bd5bc512539780c1bdc687dedb2133c39e287065 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 16:35:14 -0800 Subject: [PATCH 101/115] Update installation instructions --- README.md | 33 +++++++++++---------------------- packages/browser/README.md | 31 ++++++++++++++++--------------- packages/server/README.md | 29 ++++++++++++++++------------- packages/types/README.md | 23 +++++++++++++---------- 4 files changed, 56 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 80d356fc5..0f333b15a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -# SimpleWebAuthn Project +# SimpleWebAuthn ![WebAuthn](https://img.shields.io/badge/WebAuthn-Simplified-blueviolet?style=for-the-badge&logo=WebAuthn) [![npm (scoped)](https://img.shields.io/npm/v/@simplewebauthn/server?style=for-the-badge&logo=npm)](https://www.npmjs.com/search?q=simplewebauthn) +[![JSR Scope](https://jsr.io/badges/@simplewebauthn?style=for-the-badge)](https://jsr.io/@simplewebauthn) - [Overview](#overview) - [Installation](#installation) +- [Documentation](#documentation) - [Sponsors](#sponsors) - [Example](#example) - [Contributions](#contributions) @@ -12,7 +14,7 @@ ## Overview -This monorepo contains two complimentary libraries to help reduce the amount of work needed to +This project features two complimentary libraries to help reduce the amount of work needed to incorporate WebAuthn into a website. The following packages are maintained here: - [@simplewebauthn/server](https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/server) @@ -22,31 +24,18 @@ An additional package is also included that contains shared TypeScript definitio - [@simplewebauthn/types](https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/types/) -See these packages' READMEs for more specific implementation information. - -**API Documentation** - -In-depth documentation for all of the packages in this project is available here: -https://simplewebauthn.dev/docs/ - ## Installation -These packages are all available on **npm** for use in **Node LTS 20.x** projects and supports -**both CommonJS and [ECMAScript modules (ESM)](https://nodejs.org/api/esm.html#enabling)**: +SimpleWebAuthn is available on **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)**, +**[JSR](https://jsr.io/@simplewebauthn)**, and **[deno.land/x](https://deno.land/x/simplewebauthn)** +for import into **Node LTS 20.x and higher**, **Deno v1.43 and higher** projects, and other +compatible runtimes (Cloudflare Workers, Bun, etc...) -```sh -npm install @simplewebauthn/browser -npm install @simplewebauthn/server -npm install @simplewebauthn/types -``` +See the packages' READMEs for more specific installation information. -The **server** and **types** packages are also available for import into **Deno v1.33.x** projects -from **deno.land/x**: +## Documentation -```ts -import {...} from 'https://deno.land/x/simplewebauthn/deno/server.ts'; -import type {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; -``` +In-depth documentation for this project is available at https://simplewebauthn.dev/docs ## Sponsors diff --git a/packages/browser/README.md b/packages/browser/README.md index 06c8755a1..d7090a63e 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -4,11 +4,13 @@ ![WebAuthn](https://img.shields.io/badge/WebAuthn-Simplified-blueviolet?style=for-the-badge&logo=WebAuthn) [![npm (scoped)](https://img.shields.io/npm/v/@simplewebauthn/browser?style=for-the-badge&logo=npm)](https://www.npmjs.com/package/@simplewebauthn/browser) +[![JSR](https://jsr.io/badges/@simplewebauthn/browser?style=for-the-badge)](https://jsr.io/@simplewebauthn/browser) ![Browser Support](https://img.shields.io/badge/Browser-ES5+-brightgreen?style=for-the-badge&logo=Mozilla+Firefox) - [@simplewebauthn/browser](#simplewebauthnbrowser) - [Installation](#installation) - - [Deno v1.43.x or higher](#deno-v143x-or-higher) + - [Node LTS 20.x and higher](#node-lts-20x-and-higher) + - [Deno v1.43 and higher](#deno-v143-and-higher) - [UMD](#umd) - [ES5](#es5) - [ES2021](#es2021) @@ -16,32 +18,31 @@ ## Installation -This package is available on **npm**: +This package can be installed from **NPM**, **JSR**, or **deno.land/x**: + +### Node LTS 20.x and higher ```sh -npm install @simplewebauthn/browser +$ npm install @simplewebauthn/browser @simplewebauthn/types ``` -This package can be installed from **NPM** or **JSR**: - ```sh -$ npm install @simplewebauthn/browser +$ npx jsr add @simplewebauthn/browser @simplewebauthn/types ``` +### Deno v1.43 and higher + ```sh -$ npx jsr add @simplewebauthn/browser +$ deno add jsr:@simplewebauthn/browser jsr:@simplewebauthn/types ``` -### Deno v1.43.x or higher - -It is also available for import into Deno projects from **deno.land/x** or **JSR**: +```sh +$ deno add npm:@simplewebauthn/browser npm:@simplewebauthn/types +``` ```ts import {...} from 'https://deno.land/x/simplewebauthn/deno/browser.ts'; -``` - -```sh -$ deno add jsr:@simplewebauthn/browser jsr:@simplewebauthn/types +import type {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; ``` ### UMD @@ -65,7 +66,7 @@ include the `ES5` version: #### ES2021 -If you only need to support modern browsers, include the `ES2018` version: +If you only need to support modern browsers, include the `ES2021` version: ```html diff --git a/packages/server/README.md b/packages/server/README.md index 0b71f6759..3cc512373 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -2,38 +2,41 @@ ![WebAuthn](https://img.shields.io/badge/WebAuthn-Simplified-blueviolet?style=for-the-badge&logo=WebAuthn) [![npm (scoped)](https://img.shields.io/npm/v/@simplewebauthn/server?style=for-the-badge&logo=npm)](https://www.npmjs.com/package/@simplewebauthn/server) +[![JSR](https://jsr.io/badges/@simplewebauthn/server?style=for-the-badge)](https://jsr.io/@simplewebauthn/server) - [Installation](#installation) - - [Node LTS 20.x or higher](#node-lts-20x-or-higher) - - [Deno v1.43.x or higher](#deno-v143x-or-higher) + - [Node LTS 20.x and higher](#node-lts-20x-and-higher) + - [Deno v1.43 and higher](#deno-v143-and-higher) - [Usage](#usage) - [Supported Attestation Formats](#supported-attestation-formats) ## Installation -### Node LTS 20.x or higher +This package can be installed from **NPM**, **JSR**, or **deno.land/x**: -This package can be installed from **NPM** (with support for **both CommonJS and -[ECMAScript modules (ESM)](https://nodejs.org/api/esm.html#enabling)** projects) or **JSR**: +### Node LTS 20.x and higher ```sh -$ npm install @simplewebauthn/server +$ npm install @simplewebauthn/server @simplewebauthn/types ``` ```sh -$ npx jsr add @simplewebauthn/server +$ npx jsr add @simplewebauthn/server @simplewebauthn/types ``` -### Deno v1.43.x or higher +### Deno v1.43 and higher -It is also available for import into Deno projects from **deno.land/x** or **JSR**: - -```ts -import {...} from 'https://deno.land/x/simplewebauthn/deno/server.ts'; +```sh +$ deno add jsr:@simplewebauthn/server jsr:@simplewebauthn/types ``` ```sh -$ deno add jsr:@simplewebauthn/server jsr:@simplewebauthn/types +$ deno add npm:@simplewebauthn/server npm:@simplewebauthn/types +``` + +```ts +import {...} from 'https://deno.land/x/simplewebauthn/deno/server.ts'; +import type {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; ``` ## Usage diff --git a/packages/types/README.md b/packages/types/README.md index 532868537..7acd1ce2b 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -2,18 +2,19 @@ ![WebAuthn](https://img.shields.io/badge/WebAuthn-Simplified-blueviolet?style=for-the-badge&logo=WebAuthn) [![npm (scoped)](https://img.shields.io/npm/v/@simplewebauthn/types?style=for-the-badge&logo=npm)](https://www.npmjs.com/package/@simplewebauthn/types) +[![JSR](https://jsr.io/badges/@simplewebauthn/types?style=for-the-badge)](https://jsr.io/@simplewebauthn/types) TypeScript typings for **@simplewebauthn/server** and **@simplewebauthn/browser** - [Installation](#installation) - - [Node LTS 20.x or higher](#node-lts-20x-or-higher) - - [Deno v1.43.x or higher](#deno-v143x-or-higher) + - [Node LTS 20.x and higher](#node-lts-20x-and-higher) + - [Deno v1.43 and higher](#deno-v143-and-higher) ## Installation -### Node LTS 20.x or higher +This package can be installed from **NPM**, **JSR**, or **deno.land/x**: -This package can be installed from **NPM** or **JSR**: +### Node LTS 20.x and higher ```sh $ npm install @simplewebauthn/types @@ -23,14 +24,16 @@ $ npm install @simplewebauthn/types $ npx jsr add @simplewebauthn/types ``` -### Deno v1.43.x or higher +### Deno v1.43 and higher -It is available for import into Deno projects from **deno.land/x** or **JSR**: - -```ts -import {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; +```sh +$ deno add jsr:@simplewebauthn/types ``` ```sh -$ deno add jsr:@simplewebauthn/types +$ deno add npm:@simplewebauthn/types +``` + +```ts +import {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; ``` From 7b081ebca2fbc45652f07ca76973e185801bc868 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 16:39:30 -0800 Subject: [PATCH 102/115] Change "Usage" to "Documentation" --- packages/browser/README.md | 4 ++-- packages/server/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/browser/README.md b/packages/browser/README.md index d7090a63e..4471e9777 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -14,7 +14,7 @@ - [UMD](#umd) - [ES5](#es5) - [ES2021](#es2021) - - [Usage](#usage) + - [Documentation](#documentation) ## Installation @@ -72,7 +72,7 @@ If you only need to support modern browsers, include the `ES2021` version: ``` -## Usage +## Documentation You can find in-depth documentation on this package here: https://simplewebauthn.dev/docs/packages/browser diff --git a/packages/server/README.md b/packages/server/README.md index 3cc512373..8b91ec651 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -7,7 +7,7 @@ - [Installation](#installation) - [Node LTS 20.x and higher](#node-lts-20x-and-higher) - [Deno v1.43 and higher](#deno-v143-and-higher) -- [Usage](#usage) +- [Documentation](#documentation) - [Supported Attestation Formats](#supported-attestation-formats) ## Installation @@ -39,7 +39,7 @@ import {...} from 'https://deno.land/x/simplewebauthn/deno/server.ts'; import type {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; ``` -## Usage +## Documentation You can find in-depth documentation on this package here: https://simplewebauthn.dev/docs/packages/server From 9c49b1114dec6ad378ff87649f0085207927fc8a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 16:41:53 -0800 Subject: [PATCH 103/115] Slim down deno.land/x README --- deno/README.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/deno/README.md b/deno/README.md index cbfd6206d..3b4ef95d6 100644 --- a/deno/README.md +++ b/deno/README.md @@ -9,15 +9,7 @@ For example, to import the **server** or **types** packages into your Deno proje following to your **deps.ts** file: ```ts -import { - // ... -} from 'https://deno.land/x/simplewebauthn/deno/browser.ts'; - -import { - // ... -} from 'https://deno.land/x/simplewebauthn/deno/server.ts'; - -import { - // ... -} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; +import { ... } from 'https://deno.land/x/simplewebauthn/deno/browser.ts'; +import { ... } from 'https://deno.land/x/simplewebauthn/deno/server.ts'; +import type { ... } from 'https://deno.land/x/simplewebauthn/deno/types.ts'; ``` From f2a11026808eb4d9a3582d859e008b886fce6b00 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 23 Nov 2024 17:06:06 -0800 Subject: [PATCH 104/115] Restore ES2021 UMD browser build --- packages/browser/build_npm.ts | 120 +++++++++++++++++++++++----------- 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/packages/browser/build_npm.ts b/packages/browser/build_npm.ts index 45dd5001d..6aa5186ff 100644 --- a/packages/browser/build_npm.ts +++ b/packages/browser/build_npm.ts @@ -56,6 +56,7 @@ async function buildESMAndCJS() { 'fido', 'umd', ], + unpkg: 'dist/bundle/index.umd.min.js', dependencies: { // Deno workspaces maps this identifier locally, make sure it's defined in the NPM package '@simplewebauthn/types': `^${typesDenoJSON.version}`, @@ -75,28 +76,16 @@ async function buildESMAndCJS() { } /** - * Generate a UMD bundle using Rollup and Babel + * Generate UMD bundles using Rollup and Babel */ -async function buildUMD() { - console.log('Building UMD bundle...'); - - // Rollup plugin to remove injected copyright notices - const cleanCopyrightCommentInUMDBundleTargetingES5 = () => { - return { - name: 'cleanCopyrightCommentInUMDBundleTargetingES5', - renderChunk: async (code: string) => { - const comment = - `/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */`; - return code.indexOf(comment) > -1 ? code.replace(comment, '') : null; - }, - }; - }; +async function buildUMDES5() { + console.log('Building UMD (ES5) bundle...'); - const rollupOptions: RollupOptions = { + const rollupOptionsES5: RollupOptions = { // Process the ESM .js files generated by dnt input: `${outDir}/esm/index.js`, output: { - dir: `${outDir}`, + dir: `${outDir}/dist`, // Output to ESM so Babel can take care of UMD generation format: 'esm', entryFileNames: 'bundle/[name].es5.umd.min.js', @@ -120,27 +109,10 @@ async function buildUMD() { ], ], }), - /** - * Strip out third-party copyright notices that might confuse people - */ cleanCopyrightCommentInUMDBundleTargetingES5(), - /** - * Minify the bundled code - */ // @ts-ignore: Rollup plugins are callable terser(), - /** - * Add the package name and version to the top of the bundle - */ - // @ts-ignore: Rollup plugins are callable - versionInjector({ - packageJson: `${outDir}/package.json`, - injectInComments: { - fileRegexp: /\.(js)$/, - // [@simplewebauthn/browser@2.1.0] - tag: '[@simplewebauthn/browser@{version}]', - }, - }), + swanVersionInjector(), ], }, plugins: [ @@ -162,11 +134,53 @@ async function buildUMD() { try { // Process inputs // Generate a bundle - const bundle = await rollup(rollupOptions); + const bundle = await rollup(rollupOptionsES5); + + console.log('Writing bundle...'); + // Write the bundle to file + await bundle.write(rollupOptionsES5.output as OutputOptions); + + // Close the bundle + await bundle.close(); + } catch (error) { + throw new Error('Failed to generate Rollup bundle', { cause: error }); + } + + console.log('Complete!'); +} + +async function buildUMDES2021() { + console.log('Building UMD (ES2021) bundle...'); + + const rollupOptionsES2021: RollupOptions = { + // Process the ESM .js files generated by dnt + input: `${outDir}/esm/index.js`, + output: { + dir: `${outDir}/dist`, + // Output to ESM so Babel can take care of UMD generation + format: 'umd', + name: 'SimpleWebAuthnBrowser', + entryFileNames: 'bundle/[name].umd.min.js', + plugins: [ + // @ts-ignore: Rollup plugins are callable + terser(), + swanVersionInjector(), + ], + }, + plugins: [ + // @ts-ignore: Rollup plugins are callable + nodeResolve(), + ], + }; + + try { + // Process inputs + // Generate a bundle + const bundle = await rollup(rollupOptionsES2021); console.log('Writing bundle...'); // Write the bundle to file - await bundle.write(rollupOptions.output as OutputOptions); + await bundle.write(rollupOptionsES2021.output as OutputOptions); // Close the bundle await bundle.close(); @@ -181,4 +195,34 @@ async function buildUMD() { * Generate the builds */ await buildESMAndCJS(); -await buildUMD(); +await buildUMDES5(); +await buildUMDES2021(); + +/** + * Rollup plugin to remove injected copyright notices + */ +function cleanCopyrightCommentInUMDBundleTargetingES5() { + return { + name: 'cleanCopyrightCommentInUMDBundleTargetingES5', + renderChunk: (code: string) => { + const comment = + `/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */`; + return code.indexOf(comment) > -1 ? code.replace(comment, '') : null; + }, + }; +} + +/** + * Add the package name and version to the top of the bundle + */ +function swanVersionInjector() { + // @ts-ignore: Rollup plugins are callable + return versionInjector({ + packageJson: `${outDir}/package.json`, + injectInComments: { + fileRegexp: /\.(js)$/, + // [@simplewebauthn/browser@2.1.0] + tag: '[@simplewebauthn/browser@{version}]', + }, + }); +} From 01f26a89744421ea4a4d33c01bacb5666a952e69 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 12:35:50 -0800 Subject: [PATCH 105/115] Keep Deno out of /example and scratch envs --- .gitignore | 2 +- .vscode/settings.json | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a6604d544..5afda23b7 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,6 @@ example/*.crt example/fido-conformance-mds/* !example/fido-conformance-mds/.gitkeep packages/*/package-lock.json -scratchenv/ +scratchenv* .nx/cache .nx/workspace-data diff --git a/.vscode/settings.json b/.vscode/settings.json index 2b5b778ea..090e55c5a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,6 +4,10 @@ "deno.path": "/opt/homebrew/bin/deno", "deno.enable": true, "deno.config": "./deno.json", + "deno.disablePaths": [ + "./scratchenv-node", + "./example" + ], "editor.rulers": [ 100 ], From bdc9b08d5cc0cd195595ffb29fdc46421db34165 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 12:36:22 -0800 Subject: [PATCH 106/115] Refine version task to only consider src/ changes --- whatGotUpdated.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/whatGotUpdated.ts b/whatGotUpdated.ts index 0ff99989d..155c95ac5 100644 --- a/whatGotUpdated.ts +++ b/whatGotUpdated.ts @@ -105,7 +105,8 @@ function getChangedWorkspacePackages(changedFiles: string[], workspaceDirs: stri for (const file of changedFiles) { for (const workspace of workspaceDirs) { - if (file.startsWith(workspace)) { + // Check if a package's source code has been modified + if (file.startsWith(`${workspace}/src`)) { matchedPackages.add(workspace); } } From 255663018f154f781a6ea4597db3ae3c5f77b8ed Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 15:35:01 -0800 Subject: [PATCH 107/115] Tweak VS Code settings --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 090e55c5a..a7f61a1ee 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,7 @@ "deno.enable": true, "deno.config": "./deno.json", "deno.disablePaths": [ - "./scratchenv-node", + "./scratchenv", "./example" ], "editor.rulers": [ From 02eac3bb3575274b482447ff461b22e8900892ff Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 15:52:02 -0800 Subject: [PATCH 108/115] Deprecate deno.land/x hosting support --- HANDBOOK.md | 3 --- README.md | 7 +++---- deno/README.md | 23 +++++++++++++---------- deno/browser.ts | 2 -- deno/server.ts | 2 -- deno/server/helpers.ts | 2 -- deno/types.ts | 2 -- packages/browser/README.md | 9 +++------ packages/server/README.md | 9 +++------ packages/types/README.md | 8 +++----- 10 files changed, 25 insertions(+), 42 deletions(-) delete mode 100644 deno/browser.ts delete mode 100644 deno/server.ts delete mode 100644 deno/server/helpers.ts delete mode 100644 deno/types.ts diff --git a/HANDBOOK.md b/HANDBOOK.md index 9043ee8ee..e4546282d 100644 --- a/HANDBOOK.md +++ b/HANDBOOK.md @@ -50,9 +50,6 @@ The following commands can be run from the root of the monorepo to build the res then **publish it to both [NPM](https://www.npmjs.com/search?q=%40simplewebauthn) and [JSR](https://jsr.io/@simplewebauthn)**. -Publishing to **[deno.land/x](https://deno.land/x/simplewebauthn)** will happen as part of the last -step at the end of this handbook. - #### Need to publish @simplewebauthn/types? ``` diff --git a/README.md b/README.md index 0f333b15a..cf6f60c92 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,9 @@ An additional package is also included that contains shared TypeScript definitio ## Installation -SimpleWebAuthn is available on **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)**, -**[JSR](https://jsr.io/@simplewebauthn)**, and **[deno.land/x](https://deno.land/x/simplewebauthn)** -for import into **Node LTS 20.x and higher**, **Deno v1.43 and higher** projects, and other -compatible runtimes (Cloudflare Workers, Bun, etc...) +SimpleWebAuthn can be installed from **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)** and +**[JSR](https://jsr.io/@simplewebauthn)** in **Node LTS 20.x and higher**, **Deno v1.43 and higher** +projects, and other compatible runtimes (Cloudflare Workers, Bun, etc...) See the packages' READMEs for more specific installation information. diff --git a/deno/README.md b/deno/README.md index 3b4ef95d6..6e3aef132 100644 --- a/deno/README.md +++ b/deno/README.md @@ -1,15 +1,18 @@ -# Simple imports for Deno projects +# [DEPRECATED] deno.land/x support -These **.ts** files enable shorter imports of the various packages available in this monorepo when -importing SimpleWebAuthn from https://deno.land/x/simplewebauthn. +Importing SimpleWebAuthn packages from `"https://deno.land/x/simplewebauthn/..."` URLs is no longer +supported. Please use `deno add` to install them from **[JSR](https://jsr.io/@simplewebauthn)** +instead: -## Installation +```sh +# Deno v1.42 and higher +$ deno add jsr:@simplewebauthn/... +``` -For example, to import the **server** or **types** packages into your Deno project, add the -following to your **deps.ts** file: +These packages can also be imported from +**[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)**: -```ts -import { ... } from 'https://deno.land/x/simplewebauthn/deno/browser.ts'; -import { ... } from 'https://deno.land/x/simplewebauthn/deno/server.ts'; -import type { ... } from 'https://deno.land/x/simplewebauthn/deno/types.ts'; +```sh +# Deno v1.46 and higher +$ deno add npm:@simplewebauthn/... ``` diff --git a/deno/browser.ts b/deno/browser.ts deleted file mode 100644 index 3b890fd63..000000000 --- a/deno/browser.ts +++ /dev/null @@ -1,2 +0,0 @@ -// For simpler imports in Deno projects -export * from '../packages/browser/src/index.ts'; diff --git a/deno/server.ts b/deno/server.ts deleted file mode 100644 index 6ab9ff89d..000000000 --- a/deno/server.ts +++ /dev/null @@ -1,2 +0,0 @@ -// For simpler imports in Deno projects -export * from '../packages/server/src/index.ts'; diff --git a/deno/server/helpers.ts b/deno/server/helpers.ts deleted file mode 100644 index 7fba341f7..000000000 --- a/deno/server/helpers.ts +++ /dev/null @@ -1,2 +0,0 @@ -// For simpler imports in Deno projects -export * from '../../packages/server/src/helpers/index.ts'; diff --git a/deno/types.ts b/deno/types.ts deleted file mode 100644 index bf4801146..000000000 --- a/deno/types.ts +++ /dev/null @@ -1,2 +0,0 @@ -// For simpler imports in Deno projects -export * from '../packages/types/src/index.ts'; diff --git a/packages/browser/README.md b/packages/browser/README.md index 4471e9777..35953b847 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -18,7 +18,8 @@ ## Installation -This package can be installed from **NPM**, **JSR**, or **deno.land/x**: +This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)** and +**[JSR](https://jsr.io/@simplewebauthn)**: ### Node LTS 20.x and higher @@ -37,14 +38,10 @@ $ deno add jsr:@simplewebauthn/browser jsr:@simplewebauthn/types ``` ```sh +# Available in Deno v1.46 and higher $ deno add npm:@simplewebauthn/browser npm:@simplewebauthn/types ``` -```ts -import {...} from 'https://deno.land/x/simplewebauthn/deno/browser.ts'; -import type {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; -``` - ### UMD This package can also be installed via **unpkg** by including the following script in your page's diff --git a/packages/server/README.md b/packages/server/README.md index 8b91ec651..90771e9f4 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -12,7 +12,8 @@ ## Installation -This package can be installed from **NPM**, **JSR**, or **deno.land/x**: +This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)** and +**[JSR](https://jsr.io/@simplewebauthn)**: ### Node LTS 20.x and higher @@ -31,14 +32,10 @@ $ deno add jsr:@simplewebauthn/server jsr:@simplewebauthn/types ``` ```sh +# Available in Deno v1.46 and higher $ deno add npm:@simplewebauthn/server npm:@simplewebauthn/types ``` -```ts -import {...} from 'https://deno.land/x/simplewebauthn/deno/server.ts'; -import type {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; -``` - ## Documentation You can find in-depth documentation on this package here: diff --git a/packages/types/README.md b/packages/types/README.md index 7acd1ce2b..d825ea4cd 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -12,7 +12,8 @@ TypeScript typings for **@simplewebauthn/server** and **@simplewebauthn/browser* ## Installation -This package can be installed from **NPM**, **JSR**, or **deno.land/x**: +This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)** and +**[JSR](https://jsr.io/@simplewebauthn)**: ### Node LTS 20.x and higher @@ -31,9 +32,6 @@ $ deno add jsr:@simplewebauthn/types ``` ```sh +# Available in Deno v1.46 and higher $ deno add npm:@simplewebauthn/types ``` - -```ts -import {...} from 'https://deno.land/x/simplewebauthn/deno/types.ts'; -``` From 6868b63f38c3e89f3d8eadf7958594be65ed4503 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 21:35:50 -0800 Subject: [PATCH 109/115] Simplify installation guidance --- packages/browser/README.md | 9 --------- packages/server/README.md | 9 --------- packages/types/README.md | 9 --------- 3 files changed, 27 deletions(-) diff --git a/packages/browser/README.md b/packages/browser/README.md index 35953b847..e947d1da1 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -27,21 +27,12 @@ This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40sim $ npm install @simplewebauthn/browser @simplewebauthn/types ``` -```sh -$ npx jsr add @simplewebauthn/browser @simplewebauthn/types -``` - ### Deno v1.43 and higher ```sh $ deno add jsr:@simplewebauthn/browser jsr:@simplewebauthn/types ``` -```sh -# Available in Deno v1.46 and higher -$ deno add npm:@simplewebauthn/browser npm:@simplewebauthn/types -``` - ### UMD This package can also be installed via **unpkg** by including the following script in your page's diff --git a/packages/server/README.md b/packages/server/README.md index 90771e9f4..edafb5e99 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -21,21 +21,12 @@ This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40sim $ npm install @simplewebauthn/server @simplewebauthn/types ``` -```sh -$ npx jsr add @simplewebauthn/server @simplewebauthn/types -``` - ### Deno v1.43 and higher ```sh $ deno add jsr:@simplewebauthn/server jsr:@simplewebauthn/types ``` -```sh -# Available in Deno v1.46 and higher -$ deno add npm:@simplewebauthn/server npm:@simplewebauthn/types -``` - ## Documentation You can find in-depth documentation on this package here: diff --git a/packages/types/README.md b/packages/types/README.md index d825ea4cd..878ef48d8 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -21,17 +21,8 @@ This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40sim $ npm install @simplewebauthn/types ``` -```sh -$ npx jsr add @simplewebauthn/types -``` - ### Deno v1.43 and higher ```sh $ deno add jsr:@simplewebauthn/types ``` - -```sh -# Available in Deno v1.46 and higher -$ deno add npm:@simplewebauthn/types -``` From e5589ad38d115b5db8443c167d29f0a71a7e28d8 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 21:36:04 -0800 Subject: [PATCH 110/115] Refine deno.land/x migration guidance --- deno/README.md | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/deno/README.md b/deno/README.md index 6e3aef132..5100a6005 100644 --- a/deno/README.md +++ b/deno/README.md @@ -1,18 +1,29 @@ # [DEPRECATED] deno.land/x support Importing SimpleWebAuthn packages from `"https://deno.land/x/simplewebauthn/..."` URLs is no longer -supported. Please use `deno add` to install them from **[JSR](https://jsr.io/@simplewebauthn)** -instead: +supported. Please use Deno's native support for JSR imports instead. -```sh -# Deno v1.42 and higher -$ deno add jsr:@simplewebauthn/... +## Example + +**Before:** + +```ts +import { generateAuthenticationOptions } from 'https://deno.land/x/simplewebauthn/deno/server.ts'; +``` + +**After:** + +```ts +import { generateAuthenticationOptions } from 'jsr:@simplewebauthn/server'; ``` -These packages can also be imported from -**[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)**: +Alternatively, use `deno add` to install them from **[JSR](https://jsr.io/@simplewebauthn)**: ```sh -# Deno v1.46 and higher -$ deno add npm:@simplewebauthn/... +# Deno v1.42 and higher +$ deno add jsr:@simplewebauthn/server +``` + +```ts +import { generateAuthenticationOptions } from '@simplewebauthn/server'; ``` From 14a2520972740a9596d9a9a87f62902f96d22f1c Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 21:36:47 -0800 Subject: [PATCH 111/115] Tweak UMD docs in browser README --- packages/browser/README.md | 42 ++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/packages/browser/README.md b/packages/browser/README.md index e947d1da1..9c41a778a 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -1,20 +1,18 @@ - - -# @simplewebauthn/browser +# @simplewebauthn/browser ![WebAuthn](https://img.shields.io/badge/WebAuthn-Simplified-blueviolet?style=for-the-badge&logo=WebAuthn) [![npm (scoped)](https://img.shields.io/npm/v/@simplewebauthn/browser?style=for-the-badge&logo=npm)](https://www.npmjs.com/package/@simplewebauthn/browser) [![JSR](https://jsr.io/badges/@simplewebauthn/browser?style=for-the-badge)](https://jsr.io/@simplewebauthn/browser) -![Browser Support](https://img.shields.io/badge/Browser-ES5+-brightgreen?style=for-the-badge&logo=Mozilla+Firefox) +![Browser Support](https://img.shields.io/badge/Browser-ES2021+-brightgreen?style=for-the-badge&logo=Mozilla+Firefox) +![Browser Support](https://img.shields.io/badge/Browser-ES5-brightgreen?style=for-the-badge&logo=Mozilla+Firefox) -- [@simplewebauthn/browser](#simplewebauthnbrowser) - - [Installation](#installation) - - [Node LTS 20.x and higher](#node-lts-20x-and-higher) - - [Deno v1.43 and higher](#deno-v143-and-higher) - - [UMD](#umd) - - [ES5](#es5) - - [ES2021](#es2021) - - [Documentation](#documentation) +- [Installation](#installation) + - [Node LTS 20.x and higher](#node-lts-20x-and-higher) + - [Deno v1.43 and higher](#deno-v143-and-higher) + - [UMD](#umd) + - [ES2021](#es2021) + - [ES5](#es5) +- [Documentation](#documentation) ## Installation @@ -39,25 +37,25 @@ This package can also be installed via **unpkg** by including the following scri `` element. The library's methods will be available on the global **`SimpleWebAuthnBrowser`** object. -> NOTE: The only difference between the two packages below is that the ES5 bundle includes -> TypeScript's `tslib` runtime code. This adds some bundle size overhead, but _does_ enable use of -> `supportsWebAuthn()` in older browsers to show appropriate UI when WebAuthn is unavailable. +> NOTE: The only difference between the two packages below is that the ES5 bundle includes some +> polyfills for older browsers. This adds some bundle size overhead, but _does_ enable use of +> `browserSupportsWebAuthn()` in older browsers to show appropriate UI when WebAuthn is unavailable. -#### ES5 +#### ES2021 -If you need to support WebAuthn feature detection in deprecated browsers like IE11 and Edge Legacy, -include the `ES5` version: +If you only need to support modern browsers, include the `ES2021` version: ```html - + ``` -#### ES2021 +#### ES5 -If you only need to support modern browsers, include the `ES2021` version: +If you need to support WebAuthn feature detection in deprecated browsers like IE11 and Edge Legacy, +include the `ES5` version: ```html - + ``` ## Documentation From d39b6f7fbe60cb68594df45991c4c6e226ae4f18 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 22:13:55 -0800 Subject: [PATCH 112/115] Remove leading $ for cleaner copy-pastes --- deno/README.md | 2 +- packages/browser/README.md | 4 ++-- packages/server/README.md | 4 ++-- packages/types/README.md | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/deno/README.md b/deno/README.md index 5100a6005..863b2b786 100644 --- a/deno/README.md +++ b/deno/README.md @@ -21,7 +21,7 @@ Alternatively, use `deno add` to install them from **[JSR](https://jsr.io/@simpl ```sh # Deno v1.42 and higher -$ deno add jsr:@simplewebauthn/server +deno add jsr:@simplewebauthn/server ``` ```ts diff --git a/packages/browser/README.md b/packages/browser/README.md index 9c41a778a..8e6559401 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -22,13 +22,13 @@ This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40sim ### Node LTS 20.x and higher ```sh -$ npm install @simplewebauthn/browser @simplewebauthn/types +npm install @simplewebauthn/browser @simplewebauthn/types ``` ### Deno v1.43 and higher ```sh -$ deno add jsr:@simplewebauthn/browser jsr:@simplewebauthn/types +deno add jsr:@simplewebauthn/browser jsr:@simplewebauthn/types ``` ### UMD diff --git a/packages/server/README.md b/packages/server/README.md index edafb5e99..5a01dd5bf 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -18,13 +18,13 @@ This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40sim ### Node LTS 20.x and higher ```sh -$ npm install @simplewebauthn/server @simplewebauthn/types +npm install @simplewebauthn/server @simplewebauthn/types ``` ### Deno v1.43 and higher ```sh -$ deno add jsr:@simplewebauthn/server jsr:@simplewebauthn/types +deno add jsr:@simplewebauthn/server jsr:@simplewebauthn/types ``` ## Documentation diff --git a/packages/types/README.md b/packages/types/README.md index 878ef48d8..6e03c807a 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -18,11 +18,11 @@ This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40sim ### Node LTS 20.x and higher ```sh -$ npm install @simplewebauthn/types +npm install @simplewebauthn/types ``` ### Deno v1.43 and higher ```sh -$ deno add jsr:@simplewebauthn/types +deno add jsr:@simplewebauthn/types ``` From e7c3d3437529d2f406273b039222747089244d87 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 22:33:36 -0800 Subject: [PATCH 113/115] Make everything "Deno v1.43 and higher" --- deno/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deno/README.md b/deno/README.md index 863b2b786..c7be33918 100644 --- a/deno/README.md +++ b/deno/README.md @@ -20,7 +20,7 @@ import { generateAuthenticationOptions } from 'jsr:@simplewebauthn/server'; Alternatively, use `deno add` to install them from **[JSR](https://jsr.io/@simplewebauthn)**: ```sh -# Deno v1.42 and higher +# Deno v1.43 and higher deno add jsr:@simplewebauthn/server ``` From d91d3c16494a3d7d4743fcd56cf5ebbe521dc37d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 22:37:26 -0800 Subject: [PATCH 114/115] Get more specific with README registry URLs --- packages/browser/README.md | 4 ++-- packages/server/README.md | 4 ++-- packages/types/README.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/browser/README.md b/packages/browser/README.md index 8e6559401..c130edc95 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -16,8 +16,8 @@ ## Installation -This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)** and -**[JSR](https://jsr.io/@simplewebauthn)**: +This package can be installed from **[NPM](https://www.npmjs.com/package/@simplewebauthn/browser)** +and **[JSR](https://jsr.io/@simplewebauthn/browser)**: ### Node LTS 20.x and higher diff --git a/packages/server/README.md b/packages/server/README.md index 5a01dd5bf..356e2c093 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -12,8 +12,8 @@ ## Installation -This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)** and -**[JSR](https://jsr.io/@simplewebauthn)**: +This package can be installed from **[NPM](https://www.npmjs.com/package/@simplewebauthn/server)** +and **[JSR](https://jsr.io/@simplewebauthn/server)**: ### Node LTS 20.x and higher diff --git a/packages/types/README.md b/packages/types/README.md index 6e03c807a..71d07d410 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -12,8 +12,8 @@ TypeScript typings for **@simplewebauthn/server** and **@simplewebauthn/browser* ## Installation -This package can be installed from **[NPM](https://www.npmjs.com/search?q=%40simplewebauthn)** and -**[JSR](https://jsr.io/@simplewebauthn)**: +This package can be installed from **[NPM](https://www.npmjs.com/package/@simplewebauthn/types)** +and **[JSR](https://jsr.io/@simplewebauthn/types)**: ### Node LTS 20.x and higher From 9c05d27b08441e4ec6964ee4a523581a51a6b656 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 24 Nov 2024 22:47:05 -0800 Subject: [PATCH 115/115] Remove an empty import from a test --- .../src/authentication/verifyAuthenticationResponse.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/authentication/verifyAuthenticationResponse.test.ts b/packages/server/src/authentication/verifyAuthenticationResponse.test.ts index 7496d3ffd..b7c45e2dd 100644 --- a/packages/server/src/authentication/verifyAuthenticationResponse.test.ts +++ b/packages/server/src/authentication/verifyAuthenticationResponse.test.ts @@ -8,7 +8,6 @@ import { } from '@std/assert'; import { returnsNext, stub } from '@std/testing/mock'; import type { AuthenticationResponseJSON, WebAuthnCredential } from '@simplewebauthn/types'; -import {} from '@std/assert'; import { verifyAuthenticationResponse } from './verifyAuthenticationResponse.ts';