From 674e71700a7ee0513d8c4dac1ffd56a6ddb85e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=A3=E5=85=83=E5=BE=81?= Date: Sat, 16 May 2026 23:04:01 +0800 Subject: [PATCH 1/2] test: add package-level vitest examples for issue-54 --- apps/web-cluster/package.json | 3 +- .../src/cluster/container-metadata.test.ts | 45 +++++++++++++++++++ packages/sdk-recorder/package.json | 3 +- .../sdk-recorder/src/core/mime-types.test.ts | 30 +++++++++++++ packages/web-api-contract/package.json | 3 ++ packages/web-api-contract/src/desktop.test.ts | 25 +++++++++++ packages/web-domain/package.json | 3 +- packages/web-domain/src/utils.test.ts | 24 ++++++++++ 8 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 apps/web-cluster/src/cluster/container-metadata.test.ts create mode 100644 packages/sdk-recorder/src/core/mime-types.test.ts create mode 100644 packages/web-api-contract/src/desktop.test.ts create mode 100644 packages/web-domain/src/utils.test.ts diff --git a/apps/web-cluster/package.json b/apps/web-cluster/package.json index 5c30d80a6ce..58c9bc3964d 100644 --- a/apps/web-cluster/package.json +++ b/apps/web-cluster/package.json @@ -4,7 +4,8 @@ "scripts": { "dev_": "pnpm dotenv -e ../../.env -- concurrently \"deno run --allow-all --watch ./src/runner/index.ts\" \"deno run --allow-all --watch ./src/shard-manager.ts\"", "build": "pnpm run --filter @cap/web-cluster^... build", - "build:docker": "cd ../.. && docker build -f apps/web-cluster/Dockerfile -t ghcr.io/brendonovich/cap-web-cluster:latest ." + "build:docker": "cd ../.. && docker build -f apps/web-cluster/Dockerfile -t ghcr.io/brendonovich/cap-web-cluster:latest .", + "test": "pnpm exec vitest run" }, "dependencies": { "@cap/web-backend": "workspace:*", diff --git a/apps/web-cluster/src/cluster/container-metadata.test.ts b/apps/web-cluster/src/cluster/container-metadata.test.ts new file mode 100644 index 00000000000..fcbf887e720 --- /dev/null +++ b/apps/web-cluster/src/cluster/container-metadata.test.ts @@ -0,0 +1,45 @@ +import { Effect } from "effect"; +import { afterEach, describe, expect, it, vi } from "vitest"; + +import { ContainerMetadata } from "./container-metadata"; + +afterEach(() => { + delete process.env.ECS_CONTAINER_METADATA_URI_V4; + vi.unstubAllGlobals(); + vi.restoreAllMocks(); +}); + +describe("container metadata", () => { + it("falls back to 0.0.0.0 when metadata URI is not configured", async () => { + delete process.env.ECS_CONTAINER_METADATA_URI_V4; + + const ip = await Effect.runPromise( + Effect.gen(function* () { + const metadata = yield* ContainerMetadata; + return metadata.ipAddress; + }).pipe(Effect.provide(ContainerMetadata.Default)), + ); + expect(ip).toBe("0.0.0.0"); + }); + + it("uses ECS metadata endpoint when URI is configured", async () => { + process.env.ECS_CONTAINER_METADATA_URI_V4 = "http://metadata"; + + const fetchMock = vi.fn().mockResolvedValue({ + json: async () => ({ + Containers: [{ Networks: [{ IPv4Addresses: ["10.0.0.7"] }] }], + }), + }); + vi.stubGlobal("fetch", fetchMock); + + const ip = await Effect.runPromise( + Effect.gen(function* () { + const metadata = yield* ContainerMetadata; + return metadata.ipAddress; + }).pipe(Effect.provide(ContainerMetadata.Default)), + ); + + expect(fetchMock).toHaveBeenCalledWith("http://metadata/task"); + expect(ip).toBe("10.0.0.7"); + }); +}); diff --git a/packages/sdk-recorder/package.json b/packages/sdk-recorder/package.json index 7fef2785793..0bca3211ae8 100644 --- a/packages/sdk-recorder/package.json +++ b/packages/sdk-recorder/package.json @@ -20,7 +20,8 @@ ], "scripts": { "build": "tsup", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "test": "pnpm exec vitest run" }, "dependencies": {}, "peerDependencies": { diff --git a/packages/sdk-recorder/src/core/mime-types.test.ts b/packages/sdk-recorder/src/core/mime-types.test.ts new file mode 100644 index 00000000000..f3e3ad665cc --- /dev/null +++ b/packages/sdk-recorder/src/core/mime-types.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it, vi } from "vitest"; + +import { getSupportedMimeType } from "./mime-types"; + +describe("sdk-recorder mime type selection", () => { + it("prioritizes higher quality preferred codecs first", () => { + const isTypeSupported = vi.fn((mimeType: string) => + [ + "video/webm;codecs=vp9,opus", + "video/webm;codecs=vp8,opus", + "video/webm", + ].includes(mimeType), + ); + vi.stubGlobal("MediaRecorder", { isTypeSupported }); + + expect(getSupportedMimeType()).toBe("video/webm;codecs=vp9,opus"); + expect(isTypeSupported).toHaveBeenCalledTimes(1); + expect(isTypeSupported).toHaveBeenCalledWith("video/webm;codecs=vp9,opus"); + + vi.unstubAllGlobals(); + }); + + it("returns empty string when no preferred mime type is supported", () => { + vi.stubGlobal("MediaRecorder", { isTypeSupported: vi.fn(() => false) }); + + expect(getSupportedMimeType()).toBe(""); + + vi.unstubAllGlobals(); + }); +}); diff --git a/packages/web-api-contract/package.json b/packages/web-api-contract/package.json index 9b22385f99e..87707fa9f75 100644 --- a/packages/web-api-contract/package.json +++ b/packages/web-api-contract/package.json @@ -7,5 +7,8 @@ "dependencies": { "@ts-rest/core": "^3.52.1", "zod": "^3.25.76" + }, + "scripts": { + "test": "pnpm exec vitest run" } } diff --git a/packages/web-api-contract/src/desktop.test.ts b/packages/web-api-contract/src/desktop.test.ts new file mode 100644 index 00000000000..b5f83a9bead --- /dev/null +++ b/packages/web-api-contract/src/desktop.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, it } from "vitest"; + +import { OrganizationHexColor, OrganizationLogoUpdate } from "./desktop"; + +describe("desktop API contract schemas", () => { + it("accepts valid org brand hex colors", () => { + expect(OrganizationHexColor.parse("#A1b2C3")).toBe("#A1b2C3"); + }); + + it("rejects invalid org brand hex colors", () => { + expect(() => OrganizationHexColor.parse("#GGGGGG")).toThrow(); + expect(() => OrganizationHexColor.parse("123456")).toThrow(); + }); + + it("validates logo update variants", () => { + expect(OrganizationLogoUpdate.parse({ action: "keep" }).action).toBe("keep"); + expect(() => + OrganizationLogoUpdate.parse({ + action: "upload", + contentType: "image/png", + data: "", + }), + ).toThrow(); + }); +}); diff --git a/packages/web-domain/package.json b/packages/web-domain/package.json index e96e70bc883..4d5313b7b54 100644 --- a/packages/web-domain/package.json +++ b/packages/web-domain/package.json @@ -9,7 +9,8 @@ }, "scripts": { "build": "tsdown", - "generate-openapi": "node scripts/generate-openapi.ts" + "generate-openapi": "node scripts/generate-openapi.ts", + "test": "pnpm exec vitest run" }, "dependencies": { "@effect/platform": "^0.92.1", diff --git a/packages/web-domain/src/utils.test.ts b/packages/web-domain/src/utils.test.ts new file mode 100644 index 00000000000..b28a517c43d --- /dev/null +++ b/packages/web-domain/src/utils.test.ts @@ -0,0 +1,24 @@ +import { Option, Schema } from "effect"; +import { describe, expect, it } from "vitest"; + +import { optional } from "./utils"; + +describe("web-domain optional schema helper", () => { + it("maps nullish values to Option.none and concrete values to Option.some", () => { + const schema = Schema.Struct({ + value: optional(Schema.String), + }); + const decode = Schema.decodeUnknownSync(schema); + + const someValue = decode({ value: "cap" }).value; + const missingValue = decode({}).value; + const noneFromNull = decode({ value: null }).value; + + expect(Option.isSome(someValue)).toBe(true); + if (Option.isSome(someValue)) { + expect(someValue.value).toBe("cap"); + } + expect(missingValue).toBeUndefined(); + expect(Option.isNone(noneFromNull)).toBe(true); + }); +}); From bb3fbf6f36b36359438a527f72eac5305638e907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=A3=E5=85=83=E5=BE=81?= Date: Sun, 17 May 2026 00:02:09 +0800 Subject: [PATCH 2/2] test: add explicit vitest deps and package configs --- apps/web-cluster/package.json | 3 +- apps/web-cluster/vitest.config.ts | 7 +++++ packages/sdk-recorder/package.json | 3 +- packages/sdk-recorder/vitest.config.ts | 7 +++++ packages/web-api-contract/package.json | 3 ++ packages/web-api-contract/vitest.config.ts | 7 +++++ packages/web-domain/package.json | 3 +- packages/web-domain/vitest.config.ts | 7 +++++ pnpm-lock.yaml | 35 +++++++++++++++++++++- 9 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 apps/web-cluster/vitest.config.ts create mode 100644 packages/sdk-recorder/vitest.config.ts create mode 100644 packages/web-api-contract/vitest.config.ts create mode 100644 packages/web-domain/vitest.config.ts diff --git a/apps/web-cluster/package.json b/apps/web-cluster/package.json index 58c9bc3964d..e8284ab8167 100644 --- a/apps/web-cluster/package.json +++ b/apps/web-cluster/package.json @@ -27,6 +27,7 @@ }, "devDependencies": { "concurrently": "^9.2.1", - "dotenv-cli": "^10.0.0" + "dotenv-cli": "^10.0.0", + "vitest": "~2.1.9" } } diff --git a/apps/web-cluster/vitest.config.ts b/apps/web-cluster/vitest.config.ts new file mode 100644 index 00000000000..e92f387befe --- /dev/null +++ b/apps/web-cluster/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + }, +}); diff --git a/packages/sdk-recorder/package.json b/packages/sdk-recorder/package.json index 0bca3211ae8..7f4268fe9b0 100644 --- a/packages/sdk-recorder/package.json +++ b/packages/sdk-recorder/package.json @@ -36,6 +36,7 @@ "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "tsup": "^8.0.0", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "vitest": "~2.1.9" } } diff --git a/packages/sdk-recorder/vitest.config.ts b/packages/sdk-recorder/vitest.config.ts new file mode 100644 index 00000000000..e92f387befe --- /dev/null +++ b/packages/sdk-recorder/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + }, +}); diff --git a/packages/web-api-contract/package.json b/packages/web-api-contract/package.json index 87707fa9f75..d5d14aaf68f 100644 --- a/packages/web-api-contract/package.json +++ b/packages/web-api-contract/package.json @@ -10,5 +10,8 @@ }, "scripts": { "test": "pnpm exec vitest run" + }, + "devDependencies": { + "vitest": "~2.1.9" } } diff --git a/packages/web-api-contract/vitest.config.ts b/packages/web-api-contract/vitest.config.ts new file mode 100644 index 00000000000..e92f387befe --- /dev/null +++ b/packages/web-api-contract/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + }, +}); diff --git a/packages/web-domain/package.json b/packages/web-domain/package.json index 4d5313b7b54..c15b28cebcc 100644 --- a/packages/web-domain/package.json +++ b/packages/web-domain/package.json @@ -19,6 +19,7 @@ "effect": "^3.18.4" }, "devDependencies": { - "@effect/platform-node": "^0.98.3" + "@effect/platform-node": "^0.98.3", + "vitest": "~2.1.9" } } diff --git a/packages/web-domain/vitest.config.ts b/packages/web-domain/vitest.config.ts new file mode 100644 index 00000000000..e92f387befe --- /dev/null +++ b/packages/web-domain/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1003cb70eb..a82e63fc1be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -890,6 +890,9 @@ importers: dotenv-cli: specifier: ^10.0.0 version: 10.0.0 + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) infra: dependencies: @@ -1117,6 +1120,9 @@ importers: typescript: specifier: ^5.7.3 version: 5.8.3 + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) packages/tsconfig: {} @@ -1341,6 +1347,10 @@ importers: zod: specifier: ^3.25.76 version: 3.25.76 + devDependencies: + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) packages/web-api-contract-effect: dependencies: @@ -1429,6 +1439,9 @@ importers: '@effect/platform-node': specifier: ^0.98.3 version: 0.98.3(@effect/cluster@0.50.4(@effect/platform@0.92.1(effect@3.18.4))(@effect/rpc@0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(@effect/sql@0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(@effect/workflow@0.11.3(@effect/platform@0.92.1(effect@3.18.4))(@effect/rpc@0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(effect@3.18.4))(effect@3.18.4))(@effect/platform@0.92.1(effect@3.18.4))(@effect/rpc@0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(@effect/sql@0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(effect@3.18.4) + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) packages: @@ -5736,95 +5749,111 @@ packages: '@react-email/body@0.0.11': resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/button@0.1.0': resolution: {integrity: sha512-fg4LtgTu5zXxaRSly9cuv6sHVF/hi1lElbRaIA8EPx5coWOBhCto6rCPfawcXpaN2oER7rNHUrcNBkI+lz5F9A==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/code-block@0.1.0': resolution: {integrity: sha512-jSpHFsgqnQXxDIssE4gvmdtFncaFQz5D6e22BnVjcCPk/udK+0A9jRwGFEG8JD2si9ZXBmU4WsuqQEczuZn4ww==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/code-inline@0.0.5': resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/column@0.0.13': resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/components@0.1.0': resolution: {integrity: sha512-Rx0eZk0XuzLKXC5NoMm8xuH72ALVsPYNb/BvcdCJx4EZAoVpQISb4sCqpo9blVYVIazNr4MqWroqFb3ZNrCLMQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/container@0.0.15': resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/font@0.0.9': resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/head@0.0.12': resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/heading@0.0.15': resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/hr@0.0.11': resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/html@0.0.11': resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/img@0.0.11': resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/link@0.0.12': resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/markdown@0.0.15': resolution: {integrity: sha512-UQA9pVm5sbflgtg3EX3FquUP4aMBzmLReLbGJ6DZQZnAskBF36aI56cRykDq1o+1jT+CKIK1CducPYziaXliag==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/preview@0.0.13': resolution: {integrity: sha512-F7j9FJ0JN/A4d7yr+aw28p4uX7VLWs7hTHtLo7WRyw4G+Lit6Zucq4UWKRxJC8lpsUdzVmG7aBJnKOT+urqs/w==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -5838,24 +5867,28 @@ packages: '@react-email/row@0.0.12': resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/section@0.0.16': resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/tailwind@1.0.5': resolution: {integrity: sha512-BH00cZSeFfP9HiDASl+sPHi7Hh77W5nzDgdnxtsVr/m3uQD9g180UwxcE3PhOfx0vRdLzQUU8PtmvvDfbztKQg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/text@0.1.5': resolution: {integrity: sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -9074,6 +9107,7 @@ packages: aws-sdk@2.1692.0: resolution: {integrity: sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==} engines: {node: '>= 10.0.0'} + deprecated: The AWS SDK for JavaScript (v2) has reached end-of-support, and no longer receives updates. Please migrate your code to use AWS SDK for JavaScript (v3). More info https://a.co/cUPnyil aws-ssl-profiles@1.1.2: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} @@ -19298,7 +19332,6 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2) - '@leichtgewicht/ip-codec@2.0.5': {} '@logdna/tail-file@2.2.0': {}