From 06ea475bb132d14d73f8b33ce4732d016d427666 Mon Sep 17 00:00:00 2001 From: Thibault Le Ouay Ducasse Date: Fri, 9 Oct 2026 22:55:49 +0200 Subject: [PATCH] feat: run server and workflows on node 26 Replace the Deno runtime and build for apps/server, apps/workflows and the db migrate image with Node 26 and the Oxc toolchain: - dev and scripts run through oxc-node (node --import @oxc-node/core/register) - prod bundles with tsdown; @hono/node-server replaces Deno.serve - images move to node:26.8.1-slim with curl and ca-certificates (libsql's native TLS reads the system CA store); workflows ships its tsdown externals as a side-car node_modules - workflows switches @sentry/deno to @sentry/node - type checks move from deno check to tsc --noEmit; test files are excluded until they move to Vitest - pin node 26.8.1 in devbox and CI Tests still run on deno test; that moves in the next PR. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/buf-push.yml | 2 +- .github/workflows/check.yml | 2 +- .github/workflows/dx.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/migrate.yml | 2 +- .github/workflows/proto-check.yml | 2 +- .github/workflows/test.yml | 2 +- AGENTS.md | 6 +- CONTRIBUTING.md | 3 - DOCKER.md | 4 +- apps/dashboard/AGENTS.md | 2 +- apps/dashboard/README.md | 1 - apps/dashboard/env.ts | 4 +- apps/screenshot-service/package.json | 2 +- apps/screenshot-service/tsconfig.json | 11 +- apps/server/AGENTS.md | 2 +- apps/server/Dockerfile | 38 +- apps/server/README.md | 2 +- apps/server/dofigen.lock | 104 ++- apps/server/dofigen.yml | 43 +- apps/server/env.ts | 4 +- apps/server/package.json | 24 +- apps/server/scripts/build-openapi-json.ts | 12 +- apps/server/scripts/build-openapi-v1-json.ts | 4 +- apps/server/scripts/slack-manifest-dev.ts | 13 +- apps/server/src/index.ts | 6 +- apps/server/src/routes/openapi.ts | 2 +- .../server/src/routes/v1/monitors/run/post.ts | 2 +- apps/server/src/serve.ts | 9 +- apps/server/tsconfig.json | 20 +- apps/server/tsdown.config.ts | 12 + apps/status-page/env.ts | 4 +- apps/status-page/package.json | 2 +- apps/web/env.ts | 4 +- apps/web/package.json | 2 +- apps/workflows/AGENTS.md | 16 +- apps/workflows/Dockerfile | 47 +- apps/workflows/dofigen.lock | 173 ++-- apps/workflows/dofigen.yml | 56 +- apps/workflows/package.json | 14 +- apps/workflows/scripts/sidecar-package.mjs | 25 + apps/workflows/src/checker/outbox.ts | 2 +- apps/workflows/src/cron/index.ts | 2 +- apps/workflows/src/cron/outbox.ts | 2 +- apps/workflows/src/cron/scheduler.ts | 2 +- apps/workflows/src/cron/status-drift.ts | 2 +- apps/workflows/src/index.ts | 8 +- apps/workflows/src/lib/sentry.ts | 7 +- apps/workflows/src/serve.ts | 9 +- apps/workflows/start.sh | 4 +- apps/workflows/tsconfig.json | 13 +- apps/workflows/tsdown.config.ts | 21 + deno.lock | 267 ++++++ devbox.json | 2 +- packages/ai/package.json | 2 +- packages/ai/tsconfig.json | 11 +- packages/analytics/package.json | 2 +- packages/analytics/tsconfig.json | 11 +- packages/api/env.ts | 4 +- packages/api/package.json | 4 +- packages/api/tsconfig.json | 13 +- packages/assertions/package.json | 2 +- packages/assertions/tsconfig.json | 11 +- packages/db/Dockerfile | 22 +- packages/db/dofigen.lock | 65 +- packages/db/dofigen.yml | 23 +- packages/db/env.ts | 4 +- packages/db/package.json | 9 +- packages/db/tsconfig.json | 10 +- packages/emails/package.json | 2 +- packages/emails/tsconfig.json | 12 +- packages/error/package.json | 2 +- packages/error/tsconfig.json | 11 +- packages/header-analysis/package.json | 2 +- packages/header-analysis/tsconfig.json | 11 +- packages/icons/package.json | 2 +- packages/icons/tsconfig.json | 12 +- packages/importers/package.json | 2 +- packages/importers/tsconfig.json | 11 +- packages/locales/package.json | 2 +- packages/locales/tsconfig.json | 11 +- packages/notifications/base/package.json | 2 +- packages/notifications/base/tsconfig.json | 9 +- .../notifications/bird-whatsapp/package.json | 2 +- .../notifications/bird-whatsapp/tsconfig.json | 11 +- packages/notifications/discord/package.json | 2 +- packages/notifications/discord/tsconfig.json | 11 +- packages/notifications/email/package.json | 2 +- packages/notifications/email/tsconfig.json | 11 +- .../notifications/google-chat/package.json | 2 +- .../notifications/google-chat/tsconfig.json | 11 +- .../notifications/grafana-oncall/package.json | 2 +- .../grafana-oncall/tsconfig.json | 11 +- packages/notifications/ms-teams/package.json | 2 +- packages/notifications/ms-teams/tsconfig.json | 11 +- packages/notifications/ntfy/package.json | 2 +- packages/notifications/ntfy/tsconfig.json | 11 +- packages/notifications/opsgenie/package.json | 2 +- packages/notifications/opsgenie/tsconfig.json | 11 +- packages/notifications/pagerduty/package.json | 2 +- .../notifications/pagerduty/tsconfig.json | 11 +- packages/notifications/slack/package.json | 2 +- packages/notifications/slack/tsconfig.json | 11 +- packages/notifications/telegram/package.json | 2 +- packages/notifications/telegram/tsconfig.json | 11 +- .../notifications/twillio-sms/package.json | 2 +- .../notifications/twillio-sms/tsconfig.json | 11 +- packages/notifications/webhook/package.json | 2 +- packages/notifications/webhook/tsconfig.json | 10 +- packages/proto/package.json | 4 +- packages/proto/tsconfig.json | 10 +- packages/regions/package.json | 2 +- packages/regions/tsconfig.json | 11 +- packages/services/AGENTS.md | 8 +- packages/services/package.json | 2 +- packages/services/tsconfig.json | 12 +- packages/status-fetcher/package.json | 5 +- packages/status-fetcher/tsconfig.json | 11 +- packages/subscriptions/package.json | 2 +- packages/subscriptions/tsconfig.json | 12 +- packages/theme-store/package.json | 2 +- packages/theme-store/tsconfig.json | 11 +- packages/tinybird/package.json | 2 +- packages/tinybird/tsconfig.json | 10 +- packages/tracker/package.json | 2 +- packages/tracker/tsconfig.json | 11 +- packages/tsconfig/base.json | 6 +- packages/upstash/package.json | 2 +- packages/upstash/tsconfig.json | 10 +- packages/utils/package.json | 2 +- packages/utils/tsconfig.json | 11 +- pnpm-lock.yaml | 872 +++++++++++++++++- pnpm-workspace.yaml | 5 +- 133 files changed, 2045 insertions(+), 460 deletions(-) create mode 100644 apps/server/tsdown.config.ts create mode 100644 apps/workflows/scripts/sidecar-package.mjs create mode 100644 apps/workflows/tsdown.config.ts diff --git a/.github/workflows/buf-push.yml b/.github/workflows/buf-push.yml index c2ac37676..1de72cb8c 100644 --- a/.github/workflows/buf-push.yml +++ b/.github/workflows/buf-push.yml @@ -32,7 +32,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v6 with: - node-version: 24.12.0 + node-version: 26.8.1 cache: "pnpm" - name: 📥 Download deps diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index af1718949..46d92188f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -24,7 +24,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v6 with: - node-version: 24.12.0 + node-version: 26.8.1 cache: "pnpm" - name: 🦕 Setup Deno diff --git a/.github/workflows/dx.yml b/.github/workflows/dx.yml index 79973afe6..1d5b0bcec 100644 --- a/.github/workflows/dx.yml +++ b/.github/workflows/dx.yml @@ -35,7 +35,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v6 with: - node-version: 24.12.0 + node-version: 26.8.1 cache: "pnpm" - name: 📥 Download deps diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b04500ae0..39212d85d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -25,7 +25,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v6 with: - node-version: 24.12.0 + node-version: 26.8.1 cache: "pnpm" - name: 📥 Download deps diff --git a/.github/workflows/migrate.yml b/.github/workflows/migrate.yml index 9944f7a7c..e2dcffc93 100644 --- a/.github/workflows/migrate.yml +++ b/.github/workflows/migrate.yml @@ -23,7 +23,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v6 with: - node-version: 24.12.0 + node-version: 26.8.1 cache: "pnpm" - name: 🦕 Install deno diff --git a/.github/workflows/proto-check.yml b/.github/workflows/proto-check.yml index 1b2f41934..39e5072ac 100644 --- a/.github/workflows/proto-check.yml +++ b/.github/workflows/proto-check.yml @@ -32,7 +32,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v6 with: - node-version: 24.12.0 + node-version: 26.8.1 cache: "pnpm" - name: 🦕 Setup Deno diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5dd8e0c51..3bf2506b8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -66,7 +66,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v6 with: - node-version: 24.12.0 + node-version: 26.8.1 cache: "pnpm" - name: 🦕 Setup Deno diff --git a/AGENTS.md b/AGENTS.md index 229300d06..e75dcadcd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,7 +7,7 @@ this file never restates them. ## Verify your change ```sh -pnpm verify # oxfmt + oxlint + doc refs + deno check. No database, seconds. +pnpm verify # oxfmt + oxlint + doc refs + tsc. No database, seconds. pnpm verify:test # tests for packages affected by your diff. Needs a database. ``` @@ -19,7 +19,7 @@ are in `apps/dashboard/README.md`. `devbox.json` pins exact node, deno, bun, turso-cli and sqld versions; the CI workflows pin the same node and deno. Never float one back to `@latest` or -`v2.x` — `deno check` results differ by deno version, so a drifting pin makes +`v2.x` — `tsc` and `deno test` results differ by version, so a drifting pin makes `pnpm verify` disagree with CI for reasons unrelated to your change. ## Architecture @@ -82,7 +82,7 @@ boundaries with external SDKs or at registry-style dispatch. When you need one: - `apps/dashboard/AGENTS.md` — Next.js runtimes, client boundary, UI verification - `apps/server/AGENTS.md` — Hono API, API-key scopes - `apps/status-page/AGENTS.md` — public surfaces and gated content -- `apps/workflows/AGENTS.md` — Deno runtime constraints +- `apps/workflows/AGENTS.md` — bundling constraints, native side-car - `apps/checker/AGENTS.md` — Go probing tier - `apps/web/AGENTS.md` — marketing site, `.well-known`, search, content pages diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6b5a84ca1..b59f41ec8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,9 +33,6 @@ To contribute code changes, follow these steps: no database and takes seconds. `pnpm verify:test` runs the tests for the packages your diff touches; those do need a local libSQL server. - Note: the type checks (`check` task) in most packages run through - [Deno](https://deno.com/), which must be installed locally. Without it, - `pnpm verify` fails with `deno: command not found` in every package. See the [Requirements](./README.md#requirements) list in the README for the full toolchain (Node.js, pnpm, Bun, Deno, Turso CLI). 4. Make commits with clear and descriptive messages. Each commit should have a single logical purpose. diff --git a/DOCKER.md b/DOCKER.md index c29c46a45..88b6de3d6 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -22,7 +22,7 @@ docker compose ps # port — seed refuses non-localhost databases by design) docker run --rm --network host \ -e DATABASE_URL=http://localhost:8080 \ - --entrypoint deno openstatus/db-migrate:latest task seed + --entrypoint npm openstatus/db-migrate:latest run seed # 6. (Optional) Deploy Tinybird local - requires tb CLI cd packages/tinybird @@ -122,7 +122,7 @@ After migrations complete, seed the database with sample data: # databases by design, so it cannot run over the compose-internal network docker run --rm --network host \ -e DATABASE_URL=http://localhost:8080 \ - --entrypoint deno openstatus/db-migrate:latest task seed + --entrypoint npm openstatus/db-migrate:latest run seed ``` This creates: diff --git a/apps/dashboard/AGENTS.md b/apps/dashboard/AGENTS.md index b5839e252..a32eace62 100644 --- a/apps/dashboard/AGENTS.md +++ b/apps/dashboard/AGENTS.md @@ -13,7 +13,7 @@ The whole tRPC surface is served from `apps/dashboard/src/app/api/trpc/lambda/[trpc]/route.ts` on the **Node.js** runtime — several routers pull Node-only SDKs (`@slack/web-api`, email and notification clients). Node-only dependencies inside `@openstatus/services` are -still forbidden, because `apps/workflows` runs the same code on Deno. +still forbidden, because that package stays Edge-safe. ## Client boundary diff --git a/apps/dashboard/README.md b/apps/dashboard/README.md index 9d0c3757c..9f4c5303a 100644 --- a/apps/dashboard/README.md +++ b/apps/dashboard/README.md @@ -6,7 +6,6 @@ - [Node.js](https://nodejs.org/en/) >= 20.0.0 — runtime - [pnpm](https://pnpm.io/) >= 8 — monorepo package manager (see root `package.json` for pinned version) -- [Deno](https://deno.com/) — runs the db env/migrate/seed scripts in `packages/db` - [Bun](https://bun.sh/) — optional, used by the utility scripts in `src/scripts` - [Turso CLI](https://docs.turso.tech/quickstart) — starts the local libSQL server via `pnpm --filter '@openstatus/db' dev` diff --git a/apps/dashboard/env.ts b/apps/dashboard/env.ts index dab63f5f4..3e27fee79 100644 --- a/apps/dashboard/env.ts +++ b/apps/dashboard/env.ts @@ -1 +1,3 @@ -await Deno.copyFile("./.env.example", "./.env"); +import { copyFile } from "node:fs/promises"; + +await copyFile("./.env.example", "./.env"); diff --git a/apps/screenshot-service/package.json b/apps/screenshot-service/package.json index 4bd7feb41..2272806a6 100644 --- a/apps/screenshot-service/package.json +++ b/apps/screenshot-service/package.json @@ -2,7 +2,7 @@ "name": "@openstatus/screenshot-service", "version": "0.0.1", "scripts": { - "check": "deno check --sloppy-imports .", + "check": "tsc --noEmit", "dev": "bun run --hot src/index.ts", "start": "NODE_ENV=production bun run src/index.ts" }, diff --git a/apps/screenshot-service/tsconfig.json b/apps/screenshot-service/tsconfig.json index 0770bb760..d1ea02542 100644 --- a/apps/screenshot-service/tsconfig.json +++ b/apps/screenshot-service/tsconfig.json @@ -1,5 +1,14 @@ { "extends": "@openstatus/tsconfig/base.json", "include": ["src", "*.ts", "**/*.ts"], - "compilerOptions": {} + "compilerOptions": {}, + "exclude": [ + "node_modules", + "**/*.test.ts", + "**/*.test.tsx", + "**/__tests__/**", + "**/test/**", + "**/*.mock.ts", + "**/test-preload.ts" + ] } diff --git a/apps/server/AGENTS.md b/apps/server/AGENTS.md index 40c03a340..0a296c44f 100644 --- a/apps/server/AGENTS.md +++ b/apps/server/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS.md — apps/server -Hono, running on Deno. Four surfaces under `apps/server/src/routes/`: `v1` +Hono, running on Node. Four surfaces under `apps/server/src/routes/`: `v1` (public REST), `rpc` (ConnectRPC), `mcp`, and `slack`. ## API-key scopes diff --git a/apps/server/Dockerfile b/apps/server/Dockerfile index 0198630f2..5d1b93ac1 100644 --- a/apps/server/Dockerfile +++ b/apps/server/Dockerfile @@ -3,10 +3,10 @@ # See https://github.com/lenra-io/dofigen # install -FROM node@sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6 AS install +FROM node@sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146 AS install LABEL \ - org.opencontainers.image.base.digest="sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6" \ - org.opencontainers.image.base.name="docker.io/node:24-slim" \ + org.opencontainers.image.base.digest="sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146" \ + org.opencontainers.image.base.name="docker.io/node:26.8.1-slim" \ org.opencontainers.image.stage="install" WORKDIR /app/ RUN \ @@ -47,15 +47,16 @@ RUN \ --mount=type=bind,target=packages/importers/package.json,source=packages/importers/package.json \ --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \ </slack/oauth/callback to apps/server/.env", ); - Deno.exit(1); + process.exit(1); } const redirectUrl = new URL(redirectUri); if (redirectUrl.pathname !== "/slack/oauth/callback") { console.error( `SLACK_REDIRECT_URI must have the exact path /slack/oauth/callback — got ${redirectUri}`, ); - Deno.exit(1); + process.exit(1); } const devOrigin = redirectUrl.origin; @@ -32,8 +34,5 @@ dev.features.bot_user.display_name = DEV_NAME; dev.oauth_config.redirect_urls = [redirectUri]; const output = `${JSON.stringify(dev, null, 2).replaceAll(PROD_ORIGIN, devOrigin)}\n`; -await Deno.writeTextFile( - new URL("../slack-manifest.dev.json", import.meta.url), - output, -); +await writeFile(new URL("../slack-manifest.dev.json", import.meta.url), output); console.log(output); diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index a432808bb..c4af9d0ea 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -58,9 +58,9 @@ const otelLogger = getLogger("api-server-otel"); * This allows tests to import `app` immediately. */ -// Build the LoggerProvider with a static OTLP exporter import so `deno bundle` -// includes it. Letting @logtape/otel create the exporter triggers a dynamic -// import of a bare specifier, which the compiled --node-modules-dir=none binary +// Build the LoggerProvider with a static OTLP exporter import so tsdown +// bundles it. Letting @logtape/otel create the exporter triggers a dynamic +// import of a bare specifier, which the image (shipped without node_modules) // can't resolve. const loggerProvider = new LoggerProvider({ resource: resourceFromAttributes({ diff --git a/apps/server/src/routes/openapi.ts b/apps/server/src/routes/openapi.ts index 2b8e8bb25..5fee6da07 100644 --- a/apps/server/src/routes/openapi.ts +++ b/apps/server/src/routes/openapi.ts @@ -2,7 +2,7 @@ import { Hono } from "hono"; import openapiV1Json from "../../static/openapi-v1.json" with { type: "json" }; // Generated alongside openapi.json; embedded rather than read from disk because -// `deno bundle` flattens src/ and a runtime path would resolve from the bundle. +// tsdown flattens src/ and a runtime path would resolve from the bundle. import openapiYaml from "../../static/openapi-yaml"; import openapiJson from "../../static/openapi.json" with { type: "json" }; diff --git a/apps/server/src/routes/v1/monitors/run/post.ts b/apps/server/src/routes/v1/monitors/run/post.ts index 0c34dcb8d..86b7242f0 100644 --- a/apps/server/src/routes/v1/monitors/run/post.ts +++ b/apps/server/src/routes/v1/monitors/run/post.ts @@ -159,7 +159,7 @@ export function registerRunMonitor(api: typeof monitorsApi) { if (noWait) { // The promises keep running after the response; an uncaught rejection - // here would crash the Deno process, so swallow and log failures. + // here would crash the process, so swallow and log failures. for (const result of allResult) { result.catch((error: unknown) => { logger.warn("Checker request failed", { diff --git a/apps/server/src/serve.ts b/apps/server/src/serve.ts index 9080cb04f..7ee67e50d 100644 --- a/apps/server/src/serve.ts +++ b/apps/server/src/serve.ts @@ -1,3 +1,4 @@ +import { serve } from "@hono/node-server"; import { getLogger } from "@logtape/logtape"; import { env } from "./env"; @@ -5,15 +6,13 @@ import { app } from "./index"; const port = 3000; -// Deno terminates the process on unhandled rejections; log instead so one +// Node terminates the process on unhandled rejections; log instead so one // stray background promise (e.g. a fire-and-forget fetch) can't kill the instance. -globalThis.addEventListener("unhandledrejection", (event) => { - const reason = event.reason; +process.on("unhandledRejection", (reason) => { getLogger("api-server").error("Unhandled promise rejection", { reason: reason instanceof Error ? reason.message : String(reason), stack: reason instanceof Error ? reason.stack : undefined, }); - event.preventDefault(); }); getLogger("api-server").info("Starting server", { @@ -21,4 +20,4 @@ getLogger("api-server").info("Starting server", { environment: env.NODE_ENV, }); -Deno.serve({ port }, app.fetch); +serve({ fetch: app.fetch, port }); diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json index 964d6a3cf..004eda196 100644 --- a/apps/server/tsconfig.json +++ b/apps/server/tsconfig.json @@ -8,15 +8,17 @@ "moduleResolution": "bundler", "jsxImportSource": "react", "allowJs": true, - "types": [], "paths": { - "@/*": ["./src/*"], - "@modelcontextprotocol/sdk/server/mcp.js": [ - "./node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.d.ts" - ], - "@modelcontextprotocol/sdk/types.js": [ - "./node_modules/@modelcontextprotocol/sdk/dist/esm/types.d.ts" - ] + "@/*": ["./src/*"] } - } + }, + "exclude": [ + "node_modules", + "**/*.test.ts", + "**/*.test.tsx", + "**/__tests__/**", + "**/test/**", + "**/*.mock.ts", + "**/test-preload.ts" + ] } diff --git a/apps/server/tsdown.config.ts b/apps/server/tsdown.config.ts new file mode 100644 index 000000000..fe2598351 --- /dev/null +++ b/apps/server/tsdown.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "tsdown"; + +// The image ships dist/ without node_modules, so every dependency is inlined. +export default defineConfig({ + entry: ["src/serve.ts"], + format: "esm", + platform: "node", + target: "node26", + fixedExtension: true, + dts: false, + deps: { alwaysBundle: [/.*/], onlyBundle: false }, +}); diff --git a/apps/status-page/env.ts b/apps/status-page/env.ts index dab63f5f4..3e27fee79 100644 --- a/apps/status-page/env.ts +++ b/apps/status-page/env.ts @@ -1 +1,3 @@ -await Deno.copyFile("./.env.example", "./.env"); +import { copyFile } from "node:fs/promises"; + +await copyFile("./.env.example", "./.env"); diff --git a/apps/status-page/package.json b/apps/status-page/package.json index eefbf6057..17eeb0ad8 100644 --- a/apps/status-page/package.json +++ b/apps/status-page/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "scripts": { - "env": "deno run -A env.ts", + "env": "node env.ts", "dev": "next dev --turbopack", "build": "next build", "start": "next start", diff --git a/apps/web/env.ts b/apps/web/env.ts index dab63f5f4..3e27fee79 100644 --- a/apps/web/env.ts +++ b/apps/web/env.ts @@ -1 +1,3 @@ -await Deno.copyFile("./.env.example", "./.env"); +import { copyFile } from "node:fs/promises"; + +await copyFile("./.env.example", "./.env"); diff --git a/apps/web/package.json b/apps/web/package.json index 5e81cb080..06c713201 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "scripts": { - "env": "deno run -A env.ts", + "env": "node env.ts", "dev": "next dev", "build:registry": "turbo run registry:build --filter=@openstatus/ui", "build": "pnpm build:registry && next build", diff --git a/apps/workflows/AGENTS.md b/apps/workflows/AGENTS.md index b0d6b0910..78c0c52d0 100644 --- a/apps/workflows/AGENTS.md +++ b/apps/workflows/AGENTS.md @@ -1,15 +1,15 @@ # AGENTS.md — apps/workflows -Runs on **Deno**, not Node. `pnpm check` here is -`deno check --sloppy-imports src/serve.ts`, and it must pass — it is the only -type gate this app has (`pnpm test` runs with `--no-check`). +Runs on **Node**, through oxc-node in dev and as a tsdown bundle in production. +`pnpm check` here is `tsc --noEmit`, and it must pass — it is the only type gate +this app has (`pnpm test` runs with `--no-check`). -Constraints that follow from the runtime: +Constraints that follow from the build: -- No `node:*` built-ins, and no dependency that reaches for one. This app - imports `@openstatus/services`, so a `node:*` import added there breaks the - build here — run `pnpm check` in both packages after touching services. -- Sentry comes from `@sentry/deno`, not `@sentry/node`. +- `@libsql/client`, `libsql` and `@google-cloud/tasks` stay external in + `tsdown.config.ts` (native addon, CJS `__dirname` reads) and ship as a + side-car `node_modules` in the image. A new dependency with either trait + joins that list and the side-car in `dofigen.yml`. - Tests run `deno test --parallel`, so test files share one process environment. Never drive a branch by assigning to `process.env` mid-test — the assignment leaks into whatever else is running. Resolve config once at diff --git a/apps/workflows/Dockerfile b/apps/workflows/Dockerfile index 59cc905e7..89f74ee83 100644 --- a/apps/workflows/Dockerfile +++ b/apps/workflows/Dockerfile @@ -3,10 +3,10 @@ # See https://github.com/lenra-io/dofigen # install -FROM node@sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6 AS install +FROM node@sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146 AS install LABEL \ - org.opencontainers.image.base.digest="sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6" \ - org.opencontainers.image.base.name="docker.io/node:24-slim" \ + org.opencontainers.image.base.digest="sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146" \ + org.opencontainers.image.base.name="docker.io/node:26.8.1-slim" \ org.opencontainers.image.stage="install" WORKDIR /app/ RUN \ @@ -44,15 +44,16 @@ RUN \ --mount=type=bind,target=packages/status-fetcher/package.json,source=packages/status-fetcher/package.json \ --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \ <{for(const e of Deno.readDirSync(p))if(e.name.startsWith(x+"@"))return e.name.slice(x.length+1).split("_")[0]};Deno.writeTextFileSync("/tmp/sc/package.json",JSON.stringify({dependencies:{"@libsql/client":v("@libsql+client"),libsql:v("libsql"),"@google-cloud/tasks":v("@google-cloud+tasks")}}))' -cd /tmp/sc && deno install --node-modules-dir=auto --allow-scripts -cd /app/apps/workflows && deno bundle --platform=deno --minify --sloppy-imports --node-modules-dir=manual --external '@libsql/client' --external 'libsql' --external '@google-cloud/tasks' --output /tmp/sc/_serve.bundle.mjs src/serve.ts -cd /tmp/sc && deno compile --no-check -A --node-modules-dir=manual --output /app/apps/workflows/app /tmp/sc/_serve.bundle.mjs -mkdir -p /app/data +./node_modules/.bin/tsdown +mkdir -p /tmp/sc /app/data +node scripts/sidecar-package.mjs /tmp/sc/package.json +npm install --prefix /tmp/sc --omit=dev --no-package-lock --no-audit --no-fund EOF # runtime -FROM registry.access.redhat.com/hi/curl@sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4 AS runtime +FROM node@sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146 AS runtime LABEL \ io.dofigen.version="2.8.0" \ org.opencontainers.image.authors="OpenStatus Team" \ - org.opencontainers.image.base.digest="sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4" \ + org.opencontainers.image.base.digest="sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146" \ + org.opencontainers.image.base.name="docker.io/node:26.8.1-slim" \ org.opencontainers.image.description="Background job processing and probe scheduling for OpenStatus" \ org.opencontainers.image.source="https://github.com/openstatusHQ/openstatus" \ org.opencontainers.image.title="OpenStatus Workflows" \ org.opencontainers.image.vendor="OpenStatus" +ENV NODE_ENV="production" WORKDIR /app/ COPY \ --from=build \ --chown=1000:1000 \ - --chmod=555 \ --link \ - "/app/apps/workflows/app" "/app/apps/workflows/" + "/app/apps/workflows/dist" "/app/apps/workflows/dist" +COPY \ + --from=build \ + --chown=1000:1000 \ + --link \ + "/tmp/sc/node_modules" "/app/apps/workflows/node_modules" COPY \ --from=build \ --chown=1000:1000 \ --link \ "/app/data" "/app/data" +USER 0:0 +RUN <{for(const e of Deno.readDirSync(p))if(e.name.startsWith(x+"@"))return e.name.slice(x.length+1).split("_")[0]};Deno.writeTextFileSync("/tmp/sc/package.json",JSON.stringify({dependencies:{"@libsql/client":v("@libsql+client"),libsql:v("libsql"),"@google-cloud/tasks":v("@google-cloud+tasks")}}))' - - cd /tmp/sc && deno install --node-modules-dir=auto --allow-scripts - - cd /app/apps/workflows && deno bundle --platform=deno --minify --sloppy-imports --node-modules-dir=manual --external '@libsql/client' --external 'libsql' --external '@google-cloud/tasks' --output /tmp/sc/_serve.bundle.mjs src/serve.ts - - cd /tmp/sc && deno compile --no-check -A --node-modules-dir=manual --output /app/apps/workflows/app /tmp/sc/_serve.bundle.mjs - - mkdir -p /app/data fromImage: - host: registry.access.redhat.com - port: 443 - path: hi/curl - digest: sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4 + path: node + digest: sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146 label: + org.opencontainers.image.title: OpenStatus Workflows org.opencontainers.image.source: https://github.com/openstatusHQ/openstatus - org.opencontainers.image.base.digest: sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4 io.dofigen.version: 2.8.0 - org.opencontainers.image.description: Background job processing and probe scheduling for OpenStatus org.opencontainers.image.authors: OpenStatus Team - org.opencontainers.image.title: OpenStatus Workflows + org.opencontainers.image.base.name: docker.io/node:26.8.1-slim + org.opencontainers.image.description: Background job processing and probe scheduling for OpenStatus org.opencontainers.image.vendor: OpenStatus + org.opencontainers.image.base.digest: sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146 user: user: '1000' group: '1000' workdir: /app/ + env: + NODE_ENV: production copy: - fromBuilder: build paths: - - /app/apps/workflows/app - target: /app/apps/workflows/ - chmod: '555' + - /app/apps/workflows/dist + target: /app/apps/workflows/dist + - fromBuilder: build + paths: + - /tmp/sc/node_modules + target: /app/apps/workflows/node_modules - fromBuilder: build paths: - /app/data target: /app/data + root: + run: + - apt-get update + - apt-get install -y --no-install-recommends curl ca-certificates + - rm -rf /var/lib/apt/lists/* entrypoint: - - /app/apps/workflows/app + - node + - /app/apps/workflows/dist/serve.mjs expose: - port: 3000 healthcheck: @@ -166,15 +175,11 @@ images: docker.io: library: node: - 24-slim: - digest: sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6 - denoland: - deno: - 2.9.7: - digest: sha256:fa335acdf6b72106eda2cb6a8cb5f4187e7630e357467489db4b2e7352d5e432 + 26.8.1-slim: + digest: sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146 resources: dofigen.yml: - hash: bb33793c4b91222bc9d01de4911a4150c33290039ddf20f78f594ac96d3677e1 + hash: 75e561712c38b9cf7ba606bde6d9eaa0c76c6930bc4b5d47ee180e8034e786ca content: | ignore: - node_modules @@ -190,7 +195,7 @@ resources: - /packages/tracker builders: install: - fromImage: node:24-slim + fromImage: node:26.8.1-slim workdir: /app/ labels: org.opencontainers.image.stage: install @@ -228,16 +233,18 @@ resources: - packages/locales/package.json - packages/status-fetcher/package.json - # Install dependencies (scoped to the workflows subgraph so node_modules — and the binary that embeds it — stays small) + # Install dependencies scoped to the workflows subgraph (dev included: the build stage needs tsdown) run: + # Node 25+ no longer bundles corepack + - npm install -g corepack@0.36.0 - corepack enable pnpm - - pnpm install --prod --frozen-lockfile --filter=@openstatus/workflows... --loglevel debug + - pnpm install --frozen-lockfile --filter=@openstatus/workflows... --loglevel debug cache: - /root/.local/share/pnpm/store - # Stage 4: Build application (compile to binary with Deno) + # Stage 4: Bundle the app with tsdown into dist/ build: - fromImage: denoland/deno:2.9.7 + fromImage: node:26.8.1-slim workdir: /app/apps/workflows labels: org.opencontainers.image.stage: build @@ -254,21 +261,23 @@ resources: target: /app/packages env: NODE_ENV: production - # Bundle the app to self-contained JS, EXTERNALISING the 3 packages that can't be inlined: - # @libsql/client + libsql (native .node loader) and @google-cloud/tasks (google-proto-files reads - # files via CJS __dirname). They ship as a minimal side-car node_modules (deno install, ~46MB, - # platform-aware so Fly amd64 works) instead of embedding all node_modules. Binary ~146MB vs ~360MB. + # Everything is inlined except the 3 packages that can't be (see tsdown.config.ts). They ship as + # a minimal side-car node_modules, installed by npm on the build platform so Fly amd64 gets the + # right libsql native binary, at the exact versions pnpm resolved. run: - - mkdir -p /tmp/sc - - deno eval 'const p="/app/node_modules/.pnpm";const v=(x)=>{for(const e of Deno.readDirSync(p))if(e.name.startsWith(x+"@"))return e.name.slice(x.length+1).split("_")[0]};Deno.writeTextFileSync("/tmp/sc/package.json",JSON.stringify({dependencies:{"@libsql/client":v("@libsql+client"),libsql:v("libsql"),"@google-cloud/tasks":v("@google-cloud+tasks")}}))' - - cd /tmp/sc && deno install --node-modules-dir=auto --allow-scripts - - cd /app/apps/workflows && deno bundle --platform=deno --minify --sloppy-imports --node-modules-dir=manual --external '@libsql/client' --external 'libsql' --external '@google-cloud/tasks' --output /tmp/sc/_serve.bundle.mjs src/serve.ts - - cd /tmp/sc && deno compile --no-check -A --node-modules-dir=manual --output /app/apps/workflows/app /tmp/sc/_serve.bundle.mjs - - mkdir -p /app/data + - ./node_modules/.bin/tsdown + - mkdir -p /tmp/sc /app/data + - node scripts/sidecar-package.mjs /tmp/sc/package.json + - npm install --prefix /tmp/sc --omit=dev --no-package-lock --no-audit --no-fund - # Runtime: distroless glibc base that already ships curl + CA certs (Deno's HTTPS works on it; no apt needed). - # Pinned to the multi-arch index digest of hi/curl:latest — dofigen mis-resolves this registry's tag to an unpullable digest. - fromImage: registry.access.redhat.com/hi/curl@sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4 + # Runtime stage: Node plus curl (healthcheck) and the system CA store, which libsql's native + # TLS reads — Node's own fetch bundles its CAs, the addon does not. + fromImage: node:26.8.1-slim + root: + run: + - apt-get update + - apt-get install -y --no-install-recommends curl ca-certificates + - rm -rf /var/lib/apt/lists/* workdir: /app/ # Metadata labels @@ -279,12 +288,17 @@ resources: org.opencontainers.image.vendor: OpenStatus org.opencontainers.image.authors: OpenStatus Team - # Copy the self-contained compiled binary (native addon embedded by deno compile) + env: + NODE_ENV: production + + # The bundle resolves its externals from the side-car node_modules one level up from dist/ copy: - fromBuilder: build - source: /app/apps/workflows/app - target: /app/apps/workflows/ - chmod: "555" + source: /app/apps/workflows/dist + target: /app/apps/workflows/dist + - fromBuilder: build + source: /tmp/sc/node_modules + target: /app/apps/workflows/node_modules - fromBuilder: build source: /app/data target: /app/data @@ -292,7 +306,6 @@ resources: user: "1000:1000" expose: "3000" - # Health check — exec form (JSON array) because the base has no shell for CMD-SHELL healthcheck: interval: 1m timeout: 10s @@ -300,4 +313,4 @@ resources: retries: 3 cmd: '["curl", "-f", "http://localhost:3000/ping"]' - entrypoint: /app/apps/workflows/app + entrypoint: ["node", "/app/apps/workflows/dist/serve.mjs"] diff --git a/apps/workflows/dofigen.yml b/apps/workflows/dofigen.yml index e67937e84..393c8752b 100644 --- a/apps/workflows/dofigen.yml +++ b/apps/workflows/dofigen.yml @@ -12,7 +12,7 @@ ignore: - /packages/tracker builders: install: - fromImage: node:24-slim + fromImage: node:26.8.1-slim workdir: /app/ labels: org.opencontainers.image.stage: install @@ -50,16 +50,18 @@ builders: - packages/locales/package.json - packages/status-fetcher/package.json - # Install dependencies (scoped to the workflows subgraph so node_modules — and the binary that embeds it — stays small) + # Install dependencies scoped to the workflows subgraph (dev included: the build stage needs tsdown) run: + # Node 25+ no longer bundles corepack + - npm install -g corepack@0.36.0 - corepack enable pnpm - - pnpm install --prod --frozen-lockfile --filter=@openstatus/workflows... --loglevel debug + - pnpm install --frozen-lockfile --filter=@openstatus/workflows... --loglevel debug cache: - /root/.local/share/pnpm/store - # Stage 4: Build application (compile to binary with Deno) + # Stage 4: Bundle the app with tsdown into dist/ build: - fromImage: denoland/deno:2.9.7 + fromImage: node:26.8.1-slim workdir: /app/apps/workflows labels: org.opencontainers.image.stage: build @@ -76,21 +78,23 @@ builders: target: /app/packages env: NODE_ENV: production - # Bundle the app to self-contained JS, EXTERNALISING the 3 packages that can't be inlined: - # @libsql/client + libsql (native .node loader) and @google-cloud/tasks (google-proto-files reads - # files via CJS __dirname). They ship as a minimal side-car node_modules (deno install, ~46MB, - # platform-aware so Fly amd64 works) instead of embedding all node_modules. Binary ~146MB vs ~360MB. + # Everything is inlined except the 3 packages that can't be (see tsdown.config.ts). They ship as + # a minimal side-car node_modules, installed by npm on the build platform so Fly amd64 gets the + # right libsql native binary, at the exact versions pnpm resolved. run: - - mkdir -p /tmp/sc - - deno eval 'const p="/app/node_modules/.pnpm";const v=(x)=>{for(const e of Deno.readDirSync(p))if(e.name.startsWith(x+"@"))return e.name.slice(x.length+1).split("_")[0]};Deno.writeTextFileSync("/tmp/sc/package.json",JSON.stringify({dependencies:{"@libsql/client":v("@libsql+client"),libsql:v("libsql"),"@google-cloud/tasks":v("@google-cloud+tasks")}}))' - - cd /tmp/sc && deno install --node-modules-dir=auto --allow-scripts - - cd /app/apps/workflows && deno bundle --platform=deno --minify --sloppy-imports --node-modules-dir=manual --external '@libsql/client' --external 'libsql' --external '@google-cloud/tasks' --output /tmp/sc/_serve.bundle.mjs src/serve.ts - - cd /tmp/sc && deno compile --no-check -A --node-modules-dir=manual --output /app/apps/workflows/app /tmp/sc/_serve.bundle.mjs - - mkdir -p /app/data + - ./node_modules/.bin/tsdown + - mkdir -p /tmp/sc /app/data + - node scripts/sidecar-package.mjs /tmp/sc/package.json + - npm install --prefix /tmp/sc --omit=dev --no-package-lock --no-audit --no-fund -# Runtime: distroless glibc base that already ships curl + CA certs (Deno's HTTPS works on it; no apt needed). -# Pinned to the multi-arch index digest of hi/curl:latest — dofigen mis-resolves this registry's tag to an unpullable digest. -fromImage: registry.access.redhat.com/hi/curl@sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4 +# Runtime stage: Node plus curl (healthcheck) and the system CA store, which libsql's native +# TLS reads — Node's own fetch bundles its CAs, the addon does not. +fromImage: node:26.8.1-slim +root: + run: + - apt-get update + - apt-get install -y --no-install-recommends curl ca-certificates + - rm -rf /var/lib/apt/lists/* workdir: /app/ # Metadata labels @@ -101,12 +105,17 @@ labels: org.opencontainers.image.vendor: OpenStatus org.opencontainers.image.authors: OpenStatus Team -# Copy the self-contained compiled binary (native addon embedded by deno compile) +env: + NODE_ENV: production + +# The bundle resolves its externals from the side-car node_modules one level up from dist/ copy: - fromBuilder: build - source: /app/apps/workflows/app - target: /app/apps/workflows/ - chmod: "555" + source: /app/apps/workflows/dist + target: /app/apps/workflows/dist + - fromBuilder: build + source: /tmp/sc/node_modules + target: /app/apps/workflows/node_modules - fromBuilder: build source: /app/data target: /app/data @@ -114,7 +123,6 @@ copy: user: "1000:1000" expose: "3000" -# Health check — exec form (JSON array) because the base has no shell for CMD-SHELL healthcheck: interval: 1m timeout: 10s @@ -122,4 +130,4 @@ healthcheck: retries: 3 cmd: '["curl", "-f", "http://localhost:3000/ping"]' -entrypoint: /app/apps/workflows/app +entrypoint: ["node", "/app/apps/workflows/dist/serve.mjs"] diff --git a/apps/workflows/package.json b/apps/workflows/package.json index 46624fca6..ca2361e4e 100644 --- a/apps/workflows/package.json +++ b/apps/workflows/package.json @@ -1,13 +1,15 @@ { "name": "@openstatus/workflows", "scripts": { - "check": "deno check --sloppy-imports src/serve.ts", - "dev": "NODE_ENV=development deno run -A --watch src/serve.ts", - "start": "NODE_ENV=production deno run -A src/serve.ts", - "test": "NODE_ENV=test RESEND_API_KEY=test-key CRON_SECRET=test-secret deno test --parallel -A --no-check --sloppy-imports" + "check": "tsc --noEmit", + "dev": "NODE_ENV=development node --import @oxc-node/core/register --watch src/serve.ts", + "start": "NODE_ENV=production node dist/serve.mjs", + "test": "NODE_ENV=test RESEND_API_KEY=test-key CRON_SECRET=test-secret deno test --parallel -A --no-check --sloppy-imports", + "build": "tsdown" }, "dependencies": { "@google-cloud/tasks": "catalog:", + "@hono/node-server": "catalog:", "@libsql/client": "catalog:", "@logtape/logtape": "catalog:", "@logtape/otel": "catalog:", @@ -43,7 +45,7 @@ "@opentelemetry/resources": "catalog:", "@opentelemetry/sdk-logs": "catalog:", "@opentelemetry/semantic-conventions": "catalog:", - "@sentry/deno": "catalog:", + "@sentry/node": "catalog:", "@slack/web-api": "catalog:", "@upstash/qstash": "catalog:", "drizzle-orm": "catalog:", @@ -55,6 +57,8 @@ "devDependencies": { "@openstatus/test-utils": "workspace:*", "@openstatus/tsconfig": "workspace:*", + "@oxc-node/core": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/apps/workflows/scripts/sidecar-package.mjs b/apps/workflows/scripts/sidecar-package.mjs new file mode 100644 index 000000000..618787f20 --- /dev/null +++ b/apps/workflows/scripts/sidecar-package.mjs @@ -0,0 +1,25 @@ +// Writes the package.json for the side-car node_modules that ships next to the +// bundle: the packages tsdown leaves external, pinned to the versions pnpm +// installed so the image runs what was tested. +import { readFileSync, realpathSync, writeFileSync } from "node:fs"; +import { findPackageJSON } from "node:module"; + +const [outFile] = process.argv.slice(2); +if (!outFile) throw new Error("usage: sidecar-package.mjs "); + +const read = (path) => JSON.parse(readFileSync(path, "utf8")); +const workflows = new URL("../package.json", import.meta.url); +const libsqlClient = findPackageJSON("@libsql/client", workflows); +const tasks = findPackageJSON("@google-cloud/tasks", workflows); +// Resolve from the real path: pnpm only links libsql inside @libsql/client's store dir. +const libsql = findPackageJSON("libsql", realpathSync(libsqlClient)); + +const dependencies = { + "@libsql/client": read(libsqlClient).version, + libsql: read(libsql).version, + "@google-cloud/tasks": read(tasks).version, +}; +writeFileSync( + outFile, + `${JSON.stringify({ private: true, dependencies }, null, 2)}\n`, +); diff --git a/apps/workflows/src/checker/outbox.ts b/apps/workflows/src/checker/outbox.ts index d16f337ac..64bcef2c6 100644 --- a/apps/workflows/src/checker/outbox.ts +++ b/apps/workflows/src/checker/outbox.ts @@ -16,7 +16,7 @@ import { selectNotificationSchema, } from "@openstatus/db/src/schema"; import { withBusyRetry } from "@openstatus/services"; -import * as Sentry from "@sentry/deno"; +import * as Sentry from "@sentry/node"; import { Effect, Exit, Queue } from "effect"; import { env } from "../env"; diff --git a/apps/workflows/src/cron/index.ts b/apps/workflows/src/cron/index.ts index c00dbb5c2..d09fc114a 100644 --- a/apps/workflows/src/cron/index.ts +++ b/apps/workflows/src/cron/index.ts @@ -1,5 +1,5 @@ import { monitorPeriodicitySchema } from "@openstatus/db/src/schema/constants"; -import * as Sentry from "@sentry/deno"; +import * as Sentry from "@sentry/node"; import { Effect, Schedule } from "effect"; import { Hono } from "hono"; diff --git a/apps/workflows/src/cron/outbox.ts b/apps/workflows/src/cron/outbox.ts index 8e0d2b5fb..f5999e617 100644 --- a/apps/workflows/src/cron/outbox.ts +++ b/apps/workflows/src/cron/outbox.ts @@ -6,7 +6,7 @@ import { notificationTrigger, } from "@openstatus/db/src/schema"; import { withBusyRetry } from "@openstatus/services"; -import * as Sentry from "@sentry/deno"; +import * as Sentry from "@sentry/node"; import { drainUntilEmpty, sweepExpiredOutbox } from "../checker/outbox"; diff --git a/apps/workflows/src/cron/scheduler.ts b/apps/workflows/src/cron/scheduler.ts index ccda55f92..fbc326d65 100644 --- a/apps/workflows/src/cron/scheduler.ts +++ b/apps/workflows/src/cron/scheduler.ts @@ -1,5 +1,5 @@ import { getLogger } from "@logtape/logtape"; -import * as Sentry from "@sentry/deno"; +import * as Sentry from "@sentry/node"; import { Effect, Fiber, Schedule } from "effect"; import { runIncidentRemindersTick } from "./incident-reminders"; diff --git a/apps/workflows/src/cron/status-drift.ts b/apps/workflows/src/cron/status-drift.ts index d936a55ee..1dccaac44 100644 --- a/apps/workflows/src/cron/status-drift.ts +++ b/apps/workflows/src/cron/status-drift.ts @@ -3,7 +3,7 @@ import { db, sql } from "@openstatus/db"; import type { MonitorStatus } from "@openstatus/db/src/schema"; import { monitor, monitorStatusTable } from "@openstatus/db/src/schema"; import { withBusyRetry } from "@openstatus/services"; -import * as Sentry from "@sentry/deno"; +import * as Sentry from "@sentry/node"; import { triggerNotifications } from "../checker/alerting"; import { enqueueOutbox } from "../checker/outbox"; diff --git a/apps/workflows/src/index.ts b/apps/workflows/src/index.ts index 1597165cf..6ce1b9b9a 100644 --- a/apps/workflows/src/index.ts +++ b/apps/workflows/src/index.ts @@ -16,7 +16,7 @@ import { } from "@opentelemetry/sdk-logs"; import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions"; import { ATTR_DEPLOYMENT_ENVIRONMENT_NAME } from "@opentelemetry/semantic-conventions/incubating"; -import * as Sentry from "@sentry/deno"; +import * as Sentry from "@sentry/node"; import { Hono } from "hono"; import { showRoutes } from "hono/dev"; import { requestId } from "hono/request-id"; @@ -66,9 +66,9 @@ function shouldSample(event: Record): boolean { return Math.random() < 0.2; } -// Build the LoggerProvider with a static OTLP exporter import so `deno bundle` -// includes it. Letting @logtape/otel create the exporter triggers a dynamic -// import of a bare specifier, which the compiled --node-modules-dir=none binary +// Build the LoggerProvider with a static OTLP exporter import so tsdown +// bundles it. Letting @logtape/otel create the exporter triggers a dynamic +// import of a bare specifier, which the image (shipped without node_modules) // can't resolve. const loggerProvider = new LoggerProvider({ resource: resourceFromAttributes({ diff --git a/apps/workflows/src/lib/sentry.ts b/apps/workflows/src/lib/sentry.ts index 7afeb72c3..a404cf3a0 100644 --- a/apps/workflows/src/lib/sentry.ts +++ b/apps/workflows/src/lib/sentry.ts @@ -1,6 +1,6 @@ import { FetchError } from "@openstatus/status-fetcher"; -import * as Sentry from "@sentry/deno"; -import type { SeverityLevel } from "@sentry/deno"; +import * as Sentry from "@sentry/node"; +import type { SeverityLevel } from "@sentry/node"; import { env } from "../env"; @@ -8,6 +8,9 @@ Sentry.init({ dsn: env().SENTRY_DSN, environment: env().NODE_ENV, tracesSampleRate: 0, + // Tracing is off; the ESM hooks only feed auto-instrumentation and use the + // deprecated module.register() (DEP0205). + registerEsmLoaderHooks: false, }); export function runSentryCron(monitorSlug: string): { diff --git a/apps/workflows/src/serve.ts b/apps/workflows/src/serve.ts index 12c5df1ea..5a2b8408d 100644 --- a/apps/workflows/src/serve.ts +++ b/apps/workflows/src/serve.ts @@ -1,5 +1,4 @@ -/// - +import { serve } from "@hono/node-server"; import { getLogger } from "@logtape/logtape"; import { shutdownOutbox, startOutboxConsumer } from "./checker/outbox"; @@ -19,13 +18,13 @@ logger.info("Starting server", { startOutboxConsumer(); startScheduler(); -const server = Deno.serve({ port: PORT }, app.fetch); +const server = serve({ fetch: app.fetch, port: PORT }); -Deno.addSignalListener("SIGTERM", () => { +process.on("SIGTERM", () => { void (async () => { logger.info("SIGTERM received, releasing outbox claims"); await stopScheduler(); await shutdownOutbox(); - await server.shutdown(); + server.close(); })(); }); diff --git a/apps/workflows/start.sh b/apps/workflows/start.sh index e24344a23..6739a1bb1 100644 --- a/apps/workflows/start.sh +++ b/apps/workflows/start.sh @@ -2,8 +2,8 @@ set -e echo "Running database migrations..." -cd /app/packages/db && deno run -A src/migrate.mts +cd /app/packages/db && node src/migrate.mts echo "Starting workflows service..." cd /app/apps/workflows -exec /app/apps/workflows/app +exec node /app/apps/workflows/dist/serve.mjs diff --git a/apps/workflows/tsconfig.json b/apps/workflows/tsconfig.json index a627827e3..455f0cda3 100644 --- a/apps/workflows/tsconfig.json +++ b/apps/workflows/tsconfig.json @@ -1,10 +1,17 @@ { "extends": "@openstatus/tsconfig/base.json", "compilerOptions": { - "jsx": "react-jsx", - "jsxImportSource": "hono/jsx", "module": "ESNext", "target": "ESNext", "moduleResolution": "bundler" - } + }, + "exclude": [ + "node_modules", + "**/*.test.ts", + "**/*.test.tsx", + "**/__tests__/**", + "**/test/**", + "**/*.mock.ts", + "**/test-preload.ts" + ] } diff --git a/apps/workflows/tsdown.config.ts b/apps/workflows/tsdown.config.ts new file mode 100644 index 000000000..c4aebd513 --- /dev/null +++ b/apps/workflows/tsdown.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from "tsdown"; + +// Inline everything except the packages that can't be bundled: libsql loads a +// native .node addon, and google-proto-files (under @google-cloud/tasks) reads +// files via CJS __dirname. Those three ship as a side-car node_modules. +const external = ["@libsql/client", "libsql", "@google-cloud/tasks"]; + +export default defineConfig({ + entry: ["src/serve.ts"], + format: "esm", + platform: "node", + target: "node26", + fixedExtension: true, + dts: false, + deps: { + neverBundle: external, + alwaysBundle: (id) => + !external.some((e) => id === e || id.startsWith(`${e}/`)), + onlyBundle: false, + }, +}); diff --git a/deno.lock b/deno.lock index c4704b002..a0899fd5e 100644 --- a/deno.lock +++ b/deno.lock @@ -58,6 +58,273 @@ "dependencies": [ "npm:turbo@2.11.2" ] + }, + "members": { + "apps/dashboard": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "apps/server": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19", + "npm:@jsr/std__yaml@^1.0.9" + ] + } + }, + "apps/status-page": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "apps/web": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/ai": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/api": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/assertions": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/db": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/emails": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/header-analysis": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/importers": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/base": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/bird-whatsapp": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/discord": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/google-chat": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/grafana-oncall": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/ms-teams": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/ntfy": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/opsgenie": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/pagerduty": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/slack": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/telegram": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/twillio-sms": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/notifications/webhook": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/services": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/status-fetcher": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/subscriptions": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/test-utils": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/theme-store": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/tinybird": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/tracker": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/upstash": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + }, + "packages/utils": { + "packageJson": { + "dependencies": [ + "npm:@jsr/std__expect@^1.0.19", + "npm:@jsr/std__testing@^1.0.19" + ] + } + } } } } diff --git a/devbox.json b/devbox.json index a8f057b3a..78ea1f227 100644 --- a/devbox.json +++ b/devbox.json @@ -2,7 +2,7 @@ "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.10.6/.schema/devbox.schema.json", "packages": [ "turso-cli@1.0.15", - "nodejs@24.12.0", + "nodejs@26.8.1", "deno@2.9.5", "bun@1.3.13", "sqld@0.24.32" diff --git a/packages/ai/package.json b/packages/ai/package.json index ae9f8d21f..dea32ab20 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -12,7 +12,7 @@ } }, "scripts": { - "check": "deno check --sloppy-imports .", + "check": "tsc --noEmit", "test": "deno test --parallel -A --no-check --sloppy-imports", "lint": "oxlint", "tsc": "tsc --noEmit" diff --git a/packages/ai/tsconfig.json b/packages/ai/tsconfig.json index 230005c38..cbf5122bf 100644 --- a/packages/ai/tsconfig.json +++ b/packages/ai/tsconfig.json @@ -3,5 +3,14 @@ "include": ["src", "*.ts"], "compilerOptions": { "noEmit": true - } + }, + "exclude": [ + "node_modules", + "**/*.test.ts", + "**/*.test.tsx", + "**/__tests__/**", + "**/test/**", + "**/*.mock.ts", + "**/test-preload.ts" + ] } diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 4c43a19cc..eddae2306 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -7,7 +7,7 @@ "author": "", "main": "src/index.ts", "scripts": { - "check": "deno check --sloppy-imports ." + "check": "tsc --noEmit" }, "dependencies": { "@openpanel/sdk": "catalog:", diff --git a/packages/analytics/tsconfig.json b/packages/analytics/tsconfig.json index 4b64f988a..7c76dbe70 100644 --- a/packages/analytics/tsconfig.json +++ b/packages/analytics/tsconfig.json @@ -1,7 +1,16 @@ { "$schema": "https://json.schemastore.org/tsconfig", "extends": "@openstatus/tsconfig/base.json", - "exclude": ["dist", "node_modules"], + "exclude": [ + "dist", + "node_modules", + "**/*.test.ts", + "**/*.test.tsx", + "**/__tests__/**", + "**/test/**", + "**/*.mock.ts", + "**/test-preload.ts" + ], "compilerOptions": { "outDir": "dist", "target": "es2021", diff --git a/packages/api/env.ts b/packages/api/env.ts index 4796312cc..091584e3b 100644 --- a/packages/api/env.ts +++ b/packages/api/env.ts @@ -1 +1,3 @@ -await Deno.copyFile("./.env.test", "./.env"); +import { copyFile } from "node:fs/promises"; + +await copyFile("./.env.test", "./.env"); diff --git a/packages/api/package.json b/packages/api/package.json index 4393ecb9d..d42aff56c 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -11,9 +11,9 @@ "./src/*": "./src/*.ts" }, "scripts": { - "check": "deno check --sloppy-imports .", + "check": "tsc --noEmit", "test": "deno test --parallel -A --no-check --sloppy-imports --env-file=.env.test --import-map=test.importmap.json", - "env": "deno run -A env.ts" + "env": "node env.ts" }, "dependencies": { "@libsql/client": "catalog:", diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 48baa5cfe..314dbdf90 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -2,6 +2,17 @@ "extends": "@openstatus/tsconfig/base.json", "include": ["src", "*.ts"], "compilerOptions": { + "declaration": false, + "declarationMap": false, "resolveJsonModule": true - } + }, + "exclude": [ + "node_modules", + "**/*.test.ts", + "**/*.test.tsx", + "**/__tests__/**", + "**/test/**", + "**/*.mock.ts", + "**/test-preload.ts" + ] } diff --git a/packages/assertions/package.json b/packages/assertions/package.json index 55d553bca..e28403cb2 100644 --- a/packages/assertions/package.json +++ b/packages/assertions/package.json @@ -7,7 +7,7 @@ "author": "", "main": "src/index.ts", "scripts": { - "check": "deno check --sloppy-imports .", + "check": "tsc --noEmit", "test": "deno test --parallel -A --no-check --sloppy-imports" }, "dependencies": { diff --git a/packages/assertions/tsconfig.json b/packages/assertions/tsconfig.json index aed15c74a..9f7ee457b 100644 --- a/packages/assertions/tsconfig.json +++ b/packages/assertions/tsconfig.json @@ -1,4 +1,13 @@ { "extends": "@openstatus/tsconfig/base.json", - "include": ["src", "*.ts"] + "include": ["src", "*.ts"], + "exclude": [ + "node_modules", + "**/*.test.ts", + "**/*.test.tsx", + "**/__tests__/**", + "**/test/**", + "**/*.mock.ts", + "**/test-preload.ts" + ] } diff --git a/packages/db/Dockerfile b/packages/db/Dockerfile index 47fc955fc..1bb8aac5f 100644 --- a/packages/db/Dockerfile +++ b/packages/db/Dockerfile @@ -3,10 +3,10 @@ # See https://github.com/lenra-io/dofigen # install -FROM node@sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6 AS install +FROM node@sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146 AS install LABEL \ - org.opencontainers.image.base.digest="sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6" \ - org.opencontainers.image.base.name="docker.io/node:24-slim" \ + org.opencontainers.image.base.digest="sha256:c0753125a3789977aefe869cbebccf70e3cfd7ea84ca48547458f02e4f1d7146" \ + org.opencontainers.image.base.name="docker.io/node:26.8.1-slim" \ org.opencontainers.image.stage="install" WORKDIR /app/ RUN \ @@ -21,22 +21,22 @@ RUN \ --mount=type=bind,target=packages/utils/package.json,source=packages/utils/package.json \ --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \ <=20'} peerDependencies: - hono: ^4 + hono: ^4 || ^5.0.0-0 '@hono/sentry@1.2.2': resolution: {integrity: sha512-027grZBrRGDPor8mRd+QOBcSpUlF07YrTp/WFDXZhbvWZ+1LrZdERUqcdg1gBGDUTanHhd9ucblpNNN6+V1bxg==} @@ -5251,6 +5290,9 @@ packages: '@jsr/std__testing@1.0.20': resolution: {integrity: sha512-DRCuU1u4OXD/AXBJ2q9IvMHthMSti1V1604b2+xa5WaAcm6Ghazk0ac1AsMwiAOXEpK0nfIXd1MD3ttT8LQ5Rw==, tarball: https://npm.jsr.io/~/11/@jsr/std__testing/1.0.20.tgz} + '@jsr/std__yaml@1.3.0': + resolution: {integrity: sha512-TuFbXlSy3nRuQuR8co2t7yzhv53ObdYZZidn8M958Glj6vBp5b7nxg7wTN8VTyCwC3vpbr6Mfdx9auNe/BMAVA==, tarball: https://npm.jsr.io/~/11/@jsr/std__yaml/1.3.0.tgz} + '@kobalte/core@0.13.14': resolution: {integrity: sha512-SBVB1lnvYbYt2x3t7fG0lo5fGLEbHQ6PII3NDPva8vD5e2v53On84ZVQiuIk0XI/55R4GQhden7Yem+R/XR8uQ==} peerDependencies: @@ -5682,6 +5724,95 @@ packages: resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} engines: {node: '>=14'} + '@oxc-node/core-android-arm-eabi@0.1.5': + resolution: {integrity: sha512-68iEMQ/68tqrylwDHUrcaQF94npiochGUY/DXjapdPBUHNQbSITyIdQzIKG7h1Zdl64kFJLQzGvOS3+VRVvK+A==} + cpu: [arm] + os: [android] + + '@oxc-node/core-android-arm64@0.1.5': + resolution: {integrity: sha512-BtOm4fxiqCXr+NqA61q87/RXf+r3+N5G9V5SdvUth9ITg+Bbvc7hO+zuLTt9dN2CgfJpJLiJUhtywfOzxUumlw==} + cpu: [arm64] + os: [android] + + '@oxc-node/core-darwin-arm64@0.1.5': + resolution: {integrity: sha512-yxtk5TrauFJgDFskIyydpdUZPLJDgYobaOo2Mi1wTvMl5XjXu1VVMDJ9/H0ilKQ33oc+D4HWggY4f0fktZJJmg==} + cpu: [arm64] + os: [darwin] + + '@oxc-node/core-darwin-x64@0.1.5': + resolution: {integrity: sha512-r85OJm4Q/SlNx2G4zdojOTVKDa9GmxuM2MSephb6Xr4gZNgMrYk8SNmos/PSPr9pcZiLtJ1EXKK7PQhmrdk37A==} + cpu: [x64] + os: [darwin] + + '@oxc-node/core-freebsd-x64@0.1.5': + resolution: {integrity: sha512-IRCLepFhP1nR0bbQDR4UuaOnACbJbCfyu/l7Em3JBpuAyCy0+IcBCsbwgjabsXW72k4dbbtz0NE5NrJIOcxb2w==} + cpu: [x64] + os: [freebsd] + + '@oxc-node/core-linux-arm-gnueabihf@0.1.5': + resolution: {integrity: sha512-uCbqPCpjQF2sPah8jfMjw+wnV7HB0EYyeF/4JNAFDBQVCYqkYiTlZeKhvsThlKsYewdO5Cz8FGbF1HhQJC5XOQ==} + cpu: [arm] + os: [linux] + + '@oxc-node/core-linux-arm64-gnu@0.1.5': + resolution: {integrity: sha512-epy8YgOxhIiIEF2E/KKr5WhWmN7AONPGIYNqzbJpyXqH/fVKs2oZYfgoYGOjM794oT3AE4VGNAqwd6lMmmGO8g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-node/core-linux-arm64-musl@0.1.5': + resolution: {integrity: sha512-TCpCE9HJFh8czVjltJFxoAKT6rkDBuSsInODoUKrq7NKw3p6nuI6O8stMTxPnLm8658ZR0DDZiPxzp3pkjbYag==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-node/core-linux-ppc64-gnu@0.1.5': + resolution: {integrity: sha512-u8EFVWAv5HydemPV0EZvHWjyL0ymRganYhwGYWpWBq6/qA5CoSyBZ2YcmCizhhvsjW5GjAcUHoTF0Y1naB7Zow==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-node/core-linux-s390x-gnu@0.1.5': + resolution: {integrity: sha512-gdpOiodpzvRhSTntsSYcfcaADJPkMGPCY+RIABiQUU/inNLflUNNv5d2J0rXQEKswEJqC4SNQ2+qLdrcoOfzYw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-node/core-linux-x64-gnu@0.1.5': + resolution: {integrity: sha512-gggyg6BLiED3hsCtl1ShVjVNlPkHQ/p/SQna1ytsII24O29aoQH0iqSPzTSAw18Ew0luyHRYQZdarOX0bP/Vug==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-node/core-linux-x64-musl@0.1.5': + resolution: {integrity: sha512-xXIByxOf/RTQJqRyHEz/aq5yRcuZjo4CNhrXaTzxPHEPL8fY/HKxi6F3p7joF6hvGDZP9XsRyGTUZDnedNPFvw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-node/core-openharmony-arm64@0.1.5': + resolution: {integrity: sha512-0JFa8khKtaAOODEtZEM/lW8HeZNE9m5v+wXrabTn2vpPmL2FPmqz9eT4tYFNNHRjw515gcsY5P7Id0dblwheaA==} + cpu: [arm64] + os: [openharmony] + + '@oxc-node/core-win32-arm64-msvc@0.1.5': + resolution: {integrity: sha512-Ev2gMd7SWPJ4Qwn3lb5Lcckq1qsB5++NAF2nOzDWlARNZN8QyMwt9uoLX3Sk2UunExP0Ux9V5VnOpdNEBziQEA==} + cpu: [arm64] + os: [win32] + + '@oxc-node/core-win32-ia32-msvc@0.1.5': + resolution: {integrity: sha512-2Di21C19W94ryPWYh7WYMwGfJH4hV4cgkJqH8U16CDMTN+QBVwzXRr8xwSxz3BiKOaPRsLMIfO2g4R7R2674WQ==} + cpu: [ia32] + os: [win32] + + '@oxc-node/core-win32-x64-msvc@0.1.5': + resolution: {integrity: sha512-ctl1jv+uLXDZKSJgkMDwDoVQulKQuLh6SIm6mcJK3XCo1+i3aou6ycOWNjgXX4lRfhFRmzC3Oo2Akf2NB06KLg==} + cpu: [x64] + os: [win32] + + '@oxc-node/core@0.1.5': + resolution: {integrity: sha512-DAL8opn0FPSH/wtsvOP1jZ8nPP0zOKdXP/8K3IziacsCMhluhhT8hTcSVVIKdAumpmcZ4xPei/0YJS6n91Ya/Q==} + '@oxc-parser/binding-android-arm-eabi@0.150.0': resolution: {integrity: sha512-oQef2Zu4Prz1KLKznz3HqZzU9uVoA5PMoDZuuLmqms7hKmKSAPzlaMnLllJq3t+rgKmfJJ2siPrpZfFrW06btw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5807,6 +5938,9 @@ packages: '@oxc-project/types@0.150.0': resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} + '@oxc-project/types@0.153.0': + resolution: {integrity: sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==} + '@oxc-resolver/binding-android-arm-eabi@11.24.2': resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} cpu: [arm] @@ -6384,6 +6518,9 @@ packages: '@protobufjs/utf8@1.1.2': resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} + '@quansync/fs@1.1.0': + resolution: {integrity: sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==} + '@radix-ui/number@1.1.3': resolution: {integrity: sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==} @@ -7084,6 +7221,105 @@ packages: '@react-email/ui@6.9.5': resolution: {integrity: sha512-UvE0yeSQCvdBm9BoEgvZ5vBi8abk02GbRE+4RQjjtxozy66D/O1GbUgK9RdB26+7EqQdOxdwkGLq5CMCiRO96A==} + '@rolldown/binding-android-arm-eabi@1.2.13': + resolution: {integrity: sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.13': + resolution: {integrity: sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.13': + resolution: {integrity: sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.13': + resolution: {integrity: sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.13': + resolution: {integrity: sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.13': + resolution: {integrity: sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.13': + resolution: {integrity: sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.13': + resolution: {integrity: sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.13': + resolution: {integrity: sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.13': + resolution: {integrity: sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.13': + resolution: {integrity: sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.13': + resolution: {integrity: sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.13': + resolution: {integrity: sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.13': + resolution: {integrity: sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.13': + resolution: {integrity: sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/plugin-commonjs@28.0.1': resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -7365,9 +7601,6 @@ packages: resolution: {integrity: sha512-ixm8NISFlPlEo3FjSaqmq4nnd13BRHoafwJ5MG+okCz6BKGZ1SexEggP42/QpGvDprUUHnfncG6WUMgcarr1zA==} engines: {node: '>=14.18'} - '@sentry/deno@10.75.1': - resolution: {integrity: sha512-fBWh7Tdx4B2SsCOeJ2QupO3LlgM99nnNDxI5pKlruJQijfragw2YidLQwcU0RGb/KE0IMvEyMgkpKxCF5cinng==} - '@sentry/feedback@10.75.1': resolution: {integrity: sha512-2P5G160I0bHW4jXTU5gJB4I6h/mamAdkK2oezyuE6+bwoXZ2JSh7+hug/FLhzIQMu92ZoyrP6ar/1v6TC33w+w==} engines: {node: '>=18'} @@ -8293,6 +8526,165 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@yuku-codegen/binding-android-arm64@0.10.2': + resolution: {integrity: sha512-Oc2KInVkPfUjEB4PeV6X0NvIoyYTzDe/WmqFrTwBqKs6YKnz4A7XwWQvJTb7M0rLz9a6WgpUUiiS5QKaCi4O/g==} + cpu: [arm64] + os: [android] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-darwin-arm64@0.10.2': + resolution: {integrity: sha512-3H7eNPIHJndUJXZ4QUGBPq1zC6RGcUZfm7bymJes+/N7wTVWUn1bxZ9JcozYHpkWQNm9f23G8YWbaHD9aYH72A==} + cpu: [arm64] + os: [darwin] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-darwin-x64@0.10.2': + resolution: {integrity: sha512-AJOUpR2s3LF9AWiiub/Uyc/UoXNTWcq8hK3cVI6fUSXtwh34dG21J6hRuNlO6JVJFTo4o3ScVvZOrh/YFfUEAA==} + cpu: [x64] + os: [darwin] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-freebsd-x64@0.10.2': + resolution: {integrity: sha512-ms7DcZu87u5CiK/wMwvpKAvAmtaqKjCQIXNweMLypG6qbuiaOMQf1jpbB5+j46xBcgCovo8TQMcv0bCQLKIL9w==} + cpu: [x64] + os: [freebsd] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-linux-arm-gnu@0.10.2': + resolution: {integrity: sha512-xJDpYAsKV5+eaiBhTYl05fvT6sst4PsCeuIFMRu9b0/WCSrNQPfCDtAQ5/MS6xNpsdujdZEPR+gmfWk3ZG5i3A==} + cpu: [arm] + os: [linux] + libc: [glibc] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-linux-arm-musl@0.10.2': + resolution: {integrity: sha512-qfTkgd7AEx61l4K9VtXWCGTxc/fmXJ4ZheDz3i+/AAJUtg4sa0bPrc0VBxPggB/rayR8Z3+JfrBItuyanBJJ9Q==} + cpu: [arm] + os: [linux] + libc: [musl] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-linux-arm64-gnu@0.10.2': + resolution: {integrity: sha512-4e6Mifm/4UdjtU3D8mATIrvgP+xEiH8xtQOjd0zpd72XKWT7ug3sdyhq2utkkZFP6BvYp7SgZrI+aR4VeIOHdw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-linux-arm64-musl@0.10.2': + resolution: {integrity: sha512-RdsJrUfDYFVV3JOmWFUWwSu31fa1APn12xDeIKxgl/YWxrabwtxsDBNjF2561c7tmcbiewdCUvngqRs8AyGVLA==} + cpu: [arm64] + os: [linux] + libc: [musl] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-linux-x64-gnu@0.10.2': + resolution: {integrity: sha512-mVzWimEPPreaPyXIUvxsHoJzvO7ckZ5j0LgQFHz04zQIRwt9A9T2hA7K5/jYjJKkMxWG/U2VjhGNwVhtyU+uqg==} + cpu: [x64] + os: [linux] + libc: [glibc] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-linux-x64-musl@0.10.2': + resolution: {integrity: sha512-Y77fyISurmr2mvO1yeq3u+x/WJbACgPR4w+lzEVx30ViCxZzIGrZPRN1yEdZ9xUNPNsIO5thBHIdRNG+UGUG+Q==} + cpu: [x64] + os: [linux] + libc: [musl] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-win32-arm64@0.10.2': + resolution: {integrity: sha512-1+tGLyG0u5YYy0lev4ck7/0sd8xJ9SZde0dLut7qLDPZV5WVTV8x6OxNXUne/PGuHZyO1vK+txPQzzHOyXHGSw==} + cpu: [arm64] + os: [win32] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-codegen/binding-win32-x64@0.10.2': + resolution: {integrity: sha512-8a2SExRohRbwC0MY4VpOF0/RSckrJ2ASZqAor5/RYSJJaeadR93n10gZzcKT6pY9ukiSOIZCRKVRD2tH73T0qA==} + cpu: [x64] + os: [win32] + deprecated: yuku-codegen is pure JavaScript since 0.14 + + '@yuku-parser/binding-android-arm64@0.10.2': + resolution: {integrity: sha512-2VPBU9fRGRAQ2xPAvghnec3oou5Nrxm2Bezhf+13UMspAxQSkF/32r+ySKXSwIPA5/RivumDJDxAxc301Sgicw==} + cpu: [arm64] + os: [android] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-darwin-arm64@0.10.2': + resolution: {integrity: sha512-LD+PMZE51tCYTOss5HBkm3/AE39MvcMDBfWJx7A4yDcjfNbAQDnHZKtzSOuqrswx+TQHY0ws5xn6+fWOwtmfBA==} + cpu: [arm64] + os: [darwin] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-darwin-x64@0.10.2': + resolution: {integrity: sha512-mmZ8cND+AoIIMRERyMinlg5ApHxP23B9jH2B5wT7T+dliPa9rubLxneB/SUjFwyUjGaFnB5G7t4YvpfbO5zbkQ==} + cpu: [x64] + os: [darwin] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-freebsd-x64@0.10.2': + resolution: {integrity: sha512-gVIjaaIddbRfAhHlC8N809wQWml7mxfSVnzaLtzGXObTeFTPAg/YVnQXt1UOhPM1ah5eG/8Y0RUlNpB4GVe7eQ==} + cpu: [x64] + os: [freebsd] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-linux-arm-gnu@0.10.2': + resolution: {integrity: sha512-q/XPPQQAPdlw05aPj30ygBhekmQryGOwxVraBgApjKK8yY1kNQgqq6XCYLF1WHSee+lhxclrTO7W0/bt7dR1GA==} + cpu: [arm] + os: [linux] + libc: [glibc] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-linux-arm-musl@0.10.2': + resolution: {integrity: sha512-A+Cb0I1hFF4wilTQpWs79k1aNnj4B2tkrHx3zsuUNF9BtVY2zPZ4yeQEM/zjXrS/qJlNMZVK9NrWJjwdpnTrfg==} + cpu: [arm] + os: [linux] + libc: [musl] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-linux-arm64-gnu@0.10.2': + resolution: {integrity: sha512-aGNSzqIqqphFwAdIFwVvKIyXD1Iy3CxrEJVIZAT87Ecyi4vCmmDD2v2l9h+Gd3/wSy3JZlOI792LJbKAjyy9rQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-linux-arm64-musl@0.10.2': + resolution: {integrity: sha512-Ddl1sF0rtuCXyHGSOV6dcmdx+ETv1iD+IVFqQuOjzkJZWclxJxdBWX6ZJMRtTiGqGUTbqLEKiTXxpR/Bvqk+2A==} + cpu: [arm64] + os: [linux] + libc: [musl] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-linux-x64-gnu@0.10.2': + resolution: {integrity: sha512-/nlcpR6IF5U+0m5L9wvAIXeQa2DT+BXuvqKDsTcOTlcc0B4dHNyqE5hTXsS4hAyimpy2ZK8A1zMNF5hTrjg2cg==} + cpu: [x64] + os: [linux] + libc: [glibc] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-linux-x64-musl@0.10.2': + resolution: {integrity: sha512-GX80dxTQD/M/OryyuxJcFzFENzry3cDFPvCFTyWogNWQH3fSHfMrNfpwpl1YzMos1eV9NygK5GSDG7VArQlb4w==} + cpu: [x64] + os: [linux] + libc: [musl] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-win32-arm64@0.10.2': + resolution: {integrity: sha512-agePQBV4VHewiGU0ACSjscZ/hJd283f9JfAF19Gf1rI5+wy5tTgx4GS36i0b3xim15AQ4RCpDRosEvhLZ4zAOw==} + cpu: [arm64] + os: [win32] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-parser/binding-win32-x64@0.10.2': + resolution: {integrity: sha512-s8//CMpgL5+y1lvDCdyh1rwGI5+ytDJywFJRe1vnhI7n0j+caxshNucurikYLLVeQ2SYFex6aPrzgQxkabBQRA==} + cpu: [x64] + os: [win32] + deprecated: yuku-parser runs on yuku-core since 0.14 + + '@yuku-toolchain/types@0.10.2': + resolution: {integrity: sha512-sSeo4SSSToiS+sSD+bwn/s94EEcaLJ7tG5LCp8gFYC1G5VzxzX7fqB6m9RU1yMD8KTpu6zdU/I1NlQf8hVBJ9Q==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -8487,6 +8879,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cac@7.0.1: + resolution: {integrity: sha512-86diuUyeeWM8CrqhpGCaDafrzjS1s++7sWy2AbAPoFNz/xKv7ID57CR4pZsMuGCh60PtsnEx4z68b+Vgt07VPw==} + engines: {node: '>=20.19.0'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -8825,6 +9221,9 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -9017,6 +9416,15 @@ packages: drizzle-orm: '>=0.36.0' zod: ^3.25.0 || ^4.0.0 + dts-resolver@3.0.0: + resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} + engines: {node: ^22.18.0 || >=24.0.0} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -9042,6 +9450,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} + engines: {node: '>=14'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -9385,6 +9797,10 @@ packages: get-tsconfig@4.14.3: resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} + engines: {node: '>=20.20.0'} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -9486,6 +9902,9 @@ packages: resolution: {integrity: sha512-/Gng7NfoykZl2pjukW5Z6+8Yxm3BPRf86GTbQnt0SbySkvax4fyL4H3HhY1cCpBGmiW9XDRFzRV+CXK2W8QudQ==} engines: {node: '>=16.9.0'} + hookable@6.1.2: + resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==} + html-encoding-sniffer@7.0.0: resolution: {integrity: sha512-UikN5yr7xsCDAq87Or5or0PAlD3HJJOKVzM05az588WnpDJ4Ux7a2A53Qi6gofGg2/EtvF/H4hCi/TXfCW4Y6w==} engines: {node: ^22.13.0 || >=24.0.0} @@ -9553,6 +9972,10 @@ packages: resolution: {integrity: sha512-mPKuL8bPQzecui2KK6Gb+M8JvJoHnhS1FeYGa22QopBmlevF5F0FE6ued/B5EgHDeIoMTONIpDWWFKUPOG0DBQ==} engines: {node: '>=18'} + import-without-cache@0.4.1: + resolution: {integrity: sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==} + engines: {node: ^22.18.0 || >=24.0.0} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -10508,6 +10931,14 @@ packages: resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} engines: {node: '>= 10'} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -10886,6 +11317,9 @@ packages: resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} engines: {node: '>=0.6'} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -11140,6 +11574,33 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown-plugin-dts@0.28.6: + resolution: {integrity: sha512-qKrFtBfRfR2hP233m7Ic9zf3wv6MSYdZghWKMdEO6dRYZGlNfINJAa1P5ZVvyHh3mrcd7IJQvIY8L9vnm+v5rQ==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} + peerDependencies: + '@typescript/native-preview': '*' + '@volar/typescript': ~2.4.0 + '@vue/language-core': ~3.2.0 || ~3.3.0 + rolldown: ^1.2.0 + typescript: ^5.0.0 || ^6.0.0 || ~7.0.0 + vue-tsc: ~3.2.0 || ~3.3.0 + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + '@volar/typescript': + optional: true + '@vue/language-core': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.2.13: + resolution: {integrity: sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.63.4: resolution: {integrity: sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -11606,6 +12067,40 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} + tsdown@0.23.0: + resolution: {integrity: sha512-BaT+ep1xnj5hdyICLd5r5SYYE+TXnI1ATePLykv9vcKpHpFTWUWRH+x1AF/E2qcu3YB6+vI8IdyxIIIffEqw5Q==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.23.0 + '@tsdown/exe': 0.23.0 + '@vitejs/devtools': '*' + publint: ^0.3.8 + tsx: '*' + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 + unplugin-unused: '>=0.5.0' + unrun: '*' + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + tsx: + optional: true + typescript: + optional: true + unplugin-unused: + optional: true + unrun: + optional: true + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -11673,6 +12168,9 @@ packages: resolution: {integrity: sha512-FoSOKV7NEofQSkAefMVHam4ZPKYMxjAydxiV72UFEDNV/YofxjGfiZ2A9pZjdL/lRJzTjcu4PABo1JYJX8N5iQ==} engines: {node: '>=14'} + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -11813,6 +12311,10 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + verkit@0.4.1: + resolution: {integrity: sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==} + engines: {node: '>=18.12.0'} + vfile-matter@5.0.1: resolution: {integrity: sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw==} @@ -11986,6 +12488,15 @@ packages: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} + yuku-ast@0.10.2: + resolution: {integrity: sha512-UnG9mA6giglCvSErft2/40TVFX750Sj1xgwddPLpG7J7rlr/P1wPADg9G2RK+d/1tNLtRVoLdMMOMVBB9561TQ==} + + yuku-codegen@0.10.2: + resolution: {integrity: sha512-hentl2dtrF6cPjiAirtkfxfFZBA6Hdm61UqRJ7cA0qrlDNMk9PZGOjw5w1mx3E0hu/6pHcJF4dJW+D0SXHPZOA==} + + yuku-parser@0.10.2: + resolution: {integrity: sha512-CgaU0/PPjCAIEZ3WQroosOxTY3eeKldAN3h+vk8pMNz4+jl1CZzBR4pW+K/rRPF112VooCL5FdjJoiMNjDrL2A==} + zod-to-json-schema@3.25.2: resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} peerDependencies: @@ -13218,7 +13729,7 @@ snapshots: pkce-challenge: 5.0.1 zod: 4.6.5 - '@hono/node-server@2.1.1(hono@4.13.8)': + '@hono/node-server@2.1.4(hono@4.13.8)': dependencies: hono: 4.13.8 @@ -13606,6 +14117,8 @@ snapshots: '@jsr/std__internal': 1.0.14 '@jsr/std__path': 1.1.6 + '@jsr/std__yaml@1.3.0': {} + '@kobalte/core@0.13.14(solid-js@1.9.15)': dependencies: '@floating-ui/dom': 1.8.0 @@ -13744,7 +14257,7 @@ snapshots: '@modelcontextprotocol/sdk@1.30.0(supports-color@8.1.1)(zod@3.25.76)': dependencies: - '@hono/node-server': 2.1.1(hono@4.13.8) + '@hono/node-server': 2.1.4(hono@4.13.8) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -13766,7 +14279,7 @@ snapshots: '@modelcontextprotocol/sdk@1.30.0(supports-color@8.1.1)(zod@4.6.5)': dependencies: - '@hono/node-server': 2.1.1(hono@4.13.8) + '@hono/node-server': 2.1.4(hono@4.13.8) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -14063,6 +14576,75 @@ snapshots: '@opentelemetry/semantic-conventions@1.43.0': {} + '@oxc-node/core-android-arm-eabi@0.1.5': + optional: true + + '@oxc-node/core-android-arm64@0.1.5': + optional: true + + '@oxc-node/core-darwin-arm64@0.1.5': + optional: true + + '@oxc-node/core-darwin-x64@0.1.5': + optional: true + + '@oxc-node/core-freebsd-x64@0.1.5': + optional: true + + '@oxc-node/core-linux-arm-gnueabihf@0.1.5': + optional: true + + '@oxc-node/core-linux-arm64-gnu@0.1.5': + optional: true + + '@oxc-node/core-linux-arm64-musl@0.1.5': + optional: true + + '@oxc-node/core-linux-ppc64-gnu@0.1.5': + optional: true + + '@oxc-node/core-linux-s390x-gnu@0.1.5': + optional: true + + '@oxc-node/core-linux-x64-gnu@0.1.5': + optional: true + + '@oxc-node/core-linux-x64-musl@0.1.5': + optional: true + + '@oxc-node/core-openharmony-arm64@0.1.5': + optional: true + + '@oxc-node/core-win32-arm64-msvc@0.1.5': + optional: true + + '@oxc-node/core-win32-ia32-msvc@0.1.5': + optional: true + + '@oxc-node/core-win32-x64-msvc@0.1.5': + optional: true + + '@oxc-node/core@0.1.5': + dependencies: + pirates: 4.0.7 + optionalDependencies: + '@oxc-node/core-android-arm-eabi': 0.1.5 + '@oxc-node/core-android-arm64': 0.1.5 + '@oxc-node/core-darwin-arm64': 0.1.5 + '@oxc-node/core-darwin-x64': 0.1.5 + '@oxc-node/core-freebsd-x64': 0.1.5 + '@oxc-node/core-linux-arm-gnueabihf': 0.1.5 + '@oxc-node/core-linux-arm64-gnu': 0.1.5 + '@oxc-node/core-linux-arm64-musl': 0.1.5 + '@oxc-node/core-linux-ppc64-gnu': 0.1.5 + '@oxc-node/core-linux-s390x-gnu': 0.1.5 + '@oxc-node/core-linux-x64-gnu': 0.1.5 + '@oxc-node/core-linux-x64-musl': 0.1.5 + '@oxc-node/core-openharmony-arm64': 0.1.5 + '@oxc-node/core-win32-arm64-msvc': 0.1.5 + '@oxc-node/core-win32-ia32-msvc': 0.1.5 + '@oxc-node/core-win32-x64-msvc': 0.1.5 + '@oxc-parser/binding-android-arm-eabi@0.150.0': optional: true @@ -14122,6 +14704,8 @@ snapshots: '@oxc-project/types@0.150.0': {} + '@oxc-project/types@0.153.0': {} + '@oxc-resolver/binding-android-arm-eabi@11.24.2': optional: true @@ -14453,6 +15037,10 @@ snapshots: '@protobufjs/utf8@1.1.2': {} + '@quansync/fs@1.1.0': + dependencies: + quansync: 1.0.0 + '@radix-ui/number@1.1.3': {} '@radix-ui/primitive@1.1.7': {} @@ -15224,6 +15812,53 @@ snapshots: - react-dom - sass + '@rolldown/binding-android-arm-eabi@1.2.13': + optional: true + + '@rolldown/binding-android-arm64@1.2.13': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.13': + optional: true + + '@rolldown/binding-darwin-x64@1.2.13': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.13': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.13': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.13': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.13': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.13': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.13': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.13': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.13': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.13': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.13': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.13': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + '@rollup/plugin-commonjs@28.0.1(rollup@4.63.4)': dependencies: '@rollup/pluginutils': 5.4.0(rollup@4.63.4) @@ -15467,12 +16102,6 @@ snapshots: '@sentry/types': 8.9.2 '@sentry/utils': 8.9.2 - '@sentry/deno@10.75.1': - dependencies: - '@opentelemetry/api': 1.9.1 - '@sentry/core': 10.75.1 - '@sentry/server-utils': 10.75.1 - '@sentry/feedback@10.75.1': dependencies: '@sentry/core': 10.75.1 @@ -16383,6 +17012,80 @@ snapshots: '@xtuc/long@4.2.2': {} + '@yuku-codegen/binding-android-arm64@0.10.2': + optional: true + + '@yuku-codegen/binding-darwin-arm64@0.10.2': + optional: true + + '@yuku-codegen/binding-darwin-x64@0.10.2': + optional: true + + '@yuku-codegen/binding-freebsd-x64@0.10.2': + optional: true + + '@yuku-codegen/binding-linux-arm-gnu@0.10.2': + optional: true + + '@yuku-codegen/binding-linux-arm-musl@0.10.2': + optional: true + + '@yuku-codegen/binding-linux-arm64-gnu@0.10.2': + optional: true + + '@yuku-codegen/binding-linux-arm64-musl@0.10.2': + optional: true + + '@yuku-codegen/binding-linux-x64-gnu@0.10.2': + optional: true + + '@yuku-codegen/binding-linux-x64-musl@0.10.2': + optional: true + + '@yuku-codegen/binding-win32-arm64@0.10.2': + optional: true + + '@yuku-codegen/binding-win32-x64@0.10.2': + optional: true + + '@yuku-parser/binding-android-arm64@0.10.2': + optional: true + + '@yuku-parser/binding-darwin-arm64@0.10.2': + optional: true + + '@yuku-parser/binding-darwin-x64@0.10.2': + optional: true + + '@yuku-parser/binding-freebsd-x64@0.10.2': + optional: true + + '@yuku-parser/binding-linux-arm-gnu@0.10.2': + optional: true + + '@yuku-parser/binding-linux-arm-musl@0.10.2': + optional: true + + '@yuku-parser/binding-linux-arm64-gnu@0.10.2': + optional: true + + '@yuku-parser/binding-linux-arm64-musl@0.10.2': + optional: true + + '@yuku-parser/binding-linux-x64-gnu@0.10.2': + optional: true + + '@yuku-parser/binding-linux-x64-musl@0.10.2': + optional: true + + '@yuku-parser/binding-win32-arm64@0.10.2': + optional: true + + '@yuku-parser/binding-win32-x64@0.10.2': + optional: true + + '@yuku-toolchain/types@0.10.2': {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -16557,6 +17260,8 @@ snapshots: cac@6.7.14: {} + cac@7.0.1: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -16849,6 +17554,8 @@ snapshots: define-lazy-prop@3.0.0: {} + defu@6.1.7: {} + depd@2.0.0: {} dequal@2.0.3: {} @@ -16946,6 +17653,10 @@ snapshots: drizzle-orm: 0.45.3(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/pg@8.15.6)(@upstash/redis@1.38.0)(bun-types@1.4.2) zod: 4.6.5 + dts-resolver@3.0.0(oxc-resolver@11.24.2): + optionalDependencies: + oxc-resolver: 11.24.2 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -16973,6 +17684,8 @@ snapshots: emoji-regex@8.0.0: {} + empathic@2.1.0: {} + encodeurl@2.0.0: {} end-of-stream@1.4.5: @@ -17487,6 +18200,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@5.0.0-beta.6: + dependencies: + resolve-pkg-maps: 1.0.0 + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -17647,6 +18364,8 @@ snapshots: hono@4.13.8: {} + hookable@6.1.2: {} + html-encoding-sniffer@7.0.0: dependencies: '@exodus/bytes': 1.15.2 @@ -17740,6 +18459,8 @@ snapshots: es-module-lexer: 3.0.2 module-details-from-path: 1.0.4 + import-without-cache@0.4.1: {} + inherits@2.0.4: {} inline-style-parser@0.2.7: {} @@ -18836,6 +19557,10 @@ snapshots: object-treeify@1.1.33: {} + obug@2.2.1: {} + + obug@3.0.0: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -19265,6 +19990,8 @@ snapshots: es-define-property: 1.0.1 side-channel: 1.1.1 + quansync@1.0.0: {} + queue-microtask@1.2.3: {} radix-ui@1.6.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): @@ -19650,6 +20377,41 @@ snapshots: reusify@1.1.0: {} + rolldown-plugin-dts@0.28.6(oxc-resolver@11.24.2)(rolldown@1.2.13)(typescript@7.0.2): + dependencies: + dts-resolver: 3.0.0(oxc-resolver@11.24.2) + get-tsconfig: 5.0.0-beta.6 + obug: 3.0.0 + rolldown: 1.2.13 + yuku-ast: 0.10.2 + yuku-codegen: 0.10.2 + yuku-parser: 0.10.2 + optionalDependencies: + typescript: 7.0.2 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.2.13: + dependencies: + '@oxc-project/types': 0.153.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.13 + '@rolldown/binding-android-arm64': 1.2.13 + '@rolldown/binding-darwin-arm64': 1.2.13 + '@rolldown/binding-darwin-x64': 1.2.13 + '@rolldown/binding-freebsd-x64': 1.2.13 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.13 + '@rolldown/binding-linux-arm64-gnu': 1.2.13 + '@rolldown/binding-linux-arm64-musl': 1.2.13 + '@rolldown/binding-linux-ppc64-gnu': 1.2.13 + '@rolldown/binding-linux-s390x-gnu': 1.2.13 + '@rolldown/binding-linux-x64-gnu': 1.2.13 + '@rolldown/binding-linux-x64-musl': 1.2.13 + '@rolldown/binding-openharmony-arm64': 1.2.13 + '@rolldown/binding-win32-arm64-msvc': 1.2.13 + '@rolldown/binding-win32-x64-msvc': 1.2.13 + rollup@4.63.4: dependencies: '@types/estree': 1.0.9 @@ -20231,6 +20993,32 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsdown@0.23.0(oxc-resolver@11.24.2)(tsx@4.23.15)(typescript@7.0.2): + dependencies: + cac: 7.0.1 + defu: 6.1.7 + empathic: 2.1.0 + hookable: 6.1.2 + import-without-cache: 0.4.1 + obug: 2.2.1 + picomatch: 4.0.7 + rolldown: 1.2.13 + rolldown-plugin-dts: 0.28.6(oxc-resolver@11.24.2)(rolldown@1.2.13)(typescript@7.0.2) + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + verkit: 0.4.1 + optionalDependencies: + tsx: 4.23.15 + typescript: 7.0.2 + transitivePeerDependencies: + - '@typescript/native-preview' + - '@volar/typescript' + - '@vue/language-core' + - oxc-resolver + - vue-tsc + tslib@2.8.1: {} tsup@8.5.1(@swc/core@1.16.2)(jiti@2.7.0)(postcss@8.5.28)(supports-color@8.1.1)(tsx@4.23.15)(typescript@7.0.2)(yaml@2.9.1): @@ -20322,6 +21110,11 @@ snapshots: unbash@4.0.11: {} + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.1.0 + quansync: 1.0.0 + uncrypto@0.1.3: {} undici-types@8.9.0: {} @@ -20470,6 +21263,8 @@ snapshots: - '@types/react' - '@types/react-dom' + verkit@0.4.1: {} + vfile-matter@5.0.1: dependencies: vfile: 6.0.3 @@ -20710,6 +21505,45 @@ snapshots: yoctocolors@2.2.0: {} + yuku-ast@0.10.2: + dependencies: + '@yuku-toolchain/types': 0.10.2 + + yuku-codegen@0.10.2: + dependencies: + '@yuku-toolchain/types': 0.10.2 + optionalDependencies: + '@yuku-codegen/binding-android-arm64': 0.10.2 + '@yuku-codegen/binding-darwin-arm64': 0.10.2 + '@yuku-codegen/binding-darwin-x64': 0.10.2 + '@yuku-codegen/binding-freebsd-x64': 0.10.2 + '@yuku-codegen/binding-linux-arm-gnu': 0.10.2 + '@yuku-codegen/binding-linux-arm-musl': 0.10.2 + '@yuku-codegen/binding-linux-arm64-gnu': 0.10.2 + '@yuku-codegen/binding-linux-arm64-musl': 0.10.2 + '@yuku-codegen/binding-linux-x64-gnu': 0.10.2 + '@yuku-codegen/binding-linux-x64-musl': 0.10.2 + '@yuku-codegen/binding-win32-arm64': 0.10.2 + '@yuku-codegen/binding-win32-x64': 0.10.2 + + yuku-parser@0.10.2: + dependencies: + '@yuku-toolchain/types': 0.10.2 + yuku-ast: 0.10.2 + optionalDependencies: + '@yuku-parser/binding-android-arm64': 0.10.2 + '@yuku-parser/binding-darwin-arm64': 0.10.2 + '@yuku-parser/binding-darwin-x64': 0.10.2 + '@yuku-parser/binding-freebsd-x64': 0.10.2 + '@yuku-parser/binding-linux-arm-gnu': 0.10.2 + '@yuku-parser/binding-linux-arm-musl': 0.10.2 + '@yuku-parser/binding-linux-arm64-gnu': 0.10.2 + '@yuku-parser/binding-linux-arm64-musl': 0.10.2 + '@yuku-parser/binding-linux-x64-gnu': 0.10.2 + '@yuku-parser/binding-linux-x64-musl': 0.10.2 + '@yuku-parser/binding-win32-arm64': 0.10.2 + '@yuku-parser/binding-win32-x64': 0.10.2 + zod-to-json-schema@3.25.2(zod@3.25.76): dependencies: zod: 3.25.76 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1c2ef2eae..d51813724 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -58,6 +58,7 @@ catalog: "@dnd-kit/utilities": 3.2.2 "@google-cloud/tasks": 7.1.1 "@hono/mcp": 0.2.5 + "@hono/node-server": 2.1.4 "@hono/sentry": 1.2.2 "@hono/zod-openapi": 1.6.3 "@hono/zod-validator": 0.8.0 @@ -82,6 +83,7 @@ catalog: "@opentelemetry/resources": 2.11.0 "@opentelemetry/sdk-logs": 0.208.0 "@opentelemetry/semantic-conventions": 1.43.0 + "@oxc-node/core": 0.1.5 "@radix-ui/react-accordion": 1.2.20 "@radix-ui/react-alert-dialog": 1.1.23 "@radix-ui/react-avatar": 1.2.6 @@ -109,7 +111,7 @@ catalog: "@radix-ui/react-tooltip": 1.2.16 "@react-email/ui": 6.9.5 "@scalar/hono-api-reference": 0.8.10 - "@sentry/deno": 10.75.1 + "@sentry/node": 10.75.1 "@sentry/nextjs": 10.75.1 "@slack/web-api": 8.1.1 "@t3-oss/env-core": 0.13.11 @@ -211,6 +213,7 @@ catalog: tailwind-merge: 3.7.0 tailwindcss: 4.3.3 tailwindcss-animate: 1.0.7 + tsdown: 0.23.0 tsup: 8.5.1 tw-animate-css: 1.4.0 typescript: 7.0.2 -- 2.51.2