From a50ff91dc53d9ddb3bf388bc351aaa8d633afd1c Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sun, 8 Mar 2026 14:46:27 +0100 Subject: [PATCH 01/27] Add SKILL.md for porting PRs and AGENTS.md for coding guidelines --- .claude/skills/port-pr/SKILL.md | 79 +++++++++++++++ AGENTS.md | 165 ++++++++++++++++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 .claude/skills/port-pr/SKILL.md create mode 100644 AGENTS.md diff --git a/.claude/skills/port-pr/SKILL.md b/.claude/skills/port-pr/SKILL.md new file mode 100644 index 00000000..a2616a3c --- /dev/null +++ b/.claude/skills/port-pr/SKILL.md @@ -0,0 +1,79 @@ +--- +name: port-pr +description: Port PRs or commits from another repository. Use when you need to bring changes from a source repo. Invoke with /port-pr +argument-hint: +disable-model-invocation: true +--- + +# Port PR Skill + +This skill enables porting PRs/commits from another repository into this repository. + +## Required Inputs + +This skill receives arguments via `$ARGUMENTS`: +- `$0` or `$ARGUMENTS[0]`: Commit reference (hash or PR URL) +- `$1` or `$ARGUMENTS[1]`: Source repo path + +## Workflow + +### 1. Extract Commit Information + +**For commit hash:** +```bash +git diff ^.. +git log -1 --format="%s%n%n%b" +``` + +**For PR URL:** +```bash +gh pr view --json mergeCommit,title,body +git diff ^.. +``` + +Run these commands in the source repository using `workdir` parameter. + +### 2. Analyze Changes + +- Identify all files changed, added, and deleted +- Understand the purpose and scope of the change +- Note any dependencies or related changes + +### 3. Map to Target Repository + +- Find equivalent files in this repository +- Identify any structural differences between repos +- Note files that don't exist or have different paths + +### 4. Ask for Guidance + +Before implementing, ask the user for clarification when: +- A file doesn't exist in the target repo +- The code structure differs significantly between repos +- The feature/change may not apply to this repository +- There's ambiguity about how to adapt the changes + +### 5. Implement Changes + +Apply similar changes following this repository's conventions: +- Follow AGENTS.md guidelines (formatting, imports, naming) +- Maintain consistent code style with surrounding code +- Use explicit file extensions (`.js`) for local imports +- Use `node:` prefix for Node.js built-ins + +### 6. Verification + +After implementation, run: +```bash +pnpm code:checks +``` + +This runs formatting, linting, and TypeScript checks. + +### 7. Summary + +Provide a summary of: +- What was ported +- Any adaptations made +- Files modified/created +- Any remaining TODOs or follow-up items \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..2d6b10c9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,165 @@ +# AGENTS.md + +Guidelines for AI coding agents working in this repository. + +## Project Overview + +This is a monorepo for OpenNext.js adapters, enabling Next.js deployment to various platforms (AWS Lambda, Cloudflare Workers, Node.js). The repository uses pnpm workspaces with multiple packages under `packages/` and example applications under `examples/` and `examples-cloudflare/`. + +## Build/Lint/Test Commands + +### Root-level commands (run from repository root) + +```bash +# Install dependencies +pnpm install + +# Build all packages +pnpm build + +# Build only opennext packages +pnpm build:opennext + +# Run linter +pnpm lint + +# Fix linting issues +pnpm lint:fix + +# Check formatting +pnpm fmt + +# Fix formatting issues +pnpm fmt:fix + +# TypeScript type checking (all packages) +pnpm ts:check + +# Run all code checks (fmt + lint + ts:check) +pnpm code:checks + +# Run all unit tests +pnpm test + +# Run e2e tests +pnpm e2e:test +``` + +### Running single tests + +```bash +# Run a specific test file in the cloudflare package +pnpm --filter @opennextjs/cloudflare vitest run path/to/test.spec.ts + +# Run tests matching a pattern in the tests-unit package +pnpm --filter tests-unit vitest run --testNamePattern="test name pattern" + +# Run a single test file with vitest directly +cd packages/tests-unit && pnpm vitest run tests/core/routing/matcher.test.ts + +# Run tests in watch mode +pnpm --filter tests-unit vitest + +# Run tests in a specific package +pnpm --filter @opennextjs/cloudflare test +``` + +### Package-specific commands + +```bash +# Build a specific package +pnpm --filter @opennextjs/cloudflare build + +# Type check a specific package +pnpm --filter @opennextjs/cloudflare ts:check +``` + +## Code Style Guidelines + +### Imports + +- Use explicit file extensions (`.js`) for local imports: `import { foo } from "./bar.js"` +- Use Node.js built-in imports with `node:` prefix: `import fs from "node:fs"` +- Group imports logically: built-ins first, then external packages, then local modules +- Use workspace protocol for internal packages: `"@opennextjs/aws": "workspace:*"` + +### TypeScript + +- TypeScript strict mode is enabled via `@tsconfig/strictest` +- Use explicit type annotations for function parameters and return types +- Prefer `type` for object types, `interface` for extensible types +- Use `import type` for type-only imports +- Avoid `any` - use `unknown` or specific types; if unavoidable, add `// oxlint-disable @typescript-eslint/no-explicit-any` comment +- Target ES2022 for compilation + +### Formatting + +- Tabs for indentation (check .editorconfig if present) +- Single quotes for strings +- Trailing commas in objects/arrays +- Semicolons are required + +### Naming Conventions + +- camelCase for variables and functions +- PascalCase for types, interfaces, and classes +- SCREAMING_SNAKE_CASE for constants +- kebab-case for file names: `my-component.ts`, `use-cache.ts` +- `.spec.ts` suffix for test files (unit tests use vitest) +- `.test.ts` suffix for test files in tests-unit package + +### Error Handling + +- Throw descriptive `Error` objects with context +- Use typed errors when specific error handling is needed +- Log errors with console.error/console.log for CLI commands +- Handle async errors with try/catch or .catch() + +### File Organization + +- Source code in `src/` directory +- Test files co-located with source (`.spec.ts`) or in separate tests directory (`.test.ts`) +- Export public API through `index.ts` files +- Use barrel exports: `export * from "./module.js"` +- Configuration files at package root + +### Testing + +- Use vitest for unit tests +- Use `describe`/`test`/`expect` from vitest +- Test file naming: `*.spec.ts` for co-located tests, `*.test.ts` for tests-unit package +- Mock external dependencies with `vi.mock()` and `vi.fn()` +- Run tests in Node.js environment (not jsdom) by default + +### Comments and Documentation + +- Use JSDoc comments for public APIs +- Document complex logic with inline comments +- Use `// TODO(username)` or `// TODO: description` for TODOs +- Keep comments concise and relevant + +## Package Manager + +This project uses **pnpm** exclusively. Do not use npm or yarn commands. + +```bash +# Add a dependency to a specific package +pnpm --filter add + +# Add a dev dependency +pnpm --filter add -D + +# Run a script in a specific package +pnpm --filter +``` + +## Pre-commit Checks + +Before committing, ensure: + +1. `pnpm fmt:fix` - Code is properly formatted +2. `pnpm lint:fix` - No linting errors +3. `pnpm ts:check` - TypeScript compiles without errors +4. `pnpm test` - All tests pass + +Run `pnpm code:checks` to verify all checks pass. \ No newline at end of file From 1d3b7e5bde9c08f40c75e4ebac485d0213fc1f8e Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sun, 8 Mar 2026 14:51:28 +0100 Subject: [PATCH 02/27] update skill --- .claude/skills/port-pr/SKILL.md | 27 ++++++++++++--------------- AGENTS.md | 2 +- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/.claude/skills/port-pr/SKILL.md b/.claude/skills/port-pr/SKILL.md index a2616a3c..3b9056a1 100644 --- a/.claude/skills/port-pr/SKILL.md +++ b/.claude/skills/port-pr/SKILL.md @@ -1,33 +1,26 @@ --- name: port-pr -description: Port PRs or commits from another repository. Use when you need to bring changes from a source repo. Invoke with /port-pr -argument-hint: +description: Port PRs from a GitHub repository. Use when you need to bring changes from a source repo. Invoke with /port-pr +argument-hint: disable-model-invocation: true --- # Port PR Skill -This skill enables porting PRs/commits from another repository into this repository. +This skill enables porting PRs from a GitHub repository into this repository. ## Required Inputs This skill receives arguments via `$ARGUMENTS`: -- `$0` or `$ARGUMENTS[0]`: Commit reference (hash or PR URL) -- `$1` or `$ARGUMENTS[1]`: Source repo path -## Workflow +- `$ARGUMENTS`: GitHub PR URL (e.g., `https://github.com/owner/repo/pull/123`) -### 1. Extract Commit Information +## Workflow -**For commit hash:** -```bash -git diff ^.. -git log -1 --format="%s%n%n%b" -``` +### 1. Extract PR Information -**For PR URL:** ```bash -gh pr view --json mergeCommit,title,body +gh pr view --json mergeCommit,title,body,headRepository git diff ^.. ``` @@ -48,6 +41,7 @@ Run these commands in the source repository using `workdir` parameter. ### 4. Ask for Guidance Before implementing, ask the user for clarification when: + - A file doesn't exist in the target repo - The code structure differs significantly between repos - The feature/change may not apply to this repository @@ -56,6 +50,7 @@ Before implementing, ask the user for clarification when: ### 5. Implement Changes Apply similar changes following this repository's conventions: + - Follow AGENTS.md guidelines (formatting, imports, naming) - Maintain consistent code style with surrounding code - Use explicit file extensions (`.js`) for local imports @@ -64,6 +59,7 @@ Apply similar changes following this repository's conventions: ### 6. Verification After implementation, run: + ```bash pnpm code:checks ``` @@ -73,7 +69,8 @@ This runs formatting, linting, and TypeScript checks. ### 7. Summary Provide a summary of: + - What was ported - Any adaptations made - Files modified/created -- Any remaining TODOs or follow-up items \ No newline at end of file +- Any remaining TODOs or follow-up items diff --git a/AGENTS.md b/AGENTS.md index 2d6b10c9..d4753fe9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -162,4 +162,4 @@ Before committing, ensure: 3. `pnpm ts:check` - TypeScript compiles without errors 4. `pnpm test` - All tests pass -Run `pnpm code:checks` to verify all checks pass. \ No newline at end of file +Run `pnpm code:checks` to verify all checks pass. From dc05a5a545467f4caf351673ea5b1437f4c52408 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sun, 8 Mar 2026 14:52:13 +0100 Subject: [PATCH 03/27] Port https://github.com/opennextjs/opennextjs-aws/pull/1118 as a test --- .../open-next/src/core/routing/i18n/index.ts | 9 +++- .../tests/core/routing/i18n.test.ts | 41 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/open-next/src/core/routing/i18n/index.ts b/packages/open-next/src/core/routing/i18n/index.ts index 008c59cb..8bb7c8be 100644 --- a/packages/open-next/src/core/routing/i18n/index.ts +++ b/packages/open-next/src/core/routing/i18n/index.ts @@ -4,7 +4,7 @@ import type { InternalEvent, InternalResult } from "@/types/open-next"; import { emptyReadableStream } from "@/utils/stream.js"; import { debug } from "../../../adapters/logger.js"; -import { constructNextUrl } from "../util.js"; +import { constructNextUrl, convertToQueryString } from "../util.js"; import { acceptLanguage } from "./accept-header"; @@ -139,11 +139,16 @@ export function handleLocaleRedirect(internalEvent: InternalEvent): false | Inte const defaultLocale = domainLocale?.defaultLocale ?? i18n.defaultLocale; if (detectedLocale.toLowerCase() !== defaultLocale.toLowerCase()) { + const nextUrl = constructNextUrl( + internalEvent.url, + `/${detectedLocale}${NextConfig.trailingSlash ? "/" : ""}` + ); + const queryString = convertToQueryString(internalEvent.query); return { type: "core", statusCode: 307, headers: { - Location: constructNextUrl(internalEvent.url, `/${detectedLocale}`), + Location: `${nextUrl}${queryString}`, }, body: emptyReadableStream(), isBase64Encoded: false, diff --git a/packages/tests-unit/tests/core/routing/i18n.test.ts b/packages/tests-unit/tests/core/routing/i18n.test.ts index bf38d4d4..d9b93083 100644 --- a/packages/tests-unit/tests/core/routing/i18n.test.ts +++ b/packages/tests-unit/tests/core/routing/i18n.test.ts @@ -11,6 +11,7 @@ vi.mock("@opennextjs/aws/adapters/config/index.js", () => { defaultLocale: "en", locales: ["en", "fr"], }, + trailingSlash: undefined, }, }; }); @@ -225,6 +226,46 @@ describe("handleLocaleRedirect", () => { expect(result).toBe(false); }); + it("should redirect to the localized path with a query parameter", () => { + const event = createEvent({ + url: "http://localhost?foo=bar", + headers: { + "accept-language": "fr", + }, + }); + + const result = handleLocaleRedirect(event); + + expect(result).toMatchObject({ + statusCode: 307, + headers: { + Location: "http://localhost/fr?foo=bar", + }, + }); + }); + + it("should redirect to the localized path with a query parameter when trailingSlash is true", () => { + const trailingSlashSpy = vi.spyOn(NextConfig, "trailingSlash", "get").mockReturnValue(true); + + const event = createEvent({ + url: "http://localhost?foo=bar", + headers: { + "accept-language": "fr", + }, + }); + + const result = handleLocaleRedirect(event); + + expect(result).toMatchObject({ + statusCode: 307, + headers: { + Location: "http://localhost/fr/?foo=bar", + }, + }); + + trailingSlashSpy.mockRestore(); + }); + describe("using domain", () => { it("should redirect to the preferred domain if the domain is different", () => { vi.spyOn(NextConfig, "i18n", "get").mockReturnValue({ From 861479335c12dff61971fb815e96fbcaaf443de9 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 09:57:16 +0100 Subject: [PATCH 04/27] Port https://github.com/opennextjs/opennextjs-aws/pull/1117 --- .../open-next/src/build/copyTracedFiles.ts | 19 +++++ .../tests/build/copyTracedFiles.test.ts | 83 ++++++++++++++++++- 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/packages/open-next/src/build/copyTracedFiles.ts b/packages/open-next/src/build/copyTracedFiles.ts index 62e460b2..c07eead0 100644 --- a/packages/open-next/src/build/copyTracedFiles.ts +++ b/packages/open-next/src/build/copyTracedFiles.ts @@ -43,6 +43,17 @@ const EXCLUDED_PACKAGES = [ "next/dist/compiled/amphtml-validator", ]; +const NON_LINUX_PLATFORMS = ["darwin", "win32", "freebsd"]; +const platformPattern = NON_LINUX_PLATFORMS.join("|"); +const nonLinuxPlatformRegex = getCrossPlatformPathRegex( + `/node_modules/(?:@[^/]+/)?(?:[^/]+-)?(${platformPattern})-[^/]+/`, + { escape: false } +); + +export function isNonLinuxPlatformPackage(srcPath: string): boolean { + return nonLinuxPlatformRegex.test(srcPath); +} + export function isExcluded(srcPath: string): boolean { return EXCLUDED_PACKAGES.some((excluded) => // `pnpm` can create a symbolic link that points to the pnpm store folder @@ -254,6 +265,14 @@ File ${serverPath} does not exist if (isExcluded(from)) { return; } + // Skip non-Linux platform-specific native binaries (e.g. @swc/core-darwin-arm64) + if (!process.env.OPEN_NEXT_SKIP_PLATFORM_FILTER && isNonLinuxPlatformPackage(from)) { + const match = from.match(/node_modules\/(.+\/)?([^/]+-(?:darwin|win32|freebsd)-[^/]+)/); + if (match) { + logger.debug(`Skipping non-Linux platform package: ${match[2]}`); + } + return; + } tracedFiles.push(to); mkdirSync(path.dirname(to), { recursive: true }); let symlink = null; diff --git a/packages/tests-unit/tests/build/copyTracedFiles.test.ts b/packages/tests-unit/tests/build/copyTracedFiles.test.ts index 80b875a4..9545d65a 100644 --- a/packages/tests-unit/tests/build/copyTracedFiles.test.ts +++ b/packages/tests-unit/tests/build/copyTracedFiles.test.ts @@ -1,4 +1,4 @@ -import { isExcluded } from "@opennextjs/aws/build/copyTracedFiles.js"; +import { isExcluded, isNonLinuxPlatformPackage } from "@opennextjs/aws/build/copyTracedFiles.js"; describe("isExcluded", () => { test("should exclude sharp", () => { @@ -32,3 +32,84 @@ describe("isExcluded", () => { ).toBe(false); }); }); + +describe("isNonLinuxPlatformPackage", () => { + test("should identify Darwin (macOS) platform packages", () => { + expect( + isNonLinuxPlatformPackage( + "/home/user/project/node_modules/@swc/core-darwin-arm64/swc.darwin-arm64.node" + ) + ).toBe(true); + expect(isNonLinuxPlatformPackage("/home/user/project/node_modules/@esbuild/darwin-x64/bin/esbuild")).toBe( + true + ); + expect(isNonLinuxPlatformPackage("/home/user/project/node_modules/turbo-darwin-arm64/bin/turbo")).toBe( + true + ); + }); + + test("should identify Windows platform packages", () => { + expect( + isNonLinuxPlatformPackage( + "/home/user/project/node_modules/@swc/core-win32-x64-msvc/swc.win32-x64-msvc.node" + ) + ).toBe(true); + expect( + isNonLinuxPlatformPackage( + "/home/user/project/node_modules/@rollup/rollup-win32-x64-msvc/rollup.win32-x64-msvc.node" + ) + ).toBe(true); + }); + + test("should identify FreeBSD platform packages", () => { + expect( + isNonLinuxPlatformPackage( + "/home/user/project/node_modules/@rollup/rollup-freebsd-x64/rollup.freebsd-x64.node" + ) + ).toBe(true); + }); + + test("should NOT identify Linux platform packages", () => { + expect( + isNonLinuxPlatformPackage( + "/home/user/project/node_modules/@swc/core-linux-x64-gnu/swc.linux-x64-gnu.node" + ) + ).toBe(false); + expect(isNonLinuxPlatformPackage("/home/user/project/node_modules/@esbuild/linux-x64/bin/esbuild")).toBe( + false + ); + expect( + isNonLinuxPlatformPackage( + "/home/user/project_modules/@swc/core-linux-arm64-gnu/swc.linux-arm64-gnu.node" + ) + ).toBe(false); + }); + + test("should NOT identify non-platform packages", () => { + expect(isNonLinuxPlatformPackage("/home/user/project/node_modules/@swc/core/package.json")).toBe(false); + expect(isNonLinuxPlatformPackage("/home/user/project/node_modules/next/dist/server/next-server.js")).toBe( + false + ); + expect( + isNonLinuxPlatformPackage("/home/user/project/node_modules/react/cjs/react.production.min.js") + ).toBe(false); + }); + + test("should handle pnpm store paths", () => { + expect( + isNonLinuxPlatformPackage( + "/home/user/project/node_modules/.pnpm/@swc+core-darwin-arm64@1.0.0/node_modules/@swc/core-darwin-arm64/swc.darwin-arm64.node" + ) + ).toBe(true); + expect( + isNonLinuxPlatformPackage( + "/home/user/project/node_modules/.pnpm/@esbuild+darwin-x64@0.19.0/node_modules/@esbuild/darwin-x64/bin/esbuild" + ) + ).toBe(true); + expect( + isNonLinuxPlatformPackage( + "/home/user/project/node_modules/.pnpm/@swc+core-linux-x64-gnu@1.0.0/node_modules/@swc/core-linux-x64-gnu/swc.linux-x64-gnu.node" + ) + ).toBe(false); + }); +}); From a559cfea3f1bcbb9762b15ad3029750a09c148bb Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 09:57:25 +0100 Subject: [PATCH 05/27] update skill --- .claude/skills/port-pr/SKILL.md | 49 ++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/.claude/skills/port-pr/SKILL.md b/.claude/skills/port-pr/SKILL.md index 3b9056a1..35f3b7c4 100644 --- a/.claude/skills/port-pr/SKILL.md +++ b/.claude/skills/port-pr/SKILL.md @@ -66,7 +66,54 @@ pnpm code:checks This runs formatting, linting, and TypeScript checks. -### 7. Summary +### 7. Ask for Package + +Before creating the changeset, determine which package the changes apply to: + +Ask the user: **"Which package should this changeset be for - `@opennextjs/aws` or `@opennextjs/cloudflare`?"** + +Store the answer in `$PACKAGE_NAME` (e.g., "@opennextjs/cloudflare"). + +### 8. Create Changeset + +Create a patch changeset with the link to the PR: + +```bash +# Extract PR number from the URL (e.g., "123" from "https://github.com/owner/repo/pull/123") +PR_NUMBER=$(echo "$ARGUMENTS" | grep -oE '[0-9]+$') + +# Create the changeset file with the PR link (use the package name from step 7) +echo "--- +\"$PACKAGE_NAME\": patch +--- + +Ported PR #$PR_NUMBER from source repository + +$ARGUMENTS" > .changeset/port-pr-$PR_NUMBER.md +``` + +### 9. Stage Changes and Prepare Commit + +Stage the changeset file and prepare a commit message (but do not commit): + +```bash +# Stage the changeset file +git add .changeset/port-pr-$PR_NUMBER.md + +# Prepare the commit message with the PR link (stored for later) +echo "chore: port PR #$PR_NUMBER from source repository + +$ARGUMENTS + +Changeset: .changeset/port-pr-$PR_NUMBER.md" > /tmp/commit-message-port-pr-$PR_NUMBER.txt + +# Display the prepared commit message +cat /tmp/commit-message-port-pr-$PR_NUMBER.txt +``` + +The changeset is staged and ready to commit. The commit message is saved at `/tmp/commit-message-port-pr-$PR_NUMBER.txt` for reference. + +### 10. Summary Provide a summary of: From 132ad053f5cd39ff51a13676cee2bc859e1ca1ea Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:00:33 +0100 Subject: [PATCH 06/27] Port https://github.com/opennextjs/opennextjs-aws/pull/1114 --- .changeset/stale-schools-beam.md | 5 ++ packages/open-next/src/build/helper.ts | 29 ++++++++ .../patch/patches/patchOriginalNextConfig.ts | 21 ++---- .../tests-unit/tests/build/helper.test.ts | 68 ++++++++++++++++++- 4 files changed, 106 insertions(+), 17 deletions(-) create mode 100644 .changeset/stale-schools-beam.md diff --git a/.changeset/stale-schools-beam.md b/.changeset/stale-schools-beam.md new file mode 100644 index 00000000..1e10b2ea --- /dev/null +++ b/.changeset/stale-schools-beam.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +Fix `findNextConfig` returning the incorrect result and also expend the return result to be an object with both the path and a new flag indicating whether the file is in TypeScript or not diff --git a/packages/open-next/src/build/helper.ts b/packages/open-next/src/build/helper.ts index 0d53e04b..da2575b5 100644 --- a/packages/open-next/src/build/helper.ts +++ b/packages/open-next/src/build/helper.ts @@ -412,3 +412,32 @@ export function getBundlerRuntime(options: BuildOptions): "webpack" | "turbopack throw new Error("Unable to determine Next.js runtime (webpack or turbopack)"); } + +/** + * Finds the path to the Next configuration file if it exists. + * + * @param appPath The directory to check for the Next config file + * @returns An object with the full path to Next config file alongside a flag indicating whether the file is in typescript if it exists, undefined otherwise + */ +export function findNextConfig({ + appPath, +}: Pick): { path: string; isTypescript: boolean } | undefined { + const extensions = [ + { ext: "ts", isTypescript: true }, + { ext: "mts", isTypescript: true }, + { ext: "cts", isTypescript: true }, + { ext: "js", isTypescript: false }, + { ext: "mjs", isTypescript: false }, + { ext: "cjs", isTypescript: false }, + ]; + + for (const { ext, isTypescript } of extensions) { + const configPath = path.join(appPath, `next.config.${ext}`); + if (fs.existsSync(configPath)) { + return { + path: configPath, + isTypescript, + }; + } + } +} diff --git a/packages/open-next/src/build/patch/patches/patchOriginalNextConfig.ts b/packages/open-next/src/build/patch/patches/patchOriginalNextConfig.ts index 1041c957..ed14902f 100644 --- a/packages/open-next/src/build/patch/patches/patchOriginalNextConfig.ts +++ b/packages/open-next/src/build/patch/patches/patchOriginalNextConfig.ts @@ -57,29 +57,18 @@ export async function patchOriginalNextConfig(options: buildHelper.BuildOptions) * @returns */ async function importNextConfigFromSource(buildOptions: buildHelper.BuildOptions) { - // Find the `next.config file with any supported extension - const tsExtensions = [".ts", ".mts", ".cts"]; - const possibleExtensions = [...tsExtensions, ".mjs", ".js", ".cjs"]; - let configPath: string | undefined; - let configExtension: string | undefined; + const nextConfigDetails = buildHelper.findNextConfig(buildOptions); - for (const ext of possibleExtensions) { - const testPath = path.join(buildOptions.appPath, `next.config${ext}`); - if (fs.existsSync(testPath)) { - configPath = testPath; - configExtension = ext; - break; - } - } - - if (!configPath || !configExtension) { + if (!nextConfigDetails) { throw new Error("Could not find next.config file"); } + const { path: configPath, isTypescript: configIsTs } = nextConfigDetails; + let configToImport: string; // Only compile if the extension is a TypeScript extension - if (tsExtensions.includes(configExtension)) { + if (configIsTs) { await build({ entryPoints: [configPath], outfile: path.join(buildOptions.tempBuildDir, "next.config.mjs"), diff --git a/packages/tests-unit/tests/build/helper.test.ts b/packages/tests-unit/tests/build/helper.test.ts index 8d42f518..43cabd13 100644 --- a/packages/tests-unit/tests/build/helper.test.ts +++ b/packages/tests-unit/tests/build/helper.test.ts @@ -1,4 +1,9 @@ -import { compareSemver } from "@opennextjs/aws/build/helper.js"; +import fs from "node:fs"; + +import { compareSemver, findNextConfig } from "@opennextjs/aws/build/helper.js"; +import { afterEach, vi } from "vitest"; + +vi.mock("node:fs"); // We don't need to test canary versions, they are stripped out describe("compareSemver", () => { @@ -65,3 +70,64 @@ describe("compareSemver", () => { expect(() => compareSemver("14.0.0", "!=" as any, "14.0.0")).toThrow(); }); }); + +describe("findNextConfig", () => { + const appPath = "/test/app"; + + beforeEach(() => { + vi.mocked(fs.existsSync).mockReset(); + }); + + test("returns next.config.js when it exists", () => { + vi.mocked(fs.existsSync).mockImplementation((filePath) => filePath === "/test/app/next.config.js"); + + expect(findNextConfig({ appPath })).toEqual({ + path: "/test/app/next.config.js", + isTypescript: false, + }); + }); + + test("returns next.config.cjs when it exists", () => { + vi.mocked(fs.existsSync).mockImplementation((filePath) => filePath === "/test/app/next.config.cjs"); + + expect(findNextConfig({ appPath })).toEqual({ + path: "/test/app/next.config.cjs", + isTypescript: false, + }); + }); + + test("returns next.config.mjs when it exists", () => { + vi.mocked(fs.existsSync).mockImplementation((filePath) => filePath === "/test/app/next.config.mjs"); + + expect(findNextConfig({ appPath })).toEqual({ + path: "/test/app/next.config.mjs", + isTypescript: false, + }); + }); + + test("returns next.config.ts when it exists", () => { + vi.mocked(fs.existsSync).mockImplementation((filePath) => filePath === "/test/app/next.config.ts"); + + expect(findNextConfig({ appPath })).toEqual({ + path: "/test/app/next.config.ts", + isTypescript: true, + }); + }); + + test("returns undefined when no config file exists", () => { + vi.mocked(fs.existsSync).mockReturnValue(false); + + expect(findNextConfig({ appPath })).toBeUndefined(); + }); + + test("returns one of matching extension when multiple configs exist", () => { + vi.mocked(fs.existsSync).mockImplementation( + (filePath) => filePath === "/test/app/next.config.js" || filePath === "/test/app/next.config.ts" + ); + + expect(findNextConfig({ appPath })).toEqual({ + path: "/test/app/next.config.ts", + isTypescript: true, + }); + }); +}); From fe987a162cb38fee90812d769ef36a979b62ab2d Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:07:14 +0100 Subject: [PATCH 07/27] Port PR https://github.com/opennextjs/opennextjs-aws/pull/1107 --- packages/open-next/src/adapters/cache.ts | 46 +++++--- packages/open-next/src/types/cache.ts | 1 + .../tests-unit/tests/adapters/cache.test.ts | 104 +++++++++++++++--- 3 files changed, 120 insertions(+), 31 deletions(-) diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index 1a4d9bc1..0bfacd6f 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -243,24 +243,36 @@ export default class Cache { } break; } - case "APP_PAGE": { - const { html, rscData, headers, status } = data; - await globalThis.incrementalCache.set( - key, - { - type: "app", - html, - rsc: rscData.toString("utf8"), - meta: { - status, - headers, - }, - revalidate, - }, - "cache" - ); - break; + case "APP_PAGE": { + const { html, rscData, headers, status, segmentData, postponed } = + data; + const segmentToWrite: Record = {}; + if (segmentData) { + for (const [ + segmentPath, + segmentContent, + ] of segmentData.entries()) { + segmentToWrite[segmentPath] = segmentContent.toString("utf8"); + } } + await globalThis.incrementalCache.set( + key, + { + type: "app", + html, + rsc: rscData.toString("utf8"), + meta: { + status, + headers, + postponed, + }, + revalidate, + segmentData: segmentData ? segmentToWrite : undefined, + }, + "cache" + ); + break; + } case "FETCH": await globalThis.incrementalCache.set(key, data, "fetch"); break; diff --git a/packages/open-next/src/types/cache.ts b/packages/open-next/src/types/cache.ts index 93999a52..db5b63f1 100644 --- a/packages/open-next/src/types/cache.ts +++ b/packages/open-next/src/types/cache.ts @@ -54,6 +54,7 @@ interface IncrementalCachedAppPageValue { headers?: Record; postponed?: string; status?: number; + segmentData?: Map; } export type IncrementalCacheValue = diff --git a/packages/tests-unit/tests/adapters/cache.test.ts b/packages/tests-unit/tests/adapters/cache.test.ts index e33c1214..12d1a478 100644 --- a/packages/tests-unit/tests/adapters/cache.test.ts +++ b/packages/tests-unit/tests/adapters/cache.test.ts @@ -318,24 +318,64 @@ describe("CacheHandler", () => { }); }); - it("Should return value when cache data type is redirect", async () => { - incrementalCache.get.mockResolvedValueOnce({ - value: { - type: "redirect", + it("Should return value when cache data type is app with segmentData and postponed (Next 15+)", async () => { + globalThis.isNextAfter15 = true; + incrementalCache.get.mockResolvedValueOnce({ + value: { + type: "app", + html: "", + rsc: "rsc-data", + segmentData: { + segment1: "data1", + segment2: "data2", }, - lastModified: Date.now(), - }); + meta: { + status: 200, + headers: { "x-custom": "value" }, + postponed: "postponed-data", + }, + }, + lastModified: Date.now(), + }); - const result = await cache.get("key", { kindHint: "app" }); + const result = await cache.get("key", { kindHint: "app" }); - expect(getIncrementalCache).toHaveBeenCalled(); - expect(result).toEqual({ - value: { - kind: "REDIRECT", - }, - lastModified: Date.now(), - }); + expect(getIncrementalCache).toHaveBeenCalled(); + expect(result).toEqual({ + value: { + kind: "APP_PAGE", + html: "", + rscData: Buffer.from("rsc-data"), + status: 200, + headers: { "x-custom": "value" }, + postponed: "postponed-data", + segmentData: new Map([ + ["segment1", Buffer.from("data1")], + ["segment2", Buffer.from("data2")], + ]), + }, + lastModified: Date.now(), }); + }); + + it("Should return value when cache data type is redirect", async () => { + incrementalCache.get.mockResolvedValueOnce({ + value: { + type: "redirect", + }, + lastModified: Date.now(), + }); + + const result = await cache.get("key", { kindHint: "app" }); + + expect(getIncrementalCache).toHaveBeenCalled(); + expect(result).toEqual({ + value: { + kind: "REDIRECT", + }, + lastModified: Date.now(), + }); + }); it("Should return null when incremental cache fails", async () => { incrementalCache.get.mockRejectedValueOnce(new Error("Error")); @@ -453,6 +493,42 @@ describe("CacheHandler", () => { ); }); + it("Should set cache when for APP_PAGE with segmentData and postponed", async () => { + const segmentData = new Map([ + ["segment1", Buffer.from("data1")], + ["segment2", Buffer.from("data2")], + ]); + + await cache.set("key", { + kind: "APP_PAGE", + html: "", + rscData: Buffer.from("rsc"), + status: 200, + headers: { "x-custom": "value" }, + segmentData, + postponed: "postponed-data", + }); + + expect(incrementalCache.set).toHaveBeenCalledWith( + "key", + { + type: "app", + html: "", + rsc: "rsc", + meta: { + status: 200, + headers: { "x-custom": "value" }, + postponed: "postponed-data", + }, + segmentData: { + segment1: "data1", + segment2: "data2", + }, + }, + "cache" + ); + }); + it("Should set cache when for FETCH", async () => { await cache.set("key", { kind: "FETCH", From 6f3d0011f5501fff201017af53bd082f68967bbc Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:09:40 +0100 Subject: [PATCH 08/27] update skills --- .claude/skills/port-pr/SKILL.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.claude/skills/port-pr/SKILL.md b/.claude/skills/port-pr/SKILL.md index 35f3b7c4..7a1733bc 100644 --- a/.claude/skills/port-pr/SKILL.md +++ b/.claude/skills/port-pr/SKILL.md @@ -66,7 +66,17 @@ pnpm code:checks This runs formatting, linting, and TypeScript checks. -### 7. Ask for Package +### 7. Run Unit Tests + +After code checks pass, run only the unit tests: + +```bash +pnpm test +``` + +**Important:** Do NOT run `pnpm e2e:test` or any full test suite. Only unit tests should be run during the porting process. + +### 8. Ask for Package Before creating the changeset, determine which package the changes apply to: @@ -74,7 +84,7 @@ Ask the user: **"Which package should this changeset be for - `@opennextjs/aws` Store the answer in `$PACKAGE_NAME` (e.g., "@opennextjs/cloudflare"). -### 8. Create Changeset +### 9. Create Changeset Create a patch changeset with the link to the PR: @@ -92,7 +102,7 @@ Ported PR #$PR_NUMBER from source repository $ARGUMENTS" > .changeset/port-pr-$PR_NUMBER.md ``` -### 9. Stage Changes and Prepare Commit +### 10. Stage Changes and Prepare Commit Stage the changeset file and prepare a commit message (but do not commit): @@ -113,7 +123,7 @@ cat /tmp/commit-message-port-pr-$PR_NUMBER.txt The changeset is staged and ready to commit. The commit message is saved at `/tmp/commit-message-port-pr-$PR_NUMBER.txt` for reference. -### 10. Summary +### 11. Summary Provide a summary of: From 643b158f45c73d698b5caf067ada52a3e439057e Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:12:49 +0100 Subject: [PATCH 09/27] Port PR https://github.com/opennextjs/opennextjs-aws/pull/1108 --- packages/open-next/package.json | 10 +- packages/open-next/src/adapters/cache.ts | 52 +- .../tests-unit/tests/adapters/cache.test.ts | 96 +- pnpm-lock.yaml | 2358 +++++++++++------ 4 files changed, 1597 insertions(+), 919 deletions(-) diff --git a/packages/open-next/package.json b/packages/open-next/package.json index f05d88a7..9be58d6f 100644 --- a/packages/open-next/package.json +++ b/packages/open-next/package.json @@ -47,11 +47,11 @@ }, "dependencies": { "@ast-grep/napi": "^0.40.0", - "@aws-sdk/client-cloudfront": "3.398.0", - "@aws-sdk/client-dynamodb": "^3.398.0", - "@aws-sdk/client-lambda": "^3.398.0", - "@aws-sdk/client-s3": "^3.398.0", - "@aws-sdk/client-sqs": "^3.398.0", + "@aws-sdk/client-cloudfront": "3.984.0", + "@aws-sdk/client-dynamodb": "3.984.0", + "@aws-sdk/client-lambda": "3.984.0", + "@aws-sdk/client-s3": "3.984.0", + "@aws-sdk/client-sqs": "3.984.0", "@node-minify/core": "^8.0.6", "@node-minify/terser": "^8.0.6", "@tsconfig/node18": "^1.0.3", diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index 0bfacd6f..715b2d4e 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -243,36 +243,32 @@ export default class Cache { } break; } - case "APP_PAGE": { - const { html, rscData, headers, status, segmentData, postponed } = - data; - const segmentToWrite: Record = {}; - if (segmentData) { - for (const [ - segmentPath, - segmentContent, - ] of segmentData.entries()) { - segmentToWrite[segmentPath] = segmentContent.toString("utf8"); + case "APP_PAGE": { + const { html, rscData, headers, status, segmentData, postponed } = data; + const segmentToWrite: Record = {}; + if (segmentData) { + for (const [segmentPath, segmentContent] of segmentData.entries()) { + segmentToWrite[segmentPath] = segmentContent.toString("utf8"); + } } - } - await globalThis.incrementalCache.set( - key, - { - type: "app", - html, - rsc: rscData.toString("utf8"), - meta: { - status, - headers, - postponed, + await globalThis.incrementalCache.set( + key, + { + type: "app", + html, + rsc: rscData.toString("utf8"), + meta: { + status, + headers, + postponed, + }, + revalidate, + segmentData: segmentData ? segmentToWrite : undefined, }, - revalidate, - segmentData: segmentData ? segmentToWrite : undefined, - }, - "cache" - ); - break; - } + "cache" + ); + break; + } case "FETCH": await globalThis.incrementalCache.set(key, data, "fetch"); break; diff --git a/packages/tests-unit/tests/adapters/cache.test.ts b/packages/tests-unit/tests/adapters/cache.test.ts index 12d1a478..2255fab2 100644 --- a/packages/tests-unit/tests/adapters/cache.test.ts +++ b/packages/tests-unit/tests/adapters/cache.test.ts @@ -318,64 +318,64 @@ describe("CacheHandler", () => { }); }); - it("Should return value when cache data type is app with segmentData and postponed (Next 15+)", async () => { - globalThis.isNextAfter15 = true; - incrementalCache.get.mockResolvedValueOnce({ - value: { - type: "app", - html: "", - rsc: "rsc-data", - segmentData: { - segment1: "data1", - segment2: "data2", + it("Should return value when cache data type is app with segmentData and postponed (Next 15+)", async () => { + globalThis.isNextAfter15 = true; + incrementalCache.get.mockResolvedValueOnce({ + value: { + type: "app", + html: "", + rsc: "rsc-data", + segmentData: { + segment1: "data1", + segment2: "data2", + }, + meta: { + status: 200, + headers: { "x-custom": "value" }, + postponed: "postponed-data", + }, }, - meta: { + lastModified: Date.now(), + }); + + const result = await cache.get("key", { kindHint: "app" }); + + expect(getIncrementalCache).toHaveBeenCalled(); + expect(result).toEqual({ + value: { + kind: "APP_PAGE", + html: "", + rscData: Buffer.from("rsc-data"), status: 200, headers: { "x-custom": "value" }, postponed: "postponed-data", + segmentData: new Map([ + ["segment1", Buffer.from("data1")], + ["segment2", Buffer.from("data2")], + ]), }, - }, - lastModified: Date.now(), - }); - - const result = await cache.get("key", { kindHint: "app" }); - - expect(getIncrementalCache).toHaveBeenCalled(); - expect(result).toEqual({ - value: { - kind: "APP_PAGE", - html: "", - rscData: Buffer.from("rsc-data"), - status: 200, - headers: { "x-custom": "value" }, - postponed: "postponed-data", - segmentData: new Map([ - ["segment1", Buffer.from("data1")], - ["segment2", Buffer.from("data2")], - ]), - }, - lastModified: Date.now(), + lastModified: Date.now(), + }); }); - }); - it("Should return value when cache data type is redirect", async () => { - incrementalCache.get.mockResolvedValueOnce({ - value: { - type: "redirect", - }, - lastModified: Date.now(), - }); + it("Should return value when cache data type is redirect", async () => { + incrementalCache.get.mockResolvedValueOnce({ + value: { + type: "redirect", + }, + lastModified: Date.now(), + }); - const result = await cache.get("key", { kindHint: "app" }); + const result = await cache.get("key", { kindHint: "app" }); - expect(getIncrementalCache).toHaveBeenCalled(); - expect(result).toEqual({ - value: { - kind: "REDIRECT", - }, - lastModified: Date.now(), + expect(getIncrementalCache).toHaveBeenCalled(); + expect(result).toEqual({ + value: { + kind: "REDIRECT", + }, + lastModified: Date.now(), + }); }); - }); it("Should return null when incremental cache fails", async () => { incrementalCache.get.mockRejectedValueOnce(new Error("Error")); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f52f7a4..182d8040 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -162,7 +162,7 @@ importers: dependencies: '@opennextjs/cloudflare': specifier: ^1.15.1 - version: 1.15.1(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))(wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0)) + version: 1.15.1(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))(wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0)) next: specifier: 16.1.4 version: 16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4) @@ -1396,20 +1396,20 @@ importers: specifier: ^0.40.0 version: 0.40.0 '@aws-sdk/client-cloudfront': - specifier: 3.398.0 - version: 3.398.0(aws-crt@1.23.0) + specifier: 3.984.0 + version: 3.984.0(aws-crt@1.23.0) '@aws-sdk/client-dynamodb': - specifier: ^3.398.0 - version: 3.678.0(aws-crt@1.23.0) + specifier: 3.984.0 + version: 3.984.0(aws-crt@1.23.0) '@aws-sdk/client-lambda': - specifier: ^3.398.0 - version: 3.678.0(aws-crt@1.23.0) + specifier: 3.984.0 + version: 3.984.0(aws-crt@1.23.0) '@aws-sdk/client-s3': - specifier: ^3.398.0 - version: 3.678.0(aws-crt@1.23.0) + specifier: 3.984.0 + version: 3.984.0(aws-crt@1.23.0) '@aws-sdk/client-sqs': - specifier: ^3.398.0 - version: 3.678.0(aws-crt@1.23.0) + specifier: 3.984.0 + version: 3.984.0(aws-crt@1.23.0) '@node-minify/core': specifier: ^8.0.6 version: 8.0.6 @@ -1558,24 +1558,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-arm64-musl@0.40.0': resolution: {integrity: sha512-MS9qalLRjUnF2PCzuTKTvCMVSORYHxxe3Qa0+SSaVULsXRBmuy5C/b1FeWwMFnwNnC0uie3VDet31Zujwi8q6A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@ast-grep/napi-linux-x64-gnu@0.40.0': resolution: {integrity: sha512-BeHZVMNXhM3WV3XE2yghO0fRxhMOt8BTN972p5piYEQUvKeSHmS8oeGcs6Ahgx5znBclqqqq37ZfioYANiTqJA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-x64-musl@0.40.0': resolution: {integrity: sha512-rG1YujF7O+lszX8fd5u6qkFTuv4FwHXjWvt1CCvCxXwQLSY96LaCW88oVKg7WoEYQh54y++Fk57F+Wh9Gv9nVQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@ast-grep/napi-win32-arm64-msvc@0.40.0': resolution: {integrity: sha512-9SqmnQqd4zTEUk6yx0TuW2ycZZs2+e569O/R0QnhSiQNpgwiJCYOe/yPS0BC9HkiaozQm6jjAcasWpFtz/dp+w==} @@ -1688,13 +1692,17 @@ packages: resolution: {integrity: sha512-kISKhqN1k48TaMPbLgq9jj7mO2jvbJdhirvfu4JW3jhFhENnkY0oCwTPvR4Q6Ne2as6GFAMo2XZDZq4rxC7YDw==} engines: {node: '>=14.0.0'} + '@aws-sdk/client-cloudfront@3.984.0': + resolution: {integrity: sha512-couDuDLpJtoeWne/nYyJ+I+5ntBVdNgBVRTCoDaXuVV7OC3u/wz5Ps0+GogspEwMLEFoOJ8t691h3YXQtnpQTw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/client-cognito-identity@3.678.0': resolution: {integrity: sha512-cSIWC9q3GBFjTzqTZTOHILxWln9YQGce3o7Jx1m4XCN16ITRiliFgiw3rbAc1H1vtYy4LfvymhC55iU80jB+4A==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-dynamodb@3.678.0': - resolution: {integrity: sha512-WTJuye7WH5Vc9eCFQUxogcoKoFOPfNnNGjs8795Q0rwQMCOzBCfzdaB4a4bFX8uxhHxcaFjupwj1aS1nijUvXw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-dynamodb@3.984.0': + resolution: {integrity: sha512-8/Oft9MWQtbG6p9f8eY5fsKC2CcO5YVDlwive8eUYS9mEbgnyQxm68OyH26WvsSTykQ9QkIbR+fOG56RsIBODw==} + engines: {node: '>=20.0.0'} '@aws-sdk/client-ecs@3.678.0': resolution: {integrity: sha512-vLs+TbPgiFW2eAglFpMwyMyFS0WHFazvpFpZ8Yl3oCQEZ3YgsF+0qSMoNDJNnbxZtFPysnF5ePdwvlESe4lwAw==} @@ -1720,21 +1728,25 @@ packages: resolution: {integrity: sha512-3D2tTrJg8A8sXYvzc0SrPYBfaRgcq/7D5KGWnoonEEM8bZxORBS69aZU6ihZFEKNykvuoIoky6EoCu2HA6HOPA==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-lambda@3.984.0': + resolution: {integrity: sha512-kqwNBIGNxGVhINwgN/UQfdsQkaMjbu9PFV2EhATWouV+RT60uMjK9JENgLDwbgJmEVbbnPsh9HaZ5KKwPSdiDg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/client-rds-data@3.678.0': resolution: {integrity: sha512-NWhemxWc3MWVGeb0sqY3t86wluebOikEJweOeEHdwkxbcBh49vCACEPOZUX8VqzDLpK6AFqljQCg4ktqNcQOlg==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-s3@3.678.0': - resolution: {integrity: sha512-2N+cGerOtcijYVRThakA1wwaXjdb7bNX8fMnmNzfqsRu1kASCPNvefhPTAiNl//Hf2l2d+H8TdI3wtLw0KurBQ==} - engines: {node: '>=16.0.0'} - '@aws-sdk/client-s3@3.974.0': resolution: {integrity: sha512-X+vpXNJ8cU8Iw1FtDgDHxo9z6RxlXfcTtpdGnKws4rk+tCYKSAor/DG6BRMzbh4E5xAA7DiU1Ny3BTrRRSt/Yg==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sqs@3.678.0': - resolution: {integrity: sha512-eTIxo7rm0aCU2sR9r++B6VjzZgcjB6ExapzBXWm4MlKepXDWw4Uf4tTA8/HzzLIKT0dczSbWyjnhEVnGbisHzw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-s3@3.984.0': + resolution: {integrity: sha512-7ny2Slr93Y+QniuluvcfWwyDi32zWQfznynL56Tk0vVh7bWrvS/odm8WP2nInKicRVNipcJHY2YInur6Q/9V0A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-sqs@3.984.0': + resolution: {integrity: sha512-TDvHpOUWlpanc3xQ5Xw0y8L2hoojBFCCSmXQ/6rKqGOf1ScX3dMA+K9aF0Zp0iwjhSh4VvsHD42esl8XwQZDjA==} + engines: {node: '>=20.0.0'} '@aws-sdk/client-ssm@3.678.0': resolution: {integrity: sha512-vJO7iieQq09bMKaGgESibzZaLgm0MIuR9m7SmEPZGMJ4wKhgOosm/P8lFMU+q0lHtCHoxdvjSYcUQga6ZN+fww==} @@ -1783,10 +1795,18 @@ packages: resolution: {integrity: sha512-qy3Fmt8z4PRInM3ZqJmHihQ2tfCdj/MzbGaZpuHjYjgl1/Gcar4Pyp/zzHXh9hGEb61WNbWgsJcDUhnGIiX1TA==} engines: {node: '>=20.0.0'} + '@aws-sdk/core@3.973.23': + resolution: {integrity: sha512-aoJncvD1XvloZ9JLnKqTRL9dBy+Szkryoag9VT+V1TqsuUgIxV9cnBVM/hrDi2vE8bDqLiDR8nirdRcCdtJu0w==} + engines: {node: '>=20.0.0'} + '@aws-sdk/crc64-nvme@3.972.0': resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} engines: {node: '>=20.0.0'} + '@aws-sdk/crc64-nvme@3.972.5': + resolution: {integrity: sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-cognito-identity@3.678.0': resolution: {integrity: sha512-t9bgu2Kc0H8FdQsSrkIJ42vis0CaVxUlA0wmmNyh268ZZyT9lKXUmf91QIhWbZ1zHx8Ek2u301xusoIaj4mLHA==} engines: {node: '>=16.0.0'} @@ -1803,6 +1823,10 @@ packages: resolution: {integrity: sha512-/etNHqnx96phy/SjI0HRC588o4vKH5F0xfkZ13yAATV7aNrb+5gYGNE6ePWafP+FuZ3HkULSSlJFj0AxgrAqYw==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-env@3.972.21': + resolution: {integrity: sha512-BkAfKq8Bd4shCtec1usNz//urPJF/SZy14qJyxkSaRJQ/Vv1gVh0VZSTmS7aE6aLMELkFV5wHHrS9ZcdG8Kxsg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.678.0': resolution: {integrity: sha512-EvpmP0nc7ddRp0qwJOSu0uBXa+MMk4+OLlyEJcdaHnZI4/BoyVWr5fJUD5eQYZk11LZPZSvnsliYXWwLyVNXHQ==} engines: {node: '>=16.0.0'} @@ -1811,6 +1835,10 @@ packages: resolution: {integrity: sha512-AeopObGW5lpWbDRZ+t4EAtS7wdfSrHPLeFts7jaBzgIaCCD7TL7jAyAB9Y5bCLOPF+17+GL54djCCsjePljUAw==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.972.23': + resolution: {integrity: sha512-4XZ3+Gu5DY8/n8zQFHBgcKTF7hWQl42G6CY9xfXVo2d25FM/lYkpmuzhYopYoPL1ITWkJ2OSBQfYEu5JRfHOhA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.398.0': resolution: {integrity: sha512-AsK1lStK3nB9Cn6S6ODb1ktGh7SRejsNVQVKX3t5d3tgOaX+aX1Iwy8FzM/ZEN8uCloeRifUGIY9uQFygg5mSw==} engines: {node: '>=14.0.0'} @@ -1825,10 +1853,18 @@ packages: resolution: {integrity: sha512-OdbJA3v+XlNDsrYzNPRUwr8l7gw1r/nR8l4r96MDzSBDU8WEo8T6C06SvwaXR8SpzsjO3sq5KMP86wXWg7Rj4g==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.972.23': + resolution: {integrity: sha512-PZLSmU0JFpNCDFReidBezsgL5ji9jOBry8CnZdw4Jj6d0K2z3Ftnp44NXgADqYx5BLMu/ZHujfeJReaDoV+IwQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.972.1': resolution: {integrity: sha512-CccqDGL6ZrF3/EFWZefvKW7QwwRdxlHUO8NVBKNVcNq6womrPDvqB6xc9icACtE0XB0a7PLoSTkAg8bQVkTO2w==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.972.23': + resolution: {integrity: sha512-OmE/pSkbMM3dCj1HdOnZ5kXnKK+R/Yz+kbBugraBecp0pGAs21eEURfQRz+1N2gzIHLVyGIP1MEjk/uSrFsngg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-node@3.398.0': resolution: {integrity: sha512-odmI/DSKfuWUYeDnGTCEHBbC8/MwnF6yEq874zl6+owoVv0ZsYP8qBHfiJkYqrwg7wQ7Pi40sSAPC1rhesGwzg==} engines: {node: '>=14.0.0'} @@ -1841,6 +1877,10 @@ packages: resolution: {integrity: sha512-DwXPk9GfuU/xG9tmCyXFVkCr6X3W8ZCoL5Ptb0pbltEx1/LCcg7T+PBqDlPiiinNCD6ilIoMJDWsnJ8ikzZA7Q==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-node@3.972.24': + resolution: {integrity: sha512-9Jwi7aps3AfUicJyF5udYadPypPpCwUZ6BSKr/QjRbVCpRVS1wc+1Q6AEZ/qz8J4JraeRd247pSzyMQSIHVebw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.398.0': resolution: {integrity: sha512-WrkBL1W7TXN508PA9wRXPFtzmGpVSW98gDaHEaa8GolAPHMPa5t2QcC/z/cFpglzrcVv8SA277zu9Z8tELdZhg==} engines: {node: '>=14.0.0'} @@ -1853,6 +1893,10 @@ packages: resolution: {integrity: sha512-bi47Zigu3692SJwdBvo8y1dEwE6B61stCwCFnuRWJVTfiM84B+VTSCV661CSWJmIZzmcy7J5J3kWyxL02iHj0w==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.972.21': + resolution: {integrity: sha512-nRxbeOJ1E1gVA0lNQezuMVndx+ZcuyaW/RB05pUsznN5BxykSlH6KkZ/7Ca/ubJf3i5N3p0gwNO5zgPSCzj+ww==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.398.0': resolution: {integrity: sha512-2Dl35587xbnzR/GGZqA2MnFs8+kS4wbHQO9BioU0okA+8NRueohNMdrdQmQDdSNK4BfIpFspiZmFkXFNyEAfgw==} engines: {node: '>=14.0.0'} @@ -1865,6 +1909,10 @@ packages: resolution: {integrity: sha512-dLZVNhM7wSgVUFsgVYgI5hb5Z/9PUkT46pk/SHrSmUqfx6YDvoV4YcPtaiRqviPpEGGiRtdQMEadyOKIRqulUQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.972.23': + resolution: {integrity: sha512-APUccADuYPLL0f2htpM8Z4czabSmHOdo4r41W6lKEZdy++cNJ42Radqy6x4TopENzr3hR6WYMyhiuiqtbf/nAA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.398.0': resolution: {integrity: sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==} engines: {node: '>=14.0.0'} @@ -1879,42 +1927,50 @@ packages: resolution: {integrity: sha512-YMDeYgi0u687Ay0dAq/pFPKuijrlKTgsaB/UATbxCs/FzZfMiG4If5ksywHmmW7MiYUF8VVv+uou3TczvLrN4w==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.23': + resolution: {integrity: sha512-H5JNqtIwOu/feInmMMWcK0dL5r897ReEn7n2m16Dd0DPD9gA2Hg8Cq4UDzZ/9OzaLh/uqBM6seixz0U6Fi2Eag==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-providers@3.678.0': resolution: {integrity: sha512-cF6IvQI1Jf5nJrK/Q7y3yFSQ8hv6MQ1g7HmZNo1tZTkywhfB3/zKcIFe6YftQul/s6RGHotXC2fr8jDkYQFDSQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/endpoint-cache@3.678.0': - resolution: {integrity: sha512-j2J1L7PPfiiikXzwhtsz4G9GcN87Z3t6TK3uNF163kGdxiDbU+EaNzsgfW+OUGoRm2PmxvkZiH764FVrXyfgAQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/dynamodb-codec@3.972.24': + resolution: {integrity: sha512-J4qDdBAV8Gq87B2jnX1y4brRlnlta2lIZma7HfQDlkNYo7abSWF0n8quzK9a0wG7UOMfBDzL5jP+1lt3ufggOQ==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.667.0': - resolution: {integrity: sha512-XGz4jMAkDoTyFdtLz7ZF+C05IAhCTC1PllpvTBaj821z/L0ilhbqVhrT/f2Buw8Id/K5A390csGXgusXyrFFjA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/endpoint-cache@3.972.4': + resolution: {integrity: sha512-GdASDnWanLnHxKK0hqV97xz23QmfA/C8yGe0PiuEmWiHSe+x+x+mFEj4sXqx9IbfyPncWz8f4EhNwBSG9cgYCg==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.972.1': resolution: {integrity: sha512-YVvoitBdE8WOpHqIXvv49efT73F4bJ99XH2bi3Dn3mx7WngI4RwHwn/zF5i0q1Wdi5frGSCNF3vuh+pY817//w==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-endpoint-discovery@3.678.0': - resolution: {integrity: sha512-N9nsZPyhK4hKBywE+UmHEibAbtUOcorEeiKa9cInMQHdXTAVrdGiVibOoUjbdnZfhAVq8vn6ktIHZAll+a9+Ow==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.972.8': + resolution: {integrity: sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.667.0': - resolution: {integrity: sha512-0TiSL9S5DSG95NHGIz6qTMuV7GDKVn8tvvGSrSSZu/wXO3JaYSH0AElVpYfc4PtPRqVpEyNA7nnc7W56mMCLWQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-endpoint-discovery@3.972.8': + resolution: {integrity: sha512-S0oXx1QbSpMDBMJn4P0hOxW8ieGAdRT+G9NbL+ESWkkoCGf9D++fKYD2fyBGtIy88OrP7wgECpXgGLAcGpIj0A==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-expect-continue@3.972.1': resolution: {integrity: sha512-6lfl2/J/kutzw/RLu1kjbahsz4vrGPysrdxWaw8fkjLYG+6M6AswocIAZFS/LgAVi/IWRwPTx9YC0/NH2wDrSw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.678.0': - resolution: {integrity: sha512-IyWWXVvG4IJ9vkagTF8wkNtybKU5SWYIQ1BRDiCmoDyLPOpogNOBVnn10RX9FW7J7BMAUFgtx6N1uMQ8MitDiA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-expect-continue@3.972.8': + resolution: {integrity: sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-flexible-checksums@3.972.1': resolution: {integrity: sha512-kjVVREpqeUkYQsXr78AcsJbEUlxGH7+H6yS7zkjrnu6HyEVxbdSndkKX6VpKneFOihjCAhIXlk4wf3butDHkNQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.974.3': + resolution: {integrity: sha512-fB7FNLH1+VPUs0QL3PLrHW+DD4gKu6daFgWtyq3R0Y0Lx8DLZPvyGAxCZNFBxH+M2xt9KvBJX6USwjuqvitmCQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-host-header@3.398.0': resolution: {integrity: sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==} engines: {node: '>=14.0.0'} @@ -1927,14 +1983,18 @@ packages: resolution: {integrity: sha512-/R82lXLPmZ9JaUGSUdKtBp2k/5xQxvBT3zZWyKiBOhyulFotlfvdlrO8TnqstBimsl4lYEYySDL+W6ldFh6ALg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.667.0': - resolution: {integrity: sha512-ob85H3HhT3/u5O+x0o557xGZ78vSNeSSwMaSitxdsfs2hOuoUl1uk+OeLpi1hkuJnL41FPpokV7TVII2XrFfmg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-host-header@3.972.8': + resolution: {integrity: sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-location-constraint@3.972.1': resolution: {integrity: sha512-YisPaCbvBk9gY5aUI8jDMDKXsLZ9Fet0WYj1MviK8tZYMgxBIYHM6l3O/OHaAIujojZvamd9F3haYYYWp5/V3w==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-location-constraint@3.972.8': + resolution: {integrity: sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-logger@3.398.0': resolution: {integrity: sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==} engines: {node: '>=14.0.0'} @@ -1947,6 +2007,10 @@ packages: resolution: {integrity: sha512-JGgFl6cHg9G2FHu4lyFIzmFN8KESBiRr84gLC3Aeni0Gt1nKm+KxWLBuha/RPcXxJygGXCcMM4AykkIwxor8RA==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-logger@3.972.8': + resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-recursion-detection@3.398.0': resolution: {integrity: sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==} engines: {node: '>=14.0.0'} @@ -1959,6 +2023,10 @@ packages: resolution: {integrity: sha512-taGzNRe8vPHjnliqXIHp9kBgIemLE/xCaRTMH1NH0cncHeaPcjxtnCroAAM9aOlPuKvBe2CpZESyvM1+D8oI7Q==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-recursion-detection@3.972.8': + resolution: {integrity: sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-retry@3.374.0': resolution: {integrity: sha512-ZnT84qnT+Zmelv7y6hAqgAEaZgpGlrvf/+rchNWT0oG4duxI5bLWcRi9U88Jz7G8JgNQcGKJqPfC6oogCd7p8w==} engines: {node: '>=14.0.0'} @@ -1976,9 +2044,13 @@ packages: resolution: {integrity: sha512-q/hK0ZNf/aafFRv2wIlDM3p+izi5cXwktVNvRvW646A0MvVZmT4/vwadv/jPA9AORFbnpyf/0luxiMz181f9yg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-sqs@3.667.0': - resolution: {integrity: sha512-1bZm+b7SS6X9BNBdwksIopHeidNk0YtV1nisxQiIwsDMkPdkTeRSCSKxb2ON82Kp6Ge4+sgkF0EGTU8ht5I97g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-sdk-s3@3.972.23': + resolution: {integrity: sha512-50QgHGPQAb2veqFOmTF1A3GsAklLHZXL47KbY35khIkfbXH5PLvqpEc/gOAEBPj/yFxrlgxz/8mqWcWTNxBkwQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-sdk-sqs@3.972.17': + resolution: {integrity: sha512-LnzPRRoDXGtlFV2G1p2rsY6fRKrbf6Pvvc21KliSLw3+NmQca2+Aa1QIMRbpQvZYedsSqkGYwxe+qvXwQ2uxDw==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-sdk-sts@3.398.0': resolution: {integrity: sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==} @@ -1992,14 +2064,14 @@ packages: resolution: {integrity: sha512-lKOrS5ZzR43+1XYyeFXcwl2TrteUpuXt3La+qFaLnqtSui8fqacJ+h5Ndx4xC6eNPLl/Sy9Ew6m3MgXm7hPbNg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-ssec@3.667.0': - resolution: {integrity: sha512-1wuAUZIkmZIvOmGg5qNQU821CGFHhkuKioxXgNh0DpUxZ9+AeiV7yorJr+bqkb2KBFv1i1TnzGRecvKf/KvZIQ==} - engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-ssec@3.972.1': resolution: {integrity: sha512-fLtRTPd/MxJT2drJKft2GVGKm35PiNEeQ1Dvz1vc/WhhgAteYrp4f1SfSgjgLaYWGMExESJL4bt8Dxqp6tVsog==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-ssec@3.972.8': + resolution: {integrity: sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-user-agent@3.398.0': resolution: {integrity: sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==} engines: {node: '>=14.0.0'} @@ -2012,10 +2084,18 @@ packages: resolution: {integrity: sha512-6SVg4pY/9Oq9MLzO48xuM3lsOb8Rxg55qprEtFRpkUmuvKij31f5SQHEGxuiZ4RqIKrfjr2WMuIgXvqJ0eJsPA==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-user-agent@3.972.24': + resolution: {integrity: sha512-dLTWy6IfAMhNiSEvMr07g/qZ54be6pLqlxVblbF6AzafmmGAzMMj8qMoY9B4+YgT+gY9IcuxZslNh03L6PyMCQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/nested-clients@3.974.0': resolution: {integrity: sha512-k3dwdo/vOiHMJc9gMnkPl1BA5aQfTrZbz+8fiDkWrPagqAioZgmo5oiaOaeX0grObfJQKDtcpPFR4iWf8cgl8Q==} engines: {node: '>=20.0.0'} + '@aws-sdk/nested-clients@3.996.13': + resolution: {integrity: sha512-ptZ1HF4yYHNJX8cgFF+8NdYO69XJKZn7ft0/ynV3c0hCbN+89fAbrLS+fqniU2tW8o9Kfqhj8FUh+IPXb2Qsuw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.667.0': resolution: {integrity: sha512-iNr+JhhA902JMKHG9IwT9YdaEx6KGl6vjAL5BRNeOjfj4cZYMog6Lz/IlfOAltMtT0w88DAHDEFrBd2uO0l2eg==} engines: {node: '>=16.0.0'} @@ -2024,6 +2104,10 @@ packages: resolution: {integrity: sha512-voIY8RORpxLAEgEkYaTFnkaIuRwVBEc+RjVZYcSSllPV+ZEKAacai6kNhJeE3D70Le+JCfvRb52tng/AVHY+jQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.972.9': + resolution: {integrity: sha512-eQ+dFU05ZRC/lC2XpYlYSPlXtX3VT8sn5toxN2Fv7EXlMoA2p9V7vUBKqHunfD4TRLpxUq8Y8Ol/nCqiv327Ng==} + engines: {node: '>=20.0.0'} + '@aws-sdk/s3-request-presigner@3.974.0': resolution: {integrity: sha512-tApmJb4XXBdNQzxTYIBq9aYj8vjJqiMPyeUF25wzvGjLQfXgvcv5sTR4yyzXBxRc8+O7quWDBgMJGtcNerapRQ==} engines: {node: '>=20.0.0'} @@ -2040,11 +2124,19 @@ packages: resolution: {integrity: sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/signature-v4-multi-region@3.984.0': + resolution: {integrity: sha512-TaWbfYCwnuOSvDSrgs7QgoaoXse49E7LzUkVOUhoezwB7bkmhp+iojADm7UepCEu4021SquD7NG1xA+WCvmldA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/smithy-client@3.374.0': resolution: {integrity: sha512-YQBdO/Nv5EXBg/qfMF4GgYYLNN3Y/06MyuVBYILC1TKAnMoLy2FV0VOYyediagepAcWPdJqyUq4MCNNBy0CPRg==} engines: {node: '>=14.0.0'} deprecated: This package has moved to @smithy/smithy-client + '@aws-sdk/token-providers@3.1014.0': + resolution: {integrity: sha512-gHTHNUoaOGNrSWkl32A7wFsU78jlNTlqMccLu0byUk5CysYYXaxNMIonIVr4YcykC7vgtDS5ABuz83giy6fzJA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.398.0': resolution: {integrity: sha512-nrYgjzavGCKJL/48Vt0EL+OlIc5UZLfNGpgyUW9cv3XZwl+kXV0QB+HH0rHZZLfpbBgZ2RBIJR9uD5ieu/6hpQ==} engines: {node: '>=14.0.0'} @@ -2079,6 +2171,10 @@ packages: resolution: {integrity: sha512-jYIdB7a7jhRTvyb378nsjyvJh1Si+zVduJ6urMNGpz8RjkmHZ+9vM2H07XaIB2Cfq0GhJRZYOfUCH8uqQhqBkQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/types@3.973.6': + resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-arn-parser@3.568.0': resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} engines: {node: '>=16.0.0'} @@ -2091,6 +2187,10 @@ packages: resolution: {integrity: sha512-XnNit6H9PPHhqUXW/usjX6JeJ6Pm8ZNqivTjmNjgWHeOfVpblUc/MTic02UmCNR0jJLPjQ3mBKiMen0tnkNQjQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/util-arn-parser@3.972.3': + resolution: {integrity: sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-endpoints@3.398.0': resolution: {integrity: sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==} engines: {node: '>=14.0.0'} @@ -2103,6 +2203,14 @@ packages: resolution: {integrity: sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==} engines: {node: '>=20.0.0'} + '@aws-sdk/util-endpoints@3.984.0': + resolution: {integrity: sha512-9ebjLA0hMKHeVvXEtTDCCOBtwjb0bOXiuUV06HNeVdgAjH6gj4x4Zwt4IBti83TiyTGOCl5YfZqGx4ehVsasbQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.996.5': + resolution: {integrity: sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-format-url@3.972.1': resolution: {integrity: sha512-8wJ4/XOLU/RIYBHsXsIOTR04bNmalC8F2YPMyf3oL8YC750M3Rv5WGywW0Fo07HCv770KXJOzVq03Gyl68moFg==} engines: {node: '>=20.0.0'} @@ -2120,6 +2228,9 @@ packages: '@aws-sdk/util-user-agent-browser@3.972.1': resolution: {integrity: sha512-IgF55NFmJX8d9Wql9M0nEpk2eYbuD8G4781FN4/fFgwTXBn86DvlZJuRWDCMcMqZymnBVX7HW9r+3r9ylqfW0w==} + '@aws-sdk/util-user-agent-browser@3.972.8': + resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} + '@aws-sdk/util-user-agent-node@3.398.0': resolution: {integrity: sha512-RTVQofdj961ej4//fEkppFf4KXqKGMTCqJYghx3G0C/MYXbg7MGl7LjfNGtJcboRE8pfHHQ/TUWBDA7RIAPPlQ==} engines: {node: '>=14.0.0'} @@ -2147,6 +2258,15 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.973.10': + resolution: {integrity: sha512-E99zeTscCc+pTMfsvnfi6foPpKmdD1cZfOC7/P8UUrjsoQdg9VEWPRD+xdFduKnfPXwcvby58AlO9jwwF6U96g==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} @@ -2154,10 +2274,6 @@ packages: resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} engines: {node: '>=14.0.0'} - '@aws-sdk/xml-builder@3.662.0': - resolution: {integrity: sha512-ikLkXn0igUpnJu2mCZjklvmcDGWT9OaLRv3JyC/cRkTaaSrblPjPM7KKsltxdMTLQ+v7fjCN0TsJpxphMfaOPA==} - engines: {node: '>=16.0.0'} - '@aws-sdk/xml-builder@3.972.0': resolution: {integrity: sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==} engines: {node: '>=20.0.0'} @@ -2166,6 +2282,10 @@ packages: resolution: {integrity: sha512-6zZGlPOqn7Xb+25MAXGb1JhgvaC5HjZj6GzszuVrnEgbhvzBRFGKYemuHBV4bho+dtqeYKPgaZUv7/e80hIGNg==} engines: {node: '>=20.0.0'} + '@aws-sdk/xml-builder@3.972.15': + resolution: {integrity: sha512-PxMRlCFNiQnke9YR29vjFQwz4jq+6Q04rOVFeTDR2K7Qpv9h9FOWOxG+zJjageimYbWqE3bTuLjmryWHAWbvaA==} + engines: {node: '>=20.0.0'} + '@aws/lambda-invoke-store@0.2.3': resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} engines: {node: '>=18.0.0'} @@ -3704,155 +3824,183 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -4136,144 +4284,168 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@15.0.0-canary.174': resolution: {integrity: sha512-kVEibHYyQ12zzFPY+YHbYX9z81HhLVK5pQgt1NlFet2M0iBj1PxvOJuu6In1EEV7f3jNEr4r3gf5ieyY3ywnLw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@15.4.0-canary.14': resolution: {integrity: sha512-u/eeGK9okYiJ24aLcrq2jOCyOnjhzOM/MkcOOMkzE4/Rp7EKIepnGUhnIcLeLmcQw4RCDAjh3QZBqt5rQEm4fA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@15.5.7': resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@16.0.10': resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@16.1.4': resolution: {integrity: sha512-POQ65+pnYOkZNdngWfMEt7r53bzWiKkVNbjpmCt1Zb3V6lxJNXSsjwRuTQ8P/kguxDC8LRkqaL3vvsFrce4dMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@14.2.33': resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@15.0.0-canary.174': resolution: {integrity: sha512-NzfcraJW3jpWDx3dJHzMxLFUAJxdq9GROpO49SIWXu9HKmdZszrInTfnYK98v2C73FNnpFoCGEvBYi/GTnvECw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@15.4.0-canary.14': resolution: {integrity: sha512-6eODbSA592cYMYtBU9Vm2D8ApXn6dBh/cN7GQlsTiDBIlCId9Z8DlkGCDj/9thr0JEluUlkt379+B19BGxsCEg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@15.5.7': resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@16.0.10': resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@16.1.4': resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@14.2.33': resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@15.0.0-canary.174': resolution: {integrity: sha512-fJ5W8PrbZZkxCrtX9lmlqn43zvUrQQ5wF/GxcQDFdcwT9l3lx8IhdMZH7Q5rWuikWpI0pU+jqqRdhTpODqpuHA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@15.4.0-canary.14': resolution: {integrity: sha512-FwOtQDbMLJmGPCg8p1ZilCBjfjBZGBRwXnWmxLmpO4lcWTWMFTCfAxkqCUi62zXBZUJztqT8TgXQ9VBk4BKukQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@15.5.7': resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@16.0.10': resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@16.1.4': resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@14.2.33': resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@15.0.0-canary.174': resolution: {integrity: sha512-OMSzmdZxrh5c7X46ILiK3GvTPgSZghpSFF4wrnXloBpW1LrbbjSYGVSGer5IoVqXR18lpnMscsV9N35FX0MIVw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@15.4.0-canary.14': resolution: {integrity: sha512-0k8lkaryoYsB4wksRm/5SlWWtJjuq6vOzQ/zqKRlNdpNvsvzZ61sEaCLZn1zdcFcUVH6wSzK/GMclcpn2w0VAg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@15.5.7': resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@16.0.10': resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@16.1.4': resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@14.2.33': resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} @@ -4482,21 +4654,25 @@ packages: resolution: {integrity: sha512-aql/LLYriX/5Ar7o5Qivnp/qMTUPNiOCr7cFLvmvzYZa3XL0H8XtbKUfIVm+9ILR0urXQzcml+L8pLe1p8sgEg==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxfmt/linux-arm64-musl@0.27.0': resolution: {integrity: sha512-6u/kNb7hubthg4u/pn3MK/GJLwPgjDvDDnjjr7TC0/OK/xztef8ToXmycxIQ9OeDNIJJf7Z0Ss/rHnKvQOWzRw==} cpu: [arm64] os: [linux] + libc: [musl] '@oxfmt/linux-x64-gnu@0.27.0': resolution: {integrity: sha512-EhvDfFHO1yrK/Cu75eU1U828lBsW2cV0JITOrka5AjR3PlmnQQ03Mr9ROkWkbPmzAMklXI4Q16eO+4n+7FhS1w==} cpu: [x64] os: [linux] + libc: [glibc] '@oxfmt/linux-x64-musl@0.27.0': resolution: {integrity: sha512-1pgjuwMT5sCekuteYZ7LkDsto7DJouaccwjozHqdWohSj2zJpFeSP2rMaC+6JJ1KD5r9HG9sWRuHZGEaoX9uOw==} cpu: [x64] os: [linux] + libc: [musl] '@oxfmt/win32-arm64@0.27.0': resolution: {integrity: sha512-mmuEhXZEhAYAeyjVTWwGKIA3RSb2b/He9wrXkDJPhmqp8qISUzkVg1dQmLEt4hD+wI5rzR+6vchPt521tzuRDA==} @@ -4522,21 +4698,25 @@ packages: resolution: {integrity: sha512-j4QzfCM8ks+OyM+KKYWDiBEQsm5RCW50H1Wz16wUyoFsobJ+X5qqcJxq6HvkE07m8euYmZelyB0WqsiDoz1v8g==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxlint/linux-arm64-musl@1.42.0': resolution: {integrity: sha512-g5b1Uw7zo6yw4Ymzyd1etKzAY7xAaGA3scwB8tAp3QzuY7CYdfTwlhiLKSAKbd7T/JBgxOXAGNcLDorJyVTXcg==} cpu: [arm64] os: [linux] + libc: [musl] '@oxlint/linux-x64-gnu@1.42.0': resolution: {integrity: sha512-HnD99GD9qAbpV4q9iQil7mXZUJFpoBdDavfcC2CgGLPlawfcV5COzQPNwOgvPVkr7C0cBx6uNCq3S6r9IIiEIg==} cpu: [x64] os: [linux] + libc: [glibc] '@oxlint/linux-x64-musl@1.42.0': resolution: {integrity: sha512-8NTe8A78HHFn+nBi+8qMwIjgv9oIBh+9zqCPNLH56ah4vKOPvbePLI6NIv9qSkmzrBuu8SB+FJ2TH/G05UzbNA==} cpu: [x64] os: [linux] + libc: [musl] '@oxlint/win32-arm64@1.42.0': resolution: {integrity: sha512-lAPS2YAuu+qFqoTNPFcNsxXjwSV0M+dOgAzzVTAN7Yo2ifj+oLOx0GsntWoM78PvQWI7Q827ZxqtU2ImBmDapA==} @@ -4718,46 +4898,55 @@ packages: resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} @@ -4805,20 +4994,18 @@ packages: resolution: {integrity: sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==} engines: {node: '>=16.0.0'} + '@smithy/abort-controller@4.2.12': + resolution: {integrity: sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==} + engines: {node: '>=18.0.0'} + '@smithy/abort-controller@4.2.8': resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@3.0.1': - resolution: {integrity: sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==} - '@smithy/chunked-blob-reader-native@4.2.1': resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@4.0.0': - resolution: {integrity: sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==} - '@smithy/chunked-blob-reader@5.2.0': resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} engines: {node: '>=18.0.0'} @@ -4835,6 +5022,10 @@ packages: resolution: {integrity: sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==} engines: {node: '>=16.0.0'} + '@smithy/config-resolver@4.4.13': + resolution: {integrity: sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==} + engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.4.6': resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} @@ -4847,6 +5038,10 @@ packages: resolution: {integrity: sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==} engines: {node: '>=18.0.0'} + '@smithy/core@3.23.12': + resolution: {integrity: sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@2.3.0': resolution: {integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==} engines: {node: '>=14.0.0'} @@ -4855,6 +5050,10 @@ packages: resolution: {integrity: sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==} engines: {node: '>=16.0.0'} + '@smithy/credential-provider-imds@4.2.12': + resolution: {integrity: sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.8': resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} engines: {node: '>=18.0.0'} @@ -4910,13 +5109,14 @@ packages: '@smithy/fetch-http-handler@4.0.0': resolution: {integrity: sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==} + '@smithy/fetch-http-handler@5.3.15': + resolution: {integrity: sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==} + engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@5.3.9': resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@3.1.7': - resolution: {integrity: sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==} - '@smithy/hash-blob-browser@4.2.9': resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==} engines: {node: '>=18.0.0'} @@ -4929,14 +5129,14 @@ packages: resolution: {integrity: sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==} engines: {node: '>=16.0.0'} + '@smithy/hash-node@4.2.12': + resolution: {integrity: sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==} + engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.2.8': resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@3.1.7': - resolution: {integrity: sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==} - engines: {node: '>=16.0.0'} - '@smithy/hash-stream-node@4.2.8': resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==} engines: {node: '>=18.0.0'} @@ -4947,6 +5147,10 @@ packages: '@smithy/invalid-dependency@3.0.8': resolution: {integrity: sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==} + '@smithy/invalid-dependency@4.2.12': + resolution: {integrity: sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==} + engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.2.8': resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} engines: {node: '>=18.0.0'} @@ -4967,8 +5171,9 @@ packages: resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@3.0.8': - resolution: {integrity: sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==} + '@smithy/is-array-buffer@4.2.2': + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} + engines: {node: '>=18.0.0'} '@smithy/md5-js@4.2.8': resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==} @@ -4982,6 +5187,10 @@ packages: resolution: {integrity: sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==} engines: {node: '>=16.0.0'} + '@smithy/middleware-content-length@4.2.12': + resolution: {integrity: sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.2.8': resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} @@ -4998,6 +5207,10 @@ packages: resolution: {integrity: sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==} engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.4.27': + resolution: {integrity: sha512-T3TFfUgXQlpcg+UdzcAISdZpj4Z+XECZ/cefgA6wLBd6V4lRi0svN2hBouN/be9dXQ31X4sLWz3fAQDf+nt6BA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@1.1.0': resolution: {integrity: sha512-lINKYxIvT+W20YFOtHBKeGm7npuJg0/YCoShttU7fVpsmU+a2rdb9zrJn1MHqWfUL6DhTAWGa0tH2O7l4XrDcw==} engines: {node: '>=14.0.0'} @@ -5014,6 +5227,10 @@ packages: resolution: {integrity: sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.4.44': + resolution: {integrity: sha512-Y1Rav7m5CFRPQyM4CI0koD/bXjyjJu3EQxZZhtLGD88WIrBrQ7kqXM96ncd6rYnojwOo/u9MXu57JrEvu/nLrA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@2.3.0': resolution: {integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==} engines: {node: '>=14.0.0'} @@ -5022,6 +5239,10 @@ packages: resolution: {integrity: sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@4.2.15': + resolution: {integrity: sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.9': resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} engines: {node: '>=18.0.0'} @@ -5038,6 +5259,10 @@ packages: resolution: {integrity: sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@4.2.12': + resolution: {integrity: sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.2.8': resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} engines: {node: '>=18.0.0'} @@ -5050,6 +5275,10 @@ packages: resolution: {integrity: sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==} engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@4.3.12': + resolution: {integrity: sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.3.8': resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} engines: {node: '>=18.0.0'} @@ -5070,6 +5299,10 @@ packages: resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.5.0': + resolution: {integrity: sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@2.2.0': resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} engines: {node: '>=14.0.0'} @@ -5078,6 +5311,10 @@ packages: resolution: {integrity: sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==} engines: {node: '>=16.0.0'} + '@smithy/property-provider@4.2.12': + resolution: {integrity: sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.8': resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} engines: {node: '>=18.0.0'} @@ -5098,6 +5335,10 @@ packages: resolution: {integrity: sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==} engines: {node: '>=16.0.0'} + '@smithy/protocol-http@5.3.12': + resolution: {integrity: sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.3.8': resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} engines: {node: '>=18.0.0'} @@ -5114,6 +5355,10 @@ packages: resolution: {integrity: sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==} engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@4.2.12': + resolution: {integrity: sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.2.8': resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} engines: {node: '>=18.0.0'} @@ -5126,6 +5371,10 @@ packages: resolution: {integrity: sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==} engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@4.2.12': + resolution: {integrity: sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.2.8': resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} engines: {node: '>=18.0.0'} @@ -5142,6 +5391,10 @@ packages: resolution: {integrity: sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==} engines: {node: '>=16.0.0'} + '@smithy/service-error-classification@4.2.12': + resolution: {integrity: sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==} + engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.2.8': resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} engines: {node: '>=18.0.0'} @@ -5158,6 +5411,10 @@ packages: resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.4.7': + resolution: {integrity: sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@2.3.0': resolution: {integrity: sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q==} engines: {node: '>=14.0.0'} @@ -5166,6 +5423,10 @@ packages: resolution: {integrity: sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==} engines: {node: '>=16.0.0'} + '@smithy/signature-v4@5.3.12': + resolution: {integrity: sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.3.8': resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} @@ -5186,6 +5447,10 @@ packages: resolution: {integrity: sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.12.7': + resolution: {integrity: sha512-q3gqnwml60G44FECaEEsdQMplYhDMZYCtYhMCzadCnRnnHIobZJjegmdoUo6ieLQlPUzvrMdIJUpx6DoPmzANQ==} + engines: {node: '>=18.0.0'} + '@smithy/types@1.2.0': resolution: {integrity: sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==} engines: {node: '>=14.0.0'} @@ -5202,12 +5467,20 @@ packages: resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} engines: {node: '>=18.0.0'} + '@smithy/types@4.13.1': + resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@2.2.0': resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==} '@smithy/url-parser@3.0.8': resolution: {integrity: sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==} + '@smithy/url-parser@4.2.12': + resolution: {integrity: sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.2.8': resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} engines: {node: '>=18.0.0'} @@ -5228,6 +5501,10 @@ packages: resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} engines: {node: '>=18.0.0'} + '@smithy/util-base64@4.3.2': + resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@2.2.0': resolution: {integrity: sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==} @@ -5238,6 +5515,10 @@ packages: resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@4.2.2': + resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@2.3.0': resolution: {integrity: sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==} engines: {node: '>=14.0.0'} @@ -5250,6 +5531,10 @@ packages: resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@4.2.3': + resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} + engines: {node: '>=18.0.0'} + '@smithy/util-buffer-from@1.1.0': resolution: {integrity: sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==} engines: {node: '>=14.0.0'} @@ -5266,6 +5551,10 @@ packages: resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} engines: {node: '>=18.0.0'} + '@smithy/util-buffer-from@4.2.2': + resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} + engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@1.1.0': resolution: {integrity: sha512-rQ47YpNmF6Is4I9GiE3T3+0xQ+r7RKRKbmHYyGSbyep/0cSf9kteKcI0ssJTvveJ1K4QvwrxXj1tEFp/G2UqxQ==} engines: {node: '>=14.0.0'} @@ -5282,6 +5571,10 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@4.2.2': + resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@2.2.1': resolution: {integrity: sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==} engines: {node: '>= 10.0.0'} @@ -5294,6 +5587,10 @@ packages: resolution: {integrity: sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.3.43': + resolution: {integrity: sha512-Qd/0wCKMaXxev/z00TvNzGCH2jlKKKxXP1aDxB6oKwSQthe3Og2dMhSayGCnsma1bK/kQX1+X7SMP99t6FgiiQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@2.3.1': resolution: {integrity: sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==} engines: {node: '>= 10.0.0'} @@ -5306,6 +5603,10 @@ packages: resolution: {integrity: sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.2.47': + resolution: {integrity: sha512-qSRbYp1EQ7th+sPFuVcVO05AE0QH635hycdEXlpzIahqHHf2Fyd/Zl+8v0XYMJ3cgDVPa0lkMefU7oNUjAP+DQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@2.1.4': resolution: {integrity: sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==} engines: {node: '>=16.0.0'} @@ -5314,6 +5615,10 @@ packages: resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.3.3': + resolution: {integrity: sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==} + engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@1.1.0': resolution: {integrity: sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==} engines: {node: '>=14.0.0'} @@ -5330,6 +5635,10 @@ packages: resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@4.2.2': + resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} + engines: {node: '>=18.0.0'} + '@smithy/util-middleware@1.1.0': resolution: {integrity: sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==} engines: {node: '>=14.0.0'} @@ -5342,6 +5651,10 @@ packages: resolution: {integrity: sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==} engines: {node: '>=16.0.0'} + '@smithy/util-middleware@4.2.12': + resolution: {integrity: sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.2.8': resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} engines: {node: '>=18.0.0'} @@ -5358,6 +5671,10 @@ packages: resolution: {integrity: sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==} engines: {node: '>=16.0.0'} + '@smithy/util-retry@4.2.12': + resolution: {integrity: sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.2.8': resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} engines: {node: '>=18.0.0'} @@ -5378,6 +5695,10 @@ packages: resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.5.20': + resolution: {integrity: sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@1.1.0': resolution: {integrity: sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==} engines: {node: '>=14.0.0'} @@ -5394,6 +5715,10 @@ packages: resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.2.2': + resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} + engines: {node: '>=18.0.0'} + '@smithy/util-utf8@1.1.0': resolution: {integrity: sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==} engines: {node: '>=14.0.0'} @@ -5410,6 +5735,10 @@ packages: resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} engines: {node: '>=18.0.0'} + '@smithy/util-utf8@4.2.2': + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} + engines: {node: '>=18.0.0'} + '@smithy/util-waiter@2.2.0': resolution: {integrity: sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==} engines: {node: '>=14.0.0'} @@ -5426,6 +5755,10 @@ packages: resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} + '@smithy/uuid@1.1.2': + resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} + engines: {node: '>=18.0.0'} + '@speed-highlight/core@1.2.14': resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} @@ -5508,24 +5841,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -7275,6 +7612,9 @@ packages: fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + fast-xml-builder@1.1.4: + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + fast-xml-parser@4.2.5: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true @@ -7287,6 +7627,10 @@ packages: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true + fast-xml-parser@5.5.8: + resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} + hasBin: true + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -8078,6 +8422,7 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lightningcss-android-arm64@1.30.2: @@ -8115,24 +8460,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -8974,6 +9323,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-expression-matcher@1.2.0: + resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==} + engines: {node: '>=14.0.0'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -9857,6 +10210,9 @@ packages: strnum@2.1.2: resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + strnum@2.2.1: + resolution: {integrity: sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==} + stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} @@ -10815,14 +11171,14 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.0 - tslib: 2.8.0 + '@aws-sdk/types': 3.973.6 + tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.0 - tslib: 2.8.0 + '@aws-sdk/types': 3.973.6 + tslib: 2.8.1 '@aws-crypto/ie11-detection@3.0.0': dependencies: @@ -10835,7 +11191,7 @@ snapshots: '@aws-sdk/types': 3.973.0 '@aws-sdk/util-locate-window': 3.568.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-crypto/sha256-browser@3.0.0': dependencies: @@ -10856,7 +11212,7 @@ snapshots: '@aws-sdk/types': 3.973.0 '@aws-sdk/util-locate-window': 3.568.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-crypto/sha256-js@3.0.0': dependencies: @@ -10868,7 +11224,7 @@ snapshots: dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.973.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-crypto/supports-web-crypto@3.0.0': dependencies: @@ -10876,7 +11232,7 @@ snapshots: '@aws-crypto/supports-web-crypto@5.2.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@aws-crypto/util@3.0.0': dependencies: @@ -10886,9 +11242,9 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.0 + '@aws-sdk/types': 3.973.6 '@smithy/util-utf8': 2.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/client-cloudformation@3.678.0(aws-crt@1.23.0)': dependencies: @@ -10934,7 +11290,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 '@smithy/util-waiter': 3.1.7 '@types/uuid': 9.0.8 - tslib: 2.8.0 + tslib: 2.8.1 uuid: 9.0.1 transitivePeerDependencies: - aws-crt @@ -10980,7 +11336,53 @@ snapshots: '@smithy/util-utf8': 2.3.0 '@smithy/util-waiter': 2.2.0 fast-xml-parser: 4.2.5 - tslib: 2.8.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-cloudfront@3.984.0(aws-crt@1.23.0)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.23 + '@aws-sdk/credential-provider-node': 3.972.24(aws-crt@1.23.0) + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.24 + '@aws-sdk/region-config-resolver': 3.972.9 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.984.0 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.10(aws-crt@1.23.0) + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.12 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-retry': 4.4.44 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.43 + '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.8 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -11030,103 +11432,50 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-dynamodb@3.678.0': + '@aws-sdk/client-dynamodb@3.984.0(aws-crt@1.23.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/middleware-endpoint-discovery': 3.678.0 - '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-logger': 3.667.0 - '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-user-agent': 3.678.0 - '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-endpoints': 3.667.0 - '@aws-sdk/util-user-agent-browser': 3.675.0 - '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 - '@types/uuid': 9.0.8 - tslib: 2.8.0 - uuid: 9.0.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-dynamodb@3.678.0(aws-crt@1.23.0)': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) - '@aws-sdk/client-sts': 3.678.0(aws-crt@1.23.0) - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) - '@aws-sdk/middleware-endpoint-discovery': 3.678.0 - '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-logger': 3.667.0 - '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-user-agent': 3.678.0 - '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-endpoints': 3.667.0 - '@aws-sdk/util-user-agent-browser': 3.675.0 - '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 - '@types/uuid': 9.0.8 - tslib: 2.8.0 - uuid: 9.0.1 + '@aws-sdk/core': 3.973.23 + '@aws-sdk/credential-provider-node': 3.972.24(aws-crt@1.23.0) + '@aws-sdk/dynamodb-codec': 3.972.24 + '@aws-sdk/middleware-endpoint-discovery': 3.972.8 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.24 + '@aws-sdk/region-config-resolver': 3.972.9 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.984.0 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.10(aws-crt@1.23.0) + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.12 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-retry': 4.4.44 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.43 + '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.8 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -11174,7 +11523,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 '@smithy/util-waiter': 3.1.7 '@types/uuid': 9.0.8 - tslib: 2.8.0 + tslib: 2.8.1 uuid: 9.0.1 transitivePeerDependencies: - aws-crt @@ -11222,7 +11571,7 @@ snapshots: '@smithy/util-middleware': 3.0.8 '@smithy/util-retry': 3.0.8 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -11269,7 +11618,7 @@ snapshots: '@smithy/util-retry': 3.0.8 '@smithy/util-utf8': 3.0.0 '@smithy/util-waiter': 3.1.7 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -11316,7 +11665,7 @@ snapshots: '@smithy/util-retry': 3.0.8 '@smithy/util-stream': 3.2.1 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -11363,62 +11712,11 @@ snapshots: '@smithy/util-retry': 3.0.8 '@smithy/util-utf8': 3.0.0 '@types/uuid': 9.0.8 - tslib: 2.8.0 + tslib: 2.8.1 uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-lambda@3.678.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-logger': 3.667.0 - '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-user-agent': 3.678.0 - '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-endpoints': 3.667.0 - '@aws-sdk/util-user-agent-browser': 3.675.0 - '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/eventstream-serde-browser': 3.0.11 - '@smithy/eventstream-serde-config-resolver': 3.0.8 - '@smithy/eventstream-serde-node': 3.0.10 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-stream': 3.2.1 - '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 - tslib: 2.8.0 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-lambda@3.678.0(aws-crt@1.23.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -11466,93 +11764,81 @@ snapshots: '@smithy/util-stream': 3.2.1 '@smithy/util-utf8': 3.0.0 '@smithy/util-waiter': 3.1.7 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-rds-data@3.678.0(aws-crt@1.23.0)': + '@aws-sdk/client-lambda@3.984.0(aws-crt@1.23.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) - '@aws-sdk/client-sts': 3.678.0(aws-crt@1.23.0) - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) - '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-logger': 3.667.0 - '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-user-agent': 3.678.0 - '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-endpoints': 3.667.0 - '@aws-sdk/util-user-agent-browser': 3.675.0 - '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + '@aws-sdk/core': 3.973.23 + '@aws-sdk/credential-provider-node': 3.972.24(aws-crt@1.23.0) + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.24 + '@aws-sdk/region-config-resolver': 3.972.9 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.984.0 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.10(aws-crt@1.23.0) + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.12 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/eventstream-serde-config-resolver': 4.3.8 + '@smithy/eventstream-serde-node': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-retry': 4.4.44 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.43 + '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.8 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.678.0(aws-crt@1.23.0)': + '@aws-sdk/client-rds-data@3.678.0(aws-crt@1.23.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/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) '@aws-sdk/client-sts': 3.678.0(aws-crt@1.23.0) '@aws-sdk/core': 3.678.0 '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) - '@aws-sdk/middleware-bucket-endpoint': 3.667.0 - '@aws-sdk/middleware-expect-continue': 3.667.0 - '@aws-sdk/middleware-flexible-checksums': 3.678.0 '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-location-constraint': 3.667.0 '@aws-sdk/middleware-logger': 3.667.0 '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-sdk-s3': 3.678.0 - '@aws-sdk/middleware-ssec': 3.667.0 '@aws-sdk/middleware-user-agent': 3.678.0 '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/signature-v4-multi-region': 3.678.0 '@aws-sdk/types': 3.667.0 '@aws-sdk/util-endpoints': 3.667.0 '@aws-sdk/util-user-agent-browser': 3.675.0 '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@aws-sdk/xml-builder': 3.662.0 '@smithy/config-resolver': 3.0.10 '@smithy/core': 2.5.1 - '@smithy/eventstream-serde-browser': 3.0.11 - '@smithy/eventstream-serde-config-resolver': 3.0.8 - '@smithy/eventstream-serde-node': 3.0.10 '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-blob-browser': 3.1.7 '@smithy/hash-node': 3.0.8 - '@smithy/hash-stream-node': 3.1.7 '@smithy/invalid-dependency': 3.0.8 - '@smithy/md5-js': 3.0.8 '@smithy/middleware-content-length': 3.0.10 '@smithy/middleware-endpoint': 3.2.1 '@smithy/middleware-retry': 3.0.25 @@ -11572,10 +11858,8 @@ snapshots: '@smithy/util-endpoints': 2.1.4 '@smithy/util-middleware': 3.0.8 '@smithy/util-retry': 3.0.8 - '@smithy/util-stream': 3.2.1 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -11639,99 +11923,109 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sqs@3.678.0': + '@aws-sdk/client-s3@3.984.0(aws-crt@1.23.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/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-logger': 3.667.0 - '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-sdk-sqs': 3.667.0 - '@aws-sdk/middleware-user-agent': 3.678.0 - '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-endpoints': 3.667.0 - '@aws-sdk/util-user-agent-browser': 3.675.0 - '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/md5-js': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + '@aws-sdk/core': 3.973.23 + '@aws-sdk/credential-provider-node': 3.972.24(aws-crt@1.23.0) + '@aws-sdk/middleware-bucket-endpoint': 3.972.8 + '@aws-sdk/middleware-expect-continue': 3.972.8 + '@aws-sdk/middleware-flexible-checksums': 3.974.3 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-location-constraint': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-sdk-s3': 3.972.23 + '@aws-sdk/middleware-ssec': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.24 + '@aws-sdk/region-config-resolver': 3.972.9 + '@aws-sdk/signature-v4-multi-region': 3.984.0 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.984.0 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.10(aws-crt@1.23.0) + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.12 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/eventstream-serde-config-resolver': 4.3.8 + '@smithy/eventstream-serde-node': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-blob-browser': 4.2.9 + '@smithy/hash-node': 4.2.8 + '@smithy/hash-stream-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/md5-js': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-retry': 4.4.44 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.43 + '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.8 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sqs@3.678.0(aws-crt@1.23.0)': + '@aws-sdk/client-sqs@3.984.0(aws-crt@1.23.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) - '@aws-sdk/client-sts': 3.678.0(aws-crt@1.23.0) - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) - '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-logger': 3.667.0 - '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-sdk-sqs': 3.667.0 - '@aws-sdk/middleware-user-agent': 3.678.0 - '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-endpoints': 3.667.0 - '@aws-sdk/util-user-agent-browser': 3.675.0 - '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/md5-js': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + '@aws-sdk/core': 3.973.23 + '@aws-sdk/credential-provider-node': 3.972.24(aws-crt@1.23.0) + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-sdk-sqs': 3.972.17 + '@aws-sdk/middleware-user-agent': 3.972.24 + '@aws-sdk/region-config-resolver': 3.972.9 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.984.0 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.10(aws-crt@1.23.0) + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.12 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/md5-js': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-retry': 4.4.44 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.43 + '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -11779,7 +12073,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 '@smithy/util-waiter': 3.1.7 '@types/uuid': 9.0.8 - tslib: 2.8.0 + tslib: 2.8.1 uuid: 9.0.1 transitivePeerDependencies: - aws-crt @@ -11825,52 +12119,7 @@ snapshots: '@smithy/util-middleware': 3.0.8 '@smithy/util-retry': 3.0.8 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0)': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-logger': 3.667.0 - '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-user-agent': 3.678.0 - '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-endpoints': 3.667.0 - '@aws-sdk/util-user-agent-browser': 3.675.0 - '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -12015,73 +12264,28 @@ snapshots: '@aws-sdk/util-user-agent-node': 3.398.0(aws-crt@1.23.0) '@smithy/config-resolver': 2.2.0 '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - fast-xml-parser: 4.2.5 - tslib: 2.8.0 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.678.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-node': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/middleware-host-header': 3.667.0 - '@aws-sdk/middleware-logger': 3.667.0 - '@aws-sdk/middleware-recursion-detection': 3.667.0 - '@aws-sdk/middleware-user-agent': 3.678.0 - '@aws-sdk/region-config-resolver': 3.667.0 - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-endpoints': 3.667.0 - '@aws-sdk/util-user-agent-browser': 3.675.0 - '@aws-sdk/util-user-agent-node': 3.678.0(aws-crt@1.23.0) - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + fast-xml-parser: 4.2.5 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -12126,14 +12330,14 @@ snapshots: '@smithy/util-middleware': 3.0.8 '@smithy/util-retry': 3.0.8 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt '@aws-sdk/config-resolver@3.374.0': dependencies: '@smithy/config-resolver': 1.1.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/core@3.678.0': dependencies: @@ -12147,7 +12351,7 @@ snapshots: '@smithy/types': 3.6.0 '@smithy/util-middleware': 3.0.8 fast-xml-parser: 4.4.1 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/core@3.972.0': dependencies: @@ -12179,12 +12383,33 @@ snapshots: '@smithy/util-base64': 4.3.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/core@3.973.23': + dependencies: + '@aws-sdk/types': 3.973.6 + '@aws-sdk/xml-builder': 3.972.15 + '@smithy/core': 3.23.12 + '@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.7 + '@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.8.1 '@aws-sdk/crc64-nvme@3.972.0': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/crc64-nvme@3.972.5': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/credential-provider-cognito-identity@3.678.0(aws-crt@1.23.0)': dependencies: @@ -12217,7 +12442,15 @@ snapshots: '@aws-sdk/types': 3.973.0 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.21': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.678.0': dependencies: @@ -12243,7 +12476,20 @@ snapshots: '@smithy/smithy-client': 4.10.12 '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.23': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/types': 3.973.6 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/node-http-handler': 4.5.0 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/util-stream': 4.5.20 + tslib: 2.8.1 '@aws-sdk/credential-provider-ini@3.398.0(aws-crt@1.23.0)': dependencies: @@ -12279,25 +12525,6 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0)': - dependencies: - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.678.0 - '@aws-sdk/credential-provider-env': 3.678.0 - '@aws-sdk/credential-provider-http': 3.678.0 - '@aws-sdk/credential-provider-process': 3.678.0 - '@aws-sdk/credential-provider-sso': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/credential-provider-web-identity': 3.678.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/types': 3.667.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - '@aws-sdk/credential-provider-ini@3.972.1(aws-crt@1.23.0)': dependencies: '@aws-sdk/core': 3.973.0 @@ -12313,7 +12540,26 @@ snapshots: '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-ini@3.972.23(aws-crt@1.23.0)': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/credential-provider-env': 3.972.21 + '@aws-sdk/credential-provider-http': 3.972.23 + '@aws-sdk/credential-provider-login': 3.972.23(aws-crt@1.23.0) + '@aws-sdk/credential-provider-process': 3.972.21 + '@aws-sdk/credential-provider-sso': 3.972.23(aws-crt@1.23.0) + '@aws-sdk/credential-provider-web-identity': 3.972.23(aws-crt@1.23.0) + '@aws-sdk/nested-clients': 3.996.13(aws-crt@1.23.0) + '@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.8.1 transitivePeerDependencies: - aws-crt @@ -12330,6 +12576,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-login@3.972.23(aws-crt@1.23.0)': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/nested-clients': 3.996.13(aws-crt@1.23.0) + '@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.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-node@3.398.0(aws-crt@1.23.0)': dependencies: '@aws-sdk/credential-provider-env': 3.398.0 @@ -12342,7 +12601,7 @@ snapshots: '@smithy/property-provider': 2.2.0 '@smithy/shared-ini-file-loader': 2.4.0 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -12359,26 +12618,7 @@ snapshots: '@smithy/property-provider': 3.1.8 '@smithy/shared-ini-file-loader': 3.1.9 '@smithy/types': 3.6.0 - tslib: 2.8.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-node@3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.678.0 - '@aws-sdk/credential-provider-http': 3.678.0 - '@aws-sdk/credential-provider-ini': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/credential-provider-process': 3.678.0 - '@aws-sdk/credential-provider-sso': 3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/credential-provider-web-identity': 3.678.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/types': 3.667.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' @@ -12397,7 +12637,24 @@ snapshots: '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.972.24(aws-crt@1.23.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.21 + '@aws-sdk/credential-provider-http': 3.972.23 + '@aws-sdk/credential-provider-ini': 3.972.23(aws-crt@1.23.0) + '@aws-sdk/credential-provider-process': 3.972.21 + '@aws-sdk/credential-provider-sso': 3.972.23(aws-crt@1.23.0) + '@aws-sdk/credential-provider-web-identity': 3.972.23(aws-crt@1.23.0) + '@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.8.1 transitivePeerDependencies: - aws-crt @@ -12425,7 +12682,16 @@ snapshots: '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-process@3.972.21': + dependencies: + '@aws-sdk/core': 3.973.23 + '@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.8.1 '@aws-sdk/credential-provider-sso@3.398.0(aws-crt@1.23.0)': dependencies: @@ -12453,20 +12719,6 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-sso@3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))': - dependencies: - '@aws-sdk/client-sso': 3.678.0(aws-crt@1.23.0) - '@aws-sdk/core': 3.678.0 - '@aws-sdk/token-providers': 3.667.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/types': 3.667.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - '@aws-sdk/credential-provider-sso@3.972.1(aws-crt@1.23.0)': dependencies: '@aws-sdk/client-sso': 3.974.0(aws-crt@1.23.0) @@ -12476,7 +12728,20 @@ snapshots: '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-sso@3.972.23(aws-crt@1.23.0)': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/nested-clients': 3.996.13(aws-crt@1.23.0) + '@aws-sdk/token-providers': 3.1014.0(aws-crt@1.23.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.8.1 transitivePeerDependencies: - aws-crt @@ -12496,15 +12761,6 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.678.0(@aws-sdk/client-sts@3.678.0)': - dependencies: - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.678.0 - '@aws-sdk/types': 3.667.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.972.1(aws-crt@1.23.0)': dependencies: '@aws-sdk/core': 3.973.0 @@ -12513,7 +12769,19 @@ snapshots: '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.972.23(aws-crt@1.23.0)': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/nested-clients': 3.996.13(aws-crt@1.23.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.8.1 transitivePeerDependencies: - aws-crt @@ -12535,25 +12803,24 @@ snapshots: '@smithy/credential-provider-imds': 3.2.5 '@smithy/property-provider': 3.1.8 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/endpoint-cache@3.678.0': + '@aws-sdk/dynamodb-codec@3.972.24': dependencies: - mnemonist: 0.38.3 + '@aws-sdk/core': 3.973.23 + '@smithy/core': 3.23.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.667.0': + '@aws-sdk/endpoint-cache@3.972.4': dependencies: - '@aws-sdk/types': 3.667.0 - '@aws-sdk/util-arn-parser': 3.568.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 3.0.0 - tslib: 2.8.0 + mnemonist: 0.38.3 + tslib: 2.8.1 '@aws-sdk/middleware-bucket-endpoint@3.972.1': dependencies: @@ -12563,44 +12830,40 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 - '@aws-sdk/middleware-endpoint-discovery@3.678.0': + '@aws-sdk/middleware-bucket-endpoint@3.972.8': dependencies: - '@aws-sdk/endpoint-cache': 3.678.0 - '@aws-sdk/types': 3.667.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.8.0 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-arn-parser': 3.972.3 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 + tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.667.0': + '@aws-sdk/middleware-endpoint-discovery@3.972.8': dependencies: - '@aws-sdk/types': 3.667.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.8.0 + '@aws-sdk/endpoint-cache': 3.972.4 + '@aws-sdk/types': 3.973.6 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/middleware-expect-continue@3.972.1': dependencies: '@aws-sdk/types': 3.973.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.678.0': + '@aws-sdk/middleware-expect-continue@3.972.8': dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-sdk/core': 3.678.0 - '@aws-sdk/types': 3.667.0 - '@smithy/is-array-buffer': 3.0.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + '@aws-sdk/types': 3.973.6 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/middleware-flexible-checksums@3.972.1': dependencies: @@ -12617,72 +12880,102 @@ snapshots: '@smithy/util-middleware': 4.2.8 '@smithy/util-stream': 4.5.10 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.974.3': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.973.23 + '@aws-sdk/crc64-nvme': 3.972.5 + '@aws-sdk/types': 3.973.6 + '@smithy/is-array-buffer': 4.2.2 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-stream': 4.5.20 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.398.0': dependencies: '@aws-sdk/types': 3.398.0 '@smithy/protocol-http': 2.0.5 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 '@smithy/protocol-http': 4.1.5 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.972.1': dependencies: '@aws-sdk/types': 3.973.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.667.0': + '@aws-sdk/middleware-host-header@3.972.8': dependencies: - '@aws-sdk/types': 3.667.0 - '@smithy/types': 3.6.0 - tslib: 2.8.0 + '@aws-sdk/types': 3.973.6 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/middleware-location-constraint@3.972.1': dependencies: '@aws-sdk/types': 3.973.0 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/middleware-logger@3.398.0': dependencies: '@aws-sdk/types': 3.398.0 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-logger@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-logger@3.972.1': dependencies: '@aws-sdk/types': 3.973.0 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.398.0': dependencies: '@aws-sdk/types': 3.398.0 '@smithy/protocol-http': 2.0.5 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 '@smithy/protocol-http': 4.1.5 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.972.1': dependencies: @@ -12690,12 +12983,20 @@ snapshots: '@aws/lambda-invoke-store': 0.2.3 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/middleware-retry@3.374.0': dependencies: '@smithy/middleware-retry': 1.1.0 - tslib: 2.8.0 + tslib: 2.8.1 uuid: 8.3.2 '@aws-sdk/middleware-sdk-s3@3.678.0': @@ -12713,7 +13014,7 @@ snapshots: '@smithy/util-middleware': 3.0.8 '@smithy/util-stream': 3.2.1 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-sdk-s3@3.972.0': dependencies: @@ -12730,7 +13031,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 '@smithy/util-stream': 4.5.10 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-sdk-s3@3.972.1': dependencies: @@ -12747,16 +13048,33 @@ snapshots: '@smithy/util-middleware': 4.2.8 '@smithy/util-stream': 4.5.10 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 - '@aws-sdk/middleware-sdk-sqs@3.667.0': + '@aws-sdk/middleware-sdk-s3@3.972.23': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-arn-parser': 3.972.3 + '@smithy/core': 3.23.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/signature-v4': 5.3.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-stream': 4.5.20 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-sqs@3.972.17': dependencies: - '@aws-sdk/types': 3.667.0 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + '@aws-sdk/types': 3.973.6 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 '@aws-sdk/middleware-sdk-sts@3.398.0': dependencies: @@ -12773,7 +13091,7 @@ snapshots: '@smithy/signature-v4': 2.3.0 '@smithy/types': 2.12.0 '@smithy/util-middleware': 2.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-signing@3.664.0': dependencies: @@ -12783,19 +13101,19 @@ snapshots: '@smithy/signature-v4': 4.2.1 '@smithy/types': 3.6.0 '@smithy/util-middleware': 3.0.8 - tslib: 2.8.0 - - '@aws-sdk/middleware-ssec@3.667.0': - dependencies: - '@aws-sdk/types': 3.667.0 - '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-ssec@3.972.1': dependencies: '@aws-sdk/types': 3.973.0 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/middleware-user-agent@3.398.0': dependencies: @@ -12803,7 +13121,7 @@ snapshots: '@aws-sdk/util-endpoints': 3.398.0 '@smithy/protocol-http': 2.0.5 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-user-agent@3.678.0': dependencies: @@ -12813,7 +13131,7 @@ snapshots: '@smithy/core': 2.5.1 '@smithy/protocol-http': 4.1.5 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/middleware-user-agent@3.972.1': dependencies: @@ -12823,7 +13141,18 @@ snapshots: '@smithy/core': 3.21.1 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.972.24': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@smithy/core': 3.23.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-retry': 4.2.12 + tslib: 2.8.1 '@aws-sdk/nested-clients@3.974.0(aws-crt@1.23.0)': dependencies: @@ -12868,6 +13197,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/nested-clients@3.996.13(aws-crt@1.23.0)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.23 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.24 + '@aws-sdk/region-config-resolver': 3.972.9 + '@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.10(aws-crt@1.23.0) + '@smithy/config-resolver': 4.4.13 + '@smithy/core': 3.23.12 + '@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.27 + '@smithy/middleware-retry': 4.4.44 + '@smithy/middleware-serde': 4.2.15 + '@smithy/middleware-stack': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/node-http-handler': 4.5.0 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.7 + '@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.43 + '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/region-config-resolver@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 @@ -12875,7 +13247,7 @@ snapshots: '@smithy/types': 3.6.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.8 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/region-config-resolver@3.972.1': dependencies: @@ -12883,7 +13255,15 @@ snapshots: '@smithy/config-resolver': 4.4.6 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/region-config-resolver@3.972.9': + 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.8.1 '@aws-sdk/s3-request-presigner@3.974.0': dependencies: @@ -12906,7 +13286,7 @@ snapshots: '@smithy/types': 3.6.0 '@smithy/util-middleware': 3.0.8 aws-crt: 1.23.0 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - bufferutil - debug @@ -12920,7 +13300,7 @@ snapshots: '@smithy/protocol-http': 4.1.5 '@smithy/signature-v4': 4.2.1 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/signature-v4-multi-region@3.972.0': dependencies: @@ -12929,12 +13309,33 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.984.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.972.23 + '@aws-sdk/types': 3.973.6 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 '@aws-sdk/smithy-client@3.374.0': dependencies: '@smithy/smithy-client': 1.1.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.1014.0(aws-crt@1.23.0)': + dependencies: + '@aws-sdk/core': 3.973.23 + '@aws-sdk/nested-clients': 3.996.13(aws-crt@1.23.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.8.1 + transitivePeerDependencies: + - aws-crt '@aws-sdk/token-providers@3.398.0(aws-crt@1.23.0)': dependencies: @@ -12985,15 +13386,6 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.667.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/types': 3.667.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - '@aws-sdk/token-providers@3.974.0(aws-crt@1.23.0)': dependencies: '@aws-sdk/core': 3.973.0 @@ -13009,7 +13401,7 @@ snapshots: '@aws-sdk/types@3.398.0': dependencies: '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/types@3.664.0': dependencies: @@ -13019,17 +13411,22 @@ snapshots: '@aws-sdk/types@3.667.0': dependencies: '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/types@3.972.0': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/types@3.973.0': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/types@3.973.6': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@aws-sdk/util-arn-parser@3.568.0': dependencies: @@ -13041,19 +13438,23 @@ snapshots: '@aws-sdk/util-arn-parser@3.972.1': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.972.3': + dependencies: + tslib: 2.8.1 '@aws-sdk/util-endpoints@3.398.0': dependencies: '@aws-sdk/types': 3.398.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/util-endpoints@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 '@smithy/types': 3.6.0 '@smithy/util-endpoints': 2.1.4 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/util-endpoints@3.972.0': dependencies: @@ -13061,7 +13462,23 @@ snapshots: '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-endpoints': 3.2.8 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.984.0': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.996.5': + 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.8.1 '@aws-sdk/util-format-url@3.972.1': dependencies: @@ -13072,35 +13489,42 @@ snapshots: '@aws-sdk/util-locate-window@3.568.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/util-user-agent-browser@3.398.0': dependencies: '@aws-sdk/types': 3.398.0 '@smithy/types': 2.12.0 bowser: 2.11.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/util-user-agent-browser@3.675.0': dependencies: '@aws-sdk/types': 3.667.0 '@smithy/types': 3.6.0 bowser: 2.11.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/util-user-agent-browser@3.972.1': dependencies: '@aws-sdk/types': 3.973.0 '@smithy/types': 4.12.0 bowser: 2.11.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + bowser: 2.11.0 + tslib: 2.8.1 '@aws-sdk/util-user-agent-node@3.398.0(aws-crt@1.23.0)': dependencies: '@aws-sdk/types': 3.398.0 '@smithy/node-config-provider': 2.3.0 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 optionalDependencies: aws-crt: 1.23.0 @@ -13110,7 +13534,7 @@ snapshots: '@aws-sdk/types': 3.667.0 '@smithy/node-config-provider': 3.1.9 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 optionalDependencies: aws-crt: 1.23.0 @@ -13120,22 +13544,28 @@ snapshots: '@aws-sdk/types': 3.973.0 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 optionalDependencies: aws-crt: 1.23.0 - '@aws-sdk/util-utf8-browser@3.259.0': + '@aws-sdk/util-user-agent-node@3.973.10(aws-crt@1.23.0)': dependencies: + '@aws-sdk/middleware-user-agent': 3.972.24 + '@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.8.1 + optionalDependencies: + aws-crt: 1.23.0 - '@aws-sdk/xml-builder@3.310.0': + '@aws-sdk/util-utf8-browser@3.259.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 - '@aws-sdk/xml-builder@3.662.0': + '@aws-sdk/xml-builder@3.310.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@aws-sdk/xml-builder@3.972.0': dependencies: @@ -13147,7 +13577,13 @@ snapshots: dependencies: '@smithy/types': 4.12.0 fast-xml-parser: 5.2.5 - tslib: 2.8.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.15': + dependencies: + '@smithy/types': 4.13.1 + fast-xml-parser: 5.5.8 + tslib: 2.8.1 '@aws/lambda-invoke-store@0.2.3': {} @@ -14022,7 +14458,7 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/analytics-compat@0.2.23(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: @@ -14031,7 +14467,7 @@ snapshots: '@firebase/app-compat': 0.4.2 '@firebase/component': 0.6.18 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -14044,7 +14480,7 @@ snapshots: '@firebase/installations': 0.6.18(@firebase/app@0.13.2) '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/app-check-compat@0.3.26(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: @@ -14054,7 +14490,7 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -14068,7 +14504,7 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/app-compat@0.4.2': dependencies: @@ -14076,7 +14512,7 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/app-types@0.9.3': {} @@ -14086,7 +14522,7 @@ snapshots: '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 idb: 7.1.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/auth-compat@0.5.28(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: @@ -14095,7 +14531,7 @@ snapshots: '@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.12.1) '@firebase/component': 0.6.18 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' @@ -14114,12 +14550,12 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/component@0.6.18': dependencies: '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/component@0.7.0': dependencies: @@ -14133,7 +14569,7 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/database-compat@2.0.11': dependencies: @@ -14142,7 +14578,7 @@ snapshots: '@firebase/database-types': 1.0.15 '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/database-compat@2.1.0': dependencies: @@ -14171,7 +14607,7 @@ snapshots: '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 faye-websocket: 0.11.4 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/database@1.1.0': dependencies: @@ -14190,7 +14626,7 @@ snapshots: '@firebase/firestore': 4.8.0(@firebase/app@0.13.2) '@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.1) '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' @@ -14209,7 +14645,7 @@ snapshots: '@firebase/webchannel-wrapper': 1.0.3 '@grpc/grpc-js': 1.9.15 '@grpc/proto-loader': 0.7.15 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/functions-compat@0.3.26(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: @@ -14218,7 +14654,7 @@ snapshots: '@firebase/functions': 0.12.9(@firebase/app@0.13.2) '@firebase/functions-types': 0.6.3 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -14232,7 +14668,7 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/messaging-interop-types': 0.2.3 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/installations-compat@0.2.18(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: @@ -14241,7 +14677,7 @@ snapshots: '@firebase/installations': 0.6.18(@firebase/app@0.13.2) '@firebase/installations-types': 0.5.3(@firebase/app-types@0.9.3) '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' @@ -14256,11 +14692,11 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/util': 1.12.1 idb: 7.1.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/logger@0.4.4': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/logger@0.5.0': dependencies: @@ -14272,7 +14708,7 @@ snapshots: '@firebase/component': 0.6.18 '@firebase/messaging': 0.12.22(@firebase/app@0.13.2) '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -14286,7 +14722,7 @@ snapshots: '@firebase/messaging-interop-types': 0.2.3 '@firebase/util': 1.12.1 idb: 7.1.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/performance-compat@0.2.20(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: @@ -14296,7 +14732,7 @@ snapshots: '@firebase/performance': 0.7.7(@firebase/app@0.13.2) '@firebase/performance-types': 0.2.3 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -14309,7 +14745,7 @@ snapshots: '@firebase/installations': 0.6.18(@firebase/app@0.13.2) '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 web-vitals: 4.2.4 '@firebase/remote-config-compat@0.2.18(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': @@ -14320,7 +14756,7 @@ snapshots: '@firebase/remote-config': 0.6.5(@firebase/app@0.13.2) '@firebase/remote-config-types': 0.4.0 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -14333,7 +14769,7 @@ snapshots: '@firebase/installations': 0.6.18(@firebase/app@0.13.2) '@firebase/logger': 0.4.4 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/storage-compat@0.3.24(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: @@ -14342,7 +14778,7 @@ snapshots: '@firebase/storage': 0.13.14(@firebase/app@0.13.2) '@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.1) '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' @@ -14357,11 +14793,11 @@ snapshots: '@firebase/app': 0.13.2 '@firebase/component': 0.6.18 '@firebase/util': 1.12.1 - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/util@1.12.1': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@firebase/util@1.13.0': dependencies: @@ -15136,14 +15572,14 @@ snapshots: dependencies: '@octokit/openapi-types': 22.2.0 - '@opennextjs/aws@3.9.12(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))': + '@opennextjs/aws@3.9.12(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))': dependencies: '@ast-grep/napi': 0.40.0 '@aws-sdk/client-cloudfront': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/client-dynamodb': 3.678.0 - '@aws-sdk/client-lambda': 3.678.0 - '@aws-sdk/client-s3': 3.974.0(aws-crt@1.23.0) - '@aws-sdk/client-sqs': 3.678.0 + '@aws-sdk/client-dynamodb': 3.984.0(aws-crt@1.23.0) + '@aws-sdk/client-lambda': 3.984.0(aws-crt@1.23.0) + '@aws-sdk/client-s3': 3.984.0(aws-crt@1.23.0) + '@aws-sdk/client-sqs': 3.984.0(aws-crt@1.23.0) '@node-minify/core': 8.0.6 '@node-minify/terser': 8.0.6 '@tsconfig/node18': 1.0.3 @@ -15160,11 +15596,11 @@ snapshots: - aws-crt - supports-color - '@opennextjs/cloudflare@1.15.1(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))(wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0))': + '@opennextjs/cloudflare@1.15.1(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))(wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0))': dependencies: '@ast-grep/napi': 0.40.0 '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 3.9.12(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)) + '@opennextjs/aws': 3.9.12(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)) cloudflare: 4.5.0 enquirer: 2.4.1 glob: 12.0.0 @@ -15466,28 +15902,24 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 - '@smithy/abort-controller@4.2.8': + '@smithy/abort-controller@4.2.12': dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.0 + '@smithy/types': 4.13.1 + tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@3.0.1': + '@smithy/abort-controller@4.2.8': dependencies: - '@smithy/util-base64': 3.0.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 '@smithy/chunked-blob-reader-native@4.2.1': dependencies: '@smithy/util-base64': 4.3.0 - tslib: 2.8.0 - - '@smithy/chunked-blob-reader@4.0.0': - dependencies: tslib: 2.8.1 '@smithy/chunked-blob-reader@5.2.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/config-resolver@1.1.0': dependencies: @@ -15502,7 +15934,7 @@ snapshots: '@smithy/types': 2.12.0 '@smithy/util-config-provider': 2.3.0 '@smithy/util-middleware': 2.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/config-resolver@3.0.10': dependencies: @@ -15510,7 +15942,16 @@ snapshots: '@smithy/types': 3.6.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.8 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.13': + dependencies: + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + tslib: 2.8.1 '@smithy/config-resolver@4.4.6': dependencies: @@ -15519,7 +15960,7 @@ snapshots: '@smithy/util-config-provider': 4.2.0 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/core@2.5.1': dependencies: @@ -15530,7 +15971,7 @@ snapshots: '@smithy/util-middleware': 3.0.8 '@smithy/util-stream': 3.2.1 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/core@3.21.1': dependencies: @@ -15543,7 +15984,20 @@ snapshots: '@smithy/util-stream': 4.5.10 '@smithy/util-utf8': 4.2.0 '@smithy/uuid': 1.1.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/core@3.23.12': + dependencies: + '@smithy/protocol-http': 5.3.12 + '@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-middleware': 4.2.12 + '@smithy/util-stream': 4.5.20 + '@smithy/util-utf8': 4.2.2 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 '@smithy/credential-provider-imds@2.3.0': dependencies: @@ -15561,13 +16015,21 @@ snapshots: '@smithy/url-parser': 3.0.8 tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.12': + dependencies: + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.8': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/eventstream-codec@3.1.7': dependencies: @@ -15587,35 +16049,35 @@ snapshots: dependencies: '@smithy/eventstream-serde-universal': 3.0.10 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/eventstream-serde-browser@4.2.8': dependencies: '@smithy/eventstream-serde-universal': 4.2.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/eventstream-serde-config-resolver@3.0.8': dependencies: '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/eventstream-serde-config-resolver@4.3.8': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/eventstream-serde-node@3.0.10': dependencies: '@smithy/eventstream-serde-universal': 3.0.10 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/eventstream-serde-node@4.2.8': dependencies: '@smithy/eventstream-serde-universal': 4.2.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/eventstream-serde-universal@3.0.10': dependencies: @@ -15627,7 +16089,7 @@ snapshots: dependencies: '@smithy/eventstream-codec': 4.2.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/fetch-http-handler@1.1.0': dependencies: @@ -15643,7 +16105,7 @@ snapshots: '@smithy/querystring-builder': 2.2.0 '@smithy/types': 2.12.0 '@smithy/util-base64': 2.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/fetch-http-handler@3.2.9': dependencies: @@ -15651,7 +16113,7 @@ snapshots: '@smithy/querystring-builder': 3.0.8 '@smithy/types': 3.6.0 '@smithy/util-base64': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/fetch-http-handler@4.0.0': dependencies: @@ -15661,75 +16123,82 @@ snapshots: '@smithy/util-base64': 3.0.0 tslib: 2.8.1 + '@smithy/fetch-http-handler@5.3.15': + dependencies: + '@smithy/protocol-http': 5.3.12 + '@smithy/querystring-builder': 4.2.12 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 + tslib: 2.8.1 + '@smithy/fetch-http-handler@5.3.9': dependencies: '@smithy/protocol-http': 5.3.8 '@smithy/querystring-builder': 4.2.8 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 - tslib: 2.8.0 - - '@smithy/hash-blob-browser@3.1.7': - dependencies: - '@smithy/chunked-blob-reader': 4.0.0 - '@smithy/chunked-blob-reader-native': 3.0.1 - '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/hash-blob-browser@4.2.9': dependencies: '@smithy/chunked-blob-reader': 5.2.0 '@smithy/chunked-blob-reader-native': 4.2.1 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/hash-node@2.2.0': dependencies: '@smithy/types': 2.12.0 '@smithy/util-buffer-from': 2.2.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/hash-node@3.0.8': dependencies: '@smithy/types': 3.6.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 '@smithy/hash-node@4.2.8': dependencies: '@smithy/types': 4.12.0 '@smithy/util-buffer-from': 4.2.0 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 - - '@smithy/hash-stream-node@3.1.7': - dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/hash-stream-node@4.2.8': dependencies: '@smithy/types': 4.12.0 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/invalid-dependency@2.2.0': dependencies: '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/invalid-dependency@3.0.8': dependencies: '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/invalid-dependency@4.2.8': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/is-array-buffer@1.1.0': dependencies: @@ -15745,37 +16214,41 @@ snapshots: '@smithy/is-array-buffer@4.2.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 - '@smithy/md5-js@3.0.8': - dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + '@smithy/is-array-buffer@4.2.2': + dependencies: + tslib: 2.8.1 '@smithy/md5-js@4.2.8': dependencies: '@smithy/types': 4.12.0 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/middleware-content-length@2.2.0': dependencies: '@smithy/protocol-http': 3.3.0 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/middleware-content-length@3.0.10': dependencies: '@smithy/protocol-http': 4.1.5 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.12': + dependencies: + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/middleware-content-length@4.2.8': dependencies: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/middleware-endpoint@2.5.1': dependencies: @@ -15785,7 +16258,7 @@ snapshots: '@smithy/types': 2.12.0 '@smithy/url-parser': 2.2.0 '@smithy/util-middleware': 2.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/middleware-endpoint@3.2.1': dependencies: @@ -15796,7 +16269,7 @@ snapshots: '@smithy/types': 3.6.0 '@smithy/url-parser': 3.0.8 '@smithy/util-middleware': 3.0.8 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/middleware-endpoint@4.4.11': dependencies: @@ -15807,7 +16280,18 @@ snapshots: '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-middleware': 4.2.8 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.4.27': + dependencies: + '@smithy/core': 3.23.12 + '@smithy/middleware-serde': 4.2.15 + '@smithy/node-config-provider': 4.3.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-middleware': 4.2.12 + tslib: 2.8.1 '@smithy/middleware-retry@1.1.0': dependencies: @@ -15828,7 +16312,7 @@ snapshots: '@smithy/types': 2.12.0 '@smithy/util-middleware': 2.2.0 '@smithy/util-retry': 2.2.0 - tslib: 2.8.0 + tslib: 2.8.1 uuid: 9.0.1 '@smithy/middleware-retry@3.0.25': @@ -15840,7 +16324,7 @@ snapshots: '@smithy/types': 3.6.0 '@smithy/util-middleware': 3.0.8 '@smithy/util-retry': 3.0.8 - tslib: 2.8.0 + tslib: 2.8.1 uuid: 9.0.1 '@smithy/middleware-retry@4.4.27': @@ -15853,23 +16337,42 @@ snapshots: '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 '@smithy/uuid': 1.1.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.44': + dependencies: + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/service-error-classification': 4.2.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 '@smithy/middleware-serde@2.3.0': dependencies: '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/middleware-serde@3.0.8': dependencies: '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.15': + dependencies: + '@smithy/core': 3.23.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/middleware-serde@4.2.9': dependencies: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/middleware-stack@1.1.0': dependencies: @@ -15878,38 +16381,50 @@ snapshots: '@smithy/middleware-stack@2.2.0': dependencies: '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/middleware-stack@3.0.8': dependencies: '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/middleware-stack@4.2.8': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/node-config-provider@2.3.0': dependencies: '@smithy/property-provider': 2.2.0 '@smithy/shared-ini-file-loader': 2.4.0 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/node-config-provider@3.1.9': dependencies: '@smithy/property-provider': 3.1.8 '@smithy/shared-ini-file-loader': 3.1.9 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.12': + dependencies: + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/node-config-provider@4.3.8': dependencies: '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/node-http-handler@1.1.0': dependencies: @@ -15925,7 +16440,7 @@ snapshots: '@smithy/protocol-http': 3.3.0 '@smithy/querystring-builder': 2.2.0 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/node-http-handler@3.2.5': dependencies: @@ -15933,7 +16448,7 @@ snapshots: '@smithy/protocol-http': 4.1.5 '@smithy/querystring-builder': 3.0.8 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/node-http-handler@4.4.8': dependencies: @@ -15941,7 +16456,15 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/querystring-builder': 4.2.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.5.0': + dependencies: + '@smithy/abort-controller': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/querystring-builder': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/property-provider@2.2.0': dependencies: @@ -15953,10 +16476,15 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/property-provider@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/property-provider@4.2.8': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/protocol-http@1.2.0': dependencies: @@ -15966,7 +16494,7 @@ snapshots: '@smithy/protocol-http@2.0.5': dependencies: '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/protocol-http@3.3.0': dependencies: @@ -15976,12 +16504,17 @@ snapshots: '@smithy/protocol-http@4.1.5': dependencies: '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/protocol-http@5.3.8': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/querystring-builder@1.1.0': dependencies: @@ -16001,6 +16534,12 @@ snapshots: '@smithy/util-uri-escape': 3.0.0 tslib: 2.8.1 + '@smithy/querystring-builder@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + '@smithy/util-uri-escape': 4.2.2 + tslib: 2.8.1 + '@smithy/querystring-builder@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -16017,10 +16556,15 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/querystring-parser@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/querystring-parser@4.2.8': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/service-error-classification@1.1.0': {} @@ -16032,6 +16576,10 @@ snapshots: dependencies: '@smithy/types': 3.6.0 + '@smithy/service-error-classification@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + '@smithy/service-error-classification@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -16049,7 +16597,12 @@ snapshots: '@smithy/shared-ini-file-loader@4.4.3': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/shared-ini-file-loader@4.4.7': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/signature-v4@2.3.0': dependencies: @@ -16059,7 +16612,7 @@ snapshots: '@smithy/util-middleware': 2.2.0 '@smithy/util-uri-escape': 2.2.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/signature-v4@4.2.1': dependencies: @@ -16072,6 +16625,17 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@smithy/signature-v4@5.3.12': + dependencies: + '@smithy/is-array-buffer': 4.2.2 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-uri-escape': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@smithy/signature-v4@5.3.8': dependencies: '@smithy/is-array-buffer': 4.2.0 @@ -16081,7 +16645,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 '@smithy/util-uri-escape': 4.2.0 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/smithy-client@1.1.0': dependencies: @@ -16097,7 +16661,7 @@ snapshots: '@smithy/protocol-http': 3.3.0 '@smithy/types': 2.12.0 '@smithy/util-stream': 2.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/smithy-client@3.4.2': dependencies: @@ -16107,7 +16671,7 @@ snapshots: '@smithy/protocol-http': 4.1.5 '@smithy/types': 3.6.0 '@smithy/util-stream': 3.2.1 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/smithy-client@4.10.12': dependencies: @@ -16117,7 +16681,17 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.12.7': + dependencies: + '@smithy/core': 3.23.12 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-stack': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-stream': 4.5.20 + tslib: 2.8.1 '@smithy/types@1.2.0': dependencies: @@ -16125,33 +16699,43 @@ snapshots: '@smithy/types@2.12.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/types@3.6.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/types@4.12.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/types@4.13.1': + dependencies: + tslib: 2.8.1 '@smithy/url-parser@2.2.0': dependencies: '@smithy/querystring-parser': 2.2.0 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/url-parser@3.0.8': dependencies: '@smithy/querystring-parser': 3.0.8 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/url-parser@4.2.12': + dependencies: + '@smithy/querystring-parser': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/url-parser@4.2.8': dependencies: '@smithy/querystring-parser': 4.2.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-base64@1.1.0': dependencies: @@ -16162,43 +16746,57 @@ snapshots: dependencies: '@smithy/util-buffer-from': 2.2.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-base64@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-base64@4.3.0': dependencies: '@smithy/util-buffer-from': 4.2.0 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.2': + dependencies: + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 '@smithy/util-body-length-browser@2.2.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-body-length-browser@3.0.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-body-length-browser@4.2.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.2': + dependencies: + tslib: 2.8.1 '@smithy/util-body-length-node@2.3.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-body-length-node@3.0.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-body-length-node@4.2.1': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.3': + dependencies: + tslib: 2.8.1 '@smithy/util-buffer-from@1.1.0': dependencies: @@ -16218,7 +16816,12 @@ snapshots: '@smithy/util-buffer-from@4.2.0': dependencies: '@smithy/is-array-buffer': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.2': + dependencies: + '@smithy/is-array-buffer': 4.2.2 + tslib: 2.8.1 '@smithy/util-config-provider@1.1.0': dependencies: @@ -16234,7 +16837,11 @@ snapshots: '@smithy/util-config-provider@4.2.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.2': + dependencies: + tslib: 2.8.1 '@smithy/util-defaults-mode-browser@2.2.1': dependencies: @@ -16242,7 +16849,7 @@ snapshots: '@smithy/smithy-client': 2.5.1 '@smithy/types': 2.12.0 bowser: 2.11.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-defaults-mode-browser@3.0.25': dependencies: @@ -16250,14 +16857,21 @@ snapshots: '@smithy/smithy-client': 3.4.2 '@smithy/types': 3.6.0 bowser: 2.11.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-defaults-mode-browser@4.3.26': dependencies: '@smithy/property-provider': 4.2.8 '@smithy/smithy-client': 4.10.12 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.43': + dependencies: + '@smithy/property-provider': 4.2.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/util-defaults-mode-node@2.3.1': dependencies: @@ -16267,7 +16881,7 @@ snapshots: '@smithy/property-provider': 2.2.0 '@smithy/smithy-client': 2.5.1 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-defaults-mode-node@3.0.25': dependencies: @@ -16277,7 +16891,7 @@ snapshots: '@smithy/property-provider': 3.1.8 '@smithy/smithy-client': 3.4.2 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-defaults-mode-node@4.2.29': dependencies: @@ -16287,19 +16901,35 @@ snapshots: '@smithy/property-provider': 4.2.8 '@smithy/smithy-client': 4.10.12 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.47': + dependencies: + '@smithy/config-resolver': 4.4.13 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/util-endpoints@2.1.4': dependencies: '@smithy/node-config-provider': 3.1.9 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-endpoints@3.2.8': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.3.3': + dependencies: + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/util-hex-encoding@1.1.0': dependencies: @@ -16315,7 +16945,11 @@ snapshots: '@smithy/util-hex-encoding@4.2.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.2': + dependencies: + tslib: 2.8.1 '@smithy/util-middleware@1.1.0': dependencies: @@ -16329,12 +16963,17 @@ snapshots: '@smithy/util-middleware@3.0.8': dependencies: '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/util-middleware@4.2.8': dependencies: '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-retry@1.1.0': dependencies: @@ -16345,19 +16984,25 @@ snapshots: dependencies: '@smithy/service-error-classification': 2.1.5 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-retry@3.0.8': dependencies: '@smithy/service-error-classification': 3.0.8 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.12': + dependencies: + '@smithy/service-error-classification': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 '@smithy/util-retry@4.2.8': dependencies: '@smithy/service-error-classification': 4.2.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-stream@1.1.0': dependencies: @@ -16379,7 +17024,7 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 '@smithy/util-hex-encoding': 2.2.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-stream@3.2.1': dependencies: @@ -16390,7 +17035,7 @@ snapshots: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-stream@4.5.10': dependencies: @@ -16401,7 +17046,18 @@ snapshots: '@smithy/util-buffer-from': 4.2.0 '@smithy/util-hex-encoding': 4.2.0 '@smithy/util-utf8': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.20': + dependencies: + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/node-http-handler': 4.5.0 + '@smithy/types': 4.13.1 + '@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.8.1 '@smithy/util-uri-escape@1.1.0': dependencies: @@ -16419,6 +17075,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-uri-escape@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-utf8@1.1.0': dependencies: '@smithy/util-buffer-from': 1.1.0 @@ -16427,39 +17087,48 @@ snapshots: '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-utf8@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-utf8@4.2.0': dependencies: '@smithy/util-buffer-from': 4.2.0 - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.2': + dependencies: + '@smithy/util-buffer-from': 4.2.2 + tslib: 2.8.1 '@smithy/util-waiter@2.2.0': dependencies: '@smithy/abort-controller': 2.2.0 '@smithy/types': 2.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-waiter@3.1.7': dependencies: '@smithy/abort-controller': 3.1.6 '@smithy/types': 3.6.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/util-waiter@4.2.8': dependencies: '@smithy/abort-controller': 4.2.8 '@smithy/types': 4.12.0 - tslib: 2.8.0 + tslib: 2.8.1 '@smithy/uuid@1.1.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.2': + dependencies: + tslib: 2.8.1 '@speed-highlight/core@1.2.14': {} @@ -16590,7 +17259,7 @@ snapshots: '@trpc/server@9.16.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@ts-morph/common@0.11.1': dependencies: @@ -16771,7 +17440,6 @@ snapshots: dependencies: '@types/http-errors': 2.0.4 '@types/node': 22.19.7 - '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -18551,6 +19219,10 @@ snapshots: dependencies: punycode: 1.4.1 + fast-xml-builder@1.1.4: + dependencies: + path-expression-matcher: 1.2.0 + fast-xml-parser@4.2.5: dependencies: strnum: 1.0.5 @@ -18563,6 +19235,12 @@ snapshots: dependencies: strnum: 2.1.2 + fast-xml-parser@5.5.8: + dependencies: + fast-xml-builder: 1.1.4 + path-expression-matcher: 1.2.0 + strnum: 2.2.1 + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -18989,7 +19667,7 @@ snapshots: dset: 3.1.4 graphql: 16.9.0 lru-cache: 7.18.3 - tslib: 2.8.0 + tslib: 2.8.1 graphql@16.9.0: {} @@ -20565,6 +21243,8 @@ snapshots: path-exists@4.0.0: {} + path-expression-matcher@1.2.0: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -21674,6 +22354,8 @@ snapshots: strnum@2.1.2: {} + strnum@2.2.1: {} + stubs@3.0.0: optional: true From e9d924356cea5e455354d2773deaef5f29a270b2 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:21:44 +0100 Subject: [PATCH 10/27] Port PR https://github.com/opennextjs/opennextjs-aws/pull/1104 --- .../open-next/src/build/copyTracedFiles.ts | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/packages/open-next/src/build/copyTracedFiles.ts b/packages/open-next/src/build/copyTracedFiles.ts index c07eead0..6923b07c 100644 --- a/packages/open-next/src/build/copyTracedFiles.ts +++ b/packages/open-next/src/build/copyTracedFiles.ts @@ -1,4 +1,5 @@ import { + chmodSync, copyFileSync, cpSync, existsSync, @@ -30,6 +31,21 @@ import { INSTRUMENTATION_TRACE_FILE, MIDDLEWARE_TRACE_FILE } from "./constant.js const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); +/** + * Copies a file and ensures the destination is writable. + * This is necessary because copyFileSync preserves file permissions, + * and source files may be read-only (e.g., in Bazel's node_modules). + * Without this, subsequent patches would fail with EACCES errors. + */ +export function copyFileAndMakeOwnerWritable(src: string, dest: string): void { + copyFileSync(src, dest); + // Ensure the copied file is writable (add owner write permission) + const stats = statSync(dest); + if (!(stats.mode & 0o200)) { + chmodSync(dest, stats.mode | 0o200); + } +} + //TODO: we need to figure which packages we could safely remove const EXCLUDED_PACKAGES = [ "caniuse-lite", @@ -69,7 +85,7 @@ export function isExcluded(srcPath: string): boolean { function copyPatchFile(outputDir: string) { const patchFile = path.join(__dirname, "patch", "patchedAsyncStorage.js"); const outputPatchFile = path.join(outputDir, "patchedAsyncStorage.cjs"); - copyFileSync(patchFile, outputPatchFile); + copyFileAndMakeOwnerWritable(patchFile, outputPatchFile); } interface CopyTracedFilesOptions { @@ -209,7 +225,7 @@ File ${serverPath} does not exist // Check for instrumentation trace file if (existsSync(path.join(dotNextDir, INSTRUMENTATION_TRACE_FILE))) { // We still need to copy the nft.json file so that computeCopyFilesForPage doesn't throw - copyFileSync( + copyFileAndMakeOwnerWritable( path.join(dotNextDir, INSTRUMENTATION_TRACE_FILE), path.join(standaloneNextDir, INSTRUMENTATION_TRACE_FILE) ); @@ -219,7 +235,7 @@ File ${serverPath} does not exist if (existsSync(path.join(dotNextDir, MIDDLEWARE_TRACE_FILE))) { // We still need to copy the nft.json file so that computeCopyFilesForPage doesn't throw - copyFileSync( + copyFileAndMakeOwnerWritable( path.join(dotNextDir, MIDDLEWARE_TRACE_FILE), path.join(standaloneNextDir, MIDDLEWARE_TRACE_FILE) ); @@ -296,7 +312,7 @@ File ${serverPath} does not exist // where some files listed in the .nft.json might not be present in the standalone folder // TODO: investigate that further - is it expected? try { - copyFileSync(from, to); + copyFileAndMakeOwnerWritable(from, to); } catch (e) { logger.debug("Error copying file:", e); erroredFiles.push(to); @@ -307,7 +323,7 @@ File ${serverPath} does not exist readdirSync(standaloneNextDir) .filter((fileOrDir) => !statSync(path.join(standaloneNextDir, fileOrDir)).isDirectory()) .forEach((file) => { - copyFileSync(path.join(standaloneNextDir, file), path.join(outputNextDir, file)); + copyFileAndMakeOwnerWritable(path.join(standaloneNextDir, file), path.join(outputNextDir, file)); tracedFiles.push(path.join(outputNextDir, file)); }); @@ -319,7 +335,10 @@ File ${serverPath} does not exist .filter((fileOrDir) => !statSync(path.join(standaloneServerDir, fileOrDir)).isDirectory()) .filter((file) => file !== "server.js") .forEach((file) => { - copyFileSync(path.join(standaloneServerDir, file), path.join(path.join(outputNextDir, "server"), file)); + copyFileAndMakeOwnerWritable( + path.join(standaloneServerDir, file), + path.join(path.join(outputNextDir, "server"), file) + ); tracedFiles.push(path.join(outputNextDir, "server", file)); }); @@ -340,7 +359,10 @@ File ${serverPath} does not exist mkdirSync(path.dirname(path.join(outputNextDir, filePath)), { recursive: true, }); - copyFileSync(path.join(standaloneNextDir, filePath), path.join(outputNextDir, filePath)); + copyFileAndMakeOwnerWritable( + path.join(standaloneNextDir, filePath), + path.join(outputNextDir, filePath) + ); } }; From 3abe5d28eba271a082efa9eedf1f097b3314acf4 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:33:12 +0100 Subject: [PATCH 11/27] Port PR https://github.com/opennextjs/opennextjs-aws/pull/1101 --- .claude/skills/port-pr/SKILL.md | 11 +-- packages/cloudflare/package.json | 2 +- packages/open-next/package.json | 2 +- pnpm-lock.yaml | 111 +++++++++++++++++++++++++++++-- 4 files changed, 115 insertions(+), 11 deletions(-) diff --git a/.claude/skills/port-pr/SKILL.md b/.claude/skills/port-pr/SKILL.md index 7a1733bc..410432ee 100644 --- a/.claude/skills/port-pr/SKILL.md +++ b/.claude/skills/port-pr/SKILL.md @@ -21,11 +21,14 @@ This skill receives arguments via `$ARGUMENTS`: ```bash gh pr view --json mergeCommit,title,body,headRepository -git diff ^.. +# Exclude lockfiles from diff - they should be regenerated via pnpm install +git diff ^.. -- . ':!pnpm-lock.yaml' ':!package-lock.json' ':!yarn.lock' ``` Run these commands in the source repository using `workdir` parameter. +**Important:** Never read or port lockfile changes (pnpm-lock.yaml, package-lock.json, yarn.lock). Always regenerate the lockfile by running `pnpm install` after updating package.json dependencies. + ### 2. Analyze Changes - Identify all files changed, added, and deleted @@ -68,13 +71,13 @@ This runs formatting, linting, and TypeScript checks. ### 7. Run Unit Tests -After code checks pass, run only the unit tests: +After code checks pass, run only the unit tests from the tests-unit package: ```bash -pnpm test +pnpm --filter tests-unit test ``` -**Important:** Do NOT run `pnpm e2e:test` or any full test suite. Only unit tests should be run during the porting process. +**Important:** Do NOT run `pnpm test` (which runs all tests), `pnpm e2e:test`, or any full test suite. Only unit tests from the tests-unit package should be run during the porting process. ### 8. Ask for Package diff --git a/packages/cloudflare/package.json b/packages/cloudflare/package.json index be466371..fe7fc8b1 100644 --- a/packages/cloudflare/package.json +++ b/packages/cloudflare/package.json @@ -50,7 +50,7 @@ "test:watch": "vitest" }, "dependencies": { - "@ast-grep/napi": "0.40.0", + "@ast-grep/napi": "0.40.5", "@dotenvx/dotenvx": "catalog:", "@opennextjs/aws": "workspace:*", "cloudflare": "^4.4.1", diff --git a/packages/open-next/package.json b/packages/open-next/package.json index 9be58d6f..9925983e 100644 --- a/packages/open-next/package.json +++ b/packages/open-next/package.json @@ -46,7 +46,7 @@ "ts:check": "tsc --noEmit" }, "dependencies": { - "@ast-grep/napi": "^0.40.0", + "@ast-grep/napi": "^0.40.5", "@aws-sdk/client-cloudfront": "3.984.0", "@aws-sdk/client-dynamodb": "3.984.0", "@aws-sdk/client-lambda": "3.984.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 182d8040..84142235 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1317,8 +1317,8 @@ importers: packages/cloudflare: dependencies: '@ast-grep/napi': - specifier: 0.40.0 - version: 0.40.0 + specifier: 0.40.5 + version: 0.40.5 '@dotenvx/dotenvx': specifier: 'catalog:' version: 1.31.0 @@ -1393,8 +1393,8 @@ importers: packages/open-next: dependencies: '@ast-grep/napi': - specifier: ^0.40.0 - version: 0.40.0 + specifier: ^0.40.5 + version: 0.40.5 '@aws-sdk/client-cloudfront': specifier: 3.984.0 version: 3.984.0(aws-crt@1.23.0) @@ -1547,12 +1547,24 @@ packages: cpu: [arm64] os: [darwin] + '@ast-grep/napi-darwin-arm64@0.40.5': + resolution: {integrity: sha512-2F072fGN0WTq7KI3okuEnkGJVEHLbi56Bw1H6NAMf7j2mJJeQWsRyGOMcyNnUXZDeNdvoMH0OB2a5wwUegY/nQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@ast-grep/napi-darwin-x64@0.40.0': resolution: {integrity: sha512-f9Ol5oQKNRMBkvDtzBK1WiNn2/3eejF2Pn9xwTj7PhXuSFseedOspPYllxQo0gbwUlw/DJqGFTce/jarhR/rBw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@ast-grep/napi-darwin-x64@0.40.5': + resolution: {integrity: sha512-dJMidHZhhxuLBYNi6/FKI812jQ7wcFPSKkVPwviez2D+KvYagapUMAV/4dJ7FCORfguVk8Y0jpPAlYmWRT5nvA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@ast-grep/napi-linux-arm64-gnu@0.40.0': resolution: {integrity: sha512-+tO+VW5GDhT9jGkKOK+3b8+ohKjC98WTzn7wSskd/myyhK3oYL1WTKqCm07WSYBZOJvb3z+WaX+wOUrc4bvtyQ==} engines: {node: '>= 10'} @@ -1560,6 +1572,13 @@ packages: os: [linux] libc: [glibc] + '@ast-grep/napi-linux-arm64-gnu@0.40.5': + resolution: {integrity: sha512-nBRCbyoS87uqkaw4Oyfe5VO+SRm2B+0g0T8ME69Qry9ShMf41a2bTdpcQx9e8scZPogq+CTwDHo3THyBV71l9w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@ast-grep/napi-linux-arm64-musl@0.40.0': resolution: {integrity: sha512-MS9qalLRjUnF2PCzuTKTvCMVSORYHxxe3Qa0+SSaVULsXRBmuy5C/b1FeWwMFnwNnC0uie3VDet31Zujwi8q6A==} engines: {node: '>= 10'} @@ -1567,6 +1586,13 @@ packages: os: [linux] libc: [musl] + '@ast-grep/napi-linux-arm64-musl@0.40.5': + resolution: {integrity: sha512-/qKsmds5FMoaEj6FdNzepbmLMtlFuBLdrAn9GIWCqOIcVcYvM1Nka8+mncfeXB/MFZKOrzQsQdPTWqrrQzXLrA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@ast-grep/napi-linux-x64-gnu@0.40.0': resolution: {integrity: sha512-BeHZVMNXhM3WV3XE2yghO0fRxhMOt8BTN972p5piYEQUvKeSHmS8oeGcs6Ahgx5znBclqqqq37ZfioYANiTqJA==} engines: {node: '>= 10'} @@ -1574,6 +1600,13 @@ packages: os: [linux] libc: [glibc] + '@ast-grep/napi-linux-x64-gnu@0.40.5': + resolution: {integrity: sha512-DP4oDbq7f/1A2hRTFLhJfDFR6aI5mRWdEfKfHzRItmlKsR9WlcEl1qDJs/zX9R2EEtIDsSKRzuJNfJllY3/W8Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@ast-grep/napi-linux-x64-musl@0.40.0': resolution: {integrity: sha512-rG1YujF7O+lszX8fd5u6qkFTuv4FwHXjWvt1CCvCxXwQLSY96LaCW88oVKg7WoEYQh54y++Fk57F+Wh9Gv9nVQ==} engines: {node: '>= 10'} @@ -1581,28 +1614,57 @@ packages: os: [linux] libc: [musl] + '@ast-grep/napi-linux-x64-musl@0.40.5': + resolution: {integrity: sha512-BRZUvVBPUNpWPo6Ns8chXVzxHPY+k9gpsubGTHy92Q26ecZULd/dTkWWdnvfhRqttsSQ9Pe/XQdi5+hDQ6RYcg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + '@ast-grep/napi-win32-arm64-msvc@0.40.0': resolution: {integrity: sha512-9SqmnQqd4zTEUk6yx0TuW2ycZZs2+e569O/R0QnhSiQNpgwiJCYOe/yPS0BC9HkiaozQm6jjAcasWpFtz/dp+w==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@ast-grep/napi-win32-arm64-msvc@0.40.5': + resolution: {integrity: sha512-y95zSEwc7vhxmcrcH0GnK4ZHEBQrmrszRBNQovzaciF9GUqEcCACNLoBesn4V47IaOp4fYgD2/EhGRTIBFb2Ug==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@ast-grep/napi-win32-ia32-msvc@0.40.0': resolution: {integrity: sha512-0JkdBZi5l9vZhGEO38A1way0LmLRDU5Vos6MXrLIOVkymmzDTDlCdY394J1LMmmsfwWcyJg6J7Yv2dw41MCxDQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] + '@ast-grep/napi-win32-ia32-msvc@0.40.5': + resolution: {integrity: sha512-K/u8De62iUnFCzVUs7FBdTZ2Jrgc5/DLHqjpup66KxZ7GIM9/HGME/O8aSoPkpcAeCD4TiTZ11C1i5p5H98hTg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + '@ast-grep/napi-win32-x64-msvc@0.40.0': resolution: {integrity: sha512-Hk2IwfPqMFGZt5SRxsoWmGLxBXxprow4LRp1eG6V8EEiJCNHxZ9ZiEaIc5bNvMDBjHVSnqZAXT22dROhrcSKQg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@ast-grep/napi-win32-x64-msvc@0.40.5': + resolution: {integrity: sha512-dqm5zg/o4Nh4VOQPEpMS23ot8HVd22gG0eg01t4CFcZeuzyuSgBlOL3N7xLbz3iH2sVkk7keuBwAzOIpTqziNQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@ast-grep/napi@0.40.0': resolution: {integrity: sha512-tq6nO/8KwUF/mHuk1ECaAOSOlz2OB/PmygnvprJzyAHGRVzdcffblaOOWe90M9sGz5MAasXoF+PTcayQj9TKKA==} engines: {node: '>= 10'} + '@ast-grep/napi@0.40.5': + resolution: {integrity: sha512-hJA62OeBKUQT68DD2gDyhOqJxZxycqg8wLxbqjgqSzYttCMSDL9tiAQ9abgekBYNHudbJosm9sWOEbmCDfpX2A==} + engines: {node: '>= 10'} + '@aws-cdk/asset-awscli-v1@2.2.208': resolution: {integrity: sha512-r4CuHZaiBioU6waWhCNdEL4MO1+rfbcYVS/Ndz1XNGB5cxIRZwAS0Si6qD2D6nsgpPojiruFl67T1t5M9Va8kQ==} @@ -11092,30 +11154,57 @@ snapshots: '@ast-grep/napi-darwin-arm64@0.40.0': optional: true + '@ast-grep/napi-darwin-arm64@0.40.5': + optional: true + '@ast-grep/napi-darwin-x64@0.40.0': optional: true + '@ast-grep/napi-darwin-x64@0.40.5': + optional: true + '@ast-grep/napi-linux-arm64-gnu@0.40.0': optional: true + '@ast-grep/napi-linux-arm64-gnu@0.40.5': + optional: true + '@ast-grep/napi-linux-arm64-musl@0.40.0': optional: true + '@ast-grep/napi-linux-arm64-musl@0.40.5': + optional: true + '@ast-grep/napi-linux-x64-gnu@0.40.0': optional: true + '@ast-grep/napi-linux-x64-gnu@0.40.5': + optional: true + '@ast-grep/napi-linux-x64-musl@0.40.0': optional: true + '@ast-grep/napi-linux-x64-musl@0.40.5': + optional: true + '@ast-grep/napi-win32-arm64-msvc@0.40.0': optional: true + '@ast-grep/napi-win32-arm64-msvc@0.40.5': + optional: true + '@ast-grep/napi-win32-ia32-msvc@0.40.0': optional: true + '@ast-grep/napi-win32-ia32-msvc@0.40.5': + optional: true + '@ast-grep/napi-win32-x64-msvc@0.40.0': optional: true + '@ast-grep/napi-win32-x64-msvc@0.40.5': + optional: true + '@ast-grep/napi@0.40.0': optionalDependencies: '@ast-grep/napi-darwin-arm64': 0.40.0 @@ -11128,6 +11217,18 @@ snapshots: '@ast-grep/napi-win32-ia32-msvc': 0.40.0 '@ast-grep/napi-win32-x64-msvc': 0.40.0 + '@ast-grep/napi@0.40.5': + optionalDependencies: + '@ast-grep/napi-darwin-arm64': 0.40.5 + '@ast-grep/napi-darwin-x64': 0.40.5 + '@ast-grep/napi-linux-arm64-gnu': 0.40.5 + '@ast-grep/napi-linux-arm64-musl': 0.40.5 + '@ast-grep/napi-linux-x64-gnu': 0.40.5 + '@ast-grep/napi-linux-x64-musl': 0.40.5 + '@ast-grep/napi-win32-arm64-msvc': 0.40.5 + '@ast-grep/napi-win32-ia32-msvc': 0.40.5 + '@ast-grep/napi-win32-x64-msvc': 0.40.5 + '@aws-cdk/asset-awscli-v1@2.2.208': {} '@aws-cdk/asset-kubectl-v20@2.1.3': {} @@ -15574,7 +15675,7 @@ snapshots: '@opennextjs/aws@3.9.12(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))': dependencies: - '@ast-grep/napi': 0.40.0 + '@ast-grep/napi': 0.40.5 '@aws-sdk/client-cloudfront': 3.398.0(aws-crt@1.23.0) '@aws-sdk/client-dynamodb': 3.984.0(aws-crt@1.23.0) '@aws-sdk/client-lambda': 3.984.0(aws-crt@1.23.0) From b4463be0365cd90fffe69a2da569d616dd1af109 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:40:58 +0100 Subject: [PATCH 12/27] Port PR https://github.com/opennextjs/opennextjs-aws/pull/1098 --- .changeset/port-pr-1098.md | 7 ++ .../build/patch/patches/patchNextServer.ts | 24 ++++ .../patch/patches/patchNextServer.test.ts | 105 ++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 .changeset/port-pr-1098.md diff --git a/.changeset/port-pr-1098.md b/.changeset/port-pr-1098.md new file mode 100644 index 00000000..7f9d0cc1 --- /dev/null +++ b/.changeset/port-pr-1098.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/aws": patch +--- + +Ported PR #1098 from source repository + +https://github.com/opennextjs/opennextjs-aws/pull/1098 diff --git a/packages/open-next/src/build/patch/patches/patchNextServer.ts b/packages/open-next/src/build/patch/patches/patchNextServer.ts index 98fba834..6e406839 100644 --- a/packages/open-next/src/build/patch/patches/patchNextServer.ts +++ b/packages/open-next/src/build/patch/patches/patchNextServer.ts @@ -35,6 +35,24 @@ fix: '{return null;}' `; +// Make `handleNextImageRequest` a no-op to avoid pulling `sharp` +// Apply to Next 14, 15, and 16 +export const emptyHandleNextImageRequestRule = ` +rule: + kind: assignment_expression + pattern: this.handleNextImageRequest = $VALUE + inside: + kind: method_definition + stopBy: end + has: + kind: property_identifier + regex: ^constructor$ + inside: + kind: class_body +fix: + this.handleNextImageRequest = async (req, res, parsedUrl) => false +`; + /** * Swaps the body for a throwing implementation * @@ -89,6 +107,12 @@ export const patchNextServer: CodePatcher = { contentFilter: /imageOptimizer\(/, patchCode: createPatchCode(createEmptyBodyRule("imageOptimizer")), }, + // Make `handleNextImageRequest` a no-op to avoid pulling `sharp` - unused in OpenNext + { + pathFilter, + contentFilter: /handleNextImageRequest/, + patchCode: createPatchCode(emptyHandleNextImageRequestRule), + }, // Disable Next background preloading done at creation of `NextServer` { versions: ">=14.0.0", diff --git a/packages/tests-unit/tests/build/patch/patches/patchNextServer.test.ts b/packages/tests-unit/tests/build/patch/patches/patchNextServer.test.ts index d7a19182..5db663bc 100644 --- a/packages/tests-unit/tests/build/patch/patches/patchNextServer.test.ts +++ b/packages/tests-unit/tests/build/patch/patches/patchNextServer.test.ts @@ -2,6 +2,7 @@ import { patchCode } from "@opennextjs/aws/build/patch/astCodePatcher.js"; import { createEmptyBodyRule, disablePreloadingRule, + emptyHandleNextImageRequestRule, removeMiddlewareManifestRule, } from "@opennextjs/aws/build/patch/patches/patchNextServer.js"; import { describe, it } from "vitest"; @@ -421,6 +422,110 @@ getMiddlewareManifest() {return null;} `); }); + it("should empty handleNextImageRequest", async () => { + expect(computePatchDiff("next-server.js", next15ServerMinimalCode, emptyHandleNextImageRequestRule)) + .toMatchInlineSnapshot(` + "Index: next-server.js + =================================================================== + --- next-server.js + +++ next-server.js + @@ -1,91 +1,9 @@ + - + class NextNodeServer extends _baseserver.default { + constructor(options){ + var _options_conf_experimental_sri, _options_conf_experimental; + // Initialize super class + - super(options), this.registeredInstrumentation = false, this.cleanupListeners = new _asynccallbackset.AsyncCallbackSet(), this.handleNextImageRequest = async (req, res, parsedUrl)=>{ + - if (!parsedUrl.pathname || !parsedUrl.pathname.startsWith('/_next/image')) { + - return false; + - } + - // Ignore if its a middleware request + - if ((0, _requestmeta.getRequestMeta)(req, 'middlewareInvoke')) { + - return false; + - } + - if (this.minimalMode || this.nextConfig.output === 'export' || process.env.NEXT_MINIMAL) { + - res.statusCode = 400; + - res.body('Bad Request').send(); + - return true; + - // the \`else\` branch is needed for tree-shaking + - } else { + - const { ImageOptimizerCache } = require('./image-optimizer'); + - const imageOptimizerCache = new ImageOptimizerCache({ + - distDir: this.distDir, + - nextConfig: this.nextConfig + - }); + - const { sendResponse, ImageError } = require('./image-optimizer'); + - if (!this.imageResponseCache) { + - throw Object.defineProperty(new Error('invariant image optimizer cache was not initialized'), "__NEXT_ERROR_CODE", { + - value: "E160", + - enumerable: false, + - configurable: true + - }); + - } + - const imagesConfig = this.nextConfig.images; + - if (imagesConfig.loader !== 'default' || imagesConfig.unoptimized) { + - await this.render404(req, res); + - return true; + - } + - const paramsResult = ImageOptimizerCache.validateParams(req.originalRequest, parsedUrl.query, this.nextConfig, !!this.renderOpts.dev); + - if ('errorMessage' in paramsResult) { + - res.statusCode = 400; + - res.body(paramsResult.errorMessage).send(); + - return true; + - } + - const cacheKey = ImageOptimizerCache.getCacheKey(paramsResult); + - try { + - var _cacheEntry_value, _cacheEntry_cacheControl; + - const { getExtension } = require('./serve-static'); + - const cacheEntry = await this.imageResponseCache.get(cacheKey, async ({ previousCacheEntry })=>{ + - const { buffer, contentType, maxAge, upstreamEtag, etag } = await this.imageOptimizer(req, res, paramsResult, previousCacheEntry); + - return { + - value: { + - kind: _responsecache.CachedRouteKind.IMAGE, + - buffer, + - etag, + - extension: getExtension(contentType), + - upstreamEtag + - }, + - isFallback: false, + - cacheControl: { + - revalidate: maxAge, + - expire: undefined + - } + - }; + - }, { + - routeKind: _routekind.RouteKind.IMAGE, + - incrementalCache: imageOptimizerCache, + - isFallback: false + - }); + - if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== _responsecache.CachedRouteKind.IMAGE) { + - throw Object.defineProperty(new Error('invariant did not get entry from image response cache'), "__NEXT_ERROR_CODE", { + - value: "E518", + - enumerable: false, + - configurable: true + - }); + - } + - sendResponse(req.originalRequest, res.originalResponse, paramsResult.href, cacheEntry.value.extension, cacheEntry.value.buffer, cacheEntry.value.etag, paramsResult.isStatic, cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT', imagesConfig, ((_cacheEntry_cacheControl = cacheEntry.cacheControl) == null ? void 0 : _cacheEntry_cacheControl.revalidate) || 0, Boolean(this.renderOpts.dev)); + - return true; + - } catch (err) { + - if (err instanceof ImageError) { + - res.statusCode = err.statusCode; + - res.body(err.message).send(); + - return true; + - } + - throw err; + - } + - } + - }, this.handleCatchallRenderRequest = async (req, res, parsedUrl)=>{ + + super(options), this.registeredInstrumentation = false, this.cleanupListeners = new _asynccallbackset.AsyncCallbackSet(), this.handleNextImageRequest = async (req, res, parsedUrl) => false, this.handleCatchallRenderRequest = async (req, res, parsedUrl)=>{ + let { pathname, query } = parsedUrl; + if (!pathname) { + throw Object.defineProperty(new Error('Invariant: pathname is undefined'), "__NEXT_ERROR_CODE", { + value: "E409", + " + `); + }); + it("should disable preloading for Next 15", async () => { expect(computePatchDiff("next-server.js", next15ServerMinimalCode, disablePreloadingRule)) .toMatchInlineSnapshot(` From a0783a411d88dfabcac95a05fcce7f4633cfe64c Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:50:54 +0100 Subject: [PATCH 13/27] chore: port PR #1083 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1083 Changeset: .changeset/port-pr-1083.md --- .changeset/port-pr-1083.md | 7 + .../cli/build/utils/create-config-files.ts | 70 +---- .../cloudflare/src/cli/build/utils/files.ts | 23 ++ .../cloudflare/src/cli/build/utils/index.ts | 1 + packages/cloudflare/src/cli/commands/build.ts | 4 +- .../cloudflare/src/cli/commands/migrate.ts | 247 ++++++++++++++++++ packages/cloudflare/src/cli/index.ts | 2 + .../src/cli/utils/open-next-config.ts | 34 +++ .../src/cli/utils/wrangler-config.ts | 81 ++++++ 9 files changed, 405 insertions(+), 64 deletions(-) create mode 100644 .changeset/port-pr-1083.md create mode 100644 packages/cloudflare/src/cli/build/utils/files.ts create mode 100644 packages/cloudflare/src/cli/commands/migrate.ts create mode 100644 packages/cloudflare/src/cli/utils/open-next-config.ts create mode 100644 packages/cloudflare/src/cli/utils/wrangler-config.ts diff --git a/.changeset/port-pr-1083.md b/.changeset/port-pr-1083.md new file mode 100644 index 00000000..d0c20b54 --- /dev/null +++ b/.changeset/port-pr-1083.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1083 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1083 diff --git a/packages/cloudflare/src/cli/build/utils/create-config-files.ts b/packages/cloudflare/src/cli/build/utils/create-config-files.ts index 0f706155..b6e49355 100644 --- a/packages/cloudflare/src/cli/build/utils/create-config-files.ts +++ b/packages/cloudflare/src/cli/build/utils/create-config-files.ts @@ -1,9 +1,7 @@ -import { cpSync, existsSync, readFileSync, writeFileSync } from "node:fs"; -import { join } from "node:path"; - -import { getPackageTemplatesDirPath } from "../../../utils/get-package-templates-dir-path.js"; import type { ProjectOptions } from "../../project-options.js"; import { askConfirmation } from "../../utils/ask-confirmation.js"; +import { createOpenNextConfigFile, findOpenNextConfig } from "../../utils/open-next-config.js"; +import { createWranglerConfigFile, findWranglerConfig } from "../../utils/wrangler-config.js"; /** * Creates a `wrangler.jsonc` file for the user if a wrangler config file doesn't already exist, @@ -13,12 +11,8 @@ import { askConfirmation } from "../../utils/ask-confirmation.js"; * * @param projectOpts The options for the project */ -export async function createWranglerConfigIfNotExistent(projectOpts: ProjectOptions): Promise { - const possibleExts = ["toml", "json", "jsonc"]; - - const wranglerConfigFileExists = possibleExts.some((ext) => - existsSync(join(projectOpts.sourceDir, `wrangler.${ext}`)) - ); +export async function createWranglerConfigIfNonExistent(projectOpts: ProjectOptions): Promise { + const wranglerConfigFileExists = Boolean(findWranglerConfig(projectOpts.sourceDir)); if (wranglerConfigFileExists) { return; } @@ -36,54 +30,7 @@ export async function createWranglerConfigIfNotExistent(projectOpts: ProjectOpti return; } - let wranglerConfig = readFileSync(join(getPackageTemplatesDirPath(), "wrangler.jsonc"), "utf8"); - - const appName = getAppNameFromPackageJson(projectOpts.sourceDir) ?? "app-name"; - - wranglerConfig = wranglerConfig.replaceAll('""', JSON.stringify(appName.replaceAll("_", "-"))); - - const compatDate = await getLatestCompatDate(); - if (compatDate) { - wranglerConfig = wranglerConfig.replace( - /"compatibility_date": "\d{4}-\d{2}-\d{2}"/, - `"compatibility_date": ${JSON.stringify(compatDate)}` - ); - } - - writeFileSync(join(projectOpts.sourceDir, "wrangler.jsonc"), wranglerConfig); -} - -function getAppNameFromPackageJson(sourceDir: string): string | undefined { - try { - const packageJsonStr = readFileSync(join(sourceDir, "package.json"), "utf8"); - const packageJson: Record = JSON.parse(packageJsonStr); - if (typeof packageJson.name === "string") return packageJson.name; - } catch { - /* empty */ - } -} - -export async function getLatestCompatDate(): Promise { - try { - const resp = await fetch(`https://registry.npmjs.org/workerd`); - const latestWorkerdVersion = ( - (await resp.json()) as { - "dist-tags": { latest: string }; - } - )["dist-tags"].latest; - - // The format of the workerd version is `major.yyyymmdd.patch`. - const match = latestWorkerdVersion.match(/\d+\.(\d{4})(\d{2})(\d{2})\.\d+/); - - if (match) { - const [, year, month, date] = match; - const compatDate = `${year}-${month}-${date}`; - - return compatDate; - } - } catch { - /* empty */ - } + await createWranglerConfigFile(projectOpts.sourceDir); } /** @@ -95,9 +42,8 @@ export async function getLatestCompatDate(): Promise { * @return The path to the created source file */ export async function createOpenNextConfigIfNotExistent(sourceDir: string): Promise { - const openNextConfigPath = join(sourceDir, "open-next.config.ts"); - - if (!existsSync(openNextConfigPath)) { + const openNextConfigPath = findOpenNextConfig(sourceDir); + if (!openNextConfigPath) { const answer = await askConfirmation( "Missing required `open-next.config.ts` file, do you want to create one?" ); @@ -106,7 +52,7 @@ export async function createOpenNextConfigIfNotExistent(sourceDir: string): Prom throw new Error("The `open-next.config.ts` file is required, aborting!"); } - cpSync(join(getPackageTemplatesDirPath(), "open-next.config.ts"), openNextConfigPath); + return createOpenNextConfigFile(sourceDir); } return openNextConfigPath; diff --git a/packages/cloudflare/src/cli/build/utils/files.ts b/packages/cloudflare/src/cli/build/utils/files.ts new file mode 100644 index 00000000..0166dc71 --- /dev/null +++ b/packages/cloudflare/src/cli/build/utils/files.ts @@ -0,0 +1,23 @@ +import fs from "node:fs"; + +/** + * Appends text to a file + * + * When the file does not exists, it is always created with the text content. + * When the file exists, the text is appended only when the predicate return `true`. + * + * @param filepath The path to the file. + * @param text The text to append to the file. + * @param condition A function that receives the current file content and returns `true` if the text should be appended to it, the condition is skipped when the file is being created. + */ +export function conditionalAppendFileSync( + filepath: string, + text: string, + condition: (fileContent: string) => boolean +): void { + const fileExists = fs.existsSync(filepath); + + if (!fileExists || condition(fs.readFileSync(filepath, "utf8"))) { + fs.appendFileSync(filepath, text); + } +} diff --git a/packages/cloudflare/src/cli/build/utils/index.ts b/packages/cloudflare/src/cli/build/utils/index.ts index 869bbe6b..515c19a9 100644 --- a/packages/cloudflare/src/cli/build/utils/index.ts +++ b/packages/cloudflare/src/cli/build/utils/index.ts @@ -2,5 +2,6 @@ export * from "./copy-package-cli-files.js"; export * from "./create-config-files.js"; export * from "./ensure-cf-config.js"; export * from "./extract-project-env-vars.js"; +export * from "./files.js"; export * from "./needs-experimental-react.js"; export * from "./normalize-path.js"; diff --git a/packages/cloudflare/src/cli/commands/build.ts b/packages/cloudflare/src/cli/commands/build.ts index f1ef4e2a..3a2336ea 100644 --- a/packages/cloudflare/src/cli/commands/build.ts +++ b/packages/cloudflare/src/cli/commands/build.ts @@ -3,7 +3,7 @@ import { createRequire } from "node:module"; import type yargs from "yargs"; import { build as buildImpl } from "../build/build.js"; -import { createWranglerConfigIfNotExistent } from "../build/utils/index.js"; +import { createWranglerConfigIfNonExistent } from "../build/utils/index.js"; import type { WithWranglerArgs } from "./utils.js"; import { @@ -46,7 +46,7 @@ async function buildCommand( // Note: We don't ask when a custom config file is specified via `--config` // nor when `--skipWranglerConfigCheck` is used. if (!projectOpts.wranglerConfigPath && !args.skipWranglerConfigCheck) { - await createWranglerConfigIfNotExistent(projectOpts); + await createWranglerConfigIfNonExistent(projectOpts); } const wranglerConfig = await readWranglerConfig(args); diff --git a/packages/cloudflare/src/cli/commands/migrate.ts b/packages/cloudflare/src/cli/commands/migrate.ts new file mode 100644 index 00000000..e48495ce --- /dev/null +++ b/packages/cloudflare/src/cli/commands/migrate.ts @@ -0,0 +1,247 @@ +import childProcess from "node:child_process"; +import fs from "node:fs"; +import path from "node:path"; + +import { + checkRunningInsideNextjsApp, + findNextConfig, + findPackagerAndRoot, +} from "@opennextjs/aws/build/helper.js"; +import logger from "@opennextjs/aws/logger.js"; +import type yargs from "yargs"; + +import { conditionalAppendFileSync } from "../build/utils/files.js"; +import { createOpenNextConfigFile, findOpenNextConfig } from "../utils/open-next-config.js"; +import { createWranglerConfigFile, findWranglerConfig } from "../utils/wrangler-config.js"; + +import { printHeaders } from "./utils.js"; + +/** + * Implementation of the `opennextjs-cloudflare migrate` command. + * + * @param args + */ +async function migrateCommand(args: { forceInstall: boolean }): Promise { + printHeaders("migrate"); + + logger.info("🚀 Setting up the OpenNext Cloudflare adapter...\n"); + + const projectDir = process.cwd(); + + checkRunningInsideNextjsApp({ appPath: projectDir }); + + const wranglerConfigFilePath = findWranglerConfig(projectDir); + if (wranglerConfigFilePath) { + logger.error( + `The project already contains a Wrangler config file (at ${wranglerConfigFilePath}).\n` + + "This means that your application is either a static site or a next-on-pages project.\n" + + "If your project is a static site and you want to migrate to OpenNext, delete the Wrangler configuration file, convert the project to a full stack one and try again." + + " if your project is a next-on-pages one remove any next-on-pages configuration, any edge runtime usage and try again." + ); + process.exit(1); + } + + if (findOpenNextConfig(projectDir)) { + logger.info( + `Exiting since the project is already configured for OpenNext (an \`open-next.config.ts\` file already exists)\n` + ); + return; + } + + const { packager } = findPackagerAndRoot(projectDir); + const packageManager = packageManagers[packager]; + + printStepTitle("Installing dependencies"); + try { + const forceFlag = args.forceInstall ? " --force" : ""; + childProcess.execSync(`${packageManager.install}${forceFlag} @opennextjs/cloudflare@latest`, { + stdio: "inherit", + }); + childProcess.execSync(`${packageManager.installDev}${forceFlag} wrangler@latest`, { stdio: "inherit" }); + } catch (error) { + logger.error("Failed to install dependencies:", (error as Error).message); + process.exit(1); + } + + printStepTitle("Creating wrangler.jsonc"); + await createWranglerConfigFile("./"); + + printStepTitle("Creating open-next.config.ts"); + await createOpenNextConfigFile("./"); + + const devVarsExists = fs.existsSync(".dev.vars"); + printStepTitle(`${devVarsExists ? "Updating" : "Creating"} .dev.vars file`); + conditionalAppendFileSync( + ".dev.vars", + "\nNEXTJS_ENV=development\n", + (content) => !/\bNEXTJS_ENV\b/.test(content) + ); + + printStepTitle(`${fs.existsSync("public/_headers") ? "Updating" : "Creating"} public/_headers file`); + conditionalAppendFileSync( + "public/_headers", + "\n\n# https://developers.cloudflare.com/workers/static-assets/headers\n" + + "# https://opennext.js.org/cloudflare/caching#static-assets-caching\n" + + "/_next/static/*\n" + + " Cache-Control: public,max-age=31536000,immutable\n\n", + (content) => !/^\/_next\/static\/*\b/.test(content) + ); + + printStepTitle("Updating package.json scripts"); + const openNextScripts = { + preview: "opennextjs-cloudflare build && opennextjs-cloudflare preview", + deploy: "opennextjs-cloudflare build && opennextjs-cloudflare deploy", + upload: "opennextjs-cloudflare build && opennextjs-cloudflare upload", + ["cf-typegen"]: "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts", + }; + try { + let packageJson: { scripts?: Record } = {}; + if (fs.existsSync("package.json")) { + packageJson = JSON.parse(fs.readFileSync("package.json", "utf8")) as { + scripts?: Record; + }; + } + + packageJson.scripts = { + build: "next build", + ...packageJson.scripts, + ...openNextScripts, + }; + + fs.writeFileSync("package.json", JSON.stringify(packageJson, null, 2)); + } catch (error) { + logger.error("Failed to update package.json", (error as Error).message); + logger.warn( + "\nPlease ensure that your package.json contains the following scripts:\n" + + console.log( + [...Object.entries(openNextScripts)].map(([key, value]) => ` - ${key}: ${value}`).join("\n") + ) + + "\n" + ); + } + + const gitIgnoreExists = fs.existsSync(".gitignore"); + printStepTitle(`${gitIgnoreExists ? "Updating" : "Creating"} .gitignore file`); + conditionalAppendFileSync( + ".gitignore", + "\n# OpenNext\n.open-next\n", + (content) => !content.includes(".open-next") + ); + + printStepTitle("Updating Next.js config"); + conditionalAppendFileSync( + findNextConfig({ appPath: projectDir })!, + "\nimport('@opennextjs/cloudflare').then(m => m.initOpenNextCloudflareForDev());\n", + (content) => !content.includes("initOpenNextCloudflareForDev") + ); + + printStepTitle("Checking for edge runtime usage"); + try { + const extensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".mts"]; + const files = findFilesRecursive(projectDir, extensions); + let foundEdgeRuntime = false; + + for (const file of files) { + try { + const content = fs.readFileSync(file, "utf8"); + if (content.includes('export const runtime = "edge"')) { + logger.warn(`Found edge runtime in: ${file}`); + foundEdgeRuntime = true; + break; + } + } catch { + // Skip files that can't be read + } + } + + if (foundEdgeRuntime) { + logger.warn( + "Detected usage of the edge runtime.\n" + + "The edge runtime is not supported yet with @opennextjs/cloudflare.\n" + + 'Remove all the `export const runtime = "edge";` lines from your source files' + ); + } + } catch { + logger.warn( + "Failed to check for edge runtime usage.\n" + + "The edge runtime is not supported yet with @opennextjs/cloudflare.\n" + + 'If present, remove all the `export const runtime = "edge";` lines from your source files' + ); + } + + logger.info( + "🎉 OpenNext Cloudflare adapter complete!\n" + + "\nNext steps:\n" + + `- Run: "${packageManager.run} preview" to build and preview your Cloudflare application locally\n` + + `- Run: "${packageManager.run} deploy" to deploy your application to Cloudflare Workers\n` + ); +} + +interface PackageManager { + name: string; + install: string; + installDev: string; + run: string; +} + +const packageManagers = { + pnpm: { name: "pnpm", install: "pnpm add", installDev: "pnpm add -D", run: "pnpm" }, + npm: { name: "npm", install: "npm install", installDev: "npm install --save-dev", run: "npm run" }, + bun: { name: "bun", install: "bun add", installDev: "bun add -D", run: "bun" }, + yarn: { name: "yarn", install: "yarn add", installDev: "yarn add -D", run: "yarn" }, +} satisfies Record; + +/** + * Recursively searches a directory for files with specified extensions. + * + * Skips common build/cache directories: node_modules, .next, .open-next, .git, dist, build. + * + * @param dir - The directory path to start searching from + * @param extensions - Array of file extensions to match + * @param fileList - Accumulator array for found files (used internally for recursion) + * @returns Array of file paths matching the specified extensions + */ +function findFilesRecursive(dir: string, extensions: string[], fileList: string[] = []): string[] { + const files = fs.readdirSync(dir); + + files.forEach((file) => { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + // Skip node_modules, .next, .open-next, and other common build/cache directories + if (!["node_modules", ".next", ".open-next", ".git", "dist", "build"].includes(file)) { + findFilesRecursive(filePath, extensions, fileList); + } + } else if (stat.isFile()) { + const ext = path.extname(file).toLowerCase(); + if (extensions.includes(ext)) { + fileList.push(filePath); + } + } + }); + + return fileList; +} + +function printStepTitle(title: string): void { + logger.info(`⚙️ ${title}...\n`); +} + +/** + * Add the `migrate` command to yargs configuration. + */ +export function addMigrateCommand(y: T) { + return y.command( + "migrate", + "Set up the OpenNext Cloudflare adapter in an existing Next.js project", + (args) => + args.option("forceInstall", { + type: "boolean", + alias: "f", + desc: "Install the dependencies using the `--force` flag.", + default: false, + }), + (args) => migrateCommand(args) + ); +} diff --git a/packages/cloudflare/src/cli/index.ts b/packages/cloudflare/src/cli/index.ts index 6f982c67..18cd59eb 100644 --- a/packages/cloudflare/src/cli/index.ts +++ b/packages/cloudflare/src/cli/index.ts @@ -4,6 +4,7 @@ import yargs from "yargs"; import { addBuildCommand } from "./commands/build.js"; import { addDeployCommand } from "./commands/deploy.js"; +import { addMigrateCommand } from "./commands/migrate.js"; import { addPopulateCacheCommand } from "./commands/populate-cache.js"; import { addPreviewCommand } from "./commands/preview.js"; import { addUploadCommand } from "./commands/upload.js"; @@ -18,6 +19,7 @@ export function runCommand() { addDeployCommand(y); addUploadCommand(y); addPopulateCacheCommand(y); + addMigrateCommand(y); return y.demandCommand(1, 1).parse(); } diff --git a/packages/cloudflare/src/cli/utils/open-next-config.ts b/packages/cloudflare/src/cli/utils/open-next-config.ts new file mode 100644 index 00000000..1a6e21cd --- /dev/null +++ b/packages/cloudflare/src/cli/utils/open-next-config.ts @@ -0,0 +1,34 @@ +import { cpSync, existsSync } from "node:fs"; +import { join } from "node:path"; + +import { getPackageTemplatesDirPath } from "../../utils/get-package-templates-dir-path.js"; + +/** + * Finds the path to the OpenNext configuration file if it exists. + * + * @param appDir The directory to check for the open-next.config.ts file + * @returns The full path to open-next.config.ts if it exists, undefined otherwise + */ +export function findOpenNextConfig(appDir: string): string | undefined { + const openNextConfigPath = join(appDir, "open-next.config.ts"); + + if (existsSync(openNextConfigPath)) { + return openNextConfigPath; + } + + return undefined; +} + +/** + * Creates a `open-next.config.ts` file in the target directory for the project. + * + * @param appDir The Next application root + * @return The path to the created source file + */ +export async function createOpenNextConfigFile(appDir: string): Promise { + const openNextConfigPath = join(appDir, "open-next.config.ts"); + + cpSync(join(getPackageTemplatesDirPath(), "open-next.config.ts"), openNextConfigPath); + + return openNextConfigPath; +} diff --git a/packages/cloudflare/src/cli/utils/wrangler-config.ts b/packages/cloudflare/src/cli/utils/wrangler-config.ts new file mode 100644 index 00000000..10164cb7 --- /dev/null +++ b/packages/cloudflare/src/cli/utils/wrangler-config.ts @@ -0,0 +1,81 @@ +import { existsSync, readFileSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; + +import { getPackageTemplatesDirPath } from "../../utils/get-package-templates-dir-path.js"; + +/** + * Gets the path to the Wrangler configuration file if it exists. + * + * @param appDir The directory to check for the Wrangler config file + * @returns The path to Wrangler config file if it exists, undefined otherwise + */ +export function findWranglerConfig(appDir: string): string | undefined { + const possibleExts = ["toml", "json", "jsonc"]; + + for (const ext of possibleExts) { + const path = join(appDir, `wrangler.${ext}`); + if (existsSync(path)) { + return path; + } + } + + return undefined; +} + +/** + * Creates a wrangler.jsonc config file in the target directory for the project. + * + * If a wrangler.jsonc file already exists it will be overridden. + * + * @param projectDir The target directory for the project + */ +export async function createWranglerConfigFile(projectDir: string) { + let wranglerConfig = readFileSync(join(getPackageTemplatesDirPath(), "wrangler.jsonc"), "utf8"); + + const appName = getAppNameFromPackageJson(projectDir) ?? "app-name"; + + wranglerConfig = wranglerConfig.replaceAll('""', JSON.stringify(appName.replaceAll("_", "-"))); + + const compatDate = await getLatestCompatDate(); + if (compatDate) { + wranglerConfig = wranglerConfig.replace( + /"compatibility_date": "\d{4}-\d{2}-\d{2}"/, + `"compatibility_date": ${JSON.stringify(compatDate)}` + ); + } + + writeFileSync(join(projectDir, "wrangler.jsonc"), wranglerConfig); +} + +function getAppNameFromPackageJson(sourceDir: string): string | undefined { + try { + const packageJsonStr = readFileSync(join(sourceDir, "package.json"), "utf8"); + const packageJson: Record = JSON.parse(packageJsonStr); + if (typeof packageJson.name === "string") return packageJson.name; + } catch { + /* empty */ + } +} + +async function getLatestCompatDate(): Promise { + try { + const resp = await fetch(`https://registry.npmjs.org/workerd`); + const latestWorkerdVersion = ( + (await resp.json()) as { + "dist-tags": { latest: string }; + } + )["dist-tags"].latest; + + // The format of the workerd version is `major.yyyymmdd.patch`. + const match = latestWorkerdVersion.match(/\d+\.(\d{4})(\d{2})(\d{2})\.\d+/); + + if (match) { + const [, year, month, date] = match; + const compatDate = `${year}-${month}-${date}`; + + return compatDate; + } + } catch { + /* empty */ + } +} From 3d5945c513cc99035d96b3971bce7ac8849913a4 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 10:54:50 +0100 Subject: [PATCH 14/27] chore: port PR #1105 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1105 Changeset: .changeset/port-pr-1105.md --- .changeset/port-pr-1105.md | 7 +++++++ .../incremental-cache/regional-cache.ts | 21 +++---------------- 2 files changed, 10 insertions(+), 18 deletions(-) create mode 100644 .changeset/port-pr-1105.md diff --git a/.changeset/port-pr-1105.md b/.changeset/port-pr-1105.md new file mode 100644 index 00000000..d2ebdaa0 --- /dev/null +++ b/.changeset/port-pr-1105.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1105 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1105 diff --git a/packages/cloudflare/src/api/overrides/incremental-cache/regional-cache.ts b/packages/cloudflare/src/api/overrides/incremental-cache/regional-cache.ts index ee857609..d6537c11 100644 --- a/packages/cloudflare/src/api/overrides/incremental-cache/regional-cache.ts +++ b/packages/cloudflare/src/api/overrides/incremental-cache/regional-cache.ts @@ -9,8 +9,6 @@ import { import { getCloudflareContext } from "../../cloudflare-context.js"; import { debugCache, FALLBACK_BUILD_ID, IncrementalCacheEntry, isPurgeCacheEnabled } from "../internal.js"; -import { NAME as KV_CACHE_NAME } from "./kv-incremental-cache.js"; - const ONE_MINUTE_IN_SECONDS = 60; const THIRTY_MINUTES_IN_SECONDS = ONE_MINUTE_IN_SECONDS * 30; @@ -79,20 +77,17 @@ class RegionalCache implements IncrementalCache { private store: IncrementalCache, private opts: Options ) { - if (this.store.name === KV_CACHE_NAME) { - throw new Error("The KV incremental cache does not need a regional cache."); - } this.name = this.store.name; + // `shouldLazilyUpdateOnCacheHit` is not needed when cache purge is enabled. this.opts.shouldLazilyUpdateOnCacheHit ??= this.opts.mode === "long-lived" && !isPurgeCacheEnabled(); } get #bypassTagCacheOnCacheHit(): boolean { if (this.opts.bypassTagCacheOnCacheHit !== undefined) { - // If the bypassTagCacheOnCacheHit option is set we return that one return this.opts.bypassTagCacheOnCacheHit; } - // Otherwise we default to whether the automatic cache purging is enabled or not + // When `bypassTagCacheOnCacheHit` is not set, we default to whether the automatic cache purging is enabled or not return isPurgeCacheEnabled(); } @@ -238,17 +233,7 @@ class RegionalCache implements IncrementalCache { * a request is made to another region that has an entry stored in its regional cache. * * @param cache Incremental cache instance. - * @param opts.mode The mode to use for the regional cache. - * - `short-lived`: Re-use a cache entry for up to a minute after it has been retrieved. - * - `long-lived`: Re-use a fetch cache entry until it is revalidated (per-region), - * or an ISR/SSG entry for up to 30 minutes. - * @param opts.shouldLazilyUpdateOnCacheHit Whether the regional cache entry should be updated in - * the background or not when it experiences a cache hit. - * @param opts.defaultLongLivedTtlSec The default age to use for long-lived cache entries. - * When no revalidate is provided, the default age will be used. - * @default `THIRTY_MINUTES_IN_SECONDS` - * - * @default `false` for the `short-lived` mode, and `true` for the `long-lived` mode. + * @param opts Options for the regional cache. */ export function withRegionalCache(cache: IncrementalCache, opts: Options) { return new RegionalCache(cache, opts); From c8337b097ab3675b22984dc6674cf4e1c185b39f Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:00:03 +0100 Subject: [PATCH 15/27] chore: port PR #1097 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1097 Changeset: .changeset/port-pr-1097.md --- .changeset/port-pr-1097.md | 7 +++++++ packages/cloudflare/src/cli/commands/build.ts | 2 +- .../cloudflare/src/cli/commands/deploy.ts | 2 +- .../src/cli/commands/populate-cache.ts | 4 ++-- .../cloudflare/src/cli/commands/preview.ts | 2 +- .../cloudflare/src/cli/commands/upload.ts | 2 +- packages/cloudflare/src/cli/commands/utils.ts | 11 ++++++++--- packages/cloudflare/src/cli/index.ts | 19 ++++++++++++++++++- 8 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 .changeset/port-pr-1097.md diff --git a/.changeset/port-pr-1097.md b/.changeset/port-pr-1097.md new file mode 100644 index 00000000..969f751c --- /dev/null +++ b/.changeset/port-pr-1097.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1097 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1097 diff --git a/packages/cloudflare/src/cli/commands/build.ts b/packages/cloudflare/src/cli/commands/build.ts index 3a2336ea..560f886d 100644 --- a/packages/cloudflare/src/cli/commands/build.ts +++ b/packages/cloudflare/src/cli/commands/build.ts @@ -61,7 +61,7 @@ async function buildCommand( */ export function addBuildCommand(y: T) { return y.command( - "build", + "build [args..]", "Build an OpenNext Cloudflare worker", (c) => withWranglerOptions(c) diff --git a/packages/cloudflare/src/cli/commands/deploy.ts b/packages/cloudflare/src/cli/commands/deploy.ts index 851c9ba5..db0080a7 100644 --- a/packages/cloudflare/src/cli/commands/deploy.ts +++ b/packages/cloudflare/src/cli/commands/deploy.ts @@ -75,7 +75,7 @@ export async function deployCommand(args: WithWranglerArgs<{ cacheChunkSize?: nu */ export function addDeployCommand(y: T) { return y.command( - "deploy", + "deploy [args..]", "Deploy a built OpenNext app to Cloudflare Workers", (c) => withPopulateCacheOptions(c), (args) => deployCommand(withWranglerPassthroughArgs(args)) diff --git a/packages/cloudflare/src/cli/commands/populate-cache.ts b/packages/cloudflare/src/cli/commands/populate-cache.ts index 6555b6d7..d87e084c 100644 --- a/packages/cloudflare/src/cli/commands/populate-cache.ts +++ b/packages/cloudflare/src/cli/commands/populate-cache.ts @@ -390,13 +390,13 @@ export function addPopulateCacheCommand(y: T) { return y.command("populateCache", "Populate the cache for a built Next.js app", (c) => c .command( - "local", + "local [args..]", "Local dev server cache", (c) => withPopulateCacheOptions(c), (args) => populateCacheCommand("local", withWranglerPassthroughArgs(args)) ) .command( - "remote", + "remote [args..]", "Remote Cloudflare Worker cache", (c) => withPopulateCacheOptions(c), (args) => populateCacheCommand("remote", withWranglerPassthroughArgs(args)) diff --git a/packages/cloudflare/src/cli/commands/preview.ts b/packages/cloudflare/src/cli/commands/preview.ts index 48c6a72c..caefaf72 100644 --- a/packages/cloudflare/src/cli/commands/preview.ts +++ b/packages/cloudflare/src/cli/commands/preview.ts @@ -53,7 +53,7 @@ export async function previewCommand( */ export function addPreviewCommand(y: T) { return y.command( - "preview", + "preview [args..]", "Preview a built OpenNext app with a Wrangler dev server", (c) => withPopulateCacheOptions(c).option("remote", { diff --git a/packages/cloudflare/src/cli/commands/upload.ts b/packages/cloudflare/src/cli/commands/upload.ts index b0111e55..26c060bd 100644 --- a/packages/cloudflare/src/cli/commands/upload.ts +++ b/packages/cloudflare/src/cli/commands/upload.ts @@ -72,7 +72,7 @@ export async function uploadCommand(args: WithWranglerArgs<{ cacheChunkSize?: nu */ export function addUploadCommand(y: T) { return y.command( - "upload", + "upload [args..]", "Upload a built OpenNext app to Cloudflare Workers", (c) => withPopulateCacheOptions(c), (args) => uploadCommand(withWranglerPassthroughArgs(args)) diff --git a/packages/cloudflare/src/cli/commands/utils.ts b/packages/cloudflare/src/cli/commands/utils.ts index 15b40198..1a3427e1 100644 --- a/packages/cloudflare/src/cli/commands/utils.ts +++ b/packages/cloudflare/src/cli/commands/utils.ts @@ -142,7 +142,12 @@ type WranglerInputArgs = { * @param args * @returns An array of arguments that can be given to wrangler commands, including the `--config` and `--env` args. */ -function getWranglerArgs(args: WranglerInputArgs & { _: (string | number)[] }): string[] { +function getWranglerArgs( + args: WranglerInputArgs & { + _: (string | number)[]; + args?: (string | number)[]; + } +): string[] { if (args.configPath) { logger.warn("The `--configPath` flag is deprecated, please use `--config` instead."); @@ -159,8 +164,8 @@ function getWranglerArgs(args: WranglerInputArgs & { _: (string | number)[] }): ...(args.config ? ["--config", args.config] : []), ...(args.env ? ["--env", args.env] : []), ...(args.remote ? ["--remote"] : []), - // Note: the first args in `_` will be the commands. - ...args._.slice(args._[0] === "populateCache" ? 2 : 1).map((a) => `${a}`), + // Note: the `args` array contains unrecognised flags. + ...(args.args?.map((a) => `${a}`) ?? []), ]; } diff --git a/packages/cloudflare/src/cli/index.ts b/packages/cloudflare/src/cli/index.ts index 18cd59eb..3646f316 100644 --- a/packages/cloudflare/src/cli/index.ts +++ b/packages/cloudflare/src/cli/index.ts @@ -1,7 +1,9 @@ #!/usr/bin/env node +import logger from "@opennextjs/aws/logger.js"; import yargs from "yargs"; +import { getVersion } from "./build/utils/version.js"; import { addBuildCommand } from "./commands/build.js"; import { addDeployCommand } from "./commands/deploy.js"; import { addMigrateCommand } from "./commands/migrate.js"; @@ -12,7 +14,22 @@ import { addUploadCommand } from "./commands/upload.js"; export function runCommand() { const y = yargs(process.argv.slice(2).filter((arg) => arg !== "--")) .scriptName("opennextjs-cloudflare") - .parserConfiguration({ "unknown-options-as-args": true }); + .parserConfiguration({ "unknown-options-as-args": true }) + .strictCommands() + .help() + .alias("h", "help") + .version(getVersion().cloudflare) + .alias("v", "version") + .fail((msg, err, yargs) => { + if (msg) { + logger.error(`${msg}\n`); + } + if (err) { + throw err; + } + yargs.showHelp(); + process.exit(1); + }); addBuildCommand(y); addPreviewCommand(y); From e082616de6d283d7a091dbb9727ab46d435603f8 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:05:24 +0100 Subject: [PATCH 16/27] chore: port PR #1122 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1122 Applied bugfixes and improvements to the 'migrate' command: - Fixed extra newlines when appending to files (updated conditionalAppendFileSync signature) - Fixed error when 'public' directory is missing (creates parent directories automatically) - Fixed Next.js config file update to check if the file exists first - Updated checkRunningInsideNextjsApp to accept { appPath: string } instead of full BuildOptions Changesets: - .changeset/port-pr-1122-cloudflare.md - .changeset/port-pr-1122-aws.md --- .changeset/port-pr-1122-aws.md | 9 ++++ .changeset/port-pr-1122-cloudflare.md | 12 +++++ .../cloudflare/src/cli/build/utils/files.ts | 22 +++++++-- .../cloudflare/src/cli/commands/migrate.ts | 48 +++++++++++-------- packages/open-next/src/build/helper.ts | 3 +- 5 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 .changeset/port-pr-1122-aws.md create mode 100644 .changeset/port-pr-1122-cloudflare.md diff --git a/.changeset/port-pr-1122-aws.md b/.changeset/port-pr-1122-aws.md new file mode 100644 index 00000000..8477026c --- /dev/null +++ b/.changeset/port-pr-1122-aws.md @@ -0,0 +1,9 @@ +--- +"@opennextjs/aws": patch +--- + +Ported PR #1122 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1122 + +Changed `checkRunningInsideNextjsApp` function signature to accept `{ appPath: string }` instead of full `BuildOptions` object, making it more flexible for use in the migrate command. diff --git a/.changeset/port-pr-1122-cloudflare.md b/.changeset/port-pr-1122-cloudflare.md new file mode 100644 index 00000000..2542d3e9 --- /dev/null +++ b/.changeset/port-pr-1122-cloudflare.md @@ -0,0 +1,12 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1122 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1122 + +Applied bugfixes and improvements to the `migrate` command: +- Fixed extra newlines when appending to files (updated `conditionalAppendFileSync` function signature to use options object with `appendIf` and `appendPrefix`) +- Fixed error when `public` directory is missing (now creates parent directories automatically) +- Fixed Next.js config file update to check if the file exists before attempting to update diff --git a/packages/cloudflare/src/cli/build/utils/files.ts b/packages/cloudflare/src/cli/build/utils/files.ts index 0166dc71..9a64b789 100644 --- a/packages/cloudflare/src/cli/build/utils/files.ts +++ b/packages/cloudflare/src/cli/build/utils/files.ts @@ -1,4 +1,5 @@ import fs from "node:fs"; +import path from "node:path"; /** * Appends text to a file @@ -8,16 +9,29 @@ import fs from "node:fs"; * * @param filepath The path to the file. * @param text The text to append to the file. - * @param condition A function that receives the current file content and returns `true` if the text should be appended to it, the condition is skipped when the file is being created. + * @param opts.appendIf A function that receives the current file content and returns `true` if the text should be appended to it, the condition is skipped when the file is being created. Defaults to a function that always returns true. + * @param opts.appendPrefix A string that will be inserted between the pre-existing file's content and the new text in case the file already existed. Defaults to an empty string. */ export function conditionalAppendFileSync( filepath: string, text: string, - condition: (fileContent: string) => boolean + { + appendIf = () => true, + appendPrefix = "", + }: { + appendIf?: (fileContent: string) => boolean; + appendPrefix?: string; + } = {} ): void { const fileExists = fs.existsSync(filepath); + const maybeFileContent = fileExists ? fs.readFileSync(filepath, "utf8") : ""; - if (!fileExists || condition(fs.readFileSync(filepath, "utf8"))) { - fs.appendFileSync(filepath, text); + if (!fileExists) { + const dir = path.dirname(filepath); + fs.mkdirSync(dir, { recursive: true }); + } + + if (!fileExists || appendIf(maybeFileContent)) { + fs.appendFileSync(filepath, `${maybeFileContent.length > 0 ? appendPrefix : ""}${text}`); } } diff --git a/packages/cloudflare/src/cli/commands/migrate.ts b/packages/cloudflare/src/cli/commands/migrate.ts index e48495ce..1022f544 100644 --- a/packages/cloudflare/src/cli/commands/migrate.ts +++ b/packages/cloudflare/src/cli/commands/migrate.ts @@ -71,20 +71,22 @@ async function migrateCommand(args: { forceInstall: boolean }): Promise { const devVarsExists = fs.existsSync(".dev.vars"); printStepTitle(`${devVarsExists ? "Updating" : "Creating"} .dev.vars file`); - conditionalAppendFileSync( - ".dev.vars", - "\nNEXTJS_ENV=development\n", - (content) => !/\bNEXTJS_ENV\b/.test(content) - ); + conditionalAppendFileSync(".dev.vars", "NEXTJS_ENV=development\n", { + appendIf: (content) => !/\bNEXTJS_ENV\b/.test(content), + appendPrefix: "\n", + }); printStepTitle(`${fs.existsSync("public/_headers") ? "Updating" : "Creating"} public/_headers file`); conditionalAppendFileSync( "public/_headers", - "\n\n# https://developers.cloudflare.com/workers/static-assets/headers\n" + + "# https://developers.cloudflare.com/workers/static-assets/headers\n" + "# https://opennext.js.org/cloudflare/caching#static-assets-caching\n" + "/_next/static/*\n" + - " Cache-Control: public,max-age=31536000,immutable\n\n", - (content) => !/^\/_next\/static\/*\b/.test(content) + " Cache-Control: public,max-age=31536000,immutable\n", + { + appendIf: (content) => !/^\/_next\/static\/*\b/.test(content), + appendPrefix: "\n\n", + } ); printStepTitle("Updating package.json scripts"); @@ -114,7 +116,7 @@ async function migrateCommand(args: { forceInstall: boolean }): Promise { logger.warn( "\nPlease ensure that your package.json contains the following scripts:\n" + console.log( - [...Object.entries(openNextScripts)].map(([key, value]) => ` - ${key}: ${value}`).join("\n") + Object.entries(openNextScripts).map(([key, value]) => ` - ${key}: ${value}`).join("\n") ) + "\n" ); @@ -122,18 +124,24 @@ async function migrateCommand(args: { forceInstall: boolean }): Promise { const gitIgnoreExists = fs.existsSync(".gitignore"); printStepTitle(`${gitIgnoreExists ? "Updating" : "Creating"} .gitignore file`); - conditionalAppendFileSync( - ".gitignore", - "\n# OpenNext\n.open-next\n", - (content) => !content.includes(".open-next") - ); + conditionalAppendFileSync(".gitignore", "# OpenNext\n.open-next\n", { + appendIf: (content) => !content.includes(".open-next"), + appendPrefix: "\n", + }); - printStepTitle("Updating Next.js config"); - conditionalAppendFileSync( - findNextConfig({ appPath: projectDir })!, - "\nimport('@opennextjs/cloudflare').then(m => m.initOpenNextCloudflareForDev());\n", - (content) => !content.includes("initOpenNextCloudflareForDev") - ); + const nextConfig = findNextConfig({ appPath: projectDir }); + + if (nextConfig) { + printStepTitle("Updating Next.js config"); + conditionalAppendFileSync( + nextConfig.path, + "import('@opennextjs/cloudflare').then(m => m.initOpenNextCloudflareForDev());\n", + { + appendIf: (content) => !content.includes("initOpenNextCloudflareForDev"), + appendPrefix: "\n", + } + ); + } printStepTitle("Checking for edge runtime usage"); try { diff --git a/packages/open-next/src/build/helper.ts b/packages/open-next/src/build/helper.ts index da2575b5..159495b9 100644 --- a/packages/open-next/src/build/helper.ts +++ b/packages/open-next/src/build/helper.ts @@ -337,8 +337,7 @@ export function copyEnvFile(appPath: string, packagePath: string, outputPath: st /** * Check we are in a Nextjs app by looking for the Nextjs config file. */ -export function checkRunningInsideNextjsApp(options: BuildOptions) { - const { appPath } = options; +export function checkRunningInsideNextjsApp({ appPath }: { appPath: string }) { const extension = ["js", "cjs", "mjs", "ts"].find((ext) => fs.existsSync(path.join(appPath, `next.config.${ext}`)) ); From 78d6ad70cfeb88225cf70676fadea267da92dc17 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:05:42 +0100 Subject: [PATCH 17/27] chore: update port PR skill instructions for staging and committing changes --- .claude/skills/port-pr/SKILL.md | 46 +++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/.claude/skills/port-pr/SKILL.md b/.claude/skills/port-pr/SKILL.md index 410432ee..e8083cf8 100644 --- a/.claude/skills/port-pr/SKILL.md +++ b/.claude/skills/port-pr/SKILL.md @@ -64,17 +64,17 @@ Apply similar changes following this repository's conventions: After implementation, run: ```bash -pnpm code:checks +pnpm code:checks 2>&1 | tail -20 ``` -This runs formatting, linting, and TypeScript checks. +This runs formatting, linting, and TypeScript checks. Only the tail of the output is shown to see the result. ### 7. Run Unit Tests After code checks pass, run only the unit tests from the tests-unit package: ```bash -pnpm --filter tests-unit test +pnpm --filter tests-unit test 2>&1 | tail -20 ``` **Important:** Do NOT run `pnpm test` (which runs all tests), `pnpm e2e:test`, or any full test suite. Only unit tests from the tests-unit package should be run during the porting process. @@ -105,32 +105,46 @@ Ported PR #$PR_NUMBER from source repository $ARGUMENTS" > .changeset/port-pr-$PR_NUMBER.md ``` -### 10. Stage Changes and Prepare Commit +### 10. Stage All Files -Stage the changeset file and prepare a commit message (but do not commit): +Stage all files that were modified or created during the port: ```bash -# Stage the changeset file -git add .changeset/port-pr-$PR_NUMBER.md +git status --short +git add .changeset/port-pr-$PR_NUMBER.md +``` -# Prepare the commit message with the PR link (stored for later) -echo "chore: port PR #$PR_NUMBER from source repository +### 11. Ask for Commit -$ARGUMENTS +Ask the user if they want to commit the changes directly: -Changeset: .changeset/port-pr-$PR_NUMBER.md" > /tmp/commit-message-port-pr-$PR_NUMBER.txt +Ask the user: **"Should I stage all files and commit the ported PR changes now?"** -# Display the prepared commit message -cat /tmp/commit-message-port-pr-$PR_NUMBER.txt -``` +Options: -The changeset is staged and ready to commit. The commit message is saved at `/tmp/commit-message-port-pr-$PR_NUMBER.txt` for reference. +- "Yes, commit now" - Stage all files and commit with the prepared message +- "No, I'll commit manually" - Let the user stage and commit themselves + +If the user chooses to commit: + +```bash +# Stage all modified and new files +git add + +# Commit with the prepared message +git commit -m "chore: port PR #$PR_NUMBER from source repository + +$ARGUMENTS + +Changeset: .changeset/port-pr-$PR_NUMBER.md" +``` -### 11. Summary +### 12. Summary Provide a summary of: - What was ported - Any adaptations made - Files modified/created +- Whether the changes were committed - Any remaining TODOs or follow-up items From 322d80c0989ae40cfe0c7313abd38102e06e4e0a Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:10:25 +0100 Subject: [PATCH 18/27] chore: port PR #1126 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1126 Fix: prevent Worker hang on HEAD requests to static assets When run_worker_first is enabled, HEAD requests to static assets hang the Worker because response.body is null (per HTTP spec) and the fallback new ReadableStream() creates a stream that never closes. Changes: - Return null body for HEAD requests instead of falling through to the hanging ReadableStream fallback - Add tests for maybeGetAssetResult covering GET, HEAD, 404, POST, and run_worker_first=false cases Changeset: .changeset/port-pr-1126.md --- .changeset/port-pr-1126.md | 7 ++ .../overrides/asset-resolver/index.spec.ts | 75 ++++++++++++++++++- .../src/api/overrides/asset-resolver/index.ts | 25 ++++++- 3 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 .changeset/port-pr-1126.md diff --git a/.changeset/port-pr-1126.md b/.changeset/port-pr-1126.md new file mode 100644 index 00000000..d6ef4453 --- /dev/null +++ b/.changeset/port-pr-1126.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1126 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1126 diff --git a/packages/cloudflare/src/api/overrides/asset-resolver/index.spec.ts b/packages/cloudflare/src/api/overrides/asset-resolver/index.spec.ts index e58e451b..defc4573 100644 --- a/packages/cloudflare/src/api/overrides/asset-resolver/index.spec.ts +++ b/packages/cloudflare/src/api/overrides/asset-resolver/index.spec.ts @@ -1,7 +1,80 @@ -import { describe, expect, test } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { isUserWorkerFirst } from "./index.js"; +const mockAssetsFetch = vi.fn(); + +vi.mock("../../cloudflare-context.js", () => ({ + getCloudflareContext: () => ({ + env: { + ASSETS: { fetch: mockAssetsFetch }, + }, + }), +})); + +describe("maybeGetAssetResult", () => { + let resolver: typeof import("./index.js").default; + + beforeEach(async () => { + vi.resetModules(); + mockAssetsFetch.mockReset(); + globalThis.__ASSETS_RUN_WORKER_FIRST__ = true; + resolver = (await import("./index.js")).default; + }); + + const makeEvent = (method: string, rawPath: string) => + ({ + method, + rawPath, + headers: { accept: "*/*" }, + }) as Parameters[0]; + + test("GET request returns response body", async () => { + const body = new ReadableStream(); + mockAssetsFetch.mockResolvedValue(new Response(body, { status: 200 })); + + const result = await resolver.maybeGetAssetResult(makeEvent("GET", "/style.css")); + + expect(result).toBeDefined(); + expect(result!.statusCode).toBe(200); + expect(result!.body).not.toBeNull(); + }); + + test("HEAD request returns null body", async () => { + mockAssetsFetch.mockResolvedValue(new Response(null, { status: 200 })); + + const result = await resolver.maybeGetAssetResult(makeEvent("HEAD", "/style.css")); + + expect(result).toBeDefined(); + expect(result!.statusCode).toBe(200); + expect(result!.body).toBeNull(); + }); + + test("returns undefined for 404 responses", async () => { + mockAssetsFetch.mockResolvedValue(new Response(null, { status: 404 })); + + const result = await resolver.maybeGetAssetResult(makeEvent("GET", "/missing.css")); + + expect(result).toBeUndefined(); + }); + + test("returns undefined for POST requests", async () => { + const result = await resolver.maybeGetAssetResult(makeEvent("POST", "/style.css")); + + expect(result).toBeUndefined(); + expect(mockAssetsFetch).not.toHaveBeenCalled(); + }); + + test("returns undefined when run_worker_first is false", async () => { + globalThis.__ASSETS_RUN_WORKER_FIRST__ = false; + + const result = await resolver.maybeGetAssetResult(makeEvent("GET", "/style.css")); + + expect(result).toBeUndefined(); + expect(mockAssetsFetch).not.toHaveBeenCalled(); + }); +}); + describe("isUserWorkerFirst", () => { test("run_worker_first = false", () => { expect(isUserWorkerFirst(false, "/test")).toBe(false); diff --git a/packages/cloudflare/src/api/overrides/asset-resolver/index.ts b/packages/cloudflare/src/api/overrides/asset-resolver/index.ts index 88d7e88d..e3b17945 100644 --- a/packages/cloudflare/src/api/overrides/asset-resolver/index.ts +++ b/packages/cloudflare/src/api/overrides/asset-resolver/index.ts @@ -44,14 +44,33 @@ const resolver: AssetResolver = { type: "core", statusCode: response.status, headers: Object.fromEntries(response.headers.entries()), - // Workers and Node types differ. - // oxlint-disable-next-line @typescript-eslint/no-explicit-any - body: response.body || (new ReadableStream() as any), + // eslint-disable-next-line @typescript-eslint/no-explicit-any + body: getResponseBody(method, response) as any, isBase64Encoded: false, } satisfies InternalResult; }, }; +/** + * Returns the response body for an asset result. + * + * HEAD responses must return `null` because `response.body` is `null` per the HTTP spec + * and the `new ReadableStream()` fallback would create a stream that never closes, hanging the Worker. + * + * @param method - The HTTP method of the request. + * @param response - The response from the ASSETS binding. + * @returns The body to use in the internal result. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function getResponseBody(method: string, response: Response): ReadableStream | null { + if (method === "HEAD") { + return null; + } + // Workers and Node ReadableStream types differ. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return response.body || (new ReadableStream() as any); +} + /** * @param runWorkerFirst `run_worker_first` config * @param pathname pathname of the request From ab06c09c27a6ae3bb242f558bd16fae498d1cbdc Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:10:51 +0100 Subject: [PATCH 19/27] linting --- .changeset/port-pr-1122-cloudflare.md | 1 + packages/cloudflare/src/cli/commands/migrate.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.changeset/port-pr-1122-cloudflare.md b/.changeset/port-pr-1122-cloudflare.md index 2542d3e9..a7f15deb 100644 --- a/.changeset/port-pr-1122-cloudflare.md +++ b/.changeset/port-pr-1122-cloudflare.md @@ -7,6 +7,7 @@ Ported PR #1122 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1122 Applied bugfixes and improvements to the `migrate` command: + - Fixed extra newlines when appending to files (updated `conditionalAppendFileSync` function signature to use options object with `appendIf` and `appendPrefix`) - Fixed error when `public` directory is missing (now creates parent directories automatically) - Fixed Next.js config file update to check if the file exists before attempting to update diff --git a/packages/cloudflare/src/cli/commands/migrate.ts b/packages/cloudflare/src/cli/commands/migrate.ts index 1022f544..fc11e933 100644 --- a/packages/cloudflare/src/cli/commands/migrate.ts +++ b/packages/cloudflare/src/cli/commands/migrate.ts @@ -116,7 +116,9 @@ async function migrateCommand(args: { forceInstall: boolean }): Promise { logger.warn( "\nPlease ensure that your package.json contains the following scripts:\n" + console.log( - Object.entries(openNextScripts).map(([key, value]) => ` - ${key}: ${value}`).join("\n") + Object.entries(openNextScripts) + .map(([key, value]) => ` - ${key}: ${value}`) + .join("\n") ) + "\n" ); From 79c5af39df5e80a4b606ff8111efd5368e55151a Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:15:04 +0100 Subject: [PATCH 20/27] chore: port PR #1127 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1127 Changeset: .changeset/port-pr-1127.md --- .changeset/port-pr-1127.md | 7 ++ packages/cloudflare/src/cli/build/build.ts | 23 +---- .../cloudflare/src/cli/commands/migrate.ts | 99 ++++++++++++++++--- packages/cloudflare/src/cli/commands/utils.ts | 32 ++++++ 4 files changed, 127 insertions(+), 34 deletions(-) create mode 100644 .changeset/port-pr-1127.md diff --git a/.changeset/port-pr-1127.md b/.changeset/port-pr-1127.md new file mode 100644 index 00000000..71335f2c --- /dev/null +++ b/.changeset/port-pr-1127.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1127 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1127 diff --git a/packages/cloudflare/src/cli/build/build.ts b/packages/cloudflare/src/cli/build/build.ts index 505fadca..0ca82267 100644 --- a/packages/cloudflare/src/cli/build/build.ts +++ b/packages/cloudflare/src/cli/build/build.ts @@ -9,6 +9,7 @@ import logger from "@opennextjs/aws/logger.js"; import type { Unstable_Config } from "wrangler"; import { OpenNextConfig } from "../../api/config.js"; +import { ensureNextjsVersionSupported } from "../commands/utils.js"; import type { ProjectOptions } from "../project-options.js"; import { bundleServer } from "./bundle-server.js"; @@ -104,25 +105,3 @@ export async function build( logger.info("OpenNext build complete."); } - -async function ensureNextjsVersionSupported({ nextVersion }: buildHelper.BuildOptions) { - if (buildHelper.compareSemver(nextVersion, "<", "14.2.0")) { - logger.error("Next.js version unsupported, please upgrade to version 14.2 or greater."); - process.exit(1); - } - - const { - default: { version: wranglerVersion }, - } = await import("wrangler/package.json", { with: { type: "json" } }); - - // We need a version of workerd that has a fix for setImmediate for Next.js 16.1+ - // See: - // - https://github.com/cloudflare/workerd/pull/5869 - // - https://github.com/opennextjs/opennextjs-cloudflare/issues/1049 - if ( - buildHelper.compareSemver(nextVersion, ">=", "16.1.0") && - buildHelper.compareSemver(wranglerVersion, "<", "4.59.2") - ) { - logger.warn(`Next.js 16.1+ requires wrangler 4.59.2 or greater (${wranglerVersion} detected).`); - } -} diff --git a/packages/cloudflare/src/cli/commands/migrate.ts b/packages/cloudflare/src/cli/commands/migrate.ts index fc11e933..c8ca352a 100644 --- a/packages/cloudflare/src/cli/commands/migrate.ts +++ b/packages/cloudflare/src/cli/commands/migrate.ts @@ -1,3 +1,4 @@ +import assert from "node:assert"; import childProcess from "node:child_process"; import fs from "node:fs"; import path from "node:path"; @@ -6,15 +7,17 @@ import { checkRunningInsideNextjsApp, findNextConfig, findPackagerAndRoot, + getNextVersion, } from "@opennextjs/aws/build/helper.js"; import logger from "@opennextjs/aws/logger.js"; import type yargs from "yargs"; import { conditionalAppendFileSync } from "../build/utils/files.js"; +import { askConfirmation } from "../utils/ask-confirmation.js"; import { createOpenNextConfigFile, findOpenNextConfig } from "../utils/open-next-config.js"; import { createWranglerConfigFile, findWranglerConfig } from "../utils/wrangler-config.js"; -import { printHeaders } from "./utils.js"; +import { ensureNextjsVersionSupported, printHeaders } from "./utils.js"; /** * Implementation of the `opennextjs-cloudflare migrate` command. @@ -28,6 +31,18 @@ async function migrateCommand(args: { forceInstall: boolean }): Promise { const projectDir = process.cwd(); + const nextConfigFileCreated = await maybeCreateNextConfigFileIfMissing(projectDir, args.forceInstall).catch( + (e) => { + logger.error(`${e instanceof Error ? e.message : e}\n`); + process.exit(1); + } + ); + + if (nextConfigFileCreated === false) { + logger.error("The next.config file is required, aborting!\n"); + process.exit(1); + } + checkRunningInsideNextjsApp({ appPath: projectDir }); const wranglerConfigFilePath = findWranglerConfig(projectDir); @@ -133,17 +148,19 @@ async function migrateCommand(args: { forceInstall: boolean }): Promise { const nextConfig = findNextConfig({ appPath: projectDir }); - if (nextConfig) { - printStepTitle("Updating Next.js config"); - conditionalAppendFileSync( - nextConfig.path, - "import('@opennextjs/cloudflare').then(m => m.initOpenNextCloudflareForDev());\n", - { - appendIf: (content) => !content.includes("initOpenNextCloudflareForDev"), - appendPrefix: "\n", - } - ); - } + // At this point the next config file should exist (it either + // was part of the original project or we've created it) + assert(nextConfig, "Next config file unexpectedly missing"); + + printStepTitle("Updating Next.js config"); + conditionalAppendFileSync( + nextConfig.path, + "import('@opennextjs/cloudflare').then(m => m.initOpenNextCloudflareForDev());\n", + { + appendIf: (content) => !content.includes("initOpenNextCloudflareForDev"), + appendPrefix: "\n", + } + ); printStepTitle("Checking for edge runtime usage"); try { @@ -238,6 +255,64 @@ function printStepTitle(title: string): void { logger.info(`⚙️ ${title}...\n`); } +/** + * Creates a plain next.config.ts file + * + * @param appDir The directory where the config file should be created + */ +function createNextConfigFile(appDir: string): void { + const nextConfigPath = path.join(appDir, "next.config.ts"); + const content = `import type { NextConfig } from "next"; + +const nextConfig: NextConfig = {}; + +export default nextConfig; +`; + fs.writeFileSync(nextConfigPath, content); +} + +/** + * Creates a next.config.ts file, after asking for the user's confirmation, if missing in the project's directory. + * + * To be safe, this function also ensures that the "next" package is installed and its version is compatible with OpenNext. + * + * @param projectDir The project directory to check + * @param skipNextVersionCheck Whether to bypass the "next" version compatibility check + * @returns A boolean representing whether the user has accepter the creation of the config file, undefined if the file already existed + * @throws {Error} If "next" is not installed or the Next.js version is incompatible with open-next + */ +async function maybeCreateNextConfigFileIfMissing( + projectDir: string, + skipNextVersionCheck: boolean +): Promise { + if (findNextConfig({ appPath: projectDir })) { + return; + } + + let nextVersion: string; + try { + nextVersion = getNextVersion(projectDir); + } catch { + throw new Error( + "This does not appear to be a Next.js application. The 'next' package is not installed and no next.config file was found." + ); + } + + if (!skipNextVersionCheck) { + await ensureNextjsVersionSupported({ nextVersion }); + } + + const answer = await askConfirmation("Missing required next.config file. Do you want to create one?"); + + if (!answer) { + return false; + } + + createNextConfigFile(projectDir); + logger.info("Created next.config.ts\n"); + return true; +} + /** * Add the `migrate` command to yargs configuration. */ diff --git a/packages/cloudflare/src/cli/commands/utils.ts b/packages/cloudflare/src/cli/commands/utils.ts index 1a3427e1..8612102c 100644 --- a/packages/cloudflare/src/cli/commands/utils.ts +++ b/packages/cloudflare/src/cli/commands/utils.ts @@ -5,6 +5,7 @@ import url from "node:url"; import { compileOpenNextConfig } from "@opennextjs/aws/build/compileConfig.js"; import { normalizeOptions } from "@opennextjs/aws/build/helper.js"; +import * as buildHelper from "@opennextjs/aws/build/helper.js"; import { printHeader, showWarningOnWindows } from "@opennextjs/aws/build/utils.js"; import logger from "@opennextjs/aws/logger.js"; import { unstable_readConfig } from "wrangler"; @@ -33,6 +34,37 @@ export function printHeaders(command: string) { showWarningOnWindows(); } +/** + * Validates that the Next.js version is supported and checks wrangler compatibility. + * + * Note: this function assumes that wrangler is installed. + * + * @param options.nextVersion The detected Next.js version string + * @throws {Error} If the Next.js version is unsupported + */ +export async function ensureNextjsVersionSupported({ + nextVersion, +}: Pick) { + if (buildHelper.compareSemver(nextVersion, "<", "14.2.0")) { + throw new Error("Next.js version unsupported, please upgrade to version 14.2 or greater."); + } + + const { + default: { version: wranglerVersion }, + } = await import("wrangler/package.json", { with: { type: "json" } }); + + // We need a version of workerd that has a fix for setImmediate for Next.js 16.1+ + // See: + // - https://github.com/cloudflare/workerd/pull/5869 + // - https://github.com/opennextjs/opennextjs-cloudflare/issues/1049 + if ( + buildHelper.compareSemver(nextVersion, ">=", "16.1.0") && + buildHelper.compareSemver(wranglerVersion, "<", "4.59.2") + ) { + logger.warn(`Next.js 16.1+ requires wrangler 4.59.2 or greater (${wranglerVersion} detected).`); + } +} + /** * Compile the OpenNext config. * From 72049974c3d3bd378e6c44adf450f0e740f5fbe7 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:17:36 +0100 Subject: [PATCH 21/27] chore: port PR #1138 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1138 Changeset: .changeset/port-pr-1138.md --- .changeset/port-pr-1138.md | 7 +++++++ packages/cloudflare/src/cli/utils/wrangler-config.ts | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .changeset/port-pr-1138.md diff --git a/.changeset/port-pr-1138.md b/.changeset/port-pr-1138.md new file mode 100644 index 00000000..2c25319d --- /dev/null +++ b/.changeset/port-pr-1138.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1138 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1138 diff --git a/packages/cloudflare/src/cli/utils/wrangler-config.ts b/packages/cloudflare/src/cli/utils/wrangler-config.ts index 10164cb7..c94d211b 100644 --- a/packages/cloudflare/src/cli/utils/wrangler-config.ts +++ b/packages/cloudflare/src/cli/utils/wrangler-config.ts @@ -70,10 +70,12 @@ async function getLatestCompatDate(): Promise { const match = latestWorkerdVersion.match(/\d+\.(\d{4})(\d{2})(\d{2})\.\d+/); if (match) { - const [, year, month, date] = match; - const compatDate = `${year}-${month}-${date}`; + const [, year, month, day] = match; + const compatDate = `${year}-${month}-${day}`; - return compatDate; + const currentDate = new Date().toISOString().slice(0, 10); + + return compatDate < currentDate ? compatDate : currentDate; } } catch { /* empty */ From e14b0b98f3174f4269cb1eea4756b6499ffd076f Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:34:04 +0100 Subject: [PATCH 22/27] chore: port PR #1133 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1133 Changeset: .changeset/port-pr-1133.md Update the migrate command to attempt to create an R2 bucket for caching as part of the migration process, if that is not possible an application without caching enabled will be generated instead. --- .changeset/port-pr-1133.md | 7 + packages/cloudflare/package.json | 2 + packages/cloudflare/src/cli/build/build.ts | 2 +- .../cloudflare/src/cli/build/bundle-server.ts | 4 +- .../cli/build/open-next/compile-env-files.ts | 2 +- .../cli/build/open-next/createServerBundle.ts | 2 +- .../build/patches/plugins/dynamic-requires.ts | 2 +- .../build/patches/plugins/instrumentation.ts | 2 +- .../build/patches/plugins/load-manifest.ts | 2 +- .../cli/build/patches/plugins/next-server.ts | 2 +- .../cli/build/patches/plugins/route-module.ts | 2 +- .../patches/plugins/wrangler-external.ts | 2 +- .../cli/build/utils/create-config-files.ts | 24 +- .../utils/extract-project-env-vars.spec.ts | 81 ------ .../cloudflare/src/cli/build/utils/files.ts | 37 --- .../cloudflare/src/cli/build/utils/index.ts | 7 - .../build/utils/needs-experimental-react.ts | 4 - packages/cloudflare/src/cli/commands/build.ts | 6 +- .../cloudflare/src/cli/commands/deploy.ts | 20 +- .../cloudflare/src/cli/commands/helpers.ts | 105 ------- .../cloudflare/src/cli/commands/migrate.ts | 27 +- .../src/cli/commands/populate-cache.spec.ts | 10 +- .../src/cli/commands/populate-cache.ts | 35 ++- .../cloudflare/src/cli/commands/preview.ts | 17 +- .../src/cli/commands/skew-protection.ts | 2 +- .../cloudflare/src/cli/commands/upload.ts | 16 +- .../src/cli/commands/utils/files.ts | 26 ++ .../src/cli/commands/utils/helpers.ts | 60 ++++ .../cli/{ => commands}/utils/run-wrangler.ts | 70 ++--- .../src/cli/commands/{ => utils}/utils.ts | 89 +----- .../cloudflare/src/cli/project-options.ts | 2 +- .../src/cli/utils/ask-account-selection.ts | 27 ++ .../src/cli/utils/create-open-next-config.ts | 49 ++++ .../src/cli/utils/create-wrangler-config.ts | 262 ++++++++++++++++++ .../utils/extract-project-env-vars.ts | 16 -- .../src/cli/utils/needs-experimental-react.ts | 15 + .../src/cli/utils/nextjs-support.ts | 16 ++ .../cli/{build => }/utils/normalize-path.ts | 0 .../src/cli/utils/open-next-config.ts | 34 --- .../src/cli/utils/wrangler-config.ts | 83 ------ packages/cloudflare/templates/wrangler.jsonc | 2 +- pnpm-lock.yaml | 28 ++ 42 files changed, 634 insertions(+), 567 deletions(-) create mode 100644 .changeset/port-pr-1133.md delete mode 100644 packages/cloudflare/src/cli/build/utils/extract-project-env-vars.spec.ts delete mode 100644 packages/cloudflare/src/cli/build/utils/files.ts delete mode 100644 packages/cloudflare/src/cli/build/utils/index.ts delete mode 100644 packages/cloudflare/src/cli/commands/helpers.ts create mode 100644 packages/cloudflare/src/cli/commands/utils/files.ts create mode 100644 packages/cloudflare/src/cli/commands/utils/helpers.ts rename packages/cloudflare/src/cli/{ => commands}/utils/run-wrangler.ts (52%) rename packages/cloudflare/src/cli/commands/{ => utils}/utils.ts (55%) create mode 100644 packages/cloudflare/src/cli/utils/ask-account-selection.ts create mode 100644 packages/cloudflare/src/cli/utils/create-open-next-config.ts create mode 100644 packages/cloudflare/src/cli/utils/create-wrangler-config.ts rename packages/cloudflare/src/cli/{build => }/utils/extract-project-env-vars.ts (56%) create mode 100644 packages/cloudflare/src/cli/utils/needs-experimental-react.ts create mode 100644 packages/cloudflare/src/cli/utils/nextjs-support.ts rename packages/cloudflare/src/cli/{build => }/utils/normalize-path.ts (100%) delete mode 100644 packages/cloudflare/src/cli/utils/open-next-config.ts delete mode 100644 packages/cloudflare/src/cli/utils/wrangler-config.ts diff --git a/.changeset/port-pr-1133.md b/.changeset/port-pr-1133.md new file mode 100644 index 00000000..2f861e68 --- /dev/null +++ b/.changeset/port-pr-1133.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1133 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1133 diff --git a/packages/cloudflare/package.json b/packages/cloudflare/package.json index fe7fc8b1..c54643ef 100644 --- a/packages/cloudflare/package.json +++ b/packages/cloudflare/package.json @@ -54,6 +54,7 @@ "@dotenvx/dotenvx": "catalog:", "@opennextjs/aws": "workspace:*", "cloudflare": "^4.4.1", + "comment-json": "^4.5.1", "enquirer": "^2.4.1", "glob": "catalog:", "ts-tqdm": "^0.8.6", @@ -62,6 +63,7 @@ "devDependencies": { "@cloudflare/workers-types": "catalog:", "@tsconfig/strictest": "catalog:", + "@types/comment-json": "^2.4.7", "@types/mock-fs": "catalog:", "@types/node": "catalog:", "@types/picomatch": "^4.0.0", diff --git a/packages/cloudflare/src/cli/build/build.ts b/packages/cloudflare/src/cli/build/build.ts index 0ca82267..09f1a57d 100644 --- a/packages/cloudflare/src/cli/build/build.ts +++ b/packages/cloudflare/src/cli/build/build.ts @@ -9,8 +9,8 @@ import logger from "@opennextjs/aws/logger.js"; import type { Unstable_Config } from "wrangler"; import { OpenNextConfig } from "../../api/config.js"; -import { ensureNextjsVersionSupported } from "../commands/utils.js"; import type { ProjectOptions } from "../project-options.js"; +import { ensureNextjsVersionSupported } from "../utils/nextjs-support.js"; import { bundleServer } from "./bundle-server.js"; import { compileCacheAssetsManifestSqlFile } from "./open-next/compile-cache-assets-manifest.js"; diff --git a/packages/cloudflare/src/cli/build/bundle-server.ts b/packages/cloudflare/src/cli/build/bundle-server.ts index 02810f17..7aee1a66 100644 --- a/packages/cloudflare/src/cli/build/bundle-server.ts +++ b/packages/cloudflare/src/cli/build/bundle-server.ts @@ -10,6 +10,7 @@ import { build, type Plugin } from "esbuild"; import { getOpenNextConfig } from "../../api/config.js"; import type { ProjectOptions } from "../project-options.js"; +import { normalizePath } from "../utils/normalize-path.js"; import { patchVercelOgLibrary } from "./patches/ast/patch-vercel-og-library.js"; import { patchWebpackRuntime } from "./patches/ast/webpack-runtime.js"; @@ -27,7 +28,8 @@ import { fixRequire } from "./patches/plugins/require.js"; import { patchRouteModules } from "./patches/plugins/route-module.js"; import { shimReact } from "./patches/plugins/shim-react.js"; import { setWranglerExternal } from "./patches/plugins/wrangler-external.js"; -import { copyPackageCliFiles, needsExperimentalReact, normalizePath } from "./utils/index.js"; +import { copyPackageCliFiles } from "./utils/copy-package-cli-files.js"; +import { needsExperimentalReact } from "./utils/needs-experimental-react.js"; /** The dist directory of the Cloudflare adapter package */ const packageDistDir = path.join(path.dirname(fileURLToPath(import.meta.url)), "../.."); diff --git a/packages/cloudflare/src/cli/build/open-next/compile-env-files.ts b/packages/cloudflare/src/cli/build/open-next/compile-env-files.ts index 63204b0c..9da91d3e 100644 --- a/packages/cloudflare/src/cli/build/open-next/compile-env-files.ts +++ b/packages/cloudflare/src/cli/build/open-next/compile-env-files.ts @@ -3,7 +3,7 @@ import path from "node:path"; import { BuildOptions } from "@opennextjs/aws/build/helper.js"; -import { extractProjectEnvVars } from "../utils/index.js"; +import { extractProjectEnvVars } from "../../utils/extract-project-env-vars.js"; /** * Compiles the values extracted from the project's env files to the output directory for use in the worker. diff --git a/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts b/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts index 2f5ad3b0..9274b996 100644 --- a/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts +++ b/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts @@ -27,10 +27,10 @@ import { getCrossPlatformPathRegex } from "@opennextjs/aws/utils/regex.js"; import type { Plugin } from "esbuild"; import type { BuildCompleteCtx } from "../../adapter.js"; +import { normalizePath } from "../../utils/normalize-path.js"; import { patchResRevalidate } from "../patches/plugins/res-revalidate.js"; import { patchTurbopackRuntime } from "../patches/plugins/turbopack.js"; import { patchUseCacheIO } from "../patches/plugins/use-cache.js"; -import { normalizePath } from "../utils/index.js"; interface CodeCustomization { // These patches are meant to apply on user and next generated code diff --git a/packages/cloudflare/src/cli/build/patches/plugins/dynamic-requires.ts b/packages/cloudflare/src/cli/build/patches/plugins/dynamic-requires.ts index 116cb010..f4e80b0f 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/dynamic-requires.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/dynamic-requires.ts @@ -6,7 +6,7 @@ import { patchCode, type RuleConfig } from "@opennextjs/aws/build/patch/astCodeP import type { ContentUpdater, Plugin } from "@opennextjs/aws/plugins/content-updater.js"; import { getCrossPlatformPathRegex } from "@opennextjs/aws/utils/regex.js"; -import { normalizePath } from "../../utils/normalize-path.js"; +import { normalizePath } from "../../../utils/normalize-path.js"; async function getPagesManifests(serverDir: string): Promise { try { diff --git a/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.ts b/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.ts index 2bfc1f77..3796699f 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.ts @@ -6,7 +6,7 @@ import { patchCode } from "@opennextjs/aws/build/patch/astCodePatcher.js"; import type { ContentUpdater, Plugin } from "@opennextjs/aws/plugins/content-updater.js"; import { getCrossPlatformPathRegex } from "@opennextjs/aws/utils/regex.js"; -import { normalizePath } from "../../utils/normalize-path.js"; +import { normalizePath } from "../../../utils/normalize-path.js"; export function patchInstrumentation(updater: ContentUpdater, buildOpts: BuildOptions): Plugin { const builtInstrumentationPath = getBuiltInstrumentationPath(buildOpts); diff --git a/packages/cloudflare/src/cli/build/patches/plugins/load-manifest.ts b/packages/cloudflare/src/cli/build/patches/plugins/load-manifest.ts index 5c548b24..347288d0 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/load-manifest.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/load-manifest.ts @@ -13,7 +13,7 @@ import type { ContentUpdater, Plugin } from "@opennextjs/aws/plugins/content-upd import { getCrossPlatformPathRegex } from "@opennextjs/aws/utils/regex.js"; import { glob } from "glob"; -import { normalizePath } from "../../utils/normalize-path.js"; +import { normalizePath } from "../../../utils/normalize-path.js"; export function inlineLoadManifest(updater: ContentUpdater, buildOpts: BuildOptions): Plugin { return updater.updateContent("inline-load-manifest", [ diff --git a/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts b/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts index 5b4ff247..6bac7c11 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts @@ -14,7 +14,7 @@ import { patchCode } from "@opennextjs/aws/build/patch/astCodePatcher.js"; import type { ContentUpdater, Plugin } from "@opennextjs/aws/plugins/content-updater.js"; import { getCrossPlatformPathRegex } from "@opennextjs/aws/utils/regex.js"; -import { normalizePath } from "../../utils/index.js"; +import { normalizePath } from "../../../utils/normalize-path.js"; export function patchNextServer(updater: ContentUpdater, buildOpts: BuildOptions): Plugin { return updater.updateContent("next-server", [ diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts index 59957c74..702fa5e0 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -13,7 +13,7 @@ import { patchCode } from "@opennextjs/aws/build/patch/astCodePatcher.js"; import type { ContentUpdater, Plugin } from "@opennextjs/aws/plugins/content-updater.js"; import { getCrossPlatformPathRegex } from "@opennextjs/aws/utils/regex.js"; -import { normalizePath } from "../../utils/index.js"; +import { normalizePath } from "../../../utils/normalize-path.js"; export function patchRouteModules(updater: ContentUpdater, buildOpts: BuildOptions): Plugin { return updater.updateContent("route-module", [ diff --git a/packages/cloudflare/src/cli/build/patches/plugins/wrangler-external.ts b/packages/cloudflare/src/cli/build/patches/plugins/wrangler-external.ts index 74b0405c..ce7a3429 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/wrangler-external.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/wrangler-external.ts @@ -18,7 +18,7 @@ import { dirname, resolve } from "node:path"; import type { PluginBuild } from "esbuild"; -import { normalizePath } from "../../utils/normalize-path.js"; +import { normalizePath } from "../../../utils/normalize-path.js"; export function setWranglerExternal() { return { diff --git a/packages/cloudflare/src/cli/build/utils/create-config-files.ts b/packages/cloudflare/src/cli/build/utils/create-config-files.ts index b6e49355..8f0d6a79 100644 --- a/packages/cloudflare/src/cli/build/utils/create-config-files.ts +++ b/packages/cloudflare/src/cli/build/utils/create-config-files.ts @@ -1,16 +1,8 @@ import type { ProjectOptions } from "../../project-options.js"; import { askConfirmation } from "../../utils/ask-confirmation.js"; -import { createOpenNextConfigFile, findOpenNextConfig } from "../../utils/open-next-config.js"; -import { createWranglerConfigFile, findWranglerConfig } from "../../utils/wrangler-config.js"; - -/** - * Creates a `wrangler.jsonc` file for the user if a wrangler config file doesn't already exist, - * but only after asking for the user's confirmation. - * - * If the user refuses a warning is shown (which offers ways to opt out of this check to the user). - * - * @param projectOpts The options for the project - */ +import { createOpenNextConfigFile, findOpenNextConfig } from "../../utils/create-open-next-config.js"; +import { createWranglerConfigFile, findWranglerConfig } from "../../utils/create-wrangler-config.js"; + export async function createWranglerConfigIfNonExistent(projectOpts: ProjectOptions): Promise { const wranglerConfigFileExists = Boolean(findWranglerConfig(projectOpts.sourceDir)); if (wranglerConfigFileExists) { @@ -33,14 +25,6 @@ export async function createWranglerConfigIfNonExistent(projectOpts: ProjectOpti await createWranglerConfigFile(projectOpts.sourceDir); } -/** - * Creates a `open-next.config.ts` file for the user if it doesn't exist, but only after asking for the user's confirmation. - * - * If the user refuses an error is thrown (since the file is mandatory). - * - * @param sourceDir The source directory for the project - * @return The path to the created source file - */ export async function createOpenNextConfigIfNotExistent(sourceDir: string): Promise { const openNextConfigPath = findOpenNextConfig(sourceDir); if (!openNextConfigPath) { @@ -52,7 +36,7 @@ export async function createOpenNextConfigIfNotExistent(sourceDir: string): Prom throw new Error("The `open-next.config.ts` file is required, aborting!"); } - return createOpenNextConfigFile(sourceDir); + return createOpenNextConfigFile(sourceDir, { cache: false }); } return openNextConfigPath; diff --git a/packages/cloudflare/src/cli/build/utils/extract-project-env-vars.spec.ts b/packages/cloudflare/src/cli/build/utils/extract-project-env-vars.spec.ts deleted file mode 100644 index 0b65b743..00000000 --- a/packages/cloudflare/src/cli/build/utils/extract-project-env-vars.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { appendFileSync, writeFileSync } from "node:fs"; - -import { BuildOptions } from "@opennextjs/aws/build/helper.js"; -import mockFs from "mock-fs"; -import { afterEach, beforeEach, describe, expect, it } from "vitest"; - -import { extractProjectEnvVars } from "./extract-project-env-vars.js"; - -const options = { monorepoRoot: "", appPath: "" } as BuildOptions; - -describe("extractProjectEnvVars", () => { - beforeEach(() => { - mockFs({ - ".env": "ENV_VAR=value", - ".env.local": "ENV_LOCAL_VAR=value", - ".env.test": "ENV_TEST_VAR=value", - ".env.test.local": "ENV_TEST_LOCAL_VAR=value", - ".env.development": "ENV_DEV_VAR=value", - ".env.development.local": "ENV_DEV_LOCAL_VAR=value", - ".env.production": "ENV_PROD_VAR=value", - ".env.production.local": "ENV_PROD_LOCAL_VAR=value", - }); - }); - - afterEach(() => mockFs.restore()); - - it("should extract production env vars", () => { - const result = extractProjectEnvVars("production", options); - expect(result).toEqual({ - ENV_LOCAL_VAR: "value", - ENV_PROD_LOCAL_VAR: "value", - ENV_PROD_VAR: "value", - ENV_VAR: "value", - }); - }); - - it("should extract development env vars", () => { - writeFileSync(".dev.vars", 'NEXTJS_ENV = "development"'); - - const result = extractProjectEnvVars("development", options); - expect(result).toEqual({ - ENV_LOCAL_VAR: "value", - ENV_DEV_LOCAL_VAR: "value", - ENV_DEV_VAR: "value", - ENV_VAR: "value", - }); - }); - - it("should override env vars with those in a local file", () => { - writeFileSync(".env.production.local", "ENV_PROD_VAR=overridden"); - - const result = extractProjectEnvVars("production", options); - expect(result).toEqual({ - ENV_LOCAL_VAR: "value", - ENV_PROD_VAR: "overridden", - ENV_VAR: "value", - }); - }); - - it("should support referencing variables", () => { - appendFileSync(".env.production.local", "\nENV_PROD_LOCAL_VAR_REF=$ENV_PROD_LOCAL_VAR"); - - const result = extractProjectEnvVars("production", options); - expect(result).toEqual({ - ENV_LOCAL_VAR: "value", - ENV_PROD_LOCAL_VAR: "value", - ENV_PROD_LOCAL_VAR_REF: "value", - ENV_PROD_VAR: "value", - ENV_VAR: "value", - }); - }); - - it("should exclude .env.local files when extracting test env vars", () => { - const result = extractProjectEnvVars("test", options); - expect(result).toEqual({ - ENV_TEST_LOCAL_VAR: "value", - ENV_TEST_VAR: "value", - ENV_VAR: "value", - }); - }); -}); diff --git a/packages/cloudflare/src/cli/build/utils/files.ts b/packages/cloudflare/src/cli/build/utils/files.ts deleted file mode 100644 index 9a64b789..00000000 --- a/packages/cloudflare/src/cli/build/utils/files.ts +++ /dev/null @@ -1,37 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; - -/** - * Appends text to a file - * - * When the file does not exists, it is always created with the text content. - * When the file exists, the text is appended only when the predicate return `true`. - * - * @param filepath The path to the file. - * @param text The text to append to the file. - * @param opts.appendIf A function that receives the current file content and returns `true` if the text should be appended to it, the condition is skipped when the file is being created. Defaults to a function that always returns true. - * @param opts.appendPrefix A string that will be inserted between the pre-existing file's content and the new text in case the file already existed. Defaults to an empty string. - */ -export function conditionalAppendFileSync( - filepath: string, - text: string, - { - appendIf = () => true, - appendPrefix = "", - }: { - appendIf?: (fileContent: string) => boolean; - appendPrefix?: string; - } = {} -): void { - const fileExists = fs.existsSync(filepath); - const maybeFileContent = fileExists ? fs.readFileSync(filepath, "utf8") : ""; - - if (!fileExists) { - const dir = path.dirname(filepath); - fs.mkdirSync(dir, { recursive: true }); - } - - if (!fileExists || appendIf(maybeFileContent)) { - fs.appendFileSync(filepath, `${maybeFileContent.length > 0 ? appendPrefix : ""}${text}`); - } -} diff --git a/packages/cloudflare/src/cli/build/utils/index.ts b/packages/cloudflare/src/cli/build/utils/index.ts deleted file mode 100644 index 515c19a9..00000000 --- a/packages/cloudflare/src/cli/build/utils/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./copy-package-cli-files.js"; -export * from "./create-config-files.js"; -export * from "./ensure-cf-config.js"; -export * from "./extract-project-env-vars.js"; -export * from "./files.js"; -export * from "./needs-experimental-react.js"; -export * from "./normalize-path.js"; diff --git a/packages/cloudflare/src/cli/build/utils/needs-experimental-react.ts b/packages/cloudflare/src/cli/build/utils/needs-experimental-react.ts index 84406ed2..dad47860 100644 --- a/packages/cloudflare/src/cli/build/utils/needs-experimental-react.ts +++ b/packages/cloudflare/src/cli/build/utils/needs-experimental-react.ts @@ -1,8 +1,5 @@ import type { NextConfig } from "@opennextjs/aws/types/next-types.js"; -// Not sure if this should be upstreamed to aws -// Adding more stuff there make typing incorrect actually, these properties are never undefined as long as it is the right version of next -// Ideally we'd have different `NextConfig` types for different versions of next interface ExtendedNextConfig extends NextConfig { experimental: { ppr?: boolean; @@ -12,7 +9,6 @@ interface ExtendedNextConfig extends NextConfig { }; } -// Copied from https://github.com/vercel/next.js/blob/4518bc91641a0fd938664b781e12ae7c145f3396/packages/next/src/lib/needs-experimental-react.ts#L3-L6 export function needsExperimentalReact(nextConfig: ExtendedNextConfig) { const { ppr, taint, viewTransition } = nextConfig.experimental || {}; return Boolean(ppr || taint || viewTransition); diff --git a/packages/cloudflare/src/cli/commands/build.ts b/packages/cloudflare/src/cli/commands/build.ts index 560f886d..4225475b 100644 --- a/packages/cloudflare/src/cli/commands/build.ts +++ b/packages/cloudflare/src/cli/commands/build.ts @@ -3,9 +3,9 @@ import { createRequire } from "node:module"; import type yargs from "yargs"; import { build as buildImpl } from "../build/build.js"; -import { createWranglerConfigIfNonExistent } from "../build/utils/index.js"; +import { createWranglerConfigIfNonExistent } from "../build/utils/create-config-files.js"; -import type { WithWranglerArgs } from "./utils.js"; +import type { WithWranglerArgs } from "./utils/utils.js"; import { compileConfig, getNormalizedOptions, @@ -14,7 +14,7 @@ import { readWranglerConfig, withWranglerOptions, withWranglerPassthroughArgs, -} from "./utils.js"; +} from "./utils/utils.js"; /** * Implementation of the `opennextjs-cloudflare build` command. diff --git a/packages/cloudflare/src/cli/commands/deploy.ts b/packages/cloudflare/src/cli/commands/deploy.ts index db0080a7..0ca121b6 100644 --- a/packages/cloudflare/src/cli/commands/deploy.ts +++ b/packages/cloudflare/src/cli/commands/deploy.ts @@ -1,19 +1,20 @@ +import logger from "@opennextjs/aws/logger.js"; import type yargs from "yargs"; import { DEPLOYMENT_MAPPING_ENV_NAME } from "../templates/skew-protection.js"; -import { runWrangler } from "../utils/run-wrangler.js"; -import { getEnvFromPlatformProxy, quoteShellMeta } from "./helpers.js"; import { populateCache, withPopulateCacheOptions } from "./populate-cache.js"; import { getDeploymentMapping } from "./skew-protection.js"; -import type { WithWranglerArgs } from "./utils.js"; +import { getEnvFromPlatformProxy, quoteShellMeta } from "./utils/helpers.js"; +import { runWrangler } from "./utils/run-wrangler.js"; +import type { WithWranglerArgs } from "./utils/utils.js"; import { getNormalizedOptions, printHeaders, readWranglerConfig, retrieveCompiledConfig, withWranglerPassthroughArgs, -} from "./utils.js"; +} from "./utils/utils.js"; /** * Implementation of the `opennextjs-cloudflare deploy` command. @@ -46,7 +47,7 @@ export async function deployCommand(args: WithWranglerArgs<{ cacheChunkSize?: nu const deploymentMapping = await getDeploymentMapping(buildOpts, config, envVars); - runWrangler( + const result = runWrangler( buildOpts, [ "deploy", @@ -58,14 +59,15 @@ export async function deployCommand(args: WithWranglerArgs<{ cacheChunkSize?: nu { logging: "all", env: { - // If we are running the deploy command we set this OPEN_NEXT_DEPLOY environment variable - // to let `wrangler deploy` know that it is being run from open-next. We do this because - // otherwise `wrangler deploy` run in an open-next project would call - // `opennextjs-cloudflare deploy` (thus causing an unwanted recursion). OPEN_NEXT_DEPLOY: "true", }, } ); + + if (!result.success) { + logger.error(`Wrangler deploy command failed${result.stderr ? `:\n${result.stderr}` : ""}`); + process.exit(1); + } } /** diff --git a/packages/cloudflare/src/cli/commands/helpers.ts b/packages/cloudflare/src/cli/commands/helpers.ts deleted file mode 100644 index 85b6a0ec..00000000 --- a/packages/cloudflare/src/cli/commands/helpers.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { type BuildOptions } from "@opennextjs/aws/build/helper.js"; -import { getPlatformProxy, type GetPlatformProxyOptions } from "wrangler"; - -import { extractProjectEnvVars } from "../build/utils/extract-project-env-vars.js"; - -export type WorkerEnvVar = Record; - -/** - * Returns the env vars to use by the CLI. - * - * The environments variables are returned from a combination of `process.env`, wrangler config, and `.env*` files. - * - * Recommended usage on CI: - * - * - Add you secrets to `process.env` (i.e. `CF_ACCOUNT_ID`) - * - Add public values to the wrangler config `wrangler.jsonc` (i.e. `R2_CACHE_PREFIX_ENV_NAME`) - * - * Note: `.dev.vars*` and `.env*` should not be checked in. - * - * Recommended usage for local dev: - * - * - Add you secrets to either a `.dev.vars*` or `.env*` file (i.e. `CF_ACCOUNT_ID`) - * - Add public values to the wrangler config `wrangler.jsonc` (i.e. `R2_CACHE_PREFIX_ENV_NAME`) - * - * Note: `.env*` files are also used by `next dev` while `.dev.var*` files are only loaded by `wrangler`. - * - * Loading details: - * - * 1. The variables are first initialized from `process.env` - * 2. They are then augmented/replaced with variables from the wrangler config (`wrangler.jsonc` and `.dev.vars*`) - * 3. They are then augmented with variables from `.env*` files (existing values are not replaced). - * - * @param options Options to pass to `getPlatformProxy`, i.e. to set the environment - * @param buildOpts Open Next build options - * @returns the env vars - */ -export async function getEnvFromPlatformProxy(options: GetPlatformProxyOptions, buildOpts: BuildOptions) { - // 1. Start from `process.env` - const envVars = process.env; - - // 2. Apply vars from workers `env` - const proxy = await getPlatformProxy({ - ...options, - // Next.js uses a different mechanism to load `.env*` files from wrangler. - // We prevent wrangler for loading the files and handle that in `getEnvFromPlatformProxy`. - envFiles: [], - }); - - Object.entries(proxy.env).forEach(([key, value]) => { - if (typeof value === "string") { - // filter out bindings by only considering string values - envVars[key as keyof CloudflareEnv] = value; - } - }); - - await proxy.dispose(); - - // 3. Apply new vars from `.env*` files - let mode: "production" | "development" | "test" = "production"; - if (envVars.NEXTJS_ENV === "development") { - mode = "development"; - } else if (envVars.NEXTJS_ENV === "test") { - mode = "test"; - } - - const dotEnvVars = extractProjectEnvVars(mode, buildOpts); - - for (const varName in dotEnvVars) { - envVars[varName] ??= dotEnvVars[varName]; - } - - return envVars as unknown as WorkerEnvVar; -} - -/** - * Escape shell metacharacters. - * - * When `spawnSync` is invoked with `shell: true`, metacharacters need to be escaped. - * - * Based on https://github.com/ljharb/shell-quote/blob/main/quote.js - * - * @param arg - * @returns escaped arg - */ -export function quoteShellMeta(arg: string) { - if (process.platform === "win32") { - if (arg.length === 0) { - return '""'; - } - const needsEscaping = /[&|<>^()%!"]/; - const needsQuotes = /\s/.test(arg) || needsEscaping.test(arg); - let escaped = arg.replace(/"/g, '""'); - if (/[&|<>^()%!]/.test(arg)) { - escaped = escaped.replace(/[&|<>^()%!]/g, "^$&"); - } - return needsQuotes ? `"${escaped}"` : escaped; - } - if (/["\s]/.test(arg) && !/'/.test(arg)) { - return `'${arg.replace(/(['\\])/g, "\\$1")}'`; - } - if (/["'\s]/.test(arg)) { - return `"${arg.replace(/(["\\$`!])/g, "\\$1")}"`; - } - return arg.replace(/([A-Za-z]:)?([#!"$&'()*,:;<=>?@[\\\]^`{|}])/g, "$1\\$2"); -} diff --git a/packages/cloudflare/src/cli/commands/migrate.ts b/packages/cloudflare/src/cli/commands/migrate.ts index c8ca352a..40e9110c 100644 --- a/packages/cloudflare/src/cli/commands/migrate.ts +++ b/packages/cloudflare/src/cli/commands/migrate.ts @@ -12,12 +12,13 @@ import { import logger from "@opennextjs/aws/logger.js"; import type yargs from "yargs"; -import { conditionalAppendFileSync } from "../build/utils/files.js"; import { askConfirmation } from "../utils/ask-confirmation.js"; -import { createOpenNextConfigFile, findOpenNextConfig } from "../utils/open-next-config.js"; -import { createWranglerConfigFile, findWranglerConfig } from "../utils/wrangler-config.js"; +import { createOpenNextConfigFile, findOpenNextConfig } from "../utils/create-open-next-config.js"; +import { createWranglerConfigFile, findWranglerConfig } from "../utils/create-wrangler-config.js"; +import { ensureNextjsVersionSupported } from "../utils/nextjs-support.js"; -import { ensureNextjsVersionSupported, printHeaders } from "./utils.js"; +import { conditionalAppendFileSync } from "./utils/files.js"; +import { printHeaders } from "./utils/utils.js"; /** * Implementation of the `opennextjs-cloudflare migrate` command. @@ -79,10 +80,17 @@ async function migrateCommand(args: { forceInstall: boolean }): Promise { } printStepTitle("Creating wrangler.jsonc"); - await createWranglerConfigFile("./"); + const { cachingEnabled } = await createWranglerConfigFile("./"); + + if (!cachingEnabled) { + logger.warn( + `Failed to set up cache for your project.\n` + + `After the migration completes, please manually setup cache in wrangler.jsonc and open-next.config.ts files (for more details see: https://opennext.js.org/cloudflare/caching).\n` + ); + } printStepTitle("Creating open-next.config.ts"); - await createOpenNextConfigFile("./"); + createOpenNextConfigFile("./", { cache: cachingEnabled }); const devVarsExists = fs.existsSync(".dev.vars"); printStepTitle(`${devVarsExists ? "Updating" : "Creating"} .dev.vars file`); @@ -200,7 +208,10 @@ async function migrateCommand(args: { forceInstall: boolean }): Promise { "🎉 OpenNext Cloudflare adapter complete!\n" + "\nNext steps:\n" + `- Run: "${packageManager.run} preview" to build and preview your Cloudflare application locally\n` + - `- Run: "${packageManager.run} deploy" to deploy your application to Cloudflare Workers\n` + `- Run: "${packageManager.run} deploy" to deploy your application to Cloudflare Workers\n` + + (cachingEnabled + ? "" + : `- ⚠️ Setup cache, see https://opennext.js.org/cloudflare/caching for more details\n`) ); } @@ -212,7 +223,7 @@ interface PackageManager { } const packageManagers = { - pnpm: { name: "pnpm", install: "pnpm add", installDev: "pnpm add -D", run: "pnpm" }, + pnpm: { name: "pnpm", install: "pnpm add", installDev: "pnpm add -D", run: "pnpm run" }, npm: { name: "npm", install: "npm install", installDev: "npm install --save-dev", run: "npm run" }, bun: { name: "bun", install: "bun add", installDev: "bun add -D", run: "bun" }, yarn: { name: "yarn", install: "yarn add", installDev: "yarn add -D", run: "yarn" }, diff --git a/packages/cloudflare/src/cli/commands/populate-cache.spec.ts b/packages/cloudflare/src/cli/commands/populate-cache.spec.ts index 55f72018..849f7eae 100644 --- a/packages/cloudflare/src/cli/commands/populate-cache.spec.ts +++ b/packages/cloudflare/src/cli/commands/populate-cache.spec.ts @@ -69,11 +69,11 @@ describe("getCacheAssets", () => { }); }); -vi.mock("../utils/run-wrangler.js", () => ({ - runWrangler: vi.fn(), +vi.mock("./utils/run-wrangler.js", () => ({ + runWrangler: vi.fn(() => ({ success: true, stdout: "", stderr: "" })), })); -vi.mock("./helpers.js", () => ({ +vi.mock("./utils/helpers.js", () => ({ getEnvFromPlatformProxy: vi.fn(async () => ({})), quoteShellMeta: vi.fn((s) => s), })); @@ -103,7 +103,7 @@ describe("populateCache", () => { }); test(target, async () => { - const { runWrangler } = await import("../utils/run-wrangler.js"); + const { runWrangler } = await import("./utils/run-wrangler.js"); setupMockFileSystem(); vi.mocked(runWrangler).mockClear(); @@ -139,7 +139,7 @@ describe("populateCache", () => { }); test(`${target} using jurisdiction`, async () => { - const { runWrangler } = await import("../utils/run-wrangler.js"); + const { runWrangler } = await import("./utils/run-wrangler.js"); setupMockFileSystem(); vi.mocked(runWrangler).mockClear(); diff --git a/packages/cloudflare/src/cli/commands/populate-cache.ts b/packages/cloudflare/src/cli/commands/populate-cache.ts index d87e084c..496b6e5c 100644 --- a/packages/cloudflare/src/cli/commands/populate-cache.ts +++ b/packages/cloudflare/src/cli/commands/populate-cache.ts @@ -36,12 +36,12 @@ import { BINDING_NAME as D1_TAG_BINDING_NAME, NAME as D1_TAG_NAME, } from "../../api/overrides/tag-cache/d1-next-tag-cache.js"; -import { normalizePath } from "../build/utils/normalize-path.js"; -import type { WranglerTarget } from "../utils/run-wrangler.js"; -import { runWrangler } from "../utils/run-wrangler.js"; +import { normalizePath } from "../utils/normalize-path.js"; -import { getEnvFromPlatformProxy, quoteShellMeta, type WorkerEnvVar } from "./helpers.js"; -import type { WithWranglerArgs } from "./utils.js"; +import { getEnvFromPlatformProxy, quoteShellMeta, type WorkerEnvVar } from "./utils/helpers.js"; +import type { WranglerTarget } from "./utils/run-wrangler.js"; +import { runWrangler } from "./utils/run-wrangler.js"; +import type { WithWranglerArgs } from "./utils/utils.js"; import { getNormalizedOptions, printHeaders, @@ -49,7 +49,7 @@ import { retrieveCompiledConfig, withWranglerOptions, withWranglerPassthroughArgs, -} from "./utils.js"; +} from "./utils/utils.js"; /** * Implementation of the `opennextjs-cloudflare populateCache` command. @@ -248,7 +248,7 @@ async function populateR2IncrementalCache( const concurrency = Math.max(1, populateCacheOptions.cacheChunkSize ?? 50); const jurisdiction = binding.jurisdiction ? `--jurisdiction ${binding.jurisdiction}` : ""; - runWrangler( + const result = runWrangler( buildOpts, [ "r2 bulk put", @@ -260,8 +260,6 @@ async function populateR2IncrementalCache( { target: populateCacheOptions.target, configPath: populateCacheOptions.wranglerConfigPath, - // R2 does not support the environment flag and results in the following error: - // Incorrect type for the 'cacheExpiry' field on 'HttpMetadata': the provided value is not of type 'date'. environment: undefined, logging: "error", } @@ -269,6 +267,11 @@ async function populateR2IncrementalCache( fs.rmSync(listFile, { force: true }); + if (!result.success) { + logger.error(`Wrangler r2 bulk put command failed${result.stderr ? `:\n${result.stderr}` : ""}`); + process.exit(1); + } + logger.info(`Successfully populated cache with ${assets.length} assets`); } @@ -314,7 +317,7 @@ async function populateKVIncrementalCache( fs.writeFileSync(chunkPath, JSON.stringify(kvMapping)); - runWrangler( + const result = runWrangler( buildOpts, [ "kv bulk put", @@ -331,6 +334,11 @@ async function populateKVIncrementalCache( ); fs.rmSync(chunkPath, { force: true }); + + if (!result.success) { + logger.error(`Wrangler kv bulk put command failed${result.stderr ? `:\n${result.stderr}` : ""}`); + process.exit(1); + } } logger.info(`Successfully populated cache with ${assets.length} assets`); @@ -350,7 +358,7 @@ function populateD1TagCache( throw new Error(`No D1 binding ${JSON.stringify(D1_TAG_BINDING_NAME)} found!`); } - runWrangler( + const result = runWrangler( buildOpts, [ "d1 execute", @@ -366,6 +374,11 @@ function populateD1TagCache( } ); + if (!result.success) { + logger.error(`Wrangler d1 execute command failed${result.stderr ? `:\n${result.stderr}` : ""}`); + process.exit(1); + } + logger.info("\nSuccessfully created D1 table"); } diff --git a/packages/cloudflare/src/cli/commands/preview.ts b/packages/cloudflare/src/cli/commands/preview.ts index caefaf72..82502310 100644 --- a/packages/cloudflare/src/cli/commands/preview.ts +++ b/packages/cloudflare/src/cli/commands/preview.ts @@ -1,17 +1,17 @@ +import logger from "@opennextjs/aws/logger.js"; import type yargs from "yargs"; -import { runWrangler } from "../utils/run-wrangler.js"; - -import { getEnvFromPlatformProxy } from "./helpers.js"; import { populateCache, withPopulateCacheOptions } from "./populate-cache.js"; -import type { WithWranglerArgs } from "./utils.js"; +import { getEnvFromPlatformProxy } from "./utils/helpers.js"; +import { runWrangler } from "./utils/run-wrangler.js"; +import type { WithWranglerArgs } from "./utils/utils.js"; import { getNormalizedOptions, printHeaders, readWranglerConfig, retrieveCompiledConfig, withWranglerPassthroughArgs, -} from "./utils.js"; +} from "./utils/utils.js"; /** * Implementation of the `opennextjs-cloudflare preview` command. @@ -43,7 +43,12 @@ export async function previewCommand( envVars ); - runWrangler(buildOpts, ["dev", ...args.wranglerArgs], { logging: "all" }); + const result = runWrangler(buildOpts, ["dev", ...args.wranglerArgs], { logging: "all" }); + + if (!result.success) { + logger.error(`Wrangler dev command failed${result.stderr ? `:\n${result.stderr}` : ""}`); + process.exit(1); + } } /** diff --git a/packages/cloudflare/src/cli/commands/skew-protection.ts b/packages/cloudflare/src/cli/commands/skew-protection.ts index a671d0f8..914fcc66 100644 --- a/packages/cloudflare/src/cli/commands/skew-protection.ts +++ b/packages/cloudflare/src/cli/commands/skew-protection.ts @@ -33,7 +33,7 @@ import type { VersionGetResponse } from "cloudflare/resources/workers/scripts/ve import type { OpenNextConfig } from "../../api/index.js"; import { CURRENT_VERSION_ID, DEPLOYMENT_MAPPING_ENV_NAME } from "../templates/skew-protection.js"; -import type { WorkerEnvVar } from "./helpers.js"; +import type { WorkerEnvVar } from "./utils/helpers.js"; /** Maximum number of versions to list */ const MAX_NUMBER_OF_VERSIONS = 20; diff --git a/packages/cloudflare/src/cli/commands/upload.ts b/packages/cloudflare/src/cli/commands/upload.ts index 26c060bd..b94d2616 100644 --- a/packages/cloudflare/src/cli/commands/upload.ts +++ b/packages/cloudflare/src/cli/commands/upload.ts @@ -1,19 +1,20 @@ +import logger from "@opennextjs/aws/logger.js"; import type yargs from "yargs"; import { DEPLOYMENT_MAPPING_ENV_NAME } from "../templates/skew-protection.js"; -import { runWrangler } from "../utils/run-wrangler.js"; -import { getEnvFromPlatformProxy, quoteShellMeta } from "./helpers.js"; import { populateCache, withPopulateCacheOptions } from "./populate-cache.js"; import { getDeploymentMapping } from "./skew-protection.js"; -import type { WithWranglerArgs } from "./utils.js"; +import { getEnvFromPlatformProxy, quoteShellMeta } from "./utils/helpers.js"; +import { runWrangler } from "./utils/run-wrangler.js"; +import type { WithWranglerArgs } from "./utils/utils.js"; import { getNormalizedOptions, printHeaders, readWranglerConfig, retrieveCompiledConfig, withWranglerPassthroughArgs, -} from "./utils.js"; +} from "./utils/utils.js"; /** * Implementation of the `opennextjs-cloudflare upload` command. @@ -52,7 +53,7 @@ export async function uploadCommand(args: WithWranglerArgs<{ cacheChunkSize?: nu envVars ); - runWrangler( + const result = runWrangler( buildOpts, [ "versions upload", @@ -63,6 +64,11 @@ export async function uploadCommand(args: WithWranglerArgs<{ cacheChunkSize?: nu ], { logging: "all" } ); + + if (!result.success) { + logger.error(`Wrangler versions upload command failed${result.stderr ? `:\n${result.stderr}` : ""}`); + process.exit(1); + } } /** diff --git a/packages/cloudflare/src/cli/commands/utils/files.ts b/packages/cloudflare/src/cli/commands/utils/files.ts new file mode 100644 index 00000000..2ca92a0f --- /dev/null +++ b/packages/cloudflare/src/cli/commands/utils/files.ts @@ -0,0 +1,26 @@ +import fs from "node:fs"; +import path from "node:path"; + +export function conditionalAppendFileSync( + filepath: string, + text: string, + { + appendIf = () => true, + appendPrefix = "", + }: { + appendIf?: (fileContent: string) => boolean; + appendPrefix?: string; + } = {} +): void { + const fileExists = fs.existsSync(filepath); + const maybeFileContent = fileExists ? fs.readFileSync(filepath, "utf8") : ""; + + if (!fileExists) { + const dir = path.dirname(filepath); + fs.mkdirSync(dir, { recursive: true }); + } + + if (!fileExists || appendIf(maybeFileContent)) { + fs.appendFileSync(filepath, `${maybeFileContent.length > 0 ? appendPrefix : ""}${text}`); + } +} diff --git a/packages/cloudflare/src/cli/commands/utils/helpers.ts b/packages/cloudflare/src/cli/commands/utils/helpers.ts new file mode 100644 index 00000000..09e35a78 --- /dev/null +++ b/packages/cloudflare/src/cli/commands/utils/helpers.ts @@ -0,0 +1,60 @@ +import { type BuildOptions } from "@opennextjs/aws/build/helper.js"; +import { getPlatformProxy, type GetPlatformProxyOptions } from "wrangler"; + +import { extractProjectEnvVars } from "../../utils/extract-project-env-vars.js"; + +export type WorkerEnvVar = Record; + +export async function getEnvFromPlatformProxy(options: GetPlatformProxyOptions, buildOpts: BuildOptions) { + const envVars = process.env; + + const proxy = await getPlatformProxy({ + ...options, + envFiles: [], + }); + + Object.entries(proxy.env).forEach(([key, value]) => { + if (typeof value === "string") { + envVars[key as keyof CloudflareEnv] = value; + } + }); + + await proxy.dispose(); + + let mode: "production" | "development" | "test" = "production"; + if (envVars.NEXTJS_ENV === "development") { + mode = "development"; + } else if (envVars.NEXTJS_ENV === "test") { + mode = "test"; + } + + const dotEnvVars = extractProjectEnvVars(mode, buildOpts); + + for (const varName in dotEnvVars) { + envVars[varName] ??= dotEnvVars[varName]; + } + + return envVars as unknown as WorkerEnvVar; +} + +export function quoteShellMeta(arg: string) { + if (process.platform === "win32") { + if (arg.length === 0) { + return '""'; + } + const needsEscaping = /[&|<>^()%!"]/; + const needsQuotes = /\s/.test(arg) || needsEscaping.test(arg); + let escaped = arg.replace(/"/g, '""'); + if (/[&|<>^()%!]/.test(arg)) { + escaped = escaped.replace(/[&|<>^()%!]/g, "^$&"); + } + return needsQuotes ? `"${escaped}"` : escaped; + } + if (/["\s]/.test(arg) && !/'/.test(arg)) { + return `'${arg.replace(/(['\\])/g, "\\$1")}'`; + } + if (/["'\s]/.test(arg)) { + return `"${arg.replace(/(["\\$`!])/g, "\\$1")}"`; + } + return arg.replace(/([A-Za-z]:)?([#!"$&'()*,:;<=>?@[\\\]^`{|}])/g, "$1\\$2"); +} diff --git a/packages/cloudflare/src/cli/utils/run-wrangler.ts b/packages/cloudflare/src/cli/commands/utils/run-wrangler.ts similarity index 52% rename from packages/cloudflare/src/cli/utils/run-wrangler.ts rename to packages/cloudflare/src/cli/commands/utils/run-wrangler.ts index f6c07cdb..f062abf0 100644 --- a/packages/cloudflare/src/cli/utils/run-wrangler.ts +++ b/packages/cloudflare/src/cli/commands/utils/run-wrangler.ts @@ -2,29 +2,32 @@ import { spawnSync } from "node:child_process"; import { readFileSync } from "node:fs"; import path from "node:path"; -import type { BuildOptions } from "@opennextjs/aws/build/helper.js"; import { compareSemver } from "@opennextjs/aws/build/helper.js"; -import logger from "@opennextjs/aws/logger.js"; + +export type PackagerDetails = { + packager: "npm" | "pnpm" | "yarn" | "bun"; + monorepoRoot: string; +}; export type WranglerTarget = "local" | "remote"; +export type WranglerCommandResult = { + success: boolean; + stdout: string; + stderr: string; +}; + type WranglerOptions = { target?: WranglerTarget; environment?: string; configPath?: string; - logging?: "all" | "error"; + logging?: "all" | "error" | "none"; env?: Record; }; -/** - * Checks the package.json `packageManager` field to determine whether yarn modern is used. - * - * @param options Build options. - * @returns Whether yarn modern is used. - */ -function isYarnModern(options: BuildOptions) { +function isYarnModern(monorepoRoot: string) { const packageJson: { packageManager?: string } = JSON.parse( - readFileSync(path.join(options.monorepoRoot, "package.json"), "utf-8") + readFileSync(path.join(monorepoRoot, "package.json"), "utf8") ); if (!packageJson.packageManager?.startsWith("yarn")) return false; @@ -33,18 +36,8 @@ function isYarnModern(options: BuildOptions) { return version ? compareSemver(version, ">=", "4.0.0") : false; } -/** - * Prepends CLI flags with `--` so that certain package managers can pass args through to wrangler - * properly. - * - * npm and yarn classic require `--` to be used, while pnpm and bun require that it is not used. - * - * @param options Build options. - * @param args CLI args. - * @returns Arguments with a passthrough flag injected when needed. - */ -function injectPassthroughFlagForArgs(options: BuildOptions, args: string[]) { - if (options.packager !== "npm" && (options.packager !== "yarn" || isYarnModern(options))) { +function injectPassthroughFlagForArgs(options: PackagerDetails, args: string[]) { + if (options.packager !== "npm" && (options.packager !== "yarn" || isYarnModern(options.monorepoRoot))) { return args; } @@ -56,7 +49,12 @@ function injectPassthroughFlagForArgs(options: BuildOptions, args: string[]) { return args; } -export function runWrangler(options: BuildOptions, args: string[], wranglerOpts: WranglerOptions = {}) { +export function runWrangler( + options: PackagerDetails, + args: string[], + wranglerOpts: WranglerOptions = {} +): WranglerCommandResult { + const noLogs = wranglerOpts.logging === "none"; const shouldPipeLogs = wranglerOpts.logging === "error"; const result = spawnSync( @@ -77,27 +75,31 @@ export function runWrangler(options: BuildOptions, args: string[], wranglerOpts: ], { shell: true, - stdio: shouldPipeLogs ? ["ignore", "pipe", "pipe"] : "inherit", + stdio: shouldPipeLogs || noLogs ? ["ignore", "pipe", "pipe"] : ["inherit", "inherit", "pipe"], env: { ...process.env, ...wranglerOpts.env, - // `.env` files are handled by the adapter. - // Wrangler would load `.env.` while we should load `.env.` - // See https://opennext.js.org/cloudflare/howtos/env-vars CLOUDFLARE_LOAD_DEV_VARS_FROM_DOT_ENV: "false", }, } ); - if (result.status !== 0) { - if (shouldPipeLogs) { - process.stdout.write(result.stdout.toString()); - process.stderr.write(result.stderr.toString()); + const success = result.status === 0; + const stdout = result.stdout?.toString() ?? ""; + const stderr = result.stderr?.toString() ?? ""; + + if (!noLogs) { + if (!shouldPipeLogs && stderr) { + process.stderr.write(stderr); } - logger.error("Wrangler command failed"); - process.exit(1); + if (!success && shouldPipeLogs) { + process.stdout.write(stdout); + process.stderr.write(stderr); + } } + + return { success, stdout, stderr }; } export function isWranglerTarget(v: string | undefined): v is WranglerTarget { diff --git a/packages/cloudflare/src/cli/commands/utils.ts b/packages/cloudflare/src/cli/commands/utils/utils.ts similarity index 55% rename from packages/cloudflare/src/cli/commands/utils.ts rename to packages/cloudflare/src/cli/commands/utils/utils.ts index 8612102c..aebf6296 100644 --- a/packages/cloudflare/src/cli/commands/utils.ts +++ b/packages/cloudflare/src/cli/commands/utils/utils.ts @@ -5,17 +5,16 @@ import url from "node:url"; import { compileOpenNextConfig } from "@opennextjs/aws/build/compileConfig.js"; import { normalizeOptions } from "@opennextjs/aws/build/helper.js"; -import * as buildHelper from "@opennextjs/aws/build/helper.js"; import { printHeader, showWarningOnWindows } from "@opennextjs/aws/build/utils.js"; import logger from "@opennextjs/aws/logger.js"; import { unstable_readConfig } from "wrangler"; import type yargs from "yargs"; -import type { OpenNextConfig } from "../../api/config.js"; -import { createOpenNextConfigIfNotExistent, ensureCloudflareConfig } from "../build/utils/index.js"; +import type { OpenNextConfig } from "../../../api/config.js"; +import { createOpenNextConfigIfNotExistent } from "../../build/utils/create-config-files.js"; +import { ensureCloudflareConfig } from "../../build/utils/ensure-cf-config.js"; export type WithWranglerArgs = T & { - // Array of arguments that can be given to wrangler commands, including the `--config` and `--env` args. wranglerArgs: string[]; wranglerConfigPath: string | undefined; env: string | undefined; @@ -23,59 +22,12 @@ export type WithWranglerArgs = T & { export const nextAppDir = process.cwd(); -/** - * Print headers and warnings for the CLI. - * - * @param command - */ export function printHeaders(command: string) { printHeader(`Cloudflare ${command}`); showWarningOnWindows(); } -/** - * Validates that the Next.js version is supported and checks wrangler compatibility. - * - * Note: this function assumes that wrangler is installed. - * - * @param options.nextVersion The detected Next.js version string - * @throws {Error} If the Next.js version is unsupported - */ -export async function ensureNextjsVersionSupported({ - nextVersion, -}: Pick) { - if (buildHelper.compareSemver(nextVersion, "<", "14.2.0")) { - throw new Error("Next.js version unsupported, please upgrade to version 14.2 or greater."); - } - - const { - default: { version: wranglerVersion }, - } = await import("wrangler/package.json", { with: { type: "json" } }); - - // We need a version of workerd that has a fix for setImmediate for Next.js 16.1+ - // See: - // - https://github.com/cloudflare/workerd/pull/5869 - // - https://github.com/opennextjs/opennextjs-cloudflare/issues/1049 - if ( - buildHelper.compareSemver(nextVersion, ">=", "16.1.0") && - buildHelper.compareSemver(wranglerVersion, "<", "4.59.2") - ) { - logger.warn(`Next.js 16.1+ requires wrangler 4.59.2 or greater (${wranglerVersion} detected).`); - } -} - -/** - * Compile the OpenNext config. - * - * When users do not specify a custom config file (using `--openNextConfigPath`), - * the CLI will offer to create one. - * - * When users specify a custom config file but it doesn't exist, we throw an Error. - * - * @param configPath Optional path to the config file. Absolute or relative to cwd. - * @returns OpenNext config. - */ export async function compileConfig(configPath: string | undefined) { if (configPath && !existsSync(configPath)) { throw new Error(`Custom config file not found at ${configPath}`); @@ -91,11 +43,6 @@ export async function compileConfig(configPath: string | undefined) { return { config, buildDir }; } -/** - * Retrieve a compiled OpenNext config, and ensure it is for Cloudflare. - * - * @returns OpenNext config. - */ export async function retrieveCompiledConfig() { const configPath = path.join(nextAppDir, ".open-next/.build/open-next.config.edge.mjs"); @@ -110,13 +57,6 @@ export async function retrieveCompiledConfig() { return { config }; } -/** - * Normalize the OpenNext options and set the logging level. - * - * @param config - * @param buildDir Directory to use when building the application - * @returns Normalized options. - */ export function getNormalizedOptions(config: OpenNextConfig, buildDir = nextAppDir) { const require = createRequire(import.meta.url); const openNextDistDir = path.dirname(require.resolve("@opennextjs/aws/index.js")); @@ -127,22 +67,10 @@ export function getNormalizedOptions(config: OpenNextConfig, buildDir = nextAppD return options; } -/** - * Read the Wrangler config. - * - * @param args Wrangler environment and config path. - * @returns Wrangler config. - */ export async function readWranglerConfig(args: WithWranglerArgs) { - // Note: `unstable_readConfig` is sync as of wrangler 4.60.0 - // But it will eventually become async. - // See https://github.com/cloudflare/workers-sdk/pull/12031 return await unstable_readConfig({ env: args.env, config: args.wranglerConfigPath }); } -/** - * Adds flags for the wrangler config path and environment to the yargs configuration. - */ export function withWranglerOptions(args: T) { return args .option("config", { @@ -169,11 +97,6 @@ type WranglerInputArgs = { remote?: boolean | undefined; }; -/** - * - * @param args - * @returns An array of arguments that can be given to wrangler commands, including the `--config` and `--env` args. - */ function getWranglerArgs( args: WranglerInputArgs & { _: (string | number)[]; @@ -196,16 +119,10 @@ function getWranglerArgs( ...(args.config ? ["--config", args.config] : []), ...(args.env ? ["--env", args.env] : []), ...(args.remote ? ["--remote"] : []), - // Note: the `args` array contains unrecognised flags. ...(args.args?.map((a) => `${a}`) ?? []), ]; } -/** - * - * @param args - * @returns The inputted args, and an array of arguments that can be given to wrangler commands, including the `--config` and `--env` args. - */ export function withWranglerPassthroughArgs>( args: T ): WithWranglerArgs { diff --git a/packages/cloudflare/src/cli/project-options.ts b/packages/cloudflare/src/cli/project-options.ts index fd8946ab..42f86dfa 100644 --- a/packages/cloudflare/src/cli/project-options.ts +++ b/packages/cloudflare/src/cli/project-options.ts @@ -1,4 +1,4 @@ -import type { WranglerTarget } from "./utils/run-wrangler.js"; +import type { WranglerTarget } from "./commands/utils/run-wrangler.js"; export type ProjectOptions = { // Next app root folder diff --git a/packages/cloudflare/src/cli/utils/ask-account-selection.ts b/packages/cloudflare/src/cli/utils/ask-account-selection.ts new file mode 100644 index 00000000..1f4a9b19 --- /dev/null +++ b/packages/cloudflare/src/cli/utils/ask-account-selection.ts @@ -0,0 +1,27 @@ +import { randomUUID } from "node:crypto"; + +import Enquirer from "enquirer"; + +interface Account { + id: string; + name: string; +} + +export async function askAccountSelection(accounts: Account[]): Promise { + const questionName = randomUUID(); + + const enquirerAnswersObject = await Enquirer.prompt>({ + name: questionName, + message: "Select which Cloudflare account to use", + type: "select", + choices: accounts.map((account) => ({ + name: account.id, + message: account.name, + })), + format: (accountId) => `${accounts.find(({ id }) => id === accountId)?.name ?? ""}`, + }); + + console.log(""); + + return enquirerAnswersObject[questionName]; +} diff --git a/packages/cloudflare/src/cli/utils/create-open-next-config.ts b/packages/cloudflare/src/cli/utils/create-open-next-config.ts new file mode 100644 index 00000000..03d576ec --- /dev/null +++ b/packages/cloudflare/src/cli/utils/create-open-next-config.ts @@ -0,0 +1,49 @@ +import { existsSync, readFileSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; + +import { patchCode } from "@opennextjs/aws/build/patch/astCodePatcher.js"; + +import { getPackageTemplatesDirPath } from "../../utils/get-package-templates-dir-path.js"; + +export function findOpenNextConfig(appDir: string): string | undefined { + const openNextConfigPath = join(appDir, "open-next.config.ts"); + + if (existsSync(openNextConfigPath)) { + return openNextConfigPath; + } + + return undefined; +} + +export function createOpenNextConfigFile(appDir: string, options: { cache: boolean }): string { + const openNextConfigPath = join(appDir, "open-next.config.ts"); + + let content = readFileSync(join(getPackageTemplatesDirPath(), "open-next.config.ts"), "utf8"); + + if (!options.cache) { + content = patchCode(content, commentOutR2ImportRule); + content = patchCode(content, commentOutIncrementalCacheRule); + } + + writeFileSync(openNextConfigPath, content); + + return openNextConfigPath; +} + +const commentOutR2ImportRule = ` +rule: + pattern: import $ID from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache"; +fix: |- + // import $ID from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache"; +`; + +const commentOutIncrementalCacheRule = ` +rule: + pattern: '{ incrementalCache: $ID }' +fix: |- + { + // For best results consider enabling R2 caching + // See https://opennext.js.org/cloudflare/caching for more details + // incrementalCache: $ID + } +`; diff --git a/packages/cloudflare/src/cli/utils/create-wrangler-config.ts b/packages/cloudflare/src/cli/utils/create-wrangler-config.ts new file mode 100644 index 00000000..0dae0398 --- /dev/null +++ b/packages/cloudflare/src/cli/utils/create-wrangler-config.ts @@ -0,0 +1,262 @@ +import assert from "node:assert"; +import { existsSync, readFileSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; + +import { findPackagerAndRoot } from "@opennextjs/aws/build/helper.js"; +import Cloudflare from "cloudflare"; +import { type CommentObject, parse, stringify } from "comment-json"; + +import { getPackageTemplatesDirPath } from "../../utils/get-package-templates-dir-path.js"; + +import { askAccountSelection } from "./ask-account-selection.js"; + +export type PackagerDetails = { + packager: "npm" | "pnpm" | "yarn" | "bun"; + monorepoRoot: string; +}; + +export function findWranglerConfig(appDir: string): string | undefined { + const possibleExts = ["toml", "json", "jsonc"]; + + for (const ext of possibleExts) { + const path = join(appDir, `wrangler.${ext}`); + if (existsSync(path)) { + return path; + } + } + + return undefined; +} + +export async function createWranglerConfigFile( + projectDir: string, + defaultCompatDate = "2026-02-01" +): Promise<{ cachingEnabled: boolean }> { + const workerName = getWorkerName(projectDir); + const compatibilityDate = (await getLatestCompatDate()) ?? defaultCompatDate; + + const wranglerConfigStr = readFileSync(join(getPackageTemplatesDirPath(), "wrangler.jsonc"), "utf8") + .replaceAll("", workerName) + .replaceAll("", compatibilityDate); + + const wranglerConfig = parse(wranglerConfigStr) as CommentObject; + + assert(Array.isArray(wranglerConfig.r2_buckets)); + assert(wranglerConfig.r2_buckets[0] != null && typeof wranglerConfig.r2_buckets[0] === "object"); + assert( + "bucket_name" in wranglerConfig.r2_buckets[0] && + typeof wranglerConfig.r2_buckets[0].bucket_name === "string" + ); + + const bucketName = wranglerConfig.r2_buckets[0].bucket_name.replaceAll( + "", + `${workerName}-opennext-cache` + ); + wranglerConfig.r2_buckets[0].bucket_name = bucketName; + + const { success: cachingEnabled } = await maybeCreateR2Bucket(projectDir, bucketName); + + if (!cachingEnabled) { + delete wranglerConfig.r2_buckets; + } + + writeFileSync(join(projectDir, "wrangler.jsonc"), stringify(wranglerConfig, null, "\t")); + + return { cachingEnabled }; +} + +function getWorkerName(projectDir: string): string { + const appName = getNameFromPackageJson(projectDir) ?? "app-name"; + + return appName + .toLowerCase() + .replace(/^@[^/]+\//, "") + .replaceAll("_", "-") + .replace(/[^a-z0-9-]/g, ""); +} + +function getNameFromPackageJson(sourceDir: string): string | undefined { + try { + const packageJsonStr = readFileSync(join(sourceDir, "package.json"), "utf8"); + const packageJson: Record = JSON.parse(packageJsonStr); + if (typeof packageJson.name === "string") return packageJson.name; + } catch { + /* empty */ + } +} + +async function getLatestCompatDate(): Promise { + try { + const resp = await fetch(`https://registry.npmjs.org/workerd`); + const latestWorkerdVersion = ( + (await resp.json()) as { + "dist-tags": { latest: string }; + } + )["dist-tags"].latest; + + const match = latestWorkerdVersion.match(/\d+\.(\d{4})(\d{2})(\d{2})\.\d+/); + + if (match) { + const [, year, month, day] = match; + const compatDate = `${year}-${month}-${day}`; + + const currentDate = new Date().toISOString().slice(0, 10); + + return compatDate < currentDate ? compatDate : currentDate; + } + } catch { + /* empty */ + } +} + +async function maybeCreateR2Bucket(projectDir: string, bucketName: string): Promise<{ success: boolean }> { + const { packager, root: monorepoRoot } = findPackagerAndRoot(projectDir); + const packagerDetails: PackagerDetails = { packager, monorepoRoot }; + + const authResult = runWrangler(packagerDetails, ["whoami", "--json"], { logging: "none" }); + + if (!authResult.success) { + return { success: false }; + } + + let whoami: { + api_token: string; + auth_status: string; + email: string; + accounts: { id: string; name: string }[]; + }; + + try { + whoami = JSON.parse(authResult.stdout); + } catch { + return { success: false }; + } + + if (whoami.auth_status !== "active") { + return { success: false }; + } + + const accountId = process.env.CLOUDFLARE_ACCOUNT_ID ?? (await selectAccount(whoami.accounts)); + + if (!accountId) { + return { success: false }; + } + + const cf = new Cloudflare({ apiToken: whoami.api_token }); + + try { + await cf.r2.buckets.get(bucketName, { account_id: accountId }); + } catch (error: unknown) { + if (error instanceof Error && "code" in error && error.code === "MISSING_ARG_REGION") { + try { + await cf.r2.buckets.create({ account_id: accountId, name: bucketName }); + } catch { + return { success: false }; + } + } else if (error instanceof Error && error.message.includes("NotFound")) { + try { + await cf.r2.buckets.create({ account_id: accountId, name: bucketName }); + } catch { + return { success: false }; + } + } else { + return { success: false }; + } + } + + return { success: true }; +} + +async function selectAccount(accounts: { id: string; name: string }[]): Promise { + if (accounts.length === 0) { + return undefined; + } + + if (accounts.length === 1) { + return accounts[0]!.id; + } + + return askAccountSelection(accounts); +} + +type WranglerCommandResult = { + success: boolean; + stdout: string; + stderr: string; +}; + +type WranglerOptions = { + target?: "local" | "remote"; + environment?: string; + configPath?: string; + logging?: "all" | "error" | "none"; + env?: Record; +}; + +function runWrangler( + options: PackagerDetails, + args: string[], + wranglerOpts: WranglerOptions = {} +): WranglerCommandResult { + const { spawnSync } = require("node:child_process"); + + const noLogs = wranglerOpts.logging === "none"; + const shouldPipeLogs = wranglerOpts.logging === "error"; + + const result = spawnSync( + options.packager, + [ + options.packager === "bun" ? "x" : "exec", + "wrangler", + ...injectPassthroughFlagForArgs( + options, + [ + ...args, + wranglerOpts.environment && `--env ${wranglerOpts.environment}`, + wranglerOpts.configPath && `--config ${wranglerOpts.configPath}`, + wranglerOpts.target === "remote" && "--remote", + wranglerOpts.target === "local" && "--local", + ].filter((v): v is string => !!v) + ), + ], + { + shell: true, + stdio: shouldPipeLogs || noLogs ? ["ignore", "pipe", "pipe"] : ["inherit", "inherit", "pipe"], + env: { + ...process.env, + ...wranglerOpts.env, + CLOUDFLARE_LOAD_DEV_VARS_FROM_DOT_ENV: "false", + }, + } + ); + + const success = result.status === 0; + const stdout = result.stdout?.toString() ?? ""; + const stderr = result.stderr?.toString() ?? ""; + + if (!noLogs) { + if (!shouldPipeLogs && stderr) { + process.stderr.write(stderr); + } + + if (!success && shouldPipeLogs) { + process.stdout.write(stdout); + process.stderr.write(stderr); + } + } + + return { success, stdout, stderr }; +} + +function injectPassthroughFlagForArgs(options: PackagerDetails, args: string[]): string[] { + if (options.packager !== "npm" && options.packager !== "yarn") { + return args; + } + + const flagInArgsIndex = args.findIndex((v) => v.startsWith("--")); + if (flagInArgsIndex !== -1) { + args.splice(flagInArgsIndex, 0, "--"); + } + + return args; +} diff --git a/packages/cloudflare/src/cli/build/utils/extract-project-env-vars.ts b/packages/cloudflare/src/cli/utils/extract-project-env-vars.ts similarity index 56% rename from packages/cloudflare/src/cli/build/utils/extract-project-env-vars.ts rename to packages/cloudflare/src/cli/utils/extract-project-env-vars.ts index 2ec85395..cc98c07a 100644 --- a/packages/cloudflare/src/cli/build/utils/extract-project-env-vars.ts +++ b/packages/cloudflare/src/cli/utils/extract-project-env-vars.ts @@ -10,22 +10,6 @@ function readEnvFile(filePath: string) { } } -/** - * Extracts the environment variables defined in various .env files for a project. - * - * The `NEXTJS_ENV` environment variable in `.dev.vars` determines the mode. - * - * Merged variables respect the following priority order. - * 1. `.env.{mode}.local` - * 2. `.env.local` (when mode is not equal to `test`) - * 3. `.env.{mode}` - * 4. `.env` - * - * https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables#environment-variable-load-order - * - * In a monorepo, the env files in an app's directory will take precedence over - * the env files at the root of the monorepo. - */ export function extractProjectEnvVars(mode: string, { monorepoRoot, appPath }: BuildOptions) { return [".env", `.env.${mode}`, ...(mode !== "test" ? [".env.local"] : []), `.env.${mode}.local`] .flatMap((fileName) => [ diff --git a/packages/cloudflare/src/cli/utils/needs-experimental-react.ts b/packages/cloudflare/src/cli/utils/needs-experimental-react.ts new file mode 100644 index 00000000..dad47860 --- /dev/null +++ b/packages/cloudflare/src/cli/utils/needs-experimental-react.ts @@ -0,0 +1,15 @@ +import type { NextConfig } from "@opennextjs/aws/types/next-types.js"; + +interface ExtendedNextConfig extends NextConfig { + experimental: { + ppr?: boolean; + taint?: boolean; + viewTransition?: boolean; + serverActions?: boolean; + }; +} + +export function needsExperimentalReact(nextConfig: ExtendedNextConfig) { + const { ppr, taint, viewTransition } = nextConfig.experimental || {}; + return Boolean(ppr || taint || viewTransition); +} diff --git a/packages/cloudflare/src/cli/utils/nextjs-support.ts b/packages/cloudflare/src/cli/utils/nextjs-support.ts new file mode 100644 index 00000000..ba845fa8 --- /dev/null +++ b/packages/cloudflare/src/cli/utils/nextjs-support.ts @@ -0,0 +1,16 @@ +import { compareSemver } from "@opennextjs/aws/build/helper.js"; +import logger from "@opennextjs/aws/logger.js"; + +export async function ensureNextjsVersionSupported({ nextVersion }: { nextVersion: string }) { + if (compareSemver(nextVersion, "<", "14.2.0")) { + throw new Error("Next.js version unsupported, please upgrade to version 14.2 or greater."); + } + + const { + default: { version: wranglerVersion }, + } = await import("wrangler/package.json", { with: { type: "json" } }); + + if (compareSemver(nextVersion, ">=", "16.1.0") && compareSemver(wranglerVersion, "<", "4.59.2")) { + logger.warn(`Next.js 16.1+ requires wrangler 4.59.2 or greater (${wranglerVersion} detected).`); + } +} diff --git a/packages/cloudflare/src/cli/build/utils/normalize-path.ts b/packages/cloudflare/src/cli/utils/normalize-path.ts similarity index 100% rename from packages/cloudflare/src/cli/build/utils/normalize-path.ts rename to packages/cloudflare/src/cli/utils/normalize-path.ts diff --git a/packages/cloudflare/src/cli/utils/open-next-config.ts b/packages/cloudflare/src/cli/utils/open-next-config.ts deleted file mode 100644 index 1a6e21cd..00000000 --- a/packages/cloudflare/src/cli/utils/open-next-config.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { cpSync, existsSync } from "node:fs"; -import { join } from "node:path"; - -import { getPackageTemplatesDirPath } from "../../utils/get-package-templates-dir-path.js"; - -/** - * Finds the path to the OpenNext configuration file if it exists. - * - * @param appDir The directory to check for the open-next.config.ts file - * @returns The full path to open-next.config.ts if it exists, undefined otherwise - */ -export function findOpenNextConfig(appDir: string): string | undefined { - const openNextConfigPath = join(appDir, "open-next.config.ts"); - - if (existsSync(openNextConfigPath)) { - return openNextConfigPath; - } - - return undefined; -} - -/** - * Creates a `open-next.config.ts` file in the target directory for the project. - * - * @param appDir The Next application root - * @return The path to the created source file - */ -export async function createOpenNextConfigFile(appDir: string): Promise { - const openNextConfigPath = join(appDir, "open-next.config.ts"); - - cpSync(join(getPackageTemplatesDirPath(), "open-next.config.ts"), openNextConfigPath); - - return openNextConfigPath; -} diff --git a/packages/cloudflare/src/cli/utils/wrangler-config.ts b/packages/cloudflare/src/cli/utils/wrangler-config.ts deleted file mode 100644 index c94d211b..00000000 --- a/packages/cloudflare/src/cli/utils/wrangler-config.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { existsSync, readFileSync, writeFileSync } from "node:fs"; -import { join } from "node:path"; - -import { getPackageTemplatesDirPath } from "../../utils/get-package-templates-dir-path.js"; - -/** - * Gets the path to the Wrangler configuration file if it exists. - * - * @param appDir The directory to check for the Wrangler config file - * @returns The path to Wrangler config file if it exists, undefined otherwise - */ -export function findWranglerConfig(appDir: string): string | undefined { - const possibleExts = ["toml", "json", "jsonc"]; - - for (const ext of possibleExts) { - const path = join(appDir, `wrangler.${ext}`); - if (existsSync(path)) { - return path; - } - } - - return undefined; -} - -/** - * Creates a wrangler.jsonc config file in the target directory for the project. - * - * If a wrangler.jsonc file already exists it will be overridden. - * - * @param projectDir The target directory for the project - */ -export async function createWranglerConfigFile(projectDir: string) { - let wranglerConfig = readFileSync(join(getPackageTemplatesDirPath(), "wrangler.jsonc"), "utf8"); - - const appName = getAppNameFromPackageJson(projectDir) ?? "app-name"; - - wranglerConfig = wranglerConfig.replaceAll('""', JSON.stringify(appName.replaceAll("_", "-"))); - - const compatDate = await getLatestCompatDate(); - if (compatDate) { - wranglerConfig = wranglerConfig.replace( - /"compatibility_date": "\d{4}-\d{2}-\d{2}"/, - `"compatibility_date": ${JSON.stringify(compatDate)}` - ); - } - - writeFileSync(join(projectDir, "wrangler.jsonc"), wranglerConfig); -} - -function getAppNameFromPackageJson(sourceDir: string): string | undefined { - try { - const packageJsonStr = readFileSync(join(sourceDir, "package.json"), "utf8"); - const packageJson: Record = JSON.parse(packageJsonStr); - if (typeof packageJson.name === "string") return packageJson.name; - } catch { - /* empty */ - } -} - -async function getLatestCompatDate(): Promise { - try { - const resp = await fetch(`https://registry.npmjs.org/workerd`); - const latestWorkerdVersion = ( - (await resp.json()) as { - "dist-tags": { latest: string }; - } - )["dist-tags"].latest; - - // The format of the workerd version is `major.yyyymmdd.patch`. - const match = latestWorkerdVersion.match(/\d+\.(\d{4})(\d{2})(\d{2})\.\d+/); - - if (match) { - const [, year, month, day] = match; - const compatDate = `${year}-${month}-${day}`; - - const currentDate = new Date().toISOString().slice(0, 10); - - return compatDate < currentDate ? compatDate : currentDate; - } - } catch { - /* empty */ - } -} diff --git a/packages/cloudflare/templates/wrangler.jsonc b/packages/cloudflare/templates/wrangler.jsonc index 9fb58e9a..d654191c 100644 --- a/packages/cloudflare/templates/wrangler.jsonc +++ b/packages/cloudflare/templates/wrangler.jsonc @@ -24,7 +24,7 @@ // Create the bucket before deploying // You can change the bucket name if you want // See https://developers.cloudflare.com/workers/wrangler/commands/#r2-bucket-create - "bucket_name": "cache" + "bucket_name": "" } ], "images": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84142235..166ce89d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1328,6 +1328,9 @@ importers: cloudflare: specifier: ^4.4.1 version: 4.5.0 + comment-json: + specifier: ^4.5.1 + version: 4.6.2 enquirer: specifier: ^2.4.1 version: 2.4.1 @@ -1350,6 +1353,9 @@ importers: '@tsconfig/strictest': specifier: 'catalog:' version: 2.0.8 + '@types/comment-json': + specifier: ^2.4.5 + version: 2.4.5 '@types/mock-fs': specifier: 'catalog:' version: 4.13.4 @@ -6013,6 +6019,10 @@ packages: '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + '@types/comment-json@2.4.5': + resolution: {integrity: sha512-Zc70LYxV8bri2tcIVVAYQ33dsGOvcZ3Hx7MdMKEJ+cWIt5BqpjAi5Kxcxe3rplp+g6qIenPoxx44k9nGqUstmg==} + deprecated: This is a stub types definition. comment-json provides its own type definitions, so you do not need this installed. + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -6407,6 +6417,9 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -6853,6 +6866,10 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + comment-json@4.6.2: + resolution: {integrity: sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==} + engines: {node: '>= 6'} + commist@1.1.0: resolution: {integrity: sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==} @@ -17395,6 +17412,10 @@ snapshots: '@types/caseless@0.12.5': optional: true + '@types/comment-json@2.4.5': + dependencies: + comment-json: 4.6.2 + '@types/connect@3.4.38': dependencies: '@types/node': 22.19.7 @@ -17949,6 +17970,8 @@ snapshots: array-flatten@1.1.1: {} + array-timsort@1.0.3: {} + array-union@2.1.0: {} arrify@2.0.1: @@ -18466,6 +18489,11 @@ snapshots: commander@9.5.0: {} + comment-json@4.6.2: + dependencies: + array-timsort: 1.0.3 + esprima: 4.0.1 + commist@1.1.0: dependencies: leven: 2.1.0 From 3bfab5ae53a82aa7bc16d37b57d083a1b8299c48 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:35:38 +0100 Subject: [PATCH 23/27] chore: port PR #1142 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1142 Changeset: .changeset/port-pr-1142.md --- .changeset/port-pr-1142.md | 7 +++++++ create-cloudflare/next/wrangler.jsonc | 2 +- packages/cloudflare/templates/wrangler.jsonc | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .changeset/port-pr-1142.md diff --git a/.changeset/port-pr-1142.md b/.changeset/port-pr-1142.md new file mode 100644 index 00000000..19aeb7f0 --- /dev/null +++ b/.changeset/port-pr-1142.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1142 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1142 diff --git a/create-cloudflare/next/wrangler.jsonc b/create-cloudflare/next/wrangler.jsonc index b003c9ad..1c90bdb4 100644 --- a/create-cloudflare/next/wrangler.jsonc +++ b/create-cloudflare/next/wrangler.jsonc @@ -6,7 +6,7 @@ "$schema": "node_modules/wrangler/config-schema.json", "name": "worker_name", "main": ".open-next/worker.js", - "compatibility_date": "2025-12-01", + "compatibility_date": "", "compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"], "assets": { "binding": "ASSETS", diff --git a/packages/cloudflare/templates/wrangler.jsonc b/packages/cloudflare/templates/wrangler.jsonc index d654191c..7cf1ce87 100644 --- a/packages/cloudflare/templates/wrangler.jsonc +++ b/packages/cloudflare/templates/wrangler.jsonc @@ -2,7 +2,7 @@ "$schema": "node_modules/wrangler/config-schema.json", "main": ".open-next/worker.js", "name": "", - "compatibility_date": "2025-12-01", + "compatibility_date": "", "compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"], "assets": { "directory": ".open-next/assets", From a35e4f9840f4e0c38ca1ee1c1fa0a8f0ee1ff10e Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:46:32 +0100 Subject: [PATCH 24/27] chore: port PR #1147 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1147 make dev /cdn-cgi/image behaves like prod for consistency Changeset: .changeset/port-pr-1147.md --- .changeset/port-pr-1146.md | 7 + .changeset/port-pr-1147.md | 7 + .../cli/build/utils/create-config-files.ts | 43 ------ .../cloudflare/src/cli/commands/build.spec.ts | 93 ++++++++++++ packages/cloudflare/src/cli/commands/build.ts | 17 ++- .../src/cli/commands/utils/utils.spec.ts | 126 +++++++++++++++++ .../src/cli/commands/utils/utils.ts | 27 +++- .../src/cli/templates/images.spec.ts | 132 +++++++++++++++++- .../cloudflare/src/cli/templates/images.ts | 108 ++++++++++++-- .../cloudflare/src/cli/templates/worker.ts | 11 +- 10 files changed, 500 insertions(+), 71 deletions(-) create mode 100644 .changeset/port-pr-1146.md create mode 100644 .changeset/port-pr-1147.md delete mode 100644 packages/cloudflare/src/cli/build/utils/create-config-files.ts create mode 100644 packages/cloudflare/src/cli/commands/build.spec.ts create mode 100644 packages/cloudflare/src/cli/commands/utils/utils.spec.ts diff --git a/.changeset/port-pr-1146.md b/.changeset/port-pr-1146.md new file mode 100644 index 00000000..e02c3cc6 --- /dev/null +++ b/.changeset/port-pr-1146.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1146 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1146 diff --git a/.changeset/port-pr-1147.md b/.changeset/port-pr-1147.md new file mode 100644 index 00000000..48131951 --- /dev/null +++ b/.changeset/port-pr-1147.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1147 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1147 diff --git a/packages/cloudflare/src/cli/build/utils/create-config-files.ts b/packages/cloudflare/src/cli/build/utils/create-config-files.ts deleted file mode 100644 index 8f0d6a79..00000000 --- a/packages/cloudflare/src/cli/build/utils/create-config-files.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { ProjectOptions } from "../../project-options.js"; -import { askConfirmation } from "../../utils/ask-confirmation.js"; -import { createOpenNextConfigFile, findOpenNextConfig } from "../../utils/create-open-next-config.js"; -import { createWranglerConfigFile, findWranglerConfig } from "../../utils/create-wrangler-config.js"; - -export async function createWranglerConfigIfNonExistent(projectOpts: ProjectOptions): Promise { - const wranglerConfigFileExists = Boolean(findWranglerConfig(projectOpts.sourceDir)); - if (wranglerConfigFileExists) { - return; - } - - const answer = await askConfirmation( - "No `wrangler.(toml|json|jsonc)` config file found, do you want to create one?" - ); - - if (!answer) { - console.warn( - "No Wrangler config file created" + - "\n" + - "(to avoid this check use the `--skipWranglerConfigCheck` flag or set a `SKIP_WRANGLER_CONFIG_CHECK` environment variable to `yes`)" - ); - return; - } - - await createWranglerConfigFile(projectOpts.sourceDir); -} - -export async function createOpenNextConfigIfNotExistent(sourceDir: string): Promise { - const openNextConfigPath = findOpenNextConfig(sourceDir); - if (!openNextConfigPath) { - const answer = await askConfirmation( - "Missing required `open-next.config.ts` file, do you want to create one?" - ); - - if (!answer) { - throw new Error("The `open-next.config.ts` file is required, aborting!"); - } - - return createOpenNextConfigFile(sourceDir, { cache: false }); - } - - return openNextConfigPath; -} diff --git a/packages/cloudflare/src/cli/commands/build.spec.ts b/packages/cloudflare/src/cli/commands/build.spec.ts new file mode 100644 index 00000000..d4189e29 --- /dev/null +++ b/packages/cloudflare/src/cli/commands/build.spec.ts @@ -0,0 +1,93 @@ +import logger from "@opennextjs/aws/logger.js"; +import { afterEach, describe, expect, it, vi } from "vitest"; + +import { askConfirmation } from "../utils/ask-confirmation.js"; +import { createWranglerConfigFile } from "../utils/create-wrangler-config.js"; + +import { buildCommand } from "./build.js"; + +// Mock logger +vi.mock("@opennextjs/aws/logger.js", () => ({ + default: { + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + debug: vi.fn(), + setLevel: vi.fn(), + }, +})); + +// Mock build implementation +vi.mock("../build/build.js", () => ({ + build: vi.fn(), +})); + +// Mock askConfirmation +vi.mock("../utils/ask-confirmation.js", () => ({ + askConfirmation: vi.fn(), +})); + +// Mock create-wrangler-config: findWranglerConfig returns undefined (no config found) +vi.mock("../utils/create-wrangler-config.js", () => ({ + findWranglerConfig: vi.fn(() => undefined), + createWranglerConfigFile: vi.fn(async () => ({ cachingEnabled: false })), +})); + +// Mock utils +vi.mock("./utils/utils.js", () => ({ + compileConfig: vi.fn(async () => ({ config: {}, buildDir: "" })), + getNormalizedOptions: vi.fn(() => ({})), + readWranglerConfig: vi.fn(async () => ({})), + printHeaders: vi.fn(), + nextAppDir: "/test", + withWranglerOptions: vi.fn(), + withWranglerPassthroughArgs: vi.fn(), +})); + +const defaultArgs = { + skipNextBuild: false, + noMinify: false, + skipWranglerConfigCheck: false, + openNextConfigPath: undefined, + dangerouslyUseUnsupportedNextVersion: false, + wranglerArgs: [], + wranglerConfigPath: undefined, + env: undefined, +}; + +describe("buildCommand", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("should create wrangler config when user confirms", async () => { + vi.mocked(askConfirmation).mockResolvedValue(true); + + await buildCommand(defaultArgs); + + expect(askConfirmation).toHaveBeenCalledOnce(); + expect(vi.mocked(askConfirmation).mock.calls[0]).toMatchInlineSnapshot(` + [ + "No \`wrangler.(toml|json|jsonc)\` config file found, do you want to create one?", + ] + `); + expect(createWranglerConfigFile).toHaveBeenCalledOnce(); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it("should warn when user declines wrangler config creation", async () => { + vi.mocked(askConfirmation).mockResolvedValue(false); + + await buildCommand(defaultArgs); + + expect(askConfirmation).toHaveBeenCalledOnce(); + expect(createWranglerConfigFile).not.toHaveBeenCalled(); + expect(vi.mocked(logger.warn).mock.calls[0]).toMatchInlineSnapshot(` + [ + "No Wrangler config file created + + (to avoid this check use the \`--skipWranglerConfigCheck\` flag or set a \`SKIP_WRANGLER_CONFIG_CHECK\` environment variable to \`yes\`)", + ] + `); + }); +}); diff --git a/packages/cloudflare/src/cli/commands/build.ts b/packages/cloudflare/src/cli/commands/build.ts index 4225475b..03c7458e 100644 --- a/packages/cloudflare/src/cli/commands/build.ts +++ b/packages/cloudflare/src/cli/commands/build.ts @@ -1,9 +1,11 @@ import { createRequire } from "node:module"; +import logger from "@opennextjs/aws/logger.js"; import type yargs from "yargs"; import { build as buildImpl } from "../build/build.js"; -import { createWranglerConfigIfNonExistent } from "../build/utils/create-config-files.js"; +import { askConfirmation } from "../utils/ask-confirmation.js"; +import { createWranglerConfigFile, findWranglerConfig } from "../utils/create-wrangler-config.js"; import type { WithWranglerArgs } from "./utils/utils.js"; import { @@ -21,7 +23,7 @@ import { * * @param args */ -async function buildCommand( +export async function buildCommand( args: WithWranglerArgs<{ skipNextBuild: boolean; noMinify: boolean; @@ -46,7 +48,16 @@ async function buildCommand( // Note: We don't ask when a custom config file is specified via `--config` // nor when `--skipWranglerConfigCheck` is used. if (!projectOpts.wranglerConfigPath && !args.skipWranglerConfigCheck) { - await createWranglerConfigIfNonExistent(projectOpts); + if (!findWranglerConfig(projectOpts.sourceDir)) { + const confirmCreate = "No `wrangler.(toml|json|jsonc)` config file found, do you want to create one?"; + if (await askConfirmation(confirmCreate)) { + await createWranglerConfigFile(projectOpts.sourceDir); + } else { + logger.warn(`No Wrangler config file created + +(to avoid this check use the \`--skipWranglerConfigCheck\` flag or set a \`SKIP_WRANGLER_CONFIG_CHECK\` environment variable to \`yes\`)`); + } + } } const wranglerConfig = await readWranglerConfig(args); diff --git a/packages/cloudflare/src/cli/commands/utils/utils.spec.ts b/packages/cloudflare/src/cli/commands/utils/utils.spec.ts new file mode 100644 index 00000000..3781ee82 --- /dev/null +++ b/packages/cloudflare/src/cli/commands/utils/utils.spec.ts @@ -0,0 +1,126 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +import { askConfirmation } from "../../utils/ask-confirmation.js"; +import { createOpenNextConfigFile, findOpenNextConfig } from "../../utils/create-open-next-config.js"; + +import { compileConfig } from "./utils.js"; + +const { mockExistsSync } = vi.hoisted(() => ({ + mockExistsSync: vi.fn(), +})); + +// Mock node:fs — only override existsSync +vi.mock("node:fs", async (importOriginal) => { + const mod = await importOriginal(); + return { ...mod, existsSync: mockExistsSync }; +}); + +// Mock logger +vi.mock("@opennextjs/aws/logger.js", () => ({ + default: { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn(), setLevel: vi.fn() }, +})); + +// Mock compileOpenNextConfig +const mockCompileOpenNextConfig = vi.fn(async () => ({ + config: { default: {} }, + buildDir: "/build", +})); +vi.mock("@opennextjs/aws/build/compileConfig.js", () => ({ + compileOpenNextConfig: (...args: unknown[]) => mockCompileOpenNextConfig(...args), +})); + +// Mock ensureCloudflareConfig +vi.mock("../../build/utils/ensure-cf-config.js", () => ({ + ensureCloudflareConfig: vi.fn(), +})); + +// Mock askConfirmation +vi.mock("../../utils/ask-confirmation.js", () => ({ + askConfirmation: vi.fn(), +})); + +// Mock create-open-next-config +vi.mock("../../utils/create-open-next-config.js", () => ({ + findOpenNextConfig: vi.fn(), + createOpenNextConfigFile: vi.fn(() => "/test/open-next.config.ts"), +})); + +// Mock wrangler +vi.mock("wrangler", () => ({ + unstable_readConfig: vi.fn(), +})); + +// Mock build utils +vi.mock("@opennextjs/aws/build/utils.js", () => ({ + printHeader: vi.fn(), + showWarningOnWindows: vi.fn(), +})); + +// Mock build helper +vi.mock("@opennextjs/aws/build/helper.js", () => ({ + normalizeOptions: vi.fn(() => ({})), +})); + +describe("compileConfig", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("should compile config when configPath is provided and file exists", async () => { + mockExistsSync.mockReturnValue(true); + + const result = await compileConfig("/app/open-next.config.ts"); + + expect(mockCompileOpenNextConfig).toHaveBeenCalledWith("/app/open-next.config.ts", { compileEdge: true }); + expect(result).toEqual({ config: { default: {} }, buildDir: "/build" }); + }); + + it("should throw when configPath is provided but file does not exist", async () => { + mockExistsSync.mockReturnValue(false); + + await expect(compileConfig("/app/missing-config.ts")).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: Custom config file not found at /app/missing-config.ts]` + ); + }); + + it("should compile config when no configPath is provided but one is found", async () => { + vi.mocked(findOpenNextConfig).mockReturnValue("/app/open-next.config.ts"); + + const result = await compileConfig(undefined); + + expect(findOpenNextConfig).toHaveBeenCalledOnce(); + expect(mockCompileOpenNextConfig).toHaveBeenCalledWith("/app/open-next.config.ts", { compileEdge: true }); + expect(result).toEqual({ config: { default: {} }, buildDir: "/build" }); + }); + + it("should create config when no configPath found and user confirms", async () => { + vi.mocked(findOpenNextConfig).mockReturnValue(undefined); + vi.mocked(askConfirmation).mockResolvedValue(true); + + const result = await compileConfig(undefined); + + expect(askConfirmation).toHaveBeenCalledOnce(); + expect(vi.mocked(askConfirmation).mock.calls[0]).toMatchInlineSnapshot(` + [ + "Missing required \`open-next.config.ts\` file, do you want to create one?", + ] + `); + expect(createOpenNextConfigFile).toHaveBeenCalledOnce(); + expect(mockCompileOpenNextConfig).toHaveBeenCalledWith("/test/open-next.config.ts", { + compileEdge: true, + }); + expect(result).toEqual({ config: { default: {} }, buildDir: "/build" }); + }); + + it("should throw when no configPath found and user declines", async () => { + vi.mocked(findOpenNextConfig).mockReturnValue(undefined); + vi.mocked(askConfirmation).mockResolvedValue(false); + + await expect(compileConfig(undefined)).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: The \`open-next.config.ts\` file is required, aborting!]` + ); + + expect(askConfirmation).toHaveBeenCalledOnce(); + expect(createOpenNextConfigFile).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/cloudflare/src/cli/commands/utils/utils.ts b/packages/cloudflare/src/cli/commands/utils/utils.ts index aebf6296..0bee952d 100644 --- a/packages/cloudflare/src/cli/commands/utils/utils.ts +++ b/packages/cloudflare/src/cli/commands/utils/utils.ts @@ -11,8 +11,9 @@ import { unstable_readConfig } from "wrangler"; import type yargs from "yargs"; import type { OpenNextConfig } from "../../../api/config.js"; -import { createOpenNextConfigIfNotExistent } from "../../build/utils/create-config-files.js"; import { ensureCloudflareConfig } from "../../build/utils/ensure-cf-config.js"; +import { askConfirmation } from "../../utils/ask-confirmation.js"; +import { createOpenNextConfigFile, findOpenNextConfig } from "../../utils/create-open-next-config.js"; export type WithWranglerArgs = T & { wranglerArgs: string[]; @@ -28,13 +29,35 @@ export function printHeaders(command: string) { showWarningOnWindows(); } +/** + * Compile the OpenNext config file. + * + * When users specify a custom config file but it doesn't exist, we throw an Error. + * + * @throws If a custom config path is provided but the file does not exist. + * @throws If no config file is found and the user declines to create one. + * + * @param configPath Optional path to the config file. Absolute or relative to cwd. + * @returns The compiled OpenNext config and the build directory. + * + */ export async function compileConfig(configPath: string | undefined) { if (configPath && !existsSync(configPath)) { throw new Error(`Custom config file not found at ${configPath}`); } + configPath ??= findOpenNextConfig(nextAppDir); + if (!configPath) { - configPath = await createOpenNextConfigIfNotExistent(nextAppDir); + const answer = await askConfirmation( + "Missing required `open-next.config.ts` file, do you want to create one?" + ); + + if (!answer) { + throw new Error("The `open-next.config.ts` file is required, aborting!"); + } + + configPath = createOpenNextConfigFile(nextAppDir, { cache: false }); } const { config, buildDir } = await compileOpenNextConfig(configPath, { compileEdge: true }); diff --git a/packages/cloudflare/src/cli/templates/images.spec.ts b/packages/cloudflare/src/cli/templates/images.spec.ts index 0489997e..14b441f8 100644 --- a/packages/cloudflare/src/cli/templates/images.spec.ts +++ b/packages/cloudflare/src/cli/templates/images.spec.ts @@ -2,7 +2,12 @@ import pm from "picomatch"; import { describe, expect, it } from "vitest"; import type { LocalPattern } from "./images.js"; -import { matchLocalPattern, matchRemotePattern as mRP } from "./images.js"; +import { + detectImageContentType, + matchLocalPattern, + matchRemotePattern as mRP, + parseCdnCgiImageRequest, +} from "./images.js"; /** * See https://github.com/vercel/next.js/blob/64702a9/test/unit/image-optimizer/match-remote-pattern.test.ts @@ -426,3 +431,128 @@ describe("matchLocalPattern", () => { expect(mLP(p, "/path/to/file.txt?q=1&a=two")).toBe(true); }); }); + +describe("parseCdnCgiImageRequest", () => { + it("should parse a valid local image request", () => { + const result = parseCdnCgiImageRequest( + "/cdn-cgi/image/width=640,quality=75,format=auto/_next/static/media/photo.png" + ); + expect(result).toEqual({ ok: true, url: "/_next/static/media/photo.png", static: false }); + }); + + it("should parse a valid remote image request", () => { + const result = parseCdnCgiImageRequest( + "/cdn-cgi/image/width=1080,quality=75,format=auto/https://example.com/photo.jpg" + ); + expect(result).toEqual({ ok: true, url: "https://example.com/photo.jpg", static: false }); + }); + + it("should reject when pathname does not match /cdn-cgi/image/ format", () => { + const result = parseCdnCgiImageRequest("/cdn-cgi/image/"); + expect(result).toEqual({ ok: false, message: "Invalid /cdn-cgi/image/ URL format" }); + }); + + it("should reject when options segment has no trailing image URL", () => { + const result = parseCdnCgiImageRequest("/cdn-cgi/image/width=640"); + expect(result).toEqual({ ok: false, message: "Invalid /cdn-cgi/image/ URL format" }); + }); + + it("should reject protocol-relative URLs", () => { + const result = parseCdnCgiImageRequest( + "/cdn-cgi/image/width=640,quality=75,format=auto//evil.com/photo.jpg" + ); + expect(result).toEqual({ + ok: false, + message: '"url" parameter cannot be a protocol-relative URL (//)', + }); + }); + + it("should add leading slash to relative image URLs", () => { + const result = parseCdnCgiImageRequest( + "/cdn-cgi/image/width=640,quality=75,format=auto/path/to/image.png" + ); + expect(result).toMatchObject({ ok: true, url: "/path/to/image.png" }); + }); +}); + +describe("detectImageContentType", () => { + it("should detect JPEG", () => { + const buffer = new Uint8Array([0xff, 0xd8, 0xff]); + expect(detectImageContentType(buffer)).toBe("image/jpeg"); + }); + + it("should detect PNG", () => { + const buffer = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); + expect(detectImageContentType(buffer)).toBe("image/png"); + }); + + it("should detect GIF", () => { + const buffer = new Uint8Array([0x47, 0x49, 0x46, 0x38]); + expect(detectImageContentType(buffer)).toBe("image/gif"); + }); + + it("should detect WebP", () => { + const buffer = new Uint8Array([0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42, 0x50]); + expect(detectImageContentType(buffer)).toBe("image/webp"); + }); + + it("should detect SVG ( { + const buffer = new Uint8Array([0x3c, 0x3f, 0x78, 0x6d, 0x6c]); + expect(detectImageContentType(buffer)).toBe("image/svg+xml"); + }); + + it("should detect SVG ( { + const buffer = new Uint8Array([0x3c, 0x73, 0x76, 0x67]); + expect(detectImageContentType(buffer)).toBe("image/svg+xml"); + }); + + it("should detect AVIF", () => { + const buffer = new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66]); + expect(detectImageContentType(buffer)).toBe("image/avif"); + }); + + it("should detect ICO", () => { + const buffer = new Uint8Array([0x00, 0x00, 0x01, 0x00]); + expect(detectImageContentType(buffer)).toBe("image/x-icon"); + }); + + it("should detect ICNS", () => { + const buffer = new Uint8Array([0x69, 0x63, 0x6e, 0x73]); + expect(detectImageContentType(buffer)).toBe("image/x-icns"); + }); + + it("should detect TIFF", () => { + const buffer = new Uint8Array([0x49, 0x49, 0x2a, 0x00]); + expect(detectImageContentType(buffer)).toBe("image/tiff"); + }); + + it("should detect BMP", () => { + const buffer = new Uint8Array([0x42, 0x4d]); + expect(detectImageContentType(buffer)).toBe("image/bmp"); + }); + + it("should detect JXL (short signature)", () => { + const buffer = new Uint8Array([0xff, 0x0a]); + expect(detectImageContentType(buffer)).toBe("image/jxl"); + }); + + it("should detect JXL (long signature)", () => { + const buffer = new Uint8Array([0x00, 0x00, 0x00, 0x0c, 0x4a, 0x58, 0x4c, 0x20, 0x0d, 0x0a, 0x87, 0x0a]); + expect(detectImageContentType(buffer)).toBe("image/jxl"); + }); + + it("should detect HEIC", () => { + const buffer = new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63]); + expect(detectImageContentType(buffer)).toBe("image/heic"); + }); + + it("should detect JP2", () => { + const buffer = new Uint8Array([0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a]); + expect(detectImageContentType(buffer)).toBe("image/jp2"); + }); + + it("should return null for unknown content", () => { + const buffer = new Uint8Array([0x00, 0x00, 0x00, 0x00]); + expect(detectImageContentType(buffer)).toBeNull(); + }); +}); diff --git a/packages/cloudflare/src/cli/templates/images.ts b/packages/cloudflare/src/cli/templates/images.ts index dbe6ef44..1dae02f2 100644 --- a/packages/cloudflare/src/cli/templates/images.ts +++ b/packages/cloudflare/src/cli/templates/images.ts @@ -89,20 +89,12 @@ export async function handleImageRequest( } } - const [contentTypeImageStream, imageStream] = imageResponse.body.tee(); - const imageHeaderBytes = new Uint8Array(32); - const contentTypeImageReader = contentTypeImageStream.getReader({ - mode: "byob", - }); - const readImageHeaderBytesResult = await contentTypeImageReader.readAtLeast(32, imageHeaderBytes); - if (readImageHeaderBytesResult.value === undefined) { - await imageResponse.body.cancel(); - - return new Response('"url" parameter is valid but upstream response is invalid', { - status: 400, - }); + const readHeaderResult = await readImageHeader(imageResponse); + if (readHeaderResult instanceof Response) { + return readHeaderResult; } - const contentType = detectImageContentType(readImageHeaderBytesResult.value); + + const { contentType, imageStream } = readHeaderResult; if (contentType === null) { warn(`Failed to detect content type of "${parseResult.url}"`); return new Response('"url" parameter is valid but image type is not allowed', { @@ -349,6 +341,94 @@ type ErrorResult = { message: string; }; +export function parseCdnCgiImageRequest( + pathname: string +): { ok: true; url: string; static: boolean } | ErrorResult { + const match = pathname.match(/^\/cdn-cgi\/image\/(?[^/]+)\/(?.+)$/); + if (match === null || !match.groups?.options || !match.groups?.url) { + return { ok: false, message: "Invalid /cdn-cgi/image/ URL format" }; + } + + const imageUrl = match.groups.url; + if (imageUrl.startsWith("/")) { + return { ok: false, message: '"url" parameter cannot be a protocol-relative URL (//)' }; + } + + let resolvedUrl: string; + if (imageUrl.match(/^https?:\/\//)) { + resolvedUrl = imageUrl; + } else { + resolvedUrl = `/${imageUrl}`; + } + + return { + ok: true, + url: resolvedUrl, + static: false, + }; +} + +export async function handleCdnCgiImageRequest(requestURL: URL, env: CloudflareEnv): Promise { + const parseResult = parseCdnCgiImageRequest(requestURL.pathname); + if (!parseResult.ok) { + return new Response(parseResult.message, { status: 400 }); + } + + let imageResponse: Response; + if (parseResult.url.startsWith("/")) { + if (env.ASSETS === undefined) { + return new Response("env.ASSETS binding is not defined", { status: 404 }); + } + const absoluteURL = new URL(parseResult.url, requestURL); + imageResponse = await env.ASSETS.fetch(absoluteURL); + } else { + imageResponse = await fetch(parseResult.url); + } + + if (!imageResponse.ok || imageResponse.body === null) { + return new Response('"url" parameter is valid but upstream response is invalid', { + status: imageResponse.status, + }); + } + + const readHeaderResult = await readImageHeader(imageResponse); + if (readHeaderResult instanceof Response) { + return readHeaderResult; + } + + const { contentType, imageStream } = readHeaderResult; + if (contentType === null || !SUPPORTED_CDN_CGI_INPUT_TYPES.has(contentType)) { + return new Response('"url" parameter is valid but image type is not allowed', { status: 400 }); + } + + if (contentType === SVG && !__IMAGES_ALLOW_SVG__) { + return new Response('"url" parameter is valid but image type is not allowed', { status: 400 }); + } + + return new Response(imageStream, { + headers: { "Content-Type": contentType }, + }); +} + +async function readImageHeader( + imageResponse: Response +): Promise<{ contentType: ImageContentType | null; imageStream: ReadableStream } | Response> { + const [contentTypeStream, imageStream] = imageResponse.body!.tee(); + const headerBytes = new Uint8Array(32); + const reader = contentTypeStream.getReader({ mode: "byob" }); + const readResult = await reader.readAtLeast(32, headerBytes); + + if (readResult.value === undefined) { + await imageResponse.body!.cancel(); + return new Response('"url" parameter is valid but upstream response is invalid', { + status: 400, + }); + } + + const contentType = detectImageContentType(readResult.value); + return { contentType, imageStream }; +} + /** * Validates that there is exactly one "url" query parameter. * @@ -631,6 +711,8 @@ const ICNS = "image/x-icns"; const TIFF = "image/tiff"; const BMP = "image/bmp"; +const SUPPORTED_CDN_CGI_INPUT_TYPES: ReadonlySet = new Set([JPEG, PNG, GIF, WEBP, SVG, HEIC]); + type ImageContentType = | "image/avif" | "image/webp" diff --git a/packages/cloudflare/src/cli/templates/worker.ts b/packages/cloudflare/src/cli/templates/worker.ts index 95dded9c..602b75d9 100644 --- a/packages/cloudflare/src/cli/templates/worker.ts +++ b/packages/cloudflare/src/cli/templates/worker.ts @@ -1,5 +1,5 @@ //@ts-expect-error: Will be resolved by wrangler build -import { handleImageRequest } from "./cloudflare/images.js"; +import { handleCdnCgiImageRequest, handleImageRequest } from "./cloudflare/images.js"; //@ts-expect-error: Will be resolved by wrangler build import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; //@ts-expect-error: Will be resolved by wrangler build @@ -27,14 +27,7 @@ export default { // Serve images in development. // Note: "/cdn-cgi/image/..." requests do not reach production workers. if (url.pathname.startsWith("/cdn-cgi/image/")) { - const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); - if (m === null) { - return new Response("Not Found!", { status: 404 }); - } - const imageUrl = m.groups!.url!; - return imageUrl.match(/^https?:\/\//) - ? fetch(imageUrl, { cf: { cacheEverything: true } }) - : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + return handleCdnCgiImageRequest(url, env); } // Fallback for the Next default image loader. From 2a65d4aae54a52376057beb4a61529252868d46b Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:48:24 +0100 Subject: [PATCH 25/27] chore: port PR #1150 from source repository https://github.com/opennextjs/opennextjs-cloudflare/pull/1150 Changeset: .changeset/port-pr-1150.md --- .changeset/port-pr-1150.md | 7 +++++++ create-cloudflare/next/package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/port-pr-1150.md diff --git a/.changeset/port-pr-1150.md b/.changeset/port-pr-1150.md new file mode 100644 index 00000000..779ebfda --- /dev/null +++ b/.changeset/port-pr-1150.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Ported PR #1150 from source repository + +https://github.com/opennextjs/opennextjs-cloudflare/pull/1150 diff --git a/create-cloudflare/next/package.json b/create-cloudflare/next/package.json index 70136d6b..06e2cbe7 100644 --- a/create-cloudflare/next/package.json +++ b/create-cloudflare/next/package.json @@ -13,7 +13,7 @@ "cf-typegen": "wrangler types --env-interface CloudflareEnv ./cloudflare-env.d.ts" }, "dependencies": { - "@opennextjs/cloudflare": "^1.15.1", + "@opennextjs/cloudflare": "^1.17.1", "next": "16.1.4", "react": "19.1.4", "react-dom": "19.1.4" From a1d153e741b4f06370ba9b5d9312b3839b82462e Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 21 Mar 2026 11:51:59 +0100 Subject: [PATCH 26/27] fix lockfile --- packages/cloudflare/package.json | 2 +- pnpm-lock.yaml | 905 +------------------------------ 2 files changed, 16 insertions(+), 891 deletions(-) diff --git a/packages/cloudflare/package.json b/packages/cloudflare/package.json index c54643ef..85817ae9 100644 --- a/packages/cloudflare/package.json +++ b/packages/cloudflare/package.json @@ -63,7 +63,7 @@ "devDependencies": { "@cloudflare/workers-types": "catalog:", "@tsconfig/strictest": "catalog:", - "@types/comment-json": "^2.4.7", + "@types/comment-json": "^2.4.5", "@types/mock-fs": "catalog:", "@types/node": "catalog:", "@types/picomatch": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 166ce89d..2b49711b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -161,8 +161,8 @@ importers: create-cloudflare/next: dependencies: '@opennextjs/cloudflare': - specifier: ^1.15.1 - version: 1.15.1(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))(wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0)) + specifier: ^1.17.1 + version: 1.17.1(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))(wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0)) next: specifier: 16.1.4 version: 16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4) @@ -1547,37 +1547,18 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@ast-grep/napi-darwin-arm64@0.40.0': - resolution: {integrity: sha512-ZMjl5yLhKjxdwbqEEdMizgQdWH2NrWsM6Px+JuGErgCDe6Aedq9yurEPV7veybGdLVJQhOah6htlSflXxjHnYA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@ast-grep/napi-darwin-arm64@0.40.5': resolution: {integrity: sha512-2F072fGN0WTq7KI3okuEnkGJVEHLbi56Bw1H6NAMf7j2mJJeQWsRyGOMcyNnUXZDeNdvoMH0OB2a5wwUegY/nQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@ast-grep/napi-darwin-x64@0.40.0': - resolution: {integrity: sha512-f9Ol5oQKNRMBkvDtzBK1WiNn2/3eejF2Pn9xwTj7PhXuSFseedOspPYllxQo0gbwUlw/DJqGFTce/jarhR/rBw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@ast-grep/napi-darwin-x64@0.40.5': resolution: {integrity: sha512-dJMidHZhhxuLBYNi6/FKI812jQ7wcFPSKkVPwviez2D+KvYagapUMAV/4dJ7FCORfguVk8Y0jpPAlYmWRT5nvA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@ast-grep/napi-linux-arm64-gnu@0.40.0': - resolution: {integrity: sha512-+tO+VW5GDhT9jGkKOK+3b8+ohKjC98WTzn7wSskd/myyhK3oYL1WTKqCm07WSYBZOJvb3z+WaX+wOUrc4bvtyQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@ast-grep/napi-linux-arm64-gnu@0.40.5': resolution: {integrity: sha512-nBRCbyoS87uqkaw4Oyfe5VO+SRm2B+0g0T8ME69Qry9ShMf41a2bTdpcQx9e8scZPogq+CTwDHo3THyBV71l9w==} engines: {node: '>= 10'} @@ -1585,13 +1566,6 @@ packages: os: [linux] libc: [glibc] - '@ast-grep/napi-linux-arm64-musl@0.40.0': - resolution: {integrity: sha512-MS9qalLRjUnF2PCzuTKTvCMVSORYHxxe3Qa0+SSaVULsXRBmuy5C/b1FeWwMFnwNnC0uie3VDet31Zujwi8q6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - '@ast-grep/napi-linux-arm64-musl@0.40.5': resolution: {integrity: sha512-/qKsmds5FMoaEj6FdNzepbmLMtlFuBLdrAn9GIWCqOIcVcYvM1Nka8+mncfeXB/MFZKOrzQsQdPTWqrrQzXLrA==} engines: {node: '>= 10'} @@ -1599,13 +1573,6 @@ packages: os: [linux] libc: [musl] - '@ast-grep/napi-linux-x64-gnu@0.40.0': - resolution: {integrity: sha512-BeHZVMNXhM3WV3XE2yghO0fRxhMOt8BTN972p5piYEQUvKeSHmS8oeGcs6Ahgx5znBclqqqq37ZfioYANiTqJA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - '@ast-grep/napi-linux-x64-gnu@0.40.5': resolution: {integrity: sha512-DP4oDbq7f/1A2hRTFLhJfDFR6aI5mRWdEfKfHzRItmlKsR9WlcEl1qDJs/zX9R2EEtIDsSKRzuJNfJllY3/W8Q==} engines: {node: '>= 10'} @@ -1613,13 +1580,6 @@ packages: os: [linux] libc: [glibc] - '@ast-grep/napi-linux-x64-musl@0.40.0': - resolution: {integrity: sha512-rG1YujF7O+lszX8fd5u6qkFTuv4FwHXjWvt1CCvCxXwQLSY96LaCW88oVKg7WoEYQh54y++Fk57F+Wh9Gv9nVQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - '@ast-grep/napi-linux-x64-musl@0.40.5': resolution: {integrity: sha512-BRZUvVBPUNpWPo6Ns8chXVzxHPY+k9gpsubGTHy92Q26ecZULd/dTkWWdnvfhRqttsSQ9Pe/XQdi5+hDQ6RYcg==} engines: {node: '>= 10'} @@ -1627,46 +1587,24 @@ packages: os: [linux] libc: [musl] - '@ast-grep/napi-win32-arm64-msvc@0.40.0': - resolution: {integrity: sha512-9SqmnQqd4zTEUk6yx0TuW2ycZZs2+e569O/R0QnhSiQNpgwiJCYOe/yPS0BC9HkiaozQm6jjAcasWpFtz/dp+w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@ast-grep/napi-win32-arm64-msvc@0.40.5': resolution: {integrity: sha512-y95zSEwc7vhxmcrcH0GnK4ZHEBQrmrszRBNQovzaciF9GUqEcCACNLoBesn4V47IaOp4fYgD2/EhGRTIBFb2Ug==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@ast-grep/napi-win32-ia32-msvc@0.40.0': - resolution: {integrity: sha512-0JkdBZi5l9vZhGEO38A1way0LmLRDU5Vos6MXrLIOVkymmzDTDlCdY394J1LMmmsfwWcyJg6J7Yv2dw41MCxDQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - '@ast-grep/napi-win32-ia32-msvc@0.40.5': resolution: {integrity: sha512-K/u8De62iUnFCzVUs7FBdTZ2Jrgc5/DLHqjpup66KxZ7GIM9/HGME/O8aSoPkpcAeCD4TiTZ11C1i5p5H98hTg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@ast-grep/napi-win32-x64-msvc@0.40.0': - resolution: {integrity: sha512-Hk2IwfPqMFGZt5SRxsoWmGLxBXxprow4LRp1eG6V8EEiJCNHxZ9ZiEaIc5bNvMDBjHVSnqZAXT22dROhrcSKQg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@ast-grep/napi-win32-x64-msvc@0.40.5': resolution: {integrity: sha512-dqm5zg/o4Nh4VOQPEpMS23ot8HVd22gG0eg01t4CFcZeuzyuSgBlOL3N7xLbz3iH2sVkk7keuBwAzOIpTqziNQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@ast-grep/napi@0.40.0': - resolution: {integrity: sha512-tq6nO/8KwUF/mHuk1ECaAOSOlz2OB/PmygnvprJzyAHGRVzdcffblaOOWe90M9sGz5MAasXoF+PTcayQj9TKKA==} - engines: {node: '>= 10'} - '@ast-grep/napi@0.40.5': resolution: {integrity: sha512-hJA62OeBKUQT68DD2gDyhOqJxZxycqg8wLxbqjgqSzYttCMSDL9tiAQ9abgekBYNHudbJosm9sWOEbmCDfpX2A==} engines: {node: '>= 10'} @@ -1721,34 +1659,19 @@ packages: '@aws-crypto/crc32c@5.2.0': resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} - '@aws-crypto/ie11-detection@3.0.0': - resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} - '@aws-crypto/sha1-browser@5.2.0': resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} - '@aws-crypto/sha256-browser@3.0.0': - resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} - '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - '@aws-crypto/sha256-js@3.0.0': - resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} - '@aws-crypto/sha256-js@5.2.0': resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} engines: {node: '>=16.0.0'} - '@aws-crypto/supports-web-crypto@3.0.0': - resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} - '@aws-crypto/supports-web-crypto@5.2.0': resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - '@aws-crypto/util@3.0.0': - resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} - '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} @@ -1756,10 +1679,6 @@ packages: resolution: {integrity: sha512-IpFZAuOMO6rm4y5Dt+QUYfeGrbv5KBHH8fzrKfEO6akCn3ryWMgqMPH/5psmDqf3N2e2LX+lF7+5UdBIhbPBcQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-cloudfront@3.398.0': - resolution: {integrity: sha512-kISKhqN1k48TaMPbLgq9jj7mO2jvbJdhirvfu4JW3jhFhENnkY0oCwTPvR4Q6Ne2as6GFAMo2XZDZq4rxC7YDw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/client-cloudfront@3.984.0': resolution: {integrity: sha512-couDuDLpJtoeWne/nYyJ+I+5ntBVdNgBVRTCoDaXuVV7OC3u/wz5Ps0+GogspEwMLEFoOJ8t691h3YXQtnpQTw==} engines: {node: '>=20.0.0'} @@ -1826,10 +1745,6 @@ packages: peerDependencies: '@aws-sdk/client-sts': ^3.678.0 - '@aws-sdk/client-sso@3.398.0': - resolution: {integrity: sha512-CygL0jhfibw4kmWXG/3sfZMFNjcXo66XUuPC4BqZBk8Rj5vFoxp1vZeMkDLzTIk97Nvo5J5Bh+QnXKhub6AckQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/client-sso@3.678.0': resolution: {integrity: sha512-5Fg2BkR1En8iBbiZ18STvLDGPK9Re5MyCmX+hfIhQzPsEf1FRkAkOluEXX79aBva8iWn2oCD/xKBUku4x3eusw==} engines: {node: '>=16.0.0'} @@ -1838,10 +1753,6 @@ packages: resolution: {integrity: sha512-ci+GiM0c4ULo4D79UMcY06LcOLcfvUfiyt8PzNY0vbt5O8BfCPYf4QomwVgkNcLLCYmroO4ge2Yy1EsLUlcD6g==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sts@3.398.0': - resolution: {integrity: sha512-/3Pa9wLMvBZipKraq3AtbmTfXW6q9kyvhwOno64f1Fz7kFb8ijQFMGoATS70B2pGEZTlxkUqJFWDiisT6Q6dFg==} - engines: {node: '>=14.0.0'} - '@aws-sdk/client-sts@3.678.0': resolution: {integrity: sha512-oRtDnbqIuTbBq0xd7XlaugDA41EqRFzWLpPNr4uwkH8L7xwtIByfJG/qXx2OtOiFFasAhMWJLu/DDqWZyp819A==} engines: {node: '>=16.0.0'} @@ -1879,10 +1790,6 @@ packages: resolution: {integrity: sha512-t9bgu2Kc0H8FdQsSrkIJ42vis0CaVxUlA0wmmNyh268ZZyT9lKXUmf91QIhWbZ1zHx8Ek2u301xusoIaj4mLHA==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-env@3.398.0': - resolution: {integrity: sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-env@3.678.0': resolution: {integrity: sha512-29uhXAB7uJqHtvJ2U3pi1YkMfv0WefW9EmSMoFAunjudXXBVktwTlWg0lyCM+KHrGKLkQyfs5UF/A9IelS8tdQ==} engines: {node: '>=16.0.0'} @@ -1907,10 +1814,6 @@ packages: resolution: {integrity: sha512-4XZ3+Gu5DY8/n8zQFHBgcKTF7hWQl42G6CY9xfXVo2d25FM/lYkpmuzhYopYoPL1ITWkJ2OSBQfYEu5JRfHOhA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.398.0': - resolution: {integrity: sha512-AsK1lStK3nB9Cn6S6ODb1ktGh7SRejsNVQVKX3t5d3tgOaX+aX1Iwy8FzM/ZEN8uCloeRifUGIY9uQFygg5mSw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-ini@3.678.0': resolution: {integrity: sha512-8kHy7V5rRO73EpBCUclykP9T/QIBVi0SkQsc88ZRxpdh59/JY2N6DT5khMTzrz9+Vvlw3FDMJN4AI/qWjJHhdw==} engines: {node: '>=16.0.0'} @@ -1933,10 +1836,6 @@ packages: resolution: {integrity: sha512-OmE/pSkbMM3dCj1HdOnZ5kXnKK+R/Yz+kbBugraBecp0pGAs21eEURfQRz+1N2gzIHLVyGIP1MEjk/uSrFsngg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.398.0': - resolution: {integrity: sha512-odmI/DSKfuWUYeDnGTCEHBbC8/MwnF6yEq874zl6+owoVv0ZsYP8qBHfiJkYqrwg7wQ7Pi40sSAPC1rhesGwzg==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-node@3.678.0': resolution: {integrity: sha512-KGRBVD/oNr/aD+Wy5zc5AjfeSv5b4ahAu5eAUbOz+eGjGpGgrMtjY+R2rDY/3i3wFj9/DvOIfFGeZQMwtDzIuA==} engines: {node: '>=16.0.0'} @@ -1949,10 +1848,6 @@ packages: resolution: {integrity: sha512-9Jwi7aps3AfUicJyF5udYadPypPpCwUZ6BSKr/QjRbVCpRVS1wc+1Q6AEZ/qz8J4JraeRd247pSzyMQSIHVebw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.398.0': - resolution: {integrity: sha512-WrkBL1W7TXN508PA9wRXPFtzmGpVSW98gDaHEaa8GolAPHMPa5t2QcC/z/cFpglzrcVv8SA277zu9Z8tELdZhg==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-process@3.678.0': resolution: {integrity: sha512-5TpzzHKwPOvUJig0bvTt+brtXfLPaSVLwea9re+XGrS5T6Hz65IaX2RL6uY1GQ0UVOqgwQ5nAti1WOfBoSJ5BA==} engines: {node: '>=16.0.0'} @@ -1965,10 +1860,6 @@ packages: resolution: {integrity: sha512-nRxbeOJ1E1gVA0lNQezuMVndx+ZcuyaW/RB05pUsznN5BxykSlH6KkZ/7Ca/ubJf3i5N3p0gwNO5zgPSCzj+ww==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.398.0': - resolution: {integrity: sha512-2Dl35587xbnzR/GGZqA2MnFs8+kS4wbHQO9BioU0okA+8NRueohNMdrdQmQDdSNK4BfIpFspiZmFkXFNyEAfgw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-sso@3.678.0': resolution: {integrity: sha512-PXydLUsLYd1rkhZ7zwf0613u5sofxIEhh7C1QGP1MSY3L1jt8bu7pZIcMzubfvmaGZI5k84aHhhjQEiAJUxIMg==} engines: {node: '>=16.0.0'} @@ -1981,10 +1872,6 @@ packages: resolution: {integrity: sha512-APUccADuYPLL0f2htpM8Z4czabSmHOdo4r41W6lKEZdy++cNJ42Radqy6x4TopENzr3hR6WYMyhiuiqtbf/nAA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.398.0': - resolution: {integrity: sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-web-identity@3.678.0': resolution: {integrity: sha512-fcYZjTTFcef99l+BhcEAhHS4tEK1kE6Xj5Zz5lT4tFA07BkQt3d6kUKRVVfJnsbcHH4RDBUCnLhU8HPfc/kvjA==} engines: {node: '>=16.0.0'} @@ -2039,10 +1926,6 @@ packages: resolution: {integrity: sha512-fB7FNLH1+VPUs0QL3PLrHW+DD4gKu6daFgWtyq3R0Y0Lx8DLZPvyGAxCZNFBxH+M2xt9KvBJX6USwjuqvitmCQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.398.0': - resolution: {integrity: sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-host-header@3.667.0': resolution: {integrity: sha512-Z7fIAMQnPegs7JjAQvlOeWXwpMRfegh5eCoIP6VLJIeR6DLfYKbP35JBtt98R6DXslrN2RsbTogjbxPEDQfw1w==} engines: {node: '>=16.0.0'} @@ -2063,10 +1946,6 @@ packages: resolution: {integrity: sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.398.0': - resolution: {integrity: sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-logger@3.667.0': resolution: {integrity: sha512-PtTRNpNm/5c746jRgZCNg4X9xEJIwggkGJrF0GP9AB1ANg4pc/sF2Fvn1NtqPe9wtQ2stunJprnm5WkCHN7QiA==} engines: {node: '>=16.0.0'} @@ -2079,10 +1958,6 @@ packages: resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.398.0': - resolution: {integrity: sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-recursion-detection@3.667.0': resolution: {integrity: sha512-U5glWD3ehFohzpUpopLtmqAlDurGWo2wRGPNgi4SwhWU7UDt6LS7E/UvJjqC0CUrjlzOw+my2A+Ncf+fisMhxQ==} engines: {node: '>=16.0.0'} @@ -2120,14 +1995,6 @@ packages: resolution: {integrity: sha512-LnzPRRoDXGtlFV2G1p2rsY6fRKrbf6Pvvc21KliSLw3+NmQca2+Aa1QIMRbpQvZYedsSqkGYwxe+qvXwQ2uxDw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-sts@3.398.0': - resolution: {integrity: sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/middleware-signing@3.398.0': - resolution: {integrity: sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-signing@3.664.0': resolution: {integrity: sha512-lKOrS5ZzR43+1XYyeFXcwl2TrteUpuXt3La+qFaLnqtSui8fqacJ+h5Ndx4xC6eNPLl/Sy9Ew6m3MgXm7hPbNg==} engines: {node: '>=16.0.0'} @@ -2140,10 +2007,6 @@ packages: resolution: {integrity: sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.398.0': - resolution: {integrity: sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-user-agent@3.678.0': resolution: {integrity: sha512-tg9cC5COgGP0cznD2ys9kxPtVeKUygPZshDWXLAfA/cH/4m2ZUBvoEVv1SxkIbvOjnPwa976rdPLQUwRZvsL0g==} engines: {node: '>=16.0.0'} @@ -2205,10 +2068,6 @@ packages: resolution: {integrity: sha512-gHTHNUoaOGNrSWkl32A7wFsU78jlNTlqMccLu0byUk5CysYYXaxNMIonIVr4YcykC7vgtDS5ABuz83giy6fzJA==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.398.0': - resolution: {integrity: sha512-nrYgjzavGCKJL/48Vt0EL+OlIc5UZLfNGpgyUW9cv3XZwl+kXV0QB+HH0rHZZLfpbBgZ2RBIJR9uD5ieu/6hpQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/token-providers@3.667.0': resolution: {integrity: sha512-ZecJlG8p6D4UTYlBHwOWX6nknVtw/OBJ3yPXTSajBjhUlj9lE2xvejI8gl4rqkyLXk7z3bki+KR4tATbMaM9yg==} engines: {node: '>=16.0.0'} @@ -2219,10 +2078,6 @@ packages: resolution: {integrity: sha512-cBykL0LiccKIgNhGWvQRTPvsBLPZxnmJU3pYxG538jpFX8lQtrCy1L7mmIHNEdxIdIGEPgAEHF8/JQxgBToqUQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.398.0': - resolution: {integrity: sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/types@3.664.0': resolution: {integrity: sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==} engines: {node: '>=16.0.0'} @@ -2259,10 +2114,6 @@ packages: resolution: {integrity: sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.398.0': - resolution: {integrity: sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/util-endpoints@3.667.0': resolution: {integrity: sha512-X22SYDAuQJWnkF1/q17pkX3nGw5XMD9YEUbmt87vUnRq7iyJ3JOpl6UKOBeUBaL838wA5yzdbinmCITJ/VZ1QA==} engines: {node: '>=16.0.0'} @@ -2287,9 +2138,6 @@ packages: resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-user-agent-browser@3.398.0': - resolution: {integrity: sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==} - '@aws-sdk/util-user-agent-browser@3.675.0': resolution: {integrity: sha512-HW4vGfRiX54RLcsYjLuAhcBBJ6lRVEZd7njfGpAwBB9s7BH8t48vrpYbyA5XbbqbTvXfYBnugQCUw9HWjEa1ww==} @@ -2299,15 +2147,6 @@ packages: '@aws-sdk/util-user-agent-browser@3.972.8': resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} - '@aws-sdk/util-user-agent-node@3.398.0': - resolution: {integrity: sha512-RTVQofdj961ej4//fEkppFf4KXqKGMTCqJYghx3G0C/MYXbg7MGl7LjfNGtJcboRE8pfHHQ/TUWBDA7RIAPPlQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - '@aws-sdk/util-user-agent-node@3.678.0': resolution: {integrity: sha512-bKRemCdHMPAlEYE9KuQiMQG9/b4n8C+9DlJAL/X00Q7Zvm9Gv6h0+i5EZ+Xx8sbHq5oUv9a4W4tb+nkUZ0ltpw==} engines: {node: '>=16.0.0'} @@ -2338,10 +2177,6 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.310.0': - resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/xml-builder@3.972.0': resolution: {integrity: sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==} engines: {node: '>=20.0.0'} @@ -4691,18 +4526,18 @@ packages: '@octokit/types@13.6.1': resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==} - '@opennextjs/aws@3.9.12': - resolution: {integrity: sha512-lA6+ZWr3Qc/AuEJALjdC2sGmPZOKsE+exQ6ihAJBnNGX0X3VsmGRcsk3uKv8lKmZzY78H8JiDZqFp/wXb8XopA==} + '@opennextjs/aws@3.9.16': + resolution: {integrity: sha512-jQQStCysIllNCPqz5W2KSguXpr+ETlOcD8SyNu+h9zwpRVYk4uEPQge+ErG3avI5xsT8vKA7EGLYG59dhj/B6Q==} hasBin: true peerDependencies: - next: ^14.2.35 || ~15.0.7 || ~15.1.11 || ~15.2.8 || ~15.3.8 || ~15.4.10 || ~15.5.9 || ^16.0.10 + next: ~15.0.8 || ~15.1.12 || ~15.2.9 || ~15.3.9 || ~15.4.11 || ~15.5.10 || ~16.0.11 || ^16.1.5 - '@opennextjs/cloudflare@1.15.1': - resolution: {integrity: sha512-fR37Bt/ymoNCU5fX0dZd1P/OdXc0d8QnROUy+Az4Rj+rAbeCI0+sazYnP1NNfhcbHM9dJ2M6HUJBnXzab3Z5Jw==} + '@opennextjs/cloudflare@1.17.1': + resolution: {integrity: sha512-TtmjhXUEpSbnb9kgr7IQtmlQugOeX0cHiLc/e6NYAnmqQVro3yN49WvzaclSGFZod/lJFW7pOJ0NGT6JpqypAw==} hasBin: true peerDependencies: - next: ^14.2.35 || ~15.0.7 || ~15.1.11 || ~15.2.8 || ~15.3.8 || ~15.4.10 || ~15.5.9 || ^16.0.10 - wrangler: ^4.59.2 + next: ~15.0.8 || ~15.1.12 || ~15.2.9 || ~15.3.9 || ~15.4.11 || ~15.5.10 || ~16.0.11 || ^16.1.5 + wrangler: ^4.65.0 '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} @@ -5054,10 +4889,6 @@ packages: resolution: {integrity: sha512-5imgGUlZL4dW4YWdMYAKLmal9ny/tlenM81QZY7xYyb76z9Z/QOg7oM5Ak9HQl8QfFTlGVWwcMXl+54jroRgEQ==} engines: {node: '>=14.0.0'} - '@smithy/abort-controller@2.2.0': - resolution: {integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==} - engines: {node: '>=14.0.0'} - '@smithy/abort-controller@3.1.6': resolution: {integrity: sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==} engines: {node: '>=16.0.0'} @@ -5082,10 +4913,6 @@ packages: resolution: {integrity: sha512-7WD9eZHp46BxAjNGHJLmxhhyeiNWkBdVStd7SUJPUZqQGeIO/REtIrcIfKUfdiHTQ9jyu2SYoqvzqqaFc6987w==} engines: {node: '>=14.0.0'} - '@smithy/config-resolver@2.2.0': - resolution: {integrity: sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==} - engines: {node: '>=14.0.0'} - '@smithy/config-resolver@3.0.10': resolution: {integrity: sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==} engines: {node: '>=16.0.0'} @@ -5110,10 +4937,6 @@ packages: resolution: {integrity: sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@2.3.0': - resolution: {integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==} - engines: {node: '>=14.0.0'} - '@smithy/credential-provider-imds@3.2.5': resolution: {integrity: sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==} engines: {node: '>=16.0.0'} @@ -5168,9 +4991,6 @@ packages: '@smithy/fetch-http-handler@1.1.0': resolution: {integrity: sha512-N22C9R44u5WGlcY+Wuv8EXmCAq62wWwriRAuoczMEwAIjPbvHSthyPSLqI4S7kAST1j6niWg8kwpeJ3ReAv3xg==} - '@smithy/fetch-http-handler@2.5.0': - resolution: {integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==} - '@smithy/fetch-http-handler@3.2.9': resolution: {integrity: sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==} @@ -5189,10 +5009,6 @@ packages: resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@2.2.0': - resolution: {integrity: sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==} - engines: {node: '>=14.0.0'} - '@smithy/hash-node@3.0.8': resolution: {integrity: sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==} engines: {node: '>=16.0.0'} @@ -5209,9 +5025,6 @@ packages: resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@2.2.0': - resolution: {integrity: sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==} - '@smithy/invalid-dependency@3.0.8': resolution: {integrity: sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==} @@ -5247,10 +5060,6 @@ packages: resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@2.2.0': - resolution: {integrity: sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==} - engines: {node: '>=14.0.0'} - '@smithy/middleware-content-length@3.0.10': resolution: {integrity: sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==} engines: {node: '>=16.0.0'} @@ -5263,10 +5072,6 @@ packages: resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@2.5.1': - resolution: {integrity: sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==} - engines: {node: '>=14.0.0'} - '@smithy/middleware-endpoint@3.2.1': resolution: {integrity: sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==} engines: {node: '>=16.0.0'} @@ -5283,10 +5088,6 @@ packages: resolution: {integrity: sha512-lINKYxIvT+W20YFOtHBKeGm7npuJg0/YCoShttU7fVpsmU+a2rdb9zrJn1MHqWfUL6DhTAWGa0tH2O7l4XrDcw==} engines: {node: '>=14.0.0'} - '@smithy/middleware-retry@2.3.1': - resolution: {integrity: sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==} - engines: {node: '>=14.0.0'} - '@smithy/middleware-retry@3.0.25': resolution: {integrity: sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==} engines: {node: '>=16.0.0'} @@ -5299,10 +5100,6 @@ packages: resolution: {integrity: sha512-Y1Rav7m5CFRPQyM4CI0koD/bXjyjJu3EQxZZhtLGD88WIrBrQ7kqXM96ncd6rYnojwOo/u9MXu57JrEvu/nLrA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@2.3.0': - resolution: {integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==} - engines: {node: '>=14.0.0'} - '@smithy/middleware-serde@3.0.8': resolution: {integrity: sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==} engines: {node: '>=16.0.0'} @@ -5319,10 +5116,6 @@ packages: resolution: {integrity: sha512-XynYiIvXNea2BbLcppvpNK0zu8o2woJqgnmxqYTn4FWagH/Hr2QIk8LOsUz7BIJ4tooFhmx8urHKCdlPbbPDCA==} engines: {node: '>=14.0.0'} - '@smithy/middleware-stack@2.2.0': - resolution: {integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==} - engines: {node: '>=14.0.0'} - '@smithy/middleware-stack@3.0.8': resolution: {integrity: sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==} engines: {node: '>=16.0.0'} @@ -5335,10 +5128,6 @@ packages: resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@2.3.0': - resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==} - engines: {node: '>=14.0.0'} - '@smithy/node-config-provider@3.1.9': resolution: {integrity: sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==} engines: {node: '>=16.0.0'} @@ -5355,10 +5144,6 @@ packages: resolution: {integrity: sha512-d3kRriEgaIiGXLziAM8bjnaLn1fthCJeTLZIwEIpzQqe6yPX0a+yQoLCTyjb2fvdLwkMoG4p7THIIB5cj5lkbg==} engines: {node: '>=14.0.0'} - '@smithy/node-http-handler@2.5.0': - resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==} - engines: {node: '>=14.0.0'} - '@smithy/node-http-handler@3.2.5': resolution: {integrity: sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==} engines: {node: '>=16.0.0'} @@ -5371,10 +5156,6 @@ packages: resolution: {integrity: sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@2.2.0': - resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} - engines: {node: '>=14.0.0'} - '@smithy/property-provider@3.1.8': resolution: {integrity: sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==} engines: {node: '>=16.0.0'} @@ -5391,14 +5172,6 @@ packages: resolution: {integrity: sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==} engines: {node: '>=14.0.0'} - '@smithy/protocol-http@2.0.5': - resolution: {integrity: sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==} - engines: {node: '>=14.0.0'} - - '@smithy/protocol-http@3.3.0': - resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==} - engines: {node: '>=14.0.0'} - '@smithy/protocol-http@4.1.5': resolution: {integrity: sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==} engines: {node: '>=16.0.0'} @@ -5415,10 +5188,6 @@ packages: resolution: {integrity: sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA==} engines: {node: '>=14.0.0'} - '@smithy/querystring-builder@2.2.0': - resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==} - engines: {node: '>=14.0.0'} - '@smithy/querystring-builder@3.0.8': resolution: {integrity: sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==} engines: {node: '>=16.0.0'} @@ -5431,10 +5200,6 @@ packages: resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@2.2.0': - resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==} - engines: {node: '>=14.0.0'} - '@smithy/querystring-parser@3.0.8': resolution: {integrity: sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==} engines: {node: '>=16.0.0'} @@ -5451,10 +5216,6 @@ packages: resolution: {integrity: sha512-OCTEeJ1igatd5kFrS2VDlYbainNNpf7Lj1siFOxnRWqYOP9oNvC5HOJBd3t+Z8MbrmehBtuDJ2QqeBsfeiNkww==} engines: {node: '>=14.0.0'} - '@smithy/service-error-classification@2.1.5': - resolution: {integrity: sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==} - engines: {node: '>=14.0.0'} - '@smithy/service-error-classification@3.0.8': resolution: {integrity: sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==} engines: {node: '>=16.0.0'} @@ -5467,10 +5228,6 @@ packages: resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@2.4.0': - resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==} - engines: {node: '>=14.0.0'} - '@smithy/shared-ini-file-loader@3.1.9': resolution: {integrity: sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==} engines: {node: '>=16.0.0'} @@ -5503,10 +5260,6 @@ packages: resolution: {integrity: sha512-j32SGgVhv2G9nBTmel9u3OXux8KG20ssxuFakJrEeDug3kqbl1qrGzVLCe+Eib402UDtA0Sp1a4NZ2SEXDBxag==} engines: {node: '>=14.0.0'} - '@smithy/smithy-client@2.5.1': - resolution: {integrity: sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==} - engines: {node: '>=14.0.0'} - '@smithy/smithy-client@3.4.2': resolution: {integrity: sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==} engines: {node: '>=16.0.0'} @@ -5539,9 +5292,6 @@ packages: resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@2.2.0': - resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==} - '@smithy/url-parser@3.0.8': resolution: {integrity: sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==} @@ -5557,10 +5307,6 @@ packages: resolution: {integrity: sha512-FpYmDmVbOXAxqvoVCwqehUN0zXS+lN8V7VS9O7I8MKeVHdSTsZzlwiMEvGoyTNOXWn8luF4CTDYgNHnZViR30g==} engines: {node: '>=14.0.0'} - '@smithy/util-base64@2.3.0': - resolution: {integrity: sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==} - engines: {node: '>=14.0.0'} - '@smithy/util-base64@3.0.0': resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} engines: {node: '>=16.0.0'} @@ -5573,9 +5319,6 @@ packages: resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@2.2.0': - resolution: {integrity: sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==} - '@smithy/util-body-length-browser@3.0.0': resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} @@ -5587,10 +5330,6 @@ packages: resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@2.3.0': - resolution: {integrity: sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==} - engines: {node: '>=14.0.0'} - '@smithy/util-body-length-node@3.0.0': resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} engines: {node: '>=16.0.0'} @@ -5627,10 +5366,6 @@ packages: resolution: {integrity: sha512-rQ47YpNmF6Is4I9GiE3T3+0xQ+r7RKRKbmHYyGSbyep/0cSf9kteKcI0ssJTvveJ1K4QvwrxXj1tEFp/G2UqxQ==} engines: {node: '>=14.0.0'} - '@smithy/util-config-provider@2.3.0': - resolution: {integrity: sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==} - engines: {node: '>=14.0.0'} - '@smithy/util-config-provider@3.0.0': resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} @@ -5643,10 +5378,6 @@ packages: resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@2.2.1': - resolution: {integrity: sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==} - engines: {node: '>= 10.0.0'} - '@smithy/util-defaults-mode-browser@3.0.25': resolution: {integrity: sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==} engines: {node: '>= 10.0.0'} @@ -5659,10 +5390,6 @@ packages: resolution: {integrity: sha512-Qd/0wCKMaXxev/z00TvNzGCH2jlKKKxXP1aDxB6oKwSQthe3Og2dMhSayGCnsma1bK/kQX1+X7SMP99t6FgiiQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@2.3.1': - resolution: {integrity: sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==} - engines: {node: '>= 10.0.0'} - '@smithy/util-defaults-mode-node@3.0.25': resolution: {integrity: sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==} engines: {node: '>= 10.0.0'} @@ -5731,10 +5458,6 @@ packages: resolution: {integrity: sha512-ygQW5HBqYXpR3ua09UciS0sL7UGJzGiktrKkOuEJwARoUuzz40yaEGU6xd9Gs7KBmAaFC8gMfnghHtwZ2nyBCQ==} engines: {node: '>= 14.0.0'} - '@smithy/util-retry@2.2.0': - resolution: {integrity: sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==} - engines: {node: '>= 14.0.0'} - '@smithy/util-retry@3.0.8': resolution: {integrity: sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==} engines: {node: '>=16.0.0'} @@ -5751,10 +5474,6 @@ packages: resolution: {integrity: sha512-w3lsdGsntaLQIrwDWJkIFKrFscgZXwU/oxsse09aSTNv5TckPhDeYea3LhsDrU5MGAG3vprhVZAKr33S45coVA==} engines: {node: '>=14.0.0'} - '@smithy/util-stream@2.2.0': - resolution: {integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==} - engines: {node: '>=14.0.0'} - '@smithy/util-stream@3.2.1': resolution: {integrity: sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==} engines: {node: '>=16.0.0'} @@ -5807,10 +5526,6 @@ packages: resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@2.2.0': - resolution: {integrity: sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==} - engines: {node: '>=14.0.0'} - '@smithy/util-waiter@3.1.7': resolution: {integrity: sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==} engines: {node: '>=16.0.0'} @@ -7694,10 +7409,6 @@ packages: fast-xml-builder@1.1.4: resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} - fast-xml-parser@4.2.5: - resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} - hasBin: true - fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true @@ -10542,9 +10253,6 @@ packages: typescript: optional: true - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.8.0: resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} @@ -11168,72 +10876,33 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@ast-grep/napi-darwin-arm64@0.40.0': - optional: true - '@ast-grep/napi-darwin-arm64@0.40.5': optional: true - '@ast-grep/napi-darwin-x64@0.40.0': - optional: true - '@ast-grep/napi-darwin-x64@0.40.5': optional: true - '@ast-grep/napi-linux-arm64-gnu@0.40.0': - optional: true - '@ast-grep/napi-linux-arm64-gnu@0.40.5': optional: true - '@ast-grep/napi-linux-arm64-musl@0.40.0': - optional: true - '@ast-grep/napi-linux-arm64-musl@0.40.5': optional: true - '@ast-grep/napi-linux-x64-gnu@0.40.0': - optional: true - '@ast-grep/napi-linux-x64-gnu@0.40.5': optional: true - '@ast-grep/napi-linux-x64-musl@0.40.0': - optional: true - '@ast-grep/napi-linux-x64-musl@0.40.5': optional: true - '@ast-grep/napi-win32-arm64-msvc@0.40.0': - optional: true - '@ast-grep/napi-win32-arm64-msvc@0.40.5': optional: true - '@ast-grep/napi-win32-ia32-msvc@0.40.0': - optional: true - '@ast-grep/napi-win32-ia32-msvc@0.40.5': optional: true - '@ast-grep/napi-win32-x64-msvc@0.40.0': - optional: true - '@ast-grep/napi-win32-x64-msvc@0.40.5': optional: true - '@ast-grep/napi@0.40.0': - optionalDependencies: - '@ast-grep/napi-darwin-arm64': 0.40.0 - '@ast-grep/napi-darwin-x64': 0.40.0 - '@ast-grep/napi-linux-arm64-gnu': 0.40.0 - '@ast-grep/napi-linux-arm64-musl': 0.40.0 - '@ast-grep/napi-linux-x64-gnu': 0.40.0 - '@ast-grep/napi-linux-x64-musl': 0.40.0 - '@ast-grep/napi-win32-arm64-msvc': 0.40.0 - '@ast-grep/napi-win32-ia32-msvc': 0.40.0 - '@ast-grep/napi-win32-x64-msvc': 0.40.0 - '@ast-grep/napi@0.40.5': optionalDependencies: '@ast-grep/napi-darwin-arm64': 0.40.5 @@ -11298,10 +10967,6 @@ snapshots: '@aws-sdk/types': 3.973.6 tslib: 2.8.1 - '@aws-crypto/ie11-detection@3.0.0': - dependencies: - tslib: 1.14.1 - '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 @@ -11311,17 +10976,6 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-crypto/sha256-browser@3.0.0': - dependencies: - '@aws-crypto/ie11-detection': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-crypto/supports-web-crypto': 3.0.0 - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.973.0 - '@aws-sdk/util-locate-window': 3.568.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 - '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 @@ -11332,32 +10986,16 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-crypto/sha256-js@3.0.0': - dependencies: - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.973.0 - tslib: 1.14.1 - '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.973.0 tslib: 2.8.1 - '@aws-crypto/supports-web-crypto@3.0.0': - dependencies: - tslib: 1.14.1 - '@aws-crypto/supports-web-crypto@5.2.0': dependencies: tslib: 2.8.1 - '@aws-crypto/util@3.0.0': - dependencies: - '@aws-sdk/types': 3.973.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 - '@aws-crypto/util@5.2.0': dependencies: '@aws-sdk/types': 3.973.6 @@ -11413,51 +11051,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-cloudfront@3.398.0(aws-crt@1.23.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/credential-provider-node': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/middleware-host-header': 3.398.0 - '@aws-sdk/middleware-logger': 3.398.0 - '@aws-sdk/middleware-recursion-detection': 3.398.0 - '@aws-sdk/middleware-signing': 3.398.0 - '@aws-sdk/middleware-user-agent': 3.398.0 - '@aws-sdk/types': 3.398.0 - '@aws-sdk/util-endpoints': 3.398.0 - '@aws-sdk/util-user-agent-browser': 3.398.0 - '@aws-sdk/util-user-agent-node': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/xml-builder': 3.310.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-retry': 2.2.0 - '@smithy/util-stream': 2.2.0 - '@smithy/util-utf8': 2.3.0 - '@smithy/util-waiter': 2.2.0 - fast-xml-parser: 4.2.5 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-cloudfront@3.984.0(aws-crt@1.23.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -12241,44 +11834,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.398.0(aws-crt@1.23.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.398.0 - '@aws-sdk/middleware-logger': 3.398.0 - '@aws-sdk/middleware-recursion-detection': 3.398.0 - '@aws-sdk/middleware-user-agent': 3.398.0 - '@aws-sdk/types': 3.398.0 - '@aws-sdk/util-endpoints': 3.398.0 - '@aws-sdk/util-user-agent-browser': 3.398.0 - '@aws-sdk/util-user-agent-node': 3.398.0(aws-crt@1.23.0) - '@smithy/config-resolver': 2.2.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-sso@3.678.0(aws-crt@1.23.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -12365,48 +11920,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.398.0(aws-crt@1.23.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/credential-provider-node': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/middleware-host-header': 3.398.0 - '@aws-sdk/middleware-logger': 3.398.0 - '@aws-sdk/middleware-recursion-detection': 3.398.0 - '@aws-sdk/middleware-sdk-sts': 3.398.0 - '@aws-sdk/middleware-signing': 3.398.0 - '@aws-sdk/middleware-user-agent': 3.398.0 - '@aws-sdk/types': 3.398.0 - '@aws-sdk/util-endpoints': 3.398.0 - '@aws-sdk/util-user-agent-browser': 3.398.0 - '@aws-sdk/util-user-agent-node': 3.398.0(aws-crt@1.23.0) - '@smithy/config-resolver': 2.2.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - fast-xml-parser: 4.2.5 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -12539,13 +12052,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-env@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.678.0': dependencies: '@aws-sdk/core': 3.678.0 @@ -12609,21 +12115,6 @@ snapshots: '@smithy/util-stream': 4.5.20 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.398.0(aws-crt@1.23.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.398.0 - '@aws-sdk/credential-provider-process': 3.398.0 - '@aws-sdk/credential-provider-sso': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/credential-provider-web-identity': 3.398.0 - '@aws-sdk/types': 3.398.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-ini@3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0)': dependencies: '@aws-sdk/client-sts': 3.678.0(aws-crt@1.23.0) @@ -12707,22 +12198,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.398.0(aws-crt@1.23.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.398.0 - '@aws-sdk/credential-provider-ini': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/credential-provider-process': 3.398.0 - '@aws-sdk/credential-provider-sso': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/credential-provider-web-identity': 3.398.0 - '@aws-sdk/types': 3.398.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-node@3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0)': dependencies: '@aws-sdk/credential-provider-env': 3.678.0 @@ -12776,14 +12251,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.678.0': dependencies: '@aws-sdk/core': 3.678.0 @@ -12811,18 +12278,6 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.398.0(aws-crt@1.23.0)': - dependencies: - '@aws-sdk/client-sso': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/token-providers': 3.398.0(aws-crt@1.23.0) - '@aws-sdk/types': 3.398.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-sso@3.678.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(aws-crt@1.23.0)': dependencies: '@aws-sdk/client-sso': 3.678.0(aws-crt@1.23.0) @@ -12863,13 +12318,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))': dependencies: '@aws-sdk/client-sts': 3.678.0(aws-crt@1.23.0) @@ -13017,13 +12465,6 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 @@ -13057,12 +12498,6 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 @@ -13081,13 +12516,6 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 @@ -13194,23 +12622,6 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-sts@3.398.0': - dependencies: - '@aws-sdk/middleware-signing': 3.398.0 - '@aws-sdk/types': 3.398.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-signing@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/property-provider': 2.2.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/signature-v4': 2.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-middleware': 2.2.0 - tslib: 2.8.1 - '@aws-sdk/middleware-signing@3.664.0': dependencies: '@aws-sdk/types': 3.664.0 @@ -13233,14 +12644,6 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@aws-sdk/util-endpoints': 3.398.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.678.0': dependencies: '@aws-sdk/core': 3.678.0 @@ -13455,46 +12858,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/token-providers@3.398.0(aws-crt@1.23.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.398.0 - '@aws-sdk/middleware-logger': 3.398.0 - '@aws-sdk/middleware-recursion-detection': 3.398.0 - '@aws-sdk/middleware-user-agent': 3.398.0 - '@aws-sdk/types': 3.398.0 - '@aws-sdk/util-endpoints': 3.398.0 - '@aws-sdk/util-user-agent-browser': 3.398.0 - '@aws-sdk/util-user-agent-node': 3.398.0(aws-crt@1.23.0) - '@smithy/config-resolver': 2.2.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/property-provider': 2.2.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/token-providers@3.667.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0) @@ -13516,11 +12879,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.398.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@aws-sdk/types@3.664.0': dependencies: '@smithy/types': 3.6.0 @@ -13562,11 +12920,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.667.0': dependencies: '@aws-sdk/types': 3.667.0 @@ -13609,13 +12962,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.398.0': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/types': 2.12.0 - bowser: 2.11.0 - tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.675.0': dependencies: '@aws-sdk/types': 3.667.0 @@ -13637,15 +12983,6 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.398.0(aws-crt@1.23.0)': - dependencies: - '@aws-sdk/types': 3.398.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - optionalDependencies: - aws-crt: 1.23.0 - '@aws-sdk/util-user-agent-node@3.678.0(aws-crt@1.23.0)': dependencies: '@aws-sdk/middleware-user-agent': 3.678.0 @@ -13681,10 +13018,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.310.0': - dependencies: - tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.0': dependencies: '@smithy/types': 4.12.0 @@ -15690,10 +15023,10 @@ snapshots: dependencies: '@octokit/openapi-types': 22.2.0 - '@opennextjs/aws@3.9.12(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))': + '@opennextjs/aws@3.9.16(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))': dependencies: '@ast-grep/napi': 0.40.5 - '@aws-sdk/client-cloudfront': 3.398.0(aws-crt@1.23.0) + '@aws-sdk/client-cloudfront': 3.984.0(aws-crt@1.23.0) '@aws-sdk/client-dynamodb': 3.984.0(aws-crt@1.23.0) '@aws-sdk/client-lambda': 3.984.0(aws-crt@1.23.0) '@aws-sdk/client-s3': 3.984.0(aws-crt@1.23.0) @@ -15714,12 +15047,13 @@ snapshots: - aws-crt - supports-color - '@opennextjs/cloudflare@1.15.1(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))(wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0))': + '@opennextjs/cloudflare@1.17.1(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4))(wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0))': dependencies: - '@ast-grep/napi': 0.40.0 + '@ast-grep/napi': 0.40.5 '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 3.9.12(aws-crt@1.23.0)(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)) + '@opennextjs/aws': 3.9.16(next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)) cloudflare: 4.5.0 + comment-json: 4.6.2 enquirer: 2.4.1 glob: 12.0.0 next: 16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.1.4(react@19.1.4))(react@19.1.4) @@ -16010,11 +15344,6 @@ snapshots: '@smithy/types': 1.2.0 tslib: 2.8.1 - '@smithy/abort-controller@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/abort-controller@3.1.6': dependencies: '@smithy/types': 3.6.0 @@ -16046,14 +15375,6 @@ snapshots: '@smithy/util-middleware': 1.1.0 tslib: 2.8.1 - '@smithy/config-resolver@2.2.0': - dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.3.0 - '@smithy/util-middleware': 2.2.0 - tslib: 2.8.1 - '@smithy/config-resolver@3.0.10': dependencies: '@smithy/node-config-provider': 3.1.9 @@ -16117,14 +15438,6 @@ snapshots: '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/credential-provider-imds@2.3.0': - dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - tslib: 2.8.1 - '@smithy/credential-provider-imds@3.2.5': dependencies: '@smithy/node-config-provider': 3.1.9 @@ -16217,14 +15530,6 @@ snapshots: '@smithy/util-base64': 1.1.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@2.5.0': - dependencies: - '@smithy/protocol-http': 3.3.0 - '@smithy/querystring-builder': 2.2.0 - '@smithy/types': 2.12.0 - '@smithy/util-base64': 2.3.0 - tslib: 2.8.1 - '@smithy/fetch-http-handler@3.2.9': dependencies: '@smithy/protocol-http': 4.1.5 @@ -16264,13 +15569,6 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/hash-node@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - '@smithy/hash-node@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -16298,11 +15596,6 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/invalid-dependency@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/invalid-dependency@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -16344,12 +15637,6 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/middleware-content-length@2.2.0': - dependencies: - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/middleware-content-length@3.0.10': dependencies: '@smithy/protocol-http': 4.1.5 @@ -16368,16 +15655,6 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@2.5.1': - dependencies: - '@smithy/middleware-serde': 2.3.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-middleware': 2.2.0 - tslib: 2.8.1 - '@smithy/middleware-endpoint@3.2.1': dependencies: '@smithy/core': 2.5.1 @@ -16421,18 +15698,6 @@ snapshots: tslib: 2.8.1 uuid: 8.3.2 - '@smithy/middleware-retry@2.3.1': - dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/service-error-classification': 2.1.5 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - tslib: 2.8.1 - uuid: 9.0.1 - '@smithy/middleware-retry@3.0.25': dependencies: '@smithy/node-config-provider': 3.1.9 @@ -16469,11 +15734,6 @@ snapshots: '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/middleware-serde@2.3.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/middleware-serde@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -16496,11 +15756,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/middleware-stack@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/middleware-stack@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -16516,13 +15771,6 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/node-config-provider@2.3.0': - dependencies: - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/node-config-provider@3.1.9': dependencies: '@smithy/property-provider': 3.1.8 @@ -16552,14 +15800,6 @@ snapshots: '@smithy/types': 1.2.0 tslib: 2.8.1 - '@smithy/node-http-handler@2.5.0': - dependencies: - '@smithy/abort-controller': 2.2.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/querystring-builder': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/node-http-handler@3.2.5': dependencies: '@smithy/abort-controller': 3.1.6 @@ -16584,11 +15824,6 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/property-provider@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/property-provider@3.1.8': dependencies: '@smithy/types': 3.6.0 @@ -16609,16 +15844,6 @@ snapshots: '@smithy/types': 1.2.0 tslib: 2.8.1 - '@smithy/protocol-http@2.0.5': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - - '@smithy/protocol-http@3.3.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/protocol-http@4.1.5': dependencies: '@smithy/types': 3.6.0 @@ -16640,12 +15865,6 @@ snapshots: '@smithy/util-uri-escape': 1.1.0 tslib: 2.8.1 - '@smithy/querystring-builder@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-uri-escape': 2.2.0 - tslib: 2.8.1 - '@smithy/querystring-builder@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -16664,11 +15883,6 @@ snapshots: '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.0 - '@smithy/querystring-parser@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/querystring-parser@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -16686,10 +15900,6 @@ snapshots: '@smithy/service-error-classification@1.1.0': {} - '@smithy/service-error-classification@2.1.5': - dependencies: - '@smithy/types': 2.12.0 - '@smithy/service-error-classification@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -16702,11 +15912,6 @@ snapshots: dependencies: '@smithy/types': 4.12.0 - '@smithy/shared-ini-file-loader@2.4.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/shared-ini-file-loader@3.1.9': dependencies: '@smithy/types': 3.6.0 @@ -16772,15 +15977,6 @@ snapshots: '@smithy/util-stream': 1.1.0 tslib: 2.8.1 - '@smithy/smithy-client@2.5.1': - dependencies: - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-stack': 2.2.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-stream': 2.2.0 - tslib: 2.8.1 - '@smithy/smithy-client@3.4.2': dependencies: '@smithy/core': 2.5.1 @@ -16831,12 +16027,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/url-parser@2.2.0': - dependencies: - '@smithy/querystring-parser': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/url-parser@3.0.8': dependencies: '@smithy/querystring-parser': 3.0.8 @@ -16860,12 +16050,6 @@ snapshots: '@smithy/util-buffer-from': 1.1.0 tslib: 2.8.1 - '@smithy/util-base64@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - '@smithy/util-base64@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 @@ -16884,10 +16068,6 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/util-body-length-browser@2.2.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-body-length-browser@3.0.0': dependencies: tslib: 2.8.1 @@ -16900,10 +16080,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@2.3.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-body-length-node@3.0.0': dependencies: tslib: 2.8.1 @@ -16945,10 +16121,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-config-provider@2.3.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-config-provider@3.0.0': dependencies: tslib: 2.8.1 @@ -16961,14 +16133,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@2.2.1': - dependencies: - '@smithy/property-provider': 2.2.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - bowser: 2.11.0 - tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@3.0.25': dependencies: '@smithy/property-provider': 3.1.8 @@ -16991,16 +16155,6 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@2.3.1': - dependencies: - '@smithy/config-resolver': 2.2.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/util-defaults-mode-node@3.0.25': dependencies: '@smithy/config-resolver': 3.0.10 @@ -17098,12 +16252,6 @@ snapshots: '@smithy/service-error-classification': 1.1.0 tslib: 2.8.1 - '@smithy/util-retry@2.2.0': - dependencies: - '@smithy/service-error-classification': 2.1.5 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/util-retry@3.0.8': dependencies: '@smithy/service-error-classification': 3.0.8 @@ -17133,17 +16281,6 @@ snapshots: '@smithy/util-utf8': 1.1.0 tslib: 2.8.1 - '@smithy/util-stream@2.2.0': - dependencies: - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-hex-encoding': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - '@smithy/util-stream@3.2.1': dependencies: '@smithy/fetch-http-handler': 4.0.0 @@ -17222,12 +16359,6 @@ snapshots: '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 - '@smithy/util-waiter@2.2.0': - dependencies: - '@smithy/abort-controller': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.8.1 - '@smithy/util-waiter@3.1.7': dependencies: '@smithy/abort-controller': 3.1.6 @@ -19352,10 +18483,6 @@ snapshots: dependencies: path-expression-matcher: 1.2.0 - fast-xml-parser@4.2.5: - dependencies: - strnum: 1.0.5 - fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 @@ -22875,8 +22002,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - tslib@1.14.1: {} - tslib@2.8.0: {} tslib@2.8.1: {} From 3ba5da221075ff4401d625cb1d20a5ca69cc21c8 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sun, 29 Mar 2026 18:40:15 +0200 Subject: [PATCH 27/27] fix test --- packages/cloudflare/src/cli/commands/build.spec.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/cloudflare/src/cli/commands/build.spec.ts b/packages/cloudflare/src/cli/commands/build.spec.ts index d4189e29..1e1572b9 100644 --- a/packages/cloudflare/src/cli/commands/build.spec.ts +++ b/packages/cloudflare/src/cli/commands/build.spec.ts @@ -17,6 +17,13 @@ vi.mock("@opennextjs/aws/logger.js", () => ({ }, })); +// Mock node:module to prevent require.resolve from failing in tests +vi.mock("node:module", () => ({ + createRequire: vi.fn(() => ({ + resolve: vi.fn(() => "/mocked/adapter.js"), + })), +})); + // Mock build implementation vi.mock("../build/build.js", () => ({ build: vi.fn(),