diff --git a/opensaas-sh/app_diff/README.md.diff b/opensaas-sh/app_diff/README.md.diff index fe343f70..97027f9c 100644 --- a/opensaas-sh/app_diff/README.md.diff +++ b/opensaas-sh/app_diff/README.md.diff @@ -1,17 +1,17 @@ --- template/app/README.md +++ opensaas-sh/app/README.md -@@ -1,6 +1,8 @@ +@@ -1,16 +1,31 @@ -# +# opensaas.sh (demo) app -Built with [Wasp](https://wasp.sh), based on the [Open Saas](https://opensaas.sh) template. +This is a Wasp app based on Open Saas template with minimal modifications that make it into a demo app that showcases Open Saas's abilities. -+ -+It is deployed to https://opensaas.sh and serves both as a landing page for Open Saas and as a demo app. ++It is deployed to https://opensaas.sh and serves both as a landing page for Open Saas and as a demo app. ++ ## UI Components -@@ -8,9 +10,22 @@ + This template includes [ShadCN UI](https://ui.shadcn.com/) v2 for beautiful, accessible React components. See [SHADCN_SETUP.md](./SHADCN_SETUP.md) for details on how to use ShadCN components in your app. ## Development diff --git a/opensaas-sh/app_diff/deletions b/opensaas-sh/app_diff/deletions index 650fbb9d..5f72c050 100644 --- a/opensaas-sh/app_diff/deletions +++ b/opensaas-sh/app_diff/deletions @@ -1,7 +1,6 @@ src/client/static/open-saas-banner-dark.svg src/client/static/open-saas-banner-light.svg src/landing-page/components/Hero.tsx -src/landing-page/contentSections.ts src/payment/lemonSqueezy/checkoutUtils.ts src/payment/lemonSqueezy/paymentDetails.ts src/payment/lemonSqueezy/paymentProcessor.ts diff --git a/opensaas-sh/app_diff/main.wasp.diff b/opensaas-sh/app_diff/main.wasp.diff index 66f1cec6..ca67be42 100644 --- a/opensaas-sh/app_diff/main.wasp.diff +++ b/opensaas-sh/app_diff/main.wasp.diff @@ -119,7 +119,25 @@ httpRoute: (POST, "/payments-webhook") } //#endregion -@@ -281,7 +279,6 @@ +@@ -245,6 +243,17 @@ + fn: import { deleteFile } from "@src/file-upload/operations", + entities: [User, File] + } ++ ++job deleteFilesJob { ++ executor: PgBoss, ++ perform: { ++ fn: import { deleteFilesJob } from "@src/file-upload/workers" ++ }, ++ schedule: { ++ cron: "0 5 * * *" // every day at 5am ++ }, ++ entities: [File] ++} + //#endregion + + //#region Analytics +@@ -291,7 +300,6 @@ component: import AdminCalendar from "@src/admin/elements/calendar/CalendarPage" } diff --git a/opensaas-sh/app_diff/migrations/20250731133938_drop_upload_url_from_file/migration.sql.diff b/opensaas-sh/app_diff/migrations/20250731133938_drop_upload_url_from_file/migration.sql.diff new file mode 100644 index 00000000..1a2122bb --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20250731133938_drop_upload_url_from_file/migration.sql.diff @@ -0,0 +1,11 @@ +--- template/app/migrations/20250731133938_drop_upload_url_from_file/migration.sql ++++ opensaas-sh/app/migrations/20250731133938_drop_upload_url_from_file/migration.sql +@@ -0,0 +1,8 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `uploadUrl` on the `File` table. All the data in the column will be lost. ++ ++*/ ++-- AlterTable ++ALTER TABLE "File" DROP COLUMN "uploadUrl"; diff --git a/opensaas-sh/app_diff/migrations/20250806121259_add_s3_key_file/migration.sql.diff b/opensaas-sh/app_diff/migrations/20250806121259_add_s3_key_file/migration.sql.diff new file mode 100644 index 00000000..b72ee9c5 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20250806121259_add_s3_key_file/migration.sql.diff @@ -0,0 +1,14 @@ +--- template/app/migrations/20250806121259_add_s3_key_file/migration.sql ++++ opensaas-sh/app/migrations/20250806121259_add_s3_key_file/migration.sql +@@ -0,0 +1,11 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `key` on the `File` table. All the data in the column will be lost. ++ - Added the required column `s3Key` to the `File` table without a default value. This is not possible if the table is not empty. ++ ++*/ ++-- AlterTable ++DELETE FROM "File"; ++ALTER TABLE "File" DROP COLUMN "key", ++ADD COLUMN "s3Key" TEXT NOT NULL; diff --git a/opensaas-sh/app_diff/package-lock.json.diff b/opensaas-sh/app_diff/package-lock.json.diff index 1ee8bd4f..f9431f64 100644 --- a/opensaas-sh/app_diff/package-lock.json.diff +++ b/opensaas-sh/app_diff/package-lock.json.diff @@ -1,6 +1,6 @@ --- template/app/package-lock.json +++ opensaas-sh/app/package-lock.json -@@ -0,0 +1,14338 @@ +@@ -0,0 +1,14527 @@ +{ + "name": "opensaas", + "lockfileVersion": 3, @@ -27,6 +27,7 @@ + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.2.5", ++ "@radix-ui/react-toast": "^1.2.14", + "@tailwindcss/forms": "^0.5.3", + "@tailwindcss/typography": "^0.5.7", + "apexcharts": "3.41.0", @@ -42,7 +43,6 @@ + "react-apexcharts": "1.4.1", + "react-dom": "^18.2.0", + "react-hook-form": "^7.60.0", -+ "react-hot-toast": "^2.4.1", + "react-icons": "^5.5.0", + "react-router-dom": "^6.26.2", + "stripe": "18.1.0", @@ -322,117 +322,116 @@ + } + }, + "node_modules/@aws-sdk/client-s3": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.888.0.tgz", -+ "integrity": "sha512-MgYyF/qpvCMYVSiOpRJ5C/EtdFxuYAeF5SprtMsbf71xBiiCH5GurB616i+ZxJqHlfhBQTTvR0qugnWvk1Wqvw==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.907.0.tgz", ++ "integrity": "sha512-A606SYZtnrVDuuQTsG5fEurHMUeJeqh5TFLx0m3t2x27USuLH0dlw9s2ygFFdAcyzVG7u+my0CIMNQPWida/NA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/credential-provider-node": "3.888.0", -+ "@aws-sdk/middleware-bucket-endpoint": "3.887.0", -+ "@aws-sdk/middleware-expect-continue": "3.887.0", -+ "@aws-sdk/middleware-flexible-checksums": "3.888.0", -+ "@aws-sdk/middleware-host-header": "3.887.0", -+ "@aws-sdk/middleware-location-constraint": "3.887.0", -+ "@aws-sdk/middleware-logger": "3.887.0", -+ "@aws-sdk/middleware-recursion-detection": "3.887.0", -+ "@aws-sdk/middleware-sdk-s3": "3.888.0", -+ "@aws-sdk/middleware-ssec": "3.887.0", -+ "@aws-sdk/middleware-user-agent": "3.888.0", -+ "@aws-sdk/region-config-resolver": "3.887.0", -+ "@aws-sdk/signature-v4-multi-region": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/util-endpoints": "3.887.0", -+ "@aws-sdk/util-user-agent-browser": "3.887.0", -+ "@aws-sdk/util-user-agent-node": "3.888.0", -+ "@aws-sdk/xml-builder": "3.887.0", -+ "@smithy/config-resolver": "^4.2.1", -+ "@smithy/core": "^3.11.0", -+ "@smithy/eventstream-serde-browser": "^4.1.1", -+ "@smithy/eventstream-serde-config-resolver": "^4.2.1", -+ "@smithy/eventstream-serde-node": "^4.1.1", -+ "@smithy/fetch-http-handler": "^5.2.1", -+ "@smithy/hash-blob-browser": "^4.1.1", -+ "@smithy/hash-node": "^4.1.1", -+ "@smithy/hash-stream-node": "^4.1.1", -+ "@smithy/invalid-dependency": "^4.1.1", -+ "@smithy/md5-js": "^4.1.1", -+ "@smithy/middleware-content-length": "^4.1.1", -+ "@smithy/middleware-endpoint": "^4.2.1", -+ "@smithy/middleware-retry": "^4.2.1", -+ "@smithy/middleware-serde": "^4.1.1", -+ "@smithy/middleware-stack": "^4.1.1", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/node-http-handler": "^4.2.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/smithy-client": "^4.6.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/url-parser": "^4.1.1", -+ "@smithy/util-base64": "^4.1.0", -+ "@smithy/util-body-length-browser": "^4.1.0", -+ "@smithy/util-body-length-node": "^4.1.0", -+ "@smithy/util-defaults-mode-browser": "^4.1.1", -+ "@smithy/util-defaults-mode-node": "^4.1.1", -+ "@smithy/util-endpoints": "^3.1.1", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-retry": "^4.1.1", -+ "@smithy/util-stream": "^4.3.1", -+ "@smithy/util-utf8": "^4.1.0", -+ "@smithy/util-waiter": "^4.1.1", -+ "@types/uuid": "^9.0.1", -+ "tslib": "^2.6.2", -+ "uuid": "^9.0.1" ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/credential-provider-node": "3.907.0", ++ "@aws-sdk/middleware-bucket-endpoint": "3.901.0", ++ "@aws-sdk/middleware-expect-continue": "3.901.0", ++ "@aws-sdk/middleware-flexible-checksums": "3.907.0", ++ "@aws-sdk/middleware-host-header": "3.901.0", ++ "@aws-sdk/middleware-location-constraint": "3.901.0", ++ "@aws-sdk/middleware-logger": "3.901.0", ++ "@aws-sdk/middleware-recursion-detection": "3.901.0", ++ "@aws-sdk/middleware-sdk-s3": "3.907.0", ++ "@aws-sdk/middleware-ssec": "3.901.0", ++ "@aws-sdk/middleware-user-agent": "3.907.0", ++ "@aws-sdk/region-config-resolver": "3.901.0", ++ "@aws-sdk/signature-v4-multi-region": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/util-endpoints": "3.901.0", ++ "@aws-sdk/util-user-agent-browser": "3.907.0", ++ "@aws-sdk/util-user-agent-node": "3.907.0", ++ "@aws-sdk/xml-builder": "3.901.0", ++ "@smithy/config-resolver": "^4.3.0", ++ "@smithy/core": "^3.14.0", ++ "@smithy/eventstream-serde-browser": "^4.2.0", ++ "@smithy/eventstream-serde-config-resolver": "^4.3.0", ++ "@smithy/eventstream-serde-node": "^4.2.0", ++ "@smithy/fetch-http-handler": "^5.3.0", ++ "@smithy/hash-blob-browser": "^4.2.0", ++ "@smithy/hash-node": "^4.2.0", ++ "@smithy/hash-stream-node": "^4.2.0", ++ "@smithy/invalid-dependency": "^4.2.0", ++ "@smithy/md5-js": "^4.2.0", ++ "@smithy/middleware-content-length": "^4.2.0", ++ "@smithy/middleware-endpoint": "^4.3.0", ++ "@smithy/middleware-retry": "^4.4.0", ++ "@smithy/middleware-serde": "^4.2.0", ++ "@smithy/middleware-stack": "^4.2.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/node-http-handler": "^4.3.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/smithy-client": "^4.7.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/url-parser": "^4.2.0", ++ "@smithy/util-base64": "^4.2.0", ++ "@smithy/util-body-length-browser": "^4.2.0", ++ "@smithy/util-body-length-node": "^4.2.0", ++ "@smithy/util-defaults-mode-browser": "^4.2.0", ++ "@smithy/util-defaults-mode-node": "^4.2.0", ++ "@smithy/util-endpoints": "^3.2.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-retry": "^4.2.0", ++ "@smithy/util-stream": "^4.4.0", ++ "@smithy/util-utf8": "^4.2.0", ++ "@smithy/util-waiter": "^4.2.0", ++ "@smithy/uuid": "^1.1.0", ++ "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.888.0.tgz", -+ "integrity": "sha512-8CLy/ehGKUmekjH+VtZJ4w40PqDg3u0K7uPziq/4P8Q7LLgsy8YQoHNbuY4am7JU3HWrqLXJI9aaz1+vPGPoWA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.907.0.tgz", ++ "integrity": "sha512-ANuu0duNTcQHv0g5YrEuWImT8o9t6li3A+MtAaKxIbTA3eFQnl6xHDxyrbsrU19FtKPg3CWhvfY04j6DaDvR8g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/middleware-host-header": "3.887.0", -+ "@aws-sdk/middleware-logger": "3.887.0", -+ "@aws-sdk/middleware-recursion-detection": "3.887.0", -+ "@aws-sdk/middleware-user-agent": "3.888.0", -+ "@aws-sdk/region-config-resolver": "3.887.0", -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/util-endpoints": "3.887.0", -+ "@aws-sdk/util-user-agent-browser": "3.887.0", -+ "@aws-sdk/util-user-agent-node": "3.888.0", -+ "@smithy/config-resolver": "^4.2.1", -+ "@smithy/core": "^3.11.0", -+ "@smithy/fetch-http-handler": "^5.2.1", -+ "@smithy/hash-node": "^4.1.1", -+ "@smithy/invalid-dependency": "^4.1.1", -+ "@smithy/middleware-content-length": "^4.1.1", -+ "@smithy/middleware-endpoint": "^4.2.1", -+ "@smithy/middleware-retry": "^4.2.1", -+ "@smithy/middleware-serde": "^4.1.1", -+ "@smithy/middleware-stack": "^4.1.1", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/node-http-handler": "^4.2.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/smithy-client": "^4.6.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/url-parser": "^4.1.1", -+ "@smithy/util-base64": "^4.1.0", -+ "@smithy/util-body-length-browser": "^4.1.0", -+ "@smithy/util-body-length-node": "^4.1.0", -+ "@smithy/util-defaults-mode-browser": "^4.1.1", -+ "@smithy/util-defaults-mode-node": "^4.1.1", -+ "@smithy/util-endpoints": "^3.1.1", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-retry": "^4.1.1", -+ "@smithy/util-utf8": "^4.1.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/middleware-host-header": "3.901.0", ++ "@aws-sdk/middleware-logger": "3.901.0", ++ "@aws-sdk/middleware-recursion-detection": "3.901.0", ++ "@aws-sdk/middleware-user-agent": "3.907.0", ++ "@aws-sdk/region-config-resolver": "3.901.0", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/util-endpoints": "3.901.0", ++ "@aws-sdk/util-user-agent-browser": "3.907.0", ++ "@aws-sdk/util-user-agent-node": "3.907.0", ++ "@smithy/config-resolver": "^4.3.0", ++ "@smithy/core": "^3.14.0", ++ "@smithy/fetch-http-handler": "^5.3.0", ++ "@smithy/hash-node": "^4.2.0", ++ "@smithy/invalid-dependency": "^4.2.0", ++ "@smithy/middleware-content-length": "^4.2.0", ++ "@smithy/middleware-endpoint": "^4.3.0", ++ "@smithy/middleware-retry": "^4.4.0", ++ "@smithy/middleware-serde": "^4.2.0", ++ "@smithy/middleware-stack": "^4.2.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/node-http-handler": "^4.3.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/smithy-client": "^4.7.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/url-parser": "^4.2.0", ++ "@smithy/util-base64": "^4.2.0", ++ "@smithy/util-body-length-browser": "^4.2.0", ++ "@smithy/util-body-length-node": "^4.2.0", ++ "@smithy/util-defaults-mode-browser": "^4.2.0", ++ "@smithy/util-defaults-mode-node": "^4.2.0", ++ "@smithy/util-endpoints": "^3.2.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-retry": "^4.2.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -440,25 +439,23 @@ + } + }, + "node_modules/@aws-sdk/core": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.888.0.tgz", -+ "integrity": "sha512-L3S2FZywACo4lmWv37Y4TbefuPJ1fXWyWwIJ3J4wkPYFJ47mmtUPqThlVrSbdTHkEjnZgJe5cRfxk0qCLsFh1w==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.907.0.tgz", ++ "integrity": "sha512-vuIHL8qUcA5oNi7IWSZauCMaXstWTcSsnK1iHcvg92ddGDo1LMd2kQNo0G9UANa8vOfc908+8xKO40gfL8+M7w==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/xml-builder": "3.887.0", -+ "@smithy/core": "^3.11.0", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/signature-v4": "^5.1.3", -+ "@smithy/smithy-client": "^4.6.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-base64": "^4.1.0", -+ "@smithy/util-body-length-browser": "^4.1.0", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-utf8": "^4.1.0", -+ "fast-xml-parser": "5.2.5", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/xml-builder": "3.901.0", ++ "@smithy/core": "^3.14.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/signature-v4": "^5.3.0", ++ "@smithy/smithy-client": "^4.7.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-base64": "^4.2.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -466,15 +463,15 @@ + } + }, + "node_modules/@aws-sdk/credential-provider-env": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.888.0.tgz", -+ "integrity": "sha512-shPi4AhUKbIk7LugJWvNpeZA8va7e5bOHAEKo89S0Ac8WDZt2OaNzbh/b9l0iSL2eEyte8UgIsYGcFxOwIF1VA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.907.0.tgz", ++ "integrity": "sha512-orqT6djon57y09Ci5q0kezisrEvr78Z+7WvZbq0ZC0Ncul4RgJfCmhcgmzNPaWA18NEI0wGytaxYh3YFE7kIBQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -482,20 +479,20 @@ + } + }, + "node_modules/@aws-sdk/credential-provider-http": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.888.0.tgz", -+ "integrity": "sha512-Jvuk6nul0lE7o5qlQutcqlySBHLXOyoPtiwE6zyKbGc7RVl0//h39Lab7zMeY2drMn8xAnIopL4606Fd8JI/Hw==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.907.0.tgz", ++ "integrity": "sha512-CKG/0hT4o8K2aQKOe+xwGP3keSNOyryhZNmKuHPuMRVlsJfO6wNxlu37HcUPzihJ+S2pOmTVGUbeVMCxJVUJmw==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/fetch-http-handler": "^5.2.1", -+ "@smithy/node-http-handler": "^4.2.1", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/smithy-client": "^4.6.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-stream": "^4.3.1", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/fetch-http-handler": "^5.3.0", ++ "@smithy/node-http-handler": "^4.3.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/smithy-client": "^4.7.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-stream": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -503,23 +500,23 @@ + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.888.0.tgz", -+ "integrity": "sha512-M82ItvS5yq+tO6ZOV1ruaVs2xOne+v8HW85GFCXnz8pecrzYdgxh6IsVqEbbWruryG/mUGkWMbkBZoEsy4MgyA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.907.0.tgz", ++ "integrity": "sha512-Clz1YdXrgQ5WIlcRE7odHbgM/INBxy49EA3csDITafHaDPtPRL39zkQtB5+Lwrrt/Gg0xBlyTbvP5Snan+0lqA==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/credential-provider-env": "3.888.0", -+ "@aws-sdk/credential-provider-http": "3.888.0", -+ "@aws-sdk/credential-provider-process": "3.888.0", -+ "@aws-sdk/credential-provider-sso": "3.888.0", -+ "@aws-sdk/credential-provider-web-identity": "3.888.0", -+ "@aws-sdk/nested-clients": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/credential-provider-imds": "^4.0.7", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/shared-ini-file-loader": "^4.0.5", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/credential-provider-env": "3.907.0", ++ "@aws-sdk/credential-provider-http": "3.907.0", ++ "@aws-sdk/credential-provider-process": "3.907.0", ++ "@aws-sdk/credential-provider-sso": "3.907.0", ++ "@aws-sdk/credential-provider-web-identity": "3.907.0", ++ "@aws-sdk/nested-clients": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/credential-provider-imds": "^4.2.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/shared-ini-file-loader": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -527,22 +524,22 @@ + } + }, + "node_modules/@aws-sdk/credential-provider-node": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.888.0.tgz", -+ "integrity": "sha512-KCrQh1dCDC8Y+Ap3SZa6S81kHk+p+yAaOQ5jC3dak4zhHW3RCrsGR/jYdemTOgbEGcA6ye51UbhWfrrlMmeJSA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.907.0.tgz", ++ "integrity": "sha512-w6Hhc4rV/CFaBliIh9Ph/T59xdGcTF6WmPGzzpykjl68+jcJyUem82hbTVIGaMCpvhx8VRqEr5AEXCXdbDbojw==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/credential-provider-env": "3.888.0", -+ "@aws-sdk/credential-provider-http": "3.888.0", -+ "@aws-sdk/credential-provider-ini": "3.888.0", -+ "@aws-sdk/credential-provider-process": "3.888.0", -+ "@aws-sdk/credential-provider-sso": "3.888.0", -+ "@aws-sdk/credential-provider-web-identity": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/credential-provider-imds": "^4.0.7", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/shared-ini-file-loader": "^4.0.5", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/credential-provider-env": "3.907.0", ++ "@aws-sdk/credential-provider-http": "3.907.0", ++ "@aws-sdk/credential-provider-ini": "3.907.0", ++ "@aws-sdk/credential-provider-process": "3.907.0", ++ "@aws-sdk/credential-provider-sso": "3.907.0", ++ "@aws-sdk/credential-provider-web-identity": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/credential-provider-imds": "^4.2.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/shared-ini-file-loader": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -550,16 +547,16 @@ + } + }, + "node_modules/@aws-sdk/credential-provider-process": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.888.0.tgz", -+ "integrity": "sha512-+aX6piSukPQ8DUS4JAH344GePg8/+Q1t0+kvSHAZHhYvtQ/1Zek3ySOJWH2TuzTPCafY4nmWLcQcqvU1w9+4Lw==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.907.0.tgz", ++ "integrity": "sha512-MBWpZqZtKkpM/LOGD5quXvlHJJN8YIP4GKo2ad8y1fEEVydwI8cggyXuauMPV7GllW8d0u3kQUs+4rxm1VaS4w==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/shared-ini-file-loader": "^4.0.5", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/shared-ini-file-loader": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -567,18 +564,18 @@ + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.888.0.tgz", -+ "integrity": "sha512-b1ZJji7LJ6E/j1PhFTyvp51in2iCOQ3VP6mj5H6f5OUnqn7efm41iNMoinKr87n0IKZw7qput5ggXVxEdPhouA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.907.0.tgz", ++ "integrity": "sha512-F8I7xwIt0mhdg8NrC70HDmhDRx3ValBvmWH3YkWsjZltWIFozhQCCDISRPhanMkXVhSFmZY0FJ5Lo+B/SZvAAA==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/client-sso": "3.888.0", -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/token-providers": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/shared-ini-file-loader": "^4.0.5", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/client-sso": "3.907.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/token-providers": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/shared-ini-file-loader": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -586,16 +583,17 @@ + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.888.0.tgz", -+ "integrity": "sha512-7P0QNtsDzMZdmBAaY/vY1BsZHwTGvEz3bsn2bm5VSKFAeMmZqsHK1QeYdNsFjLtegnVh+wodxMq50jqLv3LFlA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.907.0.tgz", ++ "integrity": "sha512-1CmRE/M8LJ/joXm5vUsKkQS35MoWA4xvUH9J1jyCuL3J9A8M+bnTe6ER8fnNLgmEs6ikdmYEIdfijPpBjBpFig==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/nested-clients": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/nested-clients": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/shared-ini-file-loader": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -603,17 +601,17 @@ + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.887.0.tgz", -+ "integrity": "sha512-qRCte/3MtNiMhPh4ZEGk9cHfAXq6IDTflvi2t1tkOIVZFyshkSCvNQNJrrE2D/ljVbOK1f3XbBDaF43EoQzIRQ==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.901.0.tgz", ++ "integrity": "sha512-mPF3N6eZlVs9G8aBSzvtoxR1RZqMo1aIwR+X8BAZSkhfj55fVF2no4IfPXfdFO3I66N+zEQ8nKoB0uTATWrogQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/util-arn-parser": "3.873.0", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-config-provider": "^4.0.0", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/util-arn-parser": "3.893.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -621,14 +619,14 @@ + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.887.0.tgz", -+ "integrity": "sha512-AlrTZZScDTG9SYeT82BC5cK/6Q4N0miN5xqMW/pbBqP3fNXlsdJOWKB+EKD3V6DV41EV5GVKHKe/1065xKSQ4w==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.901.0.tgz", ++ "integrity": "sha512-bwq9nj6MH38hlJwOY9QXIDwa6lI48UsaZpaXbdD71BljEIRlxDzfB4JaYb+ZNNK7RIAdzsP/K05mJty6KJAQHw==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -636,23 +634,23 @@ + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.888.0.tgz", -+ "integrity": "sha512-vdwd4wMAlXSg1bldhXyTsDSnyPP+bbEVihapejGKNd4gLfyyHwjTfbli+B/hEONGttQs5Dp54UMn8yW/UA189g==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.907.0.tgz", ++ "integrity": "sha512-rrJFVsaeGr+bYOzUO2ph9LihFPNq9wcdg/9gcDI3oC9LtOgKeidFgU4t9603WGKGc2eXf4MxzYnaf7LXDOnVvQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/is-array-buffer": "^4.0.0", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-stream": "^4.3.1", -+ "@smithy/util-utf8": "^4.1.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/is-array-buffer": "^4.2.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-stream": "^4.4.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -660,14 +658,14 @@ + } + }, + "node_modules/@aws-sdk/middleware-host-header": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.887.0.tgz", -+ "integrity": "sha512-ulzqXv6NNqdu/kr0sgBYupWmahISHY+azpJidtK6ZwQIC+vBUk9NdZeqQpy7KVhIk2xd4+5Oq9rxapPwPI21CA==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.901.0.tgz", ++ "integrity": "sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -675,13 +673,13 @@ + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.887.0.tgz", -+ "integrity": "sha512-eU/9Cq4gg2sS32bOomxdx2YF43kb+o70pMhnEBBnVVeqzE8co78SO5FQdWfRTfhNJgTyQ6Vgosx//CNMPIfZPg==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.901.0.tgz", ++ "integrity": "sha512-MuCS5R2ngNoYifkVt05CTULvYVWX0dvRT0/Md4jE3a0u0yMygYy31C1zorwfE/SUgAQXyLmUx8ATmPp9PppImQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -689,13 +687,13 @@ + } + }, + "node_modules/@aws-sdk/middleware-logger": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.887.0.tgz", -+ "integrity": "sha512-YbbgLI6jKp2qSoAcHnXrQ5jcuc5EYAmGLVFgMVdk8dfCfJLfGGSaOLxF4CXC7QYhO50s+mPPkhBYejCik02Kug==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.901.0.tgz", ++ "integrity": "sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -703,15 +701,15 @@ + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.887.0.tgz", -+ "integrity": "sha512-tjrUXFtQnFLo+qwMveq5faxP5MQakoLArXtqieHphSqZTXm21wDJM73hgT4/PQQGTwgYjDKqnqsE1hvk0hcfDw==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.901.0.tgz", ++ "integrity": "sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", ++ "@aws-sdk/types": "3.901.0", + "@aws/lambda-invoke-store": "^0.0.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -719,24 +717,24 @@ + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.888.0.tgz", -+ "integrity": "sha512-rKOFNfqgqOfrdcLGF8fcO75azWS2aq2ksRHFoIEFru5FJxzu/yDAhY4C2FKiP/X34xeIUS2SbE/gQgrgWHSN2g==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.907.0.tgz", ++ "integrity": "sha512-8VVxcZPmJOKI8P08v5ARvoXbLV41abpAIIkt388fp/lwtfzbnXt6sWhhAk/pHgvCR1NnuvkbGuXGVcux59648Q==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/util-arn-parser": "3.873.0", -+ "@smithy/core": "^3.11.0", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/signature-v4": "^5.1.3", -+ "@smithy/smithy-client": "^4.6.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-config-provider": "^4.0.0", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-stream": "^4.3.1", -+ "@smithy/util-utf8": "^4.1.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/util-arn-parser": "3.893.0", ++ "@smithy/core": "^3.14.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/signature-v4": "^5.3.0", ++ "@smithy/smithy-client": "^4.7.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-config-provider": "^4.2.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-stream": "^4.4.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -744,13 +742,13 @@ + } + }, + "node_modules/@aws-sdk/middleware-ssec": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.887.0.tgz", -+ "integrity": "sha512-1ixZks0IDkdac1hjPe4vdLSuD9HznkhblCEb4T0wNyw3Ee1fdXg+MlcPWywzG5zkPXLcIrULUzJg/OSYfaDXcQ==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.901.0.tgz", ++ "integrity": "sha512-YiLLJmA3RvjL38mFLuu8fhTTGWtp2qT24VqpucgfoyziYcTgIQkJJmKi90Xp6R6/3VcArqilyRgM1+x8i/em+Q==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -758,17 +756,17 @@ + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.888.0.tgz", -+ "integrity": "sha512-ZkcUkoys8AdrNNG7ATjqw2WiXqrhTvT+r4CIK3KhOqIGPHX0p0DQWzqjaIl7ZhSUToKoZ4Ud7MjF795yUr73oA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.907.0.tgz", ++ "integrity": "sha512-j/h3lk4X6AAXvusx/h8rr0zlo7G0l0quZM4k4rS/9jzatI53HCsrMaiGu6YXbxuVqtfMqv0MAj0MVhaMsAIs4A==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/util-endpoints": "3.887.0", -+ "@smithy/core": "^3.11.0", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/util-endpoints": "3.901.0", ++ "@smithy/core": "^3.14.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -776,48 +774,48 @@ + } + }, + "node_modules/@aws-sdk/nested-clients": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.888.0.tgz", -+ "integrity": "sha512-py4o4RPSGt+uwGvSBzR6S6cCBjS4oTX5F8hrHFHfPCdIOMVjyOBejn820jXkCrcdpSj3Qg1yUZXxsByvxc9Lyg==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.907.0.tgz", ++ "integrity": "sha512-LycXsdC5sMIc+Az5z1Mo2eYShr2kLo2gUgx7Rja3udG0GdqgdR/NNJ6ArmDCeKk2O5RFS5EgEg89bT55ecl5Uw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/middleware-host-header": "3.887.0", -+ "@aws-sdk/middleware-logger": "3.887.0", -+ "@aws-sdk/middleware-recursion-detection": "3.887.0", -+ "@aws-sdk/middleware-user-agent": "3.888.0", -+ "@aws-sdk/region-config-resolver": "3.887.0", -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/util-endpoints": "3.887.0", -+ "@aws-sdk/util-user-agent-browser": "3.887.0", -+ "@aws-sdk/util-user-agent-node": "3.888.0", -+ "@smithy/config-resolver": "^4.2.1", -+ "@smithy/core": "^3.11.0", -+ "@smithy/fetch-http-handler": "^5.2.1", -+ "@smithy/hash-node": "^4.1.1", -+ "@smithy/invalid-dependency": "^4.1.1", -+ "@smithy/middleware-content-length": "^4.1.1", -+ "@smithy/middleware-endpoint": "^4.2.1", -+ "@smithy/middleware-retry": "^4.2.1", -+ "@smithy/middleware-serde": "^4.1.1", -+ "@smithy/middleware-stack": "^4.1.1", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/node-http-handler": "^4.2.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/smithy-client": "^4.6.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/url-parser": "^4.1.1", -+ "@smithy/util-base64": "^4.1.0", -+ "@smithy/util-body-length-browser": "^4.1.0", -+ "@smithy/util-body-length-node": "^4.1.0", -+ "@smithy/util-defaults-mode-browser": "^4.1.1", -+ "@smithy/util-defaults-mode-node": "^4.1.1", -+ "@smithy/util-endpoints": "^3.1.1", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-retry": "^4.1.1", -+ "@smithy/util-utf8": "^4.1.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/middleware-host-header": "3.901.0", ++ "@aws-sdk/middleware-logger": "3.901.0", ++ "@aws-sdk/middleware-recursion-detection": "3.901.0", ++ "@aws-sdk/middleware-user-agent": "3.907.0", ++ "@aws-sdk/region-config-resolver": "3.901.0", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/util-endpoints": "3.901.0", ++ "@aws-sdk/util-user-agent-browser": "3.907.0", ++ "@aws-sdk/util-user-agent-node": "3.907.0", ++ "@smithy/config-resolver": "^4.3.0", ++ "@smithy/core": "^3.14.0", ++ "@smithy/fetch-http-handler": "^5.3.0", ++ "@smithy/hash-node": "^4.2.0", ++ "@smithy/invalid-dependency": "^4.2.0", ++ "@smithy/middleware-content-length": "^4.2.0", ++ "@smithy/middleware-endpoint": "^4.3.0", ++ "@smithy/middleware-retry": "^4.4.0", ++ "@smithy/middleware-serde": "^4.2.0", ++ "@smithy/middleware-stack": "^4.2.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/node-http-handler": "^4.3.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/smithy-client": "^4.7.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/url-parser": "^4.2.0", ++ "@smithy/util-base64": "^4.2.0", ++ "@smithy/util-body-length-browser": "^4.2.0", ++ "@smithy/util-body-length-node": "^4.2.0", ++ "@smithy/util-defaults-mode-browser": "^4.2.0", ++ "@smithy/util-defaults-mode-node": "^4.2.0", ++ "@smithy/util-endpoints": "^3.2.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-retry": "^4.2.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -825,16 +823,16 @@ + } + }, + "node_modules/@aws-sdk/region-config-resolver": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.887.0.tgz", -+ "integrity": "sha512-VdSMrIqJ3yjJb/fY+YAxrH/lCVv0iL8uA+lbMNfQGtO5tB3Zx6SU9LEpUwBNX8fPK1tUpI65CNE4w42+MY/7Mg==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.901.0.tgz", ++ "integrity": "sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-config-provider": "^4.0.0", -+ "@smithy/util-middleware": "^4.1.1", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-config-provider": "^4.2.0", ++ "@smithy/util-middleware": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -842,19 +840,19 @@ + } + }, + "node_modules/@aws-sdk/s3-presigned-post": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/s3-presigned-post/-/s3-presigned-post-3.888.0.tgz", -+ "integrity": "sha512-gY8cmB2eR9o4a0Y3Eshfe9LTJLXH1PELH9Rdc7hr4UNubIu4QbBI6HIXOv39HwQpil1q9SXUTSpuKbZG4DhxGQ==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/s3-presigned-post/-/s3-presigned-post-3.907.0.tgz", ++ "integrity": "sha512-W0cww42neycyUN6hIV1Oe+sRShd9VokuhFGYagHR6EsmYSjMMcIBZ7xSAypBVIODzjgeq+YVUPmZTv/6s9bzZg==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/client-s3": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/util-format-url": "3.887.0", -+ "@smithy/middleware-endpoint": "^4.2.1", -+ "@smithy/signature-v4": "^5.1.3", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-hex-encoding": "^4.0.0", -+ "@smithy/util-utf8": "^4.1.0", ++ "@aws-sdk/client-s3": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/util-format-url": "3.901.0", ++ "@smithy/middleware-endpoint": "^4.3.0", ++ "@smithy/signature-v4": "^5.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-hex-encoding": "^4.2.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -862,18 +860,18 @@ + } + }, + "node_modules/@aws-sdk/s3-request-presigner": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.888.0.tgz", -+ "integrity": "sha512-3VAF0tJxW0p/ttUzJEgrMe52zZVoEG9dcJGdp4N0RG+LD41lp7QuQEYAZ/LGn7mwJsT0q18+tEJ5XzKmJFrOiA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.907.0.tgz", ++ "integrity": "sha512-7RZH4fhCRVq8bacAZd6x+Ko04cmV+Zq4Axk1HZqL3epZ+r4HLR/0NklYZjr/dqMlMx9VbexzNkpBY1VgWxOSyQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/signature-v4-multi-region": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@aws-sdk/util-format-url": "3.887.0", -+ "@smithy/middleware-endpoint": "^4.2.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/smithy-client": "^4.6.1", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/signature-v4-multi-region": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@aws-sdk/util-format-url": "3.901.0", ++ "@smithy/middleware-endpoint": "^4.3.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/smithy-client": "^4.7.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -881,16 +879,16 @@ + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.888.0.tgz", -+ "integrity": "sha512-FmOHUaJzEhqfcpyh0L7HLwYcYopK13Dbmuf+oUyu56/RoeB1nLnltH1VMQVj8v3Am2IwlGR+/JpFyrdkErN+cA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.907.0.tgz", ++ "integrity": "sha512-f5XHRu6MTbjB/ud5RwBZzntYMgThRaDur5PJRZ1CaYAL8gZLNuEpJLzUA7o3queeSfE9JboO+cm1gZnOfnYJkg==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/middleware-sdk-s3": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/signature-v4": "^5.1.3", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/middleware-sdk-s3": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/signature-v4": "^5.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -898,17 +896,17 @@ + } + }, + "node_modules/@aws-sdk/token-providers": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.888.0.tgz", -+ "integrity": "sha512-WA3NF+3W8GEuCMG1WvkDYbB4z10G3O8xuhT7QSjhvLYWQ9CPt3w4VpVIfdqmUn131TCIbhCzD0KN/1VJTjAjyw==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.907.0.tgz", ++ "integrity": "sha512-HjPbNft1Ad8X1lHQG21QXy9pitdXA+OKH6NtcXg57A31002tM+SkyUmU6ty1jbsRBEScxziIVe5doI1NmkHheA==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/core": "3.888.0", -+ "@aws-sdk/nested-clients": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/property-provider": "^4.0.5", -+ "@smithy/shared-ini-file-loader": "^4.0.5", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/core": "3.907.0", ++ "@aws-sdk/nested-clients": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/shared-ini-file-loader": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -916,12 +914,12 @@ + } + }, + "node_modules/@aws-sdk/types": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.887.0.tgz", -+ "integrity": "sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.901.0.tgz", ++ "integrity": "sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -929,9 +927,9 @@ + } + }, + "node_modules/@aws-sdk/util-arn-parser": { -+ "version": "3.873.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.873.0.tgz", -+ "integrity": "sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==", ++ "version": "3.893.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", ++ "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -941,15 +939,15 @@ + } + }, + "node_modules/@aws-sdk/util-endpoints": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.887.0.tgz", -+ "integrity": "sha512-kpegvT53KT33BMeIcGLPA65CQVxLUL/C3gTz9AzlU/SDmeusBHX4nRApAicNzI/ltQ5lxZXbQn18UczzBuwF1w==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.901.0.tgz", ++ "integrity": "sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/types": "^4.5.0", -+ "@smithy/url-parser": "^4.1.1", -+ "@smithy/util-endpoints": "^3.1.1", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/url-parser": "^4.2.0", ++ "@smithy/util-endpoints": "^3.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -957,14 +955,14 @@ + } + }, + "node_modules/@aws-sdk/util-format-url": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.887.0.tgz", -+ "integrity": "sha512-ABDSP6KsrdD+JC7qwMqUpLXqPidvfgT+Q+W8sGGuk/IBy7smgZDOdYSZLE4VBbQpH3N/zSJuslAWhL2x37Qwww==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.901.0.tgz", ++ "integrity": "sha512-GGUnJKrh3OF1F3YRSWtwPLbN904Fcfxf03gujyq1rcrDRPEkzoZB+2BzNkB27SsU6lAlwNq+4aRlZRVUloPiag==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/querystring-builder": "^4.1.1", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/querystring-builder": "^4.2.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -972,9 +970,9 @@ + } + }, + "node_modules/@aws-sdk/util-locate-window": { -+ "version": "3.873.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz", -+ "integrity": "sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==", ++ "version": "3.893.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", ++ "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -984,27 +982,27 @@ + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.887.0.tgz", -+ "integrity": "sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.907.0.tgz", ++ "integrity": "sha512-Hus/2YCQmtCEfr4Ls88d07Q99Ex59uvtktiPTV963Q7w7LHuIT/JBjrbwNxtSm2KlJR9PHNdqxwN+fSuNsMGMQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/types": "^4.6.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { -+ "version": "3.888.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.888.0.tgz", -+ "integrity": "sha512-rSB3OHyuKXotIGfYEo//9sU0lXAUrTY28SUUnxzOGYuQsAt0XR5iYwBAp+RjV6x8f+Hmtbg0PdCsy1iNAXa0UQ==", ++ "version": "3.907.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.907.0.tgz", ++ "integrity": "sha512-r2Bc8VCU6ymkuem+QWT6oDdGvaYnK0YHg77SGUF47k+JsztSt1kZR0Y0q8jRH97bOsXldThyEcYsNbqDERa1Uw==", + "license": "Apache-2.0", + "dependencies": { -+ "@aws-sdk/middleware-user-agent": "3.888.0", -+ "@aws-sdk/types": "3.887.0", -+ "@smithy/node-config-provider": "^4.2.1", -+ "@smithy/types": "^4.5.0", ++ "@aws-sdk/middleware-user-agent": "3.907.0", ++ "@aws-sdk/types": "3.901.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -1020,12 +1018,13 @@ + } + }, + "node_modules/@aws-sdk/xml-builder": { -+ "version": "3.887.0", -+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.887.0.tgz", -+ "integrity": "sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==", ++ "version": "3.901.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.901.0.tgz", ++ "integrity": "sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", ++ "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { @@ -1105,9 +1104,9 @@ + } + }, + "node_modules/@esbuild/aix-ppc64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", -+ "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", ++ "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], @@ -1122,9 +1121,9 @@ + } + }, + "node_modules/@esbuild/android-arm": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", -+ "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", ++ "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], @@ -1139,9 +1138,9 @@ + } + }, + "node_modules/@esbuild/android-arm64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", -+ "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", ++ "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], @@ -1156,9 +1155,9 @@ + } + }, + "node_modules/@esbuild/android-x64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", -+ "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", ++ "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], @@ -1173,9 +1172,9 @@ + } + }, + "node_modules/@esbuild/darwin-arm64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", -+ "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", ++ "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], @@ -1190,9 +1189,9 @@ + } + }, + "node_modules/@esbuild/darwin-x64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", -+ "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", ++ "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], @@ -1207,9 +1206,9 @@ + } + }, + "node_modules/@esbuild/freebsd-arm64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", -+ "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", ++ "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], @@ -1224,9 +1223,9 @@ + } + }, + "node_modules/@esbuild/freebsd-x64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", -+ "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", ++ "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], @@ -1241,9 +1240,9 @@ + } + }, + "node_modules/@esbuild/linux-arm": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", -+ "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", ++ "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], @@ -1258,9 +1257,9 @@ + } + }, + "node_modules/@esbuild/linux-arm64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", -+ "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", ++ "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], @@ -1275,9 +1274,9 @@ + } + }, + "node_modules/@esbuild/linux-ia32": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", -+ "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", ++ "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], @@ -1292,9 +1291,9 @@ + } + }, + "node_modules/@esbuild/linux-loong64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", -+ "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", ++ "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], @@ -1309,9 +1308,9 @@ + } + }, + "node_modules/@esbuild/linux-mips64el": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", -+ "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", ++ "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], @@ -1326,9 +1325,9 @@ + } + }, + "node_modules/@esbuild/linux-ppc64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", -+ "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", ++ "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], @@ -1343,9 +1342,9 @@ + } + }, + "node_modules/@esbuild/linux-riscv64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", -+ "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", ++ "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], @@ -1360,9 +1359,9 @@ + } + }, + "node_modules/@esbuild/linux-s390x": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", -+ "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", ++ "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], @@ -1377,9 +1376,9 @@ + } + }, + "node_modules/@esbuild/linux-x64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", -+ "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", ++ "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], @@ -1394,9 +1393,9 @@ + } + }, + "node_modules/@esbuild/netbsd-arm64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", -+ "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", ++ "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], @@ -1411,9 +1410,9 @@ + } + }, + "node_modules/@esbuild/netbsd-x64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", -+ "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", ++ "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], @@ -1428,9 +1427,9 @@ + } + }, + "node_modules/@esbuild/openbsd-arm64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", -+ "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", ++ "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], @@ -1445,9 +1444,9 @@ + } + }, + "node_modules/@esbuild/openbsd-x64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", -+ "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", ++ "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], @@ -1462,9 +1461,9 @@ + } + }, + "node_modules/@esbuild/openharmony-arm64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", -+ "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", ++ "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], @@ -1479,9 +1478,9 @@ + } + }, + "node_modules/@esbuild/sunos-x64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", -+ "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", ++ "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], @@ -1496,9 +1495,9 @@ + } + }, + "node_modules/@esbuild/win32-arm64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", -+ "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", ++ "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], @@ -1513,9 +1512,9 @@ + } + }, + "node_modules/@esbuild/win32-ia32": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", -+ "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", ++ "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], @@ -1530,9 +1529,9 @@ + } + }, + "node_modules/@esbuild/win32-x64": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", -+ "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", ++ "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], @@ -1615,18 +1614,36 @@ + } + }, + "node_modules/@grpc/grpc-js": { -+ "version": "1.13.4", -+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", -+ "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", ++ "version": "1.14.0", ++ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.0.tgz", ++ "integrity": "sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==", + "license": "Apache-2.0", + "dependencies": { -+ "@grpc/proto-loader": "^0.7.13", ++ "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, ++ "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { ++ "version": "0.8.0", ++ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", ++ "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "lodash.camelcase": "^4.3.0", ++ "long": "^5.0.0", ++ "protobufjs": "^7.5.3", ++ "yargs": "^17.7.2" ++ }, ++ "bin": { ++ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" ++ }, ++ "engines": { ++ "node": ">=6" ++ } ++ }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", @@ -3876,6 +3893,187 @@ + } + } + }, ++ "node_modules/@radix-ui/react-toast": { ++ "version": "1.2.15", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", ++ "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-collection": "1.1.7", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-dismissable-layer": "1.1.11", ++ "@radix-ui/react-portal": "1.1.9", ++ "@radix-ui/react-presence": "1.1.5", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "@radix-ui/react-use-controllable-state": "1.2.2", ++ "@radix-ui/react-use-layout-effect": "1.1.1", ++ "@radix-ui/react-visually-hidden": "1.2.3" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "@types/react-dom": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", ++ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ }, ++ "@types/react-dom": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-collection": { ++ "version": "1.1.7", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", ++ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-slot": "1.2.3" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "@types/react-dom": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", ++ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ }, ++ "@types/react-dom": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-dismissable-layer": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", ++ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "@radix-ui/react-use-escape-keydown": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "@types/react-dom": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", ++ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ }, ++ "@types/react-dom": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-portal": { ++ "version": "1.1.9", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", ++ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "@types/react-dom": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", ++ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ }, ++ "@types/react-dom": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-presence": { ++ "version": "1.1.5", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", ++ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "@types/react-dom": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", ++ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ }, ++ "@types/react-dom": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-primitive": { ++ "version": "2.1.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", ++ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-slot": "1.2.3" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "@types/react-dom": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", ++ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ }, ++ "@types/react-dom": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-visually-hidden": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", ++ "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-primitive": "2.1.3" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "@types/react-dom": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", ++ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ }, ++ "@types/react-dom": { ++ "optional": true ++ } ++ } ++ }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", @@ -4046,9 +4244,9 @@ + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz", -+ "integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", ++ "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], @@ -4059,9 +4257,9 @@ + ] + }, + "node_modules/@rollup/rollup-android-arm64": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz", -+ "integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", ++ "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], @@ -4072,9 +4270,9 @@ + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz", -+ "integrity": "sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", ++ "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], @@ -4085,9 +4283,9 @@ + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz", -+ "integrity": "sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", ++ "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], @@ -4098,9 +4296,9 @@ + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz", -+ "integrity": "sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", ++ "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], @@ -4111,9 +4309,9 @@ + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz", -+ "integrity": "sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", ++ "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], @@ -4124,9 +4322,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz", -+ "integrity": "sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", ++ "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], @@ -4137,9 +4335,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz", -+ "integrity": "sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", ++ "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], @@ -4150,9 +4348,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz", -+ "integrity": "sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", ++ "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], @@ -4163,9 +4361,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz", -+ "integrity": "sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", ++ "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], @@ -4176,9 +4374,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz", -+ "integrity": "sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", ++ "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], @@ -4189,9 +4387,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz", -+ "integrity": "sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", ++ "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], @@ -4202,9 +4400,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz", -+ "integrity": "sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", ++ "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], @@ -4215,9 +4413,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz", -+ "integrity": "sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", ++ "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], @@ -4228,9 +4426,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz", -+ "integrity": "sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", ++ "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], @@ -4241,9 +4439,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz", -+ "integrity": "sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", ++ "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], @@ -4254,9 +4452,9 @@ + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz", -+ "integrity": "sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", ++ "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], @@ -4267,9 +4465,9 @@ + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz", -+ "integrity": "sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", ++ "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], @@ -4280,9 +4478,9 @@ + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz", -+ "integrity": "sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", ++ "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], @@ -4293,9 +4491,9 @@ + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz", -+ "integrity": "sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", ++ "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], @@ -4305,10 +4503,23 @@ + "win32" + ] + }, ++ "node_modules/@rollup/rollup-win32-x64-gnu": { ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", ++ "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "win32" ++ ] ++ }, + "node_modules/@rollup/rollup-win32-x64-msvc": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz", -+ "integrity": "sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", ++ "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], @@ -4372,12 +4583,12 @@ + "license": "MIT" + }, + "node_modules/@smithy/abort-controller": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.1.tgz", -+ "integrity": "sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.0.tgz", ++ "integrity": "sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4385,9 +4596,9 @@ + } + }, + "node_modules/@smithy/chunked-blob-reader": { -+ "version": "5.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.1.0.tgz", -+ "integrity": "sha512-a36AtR7Q7XOhRPt6F/7HENmTWcB8kN7mDJcOFM/+FuKO6x88w8MQJfYCufMWh4fGyVkPjUh3Rrz/dnqFQdo6OQ==", ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", ++ "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -4397,12 +4608,12 @@ + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.1.0.tgz", -+ "integrity": "sha512-Bnv0B3nSlfB2mPO0WgM49I/prl7+kamF042rrf3ezJ3Z4C7csPYvyYgZfXTGXwXfj1mAwDWjE/ybIf49PzFzvA==", ++ "version": "4.2.1", ++ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", ++ "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/util-base64": "^4.1.0", ++ "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4410,15 +4621,15 @@ + } + }, + "node_modules/@smithy/config-resolver": { -+ "version": "4.2.2", -+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.2.2.tgz", -+ "integrity": "sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==", ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.3.0.tgz", ++ "integrity": "sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/node-config-provider": "^4.2.2", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-config-provider": "^4.1.0", -+ "@smithy/util-middleware": "^4.1.1", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-config-provider": "^4.2.0", ++ "@smithy/util-middleware": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4426,37 +4637,36 @@ + } + }, + "node_modules/@smithy/core": { -+ "version": "3.11.0", -+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.11.0.tgz", -+ "integrity": "sha512-Abs5rdP1o8/OINtE49wwNeWuynCu0kme1r4RI3VXVrHr4odVDG7h7mTnw1WXXfN5Il+c25QOnrdL2y56USfxkA==", ++ "version": "3.15.0", ++ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.15.0.tgz", ++ "integrity": "sha512-VJWncXgt+ExNn0U2+Y7UywuATtRYaodGQKFo9mDyh70q+fJGedfrqi2XuKU1BhiLeXgg6RZrW7VEKfeqFhHAJA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/middleware-serde": "^4.1.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-base64": "^4.1.0", -+ "@smithy/util-body-length-browser": "^4.1.0", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-stream": "^4.3.1", -+ "@smithy/util-utf8": "^4.1.0", -+ "@types/uuid": "^9.0.1", -+ "tslib": "^2.6.2", -+ "uuid": "^9.0.1" ++ "@smithy/middleware-serde": "^4.2.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-base64": "^4.3.0", ++ "@smithy/util-body-length-browser": "^4.2.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-stream": "^4.5.0", ++ "@smithy/util-utf8": "^4.2.0", ++ "@smithy/uuid": "^1.1.0", ++ "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { -+ "version": "4.1.2", -+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz", -+ "integrity": "sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.0.tgz", ++ "integrity": "sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/node-config-provider": "^4.2.2", -+ "@smithy/property-provider": "^4.1.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/url-parser": "^4.1.1", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/url-parser": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4464,14 +4674,14 @@ + } + }, + "node_modules/@smithy/eventstream-codec": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.1.1.tgz", -+ "integrity": "sha512-PwkQw1hZwHTQB6X5hSUWz2OSeuj5Z6enWuAqke7DgWoP3t6vg3ktPpqPz3Erkn6w+tmsl8Oss6nrgyezoea2Iw==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.0.tgz", ++ "integrity": "sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-hex-encoding": "^4.1.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4479,13 +4689,13 @@ + } + }, + "node_modules/@smithy/eventstream-serde-browser": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.1.1.tgz", -+ "integrity": "sha512-Q9QWdAzRaIuVkefupRPRFAasaG/droBqn1feiMnmLa+LLEUG45pqX1+FurHFmlqiCfobB3nUlgoJfeXZsr7MPA==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.0.tgz", ++ "integrity": "sha512-U53p7fcrk27k8irLhOwUu+UYnBqsXNLKl1XevOpsxK3y1Lndk8R7CSiZV6FN3fYFuTPuJy5pP6qa/bjDzEkRvA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/eventstream-serde-universal": "^4.1.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/eventstream-serde-universal": "^4.2.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4493,12 +4703,12 @@ + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { -+ "version": "4.2.1", -+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.2.1.tgz", -+ "integrity": "sha512-oSUkF9zDN9zcOUBMtxp8RewJlh71E9NoHWU8jE3hU9JMYCsmW4assVTpgic/iS3/dM317j6hO5x18cc3XrfvEw==", ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.0.tgz", ++ "integrity": "sha512-uwx54t8W2Yo9Jr3nVF5cNnkAAnMCJ8Wrm+wDlQY6rY/IrEgZS3OqagtCu/9ceIcZFQ1zVW/zbN9dxb5esuojfA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4506,13 +4716,13 @@ + } + }, + "node_modules/@smithy/eventstream-serde-node": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.1.1.tgz", -+ "integrity": "sha512-tn6vulwf/ScY0vjhzptSJuDJJqlhNtUjkxJ4wiv9E3SPoEqTEKbaq6bfqRO7nvhTG29ALICRcvfFheOUPl8KNA==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.0.tgz", ++ "integrity": "sha512-yjM2L6QGmWgJjVu/IgYd6hMzwm/tf4VFX0lm8/SvGbGBwc+aFl3hOzvO/e9IJ2XI+22Tx1Zg3vRpFRs04SWFcg==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/eventstream-serde-universal": "^4.1.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/eventstream-serde-universal": "^4.2.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4520,13 +4730,13 @@ + } + }, + "node_modules/@smithy/eventstream-serde-universal": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.1.1.tgz", -+ "integrity": "sha512-uLOAiM/Dmgh2CbEXQx+6/ssK7fbzFhd+LjdyFxXid5ZBCbLHTFHLdD/QbXw5aEDsLxQhgzDxLLsZhsftAYwHJA==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.0.tgz", ++ "integrity": "sha512-C3jxz6GeRzNyGKhU7oV656ZbuHY93mrfkT12rmjDdZch142ykjn8do+VOkeRNjSGKw01p4g+hdalPYPhmMwk1g==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/eventstream-codec": "^4.1.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/eventstream-codec": "^4.2.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4534,15 +4744,15 @@ + } + }, + "node_modules/@smithy/fetch-http-handler": { -+ "version": "5.2.1", -+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.1.tgz", -+ "integrity": "sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==", ++ "version": "5.3.1", ++ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.1.tgz", ++ "integrity": "sha512-3AvYYbB+Dv5EPLqnJIAgYw/9+WzeBiUYS8B+rU0pHq5NMQMvrZmevUROS4V2GAt0jEOn9viBzPLrZE+riTNd5Q==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/querystring-builder": "^4.1.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-base64": "^4.1.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/querystring-builder": "^4.2.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4550,14 +4760,14 @@ + } + }, + "node_modules/@smithy/hash-blob-browser": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.1.1.tgz", -+ "integrity": "sha512-avAtk++s1e/1VODf+rg7c9R2pB5G9y8yaJaGY4lPZI2+UIqVyuSDMikWjeWfBVmFZ3O7NpDxBbUCyGhThVUKWQ==", ++ "version": "4.2.1", ++ "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.1.tgz", ++ "integrity": "sha512-Os9cg1fTXMwuqbvjemELlf+HB5oEeVyZmYsTbAtDQBmjGyibjmbeeqcaw7xOJLIHrkH/u0wAYabNcN6FRTqMRg==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/chunked-blob-reader": "^5.1.0", -+ "@smithy/chunked-blob-reader-native": "^4.1.0", -+ "@smithy/types": "^4.5.0", ++ "@smithy/chunked-blob-reader": "^5.2.0", ++ "@smithy/chunked-blob-reader-native": "^4.2.1", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4565,14 +4775,14 @@ + } + }, + "node_modules/@smithy/hash-node": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.1.1.tgz", -+ "integrity": "sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.0.tgz", ++ "integrity": "sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-buffer-from": "^4.1.0", -+ "@smithy/util-utf8": "^4.1.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-buffer-from": "^4.2.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4580,13 +4790,13 @@ + } + }, + "node_modules/@smithy/hash-stream-node": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.1.1.tgz", -+ "integrity": "sha512-3ztT4pV0Moazs3JAYFdfKk11kYFDo4b/3R3+xVjIm6wY9YpJf+xfz+ocEnNKcWAdcmSMqi168i2EMaKmJHbJMA==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.0.tgz", ++ "integrity": "sha512-8dELAuGv+UEjtzrpMeNBZc1sJhO8GxFVV/Yh21wE35oX4lOE697+lsMHBoUIFAUuYkTMIeu0EuJSEsH7/8Y+UQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-utf8": "^4.1.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4594,12 +4804,12 @@ + } + }, + "node_modules/@smithy/invalid-dependency": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.1.1.tgz", -+ "integrity": "sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.0.tgz", ++ "integrity": "sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4607,9 +4817,9 @@ + } + }, + "node_modules/@smithy/is-array-buffer": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.1.0.tgz", -+ "integrity": "sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", ++ "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -4619,13 +4829,13 @@ + } + }, + "node_modules/@smithy/md5-js": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.1.1.tgz", -+ "integrity": "sha512-MvWXKK743BuHjr/hnWuT6uStdKEaoqxHAQUvbKJPPZM5ZojTNFI5D+47BoQfBE5RgGlRRty05EbWA+NXDv+hIA==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.0.tgz", ++ "integrity": "sha512-LFEPniXGKRQArFmDQ3MgArXlClFJMsXDteuQQY8WG1/zzv6gVSo96+qpkuu1oJp4MZsKrwchY0cuAoPKzEbaNA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-utf8": "^4.1.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4633,13 +4843,13 @@ + } + }, + "node_modules/@smithy/middleware-content-length": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.1.1.tgz", -+ "integrity": "sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.0.tgz", ++ "integrity": "sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4647,18 +4857,18 @@ + } + }, + "node_modules/@smithy/middleware-endpoint": { -+ "version": "4.2.2", -+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.2.tgz", -+ "integrity": "sha512-M51KcwD+UeSOFtpALGf5OijWt915aQT5eJhqnMKJt7ZTfDfNcvg2UZgIgTZUoiORawb6o5lk4n3rv7vnzQXgsA==", ++ "version": "4.3.1", ++ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.1.tgz", ++ "integrity": "sha512-JtM4SjEgImLEJVXdsbvWHYiJ9dtuKE8bqLlvkvGi96LbejDL6qnVpVxEFUximFodoQbg0Gnkyff9EKUhFhVJFw==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/core": "^3.11.0", -+ "@smithy/middleware-serde": "^4.1.1", -+ "@smithy/node-config-provider": "^4.2.2", -+ "@smithy/shared-ini-file-loader": "^4.2.0", -+ "@smithy/types": "^4.5.0", -+ "@smithy/url-parser": "^4.1.1", -+ "@smithy/util-middleware": "^4.1.1", ++ "@smithy/core": "^3.15.0", ++ "@smithy/middleware-serde": "^4.2.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/shared-ini-file-loader": "^4.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/url-parser": "^4.2.0", ++ "@smithy/util-middleware": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4666,34 +4876,33 @@ + } + }, + "node_modules/@smithy/middleware-retry": { -+ "version": "4.2.2", -+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.2.tgz", -+ "integrity": "sha512-KZJueEOO+PWqflv2oGx9jICpHdBYXwCI19j7e2V3IMwKgFcXc9D9q/dsTf4B+uCnYxjNoS1jpyv6pGNGRsKOXA==", ++ "version": "4.4.1", ++ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.1.tgz", ++ "integrity": "sha512-wXxS4ex8cJJteL0PPQmWYkNi9QKDWZIpsndr0wZI2EL+pSSvA/qqxXU60gBOJoIc2YgtZSWY/PE86qhKCCKP1w==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/node-config-provider": "^4.2.2", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/service-error-classification": "^4.1.1", -+ "@smithy/smithy-client": "^4.6.2", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-retry": "^4.1.1", -+ "@types/uuid": "^9.0.1", -+ "tslib": "^2.6.2", -+ "uuid": "^9.0.1" ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/service-error-classification": "^4.2.0", ++ "@smithy/smithy-client": "^4.7.1", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-retry": "^4.2.0", ++ "@smithy/uuid": "^1.1.0", ++ "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz", -+ "integrity": "sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.0.tgz", ++ "integrity": "sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4701,12 +4910,12 @@ + } + }, + "node_modules/@smithy/middleware-stack": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.1.1.tgz", -+ "integrity": "sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.0.tgz", ++ "integrity": "sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4714,14 +4923,14 @@ + } + }, + "node_modules/@smithy/node-config-provider": { -+ "version": "4.2.2", -+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.2.2.tgz", -+ "integrity": "sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==", ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.0.tgz", ++ "integrity": "sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/property-provider": "^4.1.1", -+ "@smithy/shared-ini-file-loader": "^4.2.0", -+ "@smithy/types": "^4.5.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/shared-ini-file-loader": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4729,15 +4938,15 @@ + } + }, + "node_modules/@smithy/node-http-handler": { -+ "version": "4.2.1", -+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.2.1.tgz", -+ "integrity": "sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==", ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.3.0.tgz", ++ "integrity": "sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/abort-controller": "^4.1.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/querystring-builder": "^4.1.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/abort-controller": "^4.2.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/querystring-builder": "^4.2.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4745,12 +4954,12 @@ + } + }, + "node_modules/@smithy/property-provider": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.1.1.tgz", -+ "integrity": "sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.0.tgz", ++ "integrity": "sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4758,12 +4967,12 @@ + } + }, + "node_modules/@smithy/protocol-http": { -+ "version": "5.2.1", -+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.2.1.tgz", -+ "integrity": "sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==", ++ "version": "5.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.0.tgz", ++ "integrity": "sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4771,13 +4980,13 @@ + } + }, + "node_modules/@smithy/querystring-builder": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.1.1.tgz", -+ "integrity": "sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.0.tgz", ++ "integrity": "sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-uri-escape": "^4.1.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4785,12 +4994,12 @@ + } + }, + "node_modules/@smithy/querystring-parser": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.1.1.tgz", -+ "integrity": "sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.0.tgz", ++ "integrity": "sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4798,24 +5007,24 @@ + } + }, + "node_modules/@smithy/service-error-classification": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.1.tgz", -+ "integrity": "sha512-Iam75b/JNXyDE41UvrlM6n8DNOa/r1ylFyvgruTUx7h2Uk7vDNV9AAwP1vfL1fOL8ls0xArwEGVcGZVd7IO/Cw==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.0.tgz", ++ "integrity": "sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0" ++ "@smithy/types": "^4.6.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { -+ "version": "4.2.0", -+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.2.0.tgz", -+ "integrity": "sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==", ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.0.tgz", ++ "integrity": "sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4823,18 +5032,18 @@ + } + }, + "node_modules/@smithy/signature-v4": { -+ "version": "5.2.1", -+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.2.1.tgz", -+ "integrity": "sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==", ++ "version": "5.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.0.tgz", ++ "integrity": "sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/is-array-buffer": "^4.1.0", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-hex-encoding": "^4.1.0", -+ "@smithy/util-middleware": "^4.1.1", -+ "@smithy/util-uri-escape": "^4.1.0", -+ "@smithy/util-utf8": "^4.1.0", ++ "@smithy/is-array-buffer": "^4.2.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-hex-encoding": "^4.2.0", ++ "@smithy/util-middleware": "^4.2.0", ++ "@smithy/util-uri-escape": "^4.2.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4842,17 +5051,17 @@ + } + }, + "node_modules/@smithy/smithy-client": { -+ "version": "4.6.2", -+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.2.tgz", -+ "integrity": "sha512-u82cjh/x7MlMat76Z38TRmEcG6JtrrxN4N2CSNG5o2v2S3hfLAxRgSgFqf0FKM3dglH41Evknt/HOX+7nfzZ3g==", ++ "version": "4.7.1", ++ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.7.1.tgz", ++ "integrity": "sha512-WXVbiyNf/WOS/RHUoFMkJ6leEVpln5ojCjNBnzoZeMsnCg3A0BRhLK3WYc4V7PmYcYPZh9IYzzAg9XcNSzYxYQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/core": "^3.11.0", -+ "@smithy/middleware-endpoint": "^4.2.2", -+ "@smithy/middleware-stack": "^4.1.1", -+ "@smithy/protocol-http": "^5.2.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-stream": "^4.3.1", ++ "@smithy/core": "^3.15.0", ++ "@smithy/middleware-endpoint": "^4.3.1", ++ "@smithy/middleware-stack": "^4.2.0", ++ "@smithy/protocol-http": "^5.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-stream": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4860,9 +5069,9 @@ + } + }, + "node_modules/@smithy/types": { -+ "version": "4.5.0", -+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.5.0.tgz", -+ "integrity": "sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==", ++ "version": "4.6.0", ++ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.6.0.tgz", ++ "integrity": "sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -4872,13 +5081,13 @@ + } + }, + "node_modules/@smithy/url-parser": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.1.1.tgz", -+ "integrity": "sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.0.tgz", ++ "integrity": "sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/querystring-parser": "^4.1.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/querystring-parser": "^4.2.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4886,13 +5095,13 @@ + } + }, + "node_modules/@smithy/util-base64": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.1.0.tgz", -+ "integrity": "sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==", ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", ++ "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/util-buffer-from": "^4.1.0", -+ "@smithy/util-utf8": "^4.1.0", ++ "@smithy/util-buffer-from": "^4.2.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4900,9 +5109,9 @@ + } + }, + "node_modules/@smithy/util-body-length-browser": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz", -+ "integrity": "sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", ++ "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -4912,9 +5121,9 @@ + } + }, + "node_modules/@smithy/util-body-length-node": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz", -+ "integrity": "sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==", ++ "version": "4.2.1", ++ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", ++ "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -4924,12 +5133,12 @@ + } + }, + "node_modules/@smithy/util-buffer-from": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.1.0.tgz", -+ "integrity": "sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", ++ "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/is-array-buffer": "^4.1.0", ++ "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4937,9 +5146,9 @@ + } + }, + "node_modules/@smithy/util-config-provider": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz", -+ "integrity": "sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", ++ "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -4949,15 +5158,14 @@ + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { -+ "version": "4.1.2", -+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.2.tgz", -+ "integrity": "sha512-QKrOw01DvNHKgY+3p4r9Ut4u6EHLVZ01u6SkOMe6V6v5C+nRPXJeWh72qCT1HgwU3O7sxAIu23nNh+FOpYVZKA==", ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.0.tgz", ++ "integrity": "sha512-H4MAj8j8Yp19Mr7vVtGgi7noJjvjJbsKQJkvNnLlrIFduRFT5jq5Eri1k838YW7rN2g5FTnXpz5ktKVr1KVgPQ==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/property-provider": "^4.1.1", -+ "@smithy/smithy-client": "^4.6.2", -+ "@smithy/types": "^4.5.0", -+ "bowser": "^2.11.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/smithy-client": "^4.7.1", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4965,17 +5173,17 @@ + } + }, + "node_modules/@smithy/util-defaults-mode-node": { -+ "version": "4.1.2", -+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.2.tgz", -+ "integrity": "sha512-l2yRmSfx5haYHswPxMmCR6jGwgPs5LjHLuBwlj9U7nNBMS43YV/eevj+Xq1869UYdiynnMrCKtoOYQcwtb6lKg==", ++ "version": "4.2.1", ++ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.1.tgz", ++ "integrity": "sha512-PuDcgx7/qKEMzV1QFHJ7E4/MMeEjaA7+zS5UNcHCLPvvn59AeZQ0DSDGMpqC2xecfa/1cNGm4l8Ec/VxCuY7Ug==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/config-resolver": "^4.2.2", -+ "@smithy/credential-provider-imds": "^4.1.2", -+ "@smithy/node-config-provider": "^4.2.2", -+ "@smithy/property-provider": "^4.1.1", -+ "@smithy/smithy-client": "^4.6.2", -+ "@smithy/types": "^4.5.0", ++ "@smithy/config-resolver": "^4.3.0", ++ "@smithy/credential-provider-imds": "^4.2.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/property-provider": "^4.2.0", ++ "@smithy/smithy-client": "^4.7.1", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4983,13 +5191,13 @@ + } + }, + "node_modules/@smithy/util-endpoints": { -+ "version": "3.1.2", -+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.1.2.tgz", -+ "integrity": "sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==", ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.0.tgz", ++ "integrity": "sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/node-config-provider": "^4.2.2", -+ "@smithy/types": "^4.5.0", ++ "@smithy/node-config-provider": "^4.3.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -4997,9 +5205,9 @@ + } + }, + "node_modules/@smithy/util-hex-encoding": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.1.0.tgz", -+ "integrity": "sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", ++ "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -5009,12 +5217,12 @@ + } + }, + "node_modules/@smithy/util-middleware": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.1.1.tgz", -+ "integrity": "sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.0.tgz", ++ "integrity": "sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/types": "^4.5.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -5022,13 +5230,13 @@ + } + }, + "node_modules/@smithy/util-retry": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.1.tgz", -+ "integrity": "sha512-jGeybqEZ/LIordPLMh5bnmnoIgsqnp4IEimmUp5c5voZ8yx+5kAlN5+juyr7p+f7AtZTgvhmInQk4Q0UVbrZ0Q==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.0.tgz", ++ "integrity": "sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/service-error-classification": "^4.1.1", -+ "@smithy/types": "^4.5.0", ++ "@smithy/service-error-classification": "^4.2.0", ++ "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -5036,18 +5244,18 @@ + } + }, + "node_modules/@smithy/util-stream": { -+ "version": "4.3.1", -+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.1.tgz", -+ "integrity": "sha512-khKkW/Jqkgh6caxMWbMuox9+YfGlsk9OnHOYCGVEdYQb/XVzcORXHLYUubHmmda0pubEDncofUrPNniS9d+uAA==", ++ "version": "4.5.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.0.tgz", ++ "integrity": "sha512-0TD5M5HCGu5diEvZ/O/WquSjhJPasqv7trjoqHyWjNh/FBeBl7a0ztl9uFMOsauYtRfd8jvpzIAQhDHbx+nvZw==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/fetch-http-handler": "^5.2.1", -+ "@smithy/node-http-handler": "^4.2.1", -+ "@smithy/types": "^4.5.0", -+ "@smithy/util-base64": "^4.1.0", -+ "@smithy/util-buffer-from": "^4.1.0", -+ "@smithy/util-hex-encoding": "^4.1.0", -+ "@smithy/util-utf8": "^4.1.0", ++ "@smithy/fetch-http-handler": "^5.3.1", ++ "@smithy/node-http-handler": "^4.3.0", ++ "@smithy/types": "^4.6.0", ++ "@smithy/util-base64": "^4.3.0", ++ "@smithy/util-buffer-from": "^4.2.0", ++ "@smithy/util-hex-encoding": "^4.2.0", ++ "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -5055,9 +5263,9 @@ + } + }, + "node_modules/@smithy/util-uri-escape": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.1.0.tgz", -+ "integrity": "sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", ++ "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" @@ -5067,12 +5275,12 @@ + } + }, + "node_modules/@smithy/util-utf8": { -+ "version": "4.1.0", -+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.1.0.tgz", -+ "integrity": "sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", ++ "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/util-buffer-from": "^4.1.0", ++ "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -5080,13 +5288,25 @@ + } + }, + "node_modules/@smithy/util-waiter": { -+ "version": "4.1.1", -+ "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.1.1.tgz", -+ "integrity": "sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==", ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.0.tgz", ++ "integrity": "sha512-0Z+nxUU4/4T+SL8BCNN4ztKdQjToNvUYmkF1kXO5T7Yz3Gafzh0HeIG6mrkN8Fz3gn9hSyxuAT+6h4vM+iQSBQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/abort-controller": "^4.2.0", ++ "@smithy/types": "^4.6.0", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ } ++ }, ++ "node_modules/@smithy/uuid": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", ++ "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { -+ "@smithy/abort-controller": "^4.1.1", -+ "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { @@ -5112,14 +5332,11 @@ + } + }, + "node_modules/@tailwindcss/typography": { -+ "version": "0.5.16", -+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", -+ "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", ++ "version": "0.5.19", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", ++ "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "license": "MIT", + "dependencies": { -+ "lodash.castarray": "^4.4.0", -+ "lodash.isplainobject": "^4.0.6", -+ "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { @@ -5200,9 +5417,9 @@ + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom": { -+ "version": "6.8.0", -+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz", -+ "integrity": "sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==", ++ "version": "6.9.1", ++ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", ++ "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", @@ -5322,9 +5539,9 @@ + } + }, + "node_modules/@types/express-serve-static-core": { -+ "version": "5.0.7", -+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", -+ "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", ++ "version": "5.1.0", ++ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", ++ "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "dev": true, + "license": "MIT", + "dependencies": { @@ -5367,12 +5584,12 @@ + "license": "MIT" + }, + "node_modules/@types/node": { -+ "version": "24.5.0", -+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.0.tgz", -+ "integrity": "sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg==", ++ "version": "24.7.1", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.1.tgz", ++ "integrity": "sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==", + "license": "MIT", + "dependencies": { -+ "undici-types": "~7.12.0" ++ "undici-types": "~7.14.0" + } + }, + "node_modules/@types/node-fetch": { @@ -5406,9 +5623,9 @@ + "license": "MIT" + }, + "node_modules/@types/react": { -+ "version": "18.3.24", -+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", -+ "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", ++ "version": "18.3.26", ++ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", ++ "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", @@ -5454,6 +5671,28 @@ + } + }, + "node_modules/@types/send": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", ++ "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/node": "*" ++ } ++ }, ++ "node_modules/@types/serve-static": { ++ "version": "1.15.9", ++ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", ++ "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/http-errors": "*", ++ "@types/node": "*", ++ "@types/send": "<1" ++ } ++ }, ++ "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", @@ -5464,18 +5703,6 @@ + "@types/node": "*" + } + }, -+ "node_modules/@types/serve-static": { -+ "version": "1.15.8", -+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", -+ "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", -+ "dev": true, -+ "license": "MIT", -+ "dependencies": { -+ "@types/http-errors": "*", -+ "@types/node": "*", -+ "@types/send": "*" -+ } -+ }, + "node_modules/@types/set-cookie-parser": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", @@ -5491,12 +5718,6 @@ + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "license": "MIT" + }, -+ "node_modules/@types/uuid": { -+ "version": "9.0.8", -+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", -+ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", -+ "license": "MIT" -+ }, + "node_modules/@vitest/expect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", @@ -6322,9 +6543,9 @@ + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { -+ "version": "2.8.4", -+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.4.tgz", -+ "integrity": "sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==", ++ "version": "2.8.16", ++ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", ++ "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" @@ -6410,9 +6631,9 @@ + } + }, + "node_modules/browserslist": { -+ "version": "4.26.0", -+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.0.tgz", -+ "integrity": "sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==", ++ "version": "4.26.3", ++ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", ++ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "funding": [ + { + "type": "opencollective", @@ -6429,9 +6650,9 @@ + ], + "license": "MIT", + "dependencies": { -+ "baseline-browser-mapping": "^2.8.2", -+ "caniuse-lite": "^1.0.30001741", -+ "electron-to-chromium": "^1.5.218", ++ "baseline-browser-mapping": "^2.8.9", ++ "caniuse-lite": "^1.0.30001746", ++ "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, @@ -6547,9 +6768,9 @@ + } + }, + "node_modules/caniuse-lite": { -+ "version": "1.0.30001741", -+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", -+ "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", ++ "version": "1.0.30001749", ++ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", ++ "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", + "funding": [ + { + "type": "opencollective", @@ -7307,9 +7528,9 @@ + "license": "MIT" + }, + "node_modules/electron-to-chromium": { -+ "version": "1.5.218", -+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.218.tgz", -+ "integrity": "sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==", ++ "version": "1.5.234", ++ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz", ++ "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==", + "license": "ISC" + }, + "node_modules/emoji-regex": { @@ -7414,9 +7635,9 @@ + } + }, + "node_modules/esbuild": { -+ "version": "0.25.9", -+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", -+ "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", ++ "version": "0.25.10", ++ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", ++ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", @@ -7427,32 +7648,32 @@ + "node": ">=18" + }, + "optionalDependencies": { -+ "@esbuild/aix-ppc64": "0.25.9", -+ "@esbuild/android-arm": "0.25.9", -+ "@esbuild/android-arm64": "0.25.9", -+ "@esbuild/android-x64": "0.25.9", -+ "@esbuild/darwin-arm64": "0.25.9", -+ "@esbuild/darwin-x64": "0.25.9", -+ "@esbuild/freebsd-arm64": "0.25.9", -+ "@esbuild/freebsd-x64": "0.25.9", -+ "@esbuild/linux-arm": "0.25.9", -+ "@esbuild/linux-arm64": "0.25.9", -+ "@esbuild/linux-ia32": "0.25.9", -+ "@esbuild/linux-loong64": "0.25.9", -+ "@esbuild/linux-mips64el": "0.25.9", -+ "@esbuild/linux-ppc64": "0.25.9", -+ "@esbuild/linux-riscv64": "0.25.9", -+ "@esbuild/linux-s390x": "0.25.9", -+ "@esbuild/linux-x64": "0.25.9", -+ "@esbuild/netbsd-arm64": "0.25.9", -+ "@esbuild/netbsd-x64": "0.25.9", -+ "@esbuild/openbsd-arm64": "0.25.9", -+ "@esbuild/openbsd-x64": "0.25.9", -+ "@esbuild/openharmony-arm64": "0.25.9", -+ "@esbuild/sunos-x64": "0.25.9", -+ "@esbuild/win32-arm64": "0.25.9", -+ "@esbuild/win32-ia32": "0.25.9", -+ "@esbuild/win32-x64": "0.25.9" ++ "@esbuild/aix-ppc64": "0.25.10", ++ "@esbuild/android-arm": "0.25.10", ++ "@esbuild/android-arm64": "0.25.10", ++ "@esbuild/android-x64": "0.25.10", ++ "@esbuild/darwin-arm64": "0.25.10", ++ "@esbuild/darwin-x64": "0.25.10", ++ "@esbuild/freebsd-arm64": "0.25.10", ++ "@esbuild/freebsd-x64": "0.25.10", ++ "@esbuild/linux-arm": "0.25.10", ++ "@esbuild/linux-arm64": "0.25.10", ++ "@esbuild/linux-ia32": "0.25.10", ++ "@esbuild/linux-loong64": "0.25.10", ++ "@esbuild/linux-mips64el": "0.25.10", ++ "@esbuild/linux-ppc64": "0.25.10", ++ "@esbuild/linux-riscv64": "0.25.10", ++ "@esbuild/linux-s390x": "0.25.10", ++ "@esbuild/linux-x64": "0.25.10", ++ "@esbuild/netbsd-arm64": "0.25.10", ++ "@esbuild/netbsd-x64": "0.25.10", ++ "@esbuild/openbsd-arm64": "0.25.10", ++ "@esbuild/openbsd-x64": "0.25.10", ++ "@esbuild/openharmony-arm64": "0.25.10", ++ "@esbuild/sunos-x64": "0.25.10", ++ "@esbuild/win32-arm64": "0.25.10", ++ "@esbuild/win32-ia32": "0.25.10", ++ "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escalade": { @@ -8059,6 +8280,15 @@ + "node": ">=14" + } + }, ++ "node_modules/generator-function": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", ++ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -8167,15 +8397,6 @@ + "node": ">=10.13.0" + } + }, -+ "node_modules/goober": { -+ "version": "2.1.16", -+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", -+ "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", -+ "license": "MIT", -+ "peerDependencies": { -+ "csstype": "^3.0.10" -+ } -+ }, + "node_modules/google-auth-library": { + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -8761,13 +8982,14 @@ + } + }, + "node_modules/is-generator-function": { -+ "version": "1.1.0", -+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", -+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", ++ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { -+ "call-bound": "^1.0.3", -+ "get-proto": "^1.0.0", ++ "call-bound": "^1.0.4", ++ "generator-function": "^2.0.0", ++ "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, @@ -9242,30 +9464,12 @@ + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, -+ "node_modules/lodash.castarray": { -+ "version": "4.4.0", -+ "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", -+ "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", -+ "license": "MIT" -+ }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, -+ "node_modules/lodash.isplainobject": { -+ "version": "4.0.6", -+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", -+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", -+ "license": "MIT" -+ }, -+ "node_modules/lodash.merge": { -+ "version": "4.6.2", -+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", -+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", -+ "license": "MIT" -+ }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9712,9 +9916,9 @@ + } + }, + "node_modules/node-releases": { -+ "version": "2.0.21", -+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", -+ "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", ++ "version": "2.0.23", ++ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", ++ "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "license": "MIT" + }, + "node_modules/normalize-path": { @@ -9910,9 +10114,9 @@ + } + }, + "node_modules/openai/node_modules/@types/node": { -+ "version": "18.19.125", -+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.125.tgz", -+ "integrity": "sha512-4TWNu0IxTQcszliYdW2mxrVvhHeERUeDCUwVuvQFn9JCU02kxrUDs8v52yOazPo7wLHKgqEd2FKxlSN6m8Deqg==", ++ "version": "18.19.130", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", ++ "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" @@ -10611,28 +10815,9 @@ + } + }, + "node_modules/postcss-js": { -+ "version": "4.0.1", -+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", -+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", -+ "license": "MIT", -+ "dependencies": { -+ "camelcase-css": "^2.0.1" -+ }, -+ "engines": { -+ "node": "^12 || ^14 || >= 16" -+ }, -+ "funding": { -+ "type": "opencollective", -+ "url": "https://opencollective.com/postcss/" -+ }, -+ "peerDependencies": { -+ "postcss": "^8.4.21" -+ } -+ }, -+ "node_modules/postcss-load-config": { -+ "version": "4.0.2", -+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", -+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", ++ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", @@ -10645,21 +10830,53 @@ + ], + "license": "MIT", + "dependencies": { -+ "lilconfig": "^3.0.0", -+ "yaml": "^2.3.4" ++ "camelcase-css": "^2.0.1" + }, + "engines": { -+ "node": ">= 14" ++ "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { ++ "postcss": "^8.4.21" ++ } ++ }, ++ "node_modules/postcss-load-config": { ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", ++ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/postcss/" ++ }, ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/ai" ++ } ++ ], ++ "license": "MIT", ++ "dependencies": { ++ "lilconfig": "^3.1.1" ++ }, ++ "engines": { ++ "node": ">= 18" ++ }, ++ "peerDependencies": { ++ "jiti": ">=1.21.0", + "postcss": ">=8.0.9", -+ "ts-node": ">=9.0.0" ++ "tsx": "^4.8.1", ++ "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { ++ "jiti": { ++ "optional": true ++ }, + "postcss": { + "optional": true + }, -+ "ts-node": { ++ "tsx": { ++ "optional": true ++ }, ++ "yaml": { + "optional": true + } + } @@ -11111,9 +11328,9 @@ + } + }, + "node_modules/react-hook-form": { -+ "version": "7.62.0", -+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.62.0.tgz", -+ "integrity": "sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==", ++ "version": "7.64.0", ++ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.64.0.tgz", ++ "integrity": "sha512-fnN+vvTiMLnRqKNTVhDysdrUay0kUUAymQnFIznmgDvapjveUWOOPqMNzPg+A+0yf9DuE2h6xzBjN1s+Qx8wcg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" @@ -11126,23 +11343,6 @@ + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, -+ "node_modules/react-hot-toast": { -+ "version": "2.6.0", -+ "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz", -+ "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==", -+ "license": "MIT", -+ "dependencies": { -+ "csstype": "^3.1.3", -+ "goober": "^2.1.16" -+ }, -+ "engines": { -+ "node": ">=10" -+ }, -+ "peerDependencies": { -+ "react": ">=16", -+ "react-dom": ">=16" -+ } -+ }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", @@ -11406,9 +11606,9 @@ + } + }, + "node_modules/rollup": { -+ "version": "4.50.2", -+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.2.tgz", -+ "integrity": "sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==", ++ "version": "4.52.4", ++ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", ++ "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" @@ -11421,27 +11621,28 @@ + "npm": ">=8.0.0" + }, + "optionalDependencies": { -+ "@rollup/rollup-android-arm-eabi": "4.50.2", -+ "@rollup/rollup-android-arm64": "4.50.2", -+ "@rollup/rollup-darwin-arm64": "4.50.2", -+ "@rollup/rollup-darwin-x64": "4.50.2", -+ "@rollup/rollup-freebsd-arm64": "4.50.2", -+ "@rollup/rollup-freebsd-x64": "4.50.2", -+ "@rollup/rollup-linux-arm-gnueabihf": "4.50.2", -+ "@rollup/rollup-linux-arm-musleabihf": "4.50.2", -+ "@rollup/rollup-linux-arm64-gnu": "4.50.2", -+ "@rollup/rollup-linux-arm64-musl": "4.50.2", -+ "@rollup/rollup-linux-loong64-gnu": "4.50.2", -+ "@rollup/rollup-linux-ppc64-gnu": "4.50.2", -+ "@rollup/rollup-linux-riscv64-gnu": "4.50.2", -+ "@rollup/rollup-linux-riscv64-musl": "4.50.2", -+ "@rollup/rollup-linux-s390x-gnu": "4.50.2", -+ "@rollup/rollup-linux-x64-gnu": "4.50.2", -+ "@rollup/rollup-linux-x64-musl": "4.50.2", -+ "@rollup/rollup-openharmony-arm64": "4.50.2", -+ "@rollup/rollup-win32-arm64-msvc": "4.50.2", -+ "@rollup/rollup-win32-ia32-msvc": "4.50.2", -+ "@rollup/rollup-win32-x64-msvc": "4.50.2", ++ "@rollup/rollup-android-arm-eabi": "4.52.4", ++ "@rollup/rollup-android-arm64": "4.52.4", ++ "@rollup/rollup-darwin-arm64": "4.52.4", ++ "@rollup/rollup-darwin-x64": "4.52.4", ++ "@rollup/rollup-freebsd-arm64": "4.52.4", ++ "@rollup/rollup-freebsd-x64": "4.52.4", ++ "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", ++ "@rollup/rollup-linux-arm-musleabihf": "4.52.4", ++ "@rollup/rollup-linux-arm64-gnu": "4.52.4", ++ "@rollup/rollup-linux-arm64-musl": "4.52.4", ++ "@rollup/rollup-linux-loong64-gnu": "4.52.4", ++ "@rollup/rollup-linux-ppc64-gnu": "4.52.4", ++ "@rollup/rollup-linux-riscv64-gnu": "4.52.4", ++ "@rollup/rollup-linux-riscv64-musl": "4.52.4", ++ "@rollup/rollup-linux-s390x-gnu": "4.52.4", ++ "@rollup/rollup-linux-x64-gnu": "4.52.4", ++ "@rollup/rollup-linux-x64-musl": "4.52.4", ++ "@rollup/rollup-openharmony-arm64": "4.52.4", ++ "@rollup/rollup-win32-arm64-msvc": "4.52.4", ++ "@rollup/rollup-win32-ia32-msvc": "4.52.4", ++ "@rollup/rollup-win32-x64-gnu": "4.52.4", ++ "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, @@ -12270,9 +12471,9 @@ + } + }, + "node_modules/tailwindcss": { -+ "version": "3.4.17", -+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", -+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", ++ "version": "3.4.18", ++ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", ++ "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", @@ -12283,7 +12484,7 @@ + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", -+ "jiti": "^1.21.6", ++ "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", @@ -12292,7 +12493,7 @@ + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", -+ "postcss-load-config": "^4.0.2", ++ "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", @@ -12628,9 +12829,9 @@ + "license": "MIT" + }, + "node_modules/undici-types": { -+ "version": "7.12.0", -+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", -+ "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", ++ "version": "7.14.0", ++ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", ++ "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "license": "MIT" + }, + "node_modules/universalify": { @@ -12735,9 +12936,9 @@ + } + }, + "node_modules/use-sync-external-store": { -+ "version": "1.5.0", -+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", -+ "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", ++ "version": "1.6.0", ++ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", ++ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -12791,9 +12992,9 @@ + } + }, + "node_modules/vite": { -+ "version": "7.1.5", -+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", -+ "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", ++ "version": "7.1.9", ++ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", ++ "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "dev": true, + "license": "MIT", + "dependencies": { @@ -14236,18 +14437,6 @@ + "node": ">=10" + } + }, -+ "node_modules/yaml": { -+ "version": "2.8.1", -+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", -+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", -+ "license": "ISC", -+ "bin": { -+ "yaml": "bin.mjs" -+ }, -+ "engines": { -+ "node": ">= 14.6" -+ } -+ }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/opensaas-sh/app_diff/package.json.diff b/opensaas-sh/app_diff/package.json.diff index 5842a669..f11bedd5 100644 --- a/opensaas-sh/app_diff/package.json.diff +++ b/opensaas-sh/app_diff/package.json.diff @@ -13,9 +13,9 @@ "@aws-sdk/client-s3": "^3.523.0", "@aws-sdk/s3-presigned-post": "^3.750.0", @@ -36,6 +41,7 @@ + "react-apexcharts": "1.4.1", "react-dom": "^18.2.0", "react-hook-form": "^7.60.0", - "react-hot-toast": "^2.4.1", + "react-icons": "^5.5.0", "react-router-dom": "^6.26.2", "stripe": "18.1.0", diff --git a/opensaas-sh/app_diff/src/client/App.tsx.diff b/opensaas-sh/app_diff/src/client/App.tsx.diff new file mode 100644 index 00000000..711aa848 --- /dev/null +++ b/opensaas-sh/app_diff/src/client/App.tsx.diff @@ -0,0 +1,11 @@ +--- template/app/src/client/App.tsx ++++ opensaas-sh/app/src/client/App.tsx +@@ -18,7 +18,7 @@ + const location = useLocation(); + const isMarketingPage = useMemo(() => { + return ( +- location.pathname === "/" || location.pathname.startsWith("/pricing") ++ location.pathname === "/" + ); + }, [location]); + diff --git a/opensaas-sh/app_diff/src/client/Main.css.diff b/opensaas-sh/app_diff/src/client/Main.css.diff index 774270a2..83261b14 100644 --- a/opensaas-sh/app_diff/src/client/Main.css.diff +++ b/opensaas-sh/app_diff/src/client/Main.css.diff @@ -1,6 +1,6 @@ --- template/app/src/client/Main.css +++ opensaas-sh/app/src/client/Main.css -@@ -56,6 +56,64 @@ +@@ -56,8 +56,66 @@ .border-gradient-primary > * { background: hsl(var(--background)); } @@ -21,8 +21,8 @@ + hsl(var(--card)) 100% + ); + } -+} -+ + } + +/* Satoshi Font Family */ +@font-face { + font-family: "Satoshi"; @@ -62,9 +62,11 @@ + font-weight: 900; + font-style: normal; + font-display: swap; - } - ++} ++ /* third-party libraries CSS */ + + .tableCheckbox:checked ~ div span { @@ -176,4 +234,22 @@ body { @apply bg-background text-foreground; @@ -83,8 +85,8 @@ + p { + @apply font-mono text-base leading-relaxed; + } -+} + } + +.navbar-maxwidth-transition { + transition: max-width 300ms cubic-bezier(0.4, 0, 0.2, 1); - } ++} diff --git a/opensaas-sh/app_diff/src/client/components/NavBar/constants.ts.diff b/opensaas-sh/app_diff/src/client/components/NavBar/constants.ts.diff index 9cf81185..bcdd8eea 100644 --- a/opensaas-sh/app_diff/src/client/components/NavBar/constants.ts.diff +++ b/opensaas-sh/app_diff/src/client/components/NavBar/constants.ts.diff @@ -1,6 +1,6 @@ --- template/app/src/client/components/NavBar/constants.ts +++ opensaas-sh/app/src/client/components/NavBar/constants.ts -@@ -9,7 +9,6 @@ +@@ -9,12 +9,12 @@ export const marketingNavigationItems: NavigationItem[] = [ { name: "Features", to: "/#features" }, @@ -8,3 +8,9 @@ ...staticNavigationItems, ] as const; + export const demoNavigationitems: NavigationItem[] = [ + { name: "AI Scheduler", to: routes.DemoAppRoute.to }, + { name: "File Upload", to: routes.FileUploadRoute.to }, ++ { name: "Pricing", to: routes.PricingPageRoute.to }, + ...staticNavigationItems, + ] as const; diff --git a/opensaas-sh/app_diff/src/file-upload/fileUploading.ts.diff b/opensaas-sh/app_diff/src/file-upload/fileUploading.ts.diff new file mode 100644 index 00000000..ec5daf05 --- /dev/null +++ b/opensaas-sh/app_diff/src/file-upload/fileUploading.ts.diff @@ -0,0 +1,30 @@ +--- template/app/src/file-upload/fileUploading.ts ++++ opensaas-sh/app/src/file-upload/fileUploading.ts +@@ -1,5 +1,7 @@ +-import axios from "axios"; +-import { ALLOWED_FILE_TYPES, MAX_FILE_SIZE_BYTES } from "./validation"; ++import type { User } from 'wasp/entities'; ++import axios from 'axios'; ++import { ALLOWED_FILE_TYPES, MAX_FILE_SIZE_BYTES } from './validation'; ++import { PrismaClient } from '@prisma/client'; + + type AllowedFileTypes = (typeof ALLOWED_FILE_TYPES)[number]; + export type FileWithValidType = File & { type: AllowedFileTypes }; +@@ -58,3 +60,17 @@ + function isFileWithAllowedFileType(file: File): file is FileWithValidType { + return ALLOWED_FILE_TYPES.includes(file.type as AllowedFileTypes); + } ++ ++export async function checkIfUserHasReachedFileUploadLimit({ userId, prismaFileDelegate }: { userId: User['id']; prismaFileDelegate: PrismaClient['file'] }) { ++ const numberOfFilesByUser = await prismaFileDelegate.count({ ++ where: { ++ user: { ++ id: userId, ++ }, ++ }, ++ }); ++ if (numberOfFilesByUser >= 2) { ++ return true; ++ } ++ return false; ++} diff --git a/opensaas-sh/app_diff/src/file-upload/operations.ts.diff b/opensaas-sh/app_diff/src/file-upload/operations.ts.diff index 1d87c944..facf44bc 100644 --- a/opensaas-sh/app_diff/src/file-upload/operations.ts.diff +++ b/opensaas-sh/app_diff/src/file-upload/operations.ts.diff @@ -1,24 +1,33 @@ --- template/app/src/file-upload/operations.ts +++ opensaas-sh/app/src/file-upload/operations.ts -@@ -44,6 +44,21 @@ - userId: context.user.id, - }); +@@ -6,7 +6,8 @@ + type DeleteFile, + type GetAllFilesByUser, + type GetDownloadFileSignedURL, +-} from "wasp/server/operations"; ++} from 'wasp/server/operations'; ++import { checkIfUserHasReachedFileUploadLimit } from './fileUploading'; -+ const numberOfFilesByUser = await context.entities.File.count({ -+ where: { -+ user: { -+ id: context.user.id, -+ }, -+ }, + import * as z from "zod"; + import { ensureArgsSchemaOrThrowHttpError } from "../server/validation"; +@@ -37,11 +38,16 @@ + throw new HttpError(401); + } + +- const { fileType, fileName } = ensureArgsSchemaOrThrowHttpError( +- createFileInputSchema, +- rawArgs, +- ); ++ const userFileLimitReached = await checkIfUserHasReachedFileUploadLimit({ ++ userId: context.user.id, ++ prismaFileDelegate: context.entities.File, + }); -+ -+ if (numberOfFilesByUser >= 2) { -+ throw new HttpError( -+ 403, -+ "Thanks for trying Open SaaS. This demo only allows 2 file uploads per user.", -+ ); ++ if (userFileLimitReached) { ++ throw new HttpError(403, 'This demo only allows 2 file uploads per user.'); + } + ++ const { fileType, fileName } = ensureArgsSchemaOrThrowHttpError(createFileInputSchema, rawArgs); + - await context.entities.File.create({ - data: { - name: fileName, + return await getUploadFileSignedURLFromS3({ + fileType, + fileName, diff --git a/opensaas-sh/app_diff/src/file-upload/workers.ts.diff b/opensaas-sh/app_diff/src/file-upload/workers.ts.diff new file mode 100644 index 00000000..4288cc9d --- /dev/null +++ b/opensaas-sh/app_diff/src/file-upload/workers.ts.diff @@ -0,0 +1,37 @@ +--- template/app/src/file-upload/workers.ts ++++ opensaas-sh/app/src/file-upload/workers.ts +@@ -0,0 +1,34 @@ ++import type { DeleteFilesJob } from 'wasp/server/jobs'; ++import { deleteFileFromS3 } from './s3Utils'; ++ ++export const deleteFilesJob: DeleteFilesJob = async (_args, context) => { ++ const dayInMiliseconds = 1000 * 60 * 60 * 24; ++ const sevenDaysAgo = Date.now() - 7 * dayInMiliseconds; ++ const filesToDelete = await context.entities.File.findMany({ ++ where: { ++ createdAt: { ++ lt: new Date(sevenDaysAgo), ++ }, ++ }, ++ select: { s3Key: true, id: true }, ++ }); ++ ++ const deletionResults = await Promise.allSettled( ++ filesToDelete.map(async (file) => { ++ await deleteFileFromS3({ s3Key: file.s3Key }); ++ return file.id; ++ }) ++ ); ++ ++ const successfullyDeletedFromS3Ids = deletionResults ++ .filter((result) => result.status === 'fulfilled') ++ .map((result) => result.value); ++ ++ const deletedFiles = await context.entities.File.deleteMany({ ++ where: { ++ id: { in: successfullyDeletedFromS3Ids }, ++ }, ++ }); ++ ++ console.log(`Deleted ${deletedFiles.count} files`); ++}; diff --git a/opensaas-sh/app_diff/src/landing-page/contentSections.tsx.diff b/opensaas-sh/app_diff/src/landing-page/contentSections.tsx.diff index 749a3635..4c21d3ee 100644 --- a/opensaas-sh/app_diff/src/landing-page/contentSections.tsx.diff +++ b/opensaas-sh/app_diff/src/landing-page/contentSections.tsx.diff @@ -1,47 +1,62 @@ --- template/app/src/landing-page/contentSections.tsx +++ opensaas-sh/app/src/landing-page/contentSections.tsx -@@ -0,0 +1,263 @@ +@@ -1,4 +1,9 @@ +-import daBoiAvatar from "../client/static/da-boi.webp"; +import { routes } from "wasp/client/router"; +import type { NavigationItem } from "../client/components/NavBar/NavBar"; +import blog from "../client/static/assets/blog.webp"; +import email from "../client/static/assets/email.webp"; +import fileupload from "../client/static/assets/fileupload.webp"; +import ai from "../client/static/assets/openapi.webp"; -+import kivo from "../client/static/examples/kivo.webp"; -+import messync from "../client/static/examples/messync.webp"; -+import microinfluencerClub from "../client/static/examples/microinfluencers.webp"; -+import promptpanda from "../client/static/examples/promptpanda.webp"; -+import reviewradar from "../client/static/examples/reviewradar.webp"; -+import scribeist from "../client/static/examples/scribeist.webp"; -+import searchcraft from "../client/static/examples/searchcraft.webp"; + import kivo from "../client/static/examples/kivo.webp"; + import messync from "../client/static/examples/messync.webp"; + import microinfluencerClub from "../client/static/examples/microinfluencers.webp"; +@@ -6,161 +11,253 @@ + import reviewradar from "../client/static/examples/reviewradar.webp"; + import scribeist from "../client/static/examples/scribeist.webp"; + import searchcraft from "../client/static/examples/searchcraft.webp"; +-import { BlogUrl, DocsUrl } from "../shared/common"; +-import type { GridFeature } from "./components/FeaturesGrid"; +import logo from "../client/static/logo.webp"; +import { BlogUrl, DocsUrl, GithubUrl, WaspUrl } from "../shared/common"; +import { GridFeature } from "./components/FeaturesGrid"; -+ + +export const landingPageNavigationItems: NavigationItem[] = [ + { name: "Features", to: "#features" }, + { name: "Documentation", to: DocsUrl }, + { name: "Blog", to: BlogUrl }, +]; -+export const features: GridFeature[] = [ -+ { + export const features: GridFeature[] = [ + { +- name: "Cool Feature 1", +- description: "Your feature", +- emoji: "🤝", + description: + "Have a sweet AI-powered app concept? Get your idea shipped to potential customers in days!", + icon: AI illustration, -+ href: DocsUrl, + href: DocsUrl, +- size: "small", + size: "medium", + fullWidthIcon: true, + align: "left", -+ }, -+ { + }, + { +- name: "Cool Feature 2", +- description: "Feature description", +- emoji: "🔐", + name: "Full-stack Type Safety", + description: + "Full support for TypeScript with auto-generated types that span the whole stack. Nothing to configure!", + emoji: "🥞", -+ href: DocsUrl, + href: DocsUrl, +- size: "small", + size: "medium", -+ }, -+ { + }, + { +- name: "Cool Feature 3", +- description: "Describe your cool feature here", +- emoji: "🥞", +- href: DocsUrl, + description: + "File upload examples with AWS S3 presigned URLs are included and fully documented!", + icon: ( @@ -52,10 +67,15 @@ + /> + ), + href: DocsUrl + "/guides/file-uploading/", -+ size: "medium", + size: "medium", + fullWidthIcon: true, -+ }, -+ { + }, + { +- name: "Cool Feature 4", +- description: "Describe your cool feature here", +- emoji: "💸", +- href: DocsUrl, +- size: "large", + name: "Email Sending", + description: + "Email sending built-in. Combine it with the cron jobs feature to easily send emails to your customers.", @@ -64,16 +84,26 @@ + size: "medium", + fullWidthIcon: true, + direction: "col-reverse", -+ }, -+ { + }, + { +- name: "Cool Feature 5", +- description: "Describe your cool feature here", +- emoji: "💼", +- href: DocsUrl, +- size: "large", + name: "Open SaaS", + description: "Try the demo app", + icon: Wasp Logo, + href: routes.LoginRoute.to, + size: "medium", + highlight: true, -+ }, -+ { + }, + { +- name: "Cool Feature 6", +- description: "It is cool", +- emoji: "📈", +- href: DocsUrl, +- size: "small", + name: "Blog w/ Astro", + description: + "Built-in blog with the Astro framework. Write your posts in Markdown, and watch your SEO performance take off.", @@ -81,8 +111,11 @@ + href: DocsUrl + "/start/guided-tour/", + size: "medium", + fullWidthIcon: true, -+ }, -+ { + }, + { +- name: "Cool Feature 7", +- description: "Cool feature", +- emoji: "📧", + name: "Deploy Anywhere. Easily.", + description: + "No vendor lock-in because you own all your code. Deploy yourself, or let Wasp deploy it for you with a single command.", @@ -93,26 +126,40 @@ + { + name: "Complete Documentation & Support", + description: "And a Discord community to help!", -+ href: DocsUrl, -+ size: "small", -+ }, -+ { + href: DocsUrl, + size: "small", + }, + { +- name: "Cool Feature 8", +- description: "Describe your cool feature here", +- emoji: "🤖", +- href: DocsUrl, +- size: "medium", + name: "E2E Tests w/ Playwright", + description: "Tests and a CI pipeline w/ GitHub Actions", + href: DocsUrl + "/guides/tests/", + size: "small", -+ }, -+ { + }, + { +- name: "Cool Feature 9", +- description: "Describe your cool feature here", +- emoji: "🚀", + name: "Open-Source Philosophy", + description: + "The repo and framework are 100% open-source, and so are the services wherever possible. Still missing something? Contribute!", + emoji: "🤝", -+ href: DocsUrl, -+ size: "medium", -+ }, -+]; -+export const testimonials = [ -+ { + href: DocsUrl, + size: "medium", + }, + ]; +- + export const testimonials = [ + { +- name: "Da Boi", +- role: "Wasp Mascot", +- avatarSrc: daBoiAvatar, +- socialUrl: "https://twitter.com/wasplang", +- quote: "I don't even know how to code. I'm just a plushie.", + name: "Max Khamrovskyi", + role: "Senior Eng @ Red Hat", + avatarSrc: @@ -120,8 +167,13 @@ + socialUrl: "https://twitter.com/maksim36ua", + quote: + "I used Wasp to build and sell my AI-augmented SaaS app for marketplace vendors within two months!", -+ }, -+ { + }, + { +- name: "Mr. Foobar", +- role: "Founder @ Cool Startup", +- avatarSrc: daBoiAvatar, +- socialUrl: "", +- quote: "This product makes me cooler than I already am.", + name: "Jonathan Cocharan", + role: "Entrepreneur", + avatarSrc: @@ -129,16 +181,21 @@ + socialUrl: "https://twitter.com/JonathanCochran", + quote: + "In just 6 nights... my SaaS app is live 🎉! Huge thanks to the amazing @wasplang community 🙌 for their guidance along the way. These tools are incredibly efficient 🤯!", -+ }, -+ { + }, + { +- name: "Jamie", +- role: "Happy Customer", +- avatarSrc: daBoiAvatar, +- socialUrl: "#", +- quote: "My cats love it!", + name: "Billy Howell", + role: "Entrepreneur", + avatarSrc: + "https://pbs.twimg.com/profile_images/1877734205561430016/jjpG4mS6_400x400.jpg", + socialUrl: "https://twitter.com/billyjhowell", + quote: -+ "Congrats! I am loving Wasp. It's really helped me, a self-taught coder increase my confidence. I feel like I've finally found the perfect, versatile stack for all my projects instead of trying out a new one each time.", -+ }, ++ "Congrats! I am loving Wasp & Open SaaS. It's really helped me, a self-taught coder increase my confidence. I feel like I've finally found the perfect, versatile stack for all my projects instead of trying out a new one each time.", + }, + { + name: "Tim Skaggs", + role: "Founder @ Antler US", @@ -193,14 +250,18 @@ + quote: + "This is exactly the framework I've been dreaming of ever since I've been waiting to fully venture into the JS Backend Dev world. I believe Wasp will go above 50k stars this year. The documentation alone gives me the confidence that this is my permanent Nodejs framework and I'm staying with Wasp. Phenomenal work by the team... Please keep up your amazing spirits. Thank you", + }, -+]; -+export const faqs = [ -+ { -+ id: 1, + ]; +- + export const faqs = [ + { + id: 1, +- question: "Whats the meaning of life?", +- answer: "42.", +- href: "https://en.wikipedia.org/wiki/42_(number)", + question: "Why is this SaaS Template free and open-source?", + answer: + "We believe the best product is made when the community puts their heads together. We also believe a quality starting point for a web app should be free and available to everyone. Our hope is that together we can create the best SaaS template out there and bring our ideas to customers quickly.", -+ }, + }, + { + id: 2, + question: "What's Wasp?", @@ -208,59 +269,92 @@ + answer: + "It's the fastest way to develop full-stack React + NodeJS + Prisma apps and it's what gives this template superpowers. Wasp relies on React, NodeJS, and Prisma to define web components and server queries and actions. Wasp's secret sauce is its compiler which takes the client, server code, and config file and outputs the client app, server app and deployment code, supercharging the development experience. Combined with this template, you can build a SaaS app in record time.", + }, -+]; -+export const footerNavigation = { -+ app: [ + ]; +- + export const footerNavigation = { + app: [ + { name: "Github", href: GithubUrl }, -+ { name: "Documentation", href: DocsUrl }, -+ { name: "Blog", href: BlogUrl }, -+ ], -+ company: [ + { name: "Documentation", href: DocsUrl }, + { name: "Blog", href: BlogUrl }, + ], + company: [ +- { name: "About", href: "https://wasp.sh" }, +- { name: "Privacy", href: "#" }, +- { name: "Terms of Service", href: "#" }, + { name: "Terms of Service", href: GithubUrl + "/blob/main/LICENSE" }, + { name: "Made by the Wasp team = }", href: WaspUrl }, -+ ], -+}; -+export const examples = [ -+ { + ], + }; +- + export const examples = [ + { +- name: "Example #1", +- description: "Describe your example here.", +- imageSrc: kivo, +- href: "#", + name: "Microinfluencers", + description: "microinfluencer.club", + imageSrc: microinfluencerClub, + href: "https://microinfluencer.club", -+ }, -+ { + }, + { +- name: "Example #2", +- description: "Describe your example here.", +- imageSrc: messync, +- href: "#", + name: "Kivo", + description: "kivo.dev", + imageSrc: kivo, + href: "https://kivo.dev", -+ }, -+ { + }, + { +- name: "Example #3", +- description: "Describe your example here.", +- imageSrc: microinfluencerClub, +- href: "#", + name: "Searchcraft", + description: "searchcraft.io", + imageSrc: searchcraft, + href: "https://www.searchcraft.io", -+ }, -+ { + }, + { +- name: "Example #4", +- description: "Describe your example here.", +- imageSrc: promptpanda, +- href: "#", + name: "Scribeist", + description: "scribeist.com", + imageSrc: scribeist, + href: "https://scribeist.com", -+ }, -+ { + }, + { +- name: "Example #5", +- description: "Describe your example here.", +- imageSrc: reviewradar, +- href: "#", + name: "Messync", + description: "messync.com", + imageSrc: messync, + href: "https://messync.com", -+ }, -+ { + }, + { +- name: "Example #6", +- description: "Describe your example here.", +- imageSrc: scribeist, +- href: "#", + name: "Prompt Panda", + description: "promptpanda.io", + imageSrc: promptpanda, + href: "https://promptpanda.io", -+ }, -+ { + }, + { +- name: "Example #7", +- description: "Describe your example here.", +- imageSrc: searchcraft, +- href: "#", + name: "Review Radar", + description: "reviewradar.ai", + imageSrc: reviewradar, + href: "https://reviewradar.ai", -+ }, -+]; + }, + ]; diff --git a/opensaas-sh/blog/src/content/docs/guides/file-uploading.mdx b/opensaas-sh/blog/src/content/docs/guides/file-uploading.mdx index bdb8ab19..c97f1a14 100644 --- a/opensaas-sh/blog/src/content/docs/guides/file-uploading.mdx +++ b/opensaas-sh/blog/src/content/docs/guides/file-uploading.mdx @@ -143,6 +143,116 @@ To begin customizing file uploads, is important to know where everything lives i - The `getAllFilesByUser` fetches all File information uploaded by the user. Note that the files do not exist in the app database, but rather the file data, its name and its `key`, which is used to fetch the file from S3. - The `getDownloadFileSignedURL` query fetches the presigned URL for a file to be downloaded from S3 using the file's `key` stored in the app's database. +### Cleaning up "orphaned" files in S3 + +In the current logic, files are first deleted from the app's database before attempting to delete them from S3. If, for some reason, the S3 deletion were to fail, the file would remain in S3 and not in the app's database and be orphaned: + +```ts +// src/file-upload/operations.ts +export const deleteFile: DeleteFile = async (args, context) => { + + const deletedFile = await context.entities.File.delete(args.fileId); + + try { + return await deleteFileFromS3({ s3Key: deletedFile.s3Key }); + } catch (error) { + console.error(`S3 deletion failed. Orphaned file s3Key: ${deletedFile.s3Key}`, error); + } +}; +``` + +To clean up these orphaned files, you could add a cleanup job that runs at an interval of your choosing to: + +1. Fetch all file keys from S3 +2. Fetch all file keys from the app's database +3. Compare the two lists and delete any files from S3 that are not in the database + +Here's an example of how you could implement this: + +```ts +// .wasp config file +job cleanUpOrphanedFilesS3Job { + executor: PgBoss, + perform: { + fn: import { cleanUpOrphanedFilesS3 } from "@src/file-upload/workers" + }, + schedule: { + cron: "0 5 * * 0" // every week on Sunday at 5am + }, + entities: [File] +} +``` + +```ts +// src/file-upload/workers.ts + +import type { CleanUpOrphanedFilesS3Job } from 'wasp/server/jobs'; +import { s3Client, deleteFileFromS3 } from './s3Utils'; +import { ListObjectsV2Command, ListObjectsV2CommandOutput } from '@aws-sdk/client-s3'; + +export const cleanUpOrphanedFilesS3: CleanUpOrphanedFilesS3Job = async ( + _args, + context +) => { + const allFileKeysFromS3 = await fetchAllFileKeysFromS3(); + const allFileKeysFromDb = await context.entities.File.findMany({ + select: { s3Key: true }, + }); + await findAndDeleteOrphanedFilesInS3(allFileKeysFromS3, allFileKeysFromDb); +}; + +const fetchAllFileKeysFromS3 = async () => { + const allS3Keys: string[] = []; + let continuationToken: string | undefined = undefined; + + do { + const command = new ListObjectsV2Command({ + Bucket: process.env.AWS_S3_FILES_BUCKET, + ContinuationToken: continuationToken, + }); + + const response: ListObjectsV2CommandOutput = await s3Client.send(command); + + if (response.Contents) { + const keys = response.Contents.reduce((acc: string[], object) => { + if (object.Key) { + acc.push(object.Key); + } + return acc; + }, []); + allS3Keys.push(...keys); + } + + continuationToken = response.NextContinuationToken; + } while (continuationToken); + + console.log(`Found ${allS3Keys.length} total files in S3`); + + return allS3Keys; +}; + +const findAndDeleteOrphanedFilesInS3 = async ( + allFileKeysFromS3: string[], + allFileKeysFromDb: { s3Key: string }[] +) => { + const s3KeysNotFoundInDb = allFileKeysFromS3.filter( + (s3Key) => !allFileKeysFromDb.some((file) => file.s3Key === s3Key) + ); + + // Delete files from S3 that are not in the database + // If any file deletion fails, the job can continue and pick it up next run. + const s3DeletionResults = await Promise.allSettled( + s3KeysNotFoundInDb.map((s3Key) => deleteFileFromS3({ s3Key })) + ); + + const successfulDeletions = s3DeletionResults.filter((result) => result.status === 'fulfilled'); + + console.log( + `Successfully deleted ${successfulDeletions.length} out of ${s3KeysNotFoundInDb.length} orphaned files from S3` + ); +}; +``` + ## Using Multer to upload files to your server If you're looking to upload files to the app server, you can use the Multer middleware to handle file uploads. This will allow you to store files on your server and is a good option if you need a quick and dirty, free solution for simple file uploads. diff --git a/opensaas-sh/blog/src/content/docs/guides/vibe-coding.mdx b/opensaas-sh/blog/src/content/docs/guides/vibe-coding.mdx index b7ec3780..5c352bcb 100644 --- a/opensaas-sh/blog/src/content/docs/guides/vibe-coding.mdx +++ b/opensaas-sh/blog/src/content/docs/guides/vibe-coding.mdx @@ -32,8 +32,8 @@ The template comes with: We've also created a bunch of LLM-friendly documentation: - [Open SaaS Docs - LLMs.txt](https://docs.opensaas.sh/llms.txt) - Links to the raw text docs. - **[Open SaaS Docs - LLMs-full.txt](https://docs.opensaas.sh/llms-full.txt) - Complete docs as one text file.** ✅😎 -- Coming Soon! ~~[Wasp Docs - LLMs.txt](https://wasp.sh/llms.txt)~~ - Links to the raw text docs. -- Coming Soon! ~~[Wasp Docs - LLMs-full.txt](https://wasp.sh/llms-full.txt)~~ - Complete docs as one text file. +- [Wasp Docs - LLMs.txt](https://wasp.sh/llms.txt) - Links to the raw text docs. +- **[Wasp Docs - LLMs-full.txt](https://wasp.sh/llms-full.txt) - Complete docs as one text file.** Add these to your AI-assisted IDE settings so you can easily reference them in your chat sessions with the LLM. **In most cases, you'll want to pass the `llms-full.txt` to the LLM and ask it to help you with a specific task.** diff --git a/template/app/.cursor/rules/authentication.mdc b/template/app/.cursor/rules/authentication.mdc index cf8e7add..25e622f4 100644 --- a/template/app/.cursor/rules/authentication.mdc +++ b/template/app/.cursor/rules/authentication.mdc @@ -92,16 +92,18 @@ See the Wasp Auth docs for available methods and complete guides [wasp-overview. - Redirect or show alternative content if the user is not authenticated. ```typescript import { useAuth } from 'wasp/client/auth'; - import { Redirect } from 'wasp/client/router'; // Or use Link + import { useNavigate } from 'react-router-dom'; const MyProtectedPage = () => { const { data: user, isLoading, error } = useAuth(); // Returns AuthUser | null + const navigate = useNavigate(); if (isLoading) return
Loading...
; // If error, it likely means the auth session is invalid/expired if (error || !user) { // Redirect to login page defined in main.wasp (auth.onAuthFailedRedirectTo) - // Or return ; + // or use the navigate hook from react-router-dom for more fine-grained control + navigate('/some-other-path'); return
Please log in to access this page.
; } diff --git a/template/app/main.wasp b/template/app/main.wasp index f91afb58..9eae9d05 100644 --- a/template/app/main.wasp +++ b/template/app/main.wasp @@ -221,8 +221,13 @@ page FileUploadPage { component: import FileUpload from "@src/file-upload/FileUploadPage" } -action createFile { - fn: import { createFile } from "@src/file-upload/operations", +action createFileUploadUrl { + fn: import { createFileUploadUrl } from "@src/file-upload/operations", + entities: [User, File] +} + +action addFileToDb { + fn: import { addFileToDb } from "@src/file-upload/operations", entities: [User, File] } @@ -235,6 +240,11 @@ query getDownloadFileSignedURL { fn: import { getDownloadFileSignedURL } from "@src/file-upload/operations", entities: [User, File] } + +action deleteFile { + fn: import { deleteFile } from "@src/file-upload/operations", + entities: [User, File] +} //#endregion //#region Analytics diff --git a/template/app/package.json b/template/app/package.json index a0b190c8..31132e36 100644 --- a/template/app/package.json +++ b/template/app/package.json @@ -20,6 +20,7 @@ "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-switch": "^1.2.5", + "@radix-ui/react-toast": "^1.2.14", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.7", "apexcharts": "3.41.0", @@ -35,7 +36,6 @@ "react-apexcharts": "1.4.1", "react-dom": "^18.2.0", "react-hook-form": "^7.60.0", - "react-hot-toast": "^2.4.1", "react-router-dom": "^6.26.2", "stripe": "18.1.0", "tailwind-merge": "^2.2.1", diff --git a/template/app/schema.prisma b/template/app/schema.prisma index eda46717..3c4ff6e9 100644 --- a/template/app/schema.prisma +++ b/template/app/schema.prisma @@ -60,8 +60,7 @@ model File { name String type String - key String - uploadUrl String + s3Key String } model DailyStats { diff --git a/template/app/src/admin/elements/settings/SettingsPage.tsx b/template/app/src/admin/elements/settings/SettingsPage.tsx index 1ec8bc38..db2fecc1 100644 --- a/template/app/src/admin/elements/settings/SettingsPage.tsx +++ b/template/app/src/admin/elements/settings/SettingsPage.tsx @@ -1,6 +1,5 @@ import { FileText, Mail, Upload, User } from "lucide-react"; import { FormEvent } from "react"; -import toast from "react-hot-toast"; import { type AuthUser } from "wasp/auth"; import { Button } from "../../../components/ui/button"; import { @@ -17,14 +16,9 @@ import DefaultLayout from "../../layout/DefaultLayout"; const SettingsPage = ({ user }: { user: AuthUser }) => { const handleSubmit = (event: FormEvent) => { - // TODO add toast provider / wrapper + // TODO implement event.preventDefault(); - const confirmed = confirm("Are you sure you want to save the changes?"); - if (confirmed) { - toast.success("Your changes have been saved successfully!"); - } else { - toast.error("Your changes have not been saved!"); - } + alert("Not yet implemented"); }; return ( diff --git a/template/app/src/client/App.tsx b/template/app/src/client/App.tsx index 979950d3..531dd766 100644 --- a/template/app/src/client/App.tsx +++ b/template/app/src/client/App.tsx @@ -1,6 +1,7 @@ import { useEffect, useMemo } from "react"; import { Outlet, useLocation } from "react-router-dom"; import { routes } from "wasp/client/router"; +import { Toaster } from "../components/ui/toaster"; import "./Main.css"; import NavBar from "./components/NavBar/NavBar"; import { @@ -62,6 +63,7 @@ export default function App() { )} + ); diff --git a/template/app/src/client/components/NavBar/constants.ts b/template/app/src/client/components/NavBar/constants.ts index f0e1ca09..f12f1f3b 100644 --- a/template/app/src/client/components/NavBar/constants.ts +++ b/template/app/src/client/components/NavBar/constants.ts @@ -16,6 +16,5 @@ export const marketingNavigationItems: NavigationItem[] = [ export const demoNavigationitems: NavigationItem[] = [ { name: "AI Scheduler", to: routes.DemoAppRoute.to }, { name: "File Upload", to: routes.FileUploadRoute.to }, - { name: "Pricing", to: routes.PricingPageRoute.to }, ...staticNavigationItems, ] as const; diff --git a/template/app/src/components/ui/dialog.tsx b/template/app/src/components/ui/dialog.tsx new file mode 100644 index 00000000..4130fe37 --- /dev/null +++ b/template/app/src/components/ui/dialog.tsx @@ -0,0 +1,120 @@ +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { X } from "lucide-react"; +import * as React from "react"; + +import { cn } from "../../lib/utils"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogHeader.displayName = "DialogHeader"; + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogFooter.displayName = "DialogFooter"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +}; diff --git a/template/app/src/components/ui/toast.tsx b/template/app/src/components/ui/toast.tsx new file mode 100644 index 00000000..2ec97372 --- /dev/null +++ b/template/app/src/components/ui/toast.tsx @@ -0,0 +1,149 @@ +import * as ToastPrimitives from "@radix-ui/react-toast"; +import { cva, type VariantProps } from "class-variance-authority"; +import { X } from "lucide-react"; +import * as React from "react"; + +import { cn } from "../../lib/utils"; + +const ToastProvider = ToastPrimitives.Provider; + +const ToastViewport = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + position?: + | "top-left" + | "top-center" + | "top-right" + | "bottom-left" + | "bottom-center" + | "bottom-right"; + } +>(({ className, position, ...props }, ref) => { + const positionClasses = position + ? { + "top-left": "top-0 left-0", + "top-center": "top-0 left-1/2 -translate-x-1/2", + "top-right": "top-0 right-0", + "bottom-left": "bottom-0 left-0", + "bottom-center": "bottom-0 left-1/2 -translate-x-1/2", + "bottom-right": "bottom-0 right-0", + }[position] + : "top-0 sm:bottom-0 sm:right-0 sm:top-auto"; + + return ( + + ); +}); +ToastViewport.displayName = ToastPrimitives.Viewport.displayName; + +const toastVariants = cva( + "group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full", + { + variants: { + variant: { + default: "border bg-background text-foreground", + destructive: + "destructive group border-destructive bg-destructive text-destructive-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +const Toast = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, variant, ...props }, ref) => { + return ( + + ); +}); +Toast.displayName = ToastPrimitives.Root.displayName; + +const ToastAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +ToastAction.displayName = ToastPrimitives.Action.displayName; + +const ToastClose = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +ToastClose.displayName = ToastPrimitives.Close.displayName; + +const ToastTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +ToastTitle.displayName = ToastPrimitives.Title.displayName; + +const ToastDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +ToastDescription.displayName = ToastPrimitives.Description.displayName; + +type ToastProps = React.ComponentPropsWithoutRef; + +type ToastActionElement = React.ReactElement; + +export { + Toast, + ToastAction, + ToastClose, + ToastDescription, + ToastProvider, + ToastTitle, + ToastViewport, + type ToastActionElement, + type ToastProps, +}; diff --git a/template/app/src/components/ui/toaster.tsx b/template/app/src/components/ui/toaster.tsx new file mode 100644 index 00000000..ad831aa9 --- /dev/null +++ b/template/app/src/components/ui/toaster.tsx @@ -0,0 +1,43 @@ +import { useToast } from "../../hooks/use-toast"; +import { + Toast, + ToastClose, + ToastDescription, + ToastProvider, + ToastTitle, + ToastViewport, +} from "./toast"; + +export function Toaster({ + position, +}: { + position?: + | "top-left" + | "top-center" + | "top-right" + | "bottom-left" + | "bottom-center" + | "bottom-right"; +}) { + const { toasts } = useToast(); + + return ( + + {toasts.map(function ({ id, title, description, action, ...props }) { + return ( + +
+ {title && {title}} + {description && ( + {description} + )} +
+ {action} + +
+ ); + })} + +
+ ); +} diff --git a/template/app/src/demo-ai-app/DemoAppPage.tsx b/template/app/src/demo-ai-app/DemoAppPage.tsx index 4810c933..f2e6e821 100644 --- a/template/app/src/demo-ai-app/DemoAppPage.tsx +++ b/template/app/src/demo-ai-app/DemoAppPage.tsx @@ -8,8 +8,9 @@ import { updateTask, useQuery, } from "wasp/client/operations"; +import { Link, routes } from "wasp/client/router"; -import { Loader2, Trash2 } from "lucide-react"; +import { ArrowRight, Loader2, Trash2 } from "lucide-react"; import { useMemo, useState } from "react"; import { Button } from "../components/ui/button"; import { @@ -21,6 +22,8 @@ import { import { Checkbox } from "../components/ui/checkbox"; import { Input } from "../components/ui/input"; import { Label } from "../components/ui/label"; +import { ToastAction } from "../components/ui/toast"; +import { toast } from "../hooks/use-toast"; import { cn } from "../lib/utils"; import type { GeneratedSchedule, @@ -146,10 +149,33 @@ function NewTaskForm({ hours: todaysHours, }); if (response) { - setResponse(response as unknown as GeneratedSchedule); + setResponse(response); } } catch (err: any) { - window.alert("Error: " + (err.message || "Something went wrong")); + if (err.statusCode === 402) { + toast({ + title: "⚠️ You are out of credits!", + style: { + minWidth: "400px", + }, + action: ( + + + Go to pricing page + + + ), + }); + } else { + toast({ + title: "Error", + description: err.message || "Something went wrong", + variant: "destructive", + }); + } } finally { setIsPlanGenerating(false); } diff --git a/template/app/src/demo-ai-app/operations.ts b/template/app/src/demo-ai-app/operations.ts index 29e2e357..1daf4c16 100644 --- a/template/app/src/demo-ai-app/operations.ts +++ b/template/app/src/demo-ai-app/operations.ts @@ -92,7 +92,10 @@ export const generateGptResponse: GenerateGptResponse< }); transactions.push(decrementCredit); } else { - throw new HttpError(402, "User has not paid or is out of credits"); + throw new HttpError( + 402, + "User has no subscription and is out of credits", + ); } } diff --git a/template/app/src/file-upload/FileUploadPage.tsx b/template/app/src/file-upload/FileUploadPage.tsx index 8d0341c2..e0f4a4c8 100644 --- a/template/app/src/file-upload/FileUploadPage.tsx +++ b/template/app/src/file-upload/FileUploadPage.tsx @@ -1,29 +1,41 @@ import { FormEvent, useEffect, useState } from "react"; import { + addFileToDb, + createFileUploadUrl, + deleteFile, getAllFilesByUser, getDownloadFileSignedURL, useQuery, } from "wasp/client/operations"; import type { File } from "wasp/entities"; + +import { Download, Trash } from "lucide-react"; import { Alert, AlertDescription } from "../components/ui/alert"; import { Button } from "../components/ui/button"; import { Card, CardContent, CardTitle } from "../components/ui/card"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "../components/ui/dialog"; import { Input } from "../components/ui/input"; import { Label } from "../components/ui/label"; import { Progress } from "../components/ui/progress"; +import { toast } from "../hooks/use-toast"; import { cn } from "../lib/utils"; -import { - type FileUploadError, - type FileWithValidType, - uploadFileWithProgress, - validateFile, -} from "./fileUploading"; +import { uploadFileWithProgress, validateFile } from "./fileUploading"; import { ALLOWED_FILE_TYPES } from "./validation"; export default function FileUploadPage() { - const [fileKeyForS3, setFileKeyForS3] = useState(""); + const [fileKeyForS3, setFileKeyForS3] = useState(""); const [uploadProgressPercent, setUploadProgressPercent] = useState(0); - const [uploadError, setUploadError] = useState(null); + const [fileToDelete, setFileToDelete] = useState | null>(null); const allUserFiles = useQuery(getAllFilesByUser, undefined, { // We disable automatic refetching because otherwise files would be refetched after `createFile` is called and the S3 URL is returned, @@ -33,7 +45,7 @@ export default function FileUploadPage() { const { isLoading: isDownloadUrlLoading, refetch: refetchDownloadUrl } = useQuery( getDownloadFileSignedURL, - { key: fileKeyForS3 }, + { s3Key: fileKeyForS3 }, { enabled: false }, ); @@ -48,7 +60,11 @@ export default function FileUploadPage() { switch (urlQuery.status) { case "error": console.error("Error fetching download URL", urlQuery.error); - alert("Error fetching download"); + toast({ + title: "Error fetching download link", + description: "Please try again later.", + variant: "destructive", + }); return; case "success": window.open(urlQuery.data, "_blank"); @@ -71,152 +87,233 @@ export default function FileUploadPage() { } const formData = new FormData(formElement); - const file = formData.get("file-upload"); + const formDataFileUpload = formData.get("file-upload"); - if (!file || !(file instanceof File)) { - setUploadError({ - message: "Please select a file to upload.", - code: "NO_FILE", + if ( + !formDataFileUpload || + !(formDataFileUpload instanceof File) || + formDataFileUpload.size === 0 + ) { + toast({ + title: "No file selected", + description: "Please select a file to upload.", + variant: "destructive", }); return; } - const fileValidationError = validateFile(file); - if (fileValidationError !== null) { - setUploadError(fileValidationError); - return; - } + const file = validateFile(formDataFileUpload); + + const { s3UploadUrl, s3UploadFields, s3Key } = await createFileUploadUrl({ + fileType: file.type, + fileName: file.name, + }); await uploadFileWithProgress({ - file: file as FileWithValidType, + file, + s3UploadUrl, + s3UploadFields, setUploadProgressPercent, }); + + await addFileToDb({ + s3Key, + fileType: file.type, + fileName: file.name, + }); + formElement.reset(); allUserFiles.refetch(); + toast({ + title: "File uploaded", + description: "Your file has been successfully uploaded.", + }); } catch (error) { console.error("Error uploading file:", error); - setUploadError({ - message: - error instanceof Error - ? error.message - : "An unexpected error occurred while uploading the file.", - code: "UPLOAD_FAILED", + const errorMessage = + error instanceof Error ? error.message : "Error uploading file."; + toast({ + title: "Error uploading file", + description: errorMessage, + variant: "destructive", }); } finally { setUploadProgressPercent(0); } }; + const handleDelete = async ({ id, name }: Pick) => { + try { + await deleteFile({ id }); + toast({ + title: "File deleted", + description: ( + + File {name} deleted. + + ), + }); + allUserFiles.refetch(); + } catch (error) { + const errorMessage = + error instanceof Error ? error.message : "Error deleting file."; + toast({ + title: "Error", + description: errorMessage, + variant: "destructive", + }); + } finally { + setFileToDelete(null); + } + }; + return ( -
-
-
-

- AWS File Upload -

-
-

- This is an example file upload page using AWS S3. Maybe your app needs - this. Maybe it doesn't. But a lot of people asked for this feature, so - here you go 🤝 -

- - -
-
- - setUploadError(null)} - className="cursor-pointer" - /> -
-
- - {uploadProgressPercent > 0 && ( - + <> +
+
+
+

+ AWS File Upload +

+
+

+ This is an example file upload page using AWS S3. Maybe your app + needs this. Maybe it doesn't. But a lot of people asked for this + feature, so here you go 🤝 +

+ + + +
+ + +
+
+ + {uploadProgressPercent > 0 && ( + + )} +
+ +
+
+ + Uploaded Files + + {allUserFiles.isLoading && ( +

Loading...

+ )} + {allUserFiles.error && ( + + + Error: {allUserFiles.error.message} + + + )} + {!!allUserFiles.data && + allUserFiles.data.length > 0 && + !allUserFiles.isLoading ? ( +
+ {allUserFiles.data.map((file: File) => ( + +
+

+ {file.name} +

+
+ + +
+
+
+ ))} +
+ ) : ( +

+ No files uploaded yet :( +

)}
- {uploadError && ( - - {uploadError.message} - - )} - -
-
- - Uploaded Files - - {allUserFiles.isLoading && ( -

Loading...

- )} - {allUserFiles.error && ( - - - Error: {allUserFiles.error.message} - - - )} - {!!allUserFiles.data && - allUserFiles.data.length > 0 && - !allUserFiles.isLoading ? ( -
- {allUserFiles.data.map((file: File) => ( - -
-

- {file.name} -

- -
-
- ))} -
- ) : ( -

- No files uploaded yet :( -

- )} -
-
-
+ + +
-
+ {fileToDelete && ( + !isOpen && setFileToDelete(null)} + > + + + Delete file + + Are you sure you want to delete{" "} + {fileToDelete.name}? This action cannot be + undone. + + + + + + + + + )} + ); } diff --git a/template/app/src/file-upload/fileUploading.ts b/template/app/src/file-upload/fileUploading.ts index 32e5a66a..317bd914 100644 --- a/template/app/src/file-upload/fileUploading.ts +++ b/template/app/src/file-upload/fileUploading.ts @@ -1,23 +1,20 @@ import axios from "axios"; -import { createFile } from "wasp/client/operations"; import { ALLOWED_FILE_TYPES, MAX_FILE_SIZE_BYTES } from "./validation"; -export type FileWithValidType = Omit & { type: AllowedFileType }; -type AllowedFileType = (typeof ALLOWED_FILE_TYPES)[number]; -interface FileUploadProgress { - file: FileWithValidType; - setUploadProgressPercent: (percentage: number) => void; -} +type AllowedFileTypes = (typeof ALLOWED_FILE_TYPES)[number]; +export type FileWithValidType = File & { type: AllowedFileTypes }; export async function uploadFileWithProgress({ file, + s3UploadUrl, + s3UploadFields, setUploadProgressPercent, -}: FileUploadProgress) { - const { s3UploadUrl, s3UploadFields } = await createFile({ - fileType: file.type, - fileName: file.name, - }); - +}: { + file: FileWithValidType; + s3UploadUrl: string; + s3UploadFields: Record; + setUploadProgressPercent: (percentage: number) => void; +}) { const formData = getFileUploadFormData(file, s3UploadFields); return axios.post(s3UploadUrl, formData, { @@ -44,29 +41,20 @@ function getFileUploadFormData( return formData; } -export interface FileUploadError { - message: string; - code: "NO_FILE" | "INVALID_FILE_TYPE" | "FILE_TOO_LARGE" | "UPLOAD_FAILED"; -} - -export function validateFile(file: File) { +export function validateFile(file: File): FileWithValidType { if (file.size > MAX_FILE_SIZE_BYTES) { - return { - message: `File size exceeds ${MAX_FILE_SIZE_BYTES / 1024 / 1024}MB limit.`, - code: "FILE_TOO_LARGE" as const, - }; + throw new Error( + `File size exceeds ${MAX_FILE_SIZE_BYTES / 1024 / 1024}MB limit.`, + ); } - if (!isAllowedFileType(file.type)) { - return { - message: `File type '${file.type}' is not supported.`, - code: "INVALID_FILE_TYPE" as const, - }; + if (!isFileWithAllowedFileType(file)) { + throw new Error(`File type '${file.type}' is not supported.`); } - return null; + return file; } -function isAllowedFileType(fileType: string): fileType is AllowedFileType { - return (ALLOWED_FILE_TYPES as readonly string[]).includes(fileType); +function isFileWithAllowedFileType(file: File): file is FileWithValidType { + return ALLOWED_FILE_TYPES.includes(file.type as AllowedFileTypes); } diff --git a/template/app/src/file-upload/operations.ts b/template/app/src/file-upload/operations.ts index d5e92319..cafb3706 100644 --- a/template/app/src/file-upload/operations.ts +++ b/template/app/src/file-upload/operations.ts @@ -1,14 +1,18 @@ import { type File } from "wasp/entities"; import { HttpError } from "wasp/server"; import { - type CreateFile, + type AddFileToDb, + type CreateFileUploadUrl, + type DeleteFile, type GetAllFilesByUser, type GetDownloadFileSignedURL, } from "wasp/server/operations"; -import * as z from "zod"; +import * as z from "zod"; import { ensureArgsSchemaOrThrowHttpError } from "../server/validation"; import { + checkFileExistsInS3, + deleteFileFromS3, getDownloadFileSignedURLFromS3, getUploadFileSignedURLFromS3, } from "./s3Utils"; @@ -21,11 +25,12 @@ const createFileInputSchema = z.object({ type CreateFileInput = z.infer; -export const createFile: CreateFile< +export const createFileUploadUrl: CreateFileUploadUrl< CreateFileInput, { s3UploadUrl: string; s3UploadFields: Record; + s3Key: string; } > = async (rawArgs, context) => { if (!context.user) { @@ -37,27 +42,42 @@ export const createFile: CreateFile< rawArgs, ); - const { s3UploadUrl, s3UploadFields, key } = - await getUploadFileSignedURLFromS3({ - fileType, - fileName, - userId: context.user.id, - }); + return await getUploadFileSignedURLFromS3({ + fileType, + fileName, + userId: context.user.id, + }); +}; - await context.entities.File.create({ +const addFileToDbInputSchema = z.object({ + s3Key: z.string(), + fileType: z.enum(ALLOWED_FILE_TYPES), + fileName: z.string(), +}); + +type AddFileToDbInput = z.infer; + +export const addFileToDb: AddFileToDb = async ( + args, + context, +) => { + if (!context.user) { + throw new HttpError(401); + } + + const fileExists = await checkFileExistsInS3({ s3Key: args.s3Key }); + if (!fileExists) { + throw new HttpError(404, "File not found in S3."); + } + + return context.entities.File.create({ data: { - name: fileName, - key, - uploadUrl: s3UploadUrl, - type: fileType, + name: args.fileName, + s3Key: args.s3Key, + type: args.fileType, user: { connect: { id: context.user.id } }, }, }); - - return { - s3UploadUrl, - s3UploadFields, - }; }; export const getAllFilesByUser: GetAllFilesByUser = async ( @@ -80,7 +100,7 @@ export const getAllFilesByUser: GetAllFilesByUser = async ( }; const getDownloadFileSignedURLInputSchema = z.object({ - key: z.string().nonempty(), + s3Key: z.string().nonempty(), }); type GetDownloadFileSignedURLInput = z.infer< @@ -91,9 +111,44 @@ export const getDownloadFileSignedURL: GetDownloadFileSignedURL< GetDownloadFileSignedURLInput, string > = async (rawArgs, _context) => { - const { key } = ensureArgsSchemaOrThrowHttpError( + const { s3Key } = ensureArgsSchemaOrThrowHttpError( getDownloadFileSignedURLInputSchema, rawArgs, ); - return await getDownloadFileSignedURLFromS3({ key }); + return await getDownloadFileSignedURLFromS3({ s3Key }); +}; + +const deleteFileInputSchema = z.object({ + id: z.string(), +}); + +type DeleteFileInput = z.infer; + +export const deleteFile: DeleteFile = async ( + args, + context, +) => { + if (!context.user) { + throw new HttpError(401); + } + + const deletedFile = await context.entities.File.delete({ + where: { + id: args.id, + user: { + id: context.user.id, + }, + }, + }); + + try { + await deleteFileFromS3({ s3Key: deletedFile.s3Key }); + } catch (error) { + console.error( + `S3 deletion failed. Orphaned file s3Key: ${deletedFile.s3Key}`, + error, + ); + } + + return deletedFile; }; diff --git a/template/app/src/file-upload/s3Utils.ts b/template/app/src/file-upload/s3Utils.ts index 12632209..3b371335 100644 --- a/template/app/src/file-upload/s3Utils.ts +++ b/template/app/src/file-upload/s3Utils.ts @@ -1,11 +1,17 @@ -import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { + DeleteObjectCommand, + GetObjectCommand, + HeadObjectCommand, + S3Client, + S3ServiceException, +} from "@aws-sdk/client-s3"; import { createPresignedPost } from "@aws-sdk/s3-presigned-post"; import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; import { randomUUID } from "crypto"; import * as path from "path"; import { MAX_FILE_SIZE_BYTES } from "./validation"; -const s3Client = new S3Client({ +export const s3Client = new S3Client({ region: process.env.AWS_S3_REGION, credentials: { accessKeyId: process.env.AWS_S3_IAM_ACCESS_KEY!, @@ -24,12 +30,12 @@ export const getUploadFileSignedURLFromS3 = async ({ fileType, userId, }: S3Upload) => { - const key = getS3Key(fileName, userId); + const s3Key = getS3Key(fileName, userId); const { url: s3UploadUrl, fields: s3UploadFields } = await createPresignedPost(s3Client, { Bucket: process.env.AWS_S3_FILES_BUCKET!, - Key: key, + Key: s3Key, Conditions: [["content-length-range", 0, MAX_FILE_SIZE_BYTES]], Fields: { "Content-Type": fileType, @@ -37,21 +43,45 @@ export const getUploadFileSignedURLFromS3 = async ({ Expires: 3600, }); - return { s3UploadUrl, key, s3UploadFields }; + return { s3UploadUrl, s3Key, s3UploadFields }; }; export const getDownloadFileSignedURLFromS3 = async ({ - key, + s3Key, }: { - key: string; + s3Key: string; }) => { const command = new GetObjectCommand({ Bucket: process.env.AWS_S3_FILES_BUCKET, - Key: key, + Key: s3Key, }); return await getSignedUrl(s3Client, command, { expiresIn: 3600 }); }; +export const deleteFileFromS3 = async ({ s3Key }: { s3Key: string }) => { + const command = new DeleteObjectCommand({ + Bucket: process.env.AWS_S3_FILES_BUCKET, + Key: s3Key, + }); + await s3Client.send(command); +}; + +export const checkFileExistsInS3 = async ({ s3Key }: { s3Key: string }) => { + const command = new HeadObjectCommand({ + Bucket: process.env.AWS_S3_FILES_BUCKET, + Key: s3Key, + }); + try { + await s3Client.send(command); + return true; + } catch (error) { + if (error instanceof S3ServiceException && error.name === "NotFound") { + return false; + } + throw error; + } +}; + function getS3Key(fileName: string, userId: string) { const ext = path.extname(fileName).slice(1); return `${userId}/${randomUUID()}.${ext}`; diff --git a/template/app/src/hooks/use-toast.ts b/template/app/src/hooks/use-toast.ts new file mode 100644 index 00000000..02e26fa6 --- /dev/null +++ b/template/app/src/hooks/use-toast.ts @@ -0,0 +1,188 @@ +import * as React from "react"; + +import type { ToastActionElement, ToastProps } from "../components/ui/toast"; + +const TOAST_LIMIT = 1; +const TOAST_REMOVE_DELAY = 1000000; + +type ToasterToast = ToastProps & { + id: string; + title?: React.ReactNode; + description?: React.ReactNode; + action?: ToastActionElement; +}; + +const actionTypes = { + ADD_TOAST: "ADD_TOAST", + UPDATE_TOAST: "UPDATE_TOAST", + DISMISS_TOAST: "DISMISS_TOAST", + REMOVE_TOAST: "REMOVE_TOAST", +} as const; + +let count = 0; + +function genId() { + count = (count + 1) % Number.MAX_SAFE_INTEGER; + return count.toString(); +} + +type ActionType = typeof actionTypes; + +type Action = + | { + type: ActionType["ADD_TOAST"]; + toast: ToasterToast; + } + | { + type: ActionType["UPDATE_TOAST"]; + toast: Partial; + } + | { + type: ActionType["DISMISS_TOAST"]; + toastId?: ToasterToast["id"]; + } + | { + type: ActionType["REMOVE_TOAST"]; + toastId?: ToasterToast["id"]; + }; + +interface State { + toasts: ToasterToast[]; +} + +const toastTimeouts = new Map>(); + +const addToRemoveQueue = (toastId: string) => { + if (toastTimeouts.has(toastId)) { + return; + } + + const timeout = setTimeout(() => { + toastTimeouts.delete(toastId); + dispatch({ + type: "REMOVE_TOAST", + toastId: toastId, + }); + }, TOAST_REMOVE_DELAY); + + toastTimeouts.set(toastId, timeout); +}; + +export const reducer = (state: State, action: Action): State => { + switch (action.type) { + case "ADD_TOAST": + return { + ...state, + toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), + }; + + case "UPDATE_TOAST": + return { + ...state, + toasts: state.toasts.map((t) => + t.id === action.toast.id ? { ...t, ...action.toast } : t, + ), + }; + + case "DISMISS_TOAST": { + const { toastId } = action; + + // ! Side effects ! - This could be extracted into a dismissToast() action, + // but I'll keep it here for simplicity + if (toastId) { + addToRemoveQueue(toastId); + } else { + state.toasts.forEach((toast) => { + addToRemoveQueue(toast.id); + }); + } + + return { + ...state, + toasts: state.toasts.map((t) => + t.id === toastId || toastId === undefined + ? { + ...t, + open: false, + } + : t, + ), + }; + } + case "REMOVE_TOAST": + if (action.toastId === undefined) { + return { + ...state, + toasts: [], + }; + } + return { + ...state, + toasts: state.toasts.filter((t) => t.id !== action.toastId), + }; + } +}; + +const listeners: Array<(state: State) => void> = []; + +let memoryState: State = { toasts: [] }; + +function dispatch(action: Action) { + memoryState = reducer(memoryState, action); + listeners.forEach((listener) => { + listener(memoryState); + }); +} + +type Toast = Omit; + +function toast({ ...props }: Toast) { + const id = genId(); + + const update = (props: ToasterToast) => + dispatch({ + type: "UPDATE_TOAST", + toast: { ...props, id }, + }); + const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }); + + dispatch({ + type: "ADD_TOAST", + toast: { + ...props, + id, + open: true, + onOpenChange: (open) => { + if (!open) dismiss(); + }, + }, + }); + + return { + id: id, + dismiss, + update, + }; +} + +function useToast() { + const [state, setState] = React.useState(memoryState); + + React.useEffect(() => { + listeners.push(setState); + return () => { + const index = listeners.indexOf(setState); + if (index > -1) { + listeners.splice(index, 1); + } + }; + }, [state]); + + return { + ...state, + toast, + dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }), + }; +} + +export { toast, useToast }; diff --git a/template/app/src/landing-page/contentSections.ts b/template/app/src/landing-page/contentSections.tsx similarity index 100% rename from template/app/src/landing-page/contentSections.ts rename to template/app/src/landing-page/contentSections.tsx diff --git a/template/e2e-tests/tests/utils.ts b/template/e2e-tests/tests/utils.ts index 0da808e0..0a9fba79 100644 --- a/template/e2e-tests/tests/utils.ts +++ b/template/e2e-tests/tests/utils.ts @@ -90,7 +90,7 @@ export const makeStripePayment = async ({ }) => { test.slow(); // Stripe payments take a long time to confirm and can cause tests to fail so we use a longer timeout - await page.click('text="Pricing"'); + await page.goto("/pricing"); await page.waitForURL("**/pricing"); const buyBtn = page.locator(`button[aria-describedby="${planId}"]`);