diff --git a/platform/wab/package.json b/platform/wab/package.json index 6b6f9e4b7..8fba97c54 100644 --- a/platform/wab/package.json +++ b/platform/wab/package.json @@ -183,6 +183,7 @@ "@amplitude/analytics-browser": "2.11.1", "@amplitude/analytics-node": "1.3.6", "@apidevtools/swagger-parser": "^10.0.2", + "@aws-sdk/client-cloudfront": "^3.319.0", "@aws-sdk/client-dynamodb": "^3.319.0", "@babel/core": "^7.28.4", "@babel/generator": "^7.28.3", @@ -275,6 +276,7 @@ "css-tree": "^3.1.0", "css.escape": "^1.5.1", "dayjs": "^1.11.9", + "dd-trace": "^5.0.0", "debug": "2.6.9", "dom-align": "^1.12.0", "dotenv": "^8.2.0", diff --git a/platform/wab/src/wab/server/AppServer.ts b/platform/wab/src/wab/server/AppServer.ts index e070f6b4b..0918d8096 100644 --- a/platform/wab/src/wab/server/AppServer.ts +++ b/platform/wab/src/wab/server/AppServer.ts @@ -1082,6 +1082,25 @@ export function addLoaderRoutes(app: express.Application) { apiAuth, withNext(buildPublishedLoaderAssets) ); + // A CloudFront Function (viewer-request) rewrites published requests to embed + // sorted base project IDs into the URL path before CloudFront caches the + // response, e.g.: + // /api/v1/loader/code/published?projectId=zzz&projectId=aaa&platform=react + // → /api/v1/loader/code/published/aaa,zzz?projectId=zzz&projectId=aaa&... + // + // This makes CloudFront cache entries addressable per-project so that + // CreateInvalidation can target /published/{projectIds}* on publish rather + // than wiping the cache for all projects at once. + // + // The :projectIds path segment is intentionally ignored here — the handler + // reads projectId from the query string as normal, which the CF Function + // preserves verbatim. + app.get( + "/api/v1/loader/code/published/:projectIds", + cors(), + apiAuth, + withNext(buildPublishedLoaderAssets) + ); app.get( "/api/v1/loader/code/versioned", cors(), diff --git a/platform/wab/src/wab/server/workers/prefill-cloudfront.spec.ts b/platform/wab/src/wab/server/workers/prefill-cloudfront.spec.ts index 91ccd5de4..7ceef92e2 100644 --- a/platform/wab/src/wab/server/workers/prefill-cloudfront.spec.ts +++ b/platform/wab/src/wab/server/workers/prefill-cloudfront.spec.ts @@ -3,6 +3,12 @@ import * as resolveProjectsMod from "@/wab/server/loader/resolve-projects"; import { withDb } from "@/wab/server/test/backend-util"; import { prefillCloudfront } from "@/wab/server/workers/prefill-cloudfront"; +const mockSend = jest.fn(); +jest.mock("@aws-sdk/client-cloudfront", () => ({ + CloudFrontClient: jest.fn(() => ({ send: mockSend })), + CreateInvalidationCommand: jest.fn((input) => input), +})); + describe("Prefill cloudfront", () => { describe("upsertLoaderPublishmentEntities", () => { it("should insert loader publishment for each project id", async () => { @@ -45,98 +51,101 @@ describe("Prefill cloudfront", () => { }); describe("prefillCloudfront", () => { - it("should trigger request for each publishment", async () => { - await withDb(async (sudo) => { - const getPkgById = jest.fn().mockImplementation((pkgId: string) => ({ - projectId: PROJECT_ID, - })); - - sudo.getPkgById = getPkgById; - - jest.mock("@/wab/server/loader/resolve-projects"); - const getResolvedProjectVersions = jest - .fn() - .mockImplementation((mgr, projectIds) => { - if (projectIds.length === 3) { - return ["p1@0.0.1", "p2@0.0.2", "p3@0.0.3"]; - } else { - return ["p1@0.0.1"]; - } - }); - (resolveProjectsMod as any).getResolvedProjectVersions = - getResolvedProjectVersions; - - jest.mock("@/wab/server/loader/gen-code-bundle"); - const genPublishedLoaderCodeBundle = (( - genCodeBundleMod as any - ).genPublishedLoaderCodeBundle = jest.fn()); - - // replace it so that the project versions are already resolved - const getRecentLoaderPublishmentsMock = jest - .fn() - .mockImplementation((projectId) => { - return [ - { - projectId, - platform: "react", - projectIds: ["p1", "p2", "p3"], - loaderVersion: 8, - browserOnly: false, - }, - { - projectId, - platform: "nextjs", - projectIds: ["p1", "p2", "p3"], - loaderVersion: 8, - browserOnly: false, - i18nKeyScheme: "hash", - i18nTagPrefix: "n", - appDir: true, - }, - { - projectId, - platform: "react", - projectIds: ["p1"], - loaderVersion: 8, - browserOnly: true, - }, - { - projectId, - platform: "react", - projectIds: ["p1"], - browserOnly: true, - loaderVersion: 1, - }, - ]; - }); - sudo.getRecentLoaderPublishments = getRecentLoaderPublishmentsMock; - - sudo.getPkgByProjectId = jest - .fn() - .mockImplementation((projectId: string) => ({ - id: PKG_ID, - projectId: PROJECT_ID, - })); - - const getPkgVersionById = jest - .fn() - .mockImplementation((pkgVersionId: string) => { - return { - pkgId: PKG_ID, - id: PKG_VERSION_ID, - version: PKG_VERSION, - }; - }); - sudo.getPkgVersionById = getPkgVersionById; + const CODEGEN_HOST = "http://cghost"; + const PROJECT_ID = "P1"; + const PKG_ID = "p1-pkgId-1"; + const PKG_VERSION = "0.0.1"; + const PKG_VERSION_ID = "pkg-version-1"; + + beforeEach(() => { + jest.resetAllMocks(); + global.fetch = jest.fn().mockResolvedValue({ ok: true } as Response); + }); + + afterEach(() => { + delete process.env.CODEGEN_HOST; + delete process.env.CLOUDFRONT_DISTRIBUTION_ID; + }); + + function setupMocks(sudo: any) { + sudo.getPkgById = jest + .fn() + .mockImplementation(() => ({ projectId: PROJECT_ID })); - const updatePkgVersionMock = jest.fn(); - sudo.updatePkgVersion = updatePkgVersionMock; + jest.mock("@/wab/server/loader/resolve-projects"); + const getResolvedProjectVersions = jest + .fn() + .mockImplementation((_mgr, projectIds) => { + if (projectIds.length === 3) { + return ["p1@0.0.1", "p2@0.0.2", "p3@0.0.3"]; + } else { + return ["p1@0.0.1"]; + } + }); + (resolveProjectsMod as any).getResolvedProjectVersions = + getResolvedProjectVersions; - const CODEGEN_HOST = "cghost"; - const PROJECT_ID = "P1"; - const PKG_ID = "p1-pkgId-1"; - const PKG_VERSION = "0.0.1"; - const PKG_VERSION_ID = "pkg-version-1"; + jest.mock("@/wab/server/loader/gen-code-bundle"); + const genPublishedLoaderCodeBundle = (( + genCodeBundleMod as any + ).genPublishedLoaderCodeBundle = jest.fn()); + + sudo.getRecentLoaderPublishments = jest + .fn() + .mockImplementation((projectId) => [ + { + projectId, + platform: "react", + projectIds: ["p1", "p2", "p3"], + loaderVersion: 8, + browserOnly: false, + }, + { + projectId, + platform: "nextjs", + projectIds: ["p1", "p2", "p3"], + loaderVersion: 8, + browserOnly: false, + i18nKeyScheme: "hash", + i18nTagPrefix: "n", + appDir: true, + }, + { + projectId, + platform: "react", + projectIds: ["p1"], + loaderVersion: 8, + browserOnly: true, + }, + { + projectId, + platform: "react", + projectIds: ["p1"], + browserOnly: true, + loaderVersion: 1, + }, + ]); + + sudo.getPkgByProjectId = jest.fn().mockImplementation(() => ({ + id: PKG_ID, + projectId: PROJECT_ID, + })); + + sudo.getPkgVersionById = jest.fn().mockImplementation(() => ({ + pkgId: PKG_ID, + id: PKG_VERSION_ID, + version: PKG_VERSION, + })); + + sudo.updatePkgVersion = jest.fn(); + + return { getResolvedProjectVersions, genPublishedLoaderCodeBundle }; + } + + it("should trigger request for each publishment", async () => { + await withDb(async (sudo) => { + const { getResolvedProjectVersions, genPublishedLoaderCodeBundle } = + setupMocks(sudo); const pool: any = {}; @@ -155,7 +164,7 @@ describe("Prefill cloudfront", () => { expect(getResolvedProjectVersions).toHaveBeenNthCalledWith(3, sudo, [ "p1", ]); - expect(getRecentLoaderPublishmentsMock).toBeCalledWith(PROJECT_ID); + expect(sudo.getRecentLoaderPublishments).toBeCalledWith(PROJECT_ID); expect(genPublishedLoaderCodeBundle).toHaveBeenNthCalledWith( 1, sudo, @@ -217,7 +226,10 @@ describe("Prefill cloudfront", () => { } ); - expect(updatePkgVersionMock).toBeCalledWith( + expect(getResolvedProjectVersions).toHaveBeenCalledTimes(4); + expect(genPublishedLoaderCodeBundle).toHaveBeenCalledTimes(4); + + expect(sudo.updatePkgVersion).toBeCalledWith( PKG_ID, PKG_VERSION, undefined, @@ -227,5 +239,180 @@ describe("Prefill cloudfront", () => { ); }); }); + + it("should warm CloudFront versioned cache after setting isPrefilled", async () => { + await withDb(async (sudo) => { + setupMocks(sudo); + process.env.CODEGEN_HOST = CODEGEN_HOST; + + const pool: any = {}; + const updatePkgVersionMock = sudo.updatePkgVersion as jest.Mock; + + await prefillCloudfront(sudo, pool, PKG_VERSION_ID); + + // isPrefilled must be set before any warming fetch is called + const updateCallOrder = updatePkgVersionMock.mock.invocationCallOrder[0]; + const firstFetchCallOrder = (global.fetch as jest.Mock).mock + .invocationCallOrder[0]; + expect(updateCallOrder).toBeLessThan(firstFetchCallOrder); + + // One warming GET per unique publishment. All 4 mock publishments have + // distinct uniqBy keys (react/8/false, nextjs/8/false+i18n, react/8/true, + // react/1/true) so all 4 survive dedup and each gets a warming fetch. + expect(global.fetch).toHaveBeenCalledTimes(4); + + // Verify URL construction for a known publishment + const fetchedUrls = (global.fetch as jest.Mock).mock.calls.map( + (c: any[]) => c[0] + ); + expect( + fetchedUrls.some((url: string) => + url.includes("/api/v1/loader/code/versioned") && + url.includes("platform=react") && + url.includes("loaderVersion=8") && + url.includes("projectId=p1%400.0.1") && + url.includes("projectId=p2%400.0.2") && + url.includes("projectId=p3%400.0.3") && + !url.includes("browserOnly") + ) + ).toBe(true); + + expect( + fetchedUrls.some((url: string) => + url.includes("platform=nextjs") && + url.includes("nextjsAppDir=true") && + url.includes("i18nKeyScheme=hash") && + url.includes("i18nTagPrefix=n") + ) + ).toBe(true); + + expect( + fetchedUrls.some((url: string) => + url.includes("platform=react") && + url.includes("browserOnly=true") && + url.includes("projectId=p1%400.0.1") && + !url.includes("projectId=p2") + ) + ).toBe(true); + }); + }); + + it("should invalidate published CloudFront paths after warming", async () => { + await withDb(async (sudo) => { + setupMocks(sudo); + process.env.CODEGEN_HOST = CODEGEN_HOST; + process.env.CLOUDFRONT_DISTRIBUTION_ID = "EDFDVBD6EXAMPLE"; + + const pool: any = {}; + + await prefillCloudfront(sudo, pool, PKG_VERSION_ID); + + // Warming must happen before invalidation + const firstFetchOrder = (global.fetch as jest.Mock).mock + .invocationCallOrder[0]; + const invalidationOrder = mockSend.mock.invocationCallOrder[0]; + expect(firstFetchOrder).toBeLessThan(invalidationOrder); + + // codePaths deduplicates on sorted projectId strings (not on all + // platform/loaderVersion fields), so publishments sharing the same + // projectId set collapse to one invalidation path. Here [p1,p2,p3] + // appears in 2 publishments and [p1] in 2 others → 2 unique code paths. + expect(mockSend).toHaveBeenCalledTimes(1); + expect(mockSend).toHaveBeenCalledWith( + expect.objectContaining({ + DistributionId: "EDFDVBD6EXAMPLE", + InvalidationBatch: expect.objectContaining({ + CallerReference: expect.stringContaining(PKG_VERSION_ID), + Paths: expect.objectContaining({ + // 2 unique code paths + 3 repr/html paths = 5 + Quantity: 5, + Items: expect.arrayContaining([ + "/api/v1/loader/code/published/p1,p2,p3*", + "/api/v1/loader/code/published/p1*", + "/api/v1/loader/repr-v2/published/P1*", + "/api/v1/loader/repr-v3/published/P1*", + "/api/v1/loader/html/published/P1*", + ]), + }), + }), + }) + ); + }); + }); + + it("should continue generating remaining variants if one bundle fails", async () => { + await withDb(async (sudo) => { + const { genPublishedLoaderCodeBundle } = setupMocks(sudo); + process.env.CODEGEN_HOST = CODEGEN_HOST; + process.env.CLOUDFRONT_DISTRIBUTION_ID = "EDFDVBD6EXAMPLE"; + + // Fail only the second variant + (genPublishedLoaderCodeBundle as jest.Mock).mockResolvedValueOnce(undefined); + (genPublishedLoaderCodeBundle as jest.Mock).mockRejectedValueOnce( + new Error("esbuild OOM") + ); + + const pool: any = {}; + + // Should not throw — per-variant errors are non-fatal + await expect(prefillCloudfront(sudo, pool, PKG_VERSION_ID)).resolves.not.toThrow(); + + // All 4 variants still get warming fetches and invalidation proceeds + expect(global.fetch).toHaveBeenCalledTimes(4); + expect(mockSend).toHaveBeenCalledTimes(1); + }); + }); + + it("should warn and continue if warming fetches fail", async () => { + await withDb(async (sudo) => { + setupMocks(sudo); + process.env.CODEGEN_HOST = CODEGEN_HOST; + process.env.CLOUDFRONT_DISTRIBUTION_ID = "EDFDVBD6EXAMPLE"; + // All warming fetches return 500 + (global.fetch as jest.Mock).mockResolvedValue({ ok: false, status: 500 } as Response); + + const pool: any = {}; + + // Should not throw — warming failures are non-fatal + await expect(prefillCloudfront(sudo, pool, PKG_VERSION_ID)).resolves.not.toThrow(); + + // Invalidation should still be attempted after warming failures + expect(mockSend).toHaveBeenCalledTimes(1); + }); + }); + + it("should skip invalidation when CLOUDFRONT_DISTRIBUTION_ID is not set", async () => { + await withDb(async (sudo) => { + setupMocks(sudo); + delete process.env.CLOUDFRONT_DISTRIBUTION_ID; + + const pool: any = {}; + + await prefillCloudfront(sudo, pool, PKG_VERSION_ID); + + expect(mockSend).not.toHaveBeenCalled(); + }); + }); + + it("should not fail the publish flow if invalidation throws", async () => { + await withDb(async (sudo) => { + setupMocks(sudo); + process.env.CLOUDFRONT_DISTRIBUTION_ID = "EDFDVBD6EXAMPLE"; + mockSend.mockRejectedValueOnce(new Error("CloudFront API error")); + + const pool: any = {}; + + await expect( + prefillCloudfront(sudo, pool, PKG_VERSION_ID) + ).resolves.not.toThrow(); + + expect(sudo.updatePkgVersion).toHaveBeenCalledWith( + PKG_ID, + PKG_VERSION, + undefined, + { isPrefilled: true } + ); + }); + }); }); }); diff --git a/platform/wab/src/wab/server/workers/prefill-cloudfront.ts b/platform/wab/src/wab/server/workers/prefill-cloudfront.ts index a6ea896df..e4880745e 100644 --- a/platform/wab/src/wab/server/workers/prefill-cloudfront.ts +++ b/platform/wab/src/wab/server/workers/prefill-cloudfront.ts @@ -1,3 +1,7 @@ +import { + CloudFrontClient, + CreateInvalidationCommand, +} from "@aws-sdk/client-cloudfront"; import { DbMgr } from "@/wab/server/db/DbMgr"; import { genPublishedLoaderCodeBundle } from "@/wab/server/loader/gen-code-bundle"; import { @@ -5,12 +9,20 @@ import { mkVersionToSync, } from "@/wab/server/loader/resolve-projects"; import { logger } from "@/wab/server/observability"; -import { makeGenPublishedLoaderCodeBundleOpts } from "@/wab/server/routes/loader"; +import { + makeGenPublishedLoaderCodeBundleOpts, + makeCacheableVersionedLoaderQuery, +} from "@/wab/server/routes/loader"; import { withSpan } from "@/wab/server/util/apm-util"; import { PlasmicWorkerPool } from "@/wab/server/workers/pool"; import { ensureDevFlags } from "@/wab/server/workers/worker-utils"; +import { getCodegenPublicUrl } from "@/wab/shared/urls"; import { uniqBy } from "lodash"; +// Reuse a single client instance across publishes — the AWS SDK client is +// designed to be long-lived and credential resolution is done once at init. +let cloudfrontClient: CloudFrontClient | undefined; + export async function prefillCloudfront( mgr: DbMgr, pool: PlasmicWorkerPool, @@ -30,8 +42,8 @@ export async function prefillCloudfront( publishment.browserOnly ?? false, publishment.i18nKeyScheme, publishment.i18nTagPrefix, - publishment.appDir, - ...publishment.projectIds, + publishment.appDir ?? false, + ...[...publishment.projectIds].sort(), ].join(",") ); @@ -51,58 +63,77 @@ export async function prefillCloudfront( )}` ); - try { - await Promise.all( - // Prefill both browser + server and browserOnly builds - loaderPublishments.map(async (publishment) => { - const resolvedProjectIdSpecs = await getResolvedProjectVersions( - mgr, - publishment.projectIds - ); + // Collect resolved specs alongside bundle generation so we can reuse them + // for CDN warming without a second DB query. + const warmingData: Array<{ + publishment: (typeof loaderPublishments)[0]; + resolvedProjectIdSpecs: string[]; + }> = []; - await withSpan( - "loader-prefill", - async () => { - await genPublishedLoaderCodeBundle( - mgr, - pool, - makeGenPublishedLoaderCodeBundleOpts({ - projectVersions: Object.fromEntries( - resolvedProjectIdSpecs.map((spec) => { - const [pid, version] = spec.split("@"); - return [pid, mkVersionToSync(version, false)]; - }) - ), - platform: publishment.platform, - appDir: publishment.appDir ?? false, - loaderVersion: publishment.loaderVersion, - browserOnly: publishment.browserOnly, - i18n: { - keyScheme: publishment.i18nKeyScheme ?? undefined, - tagPrefix: publishment.i18nTagPrefix ?? undefined, - }, - }) - ); - }, - undefined, - { - platform: publishment.platform, - loader_version: publishment.loaderVersion, - browser_only: publishment.browserOnly, - app_dir: publishment.appDir, - i18n_key_scheme: publishment.i18nKeyScheme, - i18n_tag_prefix: publishment.i18nTagPrefix, - pkg_version_id: pkgVersionId, - project_ids: publishment.projectIds, - projects: resolvedProjectIdSpecs, - } - ); - }) + // Phase 1: resolve all project versions upfront so warmingData is fully + // populated before bundle generation starts. This ensures CDN warming and + // invalidation cover all variants even if a later bundle generation fails. + for (const publishment of loaderPublishments) { + const resolvedProjectIdSpecs = await getResolvedProjectVersions( + mgr, + publishment.projectIds ); - } catch (err) { - // Even if there was an error, we set isPrefilled to true, else it'll - // never be pre-filled. + warmingData.push({ publishment, resolvedProjectIdSpecs }); } + + // Phase 2: generate bundles sequentially to bound peak memory usage. + // Each variant is wrapped independently so a single failure does not abort + // the remaining variants — all are still warmed and invalidated below. + for (const { publishment, resolvedProjectIdSpecs } of warmingData) { + try { + await withSpan( + "loader-prefill", + async () => { + await genPublishedLoaderCodeBundle( + mgr, + pool, + makeGenPublishedLoaderCodeBundleOpts({ + projectVersions: Object.fromEntries( + resolvedProjectIdSpecs.map((spec) => { + const [pid, version] = spec.split("@"); + return [pid, mkVersionToSync(version, false)]; + }) + ), + platform: publishment.platform, + appDir: publishment.appDir ?? false, + loaderVersion: publishment.loaderVersion, + browserOnly: publishment.browserOnly ?? false, + i18n: { + keyScheme: publishment.i18nKeyScheme ?? undefined, + tagPrefix: publishment.i18nTagPrefix ?? undefined, + }, + }) + ); + }, + undefined, + { + platform: publishment.platform, + loader_version: publishment.loaderVersion, + browser_only: publishment.browserOnly, + app_dir: publishment.appDir, + i18n_key_scheme: publishment.i18nKeyScheme, + i18n_tag_prefix: publishment.i18nTagPrefix, + pkg_version_id: pkgVersionId, + project_ids: publishment.projectIds, + projects: resolvedProjectIdSpecs, + } + ); + } catch (err) { + // Even if there was an error, we set isPrefilled to true, else it'll + // never be pre-filled. + logger().warn( + `Bundle generation failed during prefill for ${projectId} (${publishment.platform}): ${err instanceof Error ? err.message : String(err)}` + ); + } + } + + // isPrefilled must be set before warming so that origin can serve + // pre-computed bundles on any CloudFront cache miss during the warm requests. await mgr.updatePkgVersion( pkgVersion.pkgId, pkgVersion.version, @@ -111,5 +142,97 @@ export async function prefillCloudfront( isPrefilled: true, } ); + + // Warm CloudFront's versioned cache by GETting each versioned URL through + // the CDN. This must happen before invalidating the published cache so that + // when clients follow the published→versioned redirect they get a cache hit. + if (warmingData.length > 0) { + const baseUrl = getCodegenPublicUrl(); + const warmingResults = await Promise.allSettled( + warmingData.map(({ publishment, resolvedProjectIdSpecs }) => { + // Use the same query builder as buildPublishedLoaderAssets so the + // warming URL is identical to the versioned redirect URL clients follow, + // producing the same CloudFront cache key. + const query = makeCacheableVersionedLoaderQuery({ + platform: publishment.platform, + nextjsAppDir: publishment.appDir ?? false, + loaderVersion: publishment.loaderVersion, + resolvedProjectIdSpecs, + browserOnly: publishment.browserOnly ?? false, + i18nKeyScheme: publishment.i18nKeyScheme ?? undefined, + i18nTagPrefix: publishment.i18nTagPrefix ?? undefined, + }); + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 30_000); + return fetch( + `${baseUrl}/api/v1/loader/code/versioned?${query}`, + { signal: controller.signal } + ).finally(() => clearTimeout(timeoutId)); + }) + ); + const warmingFailures = warmingResults.filter( + (r) => r.status === "rejected" || (r.status === "fulfilled" && !r.value.ok) + ); + if (warmingFailures.length > 0) { + logger().warn( + `CloudFront versioned cache warming had ${warmingFailures.length}/${warmingResults.length} failures for ${projectId} — invalidation will proceed but some clients may hit origin` + ); + } else { + logger().info(`Warmed CloudFront versioned cache for ${projectId}`); + } + } + + // Invalidate published CDN paths so clients are redirected to the + // now-warmed versioned entries. + // + // code/published paths are keyed by sorted project IDs embedded in the URL + // path by the CloudFront Function (e.g. /published/aaa,zzz*). One path per + // unique project-ID combination covers all platform/loaderVersion variants. + // + // repr/html published paths already have :projectId in the route, so we + // can scope invalidation to just the published project. + const distributionId = process.env.CLOUDFRONT_DISTRIBUTION_ID; + if (distributionId) { + try { + const codePaths = [ + ...new Set( + warmingData.map( + ({ publishment }) => + `/api/v1/loader/code/published/${[...publishment.projectIds] + .sort() + .join(",")}*` + ) + ), + ]; + const invalidationPaths = [ + ...codePaths, + `/api/v1/loader/repr-v2/published/${projectId}*`, + `/api/v1/loader/repr-v3/published/${projectId}*`, + `/api/v1/loader/html/published/${projectId}*`, + ]; + // CloudFront is a global service; us-east-1 is the correct region for all CF API calls + cloudfrontClient ??= new CloudFrontClient({ region: "us-east-1" }); + await cloudfrontClient.send( + new CreateInvalidationCommand({ + DistributionId: distributionId, + InvalidationBatch: { + // Append timestamp so retries of the same pkgVersionId get a fresh + // CallerReference — CloudFront rejects reuse of an in-progress reference. + CallerReference: `${pkgVersionId}-${Date.now()}`, + Paths: { + Quantity: invalidationPaths.length, + Items: invalidationPaths, + }, + }, + }) + ); + logger().info(`CloudFront invalidation triggered for ${projectId}`); + } catch (err) { + logger().warn( + `CloudFront invalidation failed for ${projectId}: ${err instanceof Error ? err.message : String(err)}` + ); + } + } + logger().info(`Done prefilling cloudfront for ${projectId}`); } diff --git a/platform/wab/yarn.lock b/platform/wab/yarn.lock index d63936d6a..d12f68e17 100644 --- a/platform/wab/yarn.lock +++ b/platform/wab/yarn.lock @@ -333,6 +333,19 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== + dependencies: + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + "@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" @@ -342,6 +355,15 @@ "@aws-sdk/types" "^3.222.0" tslib "^1.11.1" +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + "@aws-crypto/supports-web-crypto@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" @@ -349,6 +371,13 @@ dependencies: tslib "^1.11.1" +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== + dependencies: + tslib "^2.6.2" + "@aws-crypto/util@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" @@ -358,6 +387,15 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/util@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + "@aws-sdk/abort-controller@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.310.0.tgz#0da2d29b823daa03b7c1f0b43de1f030583b4f51" @@ -366,6 +404,53 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/client-cloudfront@^3.319.0": + version "3.1025.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.1025.0.tgz#fb07cac5f6cc02e95e3a900cc03ca3329e59509f" + integrity sha512-j8/0e+NwVtH9HL6Zj1uIIxQ993hXzgQJps1unTMKukOo4Ids9+yCad7j7AgpgVZ1uo0vDQlxz6eYNrPPTvSjWw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/credential-provider-node" "^3.972.29" + "@aws-sdk/middleware-host-header" "^3.972.8" + "@aws-sdk/middleware-logger" "^3.972.8" + "@aws-sdk/middleware-recursion-detection" "^3.972.9" + "@aws-sdk/middleware-user-agent" "^3.972.28" + "@aws-sdk/region-config-resolver" "^3.972.10" + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/util-endpoints" "^3.996.5" + "@aws-sdk/util-user-agent-browser" "^3.972.8" + "@aws-sdk/util-user-agent-node" "^3.973.14" + "@smithy/config-resolver" "^4.4.13" + "@smithy/core" "^3.23.13" + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/hash-node" "^4.2.12" + "@smithy/invalid-dependency" "^4.2.12" + "@smithy/middleware-content-length" "^4.2.12" + "@smithy/middleware-endpoint" "^4.4.28" + "@smithy/middleware-retry" "^4.4.46" + "@smithy/middleware-serde" "^4.2.16" + "@smithy/middleware-stack" "^4.2.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/node-http-handler" "^4.5.1" + "@smithy/protocol-http" "^5.3.12" + "@smithy/smithy-client" "^4.12.8" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.44" + "@smithy/util-defaults-mode-node" "^4.2.48" + "@smithy/util-endpoints" "^3.3.3" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-retry" "^4.2.13" + "@smithy/util-stream" "^4.5.21" + "@smithy/util-utf8" "^4.2.2" + "@smithy/util-waiter" "^4.2.14" + tslib "^2.6.2" + "@aws-sdk/client-dynamodb@^3.319.0": version "3.319.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.319.0.tgz#380b1f106f9d9d50d23032989ad5d657a13ff3b8" @@ -538,6 +623,25 @@ "@aws-sdk/util-middleware" "3.310.0" tslib "^2.5.0" +"@aws-sdk/core@^3.973.26": + version "3.973.26" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.973.26.tgz#5989c5300f9da7ed57f34b88091c77b4fa5d7256" + integrity sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/xml-builder" "^3.972.16" + "@smithy/core" "^3.23.13" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/signature-v4" "^5.3.12" + "@smithy/smithy-client" "^4.12.8" + "@smithy/types" "^4.13.1" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + "@aws-sdk/credential-provider-env@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.310.0.tgz#c52694fb276341db6ce4e816cf9ca90fa5830dad" @@ -547,6 +651,33 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-env@^3.972.24": + version "3.972.24" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.24.tgz#bc33a34f15704d02552aa8b3994d17008b991f86" + integrity sha512-FWg8uFmT6vQM7VuzELzwVo5bzExGaKHdubn0StjgrcU5FvuLExUe+k06kn/40uKv59rYzhez8eFNM4yYE/Yb/w== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@^3.972.26": + version "3.972.26" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.26.tgz#6524c3681dbb62d3c4de82262631ab94b800f00e" + integrity sha512-CY4ppZ+qHYqcXqBVi//sdHST1QK3KzOEiLtpLsc9W2k2vfZPKExGaQIsOwcyvjpjUEolotitmd3mUNY56IwDEA== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/types" "^3.973.6" + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/node-http-handler" "^4.5.1" + "@smithy/property-provider" "^4.2.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/smithy-client" "^4.12.8" + "@smithy/types" "^4.13.1" + "@smithy/util-stream" "^4.5.21" + tslib "^2.6.2" + "@aws-sdk/credential-provider-imds@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.310.0.tgz#d8fb1223fee7e289a81e28177fe55dedf4d2745e" @@ -573,6 +704,40 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-ini@^3.972.28": + version "3.972.28" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.28.tgz#6bc0d684c245914dca7a1a4dd3c2d84212833320" + integrity sha512-wXYvq3+uQcZV7k+bE4yDXCTBdzWTU9x/nMiKBfzInmv6yYK1veMK0AKvRfRBd72nGWYKcL6AxwiPg9z/pYlgpw== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/credential-provider-env" "^3.972.24" + "@aws-sdk/credential-provider-http" "^3.972.26" + "@aws-sdk/credential-provider-login" "^3.972.28" + "@aws-sdk/credential-provider-process" "^3.972.24" + "@aws-sdk/credential-provider-sso" "^3.972.28" + "@aws-sdk/credential-provider-web-identity" "^3.972.28" + "@aws-sdk/nested-clients" "^3.996.18" + "@aws-sdk/types" "^3.973.6" + "@smithy/credential-provider-imds" "^4.2.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-login@^3.972.28": + version "3.972.28" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.28.tgz#b2d47d4d43690d2d824edc94ce955d86dd3877f1" + integrity sha512-ZSTfO6jqUTCysbdBPtEX5OUR//3rbD0lN7jO3sQeS2Gjr/Y+DT6SbIJ0oT2cemNw3UzKu97sNONd1CwNMthuZQ== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/nested-clients" "^3.996.18" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-node@3.319.0": version "3.319.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.319.0.tgz#51c8cd9d676d5b3ef80e88282fc1925946b1aaaf" @@ -589,6 +754,24 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-node@^3.972.29": + version "3.972.29" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.29.tgz#4bcc991fcbf245f75494a119b3446a678a51e019" + integrity sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g== + dependencies: + "@aws-sdk/credential-provider-env" "^3.972.24" + "@aws-sdk/credential-provider-http" "^3.972.26" + "@aws-sdk/credential-provider-ini" "^3.972.28" + "@aws-sdk/credential-provider-process" "^3.972.24" + "@aws-sdk/credential-provider-sso" "^3.972.28" + "@aws-sdk/credential-provider-web-identity" "^3.972.28" + "@aws-sdk/types" "^3.973.6" + "@smithy/credential-provider-imds" "^4.2.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-process@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.310.0.tgz#0b2ee77f0c48262442d2768044d72332a4ad8884" @@ -599,6 +782,18 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-process@^3.972.24": + version "3.972.24" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.24.tgz#940c76a2db0aece23879dcf75ac5b6ee8f8fa135" + integrity sha512-Q2k/XLrFXhEztPHqj4SLCNID3hEPdlhh1CDLBpNnM+1L8fq7P+yON9/9M1IGN/dA5W45v44ylERfXtDAlmMNmw== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-sso@3.319.0": version "3.319.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.319.0.tgz#c7bbea82e28bfbbafdb7d729239464c7ae38f7d0" @@ -611,6 +806,20 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-sso@^3.972.28": + version "3.972.28" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.28.tgz#bf150bfb7e708d58f35bb2b5786b902df19fd92d" + integrity sha512-IoUlmKMLEITFn1SiCTjPfR6KrE799FBo5baWyk/5Ppar2yXZoUdaRqZzJzK6TcJxx450M8m8DbpddRVYlp5R/A== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/nested-clients" "^3.996.18" + "@aws-sdk/token-providers" "3.1021.0" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-web-identity@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.310.0.tgz#c9fa09b0068027e58d31178e3fa06bf4e9ae9d36" @@ -620,6 +829,19 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-web-identity@^3.972.28": + version "3.972.28" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.28.tgz#27fc2a0fe0d2ff1460171d2a6912898c2235a7df" + integrity sha512-d+6h0SD8GGERzKe27v5rOzNGKOl0D+l0bWJdqrxH8WSQzHzjsQFIAPgIeOTUwBHVsKKwtSxc91K/SWax6XgswQ== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/nested-clients" "^3.996.18" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/endpoint-cache@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.310.0.tgz#e6f84bfcd55462966811390ef797145559bab15a" @@ -703,6 +925,16 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/middleware-host-header@^3.972.8": + version "3.972.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz#72186e96500b49b38fb5482d6b7bf95e5b985281" + integrity sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/middleware-logger@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.310.0.tgz#8cc6381f49ef867cae1364b8517f939629e4dd9d" @@ -711,6 +943,15 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/middleware-logger@^3.972.8": + version "3.972.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz#7fee4223afcb6f7828dbdf4ea745ce15027cf384" + integrity sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/middleware-recursion-detection@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.310.0.tgz#020c986ed8da751bd613fd84c8c8a805c89e0952" @@ -720,6 +961,17 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/middleware-recursion-detection@^3.972.9": + version "3.972.9" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.9.tgz#53a2cc0cf827863163b2351209212f642015c2e2" + integrity sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@aws/lambda-invoke-store" "^0.2.2" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/middleware-retry@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.310.0.tgz#12e95e962875d44af4acbdebe02db337a1ad5c35" @@ -779,6 +1031,64 @@ "@aws-sdk/util-endpoints" "3.319.0" tslib "^2.5.0" +"@aws-sdk/middleware-user-agent@^3.972.28": + version "3.972.28" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.28.tgz#7f81d96d2fed0334ff601af62d77e14f67fb9d22" + integrity sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/util-endpoints" "^3.996.5" + "@smithy/core" "^3.23.13" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + "@smithy/util-retry" "^4.2.13" + tslib "^2.6.2" + +"@aws-sdk/nested-clients@^3.996.18": + version "3.996.18" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.996.18.tgz#b5f2403bef822e1ac01d3f7f6f2849f23d94beb9" + integrity sha512-c7ZSIXrESxHKx2Mcopgd8AlzZgoXMr20fkx5ViPWPOLBvmyhw9VwJx/Govg8Ef/IhEon5R9l53Z8fdYSEmp6VA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/middleware-host-header" "^3.972.8" + "@aws-sdk/middleware-logger" "^3.972.8" + "@aws-sdk/middleware-recursion-detection" "^3.972.9" + "@aws-sdk/middleware-user-agent" "^3.972.28" + "@aws-sdk/region-config-resolver" "^3.972.10" + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/util-endpoints" "^3.996.5" + "@aws-sdk/util-user-agent-browser" "^3.972.8" + "@aws-sdk/util-user-agent-node" "^3.973.14" + "@smithy/config-resolver" "^4.4.13" + "@smithy/core" "^3.23.13" + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/hash-node" "^4.2.12" + "@smithy/invalid-dependency" "^4.2.12" + "@smithy/middleware-content-length" "^4.2.12" + "@smithy/middleware-endpoint" "^4.4.28" + "@smithy/middleware-retry" "^4.4.46" + "@smithy/middleware-serde" "^4.2.16" + "@smithy/middleware-stack" "^4.2.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/node-http-handler" "^4.5.1" + "@smithy/protocol-http" "^5.3.12" + "@smithy/smithy-client" "^4.12.8" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.44" + "@smithy/util-defaults-mode-node" "^4.2.48" + "@smithy/util-endpoints" "^3.3.3" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-retry" "^4.2.13" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + "@aws-sdk/node-config-provider@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.310.0.tgz#ba8fb41af2db0316291ba9002267627553ec65ac" @@ -833,6 +1143,17 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/region-config-resolver@^3.972.10": + version "3.972.10" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.10.tgz#cbabd969a2d4fedb652273403e64d98b79d0144c" + integrity sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/config-resolver" "^4.4.13" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/service-error-classification@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.310.0.tgz#352c1db426dcf54a44393bc9a0607dde796b2abb" @@ -868,6 +1189,19 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/token-providers@3.1021.0": + version "3.1021.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1021.0.tgz#90905a8def49f90e54a73849e25ad4bcc4dbea2a" + integrity sha512-TKY6h9spUk3OLs5v1oAgW9mAeBE3LAGNBwJokLy96wwmd4W2v/tYlXseProyed9ValDj2u1jK/4Rg1T+1NXyJA== + dependencies: + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/nested-clients" "^3.996.18" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/token-providers@3.319.0": version "3.319.0" resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.319.0.tgz#60da565665d42837a7d498e610a8493a7dc2524b" @@ -886,6 +1220,14 @@ dependencies: tslib "^2.5.0" +"@aws-sdk/types@^3.973.6": + version "3.973.6" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.6.tgz#1964a7c01b5cb18befa445998ad1d02f86c5432d" + integrity sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + "@aws-sdk/url-parser@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.310.0.tgz#928c9eac2e3d74c3c5db4c6e364a1de00185dcaa" @@ -962,6 +1304,17 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/util-endpoints@^3.996.5": + version "3.996.5" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz#6b12e80869ae6e84075bc24c2a4e6273ea87dfc2" + integrity sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-endpoints" "^3.3.3" + tslib "^2.6.2" + "@aws-sdk/util-hex-encoding@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz#19294c78986c90ae33f04491487863dc1d33bd87" @@ -1007,6 +1360,16 @@ bowser "^2.11.0" tslib "^2.5.0" +"@aws-sdk/util-user-agent-browser@^3.972.8": + version "3.972.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz#1044845c97c898cd68fc3f9c773494a6a98cdf80" + integrity sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/types" "^4.13.1" + bowser "^2.11.0" + tslib "^2.6.2" + "@aws-sdk/util-user-agent-node@3.310.0": version "3.310.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.310.0.tgz#ebefbedc5a4759adc958885741628ec0de1ab197" @@ -1016,6 +1379,18 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/util-user-agent-node@^3.973.14": + version "3.973.14" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.14.tgz#955e50e8222c9861fdf8f273ba8ff8e28ba04a5c" + integrity sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw== + dependencies: + "@aws-sdk/middleware-user-agent" "^3.972.28" + "@aws-sdk/types" "^3.973.6" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/types" "^4.13.1" + "@smithy/util-config-provider" "^4.2.2" + tslib "^2.6.2" + "@aws-sdk/util-utf8-browser@^3.0.0": version "3.259.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" @@ -1040,6 +1415,20 @@ "@aws-sdk/types" "3.310.0" tslib "^2.5.0" +"@aws-sdk/xml-builder@^3.972.16": + version "3.972.16" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.16.tgz#ea22fe022cf12d12b07f6faf75c4fa214dea00bc" + integrity sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A== + dependencies: + "@smithy/types" "^4.13.1" + fast-xml-parser "5.5.8" + tslib "^2.6.2" + +"@aws/lambda-invoke-store@^0.2.2": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz#802f6a50f6b6589063ef63ba8acdee86fcb9f395" + integrity sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" @@ -6704,6 +7093,410 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@smithy/config-resolver@^4.4.13", "@smithy/config-resolver@^4.4.14": + version "4.4.14" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.14.tgz#6803498f1be96d88da3e6d88a244e4ec99fe3174" + integrity sha512-N55f8mPEccpzKetUagdvmAy8oohf0J5cuj9jLI1TaSceRlq0pJsIZepY3kmAXAhyxqXPV6hDerDQhqQPKWgAoQ== + dependencies: + "@smithy/node-config-provider" "^4.3.13" + "@smithy/types" "^4.14.0" + "@smithy/util-config-provider" "^4.2.2" + "@smithy/util-endpoints" "^3.3.4" + "@smithy/util-middleware" "^4.2.13" + tslib "^2.6.2" + +"@smithy/core@^3.23.13", "@smithy/core@^3.23.14": + version "3.23.14" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.23.14.tgz#29c3b6cf771ee8898018a1cc34c0fe3f418468e5" + integrity sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg== + dependencies: + "@smithy/protocol-http" "^5.3.13" + "@smithy/types" "^4.14.0" + "@smithy/url-parser" "^4.2.13" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-middleware" "^4.2.13" + "@smithy/util-stream" "^4.5.22" + "@smithy/util-utf8" "^4.2.2" + "@smithy/uuid" "^1.1.2" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^4.2.12", "@smithy/credential-provider-imds@^4.2.13": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.13.tgz#c0533f362dec6644f403c7789d8e81233f78c63f" + integrity sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ== + dependencies: + "@smithy/node-config-provider" "^4.3.13" + "@smithy/property-provider" "^4.2.13" + "@smithy/types" "^4.14.0" + "@smithy/url-parser" "^4.2.13" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^5.3.15", "@smithy/fetch-http-handler@^5.3.16": + version "5.3.16" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.16.tgz#2cd94de19ac2bcdb51682259cf6dcacbb1b382a9" + integrity sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ== + dependencies: + "@smithy/protocol-http" "^5.3.13" + "@smithy/querystring-builder" "^4.2.13" + "@smithy/types" "^4.14.0" + "@smithy/util-base64" "^4.3.2" + tslib "^2.6.2" + +"@smithy/hash-node@^4.2.12": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.13.tgz#5ec1b80c27f5446136ce98bf6ab0b0594ca34511" + integrity sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA== + dependencies: + "@smithy/types" "^4.14.0" + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^4.2.12": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.13.tgz#0f23859d529ba669f24860baacb41835f604a8ae" + integrity sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg== + dependencies: + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/is-array-buffer@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" + integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== + dependencies: + tslib "^2.6.2" + +"@smithy/is-array-buffer@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz#c401ce54b12a16529eb1c938a0b6c2247cb763b8" + integrity sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow== + dependencies: + tslib "^2.6.2" + +"@smithy/middleware-content-length@^4.2.12": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.13.tgz#0bbc3706fe1321ba99be29703ff98abde996d49d" + integrity sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig== + dependencies: + "@smithy/protocol-http" "^5.3.13" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^4.4.28", "@smithy/middleware-endpoint@^4.4.29": + version "4.4.29" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.29.tgz#86fa2f206469e48bff1b30b2c35e433b5f453119" + integrity sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw== + dependencies: + "@smithy/core" "^3.23.14" + "@smithy/middleware-serde" "^4.2.17" + "@smithy/node-config-provider" "^4.3.13" + "@smithy/shared-ini-file-loader" "^4.4.8" + "@smithy/types" "^4.14.0" + "@smithy/url-parser" "^4.2.13" + "@smithy/util-middleware" "^4.2.13" + tslib "^2.6.2" + +"@smithy/middleware-retry@^4.4.46": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.5.0.tgz#d39bec675ba3133f399c21261212d690f1e10d61" + integrity sha512-/NzISn4grj/BRFVua/xnQwF+7fakYZgimpw2dfmlPgcqecBMKxpB9g5mLYRrmBD5OrPoODokw4Vi1hrSR4zRyw== + dependencies: + "@smithy/core" "^3.23.14" + "@smithy/node-config-provider" "^4.3.13" + "@smithy/protocol-http" "^5.3.13" + "@smithy/service-error-classification" "^4.2.13" + "@smithy/smithy-client" "^4.12.9" + "@smithy/types" "^4.14.0" + "@smithy/util-middleware" "^4.2.13" + "@smithy/util-retry" "^4.3.0" + "@smithy/uuid" "^1.1.2" + tslib "^2.6.2" + +"@smithy/middleware-serde@^4.2.16", "@smithy/middleware-serde@^4.2.17": + version "4.2.17" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.17.tgz#45b1eaa99c3b536042eb56365096e6681f2a347b" + integrity sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ== + dependencies: + "@smithy/core" "^3.23.14" + "@smithy/protocol-http" "^5.3.13" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/middleware-stack@^4.2.12", "@smithy/middleware-stack@^4.2.13": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.13.tgz#88007ea7eb40ab3ff632701c21149e0e8a57b55f" + integrity sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw== + dependencies: + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/node-config-provider@^4.3.12", "@smithy/node-config-provider@^4.3.13": + version "4.3.13" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.13.tgz#a65c696a38a0c2e7012652b1c1138799882b12bc" + integrity sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw== + dependencies: + "@smithy/property-provider" "^4.2.13" + "@smithy/shared-ini-file-loader" "^4.4.8" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/node-http-handler@^4.5.1", "@smithy/node-http-handler@^4.5.2": + version "4.5.2" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz#21d70f4c9cf1ce59921567bab59ae1177b6c60b1" + integrity sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA== + dependencies: + "@smithy/protocol-http" "^5.3.13" + "@smithy/querystring-builder" "^4.2.13" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/property-provider@^4.2.12", "@smithy/property-provider@^4.2.13": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.13.tgz#4859f887414f2c251517125258870a70509f8bbd" + integrity sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ== + dependencies: + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/protocol-http@^5.3.12", "@smithy/protocol-http@^5.3.13": + version "5.3.13" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.13.tgz#1e8fcacd61282cafc2c783ab002cb0debe763588" + integrity sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg== + dependencies: + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/querystring-builder@^4.2.13": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.13.tgz#1f3c009493a06d83f998da70f5920246dfcd88dd" + integrity sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ== + dependencies: + "@smithy/types" "^4.14.0" + "@smithy/util-uri-escape" "^4.2.2" + tslib "^2.6.2" + +"@smithy/querystring-parser@^4.2.13": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.13.tgz#c2ab4446a50d0de232bbffdab534b3e0023bf879" + integrity sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA== + dependencies: + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/service-error-classification@^4.2.13": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.13.tgz#22aa256bbad30d98e13a4896eee165ee184cd33b" + integrity sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw== + dependencies: + "@smithy/types" "^4.14.0" + +"@smithy/shared-ini-file-loader@^4.4.7", "@smithy/shared-ini-file-loader@^4.4.8": + version "4.4.8" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.8.tgz#c45099e8aea8f48af97d05be91ab6ae93d105ae7" + integrity sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw== + dependencies: + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/signature-v4@^5.3.12": + version "5.3.13" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.13.tgz#0c3760a5837673ddbb66c433637d5e16742b991f" + integrity sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg== + dependencies: + "@smithy/is-array-buffer" "^4.2.2" + "@smithy/protocol-http" "^5.3.13" + "@smithy/types" "^4.14.0" + "@smithy/util-hex-encoding" "^4.2.2" + "@smithy/util-middleware" "^4.2.13" + "@smithy/util-uri-escape" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@smithy/smithy-client@^4.12.8", "@smithy/smithy-client@^4.12.9": + version "4.12.9" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.12.9.tgz#2eb54ee07050a8bcd3792f8b8c4e03fac4bfb422" + integrity sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ== + dependencies: + "@smithy/core" "^3.23.14" + "@smithy/middleware-endpoint" "^4.4.29" + "@smithy/middleware-stack" "^4.2.13" + "@smithy/protocol-http" "^5.3.13" + "@smithy/types" "^4.14.0" + "@smithy/util-stream" "^4.5.22" + tslib "^2.6.2" + +"@smithy/types@^4.13.1", "@smithy/types@^4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.14.0.tgz#72fb6fd315f2eff7d4878142db2d1db4ef94f9bc" + integrity sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ== + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^4.2.12", "@smithy/url-parser@^4.2.13": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.13.tgz#cc582733d1181e1a135b05bb600f12c9889be7f4" + integrity sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw== + dependencies: + "@smithy/querystring-parser" "^4.2.13" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/util-base64@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.2.tgz#be02bcb29a87be744356467ea25ffa413e695cea" + integrity sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ== + dependencies: + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz#c4404277d22039872abdb80e7800f9a63f263862" + integrity sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz#f923ca530defb86a9ac3ca2d3066bcca7b304fbc" + integrity sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g== + dependencies: + tslib "^2.6.2" + +"@smithy/util-buffer-from@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" + integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== + dependencies: + "@smithy/is-array-buffer" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-buffer-from@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz#2c6b7857757dfd88f6cd2d36016179a40ccc913b" + integrity sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q== + dependencies: + "@smithy/is-array-buffer" "^4.2.2" + tslib "^2.6.2" + +"@smithy/util-config-provider@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz#52ebf9d8942838d18bc5fb1520de1e8699d7aad6" + integrity sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-defaults-mode-browser@^4.3.44": + version "4.3.45" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.45.tgz#42cb7fb97857a6b67d54e38adaf1476fdc7d1339" + integrity sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw== + dependencies: + "@smithy/property-provider" "^4.2.13" + "@smithy/smithy-client" "^4.12.9" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^4.2.48": + version "4.2.49" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.49.tgz#fa443a16daedef503c0d41bbed22526c3e228cee" + integrity sha512-jlN6vHwE8gY5AfiFBavtD3QtCX2f7lM3BKkz7nFKSNfFR5nXLXLg6sqXTJEEyDwtxbztIDBQCfjsGVXlIru2lQ== + dependencies: + "@smithy/config-resolver" "^4.4.14" + "@smithy/credential-provider-imds" "^4.2.13" + "@smithy/node-config-provider" "^4.3.13" + "@smithy/property-provider" "^4.2.13" + "@smithy/smithy-client" "^4.12.9" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/util-endpoints@^3.3.3", "@smithy/util-endpoints@^3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.3.4.tgz#e372596c9aebd7939a0452f6b8ec417cfac18f7c" + integrity sha512-BKoR/ubPp9KNKFxPpg1J28N1+bgu8NGAtJblBP7yHy8yQPBWhIAv9+l92SlQLpolGm71CVO+btB60gTgzT0wog== + dependencies: + "@smithy/node-config-provider" "^4.3.13" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/util-hex-encoding@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz#4abf3335dd1eb884041d8589ca7628d81a6fd1d3" + integrity sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-middleware@^4.2.12", "@smithy/util-middleware@^4.2.13": + version "4.2.13" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.13.tgz#fda5518f95cc3f4a3086d9ee46cc42797baaedf8" + integrity sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow== + dependencies: + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/util-retry@^4.2.13", "@smithy/util-retry@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.3.0.tgz#efff6f9859ddfeb7747b269cf236f47c4bc2a54d" + integrity sha512-tSOPQNT/4KfbvqeMovWC3g23KSYy8czHd3tlN+tOYVNIDLSfxIsrPJihYi5TpNcoV789KWtgChUVedh2y6dDPg== + dependencies: + "@smithy/service-error-classification" "^4.2.13" + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/util-stream@^4.5.21", "@smithy/util-stream@^4.5.22": + version "4.5.22" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.22.tgz#16e449bbd174243b9e202f0f75d33a1d700c2020" + integrity sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew== + dependencies: + "@smithy/fetch-http-handler" "^5.3.16" + "@smithy/node-http-handler" "^4.5.2" + "@smithy/types" "^4.14.0" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-hex-encoding" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@smithy/util-uri-escape@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz#48e40206e7fe9daefc8d44bb43a1ab17e76abf4a" + integrity sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw== + dependencies: + tslib "^2.6.2" + +"@smithy/util-utf8@^2.0.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" + integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== + dependencies: + "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-utf8@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz#21db686982e6f3393ac262e49143b42370130f13" + integrity sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw== + dependencies: + "@smithy/util-buffer-from" "^4.2.2" + tslib "^2.6.2" + +"@smithy/util-waiter@^4.2.14": + version "4.2.15" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.2.15.tgz#0338ad7e5b47380836cfedd21a6b5bda4e43a88f" + integrity sha512-oUt9o7n8hBv3BL56sLSneL0XeigZSuem0Hr78JaoK33D9oKieyCvVP8eTSe3j7g2mm/S1DvzxKieG7JEWNJUNg== + dependencies: + "@smithy/types" "^4.14.0" + tslib "^2.6.2" + +"@smithy/uuid@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.1.2.tgz#b6e97c7158615e4a3c775e809c00d8c269b5a12e" + integrity sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g== + dependencies: + tslib "^2.6.2" + "@socket.io/component-emitter@~3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" @@ -12584,6 +13377,13 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== +fast-xml-builder@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz#0c407a1d9d5996336c0cd76f7ff785cac6413017" + integrity sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg== + dependencies: + path-expression-matcher "^1.1.3" + fast-xml-parser@4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz#5a98c18238d28a57bbdfa9fe4cda01211fff8f4a" @@ -12591,6 +13391,15 @@ fast-xml-parser@4.1.2: dependencies: strnum "^1.0.5" +fast-xml-parser@5.5.8: + version "5.5.8" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz#929571ed8c5eb96e6d9bd572ba14fc4b84875716" + integrity sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ== + dependencies: + fast-xml-builder "^1.1.4" + path-expression-matcher "^1.2.0" + strnum "^2.2.0" + fastest-levenshtein@1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -17216,6 +18025,11 @@ path-exists@^5.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== +path-expression-matcher@^1.1.3, path-expression-matcher@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.4.0.tgz#275730c9c21bbf2e124eba6d4c6453f02f3d331d" + integrity sha512-s4DQMxIdhj3jLFWd9LxHOplj4p9yQ4ffMGowFf3cpEgrrJjEhN0V5nxw4Ye1EViAGDoL4/1AeO6qHpqYPOzE4Q== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -20750,6 +21564,11 @@ strnum@^1.0.5: resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== +strnum@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.3.tgz#0119fce02749a11bb126a4d686ac5dbdf6e57586" + integrity sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg== + strtok3@^6.2.4: version "6.3.0" resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0" @@ -21317,7 +22136,7 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== -tslib@^2.8.0: +tslib@^2.6.2, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==