From 5511e1540db5785e8c71336c922e749fc5e09555 Mon Sep 17 00:00:00 2001 From: "Seo Myunggyun (Jonathan)" Date: Fri, 17 Mar 2023 18:08:25 +0900 Subject: [PATCH 1/4] @planetarium/account: reject high S sig Co-authored-by: Hong Minhee --- @planetarium/account/src/PublicKey.ts | 2 +- @planetarium/account/src/Signature.ts | 5 +++++ @planetarium/account/test/Signature.test.ts | 22 ++++++++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/@planetarium/account/src/PublicKey.ts b/@planetarium/account/src/PublicKey.ts index e722394003d..507d6220953 100644 --- a/@planetarium/account/src/PublicKey.ts +++ b/@planetarium/account/src/PublicKey.ts @@ -1,6 +1,6 @@ -import * as secp256k1 from "@noble/secp256k1"; import { Message, hashMessage } from "./Message.js"; import Signature from "./Signature.js"; +import * as secp256k1 from "@noble/secp256k1"; export type PublicKeyForm = "compressed" | "uncompressed"; diff --git a/@planetarium/account/src/Signature.ts b/@planetarium/account/src/Signature.ts index a1387970e07..6af2b02671d 100644 --- a/@planetarium/account/src/Signature.ts +++ b/@planetarium/account/src/Signature.ts @@ -4,6 +4,11 @@ export class Signature { readonly #signature: secp256k1.Signature; private constructor(signature: secp256k1.Signature) { + if (signature.hasHighS()) + throw new RangeError( + "A signature with high S is unsupported; " + + "normalize it to get rid of high S", + ); this.#signature = signature; } diff --git a/@planetarium/account/test/Signature.test.ts b/@planetarium/account/test/Signature.test.ts index 6c5fe166918..1ae1cc4557d 100644 --- a/@planetarium/account/test/Signature.test.ts +++ b/@planetarium/account/test/Signature.test.ts @@ -1,6 +1,6 @@ import { Signature } from "../src/Signature"; -import { describe, expect, test } from "vitest"; import { inspect } from "node:util"; +import { describe, expect, test } from "vitest"; describe("Signature", () => { const sigBytes = new Uint8Array([ @@ -26,12 +26,32 @@ describe("Signature", () => { inputBytes.fill(0, 0, inputBytes.length); expect(sig.toBytes()).toStrictEqual(sigBytes); expect(sig.toHex()).toBe(sigHex); + + // A signature with high S is disallowed: + const sigWithHighS = new Uint8Array([ + 0x30, 0x45, 0x02, 0x20, 0x38, 0x43, 0x16, 0xdb, 0x7c, 0xfe, 0x12, 0x60, + 0x6e, 0xa0, 0x54, 0x29, 0xd4, 0x4c, 0x10, 0xe0, 0xff, 0x8b, 0xd2, 0x8c, + 0xc8, 0x73, 0xff, 0x10, 0x41, 0x4e, 0xbc, 0x40, 0x10, 0xe5, 0x9e, 0xe7, + 0x02, 0x21, 0x00, 0xb7, 0xf4, 0x80, 0xd3, 0xcc, 0x9f, 0x65, 0x35, 0xcd, + 0xe2, 0x96, 0x02, 0x63, 0xf7, 0x80, 0xeb, 0x82, 0xae, 0x5b, 0xe5, 0xdb, + 0xba, 0x1d, 0x43, 0xaa, 0x16, 0x35, 0x62, 0xc6, 0x75, 0x85, 0xa7, + ]); + expect(() => Signature.fromBytes(sigWithHighS)).throws( + RangeError, + "high S", + ); }); test("fromHex()", () => { const sig = Signature.fromHex(sigHex); expect(sig.toHex()).toBe(sigHex); expect(sig.toBytes()).toStrictEqual(sigBytes); + + // A signature with high S is disallowed: + const sigWithHighS = + "30450220384316db7cfe12606ea05429d44c10e0ff8bd28cc873ff10414ebc4010e59ee" + + "7022100b7f480d3cc9f6535cde2960263f780eb82ae5be5dbba1d43aa163562c67585a7"; + expect(() => Signature.fromHex(sigWithHighS)).throws(RangeError, "high S"); }); test("toBytes()", () => { From 1968c3f318c1988d6c6cb0e1f1ba1b0e8996306b Mon Sep 17 00:00:00 2001 From: "Seo Myunggyun (Jonathan)" Date: Fri, 17 Mar 2023 17:42:57 +0900 Subject: [PATCH 2/4] Suggest YAML vscode ext, define yaml lsp schema Co-authored-by: Hong Minhee --- .github/workflows/benchmarks-merged.yml | 1 + .github/workflows/benchmarks-pr.yml | 1 + .github/workflows/build.yaml | 1 + .github/workflows/check-build.yaml | 5 +++-- .github/workflows/delete-old-artifacts.yml | 1 + .github/workflows/main.yml | 3 ++- .github/workflows/push-docker-image.yml | 1 + .github/workflows/rebase.yml | 1 + .github/workflows/yarn.yaml | 2 ++ .vscode/extensions.json | 3 ++- 10 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/benchmarks-merged.yml b/.github/workflows/benchmarks-merged.yml index a52548201ea..e9ef893c02d 100644 --- a/.github/workflows/benchmarks-merged.yml +++ b/.github/workflows/benchmarks-merged.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json name: Libplanet benchmark (for merge commits) on: push: diff --git a/.github/workflows/benchmarks-pr.yml b/.github/workflows/benchmarks-pr.yml index 855b44c496f..b12e3cff6c2 100644 --- a/.github/workflows/benchmarks-pr.yml +++ b/.github/workflows/benchmarks-pr.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json name: Libplanet benchmark (for pull requests) on: pull_request: {} diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 66d500dd3d1..85aec795f0d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json on: push: branches: diff --git a/.github/workflows/check-build.yaml b/.github/workflows/check-build.yaml index 5ed0dd73235..f42391ab24e 100644 --- a/.github/workflows/check-build.yaml +++ b/.github/workflows/check-build.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json # This workflow checks if the build (compilation) succeeds without any errors. # Although the build is done in CircleCI as well, to speed up the build time # some checks are turned off in CircleCI. To conduct the complete checks @@ -7,8 +8,8 @@ # - https://github.com/planetarium/libplanet/pull/977 # - https://github.com/planetarium/libplanet/issues/976 on: - push: [] - pull_request: [] + push: null + pull_request: null name: check-build jobs: diff --git a/.github/workflows/delete-old-artifacts.yml b/.github/workflows/delete-old-artifacts.yml index 3e6c94755c0..f57789bc463 100644 --- a/.github/workflows/delete-old-artifacts.yml +++ b/.github/workflows/delete-old-artifacts.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json name: 'Delete old artifacts' on: schedule: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 94ab5efbd03..ada684e1308 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json on: push: branches-ignore: @@ -6,7 +7,7 @@ on: - "*" schedule: - cron: 59 14 * * * - pull_request: [] + pull_request: null name: main jobs: diff --git a/.github/workflows/push-docker-image.yml b/.github/workflows/push-docker-image.yml index b36796003be..09e5fe1a674 100644 --- a/.github/workflows/push-docker-image.yml +++ b/.github/workflows/push-docker-image.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json on: push name: push docker image jobs: diff --git a/.github/workflows/rebase.yml b/.github/workflows/rebase.yml index de1cfb81a27..e7795bc3079 100644 --- a/.github/workflows/rebase.yml +++ b/.github/workflows/rebase.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json on: issue_comment: types: [created] diff --git a/.github/workflows/yarn.yaml b/.github/workflows/yarn.yaml index 711190fdee2..33fda7e991f 100644 --- a/.github/workflows/yarn.yaml +++ b/.github/workflows/yarn.yaml @@ -1,8 +1,10 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json name: yarn on: push: branches: ["*"] tags: ["*"] + pull_request: null jobs: build: diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8943bd5ab58..d7d41c5a005 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -7,6 +7,7 @@ "streetsidesoftware.code-spell-checker", "GitHub.vscode-pull-request-github", "arcanis.vscode-zipfs", - "rome.rome" + "rome.rome", + "redhat.vscode-yaml" ] } From f5b25ca2d739ec0e7025f885f28904123ab56ebe Mon Sep 17 00:00:00 2001 From: "Seo Myunggyun (Jonathan)" Date: Thu, 9 Mar 2023 15:17:53 +0900 Subject: [PATCH 3/4] @planetarium/account-aws-kms Co-authored-by: Hong Minhee --- .github/bin/constants.sh | 1 + .github/workflows/yarn.yaml | 19 +- @planetarium/account-aws-kms/.gitignore | 2 + @planetarium/account-aws-kms/CONTRIBUTING.md | 27 + @planetarium/account-aws-kms/README.md | 49 + @planetarium/account-aws-kms/examples/cli.ts | 38 + @planetarium/account-aws-kms/package.json | 44 + .../account-aws-kms/src/AwsKmsAccount.ts | 36 + .../account-aws-kms/src/AwsKmsKeyId.ts | 3 + .../account-aws-kms/src/AwsKmsKeyStore.ts | 225 +++ .../account-aws-kms/src/AwsKmsMetadata.ts | 10 + @planetarium/account-aws-kms/src/asn1.ts | 39 + @planetarium/account-aws-kms/src/index.ts | 5 + .../test/AwsKmsKeyStore.test.ts | 239 +++ .../account-aws-kms/test/asn1.test.ts | 30 + @planetarium/account-aws-kms/tsconfig.json | 15 + @planetarium/account-aws-kms/vitest.config.ts | 8 + package.json | 1 + yarn.lock | 1560 +++++++++++++++++ 19 files changed, 2350 insertions(+), 1 deletion(-) create mode 100644 @planetarium/account-aws-kms/.gitignore create mode 100644 @planetarium/account-aws-kms/CONTRIBUTING.md create mode 100644 @planetarium/account-aws-kms/README.md create mode 100644 @planetarium/account-aws-kms/examples/cli.ts create mode 100644 @planetarium/account-aws-kms/package.json create mode 100644 @planetarium/account-aws-kms/src/AwsKmsAccount.ts create mode 100644 @planetarium/account-aws-kms/src/AwsKmsKeyId.ts create mode 100644 @planetarium/account-aws-kms/src/AwsKmsKeyStore.ts create mode 100644 @planetarium/account-aws-kms/src/AwsKmsMetadata.ts create mode 100644 @planetarium/account-aws-kms/src/asn1.ts create mode 100644 @planetarium/account-aws-kms/src/index.ts create mode 100644 @planetarium/account-aws-kms/test/AwsKmsKeyStore.test.ts create mode 100644 @planetarium/account-aws-kms/test/asn1.test.ts create mode 100644 @planetarium/account-aws-kms/tsconfig.json create mode 100644 @planetarium/account-aws-kms/vitest.config.ts diff --git a/.github/bin/constants.sh b/.github/bin/constants.sh index c71d94eeaf8..97fecb84a8e 100644 --- a/.github/bin/constants.sh +++ b/.github/bin/constants.sh @@ -24,6 +24,7 @@ npm_packages=( "@planetarium/cli" "@planetarium/tx" "@planetarium/account" + "@planetarium/account-aws-kms" "@planetarium/account-web3-secret-storage" ) diff --git a/.github/workflows/yarn.yaml b/.github/workflows/yarn.yaml index 33fda7e991f..eaeb41b5484 100644 --- a/.github/workflows/yarn.yaml +++ b/.github/workflows/yarn.yaml @@ -20,7 +20,24 @@ jobs: cache: yarn - run: yarn install --immutable # TODO: cache and apply --immutable-cache --check-cache - run: yarn build - - run: yarn test + - id: account-aws-kms-changes + uses: tj-actions/changed-files@v35 + with: + files: "@planetarium/account-aws-kms" + - name: Run yarn test w/o AWS cred for PR unrelated to account-aws-kms + if: | + github.event_name == 'pull_request' && + steps.account-aws-kms-changes.outputs.any_changes != 'true' + run: yarn test + - name: Run yarn test w/ AWS cred for push and PR related to account-aws-kms + if: | + github.event_name != 'pull_request' || + steps.account-aws-kms-changes.outputs.any_changes == 'true' + run: yarn test + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: ${{ secrets.AWS_REGION }} - run: yarn pack-all libplanet-tools-npm-install-test: diff --git a/@planetarium/account-aws-kms/.gitignore b/@planetarium/account-aws-kms/.gitignore new file mode 100644 index 00000000000..d64c4ca2869 --- /dev/null +++ b/@planetarium/account-aws-kms/.gitignore @@ -0,0 +1,2 @@ +coverage/ +dist/ diff --git a/@planetarium/account-aws-kms/CONTRIBUTING.md b/@planetarium/account-aws-kms/CONTRIBUTING.md new file mode 100644 index 00000000000..cb52f382444 --- /dev/null +++ b/@planetarium/account-aws-kms/CONTRIBUTING.md @@ -0,0 +1,27 @@ +Contribution guide +================== + +*See the monorepository's [contribution guide](../../CONTRIBUTING.md) as well.* + + +Automated tests +--------------- + +The automated tests are closed to functional tests rather than unit tests. +It requires AWS credentials to run tests, and each test run charges a fee. +Therefore, you should avoid to repeatedly run tests like a habit even when you +change much. + +The test suite requires the following environment variables to be configured: + + - `AWS_ACCESS_KEY_ID` + - `AWS_SECRET_ACCESS_KEY` + - `AWS_REGION` + +The account requires several KMS permissions. See also +the [*README.md*](README.md) for details. + +Note that it creates and immediately delete multiple keys to utilize them as +fixture data. They are scheduled to be deleted in seven days. Repeated tests +may make your AWS KMS a mess, so be careful. We recommend you to run the test +suite on a region you usually don't use. diff --git a/@planetarium/account-aws-kms/README.md b/@planetarium/account-aws-kms/README.md new file mode 100644 index 00000000000..ec285c22998 --- /dev/null +++ b/@planetarium/account-aws-kms/README.md @@ -0,0 +1,49 @@ +@planetarium/account-aws-kms +============================ + +An npm package for providing `AwsKmsKeyStore`, an implementation of `KeyStore` +from *@planetarium/account* that uses AWS KMS as the backend. + +Required permissions +-------------------- + +| Method | Required permissions | Required for `AwsKmsKeyStoreOptions.scopingTags` | +|-----------------------------|-------------------------------------|--------------------------------------------------| +| `AwsKmsKeyStore.list()` | `kms:ListKeys` | `kms:ListResourceTags` | +| `AwsKmsKeyStore.get()` | `kms:ListKeys` | `kms:ListResourceTags` | +| `AwsKmsKeyStore.generate()` | `kms:CreateKey`, `kms:GetPublicKey` | `kms:TagResource` | +| `AwsKmsKeyStore.delete()` | `kms:ScheduleKeyDeletion` | | +| `AwsKmsAccount.sign()`[^1] | `kms:Sign` | | + +Replace `[NUMERIC_ROOT_ACCOUNT_ID]` with your [12-digit root account ID][AWSId]: + +~~~~ json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "kms:GetPublicKey", + "kms:ScheduleKeyDeletion", + "kms:DescribeKey", + "kms:ListResourceTags", + "kms:Sign", + "kms:TagResource" + ], + "Resource": "arn:aws:kms:*:[NUMERIC_ROOT_ACCOUNT_ID]:key/*" + }, + { + "Effect": "Allow", + "Action": [ + "kms:ListKeys", + "kms:CreateKey" + ], + "Resource": "*" + } + ] +} +~~~~ + +[^1]: An `AwsKmsAccount` instance can be obtained from `AwsKmsKeyStore.get()`. +[AWSId]: https://docs.aws.amazon.com/signin/latest/userguide/FindingYourAWSId.html diff --git a/@planetarium/account-aws-kms/examples/cli.ts b/@planetarium/account-aws-kms/examples/cli.ts new file mode 100644 index 00000000000..c56f8b1fdba --- /dev/null +++ b/@planetarium/account-aws-kms/examples/cli.ts @@ -0,0 +1,38 @@ +import { RawPrivateKey } from "@planetarium/account"; +import { AwsKmsKeyStore, KMSClient } from "@planetarium/account-aws-kms"; + +// Expects the below environment variables: +// - AWS_ACCESS_KEY_ID +// - AWS_SECRET_ACCESS_KEY +const store = new AwsKmsKeyStore( + new KMSClient({ + region: "ap-northeast-3", + }), +); + +if (process.argv[2] === "list") { + for await (const key of store.list()) { + console.log(key); + } +} else if (process.argv[2] === "get") { + const keyId = process.argv[3]; + if (keyId == null) { + console.error("error: missing key id"); + process.exit(1); + } + const key = await store.get(keyId); + console.log(key); +} else if (process.argv[2] === "generate") { + console.log(await store.generate()); +} else if (process.argv[2] === "delete") { + const keyId = process.argv[3]; + if (keyId == null) { + console.error("error: missing key id"); + process.exit(1); + } + const key = await store.delete(keyId); + console.log(key); +} else { + console.error("usage: cli.ts list|get|generate|delete"); + process.exit(1); +} diff --git a/@planetarium/account-aws-kms/package.json b/@planetarium/account-aws-kms/package.json new file mode 100644 index 00000000000..f2a8bca98da --- /dev/null +++ b/@planetarium/account-aws-kms/package.json @@ -0,0 +1,44 @@ +{ + "name": "@planetarium/account-aws-kms", + "private": true, + "description": "Libplanet account implementation using AWS KMS", + "type": "module", + "main": "./dist/index.js", + "exports": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist/**/*" + ], + "scripts": { + "build": "yarn && nanobundle build", + "prepack": "yarn && yarn build", + "dev": "yarn test", + "test": "yarn && yarn run -T tsc -p tsconfig.json && vitest run; printf \"\\033[41;97mNOTE: running this test suite too many times may be costly, as this creates and deletes AWS KMS keys during testing. KMS keys are prorated per hour for the price of \\$1.00 per key.\\033[0m\n\" > /dev/stderr", + "coverage": "yarn && vitest run --coverage" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/planetarium/libplanet.git", + "directory": "@planetarium/account-aws-kms" + }, + "keywords": [ + "libplanet" + ], + "author": "Planetarium (https://planetarium.dev/)", + "license": "LGPL-2.1-or-later", + "devDependencies": { + "@types/node": "^18.13.0", + "@vitest/coverage-c8": "^0.29.3", + "@vitest/ui": "^0.29.3", + "es-aggregate-error": "^1.0.9", + "nanobundle": "^1.5.0", + "vite": "^4.1.1", + "vitest": "^0.29.3" + }, + "dependencies": { + "@aws-sdk/client-kms": "^3.272.0", + "@noble/secp256k1": "^1.7.1", + "@planetarium/account": "workspace:^", + "asn1js": "^3.0.5" + } +} diff --git a/@planetarium/account-aws-kms/src/AwsKmsAccount.ts b/@planetarium/account-aws-kms/src/AwsKmsAccount.ts new file mode 100644 index 00000000000..ac1489a6444 --- /dev/null +++ b/@planetarium/account-aws-kms/src/AwsKmsAccount.ts @@ -0,0 +1,36 @@ +import { AwsKmsKeyId } from "./AwsKmsKeyId.js"; +import { KMSClient, SignCommand } from "@aws-sdk/client-kms"; +import { Signature as NobleSignature } from "@noble/secp256k1"; +import { + type Account, + type Message, + PublicKey, + Signature, +} from "@planetarium/account"; + +export class AwsKmsAccount implements Account { + readonly #client: KMSClient; + + readonly keyId: AwsKmsKeyId; + readonly publicKey: PublicKey; + + constructor(keyId: AwsKmsKeyId, publicKey: PublicKey, client: KMSClient) { + this.keyId = keyId; + this.publicKey = publicKey; + this.#client = client; + } + + async sign(message: Message): Promise { + const cmd = new SignCommand({ + KeyId: this.keyId, + Message: message, + SigningAlgorithm: "ECDSA_SHA_256", + }); + const response = await this.#client.send(cmd); + if (response.Signature == null) throw new Error("Failed to sign message"); + const sig = NobleSignature.fromDER(response.Signature).normalizeS(); + return Signature.fromHex(sig.toDERHex()); + } +} + +export default AwsKmsAccount; diff --git a/@planetarium/account-aws-kms/src/AwsKmsKeyId.ts b/@planetarium/account-aws-kms/src/AwsKmsKeyId.ts new file mode 100644 index 00000000000..5834e3381ab --- /dev/null +++ b/@planetarium/account-aws-kms/src/AwsKmsKeyId.ts @@ -0,0 +1,3 @@ +export type AwsKmsKeyId = string; // UUID + +export default AwsKmsKeyId; diff --git a/@planetarium/account-aws-kms/src/AwsKmsKeyStore.ts b/@planetarium/account-aws-kms/src/AwsKmsKeyStore.ts new file mode 100644 index 00000000000..02adfe6a5ac --- /dev/null +++ b/@planetarium/account-aws-kms/src/AwsKmsKeyStore.ts @@ -0,0 +1,225 @@ +import { AwsKmsAccount } from "./AwsKmsAccount.js"; +import { AwsKmsKeyId } from "./AwsKmsKeyId.js"; +import { AwsKmsMetadata } from "./AwsKmsMetadata.js"; +import { parseSubjectPublicKeyInfo } from "./asn1.js"; +import { + CreateKeyCommand, + DescribeKeyCommand, + GetPublicKeyCommand, + KMSClient, + KMSInvalidStateException, + type KeyMetadata, + ListKeysCommand, + ListResourceTagsCommand, + NotFoundException, + OriginType, + ScheduleKeyDeletionCommand, +} from "@aws-sdk/client-kms"; +import { + type AccountDeletion, + type AccountGeneration, + type AccountMetadata, + type AccountRetrieval, + type MutableKeyStore, + PublicKey, +} from "@planetarium/account"; + +export interface AwsKmsKeyStoreOptions { + listWindow: number; + scopingTags: Record; +} + +export class AwsKmsKeyStore + implements MutableKeyStore +{ + readonly #client: KMSClient; + readonly #options: AwsKmsKeyStoreOptions; + + constructor(client: KMSClient, options: Partial = {}) { + this.#client = client; + this.#options = { + listWindow: options.listWindow ?? 100, + scopingTags: options.scopingTags ?? {}, + }; + } + + #isValidKey( + metadata: KeyMetadata, + ): metadata is KeyMetadata & { KeyId: string } { + return ( + metadata.KeyId != null && + metadata.Enabled === true && + metadata.DeletionDate == null && + metadata.KeySpec === "ECC_SECG_P256K1" && + metadata.KeyUsage === "SIGN_VERIFY" + ); + } + + #mapMetadata(metadata: KeyMetadata): AwsKmsMetadata { + return { + customKeyStoreId: metadata.CustomKeyStoreId, + description: metadata.Description ?? "", + multiRegion: metadata.MultiRegion ?? false, + origin: metadata.Origin ?? OriginType.AWS_KMS, + }; + } + + async #hasTags( + keyId: AwsKmsKeyId, + tags: Record, + ): Promise { + let marker: string | undefined; + const remainTags = new Map(Object.entries(tags)); + do { + const cmd = new ListResourceTagsCommand({ KeyId: keyId, Marker: marker }); + const result = await this.#client.send(cmd); + marker = result.NextMarker; + if (result.Tags == null) continue; + for (const { TagKey, TagValue } of result.Tags) { + if (TagKey == null || TagValue == null) continue; + if (remainTags.has(TagKey)) { + if (remainTags.get(TagKey) === TagValue) { + remainTags.delete(TagKey); + if (remainTags.size < 1) return true; + } else return false; + } + } + } while (marker != null); + return remainTags.size < 1; + } + + async *list(): AsyncIterable> { + let nextMarker: string | undefined; + const hasScopingTags = Object.keys(this.#options).length > 0; + do { + const listCmd = new ListKeysCommand({ + Marker: nextMarker, + Limit: this.#options.listWindow, + }); + const resp = await this.#client.send(listCmd); + const keys = resp.Keys ?? []; + for (let i = 0; i < keys.length; i += 5) { + const promises = keys + .slice(i, i + 5) + .map(({ KeyId }) => new DescribeKeyCommand({ KeyId })) + .map((cmd) => this.#client.send(cmd)); + const responses = await Promise.all(promises); + for (const resp of responses) { + const metadata = resp.KeyMetadata; + if ( + metadata == null || + !this.#isValidKey(metadata) || + (hasScopingTags && + !this.#hasTags(metadata.KeyId, this.#options.scopingTags)) + ) { + continue; + } + yield { + keyId: metadata.KeyId, + metadata: this.#mapMetadata(metadata), + createdAt: metadata.CreationDate, + }; + } + } + nextMarker = resp.NextMarker; + } while (nextMarker != null); + } + + async get( + keyId: AwsKmsKeyId, + ): Promise> { + const descCmd = new DescribeKeyCommand({ KeyId: keyId }); + const pubKeyCmd = new GetPublicKeyCommand({ KeyId: keyId }); + const descPromise = this.#client.send(descCmd); + const pubKeyPromise = this.#client.send(pubKeyCmd); + let descResp; + let pubKeyResp; + try { + [descResp, pubKeyResp] = await Promise.all([descPromise, pubKeyPromise]); + } catch (e) { + if ( + e instanceof NotFoundException || + e instanceof KMSInvalidStateException + ) { + return { result: "keyNotFound", keyId }; + } + return { result: "error", keyId, message: `${e}` }; + } + if ( + descResp.KeyMetadata == null || + !this.#isValidKey(descResp.KeyMetadata) || + pubKeyResp.PublicKey == null + ) { + return { result: "keyNotFound", keyId }; + } + const publicKeyBytes: Uint8Array = parseSubjectPublicKeyInfo( + pubKeyResp.PublicKey, + ); + const publicKey = PublicKey.fromBytes(publicKeyBytes, "uncompressed"); + return { + result: "success", + keyId, + account: new AwsKmsAccount(keyId, publicKey, this.#client), + metadata: this.#mapMetadata(descResp.KeyMetadata), + createdAt: descResp.KeyMetadata.CreationDate, + }; + } + + async generate( + metadata?: AwsKmsMetadata, + ): Promise> { + const cmd = new CreateKeyCommand({ + KeySpec: "ECC_SECG_P256K1", + KeyUsage: "SIGN_VERIFY", + CustomKeyStoreId: metadata?.customKeyStoreId, + Description: metadata?.description, + MultiRegion: metadata?.multiRegion, + Origin: metadata?.origin, + Tags: Object.entries(this.#options.scopingTags).map( + ([TagKey, TagValue]) => ({ TagKey, TagValue }), + ), + }); + let response; + try { + response = await this.#client.send(cmd); + } catch (e) { + return { result: "error", message: `${e}` }; + } + const keyId = response.KeyMetadata?.KeyId; + if (keyId == null) { + return { result: "error", message: "failed to determine keyId" }; + } + const pubKeyCmd = new GetPublicKeyCommand({ KeyId: keyId }); + let pubKeyResp; + try { + pubKeyResp = await this.#client.send(pubKeyCmd); + } catch (e) { + return { result: "error", message: `${e}` }; + } + if (pubKeyResp.PublicKey == null) { + return { result: "error", message: "failed to get public key" }; + } + const publicKeyBytes: Uint8Array = parseSubjectPublicKeyInfo( + pubKeyResp.PublicKey, + ); + const publicKey = PublicKey.fromBytes(publicKeyBytes, "uncompressed"); + const account = new AwsKmsAccount(keyId, publicKey, this.#client); + return { result: "success", keyId, account }; + } + + async delete(keyId: AwsKmsKeyId): Promise> { + const cmd = new ScheduleKeyDeletionCommand({ KeyId: keyId }); + try { + await this.#client.send(cmd); + } catch (e) { + if ( + e instanceof NotFoundException || + e instanceof KMSInvalidStateException + ) { + return { result: "keyNotFound", keyId }; + } + return { result: "error", message: `${e}` }; + } + return { result: "success", keyId }; + } +} diff --git a/@planetarium/account-aws-kms/src/AwsKmsMetadata.ts b/@planetarium/account-aws-kms/src/AwsKmsMetadata.ts new file mode 100644 index 00000000000..271498278a7 --- /dev/null +++ b/@planetarium/account-aws-kms/src/AwsKmsMetadata.ts @@ -0,0 +1,10 @@ +import { OriginType } from "@aws-sdk/client-kms"; + +export interface AwsKmsMetadata { + customKeyStoreId?: string; + description: string; + multiRegion: boolean; + origin: OriginType | string; +} + +export default AwsKmsMetadata; diff --git a/@planetarium/account-aws-kms/src/asn1.ts b/@planetarium/account-aws-kms/src/asn1.ts new file mode 100644 index 00000000000..b6783eabd08 --- /dev/null +++ b/@planetarium/account-aws-kms/src/asn1.ts @@ -0,0 +1,39 @@ +import { + Any, + BitString, + ObjectIdentifier, + Sequence, + verifySchema, +} from "asn1js"; + +// https://www.rfc-editor.org/rfc/rfc5280#section-4.1 +const SubjectPublicKeyInfo = new Sequence({ + name: "subjectPublicKeyInfo", + value: [ + new Sequence({ + name: "algorithm", + value: [ + new ObjectIdentifier({ + name: "algorithm", + }), + new Any({ + name: "parameters", + optional: true, + }), + ], + }), + new BitString({ + name: "subjectPublicKey", + }), + ], +}); + +export function parseSubjectPublicKeyInfo(buf: Uint8Array) { + const { result, verified } = verifySchema(buf, SubjectPublicKeyInfo); + if (!verified) { + throw new RangeError("Failed to verify SubjectPublicKeyInfo data"); + } + const bitstring: BitString = (result as typeof SubjectPublicKeyInfo) + .valueBlock.value[1] as BitString; + return bitstring.valueBlock.valueHexView; +} diff --git a/@planetarium/account-aws-kms/src/index.ts b/@planetarium/account-aws-kms/src/index.ts new file mode 100644 index 00000000000..be91ee5c04b --- /dev/null +++ b/@planetarium/account-aws-kms/src/index.ts @@ -0,0 +1,5 @@ +export { AwsKmsKeyStore } from "./AwsKmsKeyStore.js"; +export { type AwsKmsKeyId } from "./AwsKmsKeyId.js"; +export { AwsKmsAccount } from "./AwsKmsAccount.js"; +export { type AwsKmsMetadata } from "./AwsKmsMetadata.js"; +export { KMSClient } from "@aws-sdk/client-kms"; diff --git a/@planetarium/account-aws-kms/test/AwsKmsKeyStore.test.ts b/@planetarium/account-aws-kms/test/AwsKmsKeyStore.test.ts new file mode 100644 index 00000000000..ea4eda2c5a3 --- /dev/null +++ b/@planetarium/account-aws-kms/test/AwsKmsKeyStore.test.ts @@ -0,0 +1,239 @@ +import AwsKmsAccount from "../src/AwsKmsAccount"; +import { AwsKmsKeyId } from "../src/AwsKmsKeyId"; +import { AwsKmsKeyStore } from "../src/AwsKmsKeyStore"; +import { parseSubjectPublicKeyInfo } from "../src/asn1"; +import { + CreateKeyCommand, + DescribeKeyCommand, + GetPublicKeyCommand, + KMSClient, + type KeyMetadata, + ListKeysCommand, + OriginType, + ScheduleKeyDeletionCommand, +} from "@aws-sdk/client-kms"; +import { PublicKey, Signature } from "@planetarium/account"; +import { AggregateError } from "es-aggregate-error"; +import { randomUUID } from "node:crypto"; +import { hostname, userInfo } from "node:os"; +import { inspect } from "node:util"; +import { afterEach, describe, expect, test } from "vitest"; + +const envsConfigured = + process.env.AWS_ACCESS_KEY_ID && + process.env.AWS_SECRET_ACCESS_KEY && + process.env.AWS_REGION; + +interface FixtureKey { + keyId: AwsKmsKeyId; + publicKey: PublicKey; + metadata: KeyMetadata; + clean(): Promise; +} + +describe.runIf(envsConfigured)("AwsKmsKeyStore", async () => { + const client = new KMSClient({}); + console.info("The below tests are run on the following AWS session:"); + console.table({ + AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID, + AWS_REGION: process.env.AWS_REGION, + }); + + const listCmd = new ListKeysCommand({ Limit: 1000 }); + const keysList = await client.send(listCmd); + const listWindow = Math.max((keysList.Keys ?? []).length / 2, 2); + const testSessionId = randomUUID(); + const store = new AwsKmsKeyStore(client, { + listWindow, + scopingTags: { TestSessionId: testSessionId }, + }); + const keyDescription = `Auto-generated by @planetarium/account-aws-kms unit tests; ran inside ${ + userInfo().username + }@${hostname()}`; + + async function createFixtureKey(): Promise { + const cmd = new CreateKeyCommand({ + KeySpec: "ECC_SECG_P256K1", + KeyUsage: "SIGN_VERIFY", + Description: keyDescription, + MultiRegion: false, + Tags: [{ TagKey: "TestSessionId", TagValue: testSessionId }], + }); + const response = await client.send(cmd); + if (response.KeyMetadata == null) throw new Error("Failed to generate key"); + const keyId = response.KeyMetadata.KeyId; + if (keyId == null) throw new Error("Failed to generate key"); + + let alreadyDeleted = false; + async function clean(): Promise { + if (alreadyDeleted) return; + const delCmd = new ScheduleKeyDeletionCommand({ + KeyId: keyId, + PendingWindowInDays: 7, + }); + try { + await client.send(delCmd); + } catch (_) {} + alreadyDeleted = true; + } + + try { + const pubKeyCmd = new GetPublicKeyCommand({ KeyId: keyId }); + const pubKeyResp = await client.send(pubKeyCmd); + if (pubKeyResp.PublicKey == null) { + throw new Error("Failed to get public key"); + } + const publicKeyBytes: Uint8Array = parseSubjectPublicKeyInfo( + pubKeyResp.PublicKey, + ); + const publicKey = PublicKey.fromBytes(publicKeyBytes, "uncompressed"); + return { keyId, publicKey, metadata: response.KeyMetadata, clean }; + } catch (e) { + await clean(); + throw e; + } + } + + async function createFixtureKeys( + number: number, + ): Promise<[Record, () => Promise]> { + const promises: Promise[] = []; + for (let i = 0; i < number; i++) { + promises.push(createFixtureKey()); + } + const keys: FixtureKey[] = []; + const errors: Error[] = []; + for (const promise of promises) { + try { + keys.push(await promise); + } catch (e) { + errors.push(e); + } + } + + async function cleanAll(): Promise { + await Promise.all(keys.map((triple) => triple.clean())); + } + + if (errors.length > 0) { + await cleanAll(); + throw new AggregateError(errors); + } + + return [ + Object.fromEntries( + keys.map((triple) => [triple.keyId, triple.publicKey]), + ), + cleanAll, + ]; + } + + test("list", async () => { + let i = 0; + for await (const _ of store.list()) i++; + expect(i).toBeFalsy(); + + const before = new Date(); + const [expectedKeys, cleanFixtures] = await createFixtureKeys(5); + const after = new Date(); + afterEach(cleanFixtures); + + const fetched: Set = new Set(); + for await (const key of store.list()) { + expect(key.createdAt).toBeDefined(); + if (key.createdAt == null) throw new Error(); // type guard + expect(+key.createdAt).toBeGreaterThanOrEqual(+before - 1000); + expect(+key.createdAt).toBeLessThanOrEqual(+after + 1000); + fetched.add(key.keyId); + } + + expect(fetched).toStrictEqual(new Set(Object.keys(expectedKeys))); + }); + + test("get", async () => { + const result = await store.get("00000000-0000-0000-0000-000000000000"); + expect(result).toStrictEqual({ + result: "keyNotFound", + keyId: "00000000-0000-0000-0000-000000000000", + }); + + const { keyId, publicKey, metadata, clean } = await createFixtureKey(); + afterEach(clean); + const account = new AwsKmsAccount(keyId, publicKey, client); + + const result2 = await store.get(keyId); + expect(result2).toStrictEqual({ + result: "success", + keyId, + account, + metadata: { + customKeyStoreId: metadata.CustomKeyStoreId, + description: metadata.Description ?? "", + multiRegion: metadata.MultiRegion ?? false, + origin: metadata.Origin ?? OriginType.AWS_KMS, + }, + createdAt: metadata.CreationDate, + }); + expect(account.publicKey.toHex("compressed")).toStrictEqual( + publicKey.toHex("compressed"), + ); + + const msg = new Uint8Array([0x01, 0x02, 0x03]); + const sig = await account.sign(msg); + const verified = await publicKey.verify(msg, sig); + if (!verified) { + console.log({ msg, sig, publicKey: publicKey.toHex("compressed") }); + } + expect(verified).toStrictEqual(true); + }); + + test("generate", async () => { + const result = await store.generate({ + description: keyDescription, + multiRegion: false, + origin: "AWS_KMS", + }); + + if (result.result === "success") { + let alreadyDeleted = false; + afterEach(async () => { + if (alreadyDeleted) return; + const delCmd = new ScheduleKeyDeletionCommand({ + KeyId: result.keyId, + PendingWindowInDays: 7, + }); + await client.send(delCmd); + alreadyDeleted = true; + }); + } else throw new Error(`failed to generate: ${inspect(result)}`); // type guard + + expect(result.result).toBe("success"); + const descCmd = new DescribeKeyCommand({ KeyId: result.keyId }); + const resp = await client.send(descCmd); + expect(resp.KeyMetadata).toBeDefined(); + expect(resp.KeyMetadata?.KeyId).toMatch( + new RegExp(`^${result.keyId}$`, "i"), + ); + }); + + test("delete", async () => { + const result = await store.delete("00000000-0000-0000-0000-000000000000"); + expect(result).toStrictEqual({ + result: "keyNotFound", + keyId: "00000000-0000-0000-0000-000000000000", + }); + + const { keyId, clean } = await createFixtureKey(); + afterEach(clean); + + const result2 = await store.delete(keyId); + expect(result2).toStrictEqual({ result: "success", keyId }); + + const cmd = new DescribeKeyCommand({ KeyId: keyId }); + const resp = await client.send(cmd); + expect(resp.KeyMetadata?.Enabled).toBeFalsy(); + + const result3 = await store.delete(keyId); + expect(result3).toStrictEqual({ result: "keyNotFound", keyId }); + }); +}); diff --git a/@planetarium/account-aws-kms/test/asn1.test.ts b/@planetarium/account-aws-kms/test/asn1.test.ts new file mode 100644 index 00000000000..7d6466f48a4 --- /dev/null +++ b/@planetarium/account-aws-kms/test/asn1.test.ts @@ -0,0 +1,30 @@ +import { parseSubjectPublicKeyInfo } from "../src/asn1"; +import { expect, test } from "vitest"; + +test("parseSubjectPublicKeyInfo()", () => { + const input = new Uint8Array([ + 0x30, 0x56, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, + 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x0a, 0x03, 0x42, 0x00, 0x04, + 0x25, 0xfd, 0xe7, 0x9e, 0x8c, 0x8b, 0x6a, 0x91, 0xf3, 0xd2, 0x3d, 0x99, + 0xe8, 0xe6, 0x8e, 0xed, 0xc4, 0x32, 0x33, 0x0b, 0x5a, 0x99, 0x54, 0x14, + 0x30, 0xd0, 0x62, 0xaf, 0x26, 0xe5, 0xb4, 0x51, 0x57, 0xfe, 0x64, 0x2b, + 0xb5, 0x3d, 0xcd, 0x0d, 0x17, 0x92, 0x50, 0x48, 0x86, 0xc5, 0xfa, 0x2c, + 0x29, 0xcd, 0xa3, 0x6b, 0xbd, 0x8c, 0x88, 0xea, 0xd4, 0x34, 0x5a, 0x54, + 0x27, 0x44, 0x8d, 0xd2, + ]); + const expected = new Uint8Array([ + 0x04, 0x25, 0xfd, 0xe7, 0x9e, 0x8c, 0x8b, 0x6a, 0x91, 0xf3, 0xd2, 0x3d, + 0x99, 0xe8, 0xe6, 0x8e, 0xed, 0xc4, 0x32, 0x33, 0x0b, 0x5a, 0x99, 0x54, + 0x14, 0x30, 0xd0, 0x62, 0xaf, 0x26, 0xe5, 0xb4, 0x51, 0x57, 0xfe, 0x64, + 0x2b, 0xb5, 0x3d, 0xcd, 0x0d, 0x17, 0x92, 0x50, 0x48, 0x86, 0xc5, 0xfa, + 0x2c, 0x29, 0xcd, 0xa3, 0x6b, 0xbd, 0x8c, 0x88, 0xea, 0xd4, 0x34, 0x5a, + 0x54, 0x27, 0x44, 0x8d, 0xd2, + ]); + expect(parseSubjectPublicKeyInfo(input)).toStrictEqual(expected); + + const invalid = new Uint8Array([ + 0x30, 0x56, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, + 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x0a, 0x03, 0x42, + ]); + expect(() => parseSubjectPublicKeyInfo(invalid)).toThrowError(RangeError); +}); diff --git a/@planetarium/account-aws-kms/tsconfig.json b/@planetarium/account-aws-kms/tsconfig.json new file mode 100644 index 00000000000..f65c394d5cb --- /dev/null +++ b/@planetarium/account-aws-kms/tsconfig.json @@ -0,0 +1,15 @@ +{ + "include": ["./src", "*.d.ts", "*.ts"], + "compilerOptions": { + "outDir": "dist", + "target": "ES2020", + "strict": true, + "noUnusedLocals": true, + "noImplicitReturns": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "nodenext", + "lib": ["ES2020"] + } +} diff --git a/@planetarium/account-aws-kms/vitest.config.ts b/@planetarium/account-aws-kms/vitest.config.ts new file mode 100644 index 00000000000..847eed1672d --- /dev/null +++ b/@planetarium/account-aws-kms/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + cache: false, + testTimeout: 30000, + }, +}); diff --git a/package.json b/package.json index 90d3ec67999..89a8639a8c4 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "private": true, "workspaces": [ "@planetarium/account", + "@planetarium/account-aws-kms", "@planetarium/account-web3-secret-storage", "@planetarium/tx", "Libplanet.Tools" diff --git a/yarn.lock b/yarn.lock index a23c3191c25..f15fa67b430 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,841 @@ __metadata: languageName: node linkType: hard +"@aws-crypto/ie11-detection@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/ie11-detection@npm:3.0.0" + dependencies: + tslib: ^1.11.1 + checksum: 299b2ddd46eddac1f2d54d91386ceb37af81aef8a800669281c73d634ed17fd855dcfb8b3157f2879344b93a2666a6d602550eb84b71e4d7868100ad6da8f803 + languageName: node + linkType: hard + +"@aws-crypto/sha256-browser@npm:3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/sha256-browser@npm:3.0.0" + dependencies: + "@aws-crypto/ie11-detection": ^3.0.0 + "@aws-crypto/sha256-js": ^3.0.0 + "@aws-crypto/supports-web-crypto": ^3.0.0 + "@aws-crypto/util": ^3.0.0 + "@aws-sdk/types": ^3.222.0 + "@aws-sdk/util-locate-window": ^3.0.0 + "@aws-sdk/util-utf8-browser": ^3.0.0 + tslib: ^1.11.1 + checksum: ca89456bf508db2e08060a7f656460db97ac9a15b11e39d6fa7665e2b156508a1758695bff8e82d0a00178d6ac5c36f35eb4bcfac2e48621265224ca14a19bd2 + languageName: node + linkType: hard + +"@aws-crypto/sha256-js@npm:3.0.0, @aws-crypto/sha256-js@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/sha256-js@npm:3.0.0" + dependencies: + "@aws-crypto/util": ^3.0.0 + "@aws-sdk/types": ^3.222.0 + tslib: ^1.11.1 + checksum: 644ded32ea310237811afae873d3c7320739cb6f6cc39dced9c94801379e68e5ee2cca0c34f0384793fa9e750a7e0a5e2468f95754bd08e6fd72ab833c8fe23c + languageName: node + linkType: hard + +"@aws-crypto/supports-web-crypto@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/supports-web-crypto@npm:3.0.0" + dependencies: + tslib: ^1.11.1 + checksum: 35479a1558db9e9a521df6877a99f95670e972c602f2a0349303477e5d638a5baf569fb037c853710e382086e6fd77e8ed58d3fb9b49f6e1186a9d26ce7be006 + languageName: node + linkType: hard + +"@aws-crypto/util@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/util@npm:3.0.0" + dependencies: + "@aws-sdk/types": ^3.222.0 + "@aws-sdk/util-utf8-browser": ^3.0.0 + tslib: ^1.11.1 + checksum: d29d5545048721aae3d60b236708535059733019a105f8a64b4e4a8eab7cf8dde1546dc56bff7de20d36140a4d1f0f4693e639c5732a7059273a7b1e56354776 + languageName: node + linkType: hard + +"@aws-sdk/abort-controller@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/abort-controller@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: daeef791d8d9fba002a4f679d65dd20fc55c3c37c1f85a27f31b5f7f39e40044f1b7c7a53e72899204f288d74694a593444b11044ccb337ebedd71b9a0907688 + languageName: node + linkType: hard + +"@aws-sdk/client-kms@npm:^3.272.0": + version: 3.290.0 + resolution: "@aws-sdk/client-kms@npm:3.290.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.290.0 + "@aws-sdk/config-resolver": 3.290.0 + "@aws-sdk/credential-provider-node": 3.290.0 + "@aws-sdk/fetch-http-handler": 3.290.0 + "@aws-sdk/hash-node": 3.290.0 + "@aws-sdk/invalid-dependency": 3.290.0 + "@aws-sdk/middleware-content-length": 3.290.0 + "@aws-sdk/middleware-endpoint": 3.290.0 + "@aws-sdk/middleware-host-header": 3.290.0 + "@aws-sdk/middleware-logger": 3.290.0 + "@aws-sdk/middleware-recursion-detection": 3.290.0 + "@aws-sdk/middleware-retry": 3.290.0 + "@aws-sdk/middleware-serde": 3.290.0 + "@aws-sdk/middleware-signing": 3.290.0 + "@aws-sdk/middleware-stack": 3.290.0 + "@aws-sdk/middleware-user-agent": 3.290.0 + "@aws-sdk/node-config-provider": 3.290.0 + "@aws-sdk/node-http-handler": 3.290.0 + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/smithy-client": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/url-parser": 3.290.0 + "@aws-sdk/util-base64": 3.208.0 + "@aws-sdk/util-body-length-browser": 3.188.0 + "@aws-sdk/util-body-length-node": 3.208.0 + "@aws-sdk/util-defaults-mode-browser": 3.290.0 + "@aws-sdk/util-defaults-mode-node": 3.290.0 + "@aws-sdk/util-endpoints": 3.290.0 + "@aws-sdk/util-retry": 3.290.0 + "@aws-sdk/util-user-agent-browser": 3.290.0 + "@aws-sdk/util-user-agent-node": 3.290.0 + "@aws-sdk/util-utf8": 3.254.0 + tslib: ^2.3.1 + checksum: 4b0ac8fac04515d98ed29f5a20800ce3b2337a9f6fb0d1ffc3841c984933e11b775780d2380a338667d722580985f3bd1303854cad6c744519061f5ca97c75ac + languageName: node + linkType: hard + +"@aws-sdk/client-sso-oidc@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.290.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/config-resolver": 3.290.0 + "@aws-sdk/fetch-http-handler": 3.290.0 + "@aws-sdk/hash-node": 3.290.0 + "@aws-sdk/invalid-dependency": 3.290.0 + "@aws-sdk/middleware-content-length": 3.290.0 + "@aws-sdk/middleware-endpoint": 3.290.0 + "@aws-sdk/middleware-host-header": 3.290.0 + "@aws-sdk/middleware-logger": 3.290.0 + "@aws-sdk/middleware-recursion-detection": 3.290.0 + "@aws-sdk/middleware-retry": 3.290.0 + "@aws-sdk/middleware-serde": 3.290.0 + "@aws-sdk/middleware-stack": 3.290.0 + "@aws-sdk/middleware-user-agent": 3.290.0 + "@aws-sdk/node-config-provider": 3.290.0 + "@aws-sdk/node-http-handler": 3.290.0 + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/smithy-client": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/url-parser": 3.290.0 + "@aws-sdk/util-base64": 3.208.0 + "@aws-sdk/util-body-length-browser": 3.188.0 + "@aws-sdk/util-body-length-node": 3.208.0 + "@aws-sdk/util-defaults-mode-browser": 3.290.0 + "@aws-sdk/util-defaults-mode-node": 3.290.0 + "@aws-sdk/util-endpoints": 3.290.0 + "@aws-sdk/util-retry": 3.290.0 + "@aws-sdk/util-user-agent-browser": 3.290.0 + "@aws-sdk/util-user-agent-node": 3.290.0 + "@aws-sdk/util-utf8": 3.254.0 + tslib: ^2.3.1 + checksum: f6b3be7710101afef41457faf9c0a4666bdc2d93a8c1803921104d91bd33f139cea9809ee4990ab4333c16ac68956babcc9c507f06ab46a9f88dbe9e9768acd2 + languageName: node + linkType: hard + +"@aws-sdk/client-sso@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/client-sso@npm:3.290.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/config-resolver": 3.290.0 + "@aws-sdk/fetch-http-handler": 3.290.0 + "@aws-sdk/hash-node": 3.290.0 + "@aws-sdk/invalid-dependency": 3.290.0 + "@aws-sdk/middleware-content-length": 3.290.0 + "@aws-sdk/middleware-endpoint": 3.290.0 + "@aws-sdk/middleware-host-header": 3.290.0 + "@aws-sdk/middleware-logger": 3.290.0 + "@aws-sdk/middleware-recursion-detection": 3.290.0 + "@aws-sdk/middleware-retry": 3.290.0 + "@aws-sdk/middleware-serde": 3.290.0 + "@aws-sdk/middleware-stack": 3.290.0 + "@aws-sdk/middleware-user-agent": 3.290.0 + "@aws-sdk/node-config-provider": 3.290.0 + "@aws-sdk/node-http-handler": 3.290.0 + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/smithy-client": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/url-parser": 3.290.0 + "@aws-sdk/util-base64": 3.208.0 + "@aws-sdk/util-body-length-browser": 3.188.0 + "@aws-sdk/util-body-length-node": 3.208.0 + "@aws-sdk/util-defaults-mode-browser": 3.290.0 + "@aws-sdk/util-defaults-mode-node": 3.290.0 + "@aws-sdk/util-endpoints": 3.290.0 + "@aws-sdk/util-retry": 3.290.0 + "@aws-sdk/util-user-agent-browser": 3.290.0 + "@aws-sdk/util-user-agent-node": 3.290.0 + "@aws-sdk/util-utf8": 3.254.0 + tslib: ^2.3.1 + checksum: 2ba1c70caba0680b61e6660043dc6c0b7dfde51b3d5eb114bf7a4f35f6c601b8d21fe6e65b07496206acefcc7c9bcd31cfe53bc625f9a7a336deac0db01ebd10 + languageName: node + linkType: hard + +"@aws-sdk/client-sts@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/client-sts@npm:3.290.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/config-resolver": 3.290.0 + "@aws-sdk/credential-provider-node": 3.290.0 + "@aws-sdk/fetch-http-handler": 3.290.0 + "@aws-sdk/hash-node": 3.290.0 + "@aws-sdk/invalid-dependency": 3.290.0 + "@aws-sdk/middleware-content-length": 3.290.0 + "@aws-sdk/middleware-endpoint": 3.290.0 + "@aws-sdk/middleware-host-header": 3.290.0 + "@aws-sdk/middleware-logger": 3.290.0 + "@aws-sdk/middleware-recursion-detection": 3.290.0 + "@aws-sdk/middleware-retry": 3.290.0 + "@aws-sdk/middleware-sdk-sts": 3.290.0 + "@aws-sdk/middleware-serde": 3.290.0 + "@aws-sdk/middleware-signing": 3.290.0 + "@aws-sdk/middleware-stack": 3.290.0 + "@aws-sdk/middleware-user-agent": 3.290.0 + "@aws-sdk/node-config-provider": 3.290.0 + "@aws-sdk/node-http-handler": 3.290.0 + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/smithy-client": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/url-parser": 3.290.0 + "@aws-sdk/util-base64": 3.208.0 + "@aws-sdk/util-body-length-browser": 3.188.0 + "@aws-sdk/util-body-length-node": 3.208.0 + "@aws-sdk/util-defaults-mode-browser": 3.290.0 + "@aws-sdk/util-defaults-mode-node": 3.290.0 + "@aws-sdk/util-endpoints": 3.290.0 + "@aws-sdk/util-retry": 3.290.0 + "@aws-sdk/util-user-agent-browser": 3.290.0 + "@aws-sdk/util-user-agent-node": 3.290.0 + "@aws-sdk/util-utf8": 3.254.0 + fast-xml-parser: 4.1.2 + tslib: ^2.3.1 + checksum: 24132b70e86d341567e7e18add2c145d009dcaad85e8fcd04a250068e68f530d64fb8e386c6289ae8b4dc5f12dbdd75e219f1349572d6a35bdf25483a82b7c75 + languageName: node + linkType: hard + +"@aws-sdk/config-resolver@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/config-resolver@npm:3.290.0" + dependencies: + "@aws-sdk/signature-v4": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/util-config-provider": 3.208.0 + "@aws-sdk/util-middleware": 3.290.0 + tslib: ^2.3.1 + checksum: 85745c1f465e2129142adf6b61451d8da1336354d05fa7e158e9200d4cd1dc07e33a8ec492d863483ff707817d8c6d9bc20938cbbf3fa17ce368239856120150 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-env@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.290.0" + dependencies: + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 6eb74f8b2d03551c377e66d01cb19e1dc97c955d4b6cea3d8c92aa3381a18deacbc9285f14530896706badd97f7a7051aa51b64798b141afc2cb67fbb1ec42b2 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-imds@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/credential-provider-imds@npm:3.290.0" + dependencies: + "@aws-sdk/node-config-provider": 3.290.0 + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/url-parser": 3.290.0 + tslib: ^2.3.1 + checksum: ae69c1d76be5f61be192d672d28764054e9171882f9619d2810805a20fbdc00992bf42932735427678a0cfc6a46642d2510c1da1e88e2ad8f7cb162813da7f15 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-ini@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.290.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.290.0 + "@aws-sdk/credential-provider-imds": 3.290.0 + "@aws-sdk/credential-provider-process": 3.290.0 + "@aws-sdk/credential-provider-sso": 3.290.0 + "@aws-sdk/credential-provider-web-identity": 3.290.0 + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/shared-ini-file-loader": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 14c265befb101ac74a03f54cd992aafcb10800ff65b1faa5a8390da65e9d0faf30a66144a0f7ce5c2b1e07b22cca63b73cd79d93a73018b45ebc17d077f098b3 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-node@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.290.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.290.0 + "@aws-sdk/credential-provider-imds": 3.290.0 + "@aws-sdk/credential-provider-ini": 3.290.0 + "@aws-sdk/credential-provider-process": 3.290.0 + "@aws-sdk/credential-provider-sso": 3.290.0 + "@aws-sdk/credential-provider-web-identity": 3.290.0 + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/shared-ini-file-loader": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: a7d75b15b4cb8f07a45ea098fcafe61dc418f3bccc32993c4af561ab486a2d586c98e596a298f0f2771787f8b2655b8297a33a72ece30e4dae5dd2e7fc7d92bf + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-process@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.290.0" + dependencies: + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/shared-ini-file-loader": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: d3ea167f39575afe4258bb1639bf414a6a416b08156fea0d7caa339ae62531efebcaceb63ccc2bc2f3ab4bf7559bf52039518aaa4fe5e6b304f08265813daf36 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-sso@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.290.0" + dependencies: + "@aws-sdk/client-sso": 3.290.0 + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/shared-ini-file-loader": 3.290.0 + "@aws-sdk/token-providers": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 16f3acb92d10c25ff320f96af5834e7a40742fc266209efa5c5e43758d2fb748b9fa9b0020c7b3004996092124f1c9b4a5351b44e1e20fd42182dd697b72b081 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-web-identity@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.290.0" + dependencies: + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 87018b48089d96031fc55976a62ead1846a84e54fe7743a1c20f4cc04ea492b095f4e7940d4a63604494b7b9303f869902c81c9b9c2447d0f180947b7c5ac46a + languageName: node + linkType: hard + +"@aws-sdk/fetch-http-handler@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/fetch-http-handler@npm:3.290.0" + dependencies: + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/querystring-builder": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/util-base64": 3.208.0 + tslib: ^2.3.1 + checksum: 39bda1ccf62b14c7cef5dabb2c9075c66e9bc0dc9e4dc17a094940e3161493c02b28264ac35bfcb47144dbe91a72b30ef9a1afc7c84b17d469dfe7cd8b5217d0 + languageName: node + linkType: hard + +"@aws-sdk/hash-node@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/hash-node@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + "@aws-sdk/util-buffer-from": 3.208.0 + "@aws-sdk/util-utf8": 3.254.0 + tslib: ^2.3.1 + checksum: 82992d110256434c5316e8f0e4e2ae043af775fdfdb90ccbba937238f553fe8ab800de8d3e271ac74613ce0701ad3930d9da5180aa9b377e7955609037301317 + languageName: node + linkType: hard + +"@aws-sdk/invalid-dependency@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/invalid-dependency@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: fb84227e3fea08fd8047c0c95a42b765e1e9e61b243a9f5c88ca9fa70e7ad00854e7cb4e5fe38b33a3bde23fc2f1b909888046839b3c363a8c5c11414a1d1c0b + languageName: node + linkType: hard + +"@aws-sdk/is-array-buffer@npm:3.201.0": + version: 3.201.0 + resolution: "@aws-sdk/is-array-buffer@npm:3.201.0" + dependencies: + tslib: ^2.3.1 + checksum: 295450b417a9ab0b734050afff6c53aaed8a33dccd3ede60bf67fdec21f675d14ab8edc24f4e1d12aa4e99f9ccaf794aaaaff270c296c1ee38f73ea7ba7f59ce + languageName: node + linkType: hard + +"@aws-sdk/middleware-content-length@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-content-length@npm:3.290.0" + dependencies: + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 1ceaf75c2789b5d604024004db0589940a8f97924fc8b88803939d89926d1a836cbfc32957848b15f2aa09b39f650b91e7d75c55a84b9db7576ca9b0b136a706 + languageName: node + linkType: hard + +"@aws-sdk/middleware-endpoint@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-endpoint@npm:3.290.0" + dependencies: + "@aws-sdk/middleware-serde": 3.290.0 + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/signature-v4": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/url-parser": 3.290.0 + "@aws-sdk/util-config-provider": 3.208.0 + "@aws-sdk/util-middleware": 3.290.0 + tslib: ^2.3.1 + checksum: 9aeff49ff05d132fd56688b6437ee0f476d4b6483e03ebcc21ec6c02bf053331aa02e14cd989c8a17dc6d72520a774c69ee1eeedbe924fc2f270f694954e4d54 + languageName: node + linkType: hard + +"@aws-sdk/middleware-host-header@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.290.0" + dependencies: + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: bac6745cd43d4271fe6009a79d1cc7a02a8f91a7744a800c73c4573ca345b0843b5b88f70674046059e7efcae7ae7e7a12a7b3535b03a574a58a5dd9e162bd4b + languageName: node + linkType: hard + +"@aws-sdk/middleware-logger@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-logger@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 04a94909ebb4e91d9ddd04348183b0dc87998735861d4c6ad953d6f4b71905172495a69ffaec4eea202a7cda72e5d433e59a3a49225bd83b8344eb348c98675d + languageName: node + linkType: hard + +"@aws-sdk/middleware-recursion-detection@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.290.0" + dependencies: + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 5dd9b05bc928ceabf75b410ed83e46a57c7fd0c98138116576b864bd1b5636a7fd23ffb149ce00f0f608049f846838caf43425170142443530d07070807e1c6b + languageName: node + linkType: hard + +"@aws-sdk/middleware-retry@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-retry@npm:3.290.0" + dependencies: + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/service-error-classification": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/util-middleware": 3.290.0 + "@aws-sdk/util-retry": 3.290.0 + tslib: ^2.3.1 + uuid: ^8.3.2 + checksum: b42573e28574b0ab17a9efd4791c70c86f40ee379a5dc4e805eeaec77e98e1a82b6c97334fa14b55c092b0c90b2e092b8612fc5e82dc0e2852881132512bd460 + languageName: node + linkType: hard + +"@aws-sdk/middleware-sdk-sts@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-sdk-sts@npm:3.290.0" + dependencies: + "@aws-sdk/middleware-signing": 3.290.0 + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/signature-v4": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: f02879416f6596e52efc2a83859f49d26e191eb979695249b4dd897daeae64c325c43417bcac07e2fde1f0495ec86c3899204e121bcfc32e77378e39fb61bb10 + languageName: node + linkType: hard + +"@aws-sdk/middleware-serde@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-serde@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: fc8a07c370bdef1235a4858256b0689aa5dd7f6f6afc0d73167a601dedbf1c32e752da9c5b2922774460b3b76951da63b80cac5e30fc7a37a44faf5ea631fce8 + languageName: node + linkType: hard + +"@aws-sdk/middleware-signing@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-signing@npm:3.290.0" + dependencies: + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/signature-v4": 3.290.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/util-middleware": 3.290.0 + tslib: ^2.3.1 + checksum: 32321d295753673a7e3d6624c82c1dc44088fb406eb90feb798bde29d36c3ef5daa49956c5af24ac25b9676d50f9955ed766c63713fa58b8128f2f51748c6621 + languageName: node + linkType: hard + +"@aws-sdk/middleware-stack@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-stack@npm:3.290.0" + dependencies: + tslib: ^2.3.1 + checksum: 43f28a69ce14bc96ab0585661af00fd0fa7bac979d245509afbe8e2f37111fc78de3e230762e105d0fe9b54b94a03a6a603ae7311fde1b1eb9903aaa87dea663 + languageName: node + linkType: hard + +"@aws-sdk/middleware-user-agent@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.290.0" + dependencies: + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 9d3d0f47643bf5d4aa90153fd1d9c1f8cfd42d581e9ccb5e31429940f770bf0bda445ac32cc67ae8e1c4dc3aaf301632421c8d84b977e99608aa279851d81af6 + languageName: node + linkType: hard + +"@aws-sdk/node-config-provider@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/node-config-provider@npm:3.290.0" + dependencies: + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/shared-ini-file-loader": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 5dec834dffb06f2273e7975168d58dd0fc82062b797f4aebf103e36b559fce5103938c0836436f82ba426e38316ac8d3fa8fbd95eb965f3a7f219482a5002c91 + languageName: node + linkType: hard + +"@aws-sdk/node-http-handler@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/node-http-handler@npm:3.290.0" + dependencies: + "@aws-sdk/abort-controller": 3.290.0 + "@aws-sdk/protocol-http": 3.290.0 + "@aws-sdk/querystring-builder": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 8d6a63e25448df92d087bad46838e7254e78c4656aab2186fb3a9f13fdc900d71174bcd1d6741310391530ec59b282886930db8c55be0a228afc08b3ebf78101 + languageName: node + linkType: hard + +"@aws-sdk/property-provider@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/property-provider@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: cd71bc54ad2765e447ca5c6fa5f9b78a6f4b686c90b4430759019ef17cd06ae95ded580dba4b4d8f74645d8bd9755230aaacaa7d74cd60179a2022194c985831 + languageName: node + linkType: hard + +"@aws-sdk/protocol-http@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/protocol-http@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 5e464bafa4d325b44c4eed2b4dad6df509027d4a87439c3fa482e324842ae2143412e3afbd28754cd83a5863c0a14431ebf8f646aa2655749a6cf6f09874dec9 + languageName: node + linkType: hard + +"@aws-sdk/querystring-builder@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/querystring-builder@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + "@aws-sdk/util-uri-escape": 3.201.0 + tslib: ^2.3.1 + checksum: 51dd582f2ffe9ae6b3535d5a12ec130b66e98c17ae8bb1ecd5c04dbe1199598735385202e68969c5bc348d6865980113fc43a1b09218b6e25afd879b824738a4 + languageName: node + linkType: hard + +"@aws-sdk/querystring-parser@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/querystring-parser@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: ff9a3fbff052847f017189341b0d0fba7e083f5c3c4f2f7b185812898f1a3db03fb1db89aead492dfaaad112ba3769f5d8abad8478f6ed79761dbbec91d4838d + languageName: node + linkType: hard + +"@aws-sdk/service-error-classification@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/service-error-classification@npm:3.290.0" + checksum: 41517633394321e967a58576ae8731f845bf66ad9d898975d628418a487f82abc01254c989222087c53d2ad0666fef7e44d981f5d0ab80ee08306ec5ec144c06 + languageName: node + linkType: hard + +"@aws-sdk/shared-ini-file-loader@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/shared-ini-file-loader@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: a2cbfa1cf0c615a61b22982e2da623f1a94e879991a4f6a705e6a4b0ad34ce2bf12f67a5d87cee7536b74c18d336351802e160efac9905b1ab716d1242c4b6c7 + languageName: node + linkType: hard + +"@aws-sdk/signature-v4@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/signature-v4@npm:3.290.0" + dependencies: + "@aws-sdk/is-array-buffer": 3.201.0 + "@aws-sdk/types": 3.290.0 + "@aws-sdk/util-hex-encoding": 3.201.0 + "@aws-sdk/util-middleware": 3.290.0 + "@aws-sdk/util-uri-escape": 3.201.0 + "@aws-sdk/util-utf8": 3.254.0 + tslib: ^2.3.1 + checksum: acd3ec4fd30d9c82514ec04b1f43c66bcb038e432c54438ab2b5f366e7945109c956242e32375f644257b98f63a1853f55583ea9d08ea098b3c02e0550ebf1e0 + languageName: node + linkType: hard + +"@aws-sdk/smithy-client@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/smithy-client@npm:3.290.0" + dependencies: + "@aws-sdk/middleware-stack": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 14ee3f829887943a763736b8a2a9873755e154f09cf74626056008af99ca999b5249088507674cc52aca8180e33829e7554f2d406c7b4fd6bb72371e520a9431 + languageName: node + linkType: hard + +"@aws-sdk/token-providers@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/token-providers@npm:3.290.0" + dependencies: + "@aws-sdk/client-sso-oidc": 3.290.0 + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/shared-ini-file-loader": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 0444e1d910fd86ff1eed31c165569c52367e2ea7cdef4b76e2ee2a407391f5c5240effdc4f29ded8266313f191902aa0105c49d989609072fbf0fcbcf42dd19a + languageName: node + linkType: hard + +"@aws-sdk/types@npm:3.290.0, @aws-sdk/types@npm:^3.222.0": + version: 3.290.0 + resolution: "@aws-sdk/types@npm:3.290.0" + dependencies: + tslib: ^2.3.1 + checksum: 41ffd36d0d0d0fc24e7eba0466118b222e58c552d34b20766255a7533f0a9fd453c53691128d5bfa8774962fd0a7b4e186f0e22614c7f0372d51f34bfa886713 + languageName: node + linkType: hard + +"@aws-sdk/url-parser@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/url-parser@npm:3.290.0" + dependencies: + "@aws-sdk/querystring-parser": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: dc5998405791c9413b25c3d32cee6493fa8fc344c06e94a55372474bc1541b72d4f2e30f20d29a2897df1850ee9d2915b6695205c2e76f3dff22a74dfb6b0032 + languageName: node + linkType: hard + +"@aws-sdk/util-base64@npm:3.208.0": + version: 3.208.0 + resolution: "@aws-sdk/util-base64@npm:3.208.0" + dependencies: + "@aws-sdk/util-buffer-from": 3.208.0 + tslib: ^2.3.1 + checksum: 2ccab3453a3a3636f3f1397441574b3adb984e1ba3865030393108327ed7304cf80c9b31d69691e6aba85cfe6a611a881bbb724e544324240763bb4e96630ed9 + languageName: node + linkType: hard + +"@aws-sdk/util-body-length-browser@npm:3.188.0": + version: 3.188.0 + resolution: "@aws-sdk/util-body-length-browser@npm:3.188.0" + dependencies: + tslib: ^2.3.1 + checksum: 1b08bd1e63ec843ee336f51d894c49bf3c4c2f96e50d1711a12f7d0c5b6f7a15b490e366fec55b63e77036002994bac12927b29de2eb9ac91e4f152b1af78e58 + languageName: node + linkType: hard + +"@aws-sdk/util-body-length-node@npm:3.208.0": + version: 3.208.0 + resolution: "@aws-sdk/util-body-length-node@npm:3.208.0" + dependencies: + tslib: ^2.3.1 + checksum: 986b42b358656dec4e75c231213331c4f01785f9ab17c8b87b6e268b6880818a96117f1785cef9786e6c0f7e2c1332c80e8388a43bfd83e8c7224ad059a72733 + languageName: node + linkType: hard + +"@aws-sdk/util-buffer-from@npm:3.208.0": + version: 3.208.0 + resolution: "@aws-sdk/util-buffer-from@npm:3.208.0" + dependencies: + "@aws-sdk/is-array-buffer": 3.201.0 + tslib: ^2.3.1 + checksum: 00bfa4d4494d3a1eb128e19104994d1aca8b3802e9aa218cecafb1ed3ff2ecf5c946485e06aa97ae312458842b0f31a6484dc945232f7cb0e357ba341cb2e53e + languageName: node + linkType: hard + +"@aws-sdk/util-config-provider@npm:3.208.0": + version: 3.208.0 + resolution: "@aws-sdk/util-config-provider@npm:3.208.0" + dependencies: + tslib: ^2.3.1 + checksum: 97b0414b120b4eb53001f3ab2135ee94937e47bd7bd0d0de7c6a7e00a282eaa78cd84be2bfd3e389340f0c0b2f7ba60da9a403f084721970ee55b779ecf7a451 + languageName: node + linkType: hard + +"@aws-sdk/util-defaults-mode-browser@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.290.0" + dependencies: + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/types": 3.290.0 + bowser: ^2.11.0 + tslib: ^2.3.1 + checksum: 503c5a053dde93795da1730db67143b4c3834606ec81e6498f3ddf6f71298911a8a952a2b5498e2ca9854eff681e46ab635e94f23a75192328c877be0b9b00dd + languageName: node + linkType: hard + +"@aws-sdk/util-defaults-mode-node@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/util-defaults-mode-node@npm:3.290.0" + dependencies: + "@aws-sdk/config-resolver": 3.290.0 + "@aws-sdk/credential-provider-imds": 3.290.0 + "@aws-sdk/node-config-provider": 3.290.0 + "@aws-sdk/property-provider": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: c322ca1db70519dab769fe1816b5e74ae7f4fedffb11b4fdaa6c1d8034a2c7bc613d257582bae4b2419718c9135c8b130316fc667f12f7194c204928e105407e + languageName: node + linkType: hard + +"@aws-sdk/util-endpoints@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/util-endpoints@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + checksum: 9a3a20de53e3372966e8430f8dbdd35946f656af87924e4b4c7ba3ab8674216f03f0ef0ba2f089082844d2195feef75cf8eaa206cdf901f2ac4be3d61d296b18 + languageName: node + linkType: hard + +"@aws-sdk/util-hex-encoding@npm:3.201.0": + version: 3.201.0 + resolution: "@aws-sdk/util-hex-encoding@npm:3.201.0" + dependencies: + tslib: ^2.3.1 + checksum: a27f3365dfb1e6ece79ea34fd6e2c4540eb0084536d7300ff0ff42a7334ddf07f21958c6cfd0bbeb71361ee408e16deae2c82b7c7378b048b8e81a52c75f190a + languageName: node + linkType: hard + +"@aws-sdk/util-locate-window@npm:^3.0.0": + version: 3.208.0 + resolution: "@aws-sdk/util-locate-window@npm:3.208.0" + dependencies: + tslib: ^2.3.1 + checksum: 7518c110c4fa27c5e1d2d173647f1c58fc6ea244d25733c08ac441d3a2650b050ce06cecbe56b80a9997d514c9f7515b3c529c84c1e04b29aa0265d53af23c52 + languageName: node + linkType: hard + +"@aws-sdk/util-middleware@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/util-middleware@npm:3.290.0" + dependencies: + tslib: ^2.3.1 + checksum: ed7c1b7b24c565d0614af341edaa0a3418e27411a1735c6efcc83a191e90baa2d01009779551bd66a55030701ba112cc8b4f9684821d492df708cb3670e8799c + languageName: node + linkType: hard + +"@aws-sdk/util-retry@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/util-retry@npm:3.290.0" + dependencies: + "@aws-sdk/service-error-classification": 3.290.0 + tslib: ^2.3.1 + checksum: 4da6b9d640e38656710a2221bbe0e81b3aae23cf876f90e12d7dccc880c6243b30177e6668bf107463152a0603991df7ad39f2aa7acdfc4bf6831a1ccba472cb + languageName: node + linkType: hard + +"@aws-sdk/util-uri-escape@npm:3.201.0": + version: 3.201.0 + resolution: "@aws-sdk/util-uri-escape@npm:3.201.0" + dependencies: + tslib: ^2.3.1 + checksum: 8bd751459eaab75a9b61801f3484cfa5c4e0133381ace6ec901cb9b92b1fee99beb4ef9c0f87ade59425a882ed3a280255d9b2fd8da6a6286e49efb9af8f0d55 + languageName: node + linkType: hard + +"@aws-sdk/util-user-agent-browser@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.290.0" + dependencies: + "@aws-sdk/types": 3.290.0 + bowser: ^2.11.0 + tslib: ^2.3.1 + checksum: c4fd6d9ca32679696cd2855d91a3443fdba6f26ca2a572cfc6232692c0c13be21af5cf1c03e7ad252dd7e057f322316ff3fc6a6d4aa799a4258884eaa62dfcaa + languageName: node + linkType: hard + +"@aws-sdk/util-user-agent-node@npm:3.290.0": + version: 3.290.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.290.0" + dependencies: + "@aws-sdk/node-config-provider": 3.290.0 + "@aws-sdk/types": 3.290.0 + tslib: ^2.3.1 + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + checksum: 486a5a7cbfd30e2bf0ce655b7a71ce5c4a836d6dccbaffc6574277fb2c43830b2c3c283e29f0b29994463dc1421320a647ad03308868b615c9a22fa8ec113789 + languageName: node + linkType: hard + +"@aws-sdk/util-utf8-browser@npm:^3.0.0": + version: 3.259.0 + resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" + dependencies: + tslib: ^2.3.1 + checksum: b6a1e580da1c9b62c749814182a7649a748ca4253edb4063aa521df97d25b76eae3359eb1680b86f71aac668e05cc05c514379bca39ebf4ba998ae4348412da8 + languageName: node + linkType: hard + +"@aws-sdk/util-utf8@npm:3.254.0": + version: 3.254.0 + resolution: "@aws-sdk/util-utf8@npm:3.254.0" + dependencies: + "@aws-sdk/util-buffer-from": 3.208.0 + tslib: ^2.3.1 + checksum: e5dfe7565f2de32245a544d1d715d803025bc5522538c0206fa61377f747804d95fc2e5e25976144bb63a6857e360b4286d101e730ab5d39866c60383a47e7d5 + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.0.0": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" @@ -474,6 +1309,24 @@ __metadata: languageName: node linkType: hard +"@planetarium/account-aws-kms@workspace:@planetarium/account-aws-kms": + version: 0.0.0-use.local + resolution: "@planetarium/account-aws-kms@workspace:@planetarium/account-aws-kms" + dependencies: + "@aws-sdk/client-kms": ^3.272.0 + "@noble/secp256k1": ^1.7.1 + "@planetarium/account": "workspace:^" + "@types/node": ^18.13.0 + "@vitest/coverage-c8": ^0.29.3 + "@vitest/ui": ^0.29.3 + asn1js: ^3.0.5 + es-aggregate-error: ^1.0.9 + nanobundle: ^1.5.0 + vite: ^4.1.1 + vitest: ^0.29.3 + languageName: unknown + linkType: soft + "@planetarium/account-web3-secret-storage@workspace:@planetarium/account-web3-secret-storage": version: 0.0.0-use.local resolution: "@planetarium/account-web3-secret-storage@workspace:@planetarium/account-web3-secret-storage" @@ -664,6 +1517,19 @@ __metadata: languageName: node linkType: hard +"@vitest/coverage-c8@npm:^0.29.3": + version: 0.29.3 + resolution: "@vitest/coverage-c8@npm:0.29.3" + dependencies: + c8: ^7.13.0 + picocolors: ^1.0.0 + std-env: ^3.3.1 + peerDependencies: + vitest: ">=0.29.0 <1" + checksum: 6b8a6aa088318a93c0124d45f5c6fea43ae36d0c435a26d083cb38d505fea05d35faac6a695b3c6516cf61ef33f690d5f572bb90d8f71c701c28e863c1476a2b + languageName: node + linkType: hard + "@vitest/expect@npm:0.29.2": version: 0.29.2 resolution: "@vitest/expect@npm:0.29.2" @@ -675,6 +1541,17 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:0.29.3": + version: 0.29.3 + resolution: "@vitest/expect@npm:0.29.3" + dependencies: + "@vitest/spy": 0.29.3 + "@vitest/utils": 0.29.3 + chai: ^4.3.7 + checksum: d4d42e052cb9d8f60f69373cddd2f366e768bff7a0541fe4036eddf87dd1f50be3459a1901053f9ff91e2d90594be34b780be5a349ba2c06a6376d2788c34f3c + languageName: node + linkType: hard + "@vitest/runner@npm:0.29.2": version: 0.29.2 resolution: "@vitest/runner@npm:0.29.2" @@ -686,6 +1563,17 @@ __metadata: languageName: node linkType: hard +"@vitest/runner@npm:0.29.3": + version: 0.29.3 + resolution: "@vitest/runner@npm:0.29.3" + dependencies: + "@vitest/utils": 0.29.3 + p-limit: ^4.0.0 + pathe: ^1.1.0 + checksum: b7b84c18024cc9866e156c3637dad8d8a070a632d4aaa0c93d4635ba6f1fd4f354473b7c07ed10499e0ed1aa15d22fa13eff82656cd37034d9214b237d3d5f5b + languageName: node + linkType: hard + "@vitest/spy@npm:0.29.2": version: 0.29.2 resolution: "@vitest/spy@npm:0.29.2" @@ -695,6 +1583,15 @@ __metadata: languageName: node linkType: hard +"@vitest/spy@npm:0.29.3": + version: 0.29.3 + resolution: "@vitest/spy@npm:0.29.3" + dependencies: + tinyspy: ^1.0.2 + checksum: 136bddc311f832666d114a695a095242f73ba4717c95835dabf72ffb4a7823d6273c9209b114fe0846f6eecc9de6546b36a0e01d2ea174b923796dc7580a628b + languageName: node + linkType: hard + "@vitest/ui@npm:^0.29.2": version: 0.29.2 resolution: "@vitest/ui@npm:0.29.2" @@ -708,6 +1605,19 @@ __metadata: languageName: node linkType: hard +"@vitest/ui@npm:^0.29.3": + version: 0.29.3 + resolution: "@vitest/ui@npm:0.29.3" + dependencies: + fast-glob: ^3.2.12 + flatted: ^3.2.7 + pathe: ^1.1.0 + picocolors: ^1.0.0 + sirv: ^2.0.2 + checksum: 5c4cbd6484e06b46f24f7512fce668c3738c7d7933e5f5fc04b059abca3668898c6febd20714782a674942b4869769213ace35afb6b95b10210d1dabdab5c678 + languageName: node + linkType: hard + "@vitest/utils@npm:0.29.2": version: 0.29.2 resolution: "@vitest/utils@npm:0.29.2" @@ -721,6 +1631,18 @@ __metadata: languageName: node linkType: hard +"@vitest/utils@npm:0.29.3": + version: 0.29.3 + resolution: "@vitest/utils@npm:0.29.3" + dependencies: + cli-truncate: ^3.1.0 + diff: ^5.1.0 + loupe: ^2.3.6 + pretty-format: ^27.5.1 + checksum: 549cfef427700795bea5e23526a0bce9cd0492d9e153bc086a6358c56829a0ec15d27d514c597a9dc086ef824304cff17b6b7c4ad6ae7bb4cfc3fcd6d1a86d93 + languageName: node + linkType: hard + "abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -844,6 +1766,16 @@ __metadata: languageName: node linkType: hard +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + is-array-buffer: ^3.0.1 + checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + languageName: node + linkType: hard + "arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" @@ -851,6 +1783,17 @@ __metadata: languageName: node linkType: hard +"asn1js@npm:^3.0.5": + version: 3.0.5 + resolution: "asn1js@npm:3.0.5" + dependencies: + pvtsutils: ^1.3.2 + pvutils: ^1.1.3 + tslib: ^2.4.0 + checksum: 3b6af1bbadd5762ef8ead5daf2f6bda1bc9e23bc825c4dcc996aa1f9521ad7390a64028565d95d98090d69c8431f004c71cccb866004759169d7c203cf9075eb + languageName: node + linkType: hard + "assertion-error@npm:^1.1.0": version: 1.1.0 resolution: "assertion-error@npm:1.1.0" @@ -858,6 +1801,13 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.5": + version: 1.0.5 + resolution: "available-typed-arrays@npm:1.0.5" + checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -889,6 +1839,13 @@ __metadata: languageName: node linkType: hard +"bowser@npm:^2.11.0": + version: 2.11.0 + resolution: "bowser@npm:2.11.0" + checksum: 29c3f01f22e703fa6644fc3b684307442df4240b6e10f6cfe1b61c6ca5721073189ca97cdeedb376081148c8518e33b1d818a57f781d70b0b70e1f31fb48814f + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1000,6 +1957,16 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind@npm:1.0.2" + dependencies: + function-bind: ^1.1.1 + get-intrinsic: ^1.0.2 + checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + languageName: node + linkType: hard + "camelcase-keys@npm:^8.0.2": version: 8.0.2 resolution: "camelcase-keys@npm:8.0.2" @@ -1235,6 +2202,16 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": + version: 1.2.0 + resolution: "define-properties@npm:1.2.0" + dependencies: + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -1325,6 +2302,85 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": + version: 1.21.2 + resolution: "es-abstract@npm:1.21.2" + dependencies: + array-buffer-byte-length: ^1.0.0 + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + es-set-tostringtag: ^2.0.1 + es-to-primitive: ^1.2.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.2.0 + get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 + has: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.5 + is-array-buffer: ^3.0.2 + is-callable: ^1.2.7 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-typed-array: ^1.1.10 + is-weakref: ^1.0.2 + object-inspect: ^1.12.3 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + safe-regex-test: ^1.0.0 + string.prototype.trim: ^1.2.7 + string.prototype.trimend: ^1.0.6 + string.prototype.trimstart: ^1.0.6 + typed-array-length: ^1.0.4 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.9 + checksum: 037f55ee5e1cdf2e5edbab5524095a4f97144d95b94ea29e3611b77d852fd8c8a40e7ae7101fa6a759a9b9b1405f188c3c70928f2d3cd88d543a07fc0d5ad41a + languageName: node + linkType: hard + +"es-aggregate-error@npm:^1.0.9": + version: 1.0.9 + resolution: "es-aggregate-error@npm:1.0.9" + dependencies: + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + function-bind: ^1.1.1 + functions-have-names: ^1.2.3 + get-intrinsic: ^1.1.3 + globalthis: ^1.0.3 + has-property-descriptors: ^1.0.0 + checksum: bef86c4fcd3b924929e8d89d288dc0a577b31bb17d6a3f0a7676f22c5d7ffa4e1ff08bb393f06b15e1baad132ae725a8c8692728a5f73cd2b78a1c49ce664605 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: ^1.1.3 + has: ^1.0.3 + has-tostringtag: ^1.0.0 + checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: ^1.1.4 + is-date-object: ^1.0.1 + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + "esbuild@npm:^0.16.14": version: 0.16.17 resolution: "esbuild@npm:0.16.17" @@ -1546,6 +2602,17 @@ __metadata: languageName: node linkType: hard +"fast-xml-parser@npm:4.1.2": + version: 4.1.2 + resolution: "fast-xml-parser@npm:4.1.2" + dependencies: + strnum: ^1.0.5 + bin: + fxparser: src/cli/cli.js + checksum: 6a7d1b17057f8470e70603eddfa75f990625735d068d57ece861d0154ad8d27fda63c2831d07e1ecd7e68e993738b2448925cb9277d8c0ed68009623bbcd63c6 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.15.0 resolution: "fastq@npm:1.15.0" @@ -1601,6 +2668,15 @@ __metadata: languageName: node linkType: hard +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + languageName: node + linkType: hard + "foreground-child@npm:^2.0.0": version: 2.0.0 resolution: "foreground-child@npm:2.0.0" @@ -1674,6 +2750,25 @@ __metadata: languageName: node linkType: hard +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + functions-have-names: ^1.2.2 + checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + "gauge@npm:^4.0.3": version: 4.0.4 resolution: "gauge@npm:4.0.4" @@ -1704,6 +2799,17 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": + version: 1.2.0 + resolution: "get-intrinsic@npm:1.2.0" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-symbols: ^1.0.3 + checksum: 78fc0487b783f5c58cf2dccafc3ae656ee8d2d8062a8831ce4a95e7057af4587a1d4882246c033aca0a7b4965276f4802b45cc300338d1b77a73d3e3e3f4877d + languageName: node + linkType: hard + "get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -1711,6 +2817,16 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -1747,6 +2863,24 @@ __metadata: languageName: node linkType: hard +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: ^1.1.3 + checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.6": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" @@ -1761,6 +2895,13 @@ __metadata: languageName: node linkType: hard +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + languageName: node + linkType: hard + "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -1775,6 +2916,38 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: ^1.0.2 + checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + languageName: node + linkType: hard + "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -1914,6 +3087,17 @@ __metadata: languageName: node linkType: hard +"internal-slot@npm:^1.0.5": + version: 1.0.5 + resolution: "internal-slot@npm:1.0.5" + dependencies: + get-intrinsic: ^1.2.0 + has: ^1.0.3 + side-channel: ^1.0.4 + checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a + languageName: node + linkType: hard + "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -1921,6 +3105,17 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + is-typed-array: ^1.1.10 + checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -1928,6 +3123,32 @@ __metadata: languageName: node linkType: hard +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: ^1.0.1 + checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + languageName: node + linkType: hard + "is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": version: 2.11.0 resolution: "is-core-module@npm:2.11.0" @@ -1937,6 +3158,15 @@ __metadata: languageName: node linkType: hard +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: ^1.0.0 + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -1974,6 +3204,22 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + languageName: node + linkType: hard + "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -1988,6 +3234,25 @@ __metadata: languageName: node linkType: hard +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + languageName: node + linkType: hard + "is-stream@npm:^3.0.0": version: 3.0.0 resolution: "is-stream@npm:3.0.0" @@ -1995,6 +3260,46 @@ __metadata: languageName: node linkType: hard +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: ^1.0.2 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": + version: 1.1.10 + resolution: "is-typed-array@npm:1.1.10" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + languageName: node + linkType: hard + "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -2549,6 +3854,32 @@ __metadata: languageName: node linkType: hard +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + languageName: node + linkType: hard + "once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -2765,6 +4096,22 @@ __metadata: languageName: node linkType: hard +"pvtsutils@npm:^1.3.2": + version: 1.3.2 + resolution: "pvtsutils@npm:1.3.2" + dependencies: + tslib: ^2.4.0 + checksum: 9b8155611363e2f40276879f2454e60204b45be0cd0482f9373f369308a2e9c76d5d74cdf661a3f5aae8022d75ea159eb0ba38ee78fc782ee3051e4722db98d0 + languageName: node + linkType: hard + +"pvutils@npm:^1.1.3": + version: 1.1.3 + resolution: "pvutils@npm:1.1.3" + checksum: 2ee26a9e5176c348977d6ec00d8ee80bff62f51743b1c5fe8abeeb4c5d29d9959cdfe0ce146707a9e6801bce88190fed3002d720b072dc87d031c692820b44c9 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -2845,6 +4192,17 @@ __metadata: languageName: node linkType: hard +"regexp.prototype.flags@npm:^1.4.3": + version: 1.4.3 + resolution: "regexp.prototype.flags@npm:1.4.3" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + functions-have-names: ^1.2.2 + checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -2993,6 +4351,17 @@ __metadata: languageName: node linkType: hard +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-regex: ^1.1.4 + checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -3050,6 +4419,17 @@ __metadata: languageName: node linkType: hard +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: ^1.0.0 + get-intrinsic: ^1.0.2 + object-inspect: ^1.9.0 + checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + languageName: node + linkType: hard + "siginfo@npm:^2.0.0": version: 2.0.0 resolution: "siginfo@npm:2.0.0" @@ -3220,6 +4600,39 @@ __metadata: languageName: node linkType: hard +"string.prototype.trim@npm:^1.2.7": + version: 1.2.7 + resolution: "string.prototype.trim@npm:1.2.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 05b7b2d6af63648e70e44c4a8d10d8cc457536df78b55b9d6230918bde75c5987f6b8604438c4c8652eb55e4fc9725d2912789eb4ec457d6995f3495af190c09 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -3281,6 +4694,13 @@ __metadata: languageName: node linkType: hard +"strnum@npm:^1.0.5": + version: 1.0.5 + resolution: "strnum@npm:1.0.5" + checksum: 651b2031db5da1bf4a77fdd2f116a8ac8055157c5420f5569f64879133825915ad461513e7202a16d7fec63c54fd822410d0962f8ca12385c4334891b9ae6dd2 + languageName: node + linkType: hard + "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -3403,6 +4823,20 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^1.11.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tslib@npm:^2.3.1, tslib@npm:^2.4.0": + version: 2.5.0 + resolution: "tslib@npm:2.5.0" + checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 + languageName: node + linkType: hard + "type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -3424,6 +4858,17 @@ __metadata: languageName: node linkType: hard +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + is-typed-array: ^1.1.9 + checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + languageName: node + linkType: hard + "typescript@npm:^4.8.4": version: 4.9.5 resolution: "typescript@npm:4.9.5" @@ -3451,6 +4896,18 @@ __metadata: languageName: node linkType: hard +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 + which-boxed-primitive: ^1.0.2 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + languageName: node + linkType: hard + "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -3508,6 +4965,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + "v8-to-istanbul@npm:^9.0.0": version: 9.1.0 resolution: "v8-to-istanbul@npm:9.1.0" @@ -3545,6 +5011,22 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:0.29.3": + version: 0.29.3 + resolution: "vite-node@npm:0.29.3" + dependencies: + cac: ^6.7.14 + debug: ^4.3.4 + mlly: ^1.1.0 + pathe: ^1.1.0 + picocolors: ^1.0.0 + vite: ^3.0.0 || ^4.0.0 + bin: + vite-node: vite-node.mjs + checksum: 8bf0a5377d41276f2343819dca5638cab1fb23e55331d06915c5ea0edcc5d593ed295d4c1d1e874f3d7a6c980c25b1c08d9c83d1cff836681ec5778d39583e0b + languageName: node + linkType: hard + "vite@npm:^3.0.0 || ^4.0.0, vite@npm:^4.1.1, vite@npm:^4.1.3, vite@npm:^4.1.4": version: 4.1.4 resolution: "vite@npm:4.1.4" @@ -3634,6 +5116,57 @@ __metadata: languageName: node linkType: hard +"vitest@npm:^0.29.3": + version: 0.29.3 + resolution: "vitest@npm:0.29.3" + dependencies: + "@types/chai": ^4.3.4 + "@types/chai-subset": ^1.3.3 + "@types/node": "*" + "@vitest/expect": 0.29.3 + "@vitest/runner": 0.29.3 + "@vitest/spy": 0.29.3 + "@vitest/utils": 0.29.3 + acorn: ^8.8.1 + acorn-walk: ^8.2.0 + cac: ^6.7.14 + chai: ^4.3.7 + debug: ^4.3.4 + local-pkg: ^0.4.2 + pathe: ^1.1.0 + picocolors: ^1.0.0 + source-map: ^0.6.1 + std-env: ^3.3.1 + strip-literal: ^1.0.0 + tinybench: ^2.3.1 + tinypool: ^0.3.1 + tinyspy: ^1.0.2 + vite: ^3.0.0 || ^4.0.0 + vite-node: 0.29.3 + why-is-node-running: ^2.2.2 + peerDependencies: + "@edge-runtime/vm": "*" + "@vitest/browser": "*" + "@vitest/ui": "*" + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: c0f87c365d6fff9221e92dba0bdb0ae81af390b4f8da5af2a72c789c11d1cc0f09995d5fc6f9557832e7533436af7f6d595116557d376dedf5ce4f5951cbcb2c + languageName: node + linkType: hard + "web-streams-polyfill@npm:^3.0.3": version: 3.2.1 resolution: "web-streams-polyfill@npm:3.2.1" @@ -3641,6 +5174,33 @@ __metadata: languageName: node linkType: hard +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: ^1.0.1 + is-boolean-object: ^1.1.0 + is-number-object: ^1.0.4 + is-string: ^1.0.5 + is-symbol: ^1.0.3 + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.9": + version: 1.1.9 + resolution: "which-typed-array@npm:1.1.9" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + is-typed-array: ^1.1.10 + checksum: fe0178ca44c57699ca2c0e657b64eaa8d2db2372a4e2851184f568f98c478ae3dc3fdb5f7e46c384487046b0cf9e23241423242b277e03e8ba3dabc7c84c98ef + languageName: node + linkType: hard + "which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" From fda1414c28073a75bdf4256a20b3f433d6f92b52 Mon Sep 17 00:00:00 2001 From: "Seo Myunggyun (Jonathan)" Date: Fri, 17 Mar 2023 18:08:54 +0900 Subject: [PATCH 4/4] Changelog Co-authored-by: Hong Minhee --- .github/workflows/yarn.yaml | 4 ++-- @planetarium/account-aws-kms/package.json | 2 +- .../test/AwsKmsKeyStore.test.ts | 22 ++++++++++--------- CHANGES.md | 22 ++++++++++++++----- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/.github/workflows/yarn.yaml b/.github/workflows/yarn.yaml index eaeb41b5484..306854750da 100644 --- a/.github/workflows/yarn.yaml +++ b/.github/workflows/yarn.yaml @@ -27,12 +27,12 @@ jobs: - name: Run yarn test w/o AWS cred for PR unrelated to account-aws-kms if: | github.event_name == 'pull_request' && - steps.account-aws-kms-changes.outputs.any_changes != 'true' + steps.account-aws-kms-changes.outputs.any_changed != 'true' run: yarn test - name: Run yarn test w/ AWS cred for push and PR related to account-aws-kms if: | github.event_name != 'pull_request' || - steps.account-aws-kms-changes.outputs.any_changes == 'true' + steps.account-aws-kms-changes.outputs.any_changed == 'true' run: yarn test env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} diff --git a/@planetarium/account-aws-kms/package.json b/@planetarium/account-aws-kms/package.json index f2a8bca98da..74c4b83deda 100644 --- a/@planetarium/account-aws-kms/package.json +++ b/@planetarium/account-aws-kms/package.json @@ -13,7 +13,7 @@ "build": "yarn && nanobundle build", "prepack": "yarn && yarn build", "dev": "yarn test", - "test": "yarn && yarn run -T tsc -p tsconfig.json && vitest run; printf \"\\033[41;97mNOTE: running this test suite too many times may be costly, as this creates and deletes AWS KMS keys during testing. KMS keys are prorated per hour for the price of \\$1.00 per key.\\033[0m\n\" > /dev/stderr", + "test": "bash -c 'yarn && yarn run -T tsc -p tsconfig.json && vitest run; status=$?; printf \"\\033[41;97mNOTE: running this test suite too many times may be costly, as this creates and deletes AWS KMS keys during testing. KMS keys are prorated per hour for the price of \\$1.00 per key.\\033[0m\n\" > /dev/stderr; exit $status'", "coverage": "yarn && vitest run --coverage" }, "repository": { diff --git a/@planetarium/account-aws-kms/test/AwsKmsKeyStore.test.ts b/@planetarium/account-aws-kms/test/AwsKmsKeyStore.test.ts index ea4eda2c5a3..a75293de4f0 100644 --- a/@planetarium/account-aws-kms/test/AwsKmsKeyStore.test.ts +++ b/@planetarium/account-aws-kms/test/AwsKmsKeyStore.test.ts @@ -12,7 +12,7 @@ import { OriginType, ScheduleKeyDeletionCommand, } from "@aws-sdk/client-kms"; -import { PublicKey, Signature } from "@planetarium/account"; +import { PublicKey } from "@planetarium/account"; import { AggregateError } from "es-aggregate-error"; import { randomUUID } from "node:crypto"; import { hostname, userInfo } from "node:os"; @@ -20,9 +20,9 @@ import { inspect } from "node:util"; import { afterEach, describe, expect, test } from "vitest"; const envsConfigured = - process.env.AWS_ACCESS_KEY_ID && - process.env.AWS_SECRET_ACCESS_KEY && - process.env.AWS_REGION; + !!process.env.AWS_ACCESS_KEY_ID && + !!process.env.AWS_SECRET_ACCESS_KEY && + !!process.env.AWS_REGION; interface FixtureKey { keyId: AwsKmsKeyId; @@ -33,14 +33,16 @@ interface FixtureKey { describe.runIf(envsConfigured)("AwsKmsKeyStore", async () => { const client = new KMSClient({}); - console.info("The below tests are run on the following AWS session:"); - console.table({ - AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID, - AWS_REGION: process.env.AWS_REGION, - }); + if (envsConfigured) { + console.info("The below tests are run on the following AWS session:"); + console.table({ + AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID, + AWS_REGION: process.env.AWS_REGION, + }); + } const listCmd = new ListKeysCommand({ Limit: 1000 }); - const keysList = await client.send(listCmd); + const keysList = envsConfigured ? await client.send(listCmd) : { Keys: null }; const listWindow = Math.max((keysList.Keys ?? []).length / 2, 2); const testSessionId = randomUUID(); const store = new AwsKmsKeyStore(client, { diff --git a/CHANGES.md b/CHANGES.md index 4106aab75bf..b118f65f4ad 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,11 +6,16 @@ Version 0.53.0 To be released. -Since 0.53.0, we officially provide -*[@planetarium/account-web3-secret-storage]*, an npm package for providing -`Web3KeyStore` which implements Ethereum Web3 Secret Storage (corresponds to -`Libplanet.KeyStore.Web3KeyStore`) and complies with the `KeyStore` interface -defined in *[@planetarium/account]*. +Since 0.53.0, we officially provide *[@planetarium/account-web3-secret-storage]* +and *[@planetarium/account-aws-kms]*, which are npm packages that provides +`KeyStore` implementations that comply with *[@planetarium/account]*. + + - *@planetarium/account-web3-secret-storage*: An npm package for providing + `Web3KeyStore` which implements Ethereum Web3 Secret Storage (corresponds to + `Libplanet.KeyStore.Web3KeyStore`). + + - *@planetarium/account-aws-kms*: An npm package for providing + `AwsKmsKeyStore` which implements `Account` and uses AWS KMS as the backend. Due to changes in [[#2961]] and [[#2970]], a network ran with [Libplanet 0.51.0] or [Libplanet 0.52.0] is not compatible with this version. @@ -101,11 +106,16 @@ deployment if possible. ### Behavioral changes + - (@planetarium/account) `Signature.fromBytes()` and `Signature.fromHex()` + no more accept signatures with high S. Signatures with high S need to be + normalized first so that they get rid of high S. [[#2962]] + ### Bug fixes ### Dependencies - Added *[@planetarium/account-web3-secret-storage]* npm package. [[#2915]] + - Added *[@planetarium/account-aws-kms]* npm package. [[#2962]] ### CLI tools @@ -117,8 +127,10 @@ deployment if possible. [#2955]: https://github.com/planetarium/libplanet/pull/2955 [#2959]: https://github.com/planetarium/libplanet/pull/2959 [#2961]: https://github.com/planetarium/libplanet/pull/2961 +[#2962]: https://github.com/planetarium/libplanet/pull/2962 [#2970]: https://github.com/planetarium/libplanet/pull/2970 [@planetarium/account-web3-secret-storage]: https://www.npmjs.com/package/@planetarium/account-web3-secret-storage +[@planetarium/account-aws-kms]: https://www.npmjs.com/package/@planetarium/account-aws-kms [@planetarium/bencodex]: https://www.npmjs.com/package/@planetarium/bencodex [disjukr/bencodex]: https://github.com/disjukr/bencodex