From be233e0877da25010b5b1b3284ea620ac054c447 Mon Sep 17 00:00:00 2001 From: Saatvik Arya Date: Sat, 3 Oct 2026 00:10:03 +0530 Subject: [PATCH 1/5] chore(examples): target the Samva 0.8 SDK --- README.md | 10 +++++----- cookbooks/effect-sdk.md | 4 ++-- cookbooks/inbound-email.md | 4 ++-- cookbooks/supabase-auth.md | 2 +- examples/astro-email/package.json | 2 +- examples/better-auth-nextjs/package.json | 2 +- examples/clerk-webhook/package.json | 2 +- examples/effect-sdk/README.md | 2 +- examples/effect-sdk/package.json | 4 ++-- examples/effect-sdk/tsconfig.json | 1 + examples/email-sdk/package.json | 2 +- examples/hono-cloudflare-workers/package.json | 2 +- examples/inbound-email-replies/package.json | 2 +- examples/inbound-email-replies/src/inbound.ts | 2 +- examples/inbound-email-replies/tests/inbound.test.ts | 1 - examples/nextjs-transactional/package.json | 2 +- examples/react-email-samva/package.json | 2 +- examples/supabase-auth-hook/deno.json | 2 +- examples/supabase-auth-hook/package.json | 2 +- examples/sveltekit-transactional/package.json | 2 +- examples/tanstack-start-transactional/package.json | 2 +- package.json | 2 +- packages/better-auth/package.json | 4 ++-- packages/email-sdk/README.md | 2 +- packages/email-sdk/package.json | 4 ++-- 25 files changed, 33 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index dd359a1..e3a84d6 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ templates, handle delivery events, and verify signed webhooks. - `cookbooks/*.md` — documentation-first, copy-pasteable recipes. - `plugins/*` — coding-agent plugins and public documentation. -The maintained integrations target the published Samva 0.5 email SDK. Workspace -packages and examples use `samva@^0.5.0`; copyable external import maps pin -`samva@0.5.0`. +The maintained integrations target the published Samva 0.8 email SDK. Workspace +packages and examples use `samva@^0.8.0`; copyable external import maps pin +`samva@0.8.0`. ## Package integrations @@ -79,8 +79,8 @@ Integrations land as individual pull requests. See form action and raw email endpoint. - [`tanstack-start-transactional`](./examples/tanstack-start-transactional) — TanStack Start server function and server route. -- [`tsx-template-samva`](./examples/tsx-template-samva) — TSX template - authoring and preview with `@samva/vite`. +- [`tsx-template-samva`](./examples/tsx-template-samva) — a `defineTemplate` + email project: check, render, preview, and publish with the Samva CLI. ## Getting started diff --git a/cookbooks/effect-sdk.md b/cookbooks/effect-sdk.md index e7ac20a..fd9b1c3 100644 --- a/cookbooks/effect-sdk.md +++ b/cookbooks/effect-sdk.md @@ -13,11 +13,11 @@ The payload is the same. This cookbook covers the Effect runtime. ## Setup ```sh -bun add samva effect@4.0.0-rc.112 +bun add samva effect@4.0.0-rc.117 ``` Keep `SAMVA_API_KEY` on the server. -Pin Effect 4 to `4.0.0-rc.112` to match the SDK peer dependency exactly. +Pin Effect 4 to `4.0.0-rc.117` to match the SDK peer dependency exactly. Effect 4 is a release candidate. HTTP client modules live under `effect/unstable/http`. `Client.layerFetch` already provides the fetch layer. diff --git a/cookbooks/inbound-email.md b/cookbooks/inbound-email.md index 19107d5..f0df6d1 100644 --- a/cookbooks/inbound-email.md +++ b/cookbooks/inbound-email.md @@ -97,7 +97,7 @@ const sent = await samva.email.send( html: "

Thanks for your reply. We will follow up shortly.

", inReplyToMessageId: reply.messageId, }, - { headers: { "idempotency-key": verified.id } }, + { idempotencyKey: verified.id }, ); ``` @@ -114,7 +114,7 @@ than once, and a transient send failure can be retried. - Keep a durable set of processed webhook ids with a unique constraint. Use `verified.id`, which is stable across retries. -- Pass that id as the `idempotency-key` header on the send. +- Pass that id as the `idempotencyKey` option on the send. - Record completion only after the send succeeds. A failed send stays unprocessed and can be retried. diff --git a/cookbooks/supabase-auth.md b/cookbooks/supabase-auth.md index c415761..9eb97e6 100644 --- a/cookbooks/supabase-auth.md +++ b/cookbooks/supabase-auth.md @@ -30,7 +30,7 @@ For a Supabase Edge Function, map those imports in `deno.json`: "react": "npm:react@19.0.0", "react/jsx-runtime": "npm:react@19.0.0/jsx-runtime", "react-email": "npm:react-email@6.6.5", - "samva": "npm:samva@0.5.0", + "samva": "npm:samva@0.8.0", "standardwebhooks": "npm:standardwebhooks@1.0.0" } } diff --git a/examples/astro-email/package.json b/examples/astro-email/package.json index 48f7db7..b3ed08c 100644 --- a/examples/astro-email/package.json +++ b/examples/astro-email/package.json @@ -14,7 +14,7 @@ "dependencies": { "@astrojs/cloudflare": "^14.0.1", "astro": "^7.0.3", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "devDependencies": { "@astrojs/check": "^0.9.9", diff --git a/examples/better-auth-nextjs/package.json b/examples/better-auth-nextjs/package.json index f52ceff..350a805 100644 --- a/examples/better-auth-nextjs/package.json +++ b/examples/better-auth-nextjs/package.json @@ -16,7 +16,7 @@ "next": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "devDependencies": { "@types/node": "^24.0.0", diff --git a/examples/clerk-webhook/package.json b/examples/clerk-webhook/package.json index b90fee1..3b5d83b 100644 --- a/examples/clerk-webhook/package.json +++ b/examples/clerk-webhook/package.json @@ -16,7 +16,7 @@ "next": "^16.2.9", "react": "^19.2.3", "react-dom": "^19.2.3", - "samva": "^0.5.0", + "samva": "^0.8.0", "server-only": "^0.0.1" }, "devDependencies": { diff --git a/examples/effect-sdk/README.md b/examples/effect-sdk/README.md index 6ca161e..8102bbf 100644 --- a/examples/effect-sdk/README.md +++ b/examples/effect-sdk/README.md @@ -13,7 +13,7 @@ Set `SAMVA_API_KEY` in `.env`. The key must belong to a Samva account with a verified sender. The `from` field is optional; when omitted, Samva sends from the verified sender. -This example pins `effect@4.0.0-rc.112`, matching the current `samva/effect` +This example pins `effect@4.0.0-rc.117`, matching the current `samva/effect` peer dependency. `Client.layerFetch` uses the platform fetch client. ## Send from a script diff --git a/examples/effect-sdk/package.json b/examples/effect-sdk/package.json index 6c42e0b..e3d2f11 100644 --- a/examples/effect-sdk/package.json +++ b/examples/effect-sdk/package.json @@ -12,8 +12,8 @@ "typecheck": "tsgo --noEmit" }, "dependencies": { - "effect": "4.0.0-rc.112", - "samva": "^0.5.0" + "effect": "4.0.0-rc.117", + "samva": "^0.8.0" }, "devDependencies": { "@types/bun": "^1.4.0" diff --git a/examples/effect-sdk/tsconfig.json b/examples/effect-sdk/tsconfig.json index 0d03596..734c3e6 100644 --- a/examples/effect-sdk/tsconfig.json +++ b/examples/effect-sdk/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "lib": ["ESNext", "DOM"], "types": ["bun"] }, "include": ["src"] diff --git a/examples/email-sdk/package.json b/examples/email-sdk/package.json index 8cce702..3c3a1d6 100644 --- a/examples/email-sdk/package.json +++ b/examples/email-sdk/package.json @@ -12,7 +12,7 @@ "dependencies": { "@opencoredev/email-sdk": "^1.1.0", "@samva/email-sdk": "workspace:*", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "devDependencies": { "@types/bun": "^1.4.0" diff --git a/examples/hono-cloudflare-workers/package.json b/examples/hono-cloudflare-workers/package.json index 713bcc5..7914615 100644 --- a/examples/hono-cloudflare-workers/package.json +++ b/examples/hono-cloudflare-workers/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "hono": "^4.12.27", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "devDependencies": { "@cloudflare/workers-types": "^4.20260629.1", diff --git a/examples/inbound-email-replies/package.json b/examples/inbound-email-replies/package.json index edc8d2e..75a11b6 100644 --- a/examples/inbound-email-replies/package.json +++ b/examples/inbound-email-replies/package.json @@ -9,7 +9,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "samva": "^0.5.0" + "samva": "^0.8.0" }, "devDependencies": { "@types/node": "^24.0.0", diff --git a/examples/inbound-email-replies/src/inbound.ts b/examples/inbound-email-replies/src/inbound.ts index 14c0aef..c39fd6a 100644 --- a/examples/inbound-email-replies/src/inbound.ts +++ b/examples/inbound-email-replies/src/inbound.ts @@ -110,7 +110,7 @@ export async function handleInboundReply( html: "

Thanks for your reply. We will follow up shortly.

", inReplyToMessageId: reply.messageId, }, - { headers: { "idempotency-key": verified.id } }, + { idempotencyKey: verified.id }, ); input.processedWebhookIds.add(verified.id); diff --git a/examples/inbound-email-replies/tests/inbound.test.ts b/examples/inbound-email-replies/tests/inbound.test.ts index 77dee7b..9bec1f1 100644 --- a/examples/inbound-email-replies/tests/inbound.test.ts +++ b/examples/inbound-email-replies/tests/inbound.test.ts @@ -68,7 +68,6 @@ const createHarness = ( if (url.pathname.endsWith("/receiving")) { return json({ success: true, - ruleName: "inbound-replies", recipients: ["support@example.com"], }); } diff --git a/examples/nextjs-transactional/package.json b/examples/nextjs-transactional/package.json index 048bfca..73dbcee 100644 --- a/examples/nextjs-transactional/package.json +++ b/examples/nextjs-transactional/package.json @@ -13,7 +13,7 @@ "next": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "samva": "^0.5.0", + "samva": "^0.8.0", "server-only": "^0.0.1" }, "devDependencies": { diff --git a/examples/react-email-samva/package.json b/examples/react-email-samva/package.json index 83cb4f5..543c574 100644 --- a/examples/react-email-samva/package.json +++ b/examples/react-email-samva/package.json @@ -14,7 +14,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-email": "^6.6.5", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/examples/supabase-auth-hook/deno.json b/examples/supabase-auth-hook/deno.json index 9922016..89f2880 100644 --- a/examples/supabase-auth-hook/deno.json +++ b/examples/supabase-auth-hook/deno.json @@ -7,7 +7,7 @@ "react": "npm:react@19.2.7", "react/jsx-runtime": "npm:react@19.2.7/jsx-runtime", "react-email": "npm:react-email@6.6.5", - "samva": "npm:samva@0.5.0", + "samva": "npm:samva@0.8.0", "standardwebhooks": "npm:standardwebhooks@1.0.0" }, "tasks": { diff --git a/examples/supabase-auth-hook/package.json b/examples/supabase-auth-hook/package.json index 71d22ed..e21f876 100644 --- a/examples/supabase-auth-hook/package.json +++ b/examples/supabase-auth-hook/package.json @@ -14,7 +14,7 @@ "react": "^19.2.7", "react-dom": "^19.2.7", "react-email": "^6.6.5", - "samva": "^0.5.0", + "samva": "^0.8.0", "standardwebhooks": "^1.0.0" }, "devDependencies": { diff --git a/examples/sveltekit-transactional/package.json b/examples/sveltekit-transactional/package.json index 79e981b..c6e2fc5 100644 --- a/examples/sveltekit-transactional/package.json +++ b/examples/sveltekit-transactional/package.json @@ -11,7 +11,7 @@ "typecheck": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "samva": "^0.5.0" + "samva": "^0.8.0" }, "devDependencies": { "@sveltejs/adapter-node": "^5.5.7", diff --git a/examples/tanstack-start-transactional/package.json b/examples/tanstack-start-transactional/package.json index a6bc627..d929472 100644 --- a/examples/tanstack-start-transactional/package.json +++ b/examples/tanstack-start-transactional/package.json @@ -16,7 +16,7 @@ "@tanstack/react-start": "^1.168.19", "react": "^19.0.0", "react-dom": "^19.0.0", - "samva": "^0.5.0", + "samva": "^0.8.0", "zod": "^4.4.3" }, "devDependencies": { diff --git a/package.json b/package.json index df8fec4..ae47f10 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@typescript/native-preview": "^7.0.0-dev.20260624.1", "oxfmt": "^0.65.0", "oxlint": "^1.80.0", - "samva": "^0.5.0", + "samva": "^0.8.0", "tegami": "^1.4.0", "tsdown": "^0.22.13", "turbo": "^2.10.12", diff --git a/packages/better-auth/package.json b/packages/better-auth/package.json index 8c740d0..e567a01 100644 --- a/packages/better-auth/package.json +++ b/packages/better-auth/package.json @@ -49,12 +49,12 @@ "devDependencies": { "@react-email/render": "^2.0.0", "better-auth": "^1.7.2", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "peerDependencies": { "@react-email/render": "^2.0.0", "better-auth": "^1.7.2", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "peerDependenciesMeta": { "@react-email/render": { diff --git a/packages/email-sdk/README.md b/packages/email-sdk/README.md index aedc138..131e0d4 100644 --- a/packages/email-sdk/README.md +++ b/packages/email-sdk/README.md @@ -2,7 +2,7 @@ Provider-owned Samva community adapter for [Email SDK](https://email-sdk.dev). It targets `@opencoredev/email-sdk@^1.1.0` -and `samva@^0.5.0`. +and `samva@^0.8.0`. This adapter is maintained by Samva as a community integration; it is not an official built-in Email SDK adapter. diff --git a/packages/email-sdk/package.json b/packages/email-sdk/package.json index 7bd346c..327f5c4 100644 --- a/packages/email-sdk/package.json +++ b/packages/email-sdk/package.json @@ -47,11 +47,11 @@ }, "devDependencies": { "@opencoredev/email-sdk": "^1.1.0", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "peerDependencies": { "@opencoredev/email-sdk": "^1.1.0", - "samva": "^0.5.0" + "samva": "^0.8.0" }, "engines": { "node": ">=22" From 63fcedb8749552f9c0c165ff4737944c02b536a9 Mon Sep 17 00:00:00 2001 From: Saatvik Arya Date: Sat, 3 Oct 2026 00:10:03 +0530 Subject: [PATCH 2/5] fix(email-sdk): report DeliveryUnavailableError as not sent --- .tegami/2026-10-03-align-samva-0.8.md | 12 ++++++++++++ packages/email-sdk/src/failures.ts | 1 + packages/email-sdk/tests/samva.test.ts | 24 ++++++++++++++++++++---- 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 .tegami/2026-10-03-align-samva-0.8.md diff --git a/.tegami/2026-10-03-align-samva-0.8.md b/.tegami/2026-10-03-align-samva-0.8.md new file mode 100644 index 0000000..3089791 --- /dev/null +++ b/.tegami/2026-10-03-align-samva-0.8.md @@ -0,0 +1,12 @@ +--- +packages: + "@samva/better-auth": minor + "@samva/email-sdk": minor +--- + +## Target the Samva 0.8 SDK + +Both packages now target `samva@^0.8.0`. + +`@samva/email-sdk` reports a `DeliveryUnavailableError` (Samva could not hand the send to delivery) +as `delivery: "not_sent"`, so Email SDK can retry it with the same idempotency key. diff --git a/packages/email-sdk/src/failures.ts b/packages/email-sdk/src/failures.ts index e002ae9..d60346d 100644 --- a/packages/email-sdk/src/failures.ts +++ b/packages/email-sdk/src/failures.ts @@ -4,6 +4,7 @@ type ErrorRecord = Record; const knownNotSentTags = new Set([ "ConflictError", + "DeliveryUnavailableError", "EmailChannelError", "FlagDisabledError", "ForbiddenError", diff --git a/packages/email-sdk/tests/samva.test.ts b/packages/email-sdk/tests/samva.test.ts index 74b3846..8372877 100644 --- a/packages/email-sdk/tests/samva.test.ts +++ b/packages/email-sdk/tests/samva.test.ts @@ -303,7 +303,7 @@ describe("samva", () => { [ "rate limit", new RateLimitedError( - { operation: "messages.send", retryAfterSeconds: 10 }, + { retryAfterSeconds: 10 }, { response: new Response(null, { status: 429, @@ -316,7 +316,7 @@ describe("samva", () => { [ "validation", new ValidationError( - { operation: "messages.send", message: "invalid", fields: null }, + { message: "invalid", fields: null }, { response: new Response(null, { status: 422, @@ -335,7 +335,6 @@ describe("samva", () => { "provider transport", new EmailChannelError( { - operation: "messages.send", message: "provider timeout", reason: "transport", statusCode: 503, @@ -357,7 +356,7 @@ describe("samva", () => { [ "ambiguous server", new InternalError( - { operation: "messages.send", message: "server failed" }, + { message: "server failed" }, { response: new Response(null, { status: 500, @@ -385,6 +384,23 @@ describe("samva", () => { delivery: "unknown", }, ], + [ + "delivery unavailable", + { + _tag: "DeliveryUnavailableError", + statusCode: 503, + response: new Response(null, { + status: 503, + headers: { "x-request-id": "request_unavailable" }, + }), + }, + { + status: 503, + requestId: "request_unavailable", + retryable: true, + delivery: "not_sent", + }, + ], [ "onboarding review", { From 360f18ffa1ad992b6674f5e56bdcb55e9fd65abc Mon Sep 17 00:00:00 2001 From: Saatvik Arya Date: Sat, 3 Oct 2026 00:10:03 +0530 Subject: [PATCH 3/5] docs(tsx-templates): author with defineTemplate and the current CLI loop --- bun.lock | 223 ++++++++---------- cookbooks/tsx-templates.md | 163 +++++++++---- examples/tsx-template-samva/.gitignore | 1 + examples/tsx-template-samva/README.md | 70 ++++-- examples/tsx-template-samva/index.html | 11 - examples/tsx-template-samva/package.json | 14 +- examples/tsx-template-samva/starter.css | 24 ++ .../templates/components/line-item.tsx | 14 ++ .../tsx-template-samva/templates/receipt.tsx | 110 +++++++++ .../{emails => templates}/welcome.tsx | 40 ++-- examples/tsx-template-samva/theme.css | 10 +- examples/tsx-template-samva/tsconfig.json | 2 +- examples/tsx-template-samva/vite.config.ts | 9 - 13 files changed, 436 insertions(+), 255 deletions(-) create mode 100644 examples/tsx-template-samva/.gitignore delete mode 100644 examples/tsx-template-samva/index.html create mode 100644 examples/tsx-template-samva/starter.css create mode 100644 examples/tsx-template-samva/templates/components/line-item.tsx create mode 100644 examples/tsx-template-samva/templates/receipt.tsx rename examples/tsx-template-samva/{emails => templates}/welcome.tsx (58%) delete mode 100644 examples/tsx-template-samva/vite.config.ts diff --git a/bun.lock b/bun.lock index 3320b35..9f22269 100644 --- a/bun.lock +++ b/bun.lock @@ -10,7 +10,7 @@ "@typescript/native-preview": "^7.0.0-dev.20260624.1", "oxfmt": "^0.65.0", "oxlint": "^1.80.0", - "samva": "^0.5.0", + "samva": "^0.8.0", "tegami": "^1.4.0", "tsdown": "^0.22.13", "turbo": "^2.10.12", @@ -23,7 +23,7 @@ "dependencies": { "@astrojs/cloudflare": "^14.0.1", "astro": "^7.0.3", - "samva": "^0.5.0", + "samva": "^0.8.0", }, "devDependencies": { "@astrojs/check": "^0.9.9", @@ -41,7 +41,7 @@ "next": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "samva": "^0.5.0", + "samva": "^0.8.0", }, "devDependencies": { "@types/node": "^24.0.0", @@ -60,7 +60,7 @@ "next": "^16.2.9", "react": "^19.2.3", "react-dom": "^19.2.3", - "samva": "^0.5.0", + "samva": "^0.8.0", "server-only": "^0.0.1", }, "devDependencies": { @@ -74,8 +74,8 @@ "name": "effect-sdk-example", "version": "0.0.0", "dependencies": { - "effect": "4.0.0-rc.112", - "samva": "^0.5.0", + "effect": "4.0.0-rc.117", + "samva": "^0.8.0", }, "devDependencies": { "@types/bun": "^1.4.0", @@ -87,7 +87,7 @@ "dependencies": { "@opencoredev/email-sdk": "^1.1.0", "@samva/email-sdk": "workspace:*", - "samva": "^0.5.0", + "samva": "^0.8.0", }, "devDependencies": { "@types/bun": "^1.4.0", @@ -98,7 +98,7 @@ "version": "0.0.0", "dependencies": { "hono": "^4.12.27", - "samva": "^0.5.0", + "samva": "^0.8.0", }, "devDependencies": { "@cloudflare/workers-types": "^4.20260629.1", @@ -110,7 +110,7 @@ "name": "inbound-email-replies-samva", "version": "0.0.0", "dependencies": { - "samva": "^0.5.0", + "samva": "^0.8.0", }, "devDependencies": { "@types/node": "^24.0.0", @@ -125,7 +125,7 @@ "next": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "samva": "^0.5.0", + "samva": "^0.8.0", "server-only": "^0.0.1", }, "devDependencies": { @@ -142,7 +142,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-email": "^6.6.5", - "samva": "^0.5.0", + "samva": "^0.8.0", }, "devDependencies": { "@types/node": "^22.0.0", @@ -157,7 +157,7 @@ "react": "^19.2.7", "react-dom": "^19.2.7", "react-email": "^6.6.5", - "samva": "^0.5.0", + "samva": "^0.8.0", "standardwebhooks": "^1.0.0", }, "devDependencies": { @@ -171,7 +171,7 @@ "name": "sveltekit-transactional-samva", "version": "0.0.0", "dependencies": { - "samva": "^0.5.0", + "samva": "^0.8.0", }, "devDependencies": { "@sveltejs/adapter-node": "^5.5.7", @@ -191,7 +191,7 @@ "@tanstack/react-start": "^1.168.19", "react": "^19.0.0", "react-dom": "^19.0.0", - "samva": "^0.5.0", + "samva": "^0.8.0", "zod": "^4.4.3", }, "devDependencies": { @@ -208,12 +208,13 @@ "name": "tsx-template-samva", "version": "0.0.0", "dependencies": { - "@samva/markup": "^0.6.0", + "@samva/markup": "^0.9.0", }, "devDependencies": { - "@samva/cli": "^0.2.1", - "@samva/vite": "^0.6.0", + "@samva/cli": "^0.5.0", + "@samva/vite": "^0.9.0", "@types/node": "^22.0.0", + "typescript": "^7.0.2", "vite": "^8.2.2", }, }, @@ -223,12 +224,12 @@ "devDependencies": { "@react-email/render": "^2.0.0", "better-auth": "^1.7.2", - "samva": "^0.5.0", + "samva": "^0.8.0", }, "peerDependencies": { "@react-email/render": "^2.0.0", "better-auth": "^1.7.2", - "samva": "^0.5.0", + "samva": "^0.8.0", }, "optionalPeers": [ "@react-email/render", @@ -239,11 +240,11 @@ "version": "0.2.0", "devDependencies": { "@opencoredev/email-sdk": "^1.1.0", - "samva": "^0.5.0", + "samva": "^0.8.0", }, "peerDependencies": { "@opencoredev/email-sdk": "^1.1.0", - "samva": "^0.5.0", + "samva": "^0.8.0", }, }, }, @@ -532,18 +533,6 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="], - - "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w=="], - - "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4", "", { "os": "linux", "cpu": "arm" }, "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw=="], - - "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw=="], - - "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ=="], - - "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4", "", { "os": "win32", "cpu": "x64" }, "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ=="], - "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.3", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q=="], @@ -812,23 +801,23 @@ "@samva/better-auth": ["@samva/better-auth@workspace:packages/better-auth"], - "@samva/cli": ["@samva/cli@0.2.1", "", { "optionalDependencies": { "@samva/cli-darwin-arm64": "0.2.1", "@samva/cli-darwin-x64": "0.2.1", "@samva/cli-linux-arm64": "0.2.1", "@samva/cli-linux-x64": "0.2.1" }, "bin": { "samva": "bin/samva.cjs" } }, "sha512-9if5M770dXlNxWcufRzdr2UXQUVTF3LBXTHnEiajmwA9wikUua7sPQrMnDbRJEDvB3fFd7zkwdubBhdu5Cjztg=="], + "@samva/cli": ["@samva/cli@0.5.0", "", { "optionalDependencies": { "@samva/cli-darwin-arm64": "0.5.0", "@samva/cli-darwin-x64": "0.5.0", "@samva/cli-linux-arm64": "0.5.0", "@samva/cli-linux-x64": "0.5.0" }, "bin": { "samva": "bin/samva.cjs" } }, "sha512-hBbwrAGrrxcnol37/KkWAkwMUnwRgh6otnAx92pA3lAd728wrcjDqeI7MJPHWbrU5hWxOuoTk21K+MmbmAW6OQ=="], - "@samva/cli-darwin-arm64": ["@samva/cli-darwin-arm64@0.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tU7sk6az7+E5PSzcSR4RDl/zXenJigR3UHTug7hWv7LyuAhr/HcaLvI4y4DztZZaLziY0yzNisibGTF68i/RTg=="], + "@samva/cli-darwin-arm64": ["@samva/cli-darwin-arm64@0.5.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z8WBt73tleySx5wNEYoosk+CfMYTYmw5BUAU/Ay9Uw1gIgKf6gLNvXkpdcV9qr7DjBC31Jx2H5G31Mdm6Sv4Tw=="], - "@samva/cli-darwin-x64": ["@samva/cli-darwin-x64@0.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-5w/c9TYB985hR7fd3RLuNo3uvby41+wLDQkrU9Fo9/vMRbgWzW2/x11BNTiTdXs8Of2YnvFw7GIwpOv8qmi02g=="], + "@samva/cli-darwin-x64": ["@samva/cli-darwin-x64@0.5.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-jAjlpz7g/lyeii90KURbYhpAfgU84VtovyrY7pyOriZyjM2c8OElCBlZuI3wfthtjcBv91qOrvyGN8rYzGifuA=="], - "@samva/cli-linux-arm64": ["@samva/cli-linux-arm64@0.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-DNXzdiEnawlVTF+o9aYBjpIbsi5KUR5JuLhTnGo6Ouun2aVIgW7ThEzJR3So8PUhcMtYvetDz0G1KPd+hGJyCg=="], + "@samva/cli-linux-arm64": ["@samva/cli-linux-arm64@0.5.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-5EqmTixnzW3WDCekwvHdnmRodn15KtUL7NRqMlV01MDBaDLEtmvDVDnEP4ys8FKpiSIjubw6vRTJN37ahdd3ow=="], - "@samva/cli-linux-x64": ["@samva/cli-linux-x64@0.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-7xTgVGFZzWoXBQvwfHkKaN0z4gjTO4U15qbnbQCagjyVjgA0h1ju/EgCMynl1VknTFPlztRd2+M49wjkt1S6Yg=="], + "@samva/cli-linux-x64": ["@samva/cli-linux-x64@0.5.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3X+wlIZ5fexD/fa3jMXyvZnx4+olUlAFGvCHFW0uZwq2DslQrdrIAGi5o/1WeaSJcuMzIKtPPCMoZQ6OXm70eg=="], "@samva/email-sdk": ["@samva/email-sdk@workspace:packages/email-sdk"], - "@samva/markup": ["@samva/markup@0.6.0", "", { "dependencies": { "@cfworker/json-schema": "4.1.1", "@standard-schema/spec": "1.1.0", "better-result": "3.0.1" }, "peerDependencies": { "@babel/parser": "^8.0.4", "caniemail": "2.0.2", "css-tree": "3.2.1", "tailwindcss": "^4.3.3" }, "optionalPeers": ["@babel/parser", "caniemail", "css-tree", "tailwindcss"] }, "sha512-4s2Nnfrf0HmvMsDOeAqLyD5TncCHUPxVrWedGPoWj/a8QzUwGdZ8WiafJBay3zx6P2Xu3+LMi7Khp9ooZ+QZNw=="], + "@samva/markup": ["@samva/markup@0.9.0", "", { "dependencies": { "@cfworker/json-schema": "4.1.1", "@standard-schema/spec": "1.1.0", "better-result": "3.0.1" }, "peerDependencies": { "@babel/parser": "^8.0.4", "caniemail": "2.0.2", "css-tree": "3.2.1", "tailwindcss": "^4.3.3" }, "optionalPeers": ["@babel/parser", "caniemail", "css-tree", "tailwindcss"] }, "sha512-jq5slaXow0AD/qD1RY9Wf4UzD9RuDAMyMwcOarHCsV1O0rjvZtW6TdBfzpveB/zyHUZV+ltRKt9co9kp13pl8A=="], - "@samva/vite": ["@samva/vite@0.6.0", "", { "dependencies": { "@babel/parser": "^8.0.4", "@samva/markup": "^0.6.0", "better-result": "3.0.1", "caniemail": "2.0.2", "css-tree": "3.2.1", "tailwindcss": "^4.3.3" }, "peerDependencies": { "vite": "^8.2.2" } }, "sha512-TGBVDt+MEvJnZRW7M8xj+JwIJgELyAVKMlpZrRJBcuEwOv/hYKGrzosYfapqnlwBLNHNdJ4SBeqdbDvHFtL7Xw=="], + "@samva/vite": ["@samva/vite@0.9.0", "", { "dependencies": { "@babel/parser": "^8.0.4", "@samva/markup": "^0.9.0", "caniemail": "2.0.2", "css-tree": "3.2.1", "tailwindcss": "^4.3.3" }, "peerDependencies": { "vite": "^8.2.2" } }, "sha512-CipGO/+t8C7BHVPv/knOOMsDDOhEOvDtzs+CgupGaFeXnhkVcIux26HE/lvy4VMIWXii2fA6SLw0Jth8OFWK+w=="], - "@samva/webhooks": ["@samva/webhooks@0.5.0", "", { "peerDependencies": { "effect": "4.0.0-rc.112" }, "optionalPeers": ["effect"] }, "sha512-rzRsaJO7oi1L4Q82lrDuY5QDD7ladwWXfDRI1ym+6RNx+sv7DWR4DvgMH5WPMRRCzU+heZsa7GHlN4CRj9g4gg=="], + "@samva/webhooks": ["@samva/webhooks@0.8.0", "", { "peerDependencies": { "effect": "4.0.0-rc.117" }, "optionalPeers": ["effect"] }, "sha512-8+ohrzj2kJxQkuRzGjQgbLbmCiLsuLa9Ipf9cXiQMHOY5nD028LwoJkMvN3uTiDuhO+QQGAcfS8PqJfa6swnCA=="], "@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.11.0", "", { "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" } }, "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ=="], @@ -976,6 +965,46 @@ "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20260707.2", "", { "os": "win32", "cpu": "x64" }, "sha512-DL4u27stv0fo71sVhOzHSwE+YMZsbBijVI+kg5dLDLilSH79WFTJ8RSQ46vJrCMt+Gjlv/JOZP1PuLJDfioYeQ=="], + "@typescript/typescript-aix-ppc64": ["@typescript/typescript-aix-ppc64@7.0.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ=="], + + "@typescript/typescript-darwin-arm64": ["@typescript/typescript-darwin-arm64@7.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA=="], + + "@typescript/typescript-darwin-x64": ["@typescript/typescript-darwin-x64@7.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA=="], + + "@typescript/typescript-freebsd-arm64": ["@typescript/typescript-freebsd-arm64@7.0.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ=="], + + "@typescript/typescript-freebsd-x64": ["@typescript/typescript-freebsd-x64@7.0.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw=="], + + "@typescript/typescript-linux-arm": ["@typescript/typescript-linux-arm@7.0.2", "", { "os": "linux", "cpu": "arm" }, "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ=="], + + "@typescript/typescript-linux-arm64": ["@typescript/typescript-linux-arm64@7.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ=="], + + "@typescript/typescript-linux-loong64": ["@typescript/typescript-linux-loong64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ=="], + + "@typescript/typescript-linux-mips64el": ["@typescript/typescript-linux-mips64el@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA=="], + + "@typescript/typescript-linux-ppc64": ["@typescript/typescript-linux-ppc64@7.0.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA=="], + + "@typescript/typescript-linux-riscv64": ["@typescript/typescript-linux-riscv64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ=="], + + "@typescript/typescript-linux-s390x": ["@typescript/typescript-linux-s390x@7.0.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw=="], + + "@typescript/typescript-linux-x64": ["@typescript/typescript-linux-x64@7.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A=="], + + "@typescript/typescript-netbsd-arm64": ["@typescript/typescript-netbsd-arm64@7.0.2", "", { "os": "none", "cpu": "arm64" }, "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA=="], + + "@typescript/typescript-netbsd-x64": ["@typescript/typescript-netbsd-x64@7.0.2", "", { "os": "none", "cpu": "x64" }, "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA=="], + + "@typescript/typescript-openbsd-arm64": ["@typescript/typescript-openbsd-arm64@7.0.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ=="], + + "@typescript/typescript-openbsd-x64": ["@typescript/typescript-openbsd-x64@7.0.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg=="], + + "@typescript/typescript-sunos-x64": ["@typescript/typescript-sunos-x64@7.0.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g=="], + + "@typescript/typescript-win32-arm64": ["@typescript/typescript-win32-arm64@7.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ=="], + + "@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.3", "", {}, "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.5", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA=="], @@ -1232,7 +1261,7 @@ "dts-resolver": ["dts-resolver@3.0.0", "", { "peerDependencies": { "oxc-resolver": ">=11.0.0" }, "optionalPeers": ["oxc-resolver"] }, "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q=="], - "effect": ["effect@4.0.0-rc.112", "", { "dependencies": { "fast-check": "^4.9.0", "msgpackr": "^2.0.5" } }, "sha512-wXxwuh1Ywnv4cPRM3Wfa0vDwuOHnZ1TsTgHJkG9XgzND6inhBH9n1vBxhg3iIXOia/OrpmvVmd3lrD4vq6bF3A=="], + "effect": ["effect@4.0.0-rc.117", "", {}, "sha512-UUyi9QiOW4nySFIBM3KnYbNMd9EZliOdKfBcyLD0mPMPheO2fkuXS5y0opjWc9oqzlJxPQICEGm8gGw3kh9j/w=="], "effect-sdk-example": ["effect-sdk-example@workspace:examples/effect-sdk"], @@ -1278,8 +1307,6 @@ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], - "fast-check": ["fast-check@4.9.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg=="], - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="], @@ -1492,10 +1519,6 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "msgpackr": ["msgpackr@2.0.5", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.4" } }, "sha512-cef05H/dSYpLpqp3sj/qyZh5vhUYCalnaLO7j1yOmpsR0y/XwLVtK7r5gn+U/F7CTEfMowcGhlUQJDLcLf7jcA=="], - - "msgpackr-extract": ["msgpackr-extract@3.0.4", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw=="], - "muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="], "nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], @@ -1518,8 +1541,6 @@ "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], - "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], - "node-mock-http": ["node-mock-http@1.0.5", "", {}, "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw=="], "node-releases": ["node-releases@2.0.53", "", {}, "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="], @@ -1594,8 +1615,6 @@ "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], - "pure-rand": ["pure-rand@8.4.2", "", {}, "sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng=="], - "quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="], "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], @@ -1636,7 +1655,7 @@ "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - "samva": ["samva@0.5.0", "", { "dependencies": { "@samva/webhooks": "0.5.0" }, "peerDependencies": { "effect": "4.0.0-rc.112" }, "optionalPeers": ["effect"] }, "sha512-qtf/EiqPSDwSjXgzjdklPjW+eDMvrBT1nSsviJUvl4tPFd989kLCSzebRCb1UdRGkciG5A/hVjlDhVmZuyudQA=="], + "samva": ["samva@0.8.0", "", { "dependencies": { "@samva/webhooks": "0.8.0" }, "peerDependencies": { "effect": "4.0.0-rc.117" }, "optionalPeers": ["effect"] }, "sha512-mNCetPMSSUQq03/0DuxNyYyGoOV6F5oX2XU7uLBhuLlsOxIl23mLBoLNlQz9yVxZSMnaCzAekZYnF69EfL9BGg=="], "satteri": ["satteri@0.9.5", "", { "dependencies": { "@types/estree-jsx": "^1.0.5", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3" }, "optionalDependencies": { "@bruits/satteri-darwin-arm64": "0.9.5", "@bruits/satteri-darwin-x64": "0.9.5", "@bruits/satteri-linux-arm64-gnu": "0.9.5", "@bruits/satteri-linux-arm64-musl": "0.9.5", "@bruits/satteri-linux-x64-gnu": "0.9.5", "@bruits/satteri-linux-x64-musl": "0.9.5", "@bruits/satteri-wasm32-wasi": "0.9.5", "@bruits/satteri-win32-arm64-msvc": "0.9.5", "@bruits/satteri-win32-x64-msvc": "0.9.5" } }, "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w=="], @@ -1818,7 +1837,7 @@ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], - "vite": ["vite@8.2.1", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.25", "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="], + "vite": ["vite@8.3.0", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ=="], "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], @@ -1906,7 +1925,7 @@ "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], - "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "zod": ["zod@4.6.5", "", {}, "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], @@ -1928,8 +1947,6 @@ "@babel/template/@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="], - "@better-auth/core/zod": ["zod@4.6.5", "", {}, "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q=="], - "@bruits/satteri-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], @@ -1946,8 +1963,6 @@ "@samva/vite/@babel/parser": ["@babel/parser@8.0.6", "", { "dependencies": { "@babel/types": "^8.0.6" }, "bin": "./bin/babel-parser.js" }, "sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg=="], - "@samva/vite/vite": ["vite@8.3.0", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ=="], - "@sveltejs/kit/cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], "@sveltejs/vite-plugin-svelte/magic-string": ["magic-string@1.2.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-ptco+HFxTLgjafSLim2LojBSwfg5feBjd+SqyiwdGkzC38UPdZy3zgrHMI2CoTf5fJL38tbHMYWVzIH8BxGqJw=="], @@ -1976,8 +1991,6 @@ "babel-dead-code-elimination/@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="], - "better-auth/zod": ["zod@4.6.5", "", {}, "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q=="], - "better-call/@better-auth/utils": ["@better-auth/utils@0.5.0", "", { "dependencies": { "@noble/hashes": "^2.0.1" } }, "sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA=="], "better-call/@better-fetch/fetch": ["@better-fetch/fetch@1.3.1", "", {}, "sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g=="], @@ -2026,7 +2039,7 @@ "tsx-template-samva/@types/node": ["@types/node@22.20.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q=="], - "tsx-template-samva/vite": ["vite@8.3.0", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ=="], + "tsx-template-samva/typescript": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="], "unifont/undici": ["undici@8.10.0", "", {}, "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ=="], @@ -2036,7 +2049,11 @@ "unstorage/ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], - "vite/postcss": ["postcss@8.5.26", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="], + "vite/picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], + + "vite/postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], + + "vite/rolldown": ["rolldown@1.2.9", "", { "dependencies": { "@oxc-project/types": "=0.150.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.9", "@rolldown/binding-android-arm64": "1.2.9", "@rolldown/binding-darwin-arm64": "1.2.9", "@rolldown/binding-darwin-x64": "1.2.9", "@rolldown/binding-freebsd-x64": "1.2.9", "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", "@rolldown/binding-linux-arm64-gnu": "1.2.9", "@rolldown/binding-linux-arm64-musl": "1.2.9", "@rolldown/binding-linux-ppc64-gnu": "1.2.9", "@rolldown/binding-linux-s390x-gnu": "1.2.9", "@rolldown/binding-linux-x64-gnu": "1.2.9", "@rolldown/binding-linux-x64-musl": "1.2.9", "@rolldown/binding-openharmony-arm64": "1.2.9", "@rolldown/binding-win32-arm64-msvc": "1.2.9", "@rolldown/binding-win32-x64-msvc": "1.2.9" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg=="], "vscode-css-languageservice/vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], @@ -2058,12 +2075,6 @@ "@samva/vite/@babel/parser/@babel/types": ["@babel/types@8.0.6", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.6", "@babel/helper-validator-identifier": "^8.0.6" } }, "sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A=="], - "@samva/vite/vite/picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], - - "@samva/vite/vite/postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], - - "@samva/vite/vite/rolldown": ["rolldown@1.2.9", "", { "dependencies": { "@oxc-project/types": "=0.150.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.9", "@rolldown/binding-android-arm64": "1.2.9", "@rolldown/binding-darwin-arm64": "1.2.9", "@rolldown/binding-darwin-x64": "1.2.9", "@rolldown/binding-freebsd-x64": "1.2.9", "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", "@rolldown/binding-linux-arm64-gnu": "1.2.9", "@rolldown/binding-linux-arm64-musl": "1.2.9", "@rolldown/binding-linux-ppc64-gnu": "1.2.9", "@rolldown/binding-linux-s390x-gnu": "1.2.9", "@rolldown/binding-linux-x64-gnu": "1.2.9", "@rolldown/binding-linux-x64-musl": "1.2.9", "@rolldown/binding-openharmony-arm64": "1.2.9", "@rolldown/binding-win32-arm64-msvc": "1.2.9", "@rolldown/binding-win32-x64-msvc": "1.2.9" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg=="], - "@tanstack/router-plugin/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], @@ -2232,88 +2243,52 @@ "tsx-template-samva/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], - "tsx-template-samva/vite/picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], - - "tsx-template-samva/vite/postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], - - "tsx-template-samva/vite/rolldown": ["rolldown@1.2.9", "", { "dependencies": { "@oxc-project/types": "=0.150.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.9", "@rolldown/binding-android-arm64": "1.2.9", "@rolldown/binding-darwin-arm64": "1.2.9", "@rolldown/binding-darwin-x64": "1.2.9", "@rolldown/binding-freebsd-x64": "1.2.9", "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", "@rolldown/binding-linux-arm64-gnu": "1.2.9", "@rolldown/binding-linux-arm64-musl": "1.2.9", "@rolldown/binding-linux-ppc64-gnu": "1.2.9", "@rolldown/binding-linux-s390x-gnu": "1.2.9", "@rolldown/binding-linux-x64-gnu": "1.2.9", "@rolldown/binding-linux-x64-musl": "1.2.9", "@rolldown/binding-openharmony-arm64": "1.2.9", "@rolldown/binding-win32-arm64-msvc": "1.2.9", "@rolldown/binding-win32-x64-msvc": "1.2.9" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg=="], - "unstorage/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], "unstorage/h3/crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], - "vscode-languageserver/vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], + "vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.150.0", "", {}, "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw=="], - "vscode-languageserver/vscode-languageserver-protocol/vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], + "vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.9", "", { "os": "android", "cpu": "arm64" }, "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg=="], - "@samva/vite/@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@8.0.6", "", {}, "sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA=="], + "vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw=="], - "@samva/vite/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.6", "", {}, "sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ=="], + "vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw=="], - "@samva/vite/vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.150.0", "", {}, "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw=="], + "vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g=="], - "@samva/vite/vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.9", "", { "os": "android", "cpu": "arm64" }, "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg=="], + "vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.9", "", { "os": "linux", "cpu": "arm" }, "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw=="], - "@samva/vite/vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw=="], + "vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw=="], - "@samva/vite/vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw=="], + "vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA=="], - "@samva/vite/vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g=="], + "vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw=="], - "@samva/vite/vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.9", "", { "os": "linux", "cpu": "arm" }, "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw=="], + "vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ=="], - "@samva/vite/vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw=="], + "vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q=="], - "@samva/vite/vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA=="], + "vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ=="], - "@samva/vite/vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw=="], + "vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.9", "", { "os": "none", "cpu": "arm64" }, "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg=="], - "@samva/vite/vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ=="], + "vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww=="], - "@samva/vite/vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q=="], + "vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.9", "", { "os": "win32", "cpu": "x64" }, "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g=="], - "@samva/vite/vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ=="], + "vscode-languageserver/vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], - "@samva/vite/vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.9", "", { "os": "none", "cpu": "arm64" }, "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg=="], + "vscode-languageserver/vscode-languageserver-protocol/vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], - "@samva/vite/vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww=="], + "@samva/vite/@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@8.0.6", "", {}, "sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA=="], - "@samva/vite/vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.9", "", { "os": "win32", "cpu": "x64" }, "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g=="], + "@samva/vite/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.6", "", {}, "sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ=="], "miniflare/sharp/@img/sharp-freebsd-wasm32/@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.2", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw=="], "miniflare/sharp/@img/sharp-webcontainers-wasm32/@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.2", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw=="], - - "tsx-template-samva/vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.150.0", "", {}, "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.9", "", { "os": "android", "cpu": "arm64" }, "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.9", "", { "os": "linux", "cpu": "arm" }, "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.9", "", { "os": "none", "cpu": "arm64" }, "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww=="], - - "tsx-template-samva/vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.9", "", { "os": "win32", "cpu": "x64" }, "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g=="], } } diff --git a/cookbooks/tsx-templates.md b/cookbooks/tsx-templates.md index 5b0f980..289a778 100644 --- a/cookbooks/tsx-templates.md +++ b/cookbooks/tsx-templates.md @@ -1,105 +1,164 @@ # TSX email templates -Samva email templates are ordinary TSX projects. You author the source, preview -it locally, and publish an immutable publication that sends render. The -`samva-integrations` [`tsx-template-samva`](../examples/tsx-template-samva/) -example is the runnable version of this page. +Samva email templates are ordinary TSX projects. You author the source, check and preview it +locally, push it to Git, and publish an immutable publication that sends render. The +`samva-integrations` [`tsx-template-samva`](../examples/tsx-template-samva/) example is the runnable +version of this page. ## Install the authoring toolchain ```sh -bun add @samva/markup @samva/vite vite -bun add --dev @samva/cli +bun add @samva/markup +bun add --dev @samva/cli @samva/vite vite typescript ``` -The `samva` executable comes from `@samva/cli`; run it through your package -runner so the local install resolves. +The `samva` executable comes from `@samva/cli`; run it through your package runner so the local +install resolves. The CLI loads the compiler and editor your project installs, so the project's +lockfile pins the version that previews, checks, and builds use. Commit that lockfile (Bun text +lockfile v2 or npm lockfile v3); hosted builds consume the locked graph and verify package +integrity. -Set `jsx: "react-jsx"` and `jsxImportSource: "@samva/markup/email"` in -`tsconfig.json`. A template module default-exports `defineEmail({ id, schema, -fixtures, render })` from `@samva/markup/template`; `render` receives validated -JSON and returns the subject, optional preheader, body, and optional text. +To start from the canonical project instead, run `samva templates init --name "Welcome email" +--dir welcome-email`. It creates a Samva-managed project and clones its Git repository. -```tsx title="emails/welcome.tsx" +Set `jsx: "react-jsx"` and `jsxImportSource: "@samva/markup/email"` in `tsconfig.json`. + +## Write a template + +A template is one `.tsx` file in `templates/` that default-exports `defineTemplate` from +`@samva/markup`: a project-unique kebab-case `id`, a JSON Schema input contract, named fixtures, +and an `email` channel of functions of the input. + +```tsx title="templates/welcome.tsx" /** @jsxImportSource @samva/markup/email */ +import { defineTemplate } from "@samva/markup"; import { Email, Section } from "@samva/markup/email/components"; import { jsonSchema } from "@samva/markup/input-schema"; -import { defineEmail } from "@samva/markup/template"; -export default defineEmail({ +export default defineTemplate({ id: "welcome", - schema: jsonSchema<{ firstName: string }>({ + schema: jsonSchema<{ firstName: string; workspace: string }>({ type: "object", - properties: { firstName: { type: "string" } }, - required: ["firstName"], + properties: { + firstName: { type: "string" }, + workspace: { type: "string" }, + }, + required: ["firstName", "workspace"], additionalProperties: false, }), - fixtures: { default: { firstName: "Ada" } }, - render: (input) => ({ - subject: `Welcome, ${input.firstName}`, - body: ( + fixtures: { + default: { firstName: "Ada", workspace: "Acme" }, + }, + email: { + subject: (input) => `Welcome to ${input.workspace}`, + preheader: (input) => `Welcome aboard, ${input.firstName}`, + body: (input) => (

Welcome, {input.firstName}

), - }), + }, }); ``` -Template ids are unique within the project and independent of the file name. -Imported helper modules are ordinary modules and stay out of the catalog. - -## Preview in the editor - -```ts title="vite.config.ts" -import { samvaEditor } from "@samva/vite"; -import { defineConfig } from "vite"; - -export default defineConfig({ plugins: [samvaEditor({ templatesDir: "emails" })] }); +`subject` and `preheader` belong to the `email` channel, not to ``. Plain text is derived +from the body. Every fixture is checked against the schema, and actual send input is validated +against the immutable publication schema. + +## Stay inside the static profile + +The compiler reads the file and never runs it, so nothing computes at send time. A body can: + +- bind input values (`{input.name}`, `href={input.url}`) and build template strings; +- branch with `&&` and `?:`, using `===`, `!==`, `<`, `>`, `!`, `||` and `.length`; +- map over input lists with `.map`, and filter first with `.filter(...)`; +- format with `fmt.money`, `fmt.number`, `fmt.date`, `fmt.time`, `fmt.plural` and `fmt.list`, + imported from `@samva/markup/fmt`; +- call partials: functions from props to JSX in other project files. + +```tsx title="templates/receipt.tsx (body)" + + {input.items.length > 0 ? ( + input.items.map((item) =>

{item.name}

) + ) : ( +

Nothing in this order.

+ )} +

Total {fmt.money(input.total, input.currency)}

+ {input.receiptUrl && } +
``` -Run `vite` and open `http://localhost:5173/`. Choose a fixture to render -concrete input; supported visual edits update the authored TSX. +Any other call, statement, hook, or import is a diagnostic with a stable code, a +`file:line:column` location, and a fix. Only `@samva/markup` and files in the project can be +imported. Compute the value in the caller and send it in the input. Read an optional field only +inside a guard. Locale and time zone are send options, not schema fields. + +Style with Tailwind classes. `theme.css` holds the project tokens and layers by `@import`; an +organization brand arrives with `@import "samva:brand";`. -## Check, commit, and publish +## Check, render, preview ```sh bunx samva templates check +bunx samva templates render receipt --fixture default +bunx samva templates snapshot receipt --fixture default +bunx samva templates dev ``` -`check` runs the no-write TypeScript gate and executes the declared fixtures. -Commit the project with a supported lockfile (Bun text lockfile v2 or npm -lockfile v3); hosted builds consume that locked graph and verify package -integrity. Push the checked source, then publish an exact commit: +`check` type-checks, compiles every template, and renders every fixture, with `--watch` for a +continuous gate. `render` prints a fixture's subject, preheader and plain text (`--format html` for +the markup). `snapshot` writes desktop and mobile PNGs, light and dark, to `.samva/snapshots`, and +needs `playwright` or a system Chrome. `dev` starts the local visual editor with no +`vite.config.ts`; keep `.samva` gitignored. `@samva/vite` stays in the project because the CLI +loads it, and its `samvaEditor()` plugin is for custom Vite setups. + +Preview is a structural canvas, not an exact Gmail, Outlook, Apple Mail, or Yahoo renderer. + +## Commit and publish ```sh +git add . +git commit -m "feat: add the receipt email" +git push origin main bunx samva templates publish --commit HEAD ``` -Publishing pins the project, commit, and entry path and returns an immutable -receipt. Generated HTML and delivery artifacts are not source files. +A project holds several emails: `samva templates add templates/receipt.tsx` registers a new entry +under its `defineTemplate` id, and `samva templates publish --all` publishes every active entry at +one commit. Publishing pins the project, commit, and entry path and returns an immutable receipt; it +does not push or rewrite history. A pushed commit also reaches the hosted editor and agents on the +next workspace open. ## Send a published template -A template send renders the template's current publication unless you name one. -Inline content and a template are exclusive: pass `templateId`/`templateSlug` -with `templateData` and omit inline `subject`/`html`/`text`. +A template send renders the template's current publication unless you name one. Inline content and +a template are exclusive: pass `templateId` or `templateSlug` with `templateData` and omit inline +`subject`/`html`/`text`. ```ts await samva.email.send({ to: "ada@example.com", - templateId: "tmpl_7q2xk9mvt4znw8rh", - inputContractId: "tcon_7q2xk9mvt4znw8rh", - templateData: { firstName: "Ada" }, + templateSlug: "welcome", + templateData: { firstName: "Ada", workspace: "Acme" }, + locale: "en-US", + timeZone: "America/New_York", }); ``` - `publicationId` pins one exact publication forever. - `inputContractId` follows new publications while the input shape stays put. -- Naming both `publicationId` and `inputContractId` is rejected. +- Naming both `publicationId` and `inputContractId` is rejected, and each requires `templateId`. +- `locale` and `timeZone` format `fmt.*` output for the recipient. + +Generate the input types for your application from the template catalog: + +```sh +bunx samva templates types --out src/samva-templates.ts +``` + +`--check` exits `1` when the file no longer describes the catalog. -See the runnable [`tsx-template-samva`](../examples/tsx-template-samva/) -example for the full project, and the -[email templates docs](https://samva.dev/docs) for the template API surface. +See the runnable [`tsx-template-samva`](../examples/tsx-template-samva/) example for the full +project, and the [email templates docs](https://samva.dev/docs) for the template API surface. diff --git a/examples/tsx-template-samva/.gitignore b/examples/tsx-template-samva/.gitignore new file mode 100644 index 0000000..8def8f4 --- /dev/null +++ b/examples/tsx-template-samva/.gitignore @@ -0,0 +1 @@ +.samva diff --git a/examples/tsx-template-samva/README.md b/examples/tsx-template-samva/README.md index 752b9d8..17f54e1 100644 --- a/examples/tsx-template-samva/README.md +++ b/examples/tsx-template-samva/README.md @@ -1,44 +1,66 @@ -# TSX template +# TSX templates -Author a Samva email as an ordinary TSX project and preview it in the -`@samva/vite` editor. The shipped SDK for this example is the same pinned -toolchain a customer installs: `@samva/markup@^0.6.0` and -`@samva/vite@^0.6.0`. - -## Run the editor +Author Samva emails as an ordinary TSX project: two `defineTemplate` entries, a project theme, and +the Samva CLI loop for checking, rendering, previewing, and publishing them. The project pins +`@samva/markup@^0.9.0`, `@samva/vite@^0.9.0`, and `@samva/cli@^0.5.0`, the toolchain a customer +installs. ```sh bun install bun run dev ``` -Open `http://localhost:5173/`, pick a fixture, and edit `emails/welcome.tsx`. -Supported visual edits update the authored TSX; source stays canonical. +`bun run dev` runs `samva templates dev`, the local visual editor. It needs no `vite.config.ts`. +Open the URL it prints, choose a fixture, and edit `templates/welcome.tsx`; supported visual edits +update the authored TSX. ## Structure ```text -emails/welcome.tsx defineEmail({ id, schema, fixtures, render }) -theme.css Tailwind v4 @theme project tokens -vite.config.ts samvaEditor({ templatesDir: "emails" }) +templates/welcome.tsx the starter's one-email entry +templates/receipt.tsx .map, &&, ?: and fmt.money in the static profile +templates/components/line-item.tsx a partial: props to JSX, inlined by the compiler +starter.css the project's look as Tailwind v4 theme variables +theme.css imports starter.css; its own @theme overrides win +``` + +A template default-exports `defineTemplate({ id, schema, fixtures, email })`. The `email` channel +holds `subject`, an optional `preheader`, and the `body`. The compiler reads the file and never runs +it, so a body binds input values, uses `&&` and `?:`, maps over input lists, and calls `fmt.*`; +compute anything else in the caller and send it in the input. Only `@samva/markup` and files in +this project can be imported. + +## Check, render, look + +```sh +bunx samva templates check +bunx samva templates render receipt --fixture default +bunx samva templates render welcome --fixture team --format html +bunx samva templates snapshot welcome --fixture default ``` -`render` receives validated JSON and returns the subject, optional preheader, -body, and optional plain text. Helpers are separate modules and stay out of the -template catalog. `bun run typecheck` is the no-write gate; publication is a -separate, explicit action. +`check` type-checks, compiles every template, and renders every fixture; it exits `1` with located +findings when a template leaves the static profile or a fixture breaks the schema. `render` prints a +fixture's subject, preheader, and plain-text body. `snapshot` writes desktop and mobile PNGs, light +and dark, to `.samva/snapshots`, and needs `playwright` in the project or a system Chrome. +`bun run typecheck` is the TypeScript-only gate, and `bun run build` writes the compiled artifact to +`dist/templates.json`. ## Publish and send -Install the CLI (`bun add --dev @samva/cli`) so the `samva` executable resolves. -`bunx samva templates check` executes the declared fixtures without writing. -Publishing and sending a template are API actions owned by the CLI and SDK, not -by this preview: +Connect the project to a Samva-managed Git repository with `samva templates init`, then push and +publish the exact commit: ```sh -bunx samva templates check -bunx samva templates publish +git push origin main +bunx samva templates publish --commit HEAD +``` + +Generate typed inputs for the application that sends them: + +```sh +bunx samva templates types --out src/samva-templates.ts ``` -See the [TSX template authoring cookbook](../../cookbooks/tsx-templates.md) for -the revision-safe publish and template-send flow. +See the [TSX template authoring cookbook](../../cookbooks/tsx-templates.md) for the full loop and +the template-send call. diff --git a/examples/tsx-template-samva/index.html b/examples/tsx-template-samva/index.html deleted file mode 100644 index b300093..0000000 --- a/examples/tsx-template-samva/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Samva TSX template - - -
- - diff --git a/examples/tsx-template-samva/package.json b/examples/tsx-template-samva/package.json index 1ba5090..791641d 100644 --- a/examples/tsx-template-samva/package.json +++ b/examples/tsx-template-samva/package.json @@ -2,20 +2,22 @@ "name": "tsx-template-samva", "version": "0.0.0", "private": true, - "description": "Author a Samva TSX email template and preview it with the @samva/vite editor.", + "description": "Author, check, render, and preview Samva email templates written with defineTemplate.", "type": "module", "scripts": { - "dev": "vite", - "build": "vite build", + "dev": "samva templates dev", + "check": "samva templates check", + "build": "samva templates build --out dist/templates.json", "typecheck": "tsgo --noEmit" }, "dependencies": { - "@samva/markup": "^0.6.0" + "@samva/markup": "^0.9.0" }, "devDependencies": { - "@samva/cli": "^0.2.1", - "@samva/vite": "^0.6.0", + "@samva/cli": "^0.5.0", + "@samva/vite": "^0.9.0", "@types/node": "^22.0.0", + "typescript": "^7.0.2", "vite": "^8.2.2" } } diff --git a/examples/tsx-template-samva/starter.css b/examples/tsx-template-samva/starter.css new file mode 100644 index 0000000..71db604 --- /dev/null +++ b/examples/tsx-template-samva/starter.css @@ -0,0 +1,24 @@ +/* This starter's look. Every color and font in templates/ reads these theme variables; a brand imported after + * this file in theme.css replaces the ones it sets, and theme.css's own @theme overrides both. */ +@theme { + --color-brand: #4f46e5; + --color-brand-dark: #a5b4fc; + --color-brand-foreground: #ffffff; + --color-brand-foreground-dark: #0b0d10; + --color-accent: #4f46e5; + --color-accent-dark: #a5b4fc; + --color-background: #f3f4f6; + --color-background-dark: #111827; + --color-surface: #ffffff; + --color-surface-dark: #1f2937; + --color-foreground: #111827; + --color-foreground-dark: #ffffff; + --color-muted: #374151; + --color-muted-dark: #e5e7eb; + --color-border: #e5e7eb; + --color-border-dark: #374151; + --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --font-heading: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --radius-button: 6px; + --radius-card: 12px; +} diff --git a/examples/tsx-template-samva/templates/components/line-item.tsx b/examples/tsx-template-samva/templates/components/line-item.tsx new file mode 100644 index 0000000..5e07886 --- /dev/null +++ b/examples/tsx-template-samva/templates/components/line-item.tsx @@ -0,0 +1,14 @@ +/** @jsxImportSource @samva/markup/email */ +import { fmt } from "@samva/markup/fmt"; + +/** A partial: a function from props to JSX in a project file. The compiler inlines it. */ +export const LineItem = (props: { + name: string; + quantity: number; + price: number; + currency: string; +}) => ( +

+ {props.quantity} × {props.name}: {fmt.money(props.price * props.quantity, props.currency)} +

+); diff --git a/examples/tsx-template-samva/templates/receipt.tsx b/examples/tsx-template-samva/templates/receipt.tsx new file mode 100644 index 0000000..a632e00 --- /dev/null +++ b/examples/tsx-template-samva/templates/receipt.tsx @@ -0,0 +1,110 @@ +/** @jsxImportSource @samva/markup/email */ +import { defineTemplate } from "@samva/markup"; +import { Button, Email, Section } from "@samva/markup/email/components"; +import { fmt } from "@samva/markup/fmt"; +import { jsonSchema } from "@samva/markup/input-schema"; + +import { LineItem } from "./components/line-item"; + +/** + * A second entry in the same project. The body stays inside the static + * profile: `.map`, `&&`, `?:`, template strings, and `fmt.*` formatters. Anything + * else is computed by the caller and sent in the input. + */ +export default defineTemplate({ + id: "receipt", + schema: jsonSchema<{ + name: string; + currency: string; + items: { name: string; quantity: number; price: number }[]; + total: number; + receiptUrl?: string; + }>({ + type: "object", + properties: { + name: { type: "string" }, + currency: { type: "string" }, + items: { + type: "array", + items: { + type: "object", + properties: { + name: { type: "string" }, + quantity: { type: "number" }, + price: { type: "number" }, + }, + required: ["name", "quantity", "price"], + additionalProperties: false, + }, + }, + total: { type: "number" }, + receiptUrl: { type: "string" }, + }, + required: ["name", "currency", "items", "total"], + additionalProperties: false, + }), + fixtures: { + default: { + name: "Maya", + currency: "USD", + items: [ + { name: "Tea", quantity: 2, price: 4.5 }, + { name: "Coffee", quantity: 1, price: 6 }, + ], + total: 15, + receiptUrl: "https://app.example.com/receipts/1042", + }, + "no-link": { + name: "Sam", + currency: "USD", + items: [{ name: "Tea", quantity: 1, price: 4.5 }], + total: 4.5, + }, + empty: { name: "Ada", currency: "USD", items: [], total: 0 }, + }, + email: { + subject: (input) => `Your receipt: ${fmt.money(input.total, input.currency)}`, + body: (input) => ( + +
+

+ Thanks, {input.name} +

+ {input.items.length > 0 ? ( + input.items.map((item) => ( + + )) + ) : ( +

Nothing in this order.

+ )} +

+ Total {fmt.money(input.total, input.currency)} +

+ {input.receiptUrl && ( + + )} +
+
+ ), + }, +}); diff --git a/examples/tsx-template-samva/emails/welcome.tsx b/examples/tsx-template-samva/templates/welcome.tsx similarity index 58% rename from examples/tsx-template-samva/emails/welcome.tsx rename to examples/tsx-template-samva/templates/welcome.tsx index 77af8c6..8dbe72f 100644 --- a/examples/tsx-template-samva/emails/welcome.tsx +++ b/examples/tsx-template-samva/templates/welcome.tsx @@ -1,14 +1,10 @@ /** @jsxImportSource @samva/markup/email */ +import { defineTemplate } from "@samva/markup"; import { Button, Email, Section } from "@samva/markup/email/components"; import { jsonSchema } from "@samva/markup/input-schema"; -import { defineEmail } from "@samva/markup/template"; -/** - * One ordinary TSX email entry. The stable id is project-unique; the schema is - * the input contract, fixtures drive previews, and render receives validated - * JSON and returns the subject, optional preheader, body, and optional text. - */ -export default defineEmail({ +/** The canonical one-email starter entry. */ +export default defineTemplate({ id: "welcome", schema: jsonSchema<{ firstName: string; @@ -36,30 +32,36 @@ export default defineEmail({ ctaUrl: "https://app.example.com/team", }, }, - render: (input) => ({ - subject: `Welcome to ${input.workspace}`, - preheader: `Welcome aboard, ${input.firstName}`, - body: ( - + email: { + subject: (input) => `Welcome to ${input.workspace}`, + preheader: (input) => `Welcome aboard, ${input.firstName}`, + body: (input) => ( +
-

+

Welcome, {input.firstName}

-

+

Thanks for joining Samva. Your workspace {input.workspace} is ready — - open the docs to begin. + open the{" "} + + docs + {" "} + to begin.

), - }), + }, }); diff --git a/examples/tsx-template-samva/theme.css b/examples/tsx-template-samva/theme.css index 6c1c8c7..8b10ae0 100644 --- a/examples/tsx-template-samva/theme.css +++ b/examples/tsx-template-samva/theme.css @@ -1,11 +1,3 @@ -/* Project Tailwind tokens. Local builds, previews and hosted builds consume this file. - * Use explicit dark: utilities with the dark tokens; token names do not imply variants. - */ +@import "./starter.css"; @theme { - --color-brand: #4f46e5; - --color-brand-foreground: #ffffff; - --color-brand-dark: #a5b4fc; - --color-brand-foreground-dark: #0b0d10; - --radius-card: 12px; - --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; } diff --git a/examples/tsx-template-samva/tsconfig.json b/examples/tsx-template-samva/tsconfig.json index aab3afd..1d6de80 100644 --- a/examples/tsx-template-samva/tsconfig.json +++ b/examples/tsx-template-samva/tsconfig.json @@ -14,5 +14,5 @@ "jsx": "react-jsx", "jsxImportSource": "@samva/markup/email" }, - "include": ["emails", "vite.config.ts"] + "include": ["templates"] } diff --git a/examples/tsx-template-samva/vite.config.ts b/examples/tsx-template-samva/vite.config.ts deleted file mode 100644 index 022e270..0000000 --- a/examples/tsx-template-samva/vite.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { samvaEditor } from "@samva/vite"; -import { defineConfig } from "vite"; - -// `vite` serves the code-authored TSX entry at http://localhost:5173/. -// The SML build output and hosted publication are owned by `@samva/vite` and -// `samva templates publish`; Git owns this TSX project as the source tree. -export default defineConfig({ - plugins: [samvaEditor({ templatesDir: "emails" })], -}); From 593125d903c4e951090daa22ddb54d7940af0adf Mon Sep 17 00:00:00 2001 From: Saatvik Arya Date: Sat, 3 Oct 2026 00:16:31 +0530 Subject: [PATCH 4/5] fix(email-sdk): pass the idempotency key as the Samva 0.8 send option --- packages/email-sdk/src/samva.ts | 8 +++----- packages/email-sdk/tests/samva.test.ts | 13 +++++-------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/packages/email-sdk/src/samva.ts b/packages/email-sdk/src/samva.ts index b7a0cb9..70e2610 100644 --- a/packages/email-sdk/src/samva.ts +++ b/packages/email-sdk/src/samva.ts @@ -68,15 +68,13 @@ export function samva(options: SamvaAdapterOptions): SamvaEmailAdapter { if (context.signal?.aborted) throw abortReason(context.signal); const payload = await toSamvaMessage(message); - const headers = - context.idempotencyKey === undefined - ? undefined - : { "idempotency-key": context.idempotencyKey }; let result: SamvaSendResult; try { result = await client.email.send(payload, { ...(context.signal === undefined ? {} : { signal: context.signal }), - ...(headers === undefined ? {} : { headers }), + ...(context.idempotencyKey === undefined + ? {} + : { idempotencyKey: context.idempotencyKey }), }); } catch (error) { if (isAbortFailure(error, context.signal)) throw abortReason(context.signal); diff --git a/packages/email-sdk/tests/samva.test.ts b/packages/email-sdk/tests/samva.test.ts index 8372877..51f8381 100644 --- a/packages/email-sdk/tests/samva.test.ts +++ b/packages/email-sdk/tests/samva.test.ts @@ -215,21 +215,18 @@ describe("samva", () => { expect(send).not.toHaveBeenCalled(); }); - it("forwards an idempotency key as the Samva Idempotency-Key header", async () => { + it("forwards an idempotency key as the Samva idempotencyKey option", async () => { const send = vi.fn( - async ( - _payload: unknown, - _options?: { signal?: AbortSignal; headers?: Record }, - ) => ({ id: "message_1" }), + async (_payload: unknown, _options?: { signal?: AbortSignal; idempotencyKey?: string }) => ({ + id: "message_1", + }), ); const adapter = samva({ client: injectedClient(send) }); await adapter.send(message, { ...context, idempotencyKey: "dedupe" }); expect(send).toHaveBeenCalledOnce(); - expect(send.mock.calls[0]![1]).toMatchObject({ - headers: { "idempotency-key": "dedupe" }, - }); + expect(send.mock.calls[0]![1]).toMatchObject({ idempotencyKey: "dedupe" }); }); it("forwards the AbortSignal and preserves Email SDK abort semantics", async () => { From 72f4a662eee843f29ba98878cd1d3126ffeff34a Mon Sep 17 00:00:00 2001 From: Saatvik Arya Date: Sat, 3 Oct 2026 00:16:31 +0530 Subject: [PATCH 5/5] docs(tsx-templates): document arithmetic in formatters and the publish path for the example --- cookbooks/tsx-templates.md | 2 ++ examples/tsx-template-samva/README.md | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cookbooks/tsx-templates.md b/cookbooks/tsx-templates.md index 289a778..148a3e9 100644 --- a/cookbooks/tsx-templates.md +++ b/cookbooks/tsx-templates.md @@ -76,6 +76,8 @@ The compiler reads the file and never runs it, so nothing computes at send time. - map over input lists with `.map`, and filter first with `.filter(...)`; - format with `fmt.money`, `fmt.number`, `fmt.date`, `fmt.time`, `fmt.plural` and `fmt.list`, imported from `@samva/markup/fmt`; +- do arithmetic on bound numbers inside a formatter argument or a condition + (`fmt.money(item.price * item.quantity, input.currency)`); - call partials: functions from props to JSX in other project files. ```tsx title="templates/receipt.tsx (body)" diff --git a/examples/tsx-template-samva/README.md b/examples/tsx-template-samva/README.md index 17f54e1..9b9ca33 100644 --- a/examples/tsx-template-samva/README.md +++ b/examples/tsx-template-samva/README.md @@ -26,7 +26,7 @@ theme.css imports starter.css; its own @theme overrides A template default-exports `defineTemplate({ id, schema, fixtures, email })`. The `email` channel holds `subject`, an optional `preheader`, and the `body`. The compiler reads the file and never runs -it, so a body binds input values, uses `&&` and `?:`, maps over input lists, and calls `fmt.*`; +it, so a body binds input values, uses `&&` and `?:`, maps over input lists, and calls `fmt.*` (with arithmetic on bound numbers inside its arguments); compute anything else in the caller and send it in the input. Only `@samva/markup` and files in this project can be imported. @@ -48,14 +48,22 @@ and dark, to `.samva/snapshots`, and needs `playwright` in the project or a syst ## Publish and send -Connect the project to a Samva-managed Git repository with `samva templates init`, then push and -publish the exact commit: +Published templates live in a Samva-managed Git repository. `samva templates init` creates one +from the canonical starter, which registers `templates/welcome.tsx`, and clones it. Copy this +example's templates and theme into the clone, register the second entry, then push and publish: ```sh -git push origin main -bunx samva templates publish --commit HEAD +bunx samva templates init --name "Welcome email" --dir ../welcome-email +cp -R templates theme.css starter.css ../welcome-email/ +cd ../welcome-email +bunx samva templates add templates/receipt.tsx +git add -A && git commit -m "feat: welcome and receipt templates" && git push origin main +bunx samva templates publish --all ``` +`add` registers the entry under its `defineTemplate` id, and `publish --all` publishes every +registered template at the pushed commit. + Generate typed inputs for the application that sends them: ```sh