From 8600b0177f3d2d353b9f4c5cb8311c1f3cc29cf6 Mon Sep 17 00:00:00 2001 From: lentil32 Date: Tue, 2 Jun 2026 15:17:11 +0900 Subject: [PATCH 01/13] fix(landing): configure sitemap metadata --- apps/landing/astro.config.ts | 14 ++++++++++++-- apps/landing/package.json | 10 ++++++---- apps/landing/worker-configuration.d.ts | 3 ++- apps/landing/wrangler.toml | 5 +++-- bun.lock | 26 ++++++++++++++++++++++++++ package.json | 1 + 6 files changed, 50 insertions(+), 9 deletions(-) diff --git a/apps/landing/astro.config.ts b/apps/landing/astro.config.ts index a982e16c..53a75724 100644 --- a/apps/landing/astro.config.ts +++ b/apps/landing/astro.config.ts @@ -20,6 +20,7 @@ import { const BUNDLE_REPORT_TEMPLATES = ["markdown", "list", "raw-data"] as const; const BUNDLE_REPORT_TEMPLATE_SET = new Set(BUNDLE_REPORT_TEMPLATES); const REPOSITORY_ROOT = fileURLToPath(new URL("../../", import.meta.url)); +const SITE_URL = "https://onequery.dev"; type BundleReportTemplate = (typeof BUNDLE_REPORT_TEMPLATES)[number]; @@ -93,6 +94,12 @@ export default defineConfig({ }), }, }, + experimental: { + queuedRendering: { + enabled: true, + }, + rustCompiler: true, + }, integrations: [ partytown({ config: { @@ -162,7 +169,10 @@ export default defineConfig({ title: "OneQuery Docs", }), mdx(), - sitemap(), + sitemap({ + changefreq: "daily", + priority: 0.7, + }), agentMarkdown({ content: [ { @@ -179,7 +189,7 @@ export default defineConfig({ host: DEV_SERVER_HOST, port: DEFAULT_DEV_PORT, }, - site: "https://onequery.dev", + site: SITE_URL, // Cloudflare normalizes extensionless page URLs with trailing slashes in // production, so keep Astro's generated route shape aligned with the edge. trailingSlash: "always", diff --git a/apps/landing/package.json b/apps/landing/package.json index 045154ac..0e2cf71a 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -4,22 +4,24 @@ "private": false, "type": "module", "scripts": { - "dev": "astro dev", - "preview": "astro preview", + "dev": "bun run cf-typegen && astro dev", + "start": "bun run cf-typegen && astro dev", + "build": "bun run cf-typegen && astro check && astro build", + "preview": "bun run cf-typegen && astro preview", "workspace:dev": "bun run dev", - "build": "astro build", "bundle:analyze": "ONEQUERY_BUNDLE_REPORT=1 astro build", "bundle:analyze:json": "ONEQUERY_BUNDLE_REPORT=1 ONEQUERY_BUNDLE_REPORT_TEMPLATE=raw-data astro build", "bundle:analyze:list": "ONEQUERY_BUNDLE_REPORT=1 ONEQUERY_BUNDLE_REPORT_TEMPLATE=list astro build", "deploy": "bun run --cwd ../.. landing:build && bunx wrangler deploy", "deploy:preview": "bun run --cwd ../.. landing:build && bunx wrangler versions upload", - "cf-typegen": "bunx wrangler types worker-configuration.d.ts --env-interface CloudflareEnv", + "cf-typegen": "bunx wrangler types worker-configuration.d.ts --env-interface CloudflareEnv && oxfmt worker-configuration.d.ts", "test": "vitest run", "test:watch": "vitest", "typecheck": "astro check && tsgo --noEmit -p tsconfig.json" }, "dependencies": { "@astrojs/cloudflare": "catalog:", + "@astrojs/compiler-rs": "catalog:", "@astrojs/mdx": "catalog:", "@astrojs/partytown": "catalog:", "@astrojs/react": "catalog:", diff --git a/apps/landing/worker-configuration.d.ts b/apps/landing/worker-configuration.d.ts index 649c39a3..a699303e 100644 --- a/apps/landing/worker-configuration.d.ts +++ b/apps/landing/worker-configuration.d.ts @@ -1,11 +1,12 @@ /* eslint-disable */ -// Generated by Wrangler by running `wrangler types worker-configuration.d.ts --env-interface CloudflareEnv` (hash: fc837cf8a3290d03a894b1ac8d2b8ad9) +// Generated by Wrangler by running `wrangler types worker-configuration.d.ts --env-interface CloudflareEnv` (hash: 1ff35c1f8d8868a1dc47446f635de8ae) // Runtime types generated with workerd@1.20260415.1 2026-04-14 declare namespace Cloudflare { interface GlobalProps { mainModule: typeof import("./src/worker"); } interface Env { + SESSION: KVNamespace; ASSETS: Fetcher; } } diff --git a/apps/landing/wrangler.toml b/apps/landing/wrangler.toml index d1990571..3139be80 100644 --- a/apps/landing/wrangler.toml +++ b/apps/landing/wrangler.toml @@ -5,7 +5,6 @@ name = "onequery-landing" main = "./src/worker.ts" compatibility_date = "2026-04-14" -compatibility_flags = ["nodejs_compat"] logpush = true preview_urls = true routes = [{ pattern = "onequery.dev", custom_domain = true }] @@ -17,7 +16,9 @@ id = "4eae4e6551dc4042950bd2270b09f772" [assets] directory = "./dist/client" binding = "ASSETS" -run_worker_first = ["/", "/connectors/*", "/blog/*"] +# Routes with generated Markdown sidecars need Worker-first handling so +# Accept: text/markdown can be negotiated before static asset serving. +run_worker_first = ["/", "/connectors/*", "/blog/*", "/docs/*"] [observability] enabled = true diff --git a/bun.lock b/bun.lock index b0d3df76..0514340c 100644 --- a/bun.lock +++ b/bun.lock @@ -118,6 +118,7 @@ "version": "0.0.0", "dependencies": { "@astrojs/cloudflare": "catalog:", + "@astrojs/compiler-rs": "catalog:", "@astrojs/mdx": "catalog:", "@astrojs/partytown": "catalog:", "@astrojs/react": "catalog:", @@ -446,6 +447,7 @@ }, "catalog": { "@astrojs/cloudflare": "13.5.1", + "@astrojs/compiler-rs": "0.2.1", "@astrojs/mdx": "5.0.6", "@astrojs/partytown": "2.1.7", "@astrojs/react": "5.0.5", @@ -548,6 +550,28 @@ "@astrojs/compiler": ["@astrojs/compiler@4.0.0", "", {}, "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA=="], + "@astrojs/compiler-binding": ["@astrojs/compiler-binding@0.2.1", "", { "optionalDependencies": { "@astrojs/compiler-binding-darwin-arm64": "0.2.1", "@astrojs/compiler-binding-darwin-x64": "0.2.1", "@astrojs/compiler-binding-linux-arm64-gnu": "0.2.1", "@astrojs/compiler-binding-linux-arm64-musl": "0.2.1", "@astrojs/compiler-binding-linux-x64-gnu": "0.2.1", "@astrojs/compiler-binding-linux-x64-musl": "0.2.1", "@astrojs/compiler-binding-wasm32-wasi": "0.2.1", "@astrojs/compiler-binding-win32-arm64-msvc": "0.2.1", "@astrojs/compiler-binding-win32-x64-msvc": "0.2.1" } }, "sha512-KkGifC48eylyWndrbTGkCoc9ojAFWrHQvV1YON06rtEDSroC6U2hWFu2vWGgkZuT0hJpWFKqeelLvpJZeUbCMQ=="], + + "@astrojs/compiler-binding-darwin-arm64": ["@astrojs/compiler-binding-darwin-arm64@0.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Nr1mMFWMxKK7YQSQ+nGbtIoDj+qu/npb7GLfYpLMAgo+1gbYnbRCIRwnVsVBENP/PO2X+3mSfaYZo+pMcyxN3Q=="], + + "@astrojs/compiler-binding-darwin-x64": ["@astrojs/compiler-binding-darwin-x64@0.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-sAEAl+hgqJ2z0Vfe/yOhho/gnBavjVNXuEQY2vKyqAgfWfZbSpgqySZKezwTJhg7IczzellDt1PX4wI3hhkbZg=="], + + "@astrojs/compiler-binding-linux-arm64-gnu": ["@astrojs/compiler-binding-linux-arm64-gnu@0.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WGR/L4fenBN2J1J+C3s3oz8eGfzvZW1wLwo54xp8IgFXbvGfuZbvirWPArPt6KkmyQOuGcfj+/GqEPuwOSj3FA=="], + + "@astrojs/compiler-binding-linux-arm64-musl": ["@astrojs/compiler-binding-linux-arm64-musl@0.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-OKPERWCM/3oqz1MBKG6OfAUGzkBOqf1OQLFpUXEZrd4WuMra3dOyC+1ZA9x0c0Su8JFTRakVop1Z2b7uSajwkw=="], + + "@astrojs/compiler-binding-linux-x64-gnu": ["@astrojs/compiler-binding-linux-x64-gnu@0.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-QtULbhtBKO2zL2X8cwcIawP6rjAe4a5C4xXzLk3+Nk5OZQBof1uQIJucPKj+WmfdfXaic+kzmRhPzMOpBo2xbg=="], + + "@astrojs/compiler-binding-linux-x64-musl": ["@astrojs/compiler-binding-linux-x64-musl@0.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-wOvgpg3RcjaKhTP5UUi2E2Kj8rL4I5R3IZC7qyCmmEur1q+rZpDKBwfeijVYz5GU/8e4rbGoZNqkrUCPI4g5Dg=="], + + "@astrojs/compiler-binding-wasm32-wasi": ["@astrojs/compiler-binding-wasm32-wasi@0.2.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-sDi0S6Kypd38ykhHjnbovwhfHSQ0OYqkMfYBGFIJ/Wkj2Ptwk6hU0K0/2H28uHzGqRfbL8suRPeypcijBUoA0g=="], + + "@astrojs/compiler-binding-win32-arm64-msvc": ["@astrojs/compiler-binding-win32-arm64-msvc@0.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Y0CtraoAikHLMOV1mESibU66FfbsWa06jT8I978bIpVNlZfjDMPlma0QCvTXsY9uTBfHRFllGqiYzspcCXY0Rw=="], + + "@astrojs/compiler-binding-win32-x64-msvc": ["@astrojs/compiler-binding-win32-x64-msvc@0.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-RKBJSfLwwnreQMonelV9lOwU86qdkIV+o6czbXK8moht16jp4mvhINtRqQWacEyXlCkSRAeM2CNtEu82jcu6Og=="], + + "@astrojs/compiler-rs": ["@astrojs/compiler-rs@0.2.1", "", { "dependencies": { "@astrojs/compiler-binding": "0.2.1" } }, "sha512-Yb9c/IkOxwKT/FOIsd/cUv/3jhqwJZAQ5Lcjxyu84erV9rWK1Yq2k2NpqVtJYNGjoBCdS15PkYei/3CvPSWjMg=="], + "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.9.1", "", { "dependencies": { "picomatch": "^4.0.4" } }, "sha512-1pWuARqYom/TzuU3+0ZugsTrKlUydWKuULmDqSMTuonY+9IRDUEGKX/8PXQ1nBxRq3w85uGtd9q9SXfqEldMIQ=="], "@astrojs/language-server": ["@astrojs/language-server@2.16.8", "", { "dependencies": { "@astrojs/compiler": "^2.13.1", "@astrojs/yaml2ts": "^0.2.3", "@jridgewell/sourcemap-codec": "^1.5.5", "@volar/kit": "~2.4.28", "@volar/language-core": "~2.4.28", "@volar/language-server": "~2.4.28", "@volar/language-service": "~2.4.28", "muggle-string": "^0.4.1", "tinyglobby": "^0.2.16", "volar-service-css": "0.0.70", "volar-service-emmet": "0.0.70", "volar-service-html": "0.0.70", "volar-service-prettier": "0.0.70", "volar-service-typescript": "0.0.70", "volar-service-typescript-twoslash-queries": "0.0.70", "volar-service-yaml": "0.0.70", "vscode-html-languageservice": "^5.6.2", "vscode-uri": "^3.1.0" }, "peerDependencies": { "prettier": "^3.0.0", "prettier-plugin-astro": ">=0.11.0" }, "optionalPeers": ["prettier", "prettier-plugin-astro"], "bin": { "astro-ls": "bin/nodeServer.js" } }, "sha512-yg1pZF6hs9FaKr2fgXMOGbW7pDLgFexFjuhWilPAc8VybTU+WSnbfbhYaUL1exm6dAK4sM3aKXGcfVwss+HXbg=="], @@ -4398,6 +4422,8 @@ "@astrojs/cloudflare/vite": ["vite@7.3.3", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA=="], + "@astrojs/compiler-binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], + "@astrojs/language-server/@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], "@astrojs/react/@vitejs/plugin-react": ["@vitejs/plugin-react@5.2.0", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="], diff --git a/package.json b/package.json index 71534c1e..3417d952 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ ], "catalog": { "@astrojs/cloudflare": "13.5.1", + "@astrojs/compiler-rs": "0.2.1", "@astrojs/mdx": "5.0.6", "@astrojs/partytown": "2.1.7", "@astrojs/react": "5.0.5", From e35ee3ad0edfe2e70e4126e9e6a6e1db2d2b2654 Mon Sep 17 00:00:00 2001 From: lentil32 Date: Tue, 2 Jun 2026 15:50:00 +0900 Subject: [PATCH 02/13] cna --- apps/landing/package.json | 4 +- bun.lock | 250 ++++++++++++++++++++++++++++++++++++-- package.json | 4 +- 3 files changed, 244 insertions(+), 14 deletions(-) diff --git a/apps/landing/package.json b/apps/landing/package.json index 0e2cf71a..7dd92e90 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -36,8 +36,8 @@ "better-result": "catalog:", "mdast-util-to-string": "4.0.0", "nanostores": "catalog:", - "react": "19.3.0-canary-d5736f09-20260507", - "react-dom": "19.3.0-canary-d5736f09-20260507", + "react": "catalog:", + "react-dom": "catalog:", "reading-time": "1.5.0", "simple-icons": "catalog:", "zod": "catalog:" diff --git a/bun.lock b/bun.lock index 0514340c..405b4dbb 100644 --- a/bun.lock +++ b/bun.lock @@ -133,8 +133,8 @@ "better-result": "catalog:", "mdast-util-to-string": "4.0.0", "nanostores": "catalog:", - "react": "19.3.0-canary-d5736f09-20260507", - "react-dom": "19.3.0-canary-d5736f09-20260507", + "react": "catalog:", + "react-dom": "catalog:", "reading-time": "1.5.0", "simple-icons": "catalog:", "zod": "catalog:", @@ -485,8 +485,8 @@ "nanostores": "1.3.0", "next-themes": "0.4.6", "pg": "8.20.0", - "react": "19.2.3", - "react-dom": "19.2.3", + "react": "19.3.0-canary-d5736f09-20260507", + "react-dom": "19.3.0-canary-d5736f09-20260507", "rehype-minify-whitespace": "6.0.2", "rehype-parse": "9.0.1", "rehype-remark": "10.0.1", @@ -3786,11 +3786,11 @@ "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], - "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "react": ["react@19.3.0-canary-d5736f09-20260507", "", {}, "sha512-EL3w0mHylqEtiySCjcj/nPOkK1j6KvKsaFkeavTqR6hbd6bQi7gyCcTSHXQ2XpTjv8hfKWFArSVF6he1sgQcEQ=="], "react-day-picker": ["react-day-picker@9.13.0", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0", "date-fns-jalali": "^4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-euzj5Hlq+lOHqI53NiuNhCP8HWgsPf/bBAVijR50hNaY1XwjKjShAnIe8jm8RD2W9IJUvihDIZ+KrmqfFzNhFQ=="], - "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "react-dom": ["react-dom@19.3.0-canary-d5736f09-20260507", "", { "dependencies": { "scheduler": "0.28.0-canary-d5736f09-20260507" }, "peerDependencies": { "react": "19.3.0-canary-d5736f09-20260507" } }, "sha512-PrjUaYOYc1dX65Td8StJSNJ3TFTeO2KBpAdXQJiOmW5kxDbKK+lvkJmSK/U+f7LcNnJxQKwHzKVf8WdJVjJohg=="], "react-hook-form": ["react-hook-form@7.71.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w=="], @@ -3930,7 +3930,7 @@ "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], - "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "scheduler": ["scheduler@0.28.0-canary-d5736f09-20260507", "", {}, "sha512-HkpDsMMSty/+FrYjvNnBZRwfU5P+LhZs8xRaWKVwTnB0rffXMg+BOntOebDmvlwI8hhB6D8ONBGXeOlWTzwVdA=="], "schema-dts": ["schema-dts@2.0.0", "", { "dependencies": { "schema-dts-lib": "^1.0.0" } }, "sha512-t7NoCy3Rn5GHGx6p7s1qIYK/AeIb8ZxJNR9WUNFkwMv2CiiGZBmqqYWc2FlZVm5ZbiHMY4OvBWhj7QtyrFO2Jw=="], @@ -4428,6 +4428,10 @@ "@astrojs/react/@vitejs/plugin-react": ["@vitejs/plugin-react@5.2.0", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="], + "@astrojs/react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@astrojs/react/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@astrojs/react/vite": ["vite@7.3.3", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA=="], "@aws-crypto/crc32/@aws-sdk/types": ["@aws-sdk/types@3.973.7", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg=="], @@ -4796,6 +4800,14 @@ "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@base-ui/react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@base-ui/react/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "@base-ui/utils/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@base-ui/utils/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@better-auth/core/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@buape/carbon/@hono/node-server": ["@hono/node-server@1.19.13", "", { "peerDependencies": { "hono": "^4" } }, "sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ=="], @@ -4828,6 +4840,10 @@ "@expressive-code/core/postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], + "@floating-ui/react-dom/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@floating-ui/react-dom/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], "@jimp/core/file-type": ["file-type@21.3.4", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g=="], @@ -4894,44 +4910,114 @@ "@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "@nanostores/react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "@noble/curves/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], - "@onequery/landing/react": ["react@19.3.0-canary-d5736f09-20260507", "", {}, "sha512-EL3w0mHylqEtiySCjcj/nPOkK1j6KvKsaFkeavTqR6hbd6bQi7gyCcTSHXQ2XpTjv8hfKWFArSVF6he1sgQcEQ=="], + "@onequery/ui/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "@onequery/landing/react-dom": ["react-dom@19.3.0-canary-d5736f09-20260507", "", { "dependencies": { "scheduler": "0.28.0-canary-d5736f09-20260507" }, "peerDependencies": { "react": "19.3.0-canary-d5736f09-20260507" } }, "sha512-PrjUaYOYc1dX65Td8StJSNJ3TFTeO2KBpAdXQJiOmW5kxDbKK+lvkJmSK/U+f7LcNnJxQKwHzKVf8WdJVjJohg=="], + "@onequery/ui/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], "@poppinss/dumper/supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], "@qwik.dev/partytown/dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], + "@radix-ui/react-compose-refs/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-context/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "@radix-ui/react-dialog/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-dialog/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-dialog/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-dismissable-layer/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-dismissable-layer/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "@radix-ui/react-focus-guards/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "@radix-ui/react-focus-scope/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-focus-scope/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-focus-scope/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "@radix-ui/react-id/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "@radix-ui/react-portal/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-portal/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-portal/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "@radix-ui/react-presence/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-presence/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], + "@radix-ui/react-primitive/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-primitive/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "@radix-ui/react-slot/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-use-callback-ref/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-use-controllable-state/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-use-effect-event/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-use-escape-keydown/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@radix-ui/react-use-layout-effect/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "@remotion/bundler/esbuild": ["esbuild@0.25.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.0", "@esbuild/android-arm": "0.25.0", "@esbuild/android-arm64": "0.25.0", "@esbuild/android-x64": "0.25.0", "@esbuild/darwin-arm64": "0.25.0", "@esbuild/darwin-x64": "0.25.0", "@esbuild/freebsd-arm64": "0.25.0", "@esbuild/freebsd-x64": "0.25.0", "@esbuild/linux-arm": "0.25.0", "@esbuild/linux-arm64": "0.25.0", "@esbuild/linux-ia32": "0.25.0", "@esbuild/linux-loong64": "0.25.0", "@esbuild/linux-mips64el": "0.25.0", "@esbuild/linux-ppc64": "0.25.0", "@esbuild/linux-riscv64": "0.25.0", "@esbuild/linux-s390x": "0.25.0", "@esbuild/linux-x64": "0.25.0", "@esbuild/netbsd-arm64": "0.25.0", "@esbuild/netbsd-x64": "0.25.0", "@esbuild/openbsd-arm64": "0.25.0", "@esbuild/openbsd-x64": "0.25.0", "@esbuild/sunos-x64": "0.25.0", "@esbuild/win32-arm64": "0.25.0", "@esbuild/win32-ia32": "0.25.0", "@esbuild/win32-x64": "0.25.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw=="], "@remotion/bundler/postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], + "@remotion/bundler/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@remotion/bundler/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@remotion/bundler/source-map": ["source-map@0.7.3", "", {}, "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="], "@remotion/cli/dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], "@remotion/cli/minimist": ["minimist@1.2.6", "", {}, "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="], + "@remotion/cli/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@remotion/cli/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "@remotion/media-utils/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@remotion/media-utils/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "@remotion/player/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@remotion/player/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@remotion/renderer/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + "@remotion/renderer/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@remotion/renderer/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@remotion/renderer/source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], "@remotion/renderer/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], "@remotion/studio/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + "@remotion/studio/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@remotion/studio/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@remotion/studio/semver": ["semver@7.5.3", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ=="], "@remotion/studio/source-map": ["source-map@0.7.3", "", {}, "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="], @@ -4950,6 +5036,10 @@ "@remotion/tailwind-v4/tailwindcss": ["tailwindcss@4.2.0", "", {}, "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q=="], + "@remotion/web-renderer/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@remotion/web-renderer/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@remotion/zod-types/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], @@ -4988,6 +5078,8 @@ "@smithy/util-waiter/@smithy/core": ["@smithy/core@3.24.3", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-Ep/7tPamGY8mgESE3LyLKtxJyy6U52WWAqr/3wial47Sj4u3PiIF73AOGI27UyLy9duTkhZbgzodOfLV4TduZg=="], + "@tabler/icons-react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], @@ -5008,6 +5100,18 @@ "@tailwindcss/webpack/tailwindcss": ["tailwindcss@4.2.0", "", {}, "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q=="], + "@tanstack/react-query/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@tanstack/react-query-persist-client/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@tanstack/react-router/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@tanstack/react-router/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "@tanstack/react-store/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "@tanstack/react-store/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "@tanstack/router-generator/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@tanstack/router-plugin/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], @@ -5046,6 +5150,8 @@ "@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="], + "@xstate/react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "accepts/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], @@ -5070,6 +5176,10 @@ "better-auth/nanostores": ["nanostores@1.2.0", "", {}, "sha512-F0wCzbsH80G7XXo0Jd9/AVQC7ouWY6idUCTnMwW5t/Rv9W8qmO6endavDwg7TNp5GbugwSukFMVZqzPSrSMndg=="], + "better-auth/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "better-auth/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "better-auth/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "chalk-template/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -5080,6 +5190,10 @@ "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "cmdk/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "cmdk/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "color/color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="], "color-string/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], @@ -5102,6 +5216,8 @@ "eciesjs/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "embla-carousel-react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "eslint/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], @@ -5152,6 +5268,10 @@ "image-q/@types/node": ["@types/node@16.9.1", "", {}, "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g=="], + "input-otp/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "input-otp/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "istanbul-reports/html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], @@ -5176,6 +5296,10 @@ "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "next-themes/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "next-themes/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "node-edge-tts/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "nostr-tools/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], @@ -5224,8 +5348,38 @@ "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + "react-day-picker/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-hook-form/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-remove-scroll/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-remove-scroll-bar/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-resizable-panels/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-resizable-panels/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "react-smooth/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-smooth/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "react-style-singleton/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-transition-group/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-transition-group/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "recharts/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "recharts/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "remotion/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "remotion/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -5252,6 +5406,10 @@ "snowflake-sdk/open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + "sonner/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "sonner/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -5268,6 +5426,18 @@ "type-is/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "use-callback-ref/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "use-isomorphic-layout-effect/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "use-sidecar/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "use-sync-external-store/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "vaul/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "vaul/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "vite/postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], "vite/rolldown": ["rolldown@1.0.0-rc.11", "", { "dependencies": { "@oxc-project/types": "=0.122.0", "@rolldown/pluginutils": "1.0.0-rc.11" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.11", "@rolldown/binding-darwin-arm64": "1.0.0-rc.11", "@rolldown/binding-darwin-x64": "1.0.0-rc.11", "@rolldown/binding-freebsd-x64": "1.0.0-rc.11", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.11", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.11", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.11", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw=="], @@ -5298,6 +5468,8 @@ "@astrojs/react/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], + "@astrojs/react/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@astrojs/react/vite/postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], "@aws-crypto/crc32c/@aws-sdk/types/@smithy/types": ["@smithy/types@4.14.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw=="], @@ -5420,6 +5592,10 @@ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "@base-ui/react/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@base-ui/utils/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@buape/carbon/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], "@discordjs/node-pre-gyp/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], @@ -5490,6 +5666,8 @@ "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + "@floating-ui/react-dom/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "@larksuiteoapi/node-sdk/axios/proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], @@ -5512,7 +5690,19 @@ "@matrix-org/matrix-sdk-crypto-nodejs/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "@onequery/landing/react-dom/scheduler": ["scheduler@0.28.0-canary-d5736f09-20260507", "", {}, "sha512-HkpDsMMSty/+FrYjvNnBZRwfU5P+LhZs8xRaWKVwTnB0rffXMg+BOntOebDmvlwI8hhB6D8ONBGXeOlWTzwVdA=="], + "@onequery/ui/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@radix-ui/react-dialog/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@radix-ui/react-dismissable-layer/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@radix-ui/react-focus-scope/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@radix-ui/react-portal/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@radix-ui/react-presence/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@radix-ui/react-primitive/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "@remotion/bundler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ=="], @@ -5564,6 +5754,14 @@ "@remotion/bundler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ=="], + "@remotion/bundler/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@remotion/cli/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@remotion/media-utils/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@remotion/player/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@remotion/renderer/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], "@remotion/renderer/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], @@ -5574,6 +5772,8 @@ "@remotion/renderer/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + "@remotion/renderer/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@remotion/renderer/source-map/whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], "@remotion/studio-server/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], @@ -5590,8 +5790,12 @@ "@remotion/studio/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "@remotion/studio/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@remotion/studio/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "@remotion/web-renderer/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@slack/logger/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], "@slack/oauth/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], @@ -5638,6 +5842,10 @@ "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ=="], + "@tanstack/react-router/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "@tanstack/react-store/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@tanstack/router-plugin/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "@tanstack/router-plugin/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], @@ -5674,12 +5882,16 @@ "axios/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + "better-auth/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "cli-highlight/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], "cli-highlight/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cmdk/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "color/color-convert/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -5760,8 +5972,12 @@ "hast-util-raw/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + "input-otp/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "jest-worker/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "next-themes/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "node-edge-tts/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -5770,6 +5986,16 @@ "protobufjs/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "react-resizable-panels/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "react-smooth/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "react-transition-group/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "recharts/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "remotion/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "rollup-plugin-visualizer/yargs/cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], @@ -5806,12 +6032,16 @@ "snowflake-sdk/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "sonner/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "telegraf/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + "vaul/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.122.0", "", {}, "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA=="], "vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.11", "", { "os": "android", "cpu": "arm64" }, "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A=="], diff --git a/package.json b/package.json index 3417d952..89455341 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "nanostores": "1.3.0", "next-themes": "0.4.6", "pg": "8.20.0", - "react": "19.2.3", - "react-dom": "19.2.3", + "react": "19.3.0-canary-d5736f09-20260507", + "react-dom": "19.3.0-canary-d5736f09-20260507", "rehype-minify-whitespace": "6.0.2", "rehype-parse": "9.0.1", "rehype-remark": "10.0.1", From b8176fcc8d8e96594c99302f23992a42c59babff Mon Sep 17 00:00:00 2001 From: lentil32 Date: Tue, 2 Jun 2026 15:50:59 +0900 Subject: [PATCH 03/13] akdsjf --- apps/landing/worker-configuration.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/landing/worker-configuration.d.ts b/apps/landing/worker-configuration.d.ts index a699303e..7d89867b 100644 --- a/apps/landing/worker-configuration.d.ts +++ b/apps/landing/worker-configuration.d.ts @@ -1,6 +1,6 @@ /* eslint-disable */ // Generated by Wrangler by running `wrangler types worker-configuration.d.ts --env-interface CloudflareEnv` (hash: 1ff35c1f8d8868a1dc47446f635de8ae) -// Runtime types generated with workerd@1.20260415.1 2026-04-14 +// Runtime types generated with workerd@1.20260415.1 2026-04-14 nodejs_compat declare namespace Cloudflare { interface GlobalProps { mainModule: typeof import("./src/worker"); From 02188e362c72a9b509f189acacbf0c5c131c1b19 Mon Sep 17 00:00:00 2001 From: lentil32 Date: Tue, 2 Jun 2026 15:51:15 +0900 Subject: [PATCH 04/13] kajdsf --- apps/landing/wrangler.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/landing/wrangler.toml b/apps/landing/wrangler.toml index 3139be80..9c0506c9 100644 --- a/apps/landing/wrangler.toml +++ b/apps/landing/wrangler.toml @@ -5,6 +5,8 @@ name = "onequery-landing" main = "./src/worker.ts" compatibility_date = "2026-04-14" +# Starlight's Cloudflare SSR path depends on Node-compatible modules. +compatibility_flags = ["nodejs_compat"] logpush = true preview_urls = true routes = [{ pattern = "onequery.dev", custom_domain = true }] From 29cbab0abba7fd89315ae79f86bf6dcc8e44ca53 Mon Sep 17 00:00:00 2001 From: lentil32 Date: Tue, 2 Jun 2026 16:13:20 +0900 Subject: [PATCH 05/13] theme --- apps/cli/package.json | 1 + apps/cli/scripts/generate-homebrew-formula.js | 10 +- .../home/components/DownloadCommand.astro | 11 +- .../home/components/TerminalSurface.astro | 11 +- apps/landing/src/features/home/styles.css | 8 +- bun.lock | 244 ++++++++++++------ package.json | 10 +- packages/openclaw-plugin/package.json | 2 +- .../skills/onequery-cli/SKILL.md | 2 +- 9 files changed, 210 insertions(+), 89 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 107d5a75..8c21ac1f 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -3,6 +3,7 @@ "version": "0.0.0-dev", "private": false, "description": "OneQuery CLI", + "homepage": "https://onequery.dev", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/apps/cli/scripts/generate-homebrew-formula.js b/apps/cli/scripts/generate-homebrew-formula.js index b9cf960d..703eceac 100644 --- a/apps/cli/scripts/generate-homebrew-formula.js +++ b/apps/cli/scripts/generate-homebrew-formula.js @@ -4,7 +4,7 @@ import { mkdir, writeFile } from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; -const SHA256_PATTERN = /^[a-f0-9]{64}$/i; +const SHA256_PATTERN = /^[a-f0-9]{64}$/iu; const GENERATE_HOMEBREW_FORMULA_OPTIONS = new Set([ "--version", "--repo-owner", @@ -47,7 +47,7 @@ const PLATFORM_RELEASES = [ ]; function versionedReleaseAssetName(assetName, version) { - return assetName.replace(/\.tgz$/, `-${version}.tgz`); + return assetName.replace(/\.tgz$/u, `-${version}.tgz`); } function readOptionValue(argv, index, optionName) { @@ -266,7 +266,7 @@ export function buildFormula({ "", "class Onequery < Formula", ' desc "CLI for querying and self-hosting OneQuery"', - ` homepage "https://github.com/${repoOwner}/${repoName}"`, + ' homepage "https://onequery.dev"', ' license "Apache-2.0"', ` version "${version}"`, "", @@ -326,9 +326,9 @@ export async function writeFormula({ outputPath, formulaText }) { await writeFile(outputPath, formulaText, "utf8"); } -const __filename = fileURLToPath(import.meta.url); +const currentFilePath = fileURLToPath(import.meta.url); -if (process.argv[1] && path.resolve(process.argv[1]) === __filename) { +if (process.argv[1] && path.resolve(process.argv[1]) === currentFilePath) { const args = parseArgs(process.argv.slice(2)); const formulaText = buildFormula(args); await writeFormula({ diff --git a/apps/landing/src/features/home/components/DownloadCommand.astro b/apps/landing/src/features/home/components/DownloadCommand.astro index c9a16679..c927cdb0 100644 --- a/apps/landing/src/features/home/components/DownloadCommand.astro +++ b/apps/landing/src/features/home/components/DownloadCommand.astro @@ -1,4 +1,6 @@ --- +import { Code } from "astro:components"; + import { COPY_FEEDBACK_RESET_DELAY_MS, INSTALL_COMMANDS, @@ -61,7 +63,14 @@ function getInstallTabId(index: number) { data-install-method-index={index} hidden={method !== defaultMethod} > - {method.command} + )) } diff --git a/apps/landing/src/features/home/components/TerminalSurface.astro b/apps/landing/src/features/home/components/TerminalSurface.astro index b6124b4b..6754bb24 100644 --- a/apps/landing/src/features/home/components/TerminalSurface.astro +++ b/apps/landing/src/features/home/components/TerminalSurface.astro @@ -1,4 +1,6 @@ --- +import { Code } from "astro:components"; + import type { TerminalLine } from "@/features/home/terminal/types"; interface Props { @@ -29,7 +31,14 @@ const { footer, lines, title } = Astro.props; {line.kind === "prompt" ? "$" : ">"} )} - {line.text} + )) } diff --git a/apps/landing/src/features/home/styles.css b/apps/landing/src/features/home/styles.css index 35452d29..6e597a18 100644 --- a/apps/landing/src/features/home/styles.css +++ b/apps/landing/src/features/home/styles.css @@ -197,7 +197,6 @@ min-width: 0; overflow: hidden; background: transparent !important; - color: inherit; font: inherit; line-height: inherit; white-space: inherit; @@ -1434,10 +1433,17 @@ } .terminal-line code { + background: transparent !important; + font: inherit; + line-height: inherit; white-space: pre-wrap; word-break: break-word; } +.terminal-line-code .line { + display: inline; +} + .terminal-line-prefix { flex: none; width: 10px; diff --git a/bun.lock b/bun.lock index 405b4dbb..e07b0f85 100644 --- a/bun.lock +++ b/bun.lock @@ -22,12 +22,12 @@ "eslint-plugin-turbo": "2.9.5", "happy-dom": "20.3.3", "knip": "6.0.5", - "lefthook": "2.1.6", + "lefthook": "2.1.9", "npm-check-updates": "19.3.1", "openclaw": "catalog:tooling", "oxfmt": "catalog:tooling", "oxlint": "catalog:tooling", - "oxlint-tsgolint": "0.22.0", + "oxlint-tsgolint": "0.23.0", "turbo": "2.9.5", "vitest": "catalog:testing", }, @@ -520,15 +520,15 @@ "@vitejs/plugin-react": "6.0.1", "babel-plugin-react-compiler": "1.0.0", "openclaw": "2026.4.10", - "oxfmt": "0.46.0", - "oxlint": "1.61.0", + "oxfmt": "0.52.0", + "oxlint": "1.67.0", "postcss": "8.5.6", "rollup-plugin-visualizer": "7.0.1", "tailwindcss": "4.2.2", "typescript": "5.4.5", "vite": "8.0.2", "vite-tsconfig-paths": "6.1.1", - "wrangler": "4.83.0", + "wrangler": "4.95.0", }, }, "packages": { @@ -860,21 +860,21 @@ "@clack/prompts": ["@clack/prompts@1.2.0", "", { "dependencies": { "@clack/core": "1.2.0", "fast-string-width": "^1.1.0", "fast-wrap-ansi": "^0.1.3", "sisteransi": "^1.0.5" } }, "sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w=="], - "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.2", "", {}, "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ=="], + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.5.0", "", {}, "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg=="], - "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg=="], + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.1", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": ">1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw=="], "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.32.3", "", { "dependencies": { "@cloudflare/unenv-preset": "2.16.0", "miniflare": "4.20260415.0", "unenv": "2.0.0-rc.24", "wrangler": "4.83.0", "ws": "8.18.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0 || ^8.0.0" } }, "sha512-a8ZkCA/SOiJ36jT3LlBLkUb7ZzGInhYJoTY4BMRBGdk+nsh44HavbNvtu/RdaqS5VJEMLM4+LqVIJ+V0ahGeFg=="], - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260415.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-dsxaKsQm3LnPGNPEdsRv09QN3Y4DqCw7kX5j6noKqbAtro2jTr95sVlYM1jUxZ5FkOl1f7SXgaKKB9t5H5Nkbg=="], + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260526.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-/pR3GH3gfv0PUp7DjI8v0aAIDOqFwibq4bg5xT7TZgcVdBV/cJQWckdXCMqiRtHiawLwogUX00EIOINkYJ1Zqg=="], - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260415.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+JgSgVA49KyKteHRA1SnonE4Zn5Ei5zdAp5FQMxFmXI8qulZw4Hl7safXxRyK4i9sTO8gl7TFOKO5Q64VPvSDQ=="], + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260526.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rcyu0iANYfaiezKh3Mcao1O4IIgVfQldxduiL5TZT1sP0NIeRY4YReSTrzPxNnXxSYaIqaqRHMcHbUM/ic4knA=="], - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260415.1", "", { "os": "linux", "cpu": "x64" }, "sha512-tU+9pwsqCy8afOVlGtiWrWQc/fedQK4SRm4KPIAt+zOiQWDxWASm6YGBUJis5c648WN80yz47qnmdDi8DQNOcA=="], + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260526.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5EZAEnlLwa9oGJRo8Nd3iY5Wcd9ROGNNG90xNIGp8MEjj8v2jTn42NC47fCZKFdnLj3+S+vWEhu1x0GVJnALjA=="], - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260415.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-bR9uITnV19r5NQ14xnypi2xHXu2iQvfYV8cVgx0JouFUmWwTEEAwFVojDdssGq93VHX9hr/pi2IRUZeegbYBog=="], + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260526.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-X/YBQXeXFeCN7QTStoWrATEBc9WKl7PIqkw/dQkjyJ72gh3rkLe0+Xkzp3wO7gtxTDQMa7NPGy1W4+sdMf8q1g=="], - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260415.1", "", { "os": "win32", "cpu": "x64" }, "sha512-4NuMLlerI0Ijua3Ir8HXQ+qyNvCUDEG5gDco5Om+sAiK6rnWiz+aGoSlbB8W16yW9QAgzCstbmXLiVknUBflfQ=="], + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260526.1", "", { "os": "win32", "cpu": "x64" }, "sha512-R+tqpFFdcfZIljx8fIW9rj9fRTtDgfoA2yonsfAGa6e8snrmr+38mdFHtkRC0D3UyZpn/hOtmXiUBfdX2gMR7Q=="], "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260405.1", "", {}, "sha512-PokTmySa+D6MY01R1UfYH48korsN462NK/fl3aw47Hg7XuLuSo/RTpjT0vtWaJhJoFY5tHGOBBIbDcIc8wltLg=="], @@ -1458,93 +1458,93 @@ "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="], - "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.46.0", "", { "os": "android", "cpu": "arm" }, "sha512-b1doV4WRcJU+BESSlCvCjV+5CEr/T6h0frArAdV26Nir+gGNFNaylvDiiMPfF1pxeV0txZEs38ojzJaxBYg+ng=="], + "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.52.0", "", { "os": "android", "cpu": "arm" }, "sha512-17EMSJnQ9g+upVHrAUYDMfH5lvRKQ9Nvg8WtEoH72oDr1VpWz+7/o3tD97U1EToen2YAQ/68JmtDYkQUi20dfQ=="], - "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.46.0", "", { "os": "android", "cpu": "arm64" }, "sha512-v6+HhjsoV3GO0u2u9jLSAZrvWfTraDxKofUIQ7/ktS7tzS+epVsxdHmeM+XxuNcAY/nWxxU1Sg4JcGTNRXraBA=="], + "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.52.0", "", { "os": "android", "cpu": "arm64" }, "sha512-A2G1IdwGEW2lLJkIxcvuirRH1CzSl/e0NX11zTlW1gvxJThfwbI/BEoaKrTNpm7M2FchvIf6guvIQU7d5iz+OQ=="], - "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.46.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-3eeooJGrqGIlI5MyryDZsAcKXSmKIgAD4yYtfRrRJzXZ0UTFZtiSveIur56YPrGMYZwT4XyVhHsMqrNwr1XeFA=="], + "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.52.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-f9+bLvOYxy7NttCLFTvQ7afmqDOWY4wIP9xdvfj5trQ1qj6f2UFAGwZESlfsMjvJNTyRpXfIlOanCI9FOvoeQA=="], - "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.46.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-QG8BDM0CXWbu84k2SKmCqfEddPQPFiBicwtYnLqHRWZZl57HbtOLRMac/KTq2NO4AEc4ICCBpFxJIV9zcqYfkQ=="], + "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.52.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-YSTB9sJ5nnQd/Q0ddHkgof0ZCHPAnWZT1IW2SJ8omz7CP7KluJhO1fNHrpqdxCtpztJwSs4hY1uAee35wKxxaw=="], - "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.46.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-9DdCqS/n2ncu/Chazvt3cpgAjAmIGQDz7hFKSrNItMApyV/Ja9mz3hD4JakIE3nS8PW9smEbPWnb389QLBY4nw=="], + "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.52.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-NIrRNTTPCs4UbmVs0bxLSCDlLCtIRMJIXklNKaXa5Oj2/K1UIMBvgE8+uPVo01Io3N9HF0+GAX+aAHjUgZS7vA=="], - "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.46.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Dgs7VeE2jT0LHMhw6tPEt0xQYe54kBqHEovmWsv4FVQlegCOvlIJNx0S8n4vj8WUtpT+Z6BD2HhKJPLglLxvZg=="], + "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.52.0", "", { "os": "linux", "cpu": "arm" }, "sha512-JXUCde8mn3GpgQouz2PXUokgy/uT1QrRJBL2s983VWcSQp62wTFYiNXgTKdeo1Jgbr0IgUnKKvzIk/YBlj/nVQ=="], - "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.46.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Zxn3adhTH13JKnU4xXJj8FeEfF680XjXh3gSShKl57HCMBRde2tUJTgogV/1MSHA80PJEVrDa7r66TLVq3Ia7Q=="], + "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.52.0", "", { "os": "linux", "cpu": "arm" }, "sha512-psbUXaRZ+V8DaXz10Qf7LSHtdtdKAmC8fxXgeU608jjzrmWK4quamZMOpl6sf+dikoFHA85uE93Q0BqxrCdQrQ=="], - "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.46.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-+TWipjrgVM8D7aIdDD0tlr3teLTTvQTn7QTE5BpT10H1Fj82gfdn9X6nn2sDgx/MepuSCfSnzFNJq2paLL0OiA=="], + "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.52.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Jw7MgWUU9lcLCcy82updISP3EthTlfvAwR6gWNxPzqly7+fLvOi2gHQE9xXQjpqaVLm/8P+gOzlv9ODuoVlaaw=="], - "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.46.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-aAUPBWJ1lGwwnxZUEDLJ94+Iy6MuwJwPxUgO4sCA5mEEyDk7b+cDQ+JpX1VR150Zoyd+D49gsrUzpUK5h587Eg=="], + "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.52.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-wZg6bLjDvh2KibyI3QFUYo8GTXneIFsd0JvehtvJiUmQ8WRPERgxd/VM4ctWb86U5FT1FkqgS8/wZKVB+AZScg=="], - "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.46.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ufBCJukyFX/UDrokP/r6BGDoTInnsDs7bxyzKAgMiZlt2Qu8GPJSJ6Zm6whIiJzKk0naxA8ilwmbO1LMw6Htxw=="], + "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.52.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-IngE8uxhNvxcMrLjZNDo9xNLY7rEK33AKnaMd2B46he1e/mz2CfcW6If/U1wUjdRZddm1QzQaciqZkuMkdh1FA=="], - "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.46.0", "", { "os": "linux", "cpu": "none" }, "sha512-eqtlC2YmPqjun76R1gVfGLuKWx7NuEnLEAudZ7n6ipSKbCZTqIKSs1b5Y8K/JHZsRpLkeSmAAjig5HOIg8fQzQ=="], + "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.52.0", "", { "os": "linux", "cpu": "none" }, "sha512-H3+DdFMv/efN3Efmhsv18jDrpiWWqKG7wsfAlQBqAt6z/E2Bx+TwEj2Nowe51CPOWB8/mFBC2dAMSgVFLvvowA=="], - "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.46.0", "", { "os": "linux", "cpu": "none" }, "sha512-yccVOO2nMXkQLGgy0He3EQEwKD7NF0zEk+/OWmroznkqXyJdN6bfK0LtNnr6/14Bh3FjpYq7bP33l/VloCnxpA=="], + "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.52.0", "", { "os": "linux", "cpu": "none" }, "sha512-zji+1kb7lJKohSDjzC1IsS+K/cKRs1hdVf0ZH0VbdbiakmtLvN9twBoXo/k8VdjFax7kfo+DyPxS7vv52br1aw=="], - "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.46.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-aAf7fG23OQCey6VRPj9IeCraoYtpgtx0ZyJ1CXkPyT1wjzBE7c3xtuxHe/AdHaJfVVb/SXpSk8Gl1LzyQupSqw=="], + "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.52.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hcLBYedpCy7ToUvvBidWk7+11Yhg1oAZ4+6hKPic/mQI6NaqXJSXMps5nFlwUuX2ewhtLZZDPg63TI042qGKBg=="], - "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.46.0", "", { "os": "linux", "cpu": "x64" }, "sha512-q0JPsTMyJNjYrBvYFDz4WbVsafNZaPCZv4RnFypRotLqpKROtBZcEaXQW4eb9YmvLU3NckVemLJnzkSZSdmOxw=="], + "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.52.0", "", { "os": "linux", "cpu": "x64" }, "sha512-IDO2loXK2OtTOhSPchU9MW25mWL2QCDGdJbjN8MXKZVS80qXe5gMTwQWu/gMJ3juoBHbkuUZNB2N1LHzNT7DoA=="], - "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.46.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7LsLY9Cw57GPkhSR+duI3mt9baRczK/DtHYSldQ4BEU92da9igBQNl4z7Vq5U9NNPsh1FmpKvv1q9WDtiUQR1A=="], + "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.52.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mAV2Hjn0SatJ+KoAzKUC3eJhdJ8wv+3m1KyuS0dTsbF0c5weq+QrCt/DRZZM+uj/XiKzCDEUKYsBF30e2qkcyw=="], - "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.46.0", "", { "os": "none", "cpu": "arm64" }, "sha512-lHiBOz8Duaku7JtRNLlps3j++eOaICPZSd8FCVmTDM4DFOPT71Bjn7g6iar1z7StXlKRweUKxWUs4sA+zWGDXg=="], + "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.52.0", "", { "os": "none", "cpu": "arm64" }, "sha512-vd4npaUIwChxp7XzkqmepBWTT9YMcSe/NBApVGPC30/lLyOVaV3dvma1SKo03t8O73BPRAG7EyJzGlN5cJM5hQ=="], - "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.46.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-/5ktYUliP89RhgC37DBH1x20U5zPSZMy3cMEcO0j3793rbHP9MWsknBwQB6eozRzWmYrh0IFM/p20EbPvDlYlg=="], + "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.52.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-k2sz6gWQdMfh5HPpIS+Bw/0UEV/kaK2xuqJRrWL233sEHx9WLlsmvlPFM4HUNThkYbSN0U0vPW7LVKZWDS8hPQ=="], - "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.46.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-3WTnoiuIr8XvV0DIY7SN+1uJSwKf4sPpcbHfobcRT9JutGcLaef/miyBB87jxd3aqH+mS0+G5lsgHuXLUwjjpQ=="], + "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.52.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-rhke69GTcArodLHpjMTfNnvjTEBryDeZcUCKK/VjXDMtfTULl6QRh0ymX5/hbCUv2WjYm9h/QbW++q2vE15gWQ=="], - "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.46.0", "", { "os": "win32", "cpu": "x64" }, "sha512-IXxiQpkYnOwNfP23vzwSfhdpxJzyiPTY7eTn6dn3DsriKddESzM8i6kfq9R7CD/PUJwCvQT22NgtygBeug3KoA=="], + "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.52.0", "", { "os": "win32", "cpu": "x64" }, "sha512-q5xL7oeXkZdEtNZWBdvehJcmt+GRu9l2bK40yJs1jJXlqq+r0Hygb1rTjq+FM2o/2xyt4cufH6KRplHp3Jjsvw=="], - "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.22.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-/exgXceakHbQrzaHTtKOe7MuDATaWMCCWpsCDQCZKeYhLGXzComipTrCYnHzAXrdnNBb5r5K+RRf5A6ormrhMA=="], + "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.23.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw=="], - "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.22.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-xFGdIahlmUbK+/MpZ5y08D0ewMGLDbd2Vki5wxVFYg50lSrtgPAtdDl+kqKZLNaFu0zpMar8n9wv1le05sL/jw=="], + "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.23.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA=="], - "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.22.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-53RvC9f77eUo+V1dfQNwGVnsIfPJFMibRR0ee128EUpYNDOZe/ojmCfuXJeU7cY91V7r7fZSm42KPJocXUX8og=="], + "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.23.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw=="], - "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.22.0", "", { "os": "linux", "cpu": "x64" }, "sha512-evZcJAZ9hjNyuN69RnXwbt+U2pAOcYt+yvqukgugiCkRm4iBZ0R0CvpY1tgfG2XcGUhEPh8dljO+nPZTEVGpCQ=="], + "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.23.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA=="], - "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.22.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-7jTO+k1mr5BxRAI2fxc1NRcE3MAbHNZ0Vef9SD1yAR6d1E6qEv5D/D7yuHpQpw6AO3qoecSVo2Jzr+JirN61+w=="], + "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.23.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw=="], - "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.22.0", "", { "os": "win32", "cpu": "x64" }, "sha512-7lbl9XFcqO+scsynxMzTQdl0XUe6sBUCyY/oGWvCB+JmV4U+70vzSyZJdTEzzxtkZiNnUVFFh9RJLmoiQSne+w=="], + "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.23.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ=="], - "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.61.0", "", { "os": "android", "cpu": "arm" }, "sha512-6eZBPgiigK5txqoVgRqxbaxiom4lM8AP8CyKPPvpzKnQ3iFRFOIDc+0AapF+qsUSwjOzr5SGk4SxQDpQhkSJMQ=="], + "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.67.0", "", { "os": "android", "cpu": "arm" }, "sha512-VrSi571rDv1N8HaEDM+DEX8nmT0y9jJo8tzzW13vsOWTx59xQczCIJx68n2zWOXRT5YKZsOZXp4qkHN/10x4mw=="], - "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.61.0", "", { "os": "android", "cpu": "arm64" }, "sha512-CkwLR69MUnyv5wjzebvbbtTSUwqLxM35CXE79bHqDIK+NtKmPEUpStTcLQRZMCo4MP0qRT6TXIQVpK0ZVScnMA=="], + "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.67.0", "", { "os": "android", "cpu": "arm64" }, "sha512-l6+NdYxMoRohix5r5bbigW16LPicceCwGcQ6LKKuE1kUdjgFfQolJjrJsQYPFetIs78Gxj/G/f5TEGoTCwj9nQ=="], - "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.61.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-8JbefTkbmvqkqWjmQrHke+MdpgT2UghhD/ktM4FOQSpGeCgbMToJEKdl9zwhr/YWTl92i4QI1KiTwVExpcUN8A=="], + "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.67.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-jOzXxS1AxFxhImLIRbtGIMrEwaXcgMw3gR57WB1cRk8ai+vpr6726kxXqVvlNsrXtJ/FrmOm8RxlC0m8SW24Qg=="], - "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.61.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-uWpoxDT47hTnDLcdEh5jVbso8rlTTu5o0zuqa9J8E0JAKmIWn7kGFEIB03Pycn2hd2vKxybPGLhjURy/9We5FQ=="], + "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.67.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-3DFAVY94OqjIZHXIPz37yGRSWwOFTAqChQ64/M69GYLawzP0KiwdhDNfqdKKYT0bTR/DNxmMnQsj3ns+8+X/Lg=="], - "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.61.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-K/o4hEyW7flfMel0iBVznmMBt7VIMHGdjADocHKpK1DUF9erpWnJ+BSSWd2W0c8K3mPtpph+CuHzRU6CI3l9jQ=="], + "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.67.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-e4dDKZuLu8TR9DEBssWSDahlPgZBwojTTHZUvnjBRJfJJbpxYCjfjKfi0Z1+CSLMiJBwI2yCDtRM1XJQaARjmg=="], - "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-P6040ZkcyweJ0Po9yEFqJCdvZnf3VNCGs1SIHgXDf8AAQNC6ID/heXQs9iSgo2FH7gKaKq32VWc59XZwL34C5Q=="], + "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.67.0", "", { "os": "linux", "cpu": "arm" }, "sha512-BKytFdcQzbITV3xlnzDUDTEDtbUMCCiC4EaNTDZ4FyT8gdNvBC4gfiLucXp/sQl0XU3p7syTlorUWVVVBZab2g=="], - "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-bwxrGCzTZkuB+THv2TQ1aTkVEfv5oz8sl+0XZZCpoYzErJD8OhPQOTA0ENPd1zJz8QsVdSzSrS2umKtPq4/JXg=="], + "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.67.0", "", { "os": "linux", "cpu": "arm" }, "sha512-XYAv0esBDX7BpTzRDjVX2Vdj+zndd8ll2dFQiaeQ6zTZr7A8GRDTN7fH3FP3jU+O0vCDx85oH/EtG7BzPgAXuw=="], - "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vkhb9/wKguMkLlrm3FoJW/Xmdv31GgYAE+x8lxxQ+7HeOxXUySI0q36a3NTVIuQUdLzxCI1zzMGsk1o37FOe3w=="], + "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.67.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zizRMjA0i6u/2B0evgda04iycu+MoNuf1pBy6Eh+1CjC5wMEG7qN5zdDKTCvFc0KSYSDM9QTG3gjZHirgtQuKg=="], - "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-bl1dQh8LnVqsj6oOQAcxwbuOmNJkwc4p6o//HTBZhNTzJy21TLDwAviMqUFNUxDHkPGpmdKTSN4tWTjLryP8xg=="], + "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.67.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zB/Tf6sUjmmvvbva9Gj3JTJ8rJ9t4I8/U0o6vSRtd0DRIsIuyegBwJAzhSUFQHdMijIRJkW0exs/yBhpw2S20w=="], - "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-QoOX6KB2IiEpyOj/HKqaxi+NQHPnOgNgnr22n9N4ANJCzXkUlj1UmeAbFb4PpqdlHIzvGDM5xZ0OKtcLq9RhiQ=="], + "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.67.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-kgU40Gt74CK0TCsF51KZymkIwN9U0BajKsMijB52zPqOeZU9NAHkA/NSQkZDHEaCakx42DxhXkODiAqf2b4Gug=="], - "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-1TGcTerjY6p152wCof3oKElccq3xHljS/Mucp04gV/4ATpP6nO7YNnp7opEg6SHkv2a57/b4b8Ndm9znJ1/qAw=="], + "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.67.0", "", { "os": "linux", "cpu": "none" }, "sha512-tOYhkk/iaG9aD3FvGpBFd1Lrw0x0RaVoJBxjUkfNzS50rC5NS5BteNCwgr8A2zCdADrIIoze6D7u6U5Ic++/iQ=="], - "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-65wXEmZIrX2ADwC8i/qFL4EWLSbeuBpAm3suuX1vu4IQkKd+wLT/HU/BOl84kp91u2SxPkPDyQgu4yrqp8vwVA=="], + "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.67.0", "", { "os": "linux", "cpu": "none" }, "sha512-sEtywrPb+0b+tHYl1SDCrw903fiC4eyKoNqzP3v+f2JT3Xcv4NEYG+P8rj+eEnX7IWhqV/xj8/JmcmVj21CXaA=="], - "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.61.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-TVvhgMvor7Qa6COeXxCJ7ENOM+lcAOGsQ0iUdPSCv2hxb9qSHLQ4XF1h50S6RE1gBOJ0WV3rNukg4JJJP1LWRA=="], + "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.67.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-BvR8Moa0zCLxroOx4vZaZN9nUfwAUpSTwjZdxZyKy4bv3PrzrXrxKR/ZQ0L9wNSvlPhnMJeZfa3q5w6ZCTuN6Q=="], - "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-SjpS5uYuFoDnDdZPwZE59ndF95AsY47R5MliuneTWR1pDm2CxGJaYXbKULI71t5TVfLQUWmrHEGRL9xvuq6dnA=="], + "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.67.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mm2cxM6fksOpq6l0uFws8BUGKAR4dNa/cZCn37Npq7PFbhD5HDJqWfnoIvTaeRKMy5XdS2tO0MA0qbHDrnXAAA=="], - "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-gGfAeGD4sNJGILZbc/yKcIimO9wQnPMoYp9swAaKeEtwsSQAbU+rsdQze5SBtIP6j0QDzeYd4XSSUCRCF+LIeQ=="], + "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.67.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WmbMuLapKyDlobMkXAaAL0Y+Uczh4LETfIfQsUpbId4Ip8Ai82/jqeYTOoUCkuuhBFapgqP253+d83tLKOksJg=="], - "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.61.0", "", { "os": "none", "cpu": "arm64" }, "sha512-OlVT0LrG/ct33EVtWRyR+B/othwmDWeRxfi13wUdPeb3lAT5TgTcFDcfLfarZtzB4W1nWF/zICMgYdkggX2WmQ=="], + "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.67.0", "", { "os": "none", "cpu": "arm64" }, "sha512-9g/PqxYJelzzTAOR5Y+RiRqdeydhEuXv2KxNeFcAKQ7UsvnWSY1OP4MsuPMbTO2Pf70tz7mFhl1j13H3fyh+8g=="], - "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.61.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-vI//NZPJk6DToiovPtaiwD4iQ7kO1r5ReWQD0sOOyKRtP3E2f6jxin4uvwi3OvDzHA2EFfd7DcZl5dtkQh7g1w=="], + "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.67.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-2VhwE6Gatb0vJGnN0TBuQMbKCOiZlSQ/zJvVWYLK4a9d4iDiJOen/yVQkGpmsJ90MuH66fzi0kEKI0jRQMDxGA=="], - "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.61.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-0ySj4/4zd2XjePs3XAQq7IigIstN4LPQZgCyigX5/ERMLjdWAJfnxcTsrtxZxuij8guJW8foXuHmhGxW0H4dDA=="], + "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.67.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-EQ3VExXfeM1InbE5+JjufhZZTWy+kHUwgt3yZR7gQ47Je/mE0WspQPan0OJznh493L5anM210YNJtH1PXjTSFg=="], - "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-0xgSiyeqDLDZxXoe9CVJrOx3TUVsfyoOY7cNi03JbItNcC9WCZqrSNdrAbHONxhSPaVh/lzfnDcON1RqSUMhHw=="], + "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.67.0", "", { "os": "win32", "cpu": "x64" }, "sha512-bw24y+/1MHS4QDkons3YyHkPT9uCMoLHHgQhb+mb8NOjTYwub1CZ+K9Ngr8aO5DMrDrkqHwTzlTwFP2vS8Y/ZQ=="], "@pagefind/darwin-arm64": ["@pagefind/darwin-arm64@1.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ=="], @@ -3198,27 +3198,27 @@ "kysely": ["kysely@0.28.16", "", {}, "sha512-3i5pmOiZvMDj00qhrIVbH0AnioVTx22DMP7Vn5At4yJO46iy+FM8Y/g61ltenLVSo3fiO8h8Q3QOFgf/gQ72ww=="], - "lefthook": ["lefthook@2.1.6", "", { "optionalDependencies": { "lefthook-darwin-arm64": "2.1.6", "lefthook-darwin-x64": "2.1.6", "lefthook-freebsd-arm64": "2.1.6", "lefthook-freebsd-x64": "2.1.6", "lefthook-linux-arm64": "2.1.6", "lefthook-linux-x64": "2.1.6", "lefthook-openbsd-arm64": "2.1.6", "lefthook-openbsd-x64": "2.1.6", "lefthook-windows-arm64": "2.1.6", "lefthook-windows-x64": "2.1.6" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-w9sBoR0mdN+kJc3SB85VzpiAAl451/rxdCRcZlwW71QLjkeH3EBQFgc4VMj5apePychYDHAlqEWTB8J8JK/j1Q=="], + "lefthook": ["lefthook@2.1.9", "", { "optionalDependencies": { "lefthook-darwin-arm64": "2.1.9", "lefthook-darwin-x64": "2.1.9", "lefthook-freebsd-arm64": "2.1.9", "lefthook-freebsd-x64": "2.1.9", "lefthook-linux-arm64": "2.1.9", "lefthook-linux-x64": "2.1.9", "lefthook-openbsd-arm64": "2.1.9", "lefthook-openbsd-x64": "2.1.9", "lefthook-windows-arm64": "2.1.9", "lefthook-windows-x64": "2.1.9" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-bwDaIOViTktE8kJLf9jP0p+H2/RDTlFFlc43Am2YgUsX22hI6Sq4RbzsrecwzY5y+MHTipOH7WsmWSEniePHWQ=="], - "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hyB7eeiX78BS66f70byTJacDLC/xV1vgMv9n+idFUsrM7J3Udd/ag9Ag5NP3t0eN0EqQqAtrNnt35EH01lxnRQ=="], + "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.1.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-119HryNcvr4nqn0wUIrNPgpMEPn9yMQzEcW/lezRsnb56PCJriJB92+MCySPVcWDxJnZef7o0T3jdnPNiSH7Qg=="], - "lefthook-darwin-x64": ["lefthook-darwin-x64@2.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-5Ka6cFxiH83krt+OMRQtmS6zqoZR5SLXSudLjTbZA1c3ZqF0+dqkeb4XcB6plx6WR0GFizabuc6Bi3iXPIe1eQ=="], + "lefthook-darwin-x64": ["lefthook-darwin-x64@2.1.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-dwo5Tke2XcQCM56DGHgFKBfRbJIL6xs2wZ0zG1TUVZgl4t4mQUt6LiZ4V/ZQfYHTZF9qywvXoIlR5N35qOaiVQ=="], - "lefthook-freebsd-arm64": ["lefthook-freebsd-arm64@2.1.6", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-VswyOg5CVN3rMaOJ2HtnkltiMKgFHW/wouWxXsV8RxSa4tgWOKxM0EmSXi8qc2jX+LRga6B0uOY6toXS01zWxA=="], + "lefthook-freebsd-arm64": ["lefthook-freebsd-arm64@2.1.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+09PVap6nl6xsaHch5JLtq7WvIR++U1Q2MzA2ai0M4uB/VP3AqrvKqHw6+9hjyKnIH+HHL83uqi77EAY+LaxLA=="], - "lefthook-freebsd-x64": ["lefthook-freebsd-x64@2.1.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vXsCUFYuVwrVWwcypB7Zt2Hf+5pl1V1la7ZfvGYZaTRURu0zF/XUnMF/nOz/PebGv0f4x/iOWXWwP7E42xRWsg=="], + "lefthook-freebsd-x64": ["lefthook-freebsd-x64@2.1.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-8XresjKIYpkE9ARgCtBEZgJZxAU3T4MIqzj4zNy15XRT59I1Us+QdqXTNm+pkZ41Yd2X/nxs2Pkvbq3NWWlIGw=="], - "lefthook-linux-arm64": ["lefthook-linux-arm64@2.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-WDJiQhJdZOvKORZd+kF/ms2l6NSsXzdA9ahflyr65V90AC4jES223W8VtEMbGPUtHuGWMEZ/v/XvwlWv0Ioz9g=="], + "lefthook-linux-arm64": ["lefthook-linux-arm64@2.1.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-1oNIQfwrPe6rgU2KcDM3aF6+hpZDCKx1TmawQKpXUY5gVsbZ7MqX0Sk/1lnnWxqPm+kQQ5f6J2dpFWd+4xH8jg=="], - "lefthook-linux-x64": ["lefthook-linux-x64@2.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-C18nCd7nTX1AVL4TcvwMmLAO1VI1OuGluIOTjiPkBQ746Ls1HhL5rl//jMPACmT28YmxIQJ2ZcLPNmhvEVBZvw=="], + "lefthook-linux-x64": ["lefthook-linux-x64@2.1.9", "", { "os": "linux", "cpu": "x64" }, "sha512-fT+7Q+BJyGp+CslFQkNXmdFRgyVXsPHPi9NAsDX0a6QOyNnoORByAsvx6zeAKuF5rL3BBgNfho1/v2RuGxGy9w=="], - "lefthook-openbsd-arm64": ["lefthook-openbsd-arm64@2.1.6", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-mZOMxM8HiPxVFXDO3PtCUbH4GB8rkveXhsgXF27oAZTYVzQ3gO9vT6r/pxit6msqRXz3fvcwimLVJgb8eRsa8A=="], + "lefthook-openbsd-arm64": ["lefthook-openbsd-arm64@2.1.9", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-4bVuafBk3dddVNo0+3hMbjcJs4mqYAstxpPMmX2ufkudSTYFNIhWoqwuGVQV/SS/xdcOKJAldW4qayAzed2ysw=="], - "lefthook-openbsd-x64": ["lefthook-openbsd-x64@2.1.6", "", { "os": "openbsd", "cpu": "x64" }, "sha512-sG9ALLZSnnMOfXu+B7SmxFhJhuoAh4bqi5En5aaHJET48TqrLOcWWZuH+7ArFM6gr/U5KfSUvdmHFmY8WqCcIg=="], + "lefthook-openbsd-x64": ["lefthook-openbsd-x64@2.1.9", "", { "os": "openbsd", "cpu": "x64" }, "sha512-PmPoMmLP/wQQWcQ9u2YH86bTZ3UCfBsxuEmVTEyPU2U8R1qSTp5r/Gs3G8cN5Mxo91XB9oBERtF1n+xD3W6aVA=="], - "lefthook-windows-arm64": ["lefthook-windows-arm64@2.1.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-lD8yFWY4Csuljd0Rqs7EQaySC0VvDf7V3rN1FhRMUISTRDHutebIom1Loc8ckQPvKYGC6mftT9k0GvipsS+Brw=="], + "lefthook-windows-arm64": ["lefthook-windows-arm64@2.1.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-KphfkBKmwBnmolyrdhIl3lrBaOyTcCgXBT2AB/9OHnEXhOLvv5uTCUkrD4YRAxXPtFKq6UvnapIeoL3GZq0bdA=="], - "lefthook-windows-x64": ["lefthook-windows-x64@2.1.6", "", { "os": "win32", "cpu": "x64" }, "sha512-q4z2n3xucLscoWiyMwFViEj3N8MDSkPulMwcJYuCYFHoPhP1h+icqNu7QRLGYj6AnVrCQweiUJY3Tb2X+GbD/A=="], + "lefthook-windows-x64": ["lefthook-windows-x64@2.1.9", "", { "os": "win32", "cpu": "x64" }, "sha512-2qlUtkJHZ3MyUxgV5XTEmcrIoNZA07iwaquoswAcqv/1MeBFXlD+O+koFRfrzWng2O5WYEbpJnd8tvaYnV8fTA=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], @@ -3464,7 +3464,7 @@ "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], - "miniflare": ["miniflare@4.20260415.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.24.8", "workerd": "1.20260415.1", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-JoExRWN4YBI2luA5BoSMFEgi8rQWXUGzo3mtE+58VXCLV3jj/Xnk5Yeqs/IXWz8Es5GJIaq6BtsixDvAxXSIng=="], + "miniflare": ["miniflare@4.20260526.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.24.8", "workerd": "1.20260526.1", "ws": "8.20.1", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-JYQ7jPZZWoaaj9jWHb8Ucp6Cu2SbDVqIsAJhumqdzzLkkfq0pYkDeino/sZfW1ixJWPjv/C44zjm9gVJC2izCA=="], "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], @@ -3612,11 +3612,11 @@ "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="], - "oxfmt": ["oxfmt@0.46.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.46.0", "@oxfmt/binding-android-arm64": "0.46.0", "@oxfmt/binding-darwin-arm64": "0.46.0", "@oxfmt/binding-darwin-x64": "0.46.0", "@oxfmt/binding-freebsd-x64": "0.46.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.46.0", "@oxfmt/binding-linux-arm-musleabihf": "0.46.0", "@oxfmt/binding-linux-arm64-gnu": "0.46.0", "@oxfmt/binding-linux-arm64-musl": "0.46.0", "@oxfmt/binding-linux-ppc64-gnu": "0.46.0", "@oxfmt/binding-linux-riscv64-gnu": "0.46.0", "@oxfmt/binding-linux-riscv64-musl": "0.46.0", "@oxfmt/binding-linux-s390x-gnu": "0.46.0", "@oxfmt/binding-linux-x64-gnu": "0.46.0", "@oxfmt/binding-linux-x64-musl": "0.46.0", "@oxfmt/binding-openharmony-arm64": "0.46.0", "@oxfmt/binding-win32-arm64-msvc": "0.46.0", "@oxfmt/binding-win32-ia32-msvc": "0.46.0", "@oxfmt/binding-win32-x64-msvc": "0.46.0" }, "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-CopwJOwPAjZ9p76fCvz+mSOJTw9/NY3cSksZK3VO/bUQ8UoEcketNgUuYS0UB3p+R9XnXe7wGGXUmyFxc7QxJA=="], + "oxfmt": ["oxfmt@0.52.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.52.0", "@oxfmt/binding-android-arm64": "0.52.0", "@oxfmt/binding-darwin-arm64": "0.52.0", "@oxfmt/binding-darwin-x64": "0.52.0", "@oxfmt/binding-freebsd-x64": "0.52.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.52.0", "@oxfmt/binding-linux-arm-musleabihf": "0.52.0", "@oxfmt/binding-linux-arm64-gnu": "0.52.0", "@oxfmt/binding-linux-arm64-musl": "0.52.0", "@oxfmt/binding-linux-ppc64-gnu": "0.52.0", "@oxfmt/binding-linux-riscv64-gnu": "0.52.0", "@oxfmt/binding-linux-riscv64-musl": "0.52.0", "@oxfmt/binding-linux-s390x-gnu": "0.52.0", "@oxfmt/binding-linux-x64-gnu": "0.52.0", "@oxfmt/binding-linux-x64-musl": "0.52.0", "@oxfmt/binding-openharmony-arm64": "0.52.0", "@oxfmt/binding-win32-arm64-msvc": "0.52.0", "@oxfmt/binding-win32-ia32-msvc": "0.52.0", "@oxfmt/binding-win32-x64-msvc": "0.52.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-nJlYM35F64zTDMecCNhoHNkf+D/eHv7xcjj9XDSj+bFAVtN93m7v8DQMdHd6nDG6Akf/kEYYHmDUBs2Dz27Sug=="], - "oxlint": ["oxlint@1.61.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.61.0", "@oxlint/binding-android-arm64": "1.61.0", "@oxlint/binding-darwin-arm64": "1.61.0", "@oxlint/binding-darwin-x64": "1.61.0", "@oxlint/binding-freebsd-x64": "1.61.0", "@oxlint/binding-linux-arm-gnueabihf": "1.61.0", "@oxlint/binding-linux-arm-musleabihf": "1.61.0", "@oxlint/binding-linux-arm64-gnu": "1.61.0", "@oxlint/binding-linux-arm64-musl": "1.61.0", "@oxlint/binding-linux-ppc64-gnu": "1.61.0", "@oxlint/binding-linux-riscv64-gnu": "1.61.0", "@oxlint/binding-linux-riscv64-musl": "1.61.0", "@oxlint/binding-linux-s390x-gnu": "1.61.0", "@oxlint/binding-linux-x64-gnu": "1.61.0", "@oxlint/binding-linux-x64-musl": "1.61.0", "@oxlint/binding-openharmony-arm64": "1.61.0", "@oxlint/binding-win32-arm64-msvc": "1.61.0", "@oxlint/binding-win32-ia32-msvc": "1.61.0", "@oxlint/binding-win32-x64-msvc": "1.61.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.18.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-ZC0ALuhDZ6ivOFG+sy0D0pEDN49EvsId98zVlmYdkcXHsEM14m/qTNUEsUpiFiCVbpIxYtVBmmLE87nsbUHohQ=="], + "oxlint": ["oxlint@1.67.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.67.0", "@oxlint/binding-android-arm64": "1.67.0", "@oxlint/binding-darwin-arm64": "1.67.0", "@oxlint/binding-darwin-x64": "1.67.0", "@oxlint/binding-freebsd-x64": "1.67.0", "@oxlint/binding-linux-arm-gnueabihf": "1.67.0", "@oxlint/binding-linux-arm-musleabihf": "1.67.0", "@oxlint/binding-linux-arm64-gnu": "1.67.0", "@oxlint/binding-linux-arm64-musl": "1.67.0", "@oxlint/binding-linux-ppc64-gnu": "1.67.0", "@oxlint/binding-linux-riscv64-gnu": "1.67.0", "@oxlint/binding-linux-riscv64-musl": "1.67.0", "@oxlint/binding-linux-s390x-gnu": "1.67.0", "@oxlint/binding-linux-x64-gnu": "1.67.0", "@oxlint/binding-linux-x64-musl": "1.67.0", "@oxlint/binding-openharmony-arm64": "1.67.0", "@oxlint/binding-win32-arm64-msvc": "1.67.0", "@oxlint/binding-win32-ia32-msvc": "1.67.0", "@oxlint/binding-win32-x64-msvc": "1.67.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-blwwaHPdoH8piQ5/z0KHeoHFR7FZgl12WluKJfu4qFLPkZl6mK04PkLE45Fw1NxfBRSlh40Gu7MkxHUw++ociQ=="], - "oxlint-tsgolint": ["oxlint-tsgolint@0.22.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.22.0", "@oxlint-tsgolint/darwin-x64": "0.22.0", "@oxlint-tsgolint/linux-arm64": "0.22.0", "@oxlint-tsgolint/linux-x64": "0.22.0", "@oxlint-tsgolint/win32-arm64": "0.22.0", "@oxlint-tsgolint/win32-x64": "0.22.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-ku4MecLmCQIj1ScCtzNAqTuyl0BJQ02B36fJT+c5XQihHpYSFak+FC3GYO5fPyYk4oDwi0w0S7hTvrpNzuZhig=="], + "oxlint-tsgolint": ["oxlint-tsgolint@0.23.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.23.0", "@oxlint-tsgolint/darwin-x64": "0.23.0", "@oxlint-tsgolint/linux-arm64": "0.23.0", "@oxlint-tsgolint/linux-x64": "0.23.0", "@oxlint-tsgolint/win32-arm64": "0.23.0", "@oxlint-tsgolint/win32-x64": "0.23.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA=="], "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], @@ -3910,6 +3910,14 @@ "rollup-plugin-visualizer": ["rollup-plugin-visualizer@7.0.1", "", { "dependencies": { "open": "^11.0.0", "picomatch": "^4.0.2", "source-map": "^0.7.4", "yargs": "^18.0.0" }, "peerDependencies": { "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown", "rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg=="], + "rosie-skills": ["rosie-skills@0.6.4", "", { "optionalDependencies": { "rosie-skills-darwin-arm64": "0.6.4", "rosie-skills-freebsd-x64": "0.6.4", "rosie-skills-linux-x64": "0.6.4" }, "bin": { "rosie-skills": "dist/bin.js" } }, "sha512-ojfhSiQRdZ2QyWbmKAHOSAUbaLYrTc5zIH7mS1jKoP8KCFSQddwVhMyFqldckTeybTfW3zNcsZzyOTzGTN1SBA=="], + + "rosie-skills-darwin-arm64": ["rosie-skills-darwin-arm64@0.6.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rn1s5hqFKcxeiDEWWoFa1hdGPshR8TkwHLzy/cBavb9XJNAaUxbe3oQ78W9sQkRHAgRyzJYyk9tw68Qrdnizgg=="], + + "rosie-skills-freebsd-x64": ["rosie-skills-freebsd-x64@0.6.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SxCRduPBMtfjkQ+q56Yw9OLA3PyaqoALzt7kER7IDKuUVfM2O/1w8sa5xhTDiCvWkZJixnH5d5Ya6KT+/Mwcng=="], + + "rosie-skills-linux-x64": ["rosie-skills-linux-x64@0.6.4", "", { "os": "linux", "cpu": "x64" }, "sha512-D9Y9mfu7goB0s0X59uU3hcFeUTef3VbpCIDwFMzyvJrAq3XhRACWBDMHQsHlyWdHxTXPX/ILyW65RXyrJlgqng=="], + "rou3": ["rou3@0.7.12", "", {}, "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg=="], "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], @@ -4358,9 +4366,9 @@ "wordwrapjs": ["wordwrapjs@5.1.1", "", {}, "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg=="], - "workerd": ["workerd@1.20260415.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260415.1", "@cloudflare/workerd-darwin-arm64": "1.20260415.1", "@cloudflare/workerd-linux-64": "1.20260415.1", "@cloudflare/workerd-linux-arm64": "1.20260415.1", "@cloudflare/workerd-windows-64": "1.20260415.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-phyPjRnx+mQDfkhN9ENPioL1L0SdhYs4S0YmJK/xF9Oga+ykNfdSy1MHnsOj8yqnOV96zcVQMx32dJ0r3pq0jQ=="], + "workerd": ["workerd@1.20260526.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260526.1", "@cloudflare/workerd-darwin-arm64": "1.20260526.1", "@cloudflare/workerd-linux-64": "1.20260526.1", "@cloudflare/workerd-linux-arm64": "1.20260526.1", "@cloudflare/workerd-windows-64": "1.20260526.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-IHzymht98p10JH1zzwdCpbViAqw97HrwKl7+KfZeASFMsYSrIsAULWdPn0LRC5FTUzBpamLNyKCCKxbgXHgRHQ=="], - "wrangler": ["wrangler@4.83.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.16.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.3", "miniflare": "4.20260415.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260415.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260415.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-gw5g3LCiuAqVWxaoKY6+quE0HzAUEFb/FV3oAlNkE1ttd4XP3FiV91XDkkzUCcdqxS4WjhQvPhIDBNdhEi8P0A=="], + "wrangler": ["wrangler@4.95.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.27.3", "miniflare": "4.20260526.0", "path-to-regexp": "6.3.0", "rosie-skills": "^0.6.3", "unenv": "2.0.0-rc.24", "workerd": "1.20260526.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260526.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-vgXzFVSCdUbeCadgVXvu8fK5tzNm8T9W+7lriyGWZMx0B1+CAdr4d8JTlZszHfgjypRAHmAxb49etZGIRD9pgg=="], "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -4816,6 +4824,12 @@ "@buape/carbon/discord-api-types": ["discord-api-types@0.38.45", "", {}, "sha512-DiI01i00FPv6n+hXcFkFxK8Y/rFRpKs6U6aP32N4T73nTbj37Eua3H/95TBpLktLWB6xnLXhYDGvyLq6zzYY2w=="], + "@cloudflare/vite-plugin/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg=="], + + "@cloudflare/vite-plugin/miniflare": ["miniflare@4.20260415.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.24.8", "workerd": "1.20260415.1", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-JoExRWN4YBI2luA5BoSMFEgi8rQWXUGzo3mtE+58VXCLV3jj/Xnk5Yeqs/IXWz8Es5GJIaq6BtsixDvAxXSIng=="], + + "@cloudflare/vite-plugin/wrangler": ["wrangler@4.83.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.16.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.3", "miniflare": "4.20260415.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260415.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260415.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-gw5g3LCiuAqVWxaoKY6+quE0HzAUEFb/FV3oAlNkE1ttd4XP3FiV91XDkkzUCcdqxS4WjhQvPhIDBNdhEi8P0A=="], + "@cloudflare/vite-plugin/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], @@ -5294,7 +5308,7 @@ "miniflare/undici": ["undici@7.24.8", "", {}, "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ=="], - "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "miniflare/ws": ["ws@8.20.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="], "next-themes/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], @@ -5598,6 +5612,16 @@ "@buape/carbon/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "@cloudflare/vite-plugin/miniflare/undici": ["undici@7.24.8", "", {}, "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ=="], + + "@cloudflare/vite-plugin/miniflare/workerd": ["workerd@1.20260415.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260415.1", "@cloudflare/workerd-darwin-arm64": "1.20260415.1", "@cloudflare/workerd-linux-64": "1.20260415.1", "@cloudflare/workerd-linux-arm64": "1.20260415.1", "@cloudflare/workerd-windows-64": "1.20260415.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-phyPjRnx+mQDfkhN9ENPioL1L0SdhYs4S0YmJK/xF9Oga+ykNfdSy1MHnsOj8yqnOV96zcVQMx32dJ0r3pq0jQ=="], + + "@cloudflare/vite-plugin/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.2", "", {}, "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ=="], + + "@cloudflare/vite-plugin/wrangler/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + + "@cloudflare/vite-plugin/wrangler/workerd": ["workerd@1.20260415.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260415.1", "@cloudflare/workerd-darwin-arm64": "1.20260415.1", "@cloudflare/workerd-linux-64": "1.20260415.1", "@cloudflare/workerd-linux-arm64": "1.20260415.1", "@cloudflare/workerd-windows-64": "1.20260415.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-phyPjRnx+mQDfkhN9ENPioL1L0SdhYs4S0YmJK/xF9Oga+ykNfdSy1MHnsOj8yqnOV96zcVQMx32dJ0r3pq0jQ=="], + "@discordjs/node-pre-gyp/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], "@discordjs/node-pre-gyp/make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -6192,6 +6216,78 @@ "@aws-sdk/middleware-sdk-s3/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="], + "@cloudflare/vite-plugin/miniflare/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260415.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-dsxaKsQm3LnPGNPEdsRv09QN3Y4DqCw7kX5j6noKqbAtro2jTr95sVlYM1jUxZ5FkOl1f7SXgaKKB9t5H5Nkbg=="], + + "@cloudflare/vite-plugin/miniflare/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260415.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+JgSgVA49KyKteHRA1SnonE4Zn5Ei5zdAp5FQMxFmXI8qulZw4Hl7safXxRyK4i9sTO8gl7TFOKO5Q64VPvSDQ=="], + + "@cloudflare/vite-plugin/miniflare/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260415.1", "", { "os": "linux", "cpu": "x64" }, "sha512-tU+9pwsqCy8afOVlGtiWrWQc/fedQK4SRm4KPIAt+zOiQWDxWASm6YGBUJis5c648WN80yz47qnmdDi8DQNOcA=="], + + "@cloudflare/vite-plugin/miniflare/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260415.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-bR9uITnV19r5NQ14xnypi2xHXu2iQvfYV8cVgx0JouFUmWwTEEAwFVojDdssGq93VHX9hr/pi2IRUZeegbYBog=="], + + "@cloudflare/vite-plugin/miniflare/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260415.1", "", { "os": "win32", "cpu": "x64" }, "sha512-4NuMLlerI0Ijua3Ir8HXQ+qyNvCUDEG5gDco5Om+sAiK6rnWiz+aGoSlbB8W16yW9QAgzCstbmXLiVknUBflfQ=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + + "@cloudflare/vite-plugin/wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + + "@cloudflare/vite-plugin/wrangler/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260415.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-dsxaKsQm3LnPGNPEdsRv09QN3Y4DqCw7kX5j6noKqbAtro2jTr95sVlYM1jUxZ5FkOl1f7SXgaKKB9t5H5Nkbg=="], + + "@cloudflare/vite-plugin/wrangler/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260415.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+JgSgVA49KyKteHRA1SnonE4Zn5Ei5zdAp5FQMxFmXI8qulZw4Hl7safXxRyK4i9sTO8gl7TFOKO5Q64VPvSDQ=="], + + "@cloudflare/vite-plugin/wrangler/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260415.1", "", { "os": "linux", "cpu": "x64" }, "sha512-tU+9pwsqCy8afOVlGtiWrWQc/fedQK4SRm4KPIAt+zOiQWDxWASm6YGBUJis5c648WN80yz47qnmdDi8DQNOcA=="], + + "@cloudflare/vite-plugin/wrangler/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260415.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-bR9uITnV19r5NQ14xnypi2xHXu2iQvfYV8cVgx0JouFUmWwTEEAwFVojDdssGq93VHX9hr/pi2IRUZeegbYBog=="], + + "@cloudflare/vite-plugin/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260415.1", "", { "os": "win32", "cpu": "x64" }, "sha512-4NuMLlerI0Ijua3Ir8HXQ+qyNvCUDEG5gDco5Om+sAiK6rnWiz+aGoSlbB8W16yW9QAgzCstbmXLiVknUBflfQ=="], + "@discordjs/node-pre-gyp/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "@discordjs/node-pre-gyp/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], diff --git a/package.json b/package.json index 89455341..cd490d71 100644 --- a/package.json +++ b/package.json @@ -81,15 +81,15 @@ "@vitejs/plugin-react": "6.0.1", "babel-plugin-react-compiler": "1.0.0", "openclaw": "2026.4.10", - "oxfmt": "0.46.0", - "oxlint": "1.61.0", + "oxfmt": "0.52.0", + "oxlint": "1.67.0", "postcss": "8.5.6", "rollup-plugin-visualizer": "7.0.1", "tailwindcss": "4.2.2", "typescript": "5.4.5", "vite": "8.0.2", "vite-tsconfig-paths": "6.1.1", - "wrangler": "4.83.0" + "wrangler": "4.95.0" } } }, @@ -157,12 +157,12 @@ "eslint-plugin-turbo": "2.9.5", "happy-dom": "20.3.3", "knip": "6.0.5", - "lefthook": "2.1.6", + "lefthook": "2.1.9", "npm-check-updates": "19.3.1", "openclaw": "catalog:tooling", "oxfmt": "catalog:tooling", "oxlint": "catalog:tooling", - "oxlint-tsgolint": "0.22.0", + "oxlint-tsgolint": "0.23.0", "turbo": "2.9.5", "vitest": "catalog:testing" }, diff --git a/packages/openclaw-plugin/package.json b/packages/openclaw-plugin/package.json index 89dac7fc..c82111cd 100644 --- a/packages/openclaw-plugin/package.json +++ b/packages/openclaw-plugin/package.json @@ -8,7 +8,7 @@ "openclaw", "plugin" ], - "homepage": "https://github.com/wordbricks/onequery/tree/main/packages/openclaw-plugin#readme", + "homepage": "https://onequery.dev", "bugs": { "url": "https://github.com/wordbricks/onequery/issues" }, diff --git a/packages/openclaw-plugin/skills/onequery-cli/SKILL.md b/packages/openclaw-plugin/skills/onequery-cli/SKILL.md index 97d23f73..245b2c19 100644 --- a/packages/openclaw-plugin/skills/onequery-cli/SKILL.md +++ b/packages/openclaw-plugin/skills/onequery-cli/SKILL.md @@ -1,7 +1,7 @@ --- name: onequery-openclaw description: Use OpenClaw's exec tool to inspect orgs, sources, and run bounded read-only SQL through the OneQuery CLI directly. -metadata: {"openclaw":{"requires":{"bins":["onequery"]},"homepage":"https://github.com/wordbricks/onequery"}} +metadata: {"openclaw":{"requires":{"bins":["onequery"]},"homepage":"https://onequery.dev"}} --- Use this skill when the user wants company or customer data that should be read From 1b91a3730a4fd7845f153ed98846f011372b941a Mon Sep 17 00:00:00 2001 From: lentil32 Date: Tue, 2 Jun 2026 16:40:33 +0900 Subject: [PATCH 06/13] chore: fix lint issues --- .oxlintrc.jsonc | 4 + apps/cli/bin/onequery.js | 16 +- apps/cli/package.json | 3 + apps/cli/scripts/build-npm-package.d.ts | 2 +- apps/cli/scripts/build-npm-package.js | 11 +- apps/cli/scripts/build-npm-package.test.ts | 21 +- apps/cli/scripts/build-server-bundle.js | 6 +- apps/cli/scripts/self-host-runtime.js | 6 +- .../home/components/ControlPlaneDiagram.astro | 414 ++++ .../home/components/DownloadCommand.astro | 222 ++ .../home/components/HeroProductSurface.astro | 761 ++++++ .../home/components/OpenClawSection.astro | 74 +- .../components/ProductUpdatesSection.astro | 88 +- .../home/components/RoadmapSection.astro | 175 ++ .../home/components/TerminalSurface.astro | 85 + apps/landing/src/features/home/styles.css | 2051 ----------------- apps/landing/src/pages/index.astro | 388 +++- lefthook.yml | 2 +- packages/config/src/server-launch.ts | 2 - 19 files changed, 2240 insertions(+), 2091 deletions(-) delete mode 100644 apps/landing/src/features/home/styles.css diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc index 9c9b7f12..1b4ea31a 100644 --- a/.oxlintrc.jsonc +++ b/.oxlintrc.jsonc @@ -37,6 +37,7 @@ "no-console": "off", "no-ternary": "off", "no-undefined": "off", + "no-underscore-dangle": "off", "max-lines": "off", "id-length": "off", "func-style": [ @@ -170,6 +171,7 @@ "react/jsx-props-no-spreading": "off", "react/jsx-max-depth": "off", "react/no-multi-comp": "off", + "react/forbid-component-props": "off", "react_perf/jsx-no-jsx-as-prop": "off", "react_perf/jsx-no-new-object-as-prop": "off", @@ -177,6 +179,7 @@ "react_perf/jsx-no-new-function-as-prop": "off", // Not a blanket perf win with React Compiler; prefer targeted stabilization at memo/effect boundaries. "jsx-a11y/no-autofocus": "off", + "jsx-a11y/prefer-tag-over-role": "off", "sort-keys": "off", "no-inline-comments": "off", @@ -217,6 +220,7 @@ "no-script-url": "off", // TEMP ~1 "no-redeclare": "off", // TEMP ~1 "no-new": "off", // TEMP ~1 + "require-unicode-regexp": "off", // TEMP ~100 — add unicode flags to existing regex literals }, "ignorePatterns": [ "**/node_modules", diff --git a/apps/cli/bin/onequery.js b/apps/cli/bin/onequery.js index 7fa2940e..52ca20e6 100755 --- a/apps/cli/bin/onequery.js +++ b/apps/cli/bin/onequery.js @@ -15,8 +15,8 @@ import { resolveTargetTripleCandidates, } from "./package-constants.js"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +const launcherFilePath = fileURLToPath(import.meta.url); +const launcherDir = path.dirname(launcherFilePath); const require = createRequire(import.meta.url); const runtimeBundleSpec = readRuntimeBundleSpec(resolveRuntimeBundleSpecPath()); @@ -27,7 +27,7 @@ const binaryName = binaryNameForPlatform(platform, CLI_BINARY_NAME); // CONTEXT: platform packages are installed through npm alias names so the // launcher resolves the alias folder, not the underlying published package id. -const localVendorRoot = path.join(__dirname, "..", "vendor"); +const localVendorRoot = path.join(launcherDir, "..", "vendor"); const resolvedVendor = resolveVendorPayload({ binaryName, localVendorRoot, @@ -112,7 +112,7 @@ if (childResult.type === "signal") { function detectPackageManager() { const userAgent = process.env.npm_config_user_agent ?? ""; - if (/\bbun\//.test(userAgent)) { + if (/\bbun\//u.test(userAgent)) { return "bun"; } @@ -122,8 +122,8 @@ function detectPackageManager() { } if ( - __dirname.includes(".bun/install/global") || - __dirname.includes(".bun\\install\\global") + launcherDir.includes(".bun/install/global") || + launcherDir.includes(".bun\\install\\global") ) { return "bun"; } @@ -196,7 +196,7 @@ function resolveBundlePaths({ binaryName, bundleRoot, runtimeBundleSpec }) { } function resolveRuntimeBundleSpecPath() { - const packagedSpecPath = path.join(__dirname, "..", "runtime-bundle.json"); + const packagedSpecPath = path.join(launcherDir, "..", "runtime-bundle.json"); if (existsSync(packagedSpecPath)) { return packagedSpecPath; } @@ -204,7 +204,7 @@ function resolveRuntimeBundleSpecPath() { // Comment: local workspace execution reads the canonical bundle spec from the // repo; published npm packages ship the same file at the package root. return path.join( - __dirname, + launcherDir, "..", "..", "..", diff --git a/apps/cli/package.json b/apps/cli/package.json index 8c21ac1f..aeb55aaf 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -4,6 +4,9 @@ "private": false, "description": "OneQuery CLI", "homepage": "https://onequery.dev", + "bugs": { + "url": "https://github.com/wordbricks/onequery/issues" + }, "license": "Apache-2.0", "repository": { "type": "git", diff --git a/apps/cli/scripts/build-npm-package.d.ts b/apps/cli/scripts/build-npm-package.d.ts index c98e0ac7..b92414ab 100644 --- a/apps/cli/scripts/build-npm-package.d.ts +++ b/apps/cli/scripts/build-npm-package.d.ts @@ -7,7 +7,7 @@ export function tarballNameForPackage( version: string ): string; -export const __internal: { +export const buildNpmPackageInternals: { indexWorkspacePackageManifestPaths( workspacePackageManifests: Array<{ name: string; diff --git a/apps/cli/scripts/build-npm-package.js b/apps/cli/scripts/build-npm-package.js index 0fa53ca1..8a69a250 100755 --- a/apps/cli/scripts/build-npm-package.js +++ b/apps/cli/scripts/build-npm-package.js @@ -40,10 +40,10 @@ import { binaryNameForTargetTriple, } from "../bin/package-constants.js"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +const scriptFilePath = fileURLToPath(import.meta.url); +const scriptDir = path.dirname(scriptFilePath); -const CLI_ROOT = path.resolve(__dirname, ".."); +const CLI_ROOT = path.resolve(scriptDir, ".."); const WORKSPACE_ROOT = path.resolve(CLI_ROOT, "..", ".."); const WORKSPACE_MANIFEST_PATH = path.join(WORKSPACE_ROOT, "package.json"); const workspacePackageRequireCache = new Map(); @@ -331,8 +331,10 @@ function createReleasePlatformPackageManifest( ) { const stagedPlatformPackage = { cpu: [platformPackage.cpu], + bugs: packageJson.bugs, description: packageJson.description, files: ["vendor", "README.md"], + homepage: packageJson.homepage, license: packageJson.license, name: CLI_PACKAGE_NAME, os: [platformPackage.os], @@ -663,8 +665,9 @@ function indexWorkspacePackageManifestPaths(workspacePackageManifests) { return workspacePackageManifestPathIndex; } -export const __internal = { +export const buildNpmPackageInternals = { INSTALL_BUNDLE_PACKAGES, + createReleasePlatformPackageManifest, indexWorkspacePackageManifestPaths, readCliPackageJson, restorePackagedExecutableModes, diff --git a/apps/cli/scripts/build-npm-package.test.ts b/apps/cli/scripts/build-npm-package.test.ts index 109d9957..1ab2e831 100644 --- a/apps/cli/scripts/build-npm-package.test.ts +++ b/apps/cli/scripts/build-npm-package.test.ts @@ -7,11 +7,14 @@ import { tmpdir } from "node:os"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import { __internal, tarballNameForPackage } from "./build-npm-package.js"; +import { + buildNpmPackageInternals, + tarballNameForPackage, +} from "./build-npm-package.js"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const WORKSPACE_ROOT = path.resolve(__dirname, "..", "..", ".."); +const testFilePath = fileURLToPath(import.meta.url); +const testDir = path.dirname(testFilePath); +const WORKSPACE_ROOT = path.resolve(testDir, "..", "..", ".."); const SERVER_PACKAGE_MANIFEST_PATH = path.join( WORKSPACE_ROOT, "packages", @@ -28,7 +31,9 @@ describe("build-npm-package runtime asset resolution", () => { it("anchors polyglotSql assets to the declared owner package manifest", async () => { const sourcePaths = - await __internal.resolveRuntimeAssetSourcePaths("polyglotSql"); + await buildNpmPackageInternals.resolveRuntimeAssetSourcePaths( + "polyglotSql" + ); const serverRequire = createRequire(SERVER_PACKAGE_MANIFEST_PATH); expect(sourcePaths).toEqual([ @@ -44,7 +49,7 @@ describe("build-npm-package runtime asset resolution", () => { it("fails clearly when a workspace package is missing", async () => { try { - await __internal.resolveWorkspacePackageRequire( + await buildNpmPackageInternals.resolveWorkspacePackageRequire( "@onequery/not-a-package" ); throw new Error("expected missing workspace package lookup to fail"); @@ -61,7 +66,7 @@ describe("build-npm-package runtime asset resolution", () => { it("rejects duplicate workspace package names when indexing manifests", () => { expect(() => - __internal.indexWorkspacePackageManifestPaths([ + buildNpmPackageInternals.indexWorkspacePackageManifestPaths([ { name: "@onequery/server", packageJsonPath: "/tmp/workspace-a/package.json", @@ -95,7 +100,7 @@ describe("build-npm-package runtime asset resolution", () => { }) ); - await __internal.restorePackagedExecutableModes({ + await buildNpmPackageInternals.restorePackagedExecutableModes({ targetRoot, targetTriple: "x86_64-unknown-linux-musl", }); diff --git a/apps/cli/scripts/build-server-bundle.js b/apps/cli/scripts/build-server-bundle.js index 1467abd8..7945eb03 100644 --- a/apps/cli/scripts/build-server-bundle.js +++ b/apps/cli/scripts/build-server-bundle.js @@ -9,11 +9,11 @@ import { build } from "rolldown"; import { serverBundleFilenameForTargetTriple } from "../bin/package-constants.js"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +const scriptFilePath = fileURLToPath(import.meta.url); +const scriptDir = path.dirname(scriptFilePath); const require = createRequire(import.meta.url); -const CLI_ROOT = path.resolve(__dirname, ".."); +const CLI_ROOT = path.resolve(scriptDir, ".."); const WORKSPACE_ROOT = path.resolve(CLI_ROOT, "..", ".."); // Comment: resolve the packaged server entry through the runtime package's // declared export surface so CLI packaging does not depend on package-private diff --git a/apps/cli/scripts/self-host-runtime.js b/apps/cli/scripts/self-host-runtime.js index d8f4d156..d3967bee 100644 --- a/apps/cli/scripts/self-host-runtime.js +++ b/apps/cli/scripts/self-host-runtime.js @@ -19,10 +19,10 @@ import { } from "../bin/package-constants.js"; import { stagePackagedRuntime } from "./build-npm-package.js"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +const scriptFilePath = fileURLToPath(import.meta.url); +const scriptDir = dirname(scriptFilePath); -export const cliRootDir = resolve(__dirname, ".."); +export const cliRootDir = resolve(scriptDir, ".."); const workspaceRootDir = resolve(cliRootDir, "..", ".."); const cliManifestPath = join(cliRootDir, "Cargo.toml"); const cliBinaryName = binaryNameForPlatform(process.platform, "onequery"); diff --git a/apps/landing/src/features/home/components/ControlPlaneDiagram.astro b/apps/landing/src/features/home/components/ControlPlaneDiagram.astro index cfa63881..8ec94880 100644 --- a/apps/landing/src/features/home/components/ControlPlaneDiagram.astro +++ b/apps/landing/src/features/home/components/ControlPlaneDiagram.astro @@ -215,3 +215,417 @@ const controlPlanePolicies = [ } + + diff --git a/apps/landing/src/features/home/components/DownloadCommand.astro b/apps/landing/src/features/home/components/DownloadCommand.astro index c927cdb0..61a47a60 100644 --- a/apps/landing/src/features/home/components/DownloadCommand.astro +++ b/apps/landing/src/features/home/components/DownloadCommand.astro @@ -88,6 +88,228 @@ function getInstallTabId(index: number) { + + diff --git a/apps/landing/src/shared/components/FooterContactButton.test.ts b/apps/landing/src/shared/components/FooterContactButton.test.ts deleted file mode 100644 index 7d662a82..00000000 --- a/apps/landing/src/shared/components/FooterContactButton.test.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { readFileSync } from "node:fs"; -import vm from "node:vm"; - -import { describe, expect, it, vi } from "vitest"; - -type Listener = (event: Record) => unknown; - -class FakeClassList { - private readonly classNames = new Set(); - - add(...classNames: string[]) { - for (const className of classNames) { - this.classNames.add(className); - } - } - - contains(className: string) { - return this.classNames.has(className); - } - - remove(...classNames: string[]) { - for (const className of classNames) { - this.classNames.delete(className); - } - } -} - -class FakeHTMLElement { - readonly attributes = new Map(); - readonly classList = new FakeClassList(); - disabled = false; - hidden = false; - readonly listeners = new Map(); - readonly style: Record = {}; - textContent = ""; - - addEventListener(type: string, listener: Listener) { - const listeners = this.listeners.get(type) ?? []; - listeners.push(listener); - this.listeners.set(type, listeners); - } - - dispatch(type: string, event: Record = {}) { - return Promise.all( - (this.listeners.get(type) ?? []).map((listener) => listener(event)) - ); - } - - focus() { - fakeDocument.activeElement = this; - } - - setAttribute(name: string, value: string) { - this.attributes.set(name, value); - } -} - -class FakeHTMLButtonElement extends FakeHTMLElement {} - -class FakeHTMLFormElement extends FakeHTMLElement { - action = "https://onequery.test/api/contact/"; - readonly elements = { - namedItem: (name: string) => - name === "name" ? fakeElements.nameField : null, - }; - readonly reportValidity = vi.fn(() => true); - readonly reset = vi.fn(); - - querySelector(selector: string) { - return selector === ".contact-modal-submit" - ? fakeElements.submitButton - : null; - } - - querySelectorAll(selector: string) { - return selector === ".t-input" ? fakeElements.fields : []; - } -} - -const fakeElements = { - backdrop: new FakeHTMLElement(), - closeButton: new FakeHTMLButtonElement(), - errorMessage: new FakeHTMLElement(), - fields: [] as FakeHTMLElement[], - form: new FakeHTMLFormElement(), - modal: new FakeHTMLElement(), - nameField: new FakeHTMLElement(), - openButton: new FakeHTMLButtonElement(), - submitButton: new FakeHTMLButtonElement(), -}; - -const fakeDocument = { - activeElement: null as FakeHTMLElement | null, - body: { - style: {} as Record, - }, - documentElement: new FakeHTMLElement(), - querySelector(selector: string) { - switch (selector) { - case "[data-contact-open]": - return fakeElements.openButton; - case "[data-contact-backdrop]": - return fakeElements.backdrop; - case "[data-contact-modal]": - return fakeElements.modal; - case "[data-contact-form]": - return fakeElements.form; - case "[data-contact-close]": - return fakeElements.closeButton; - case "[data-contact-error]": - return fakeElements.errorMessage; - default: - return null; - } - }, -}; - -function readInlineScript() { - const source = readFileSync( - new URL("./FooterContactButton.astro", import.meta.url), - "utf8" - ); - const script = / diff --git a/apps/landing/src/shared/components/footer-contact/contact-modal.ts b/apps/landing/src/shared/components/footer-contact/contact-modal.ts new file mode 100644 index 00000000..5c277994 --- /dev/null +++ b/apps/landing/src/shared/components/footer-contact/contact-modal.ts @@ -0,0 +1,302 @@ +import { + trackContactFormSubmitted, + trackContactModalOpened, +} from "@/shared/analytics/events"; + +export type ContactSubmissionResult = + | { + ok: true; + } + | { + message: string; + ok: false; + }; + +type FooterContactModalOptions = { + submit: (formData: FormData) => Promise; +}; + +type ContactElements = { + backdrop: HTMLElement; + closeButton: HTMLButtonElement; + errorMessage: HTMLElement; + fields: Array; + form: HTMLFormElement; + modal: HTMLElement; + openButton: HTMLButtonElement; + submitButton: HTMLButtonElement | null; +}; + +function readRootCssTimeMs(name: string, fallback: number) { + const rawValue = getComputedStyle(document.documentElement) + .getPropertyValue(name) + .trim(); + const value = parseFloat(rawValue); + + if (!Number.isFinite(value)) { + return fallback; + } + + return rawValue.endsWith("ms") ? value : value * 1000; +} + +function readContactElements(): ContactElements | null { + const openButton = document.querySelector("[data-contact-open]"); + const backdrop = document.querySelector("[data-contact-backdrop]"); + const modal = document.querySelector("[data-contact-modal]"); + const form = document.querySelector("[data-contact-form]"); + const closeButton = document.querySelector("[data-contact-close]"); + const errorMessage = document.querySelector("[data-contact-error]"); + + if ( + !(openButton instanceof HTMLButtonElement) || + !(backdrop instanceof HTMLElement) || + !(modal instanceof HTMLElement) || + !(form instanceof HTMLFormElement) || + !(closeButton instanceof HTMLButtonElement) || + !(errorMessage instanceof HTMLElement) + ) { + return null; + } + + return { + backdrop, + closeButton, + errorMessage, + fields: Array.from( + form.querySelectorAll(".t-input") + ), + form, + modal, + openButton, + submitButton: form.querySelector( + ".contact-modal-submit" + ), + }; +} + +export function installFooterContactModal({ + submit, +}: FooterContactModalOptions) { + const elements = readContactElements(); + + if (!elements) { + return; + } + + const { + backdrop, + closeButton, + errorMessage, + fields, + form, + modal, + openButton, + submitButton, + } = elements; + let closeTimer = 0; + let focusedBeforeOpen: Element | null = null; + let previousBodyOverflow = ""; + let shakeTimer = 0; + let revertTimer = 0; + let pendingSubmissionController: AbortController | null = null; + let submissionId = 0; + + function clearError() { + window.clearTimeout(shakeTimer); + window.clearTimeout(revertTimer); + shakeTimer = 0; + revertTimer = 0; + form.classList.remove("is-error"); + + for (const field of fields) { + field.classList.remove("is-error", "is-shaking"); + } + } + + function showError(message: string) { + clearError(); + errorMessage.textContent = message; + form.classList.add("is-error"); + + for (const field of fields) { + field.classList.add("is-error"); + field.classList.remove("is-shaking"); + } + + void form.offsetWidth; + + for (const field of fields) { + field.classList.add("is-shaking"); + } + + const shakeMs = + readRootCssTimeMs("--shake-dur-a", 80) * 2 + + readRootCssTimeMs("--shake-dur-b", 60) * 2; + + shakeTimer = window.setTimeout(() => { + for (const field of fields) { + field.classList.remove("is-shaking"); + } + shakeTimer = 0; + }, shakeMs + 20); + + revertTimer = window.setTimeout( + clearError, + shakeMs + readRootCssTimeMs("--revert-hold", 3000) + ); + } + + function setPending(isPending: boolean) { + for (const field of fields) { + field.disabled = isPending; + } + + if (submitButton) { + submitButton.disabled = isPending; + submitButton.textContent = isPending ? "Sending..." : "Send message"; + } + } + + function isCurrentSubmission( + controller: AbortController, + currentSubmissionId: number + ) { + return ( + pendingSubmissionController === controller && + submissionId === currentSubmissionId + ); + } + + function cancelPendingSubmission() { + if (pendingSubmissionController) { + pendingSubmissionController.abort(); + pendingSubmissionController = null; + } + + submissionId += 1; + setPending(false); + } + + function closeModal() { + window.clearTimeout(closeTimer); + cancelPendingSubmission(); + clearError(); + backdrop.classList.remove("is-open"); + backdrop.classList.add("is-closing"); + modal.classList.remove("is-open"); + modal.classList.add("is-closing"); + openButton.setAttribute("aria-expanded", "false"); + + closeTimer = window.setTimeout( + () => { + backdrop.hidden = true; + backdrop.classList.remove("is-closing"); + modal.classList.remove("is-closing"); + document.body.style.overflow = previousBodyOverflow; + clearError(); + + if (focusedBeforeOpen instanceof HTMLElement) { + focusedBeforeOpen.focus(); + } + }, + readRootCssTimeMs("--modal-close-dur", 150) + ); + } + + function openModal() { + window.clearTimeout(closeTimer); + clearError(); + focusedBeforeOpen = document.activeElement; + previousBodyOverflow = document.body.style.overflow; + document.body.style.overflow = "hidden"; + backdrop.hidden = false; + backdrop.classList.remove("is-closing"); + modal.classList.remove("is-closing"); + openButton.setAttribute("aria-expanded", "true"); + trackContactModalOpened(); + + window.requestAnimationFrame(() => { + backdrop.classList.add("is-open"); + modal.classList.add("is-open"); + const nameField = form.elements.namedItem("name"); + if (nameField instanceof HTMLElement) { + nameField.focus(); + } + }); + } + + async function submitContactForm(event: SubmitEvent) { + event.preventDefault(); + + if (pendingSubmissionController) { + return; + } + + if (!form.reportValidity()) { + showError("Please fill out the required fields"); + return; + } + + const formData = new FormData(form); + const controller = new AbortController(); + const currentSubmissionId = submissionId + 1; + + pendingSubmissionController = controller; + submissionId = currentSubmissionId; + clearError(); + setPending(true); + + try { + const result = await submit(formData); + + if (!isCurrentSubmission(controller, currentSubmissionId)) { + return; + } + + if (!result.ok) { + showError(result.message); + return; + } + + trackContactFormSubmitted(); + form.reset(); + closeModal(); + } catch { + if ( + !isCurrentSubmission(controller, currentSubmissionId) || + controller.signal.aborted + ) { + return; + } + + showError("Failed to send message"); + } finally { + if (isCurrentSubmission(controller, currentSubmissionId)) { + pendingSubmissionController = null; + setPending(false); + } + } + } + + openButton.addEventListener("click", openModal); + closeButton.addEventListener("click", closeModal); + backdrop.addEventListener("mousedown", closeModal); + modal.addEventListener("mousedown", (event) => { + event.stopPropagation(); + }); + form.addEventListener("submit", submitContactForm); + form.addEventListener("input", clearError); + form.addEventListener( + "invalid", + () => { + showError("Please fill out the required fields"); + }, + true + ); + window.addEventListener("keydown", (event) => { + if (event.key === "Escape" && !backdrop.hidden) { + closeModal(); + } + }); +} From edbd83cc5616395c9884559d4bbb3b6f92da9e9a Mon Sep 17 00:00:00 2001 From: lentil32 Date: Tue, 2 Jun 2026 17:39:55 +0900 Subject: [PATCH 09/13] feat(landing): run Slack emulator in local dev --- apps/landing/astro.config.ts | 1 + apps/landing/docs/local-slack-emulator.md | 37 +++ apps/landing/package.json | 6 +- apps/landing/scripts/dev-with-slack.ts | 253 ++++++++++++++++++ apps/landing/src/server/app.test.ts | 98 +++---- apps/landing/src/server/notifications.test.ts | 80 +++--- .../landing/src/server/test/slack-emulator.ts | 94 +++++++ apps/landing/tsconfig.json | 1 + bun.lock | 7 +- package.json | 2 +- turbo.json | 6 + 11 files changed, 477 insertions(+), 108 deletions(-) create mode 100644 apps/landing/docs/local-slack-emulator.md create mode 100644 apps/landing/scripts/dev-with-slack.ts create mode 100644 apps/landing/src/server/test/slack-emulator.ts diff --git a/apps/landing/astro.config.ts b/apps/landing/astro.config.ts index 53a75724..8f18ec73 100644 --- a/apps/landing/astro.config.ts +++ b/apps/landing/astro.config.ts @@ -195,6 +195,7 @@ export default defineConfig({ trailingSlash: "always", vite: { optimizeDeps: { + include: ["better-result"], exclude: ["@nanostores/react"], }, plugins: [ diff --git a/apps/landing/docs/local-slack-emulator.md b/apps/landing/docs/local-slack-emulator.md new file mode 100644 index 00000000..36cea980 --- /dev/null +++ b/apps/landing/docs/local-slack-emulator.md @@ -0,0 +1,37 @@ +# Local Slack Emulator + +The landing app sends lead-capture notifications through +`LANDING_SLACK_WEBHOOK_URL`. `bun run dev` starts the Slack emulator when that +environment variable is unset, then injects the emulator webhook URL into Astro. + +Start local development with: + +```bash +rtk bun run dev +``` + +Submit the product updates form or the contact form in the local landing page, +then inspect the stored Slack messages at: + +```text +http://localhost:4003/ +``` + +The default emulator webhook posts to the emulator's `general` channel: + +```text +http://localhost:4003/services/T000000001/B000000001/X000000001 +``` + +If `LANDING_SLACK_WEBHOOK_URL` is already configured, `bun run dev` uses that +value and does not start the emulator. To keep the old null-sink behavior, run: + +```bash +rtk env LANDING_SLACK_EMULATOR=0 bun run dev +``` + +You can still run only the emulator with: + +```bash +rtk bun run slack:emulate +``` diff --git a/apps/landing/package.json b/apps/landing/package.json index 7dd92e90..f93a3d1f 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -4,14 +4,15 @@ "private": false, "type": "module", "scripts": { - "dev": "bun run cf-typegen && astro dev", - "start": "bun run cf-typegen && astro dev", + "dev": "bun run cf-typegen && node scripts/dev-with-slack.ts", + "start": "bun run dev", "build": "bun run cf-typegen && astro check && astro build", "preview": "bun run cf-typegen && astro preview", "workspace:dev": "bun run dev", "bundle:analyze": "ONEQUERY_BUNDLE_REPORT=1 astro build", "bundle:analyze:json": "ONEQUERY_BUNDLE_REPORT=1 ONEQUERY_BUNDLE_REPORT_TEMPLATE=raw-data astro build", "bundle:analyze:list": "ONEQUERY_BUNDLE_REPORT=1 ONEQUERY_BUNDLE_REPORT_TEMPLATE=list astro build", + "slack:emulate": "emulate start --service slack --port 4003", "deploy": "bun run --cwd ../.. landing:build && bunx wrangler deploy", "deploy:preview": "bun run --cwd ../.. landing:build && bunx wrangler versions upload", "cf-typegen": "bunx wrangler types worker-configuration.d.ts --env-interface CloudflareEnv && oxfmt worker-configuration.d.ts", @@ -48,6 +49,7 @@ "@onequery/installer": "workspace:*", "@types/react": "catalog:", "@types/react-dom": "catalog:", + "emulate": "0.6.0", "rollup-plugin-visualizer": "catalog:tooling", "typescript": "catalog:tooling", "vitest": "catalog:testing", diff --git a/apps/landing/scripts/dev-with-slack.ts b/apps/landing/scripts/dev-with-slack.ts new file mode 100644 index 00000000..2955fd79 --- /dev/null +++ b/apps/landing/scripts/dev-with-slack.ts @@ -0,0 +1,253 @@ +import { dev } from "astro"; +import { createEmulator } from "emulate"; + +const DEFAULT_SLACK_EMULATOR_PORT = "4003"; +const SLACK_EMULATOR_WEBHOOK_PATH = + "/services/T000000001/B000000001/X000000001"; +const SLACK_EMULATOR_TOKEN = "xoxb-local-test"; + +type SlackDevEmulator = { + close: () => Promise; +}; + +type DevArgs = { + host?: boolean | string; + open?: boolean | string; + port?: number; +}; + +let shuttingDown = false; + +async function main() { + let server: Awaited> | undefined; + let slackEmulator: SlackDevEmulator | undefined; + + const configuredWebhookUrl = process.env.LANDING_SLACK_WEBHOOK_URL?.trim(); + const shouldStartSlackEmulator = + process.env.LANDING_SLACK_EMULATOR !== "0" && !configuredWebhookUrl; + const slackPort = + process.env.LANDING_SLACK_EMULATOR_PORT ?? DEFAULT_SLACK_EMULATOR_PORT; + const slackBaseUrl = readSlackBaseUrl(slackPort); + const slackWebhookUrl = + configuredWebhookUrl ?? + (shouldStartSlackEmulator + ? `${slackBaseUrl}${SLACK_EMULATOR_WEBHOOK_PATH}` + : undefined); + + try { + slackEmulator = shouldStartSlackEmulator + ? await ensureSlackEmulator({ + baseUrl: slackBaseUrl, + port: slackPort, + }) + : undefined; + + applyLandingSlackWebhookUrl(slackWebhookUrl); + logSlackDevState({ + configuredWebhookUrl, + slackBaseUrl, + slackWebhookUrl, + }); + + const shutdownSignal = createShutdownSignal(); + server = await dev({ + root: process.cwd(), + server: readDevServerConfig(process.argv.slice(2)), + }); + + await shutdownSignal; + } finally { + shuttingDown = true; + await server?.stop(); + await slackEmulator?.close(); + } +} + +async function ensureSlackEmulator(input: { + baseUrl: string; + port: string; +}): Promise { + if (await isSlackEmulatorReachable(input.baseUrl)) { + console.info(`[dev] Reusing Slack emulator at ${input.baseUrl}/`); + return undefined; + } + + const emulator = await createSlackEmulator(input.port); + + return { + close: () => emulator.close(), + }; +} + +async function createSlackEmulator(port: string) { + try { + return await createEmulator({ + port: readPortNumber(port), + service: "slack", + }); + } catch (cause) { + throw new Error( + `Failed to start Slack emulator on port ${port}. Set LANDING_SLACK_EMULATOR_PORT to use another port.`, + { cause } + ); + } +} + +function applyLandingSlackWebhookUrl(slackWebhookUrl: string | undefined) { + if (slackWebhookUrl) { + process.env.LANDING_SLACK_WEBHOOK_URL = slackWebhookUrl; + return; + } + + delete process.env.LANDING_SLACK_WEBHOOK_URL; +} + +function logSlackDevState(input: { + configuredWebhookUrl: string | undefined; + slackBaseUrl: string; + slackWebhookUrl: string | undefined; +}) { + if (input.configuredWebhookUrl) { + console.info("[dev] Using configured LANDING_SLACK_WEBHOOK_URL"); + return; + } + + if (input.slackWebhookUrl) { + console.info(`[dev] Slack emulator inspector: ${input.slackBaseUrl}/`); + console.info(`[dev] Slack webhook: ${input.slackWebhookUrl}`); + return; + } + + console.info("[dev] Slack emulator disabled; local requests use null sink"); +} + +function readDevServerConfig(args: string[]) { + const devArgs = readDevArgs(args); + + return { + ...(devArgs.host === undefined ? {} : { host: devArgs.host }), + ...(devArgs.open === undefined ? {} : { open: devArgs.open }), + ...(devArgs.port === undefined ? {} : { port: devArgs.port }), + }; +} + +function readDevArgs(args: string[]): DevArgs { + const devArgs: DevArgs = {}; + + for (let index = 0; index < args.length; index++) { + const arg = args[index]; + if (arg === "--host") { + const next = args[index + 1]; + if (next && !next.startsWith("-")) { + devArgs.host = next; + index++; + } else { + devArgs.host = true; + } + continue; + } + + if (arg?.startsWith("--host=")) { + devArgs.host = arg.slice("--host=".length); + continue; + } + + if (arg === "--open") { + const next = args[index + 1]; + if (next && !next.startsWith("-")) { + devArgs.open = next; + index++; + } else { + devArgs.open = true; + } + continue; + } + + if (arg?.startsWith("--open=")) { + devArgs.open = arg.slice("--open=".length); + continue; + } + + if (arg === "--port" || arg === "-p") { + devArgs.port = readPortArg(args[index + 1], arg); + index++; + continue; + } + + if (arg?.startsWith("--port=")) { + devArgs.port = readPortArg(arg.slice("--port=".length), "--port"); + continue; + } + + if (arg?.startsWith("-p") && arg.length > 2) { + devArgs.port = readPortArg(arg.slice(2), "-p"); + } + } + + return devArgs; +} + +function readPortArg(port: string | undefined, flag: string) { + if (!port) { + throw new Error(`Missing value for ${flag}`); + } + + return readPortNumber(port); +} + +async function isSlackEmulatorReachable(url: string) { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 500); + try { + const response = await fetch(`${url}/api/team.info`, { + body: "{}", + headers: { + Authorization: `Bearer ${SLACK_EMULATOR_TOKEN}`, + "Content-Type": "application/json", + }, + method: "POST", + signal: controller.signal, + }); + const body = (await response.json()) as { ok?: unknown }; + return response.ok && body.ok === true; + } catch { + return false; + } finally { + clearTimeout(timeout); + } +} + +function readSlackBaseUrl(port: string) { + return `http://localhost:${readPortNumber(port)}`; +} + +function readPortNumber(port: string) { + const value = Number.parseInt(port, 10); + if (!Number.isInteger(value) || value < 1 || value > 65_535) { + throw new Error(`Invalid port: ${port}`); + } + + return value; +} + +function createShutdownSignal(): Promise { + return new Promise((resolve) => { + function handleShutdown() { + if (shuttingDown) { + return; + } + + shuttingDown = true; + resolve(); + } + + for (const signal of ["SIGINT", "SIGTERM"] as const) { + process.once(signal, handleShutdown); + } + }); +} + +main().catch((error: unknown) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/apps/landing/src/server/app.test.ts b/apps/landing/src/server/app.test.ts index 9135b655..4875a2d9 100644 --- a/apps/landing/src/server/app.test.ts +++ b/apps/landing/src/server/app.test.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; +import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest"; import { handleContactRequest, handleProductUpdatesRequest } from "./api"; import type { @@ -9,72 +9,66 @@ import { createContactNotification, createProductUpdatesNotification, } from "./notifications"; +import { + createSlackEmulatorHarness, + SLACK_EMULATOR_BOT_ID, +} from "./test/slack-emulator"; +import type { SlackEmulatorHarness } from "./test/slack-emulator"; -const originalFetch = globalThis.fetch; -const WEBHOOK_URL = "https://example.com/hooks/landing"; +let slack: SlackEmulatorHarness; -function installFetchMock(fetchMock: typeof globalThis.fetch) { - globalThis.fetch = fetchMock; -} +beforeAll(async () => { + slack = await createSlackEmulatorHarness(); +}); afterEach(() => { - globalThis.fetch = originalFetch; - vi.restoreAllMocks(); + slack.reset(); +}); + +afterAll(async () => { + await slack.close(); }); describe("landing API handlers", () => { it("assigns a request id to successful API responses", async () => { - const fetchSpy = vi.fn(); - fetchSpy.mockResolvedValue(new Response(null, { status: 200 })); - installFetchMock(fetchSpy); - const response = await handleProductUpdatesRequest({ request: new Request("https://landing.onequery.dev/api/product-updates", { body: JSON.stringify({ email: "team@example.com" }), headers: { "content-type": "application/json" }, method: "POST", }), - slackWebhookUrl: WEBHOOK_URL, + slackWebhookUrl: slack.webhookUrl, }); expect(response.status).toBe(200); expect(response.headers.get("x-request-id")).toEqual(expect.any(String)); expect(response.headers.get("x-robots-tag")).toBe("noindex"); - expect(fetchSpy).toHaveBeenCalledTimes(1); + expect(await slack.readMessages()).toHaveLength(1); }); it("accepts product updates submissions with trimmed email input", async () => { - const fetchSpy = vi.fn(); - fetchSpy.mockResolvedValue(new Response(null, { status: 200 })); - installFetchMock(fetchSpy); - const response = await handleProductUpdatesRequest({ request: new Request("https://landing.onequery.dev/api/product-updates", { body: JSON.stringify({ email: " TEST@Example.COM " }), headers: { "content-type": "application/json" }, method: "POST", }), - slackWebhookUrl: WEBHOOK_URL, + slackWebhookUrl: slack.webhookUrl, }); expect(response.status).toBe(200); expect(await response.json()).toEqual({ email: "test@example.com", }); - expect(fetchSpy).toHaveBeenCalledWith(WEBHOOK_URL, { - body: JSON.stringify( - createProductUpdatesNotification("test@example.com") - ), - headers: { "Content-Type": "application/json" }, - method: "POST", + const [message] = await slack.readMessages(); + expect(message).toMatchObject({ + bot_id: SLACK_EMULATOR_BOT_ID, + blocks: createProductUpdatesNotification("test@example.com").blocks, + text: "New product updates signup: test@example.com", }); }); it("accepts product updates form submissions for the HTML fallback", async () => { - const fetchSpy = vi.fn(); - fetchSpy.mockResolvedValue(new Response(null, { status: 200 })); - installFetchMock(fetchSpy); - const response = await handleProductUpdatesRequest({ request: new Request("https://landing.onequery.dev/api/product-updates", { body: new URLSearchParams({ @@ -82,27 +76,21 @@ describe("landing API handlers", () => { }), method: "POST", }), - slackWebhookUrl: WEBHOOK_URL, + slackWebhookUrl: slack.webhookUrl, }); expect(response.status).toBe(200); expect(await response.json()).toEqual({ email: "form@example.com", }); - expect(fetchSpy).toHaveBeenCalledWith(WEBHOOK_URL, { - body: JSON.stringify( - createProductUpdatesNotification("form@example.com") - ), - headers: { "Content-Type": "application/json" }, - method: "POST", + const [message] = await slack.readMessages(); + expect(message).toMatchObject({ + blocks: createProductUpdatesNotification("form@example.com").blocks, + text: "New product updates signup: form@example.com", }); }); it("normalizes contact submissions before delivery", async () => { - const fetchSpy = vi.fn(); - fetchSpy.mockResolvedValue(new Response(null, { status: 200 })); - installFetchMock(fetchSpy); - const response = await handleContactRequest({ request: new Request("https://landing.onequery.dev/api/contact", { body: JSON.stringify({ @@ -113,28 +101,23 @@ describe("landing API handlers", () => { headers: { "content-type": "application/json" }, method: "POST", }), - slackWebhookUrl: WEBHOOK_URL, + slackWebhookUrl: slack.webhookUrl, }); expect(response.status).toBe(200); expect(await response.json()).toEqual({}); - expect(fetchSpy).toHaveBeenCalledWith(WEBHOOK_URL, { - body: JSON.stringify( - createContactNotification({ - email: "team@example.com", - message: "Need pricing details", - name: "Jane Doe", - }) - ), - headers: { "Content-Type": "application/json" }, - method: "POST", + const [message] = await slack.readMessages(); + expect(message).toMatchObject({ + blocks: createContactNotification({ + email: "team@example.com", + message: "Need pricing details", + name: "Jane Doe", + }).blocks, + text: "New contact request from Jane Doe (team@example.com)", }); }); it("rejects contact submissions that become empty after trimming", async () => { - const fetchSpy = vi.fn(); - installFetchMock(fetchSpy); - const response = await handleContactRequest({ request: new Request("https://landing.onequery.dev/api/contact", { body: JSON.stringify({ @@ -157,13 +140,10 @@ describe("landing API handlers", () => { }, message: "name is required", }); - expect(fetchSpy).not.toHaveBeenCalled(); + expect(await slack.readMessages()).toHaveLength(0); }); it("returns a typed 503 error response when delivery is unconfigured", async () => { - const fetchSpy = vi.fn(); - installFetchMock(fetchSpy); - const response = await handleProductUpdatesRequest({ request: new Request("https://landing.onequery.dev/api/product-updates", { body: JSON.stringify({ email: "team@example.com" }), @@ -178,6 +158,6 @@ describe("landing API handlers", () => { code: "service_unavailable", message: "Landing ingest is not configured", }); - expect(fetchSpy).not.toHaveBeenCalled(); + expect(await slack.readMessages()).toHaveLength(0); }); }); diff --git a/apps/landing/src/server/notifications.test.ts b/apps/landing/src/server/notifications.test.ts index 777fdf6b..7ecc6140 100644 --- a/apps/landing/src/server/notifications.test.ts +++ b/apps/landing/src/server/notifications.test.ts @@ -1,22 +1,31 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; - -import { deliverNotification } from "./notifications"; - -const originalFetch = globalThis.fetch; - -function installFetchMock(fetchMock: typeof globalThis.fetch) { - globalThis.fetch = fetchMock; -} +import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest"; + +import { + createProductUpdatesNotification, + deliverNotification, +} from "./notifications"; +import { + createSlackEmulatorHarness, + findAvailablePort, +} from "./test/slack-emulator"; +import type { SlackEmulatorHarness } from "./test/slack-emulator"; + +let slack: SlackEmulatorHarness; + +beforeAll(async () => { + slack = await createSlackEmulatorHarness(); +}); afterEach(() => { - globalThis.fetch = originalFetch; - vi.restoreAllMocks(); + slack.reset(); +}); + +afterAll(async () => { + await slack.close(); }); describe("deliverNotification", () => { it("accepts local loopback requests without a configured webhook", async () => { - const fetchSpy = vi.fn(); - installFetchMock(fetchSpy); const payload = { text: "New product updates signup: test@example.com", blocks: [], @@ -31,13 +40,10 @@ describe("deliverNotification", () => { }); expect(result.isOk()).toBe(true); - expect(fetchSpy).not.toHaveBeenCalled(); + expect(await slack.readMessages()).toHaveLength(0); }); it("stays unavailable outside local loopback when the webhook is missing", async () => { - const fetchSpy = vi.fn(); - installFetchMock(fetchSpy); - const result = await deliverNotification({ delivery: { kind: "unconfigured", @@ -53,44 +59,36 @@ describe("deliverNotification", () => { if (result.isErr()) { expect(result.error.message).toBe("Landing ingest is not configured"); } - expect(fetchSpy).not.toHaveBeenCalled(); + expect(await slack.readMessages()).toHaveLength(0); }); it("delivers to the configured webhook when present", async () => { - const fetchSpy = vi.fn(); - fetchSpy.mockResolvedValue(new Response(null, { status: 200 })); - installFetchMock(fetchSpy); - const payload = { - text: "New product updates signup: test@example.com", - blocks: [], - }; + const payload = createProductUpdatesNotification("test@example.com"); const result = await deliverNotification({ delivery: { kind: "slack-webhook", - webhookUrl: "https://example.com/hooks/landing", + webhookUrl: slack.webhookUrl, }, notificationType: "product_updates", payload, }); expect(result.isOk()).toBe(true); - expect(fetchSpy).toHaveBeenCalledWith("https://example.com/hooks/landing", { - body: JSON.stringify(payload), - headers: { "Content-Type": "application/json" }, - method: "POST", + const [message] = await slack.readMessages(); + expect(message).toMatchObject({ + blocks: payload.blocks, + text: payload.text, }); }); it("returns request failures as request errors", async () => { - const fetchSpy = vi.fn(); - fetchSpy.mockRejectedValue(new Error("boom")); - installFetchMock(fetchSpy); + const port = await findAvailablePort(); const result = await deliverNotification({ delivery: { kind: "slack-webhook", - webhookUrl: "https://example.com/hooks/landing", + webhookUrl: `http://127.0.0.1:${port}/hooks/landing`, }, notificationType: "product_updates", payload: { @@ -101,27 +99,21 @@ describe("deliverNotification", () => { expect(result.isErr()).toBe(true); if (result.isErr()) { - expect(result.error.message).toBe( - "Failed to send landing notification: boom" + expect(result.error.message).toMatch( + /^Failed to send landing notification:/ ); } }); it("returns webhook rejections as response errors", async () => { - const fetchSpy = vi.fn(); - fetchSpy.mockResolvedValue( - new Response("invalid payload", { status: 400 }) - ); - installFetchMock(fetchSpy); - const result = await deliverNotification({ delivery: { kind: "slack-webhook", - webhookUrl: "https://example.com/hooks/landing", + webhookUrl: slack.webhookUrl, }, notificationType: "contact", payload: { - text: "New contact request from Jane Doe (team@example.com)", + text: "", blocks: [], }, }); diff --git a/apps/landing/src/server/test/slack-emulator.ts b/apps/landing/src/server/test/slack-emulator.ts new file mode 100644 index 00000000..8e96e55b --- /dev/null +++ b/apps/landing/src/server/test/slack-emulator.ts @@ -0,0 +1,94 @@ +import { createServer } from "node:net"; + +import { createEmulator } from "emulate"; +import type { Emulator } from "emulate"; + +export const SLACK_EMULATOR_BOT_ID = "B000000001"; +export const SLACK_EMULATOR_GENERAL_CHANNEL_ID = "C000000001"; +export const SLACK_EMULATOR_TOKEN = "xoxb-local-test"; + +const SLACK_EMULATOR_WEBHOOK_PATH = + "/services/T000000001/B000000001/X000000001"; + +export type SlackEmulatorMessage = { + blocks?: unknown; + bot_id?: string; + subtype?: string; + text: string; + ts: string; + type: "message"; + user: string; +}; + +type SlackHistoryResponse = + | { + has_more: boolean; + messages: SlackEmulatorMessage[]; + ok: true; + response_metadata: { next_cursor: string }; + } + | { + error: string; + ok: false; + }; + +export type SlackEmulatorHarness = { + close: () => Promise; + readMessages: () => Promise; + reset: () => void; + url: string; + webhookUrl: string; +}; + +export async function createSlackEmulatorHarness(): Promise { + const emulator = await createEmulator({ + port: await findAvailablePort(), + service: "slack", + }); + + return { + close: () => emulator.close(), + readMessages: () => readSlackMessages(emulator), + reset: () => emulator.reset(), + url: emulator.url, + webhookUrl: `${emulator.url}${SLACK_EMULATOR_WEBHOOK_PATH}`, + }; +} + +async function readSlackMessages(emulator: Emulator) { + const response = await fetch(`${emulator.url}/api/conversations.history`, { + body: JSON.stringify({ + channel: SLACK_EMULATOR_GENERAL_CHANNEL_ID, + limit: 100, + }), + headers: { + Authorization: `Bearer ${SLACK_EMULATOR_TOKEN}`, + "Content-Type": "application/json", + }, + method: "POST", + }); + const body = (await response.json()) as SlackHistoryResponse; + if (!body.ok) { + throw new Error(`Failed to read Slack emulator history: ${body.error}`); + } + + return body.messages; +} + +export async function findAvailablePort(): Promise { + return new Promise((resolve, reject) => { + const server = createServer(); + server.once("error", reject); + server.listen(0, "127.0.0.1", () => { + const address = server.address(); + if (typeof address !== "object" || address === null) { + server.close(); + reject(new Error("Failed to allocate a local emulator port")); + return; + } + + const { port } = address; + server.close(() => resolve(port)); + }); + }); +} diff --git a/apps/landing/tsconfig.json b/apps/landing/tsconfig.json index a29569d7..b1931444 100644 --- a/apps/landing/tsconfig.json +++ b/apps/landing/tsconfig.json @@ -8,6 +8,7 @@ "include": [ ".astro/types.d.ts", "src", + "scripts", "astro.config.ts", "vitest.config.ts", "worker-configuration.d.ts" diff --git a/bun.lock b/bun.lock index e07b0f85..698e2809 100644 --- a/bun.lock +++ b/bun.lock @@ -145,6 +145,7 @@ "@onequery/installer": "workspace:*", "@types/react": "catalog:", "@types/react-dom": "catalog:", + "emulate": "0.6.0", "rollup-plugin-visualizer": "catalog:tooling", "typescript": "catalog:tooling", "vitest": "catalog:testing", @@ -477,7 +478,7 @@ "antiox": "0.1.4", "astro": "6.3.7", "better-auth": "1.5.5", - "better-result": "2.9.0", + "better-result": "2.9.2", "hono": "4.12.16", "hono-problem-details": "0.6.1", "hono-rate-limiter": "0.5.3", @@ -2398,7 +2399,7 @@ "better-call": ["better-call@1.3.2", "", { "dependencies": { "@better-auth/utils": "^0.3.1", "@better-fetch/fetch": "^1.1.21", "rou3": "^0.7.12", "set-cookie-parser": "^3.0.1" }, "peerDependencies": { "zod": "^4.0.0" }, "optionalPeers": ["zod"] }, "sha512-4cZIfrerDsNTn3cm+MhLbUePN0gdwkhSXEuG7r/zuQ8c/H7iU0/jSK5TD3FW7U0MgKHce/8jGpPYNO4Ve+4NBw=="], - "better-result": ["better-result@2.9.0", "", {}, "sha512-NHwGDGVbRlWDOce3CwcfGIrcNR9zY37ut3SVwQVfv57DZdVhxjhA4mfaHN1n8QwWnRAR4iErpW1X/eaiaUaFYg=="], + "better-result": ["better-result@2.9.2", "", {}, "sha512-WIFoBPCdnTOdk9inkE1ZRvCZ4P0CpSkAiLlchC65N7n9DcjZ3NhqkBOlafzpOVnO8ixyi37kicmSJ3ENhPZl7Q=="], "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], @@ -2688,6 +2689,8 @@ "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], + "emulate": ["emulate@0.6.0", "", { "dependencies": { "commander": "^14", "picocolors": "^1.1.1", "yaml": "^2" }, "bin": { "emulate": "dist/index.js" } }, "sha512-UcuKgskLUCD4TnqMw/EHJRUw8y3E11ks4lzx5MkAq0jJbfl3031aFgJeR3AArl4xB0aABC9Q9RZw00srZbcHgw=="], + "enabled": ["enabled@2.0.0", "", {}, "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="], "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], diff --git a/package.json b/package.json index cd490d71..7ba72f26 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "antiox": "0.1.4", "astro": "6.3.7", "better-auth": "1.5.5", - "better-result": "2.9.0", + "better-result": "2.9.2", "hono": "4.12.16", "hono-problem-details": "0.6.1", "hono-rate-limiter": "0.5.3", diff --git a/turbo.json b/turbo.json index 187826ba..5619e442 100644 --- a/turbo.json +++ b/turbo.json @@ -23,6 +23,9 @@ "CONNECTOR_ABORT_ON_AUTH_FAILURE", "CONNECTOR_ABORT_ON_PREREQ_FAILURE", "DATABASE_URL", + "LANDING_SLACK_EMULATOR", + "LANDING_SLACK_EMULATOR_PORT", + "LANDING_SLACK_WEBHOOK_URL", "ONEQUERY_RUNTIME_ROOT" ] }, @@ -33,6 +36,9 @@ "CONNECTOR_ABORT_ON_AUTH_FAILURE", "CONNECTOR_ABORT_ON_PREREQ_FAILURE", "DATABASE_URL", + "LANDING_SLACK_EMULATOR", + "LANDING_SLACK_EMULATOR_PORT", + "LANDING_SLACK_WEBHOOK_URL", "ONEQUERY_RUNTIME_ROOT" ] }, From 7f0b022b11482f9efc46e9cb95707a23df1491e7 Mon Sep 17 00:00:00 2001 From: lentil32 Date: Tue, 2 Jun 2026 18:36:45 +0900 Subject: [PATCH 10/13] refactor(landing): use Astro actions for Slack leads --- .gitignore | 1 + apps/landing/astro.config.ts | 1 - apps/landing/package.json | 6 +- apps/landing/scripts/dev-with-slack.ts | 195 +++++++--- apps/landing/src/actions/index.ts | 134 +++++-- .../components/ProductUpdatesSection.astro | 6 +- apps/landing/src/index.test.ts | 30 +- apps/landing/src/pages/api/contact.ts | 12 - apps/landing/src/pages/api/product-updates.ts | 12 - apps/landing/src/server/api-catalog.ts | 16 - apps/landing/src/server/api.ts | 356 ------------------ apps/landing/src/server/app.test.ts | 163 -------- apps/landing/src/server/notifications.test.ts | 99 ++--- apps/landing/src/server/notifications.ts | 186 +++------ apps/landing/src/server/schemas.ts | 16 - .../footer-contact/FooterContactButton.astro | 6 +- bun.lock | 10 +- 17 files changed, 355 insertions(+), 894 deletions(-) delete mode 100644 apps/landing/src/pages/api/contact.ts delete mode 100644 apps/landing/src/pages/api/product-updates.ts delete mode 100644 apps/landing/src/server/api.ts delete mode 100644 apps/landing/src/server/app.test.ts delete mode 100644 apps/landing/src/server/schemas.ts diff --git a/.gitignore b/.gitignore index d8c07774..53ad46b7 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ __pycache__/ .dev.vars* .reports +.emulate/ .claude/settings.local.json .claude/worktrees AGENTS.override.md diff --git a/apps/landing/astro.config.ts b/apps/landing/astro.config.ts index 8f18ec73..53a75724 100644 --- a/apps/landing/astro.config.ts +++ b/apps/landing/astro.config.ts @@ -195,7 +195,6 @@ export default defineConfig({ trailingSlash: "always", vite: { optimizeDeps: { - include: ["better-result"], exclude: ["@nanostores/react"], }, plugins: [ diff --git a/apps/landing/package.json b/apps/landing/package.json index f93a3d1f..6cb21d3d 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -34,18 +34,18 @@ "@onequery/db": "workspace:*", "@onequery/ui": "workspace:*", "astro": "catalog:", - "better-result": "catalog:", "mdast-util-to-string": "4.0.0", "nanostores": "catalog:", "react": "catalog:", "react-dom": "catalog:", "reading-time": "1.5.0", - "simple-icons": "catalog:", - "zod": "catalog:" + "simple-icons": "catalog:" }, "devDependencies": { "@astrojs/check": "catalog:tooling", "@cloudflare/workers-types": "catalog:tooling", + "@emulators/core": "0.6.0", + "@emulators/slack": "0.6.0", "@onequery/installer": "workspace:*", "@types/react": "catalog:", "@types/react-dom": "catalog:", diff --git a/apps/landing/scripts/dev-with-slack.ts b/apps/landing/scripts/dev-with-slack.ts index 2955fd79..7a3d0036 100644 --- a/apps/landing/scripts/dev-with-slack.ts +++ b/apps/landing/scripts/dev-with-slack.ts @@ -1,10 +1,19 @@ +import { + createServer as createEmulatorServer, + filePersistence, + serve, +} from "@emulators/core"; +import type { StoreSnapshot } from "@emulators/core"; +import { getSlackStore, slackPlugin } from "@emulators/slack"; +import type { SlackMessage } from "@emulators/slack"; import { dev } from "astro"; -import { createEmulator } from "emulate"; const DEFAULT_SLACK_EMULATOR_PORT = "4003"; +const DEFAULT_SLACK_EMULATOR_STATE_PATH = ".emulate/landing-slack.json"; const SLACK_EMULATOR_WEBHOOK_PATH = "/services/T000000001/B000000001/X000000001"; const SLACK_EMULATOR_TOKEN = "xoxb-local-test"; +const MUTATING_METHODS = new Set(["DELETE", "PATCH", "POST", "PUT"]); type SlackDevEmulator = { close: () => Promise; @@ -36,10 +45,7 @@ async function main() { try { slackEmulator = shouldStartSlackEmulator - ? await ensureSlackEmulator({ - baseUrl: slackBaseUrl, - port: slackPort, - }) + ? await createSlackEmulator(slackPort) : undefined; applyLandingSlackWebhookUrl(slackWebhookUrl); @@ -63,27 +69,12 @@ async function main() { } } -async function ensureSlackEmulator(input: { - baseUrl: string; - port: string; -}): Promise { - if (await isSlackEmulatorReachable(input.baseUrl)) { - console.info(`[dev] Reusing Slack emulator at ${input.baseUrl}/`); - return undefined; - } - - const emulator = await createSlackEmulator(input.port); - - return { - close: () => emulator.close(), - }; -} - async function createSlackEmulator(port: string) { try { - return await createEmulator({ + return await createPersistentSlackEmulator({ + baseUrl: readSlackBaseUrl(port), port: readPortNumber(port), - service: "slack", + statePath: DEFAULT_SLACK_EMULATOR_STATE_PATH, }); } catch (cause) { throw new Error( @@ -121,6 +112,142 @@ function logSlackDevState(input: { console.info("[dev] Slack emulator disabled; local requests use null sink"); } +async function createPersistentSlackEmulator(input: { + baseUrl: string; + port: number; + statePath: string; +}): Promise { + const persistence = filePersistence(input.statePath); + const { app, store } = createEmulatorServer(slackPlugin, { + baseUrl: input.baseUrl, + fallbackUser: { + id: 1, + login: "U000000001", + scopes: [], + }, + port: input.port, + tokens: { + [SLACK_EMULATOR_TOKEN]: { + id: 1, + login: "U000000001", + scopes: [], + }, + test_token_admin: { + id: 1, + login: "U000000001", + scopes: [], + }, + }, + }); + + const restored = await restoreSlackState({ + persistence, + statePath: input.statePath, + store, + }); + if (!restored) { + slackPlugin.seed?.(store, input.baseUrl); + await persistence.save(JSON.stringify(store.snapshot())); + } + + const seenMessageTimestamps = new Set( + readSlackMessages(store).map((message) => message.ts) + ); + let pendingSave = Promise.resolve(); + + function enqueueSave() { + pendingSave = pendingSave + .catch(() => undefined) + .then(() => persistence.save(JSON.stringify(store.snapshot()))) + .catch((error: unknown) => { + console.warn( + `[dev] Failed to persist Slack emulator state: ${toErrorMessage( + error + )}` + ); + }); + } + + function logNewMessages() { + for (const message of readSlackMessages(store)) { + if (seenMessageTimestamps.has(message.ts)) { + continue; + } + + seenMessageTimestamps.add(message.ts); + console.info(`[dev] Slack message received: ${message.text}`); + } + } + + const httpServer = serve({ + fetch: async (request) => { + const response = await app.fetch(request); + + if (MUTATING_METHODS.has(request.method)) { + logNewMessages(); + enqueueSave(); + } + + return response; + }, + port: input.port, + }); + + console.info(`[dev] Slack emulator state: ${input.statePath}`); + + return { + async close() { + await pendingSave; + await new Promise((resolve, reject) => { + httpServer.close((error) => { + if (error) { + reject(error); + return; + } + + resolve(); + }); + }); + }, + }; +} + +async function restoreSlackState(input: { + persistence: ReturnType; + statePath: string; + store: { + restore: (snapshot: StoreSnapshot) => void; + }; +}) { + const raw = await input.persistence.load(); + if (!raw) { + return false; + } + + try { + input.store.restore(JSON.parse(raw) as StoreSnapshot); + return true; + } catch (error) { + console.warn( + `[dev] Ignoring unreadable Slack emulator state at ${ + input.statePath + }: ${toErrorMessage(error)}` + ); + return false; + } +} + +function readSlackMessages(store: Parameters[0]) { + return getSlackStore(store) + .messages.all() + .filter((message): message is SlackMessage => message.type === "message") + .sort((left, right) => left.ts.localeCompare(right.ts)); +} + +function toErrorMessage(error: unknown) { + return error instanceof Error ? error.message : String(error); +} + function readDevServerConfig(args: string[]) { const devArgs = readDevArgs(args); @@ -195,28 +322,6 @@ function readPortArg(port: string | undefined, flag: string) { return readPortNumber(port); } -async function isSlackEmulatorReachable(url: string) { - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), 500); - try { - const response = await fetch(`${url}/api/team.info`, { - body: "{}", - headers: { - Authorization: `Bearer ${SLACK_EMULATOR_TOKEN}`, - "Content-Type": "application/json", - }, - method: "POST", - signal: controller.signal, - }); - const body = (await response.json()) as { ok?: unknown }; - return response.ok && body.ok === true; - } catch { - return false; - } finally { - clearTimeout(timeout); - } -} - function readSlackBaseUrl(port: string) { return `http://localhost:${readPortNumber(port)}`; } diff --git a/apps/landing/src/actions/index.ts b/apps/landing/src/actions/index.ts index 46450a96..39207c32 100644 --- a/apps/landing/src/actions/index.ts +++ b/apps/landing/src/actions/index.ts @@ -1,65 +1,131 @@ +import { z } from "astro/zod"; import { ActionError, defineAction } from "astro:actions"; import { LANDING_SLACK_WEBHOOK_URL } from "astro:env/server"; -import { submitContactLead, submitProductUpdatesLead } from "@/server/api"; -import type { ProductUpdatesResponse } from "@/server/api"; -import { NotificationConfigurationError } from "@/server/notifications"; -import type { NotificationError } from "@/server/notifications"; import { - ContactRequestSchema, - ProductUpdatesRequestSchema, -} from "@/server/schemas"; + createContactNotification, + createProductUpdatesNotification, + deliverSlackNotification, +} from "@/server/notifications"; +import type { + NotificationType, + SlackNotificationPayload, +} from "@/server/notifications"; -type ContactActionState = { - status: "sent"; -}; +const EmailSchema = z.preprocess( + (value) => (typeof value === "string" ? value.trim() : value), + z.email({ pattern: z.regexes.html5Email }) +); + +const ProductUpdatesInputSchema = z.object({ + email: EmailSchema, +}); -const SENT_CONTACT_ACTION_STATE = { +const ContactInputSchema = z.object({ + email: EmailSchema, + message: z.string().trim().min(1, "message is required").max(4000), + name: z.string().trim().min(1, "name is required").max(200), +}); + +const SENT_CONTACT = { status: "sent", -} satisfies ContactActionState; +} as const; -function createActionError(error: NotificationError) { - const message = NotificationConfigurationError.is(error) - ? error.message - : "Failed to deliver notification"; +function isLoopbackHostname(hostname: string) { + return ( + hostname === "localhost" || + hostname === "[::1]" || + hostname.startsWith("127.") + ); +} +function createServiceUnavailableActionError(message: string) { return new ActionError({ code: "SERVICE_UNAVAILABLE", message, }); } +function readWebhookUrl(request: Request) { + const webhookUrl = LANDING_SLACK_WEBHOOK_URL?.trim(); + if (webhookUrl) { + return webhookUrl; + } + + if (isLoopbackHostname(new URL(request.url).hostname)) { + return undefined; + } + + console.error( + { + event: "landing.notification.delivery_unconfigured", + }, + "landing notification delivery is unconfigured" + ); + throw createServiceUnavailableActionError("Landing ingest is not configured"); +} + +async function sendNotification(input: { + notificationType: NotificationType; + payload: SlackNotificationPayload; + request: Request; +}) { + const webhookUrl = readWebhookUrl(input.request); + if (!webhookUrl) { + console.info( + { + event: "landing.notification.delivered_local", + notificationType: input.notificationType, + }, + "landing notification routed to local sink" + ); + return; + } + + try { + await deliverSlackNotification({ + notificationType: input.notificationType, + payload: input.payload, + webhookUrl, + }); + } catch (error) { + console.error( + { + error, + event: "landing.notification.action_failed", + notificationType: input.notificationType, + }, + "landing notification action failed" + ); + throw createServiceUnavailableActionError("Failed to deliver notification"); + } +} + export const server = { productUpdates: defineAction({ accept: "form", - input: ProductUpdatesRequestSchema, - handler: async (input, { request }): Promise => { - const result = await submitProductUpdatesLead(input, { + input: ProductUpdatesInputSchema, + handler: async ({ email }, { request }) => { + await sendNotification({ + notificationType: "product_updates", + payload: createProductUpdatesNotification(email), request, - slackWebhookUrl: LANDING_SLACK_WEBHOOK_URL, }); - if (result.isErr()) { - throw createActionError(result.error); - } - - return result.value; + return { email }; }, }), contact: defineAction({ accept: "form", - input: ContactRequestSchema, - handler: async (input, { request }): Promise => { - const result = await submitContactLead(input, { + input: ContactInputSchema, + handler: async (input, { request }) => { + await sendNotification({ + notificationType: "contact", + payload: createContactNotification(input), request, - slackWebhookUrl: LANDING_SLACK_WEBHOOK_URL, }); - if (result.isErr()) { - throw createActionError(result.error); - } - - return SENT_CONTACT_ACTION_STATE; + return SENT_CONTACT; }, }), }; diff --git a/apps/landing/src/features/home/components/ProductUpdatesSection.astro b/apps/landing/src/features/home/components/ProductUpdatesSection.astro index b60cf6b8..39f40932 100644 --- a/apps/landing/src/features/home/components/ProductUpdatesSection.astro +++ b/apps/landing/src/features/home/components/ProductUpdatesSection.astro @@ -1,3 +1,7 @@ +--- +import { actions } from "astro:actions"; +--- +

Stay in the loop

@@ -7,7 +11,7 @@
diff --git a/apps/landing/src/index.test.ts b/apps/landing/src/index.test.ts index 9763f034..35059ab5 100644 --- a/apps/landing/src/index.test.ts +++ b/apps/landing/src/index.test.ts @@ -32,21 +32,10 @@ describe("landing discovery resources", () => { ], anchor: "https://onequery.dev/", }), - expect.objectContaining({ - anchor: "https://onequery.dev/.well-known/api-catalog/", - item: [ - { - href: "https://onequery.dev/api/product-updates/", - title: "Landing product updates API", - }, - { - href: "https://onequery.dev/api/contact/", - title: "Landing contact API", - }, - ], - }), ]) ); + expect(JSON.stringify(body)).not.toContain("/api/product-updates/"); + expect(JSON.stringify(body)).not.toContain("/api/contact/"); }); it("omits a response body for HEAD API catalog requests", async () => { @@ -65,20 +54,13 @@ describe("landing discovery resources", () => { expect.objectContaining({ linkset: expect.arrayContaining([ expect.objectContaining({ - anchor: "https://preview.onequery.dev/.well-known/api-catalog/", - item: [ - { - href: "https://preview.onequery.dev/api/product-updates/", - title: "Landing product updates API", - }, - { - href: "https://preview.onequery.dev/api/contact/", - title: "Landing contact API", - }, - ], + anchor: "https://preview.onequery.dev/", }), ]), }) ); + expect( + JSON.stringify(buildApiCatalogLinkset("https://preview.onequery.dev")) + ).not.toContain("/api/"); }); }); diff --git a/apps/landing/src/pages/api/contact.ts b/apps/landing/src/pages/api/contact.ts deleted file mode 100644 index 331d2031..00000000 --- a/apps/landing/src/pages/api/contact.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { APIRoute } from "astro"; -import { LANDING_SLACK_WEBHOOK_URL } from "astro:env/server"; - -import { handleContactRequest } from "@/server/api"; - -export const prerender = false; - -export const POST: APIRoute = ({ request }) => - handleContactRequest({ - request, - slackWebhookUrl: LANDING_SLACK_WEBHOOK_URL, - }); diff --git a/apps/landing/src/pages/api/product-updates.ts b/apps/landing/src/pages/api/product-updates.ts deleted file mode 100644 index 6a8527bd..00000000 --- a/apps/landing/src/pages/api/product-updates.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { APIRoute } from "astro"; -import { LANDING_SLACK_WEBHOOK_URL } from "astro:env/server"; - -import { handleProductUpdatesRequest } from "@/server/api"; - -export const prerender = false; - -export const POST: APIRoute = ({ request }) => - handleProductUpdatesRequest({ - request, - slackWebhookUrl: LANDING_SLACK_WEBHOOK_URL, - }); diff --git a/apps/landing/src/server/api-catalog.ts b/apps/landing/src/server/api-catalog.ts index cc288ff6..ae3fd3dd 100644 --- a/apps/landing/src/server/api-catalog.ts +++ b/apps/landing/src/server/api-catalog.ts @@ -1,7 +1,6 @@ import { REPOSITORY_URL } from "@/shared/config/site"; import { ONEQUERY } from "@/shared/seo/constants"; -const API_PREFIX = "/api"; const API_CATALOG_PATH = "/.well-known/api-catalog/"; const API_CATALOG_CONTENT_TYPE = 'application/linkset+json; profile="https://www.rfc-editor.org/info/rfc9727"'; @@ -23,8 +22,6 @@ export const AGENT_DISCOVERY_LINK_HEADER = [ export function buildApiCatalogLinkset(origin: string) { const homepageUrl = `${origin}/`; const catalogUrl = `${origin}${API_CATALOG_PATH}`; - const productUpdatesApiUrl = `${origin}${API_PREFIX}/product-updates/`; - const contactApiUrl = `${origin}${API_PREFIX}/contact/`; return { linkset: [ @@ -58,19 +55,6 @@ export function buildApiCatalogLinkset(origin: string) { }, ], }, - { - anchor: catalogUrl, - item: [ - { - href: productUpdatesApiUrl, - title: "Landing product updates API", - }, - { - href: contactApiUrl, - title: "Landing contact API", - }, - ], - }, { anchor: API_CATALOG_LINKS.CLI_PROTO, describedby: [ diff --git a/apps/landing/src/server/api.ts b/apps/landing/src/server/api.ts deleted file mode 100644 index 8eb1c489..00000000 --- a/apps/landing/src/server/api.ts +++ /dev/null @@ -1,356 +0,0 @@ -import { Result } from "better-result"; -import { z } from "zod"; - -import { - createContactNotification, - createProductUpdatesNotification, - deliverNotification, - NotificationConfigurationError, -} from "./notifications"; -import type { NotificationDelivery, NotificationError } from "./notifications"; -import { ContactRequestSchema, ProductUpdatesRequestSchema } from "./schemas"; - -type ErrorResponseBase = { - code: Code; - message: string; -}; - -export type InternalErrorResponse = ErrorResponseBase<"internal_error">; - -export type ValidationErrorResponse = ErrorResponseBase<"validation_error"> & { - fieldErrors: Record; -}; - -export type ServiceUnavailableErrorResponse = - ErrorResponseBase<"service_unavailable">; - -export type ProductUpdatesResponse = { - email: string; -}; - -export type ContactResponse = Record; - -export type ProductUpdatesInput = z.infer; - -export type ContactInput = z.infer; - -export type ApiErrorResponse = - | InternalErrorResponse - | ServiceUnavailableErrorResponse - | ValidationErrorResponse; - -type RequestContext = { - request: Request; - // Local dev can intentionally omit the webhook and use the loopback fallback - // sink, but deployed environments still require it. - slackWebhookUrl?: string; -}; - -type LeadSubmission = ( - input: Input, - context: RequestContext -) => Promise>; - -function isLoopbackHostname(hostname: string) { - return ( - hostname === "localhost" || - hostname === "[::1]" || - hostname.startsWith("127.") - ); -} - -function resolveNotificationDelivery(input: { - hostname: string; - slackWebhookUrl: string | undefined; -}): NotificationDelivery { - const webhookUrl = input.slackWebhookUrl?.trim(); - if (webhookUrl) { - return { - kind: "slack-webhook", - webhookUrl, - }; - } - - if (isLoopbackHostname(input.hostname)) { - return { - kind: "local-dev-null-sink", - }; - } - - return { - kind: "unconfigured", - }; -} - -function resolveNotificationDeliveryFromRequest({ - request, - slackWebhookUrl, -}: RequestContext) { - return resolveNotificationDelivery({ - hostname: new URL(request.url).hostname, - slackWebhookUrl, - }); -} - -type ValidationIssue = { - message: string; - path: readonly PropertyKey[]; -}; - -type ValidationError = { - issues: readonly ValidationIssue[]; -}; - -function readValidationFieldKey(path: readonly PropertyKey[]) { - if (path.length === 0) { - return "_form"; - } - - return path.map(String).join("."); -} - -function readValidationErrorResponse( - error: ValidationError -): ValidationErrorResponse { - const fieldErrors: Record = {}; - - for (const issue of error.issues) { - const fieldKey = readValidationFieldKey(issue.path); - const existingMessages = fieldErrors[fieldKey] ?? []; - - fieldErrors[fieldKey] = [...existingMessages, issue.message]; - } - - const message = error.issues[0]?.message ?? "Invalid request"; - - return { - code: "validation_error", - fieldErrors, - message, - }; -} - -function createJsonResponse( - body: T, - input: { - requestId: string; - status: number; - } -) { - return new Response(JSON.stringify(body), { - headers: { - "content-type": "application/json", - "x-robots-tag": "noindex", - "x-request-id": input.requestId, - }, - status: input.status, - }); -} - -function createValidationErrorResponse( - body: ValidationErrorResponse, - requestId: string -) { - return createJsonResponse(body, { - requestId, - status: 400, - }); -} - -function createInternalErrorResponse(requestId: string) { - return createJsonResponse( - { - code: "internal_error", - message: "Internal server error", - }, - { - requestId, - status: 500, - } - ); -} - -function createServiceUnavailableResponse( - error: NotificationError, - requestId: string -) { - const message = NotificationConfigurationError.is(error) - ? error.message - : "Failed to deliver notification"; - - return createJsonResponse( - { - code: "service_unavailable", - message, - }, - { - requestId, - status: 503, - } - ); -} - -function createBodyValidationError(message: string): ValidationErrorResponse { - return { - code: "validation_error", - fieldErrors: { - _form: [message], - }, - message, - }; -} - -function readFormDataBody(formData: FormData) { - return Object.fromEntries(formData.entries()); -} - -async function readRequestBody(request: Request) { - const contentType = request.headers.get("content-type")?.toLowerCase() ?? ""; - - if ( - contentType.includes("application/x-www-form-urlencoded") || - contentType.includes("multipart/form-data") - ) { - try { - return readFormDataBody(await request.formData()); - } catch { - return createBodyValidationError("Invalid form request body"); - } - } - - if (contentType.length > 0 && !contentType.includes("application/json")) { - return createBodyValidationError("Unsupported request content type"); - } - - try { - return await request.json(); - } catch { - return createBodyValidationError("Invalid JSON request body"); - } -} - -async function readValidatedRequestBody( - request: Request, - schema: T -): Promise | ValidationErrorResponse> { - const body = await readRequestBody(request); - if (isValidationErrorResponse(body)) { - return body; - } - - const result = schema.safeParse(body); - if (!result.success) { - return readValidationErrorResponse(result.error); - } - - return result.data; -} - -function isValidationErrorResponse( - input: unknown -): input is ValidationErrorResponse { - return ( - typeof input === "object" && - input !== null && - "code" in input && - input.code === "validation_error" - ); -} - -function createRequestId() { - return crypto.randomUUID(); -} - -export async function submitProductUpdatesLead( - input: ProductUpdatesInput, - context: RequestContext -) { - const normalizedEmail = input.email.toLowerCase(); - const result = await deliverNotification({ - delivery: resolveNotificationDeliveryFromRequest(context), - notificationType: "product_updates", - payload: createProductUpdatesNotification(normalizedEmail), - }); - if (result.isErr()) { - return Result.err(result.error); - } - - return Result.ok({ - email: normalizedEmail, - }); -} - -export async function submitContactLead( - input: ContactInput, - context: RequestContext -) { - const normalizedEmail = input.email.toLowerCase(); - const result = await deliverNotification({ - delivery: resolveNotificationDeliveryFromRequest(context), - notificationType: "contact", - payload: createContactNotification({ - email: normalizedEmail, - message: input.message, - name: input.name, - }), - }); - if (result.isErr()) { - return Result.err(result.error); - } - - return Result.ok({}); -} - -async function handleLeadRequest(input: { - context: RequestContext; - schema: TSchema; - submit: LeadSubmission, Body>; -}) { - const requestId = createRequestId(); - const { context, schema, submit } = input; - const { request } = context; - - try { - const requestBody = await readValidatedRequestBody(request, schema); - if (isValidationErrorResponse(requestBody)) { - return createValidationErrorResponse(requestBody, requestId); - } - - const result = await submit(requestBody, context); - if (result.isErr()) { - return createServiceUnavailableResponse(result.error, requestId); - } - - return createJsonResponse(result.value, { - requestId, - status: 200, - }); - } catch (error) { - console.error( - { - err: error, - event: "landing.request.failed", - path: new URL(request.url).pathname, - requestId, - }, - "landing request failed" - ); - return createInternalErrorResponse(requestId); - } -} - -export function handleProductUpdatesRequest(context: RequestContext) { - return handleLeadRequest({ - context, - schema: ProductUpdatesRequestSchema, - submit: submitProductUpdatesLead, - }); -} - -export function handleContactRequest(context: RequestContext) { - return handleLeadRequest({ - context, - schema: ContactRequestSchema, - submit: submitContactLead, - }); -} diff --git a/apps/landing/src/server/app.test.ts b/apps/landing/src/server/app.test.ts deleted file mode 100644 index 4875a2d9..00000000 --- a/apps/landing/src/server/app.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest"; - -import { handleContactRequest, handleProductUpdatesRequest } from "./api"; -import type { - ServiceUnavailableErrorResponse, - ValidationErrorResponse, -} from "./api"; -import { - createContactNotification, - createProductUpdatesNotification, -} from "./notifications"; -import { - createSlackEmulatorHarness, - SLACK_EMULATOR_BOT_ID, -} from "./test/slack-emulator"; -import type { SlackEmulatorHarness } from "./test/slack-emulator"; - -let slack: SlackEmulatorHarness; - -beforeAll(async () => { - slack = await createSlackEmulatorHarness(); -}); - -afterEach(() => { - slack.reset(); -}); - -afterAll(async () => { - await slack.close(); -}); - -describe("landing API handlers", () => { - it("assigns a request id to successful API responses", async () => { - const response = await handleProductUpdatesRequest({ - request: new Request("https://landing.onequery.dev/api/product-updates", { - body: JSON.stringify({ email: "team@example.com" }), - headers: { "content-type": "application/json" }, - method: "POST", - }), - slackWebhookUrl: slack.webhookUrl, - }); - - expect(response.status).toBe(200); - expect(response.headers.get("x-request-id")).toEqual(expect.any(String)); - expect(response.headers.get("x-robots-tag")).toBe("noindex"); - expect(await slack.readMessages()).toHaveLength(1); - }); - - it("accepts product updates submissions with trimmed email input", async () => { - const response = await handleProductUpdatesRequest({ - request: new Request("https://landing.onequery.dev/api/product-updates", { - body: JSON.stringify({ email: " TEST@Example.COM " }), - headers: { "content-type": "application/json" }, - method: "POST", - }), - slackWebhookUrl: slack.webhookUrl, - }); - - expect(response.status).toBe(200); - expect(await response.json()).toEqual({ - email: "test@example.com", - }); - const [message] = await slack.readMessages(); - expect(message).toMatchObject({ - bot_id: SLACK_EMULATOR_BOT_ID, - blocks: createProductUpdatesNotification("test@example.com").blocks, - text: "New product updates signup: test@example.com", - }); - }); - - it("accepts product updates form submissions for the HTML fallback", async () => { - const response = await handleProductUpdatesRequest({ - request: new Request("https://landing.onequery.dev/api/product-updates", { - body: new URLSearchParams({ - email: " FORM@Example.COM ", - }), - method: "POST", - }), - slackWebhookUrl: slack.webhookUrl, - }); - - expect(response.status).toBe(200); - expect(await response.json()).toEqual({ - email: "form@example.com", - }); - const [message] = await slack.readMessages(); - expect(message).toMatchObject({ - blocks: createProductUpdatesNotification("form@example.com").blocks, - text: "New product updates signup: form@example.com", - }); - }); - - it("normalizes contact submissions before delivery", async () => { - const response = await handleContactRequest({ - request: new Request("https://landing.onequery.dev/api/contact", { - body: JSON.stringify({ - email: " TEAM@Example.COM ", - message: " Need pricing details ", - name: " Jane Doe ", - }), - headers: { "content-type": "application/json" }, - method: "POST", - }), - slackWebhookUrl: slack.webhookUrl, - }); - - expect(response.status).toBe(200); - expect(await response.json()).toEqual({}); - const [message] = await slack.readMessages(); - expect(message).toMatchObject({ - blocks: createContactNotification({ - email: "team@example.com", - message: "Need pricing details", - name: "Jane Doe", - }).blocks, - text: "New contact request from Jane Doe (team@example.com)", - }); - }); - - it("rejects contact submissions that become empty after trimming", async () => { - const response = await handleContactRequest({ - request: new Request("https://landing.onequery.dev/api/contact", { - body: JSON.stringify({ - email: "team@example.com", - message: " ", - name: " ", - }), - headers: { "content-type": "application/json" }, - method: "POST", - }), - }); - - expect(response.status).toBe(400); - const body: ValidationErrorResponse = await response.json(); - expect(body).toEqual({ - code: "validation_error", - fieldErrors: { - message: ["message is required"], - name: ["name is required"], - }, - message: "name is required", - }); - expect(await slack.readMessages()).toHaveLength(0); - }); - - it("returns a typed 503 error response when delivery is unconfigured", async () => { - const response = await handleProductUpdatesRequest({ - request: new Request("https://landing.onequery.dev/api/product-updates", { - body: JSON.stringify({ email: "team@example.com" }), - headers: { "content-type": "application/json" }, - method: "POST", - }), - }); - - expect(response.status).toBe(503); - const body: ServiceUnavailableErrorResponse = await response.json(); - expect(body).toEqual({ - code: "service_unavailable", - message: "Landing ingest is not configured", - }); - expect(await slack.readMessages()).toHaveLength(0); - }); -}); diff --git a/apps/landing/src/server/notifications.test.ts b/apps/landing/src/server/notifications.test.ts index 7ecc6140..c9e1a2d1 100644 --- a/apps/landing/src/server/notifications.test.ts +++ b/apps/landing/src/server/notifications.test.ts @@ -2,7 +2,7 @@ import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest"; import { createProductUpdatesNotification, - deliverNotification, + deliverSlackNotification, } from "./notifications"; import { createSlackEmulatorHarness, @@ -24,57 +24,16 @@ afterAll(async () => { await slack.close(); }); -describe("deliverNotification", () => { - it("accepts local loopback requests without a configured webhook", async () => { - const payload = { - text: "New product updates signup: test@example.com", - blocks: [], - }; - - const result = await deliverNotification({ - delivery: { - kind: "local-dev-null-sink", - }, - notificationType: "product_updates", - payload, - }); - - expect(result.isOk()).toBe(true); - expect(await slack.readMessages()).toHaveLength(0); - }); - - it("stays unavailable outside local loopback when the webhook is missing", async () => { - const result = await deliverNotification({ - delivery: { - kind: "unconfigured", - }, - notificationType: "product_updates", - payload: { - text: "New product updates signup: test@example.com", - blocks: [], - }, - }); - - expect(result.isErr()).toBe(true); - if (result.isErr()) { - expect(result.error.message).toBe("Landing ingest is not configured"); - } - expect(await slack.readMessages()).toHaveLength(0); - }); - +describe("deliverSlackNotification", () => { it("delivers to the configured webhook when present", async () => { const payload = createProductUpdatesNotification("test@example.com"); - const result = await deliverNotification({ - delivery: { - kind: "slack-webhook", - webhookUrl: slack.webhookUrl, - }, + await deliverSlackNotification({ notificationType: "product_updates", payload, + webhookUrl: slack.webhookUrl, }); - expect(result.isOk()).toBe(true); const [message] = await slack.readMessages(); expect(message).toMatchObject({ blocks: payload.blocks, @@ -85,42 +44,28 @@ describe("deliverNotification", () => { it("returns request failures as request errors", async () => { const port = await findAvailablePort(); - const result = await deliverNotification({ - delivery: { - kind: "slack-webhook", + await expect( + deliverSlackNotification({ + notificationType: "product_updates", + payload: { + blocks: [], + text: "New product updates signup: test@example.com", + }, webhookUrl: `http://127.0.0.1:${port}/hooks/landing`, - }, - notificationType: "product_updates", - payload: { - text: "New product updates signup: test@example.com", - blocks: [], - }, - }); - - expect(result.isErr()).toBe(true); - if (result.isErr()) { - expect(result.error.message).toMatch( - /^Failed to send landing notification:/ - ); - } + }) + ).rejects.toThrow(/^Failed to send landing notification:/); }); it("returns webhook rejections as response errors", async () => { - const result = await deliverNotification({ - delivery: { - kind: "slack-webhook", + await expect( + deliverSlackNotification({ + notificationType: "contact", + payload: { + blocks: [], + text: "", + }, webhookUrl: slack.webhookUrl, - }, - notificationType: "contact", - payload: { - text: "", - blocks: [], - }, - }); - - expect(result.isErr()).toBe(true); - if (result.isErr()) { - expect(result.error.message).toBe("Failed to deliver notification"); - } + }) + ).rejects.toThrow("Failed to deliver notification"); }); }); diff --git a/apps/landing/src/server/notifications.ts b/apps/landing/src/server/notifications.ts index 8ef29450..eab68f28 100644 --- a/apps/landing/src/server/notifications.ts +++ b/apps/landing/src/server/notifications.ts @@ -1,80 +1,41 @@ -import { Result, TaggedError } from "better-result"; - const LEAD_CAPTURE_SOURCE = "onequery_landing"; -export type NotificationDelivery = - | { - kind: "local-dev-null-sink"; - } - | { - kind: "slack-webhook"; - webhookUrl: string; - } - | { - kind: "unconfigured"; - }; - -export class NotificationConfigurationError extends TaggedError( - "NotificationConfigurationError" -)<{ - message: string; -}>() {} - -export class NotificationRequestError extends TaggedError( - "NotificationRequestError" -)<{ - message: string; - cause: unknown; -}>() {} - -export class NotificationResponseError extends TaggedError( - "NotificationResponseError" -)<{ - message: string; - status: number; -}>() {} - -export type NotificationError = - | NotificationConfigurationError - | NotificationRequestError - | NotificationResponseError; - type SlackPlainText = { - type: "plain_text"; text: string; + type: "plain_text"; }; type SlackMarkdownText = { - type: "mrkdwn"; text: string; + type: "mrkdwn"; }; type SlackHeaderBlock = { - type: "header"; text: SlackPlainText; + type: "header"; }; type SlackSectionBlock = | { - type: "section"; fields: readonly SlackMarkdownText[]; + type: "section"; } | { - type: "section"; text: SlackMarkdownText; + type: "section"; }; type SlackContextBlock = { - type: "context"; elements: readonly SlackMarkdownText[]; + type: "context"; }; -type NotificationPayload = { - text: string; +export type SlackNotificationPayload = { blocks: readonly (SlackContextBlock | SlackHeaderBlock | SlackSectionBlock)[]; + text: string; }; -type NotificationType = "contact" | "product_updates"; +export type NotificationType = "contact" | "product_updates"; function escapeSlackText(value: string) { return value @@ -85,22 +46,22 @@ function escapeSlackText(value: string) { export function createProductUpdatesNotification( email: string -): NotificationPayload { +): SlackNotificationPayload { return { - text: `New product updates signup: ${email}`, blocks: [ { + text: { text: "New product updates signup", type: "plain_text" }, type: "header", - text: { type: "plain_text", text: "New product updates signup" }, }, { - type: "section", fields: [ - { type: "mrkdwn", text: `*Email*\n${escapeSlackText(email)}` }, - { type: "mrkdwn", text: `*Source*\n${LEAD_CAPTURE_SOURCE}` }, + { text: `*Email*\n${escapeSlackText(email)}`, type: "mrkdwn" }, + { text: `*Source*\n${LEAD_CAPTURE_SOURCE}`, type: "mrkdwn" }, ], + type: "section", }, ], + text: `New product updates signup: ${email}`, }; } @@ -108,125 +69,88 @@ export function createContactNotification(input: { email: string; message: string; name: string; -}): NotificationPayload { +}): SlackNotificationPayload { return { - text: `New contact request from ${input.name} (${input.email})`, blocks: [ { + text: { text: "New contact request", type: "plain_text" }, type: "header", - text: { type: "plain_text", text: "New contact request" }, }, { - type: "section", fields: [ - { type: "mrkdwn", text: `*Name*\n${escapeSlackText(input.name)}` }, - { type: "mrkdwn", text: `*Email*\n${escapeSlackText(input.email)}` }, + { text: `*Name*\n${escapeSlackText(input.name)}`, type: "mrkdwn" }, + { text: `*Email*\n${escapeSlackText(input.email)}`, type: "mrkdwn" }, ], + type: "section", }, { - type: "section", text: { - type: "mrkdwn", text: `*Message*\n${escapeSlackText(input.message)}`, + type: "mrkdwn", }, + type: "section", }, { + elements: [{ text: `Source: ${LEAD_CAPTURE_SOURCE}`, type: "mrkdwn" }], type: "context", - elements: [{ type: "mrkdwn", text: `Source: ${LEAD_CAPTURE_SOURCE}` }], }, ], + text: `New contact request from ${input.name} (${input.email})`, }; } -export async function deliverNotification(input: { - delivery: NotificationDelivery; +export async function deliverSlackNotification(input: { notificationType: NotificationType; - payload: NotificationPayload; -}): Promise> { - const { delivery, notificationType, payload } = input; - - if (delivery.kind === "local-dev-null-sink") { - console.info( - { - delivery: delivery.kind, - event: "landing.notification.delivered_local", - notificationType, - }, - "landing notification routed to local sink" - ); - return Result.ok(undefined); - } - - if (delivery.kind === "unconfigured") { + payload: SlackNotificationPayload; + webhookUrl: string; +}): Promise { + let response: Response; + + try { + response = await fetch(input.webhookUrl, { + body: JSON.stringify(input.payload), + headers: { "Content-Type": "application/json" }, + method: "POST", + }); + } catch (cause) { + const message = `Failed to send landing notification: ${toErrorMessage( + cause + )}`; console.error( { - delivery: delivery.kind, - event: "landing.notification.delivery_unconfigured", - notificationType, - }, - "landing notification delivery is unconfigured" - ); - return Result.err( - new NotificationConfigurationError({ - message: "Landing ingest is not configured", - }) - ); - } - - const responseResult = await Result.tryPromise({ - try: () => - fetch(delivery.webhookUrl, { - body: JSON.stringify(payload), - headers: { "Content-Type": "application/json" }, - method: "POST", - }), - catch: (cause: unknown) => - new NotificationRequestError({ cause, - message: `Failed to send landing notification: ${toErrorMessage(cause)}`, - }), - }); - if (responseResult.isErr()) { - console.error( - { - cause: responseResult.error.cause, - delivery: delivery.kind, - errorMessage: responseResult.error.message, + errorMessage: message, event: "landing.notification.webhook_request_failed", - notificationType, + notificationType: input.notificationType, }, "landing notification webhook request failed" ); - return Result.err(responseResult.error); + throw new Error(message, { cause }); } - const response = responseResult.value; - if (response.ok) { - return Result.ok(undefined); + return; } - const upstream = (await Result.tryPromise(() => response.text())).unwrapOr( - "" - ); - // Public lead-capture requests should not leak upstream webhook - // details back to the browser, so worker errors stay generic. + const upstream = await readResponseText(response); console.error( { - delivery: delivery.kind, event: "landing.notification.webhook_rejected", - notificationType, + notificationType: input.notificationType, status: response.status, upstreamBodyPreview: upstream.slice(0, 500), }, "landing notification webhook rejected" ); - return Result.err( - new NotificationResponseError({ - message: "Failed to deliver notification", - status: response.status, - }) - ); + throw new Error("Failed to deliver notification"); +} + +async function readResponseText(response: Response) { + try { + return await response.text(); + } catch { + return ""; + } } function toErrorMessage(error: unknown): string { diff --git a/apps/landing/src/server/schemas.ts b/apps/landing/src/server/schemas.ts deleted file mode 100644 index 94975e6a..00000000 --- a/apps/landing/src/server/schemas.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from "zod"; - -const EmailSchema = z - .string() - .trim() - .pipe(z.email("email must be a valid email address").max(320)); - -export const ProductUpdatesRequestSchema = z.object({ - email: EmailSchema, -}); - -export const ContactRequestSchema = z.object({ - name: z.string().trim().min(1, "name is required").max(200), - email: EmailSchema, - message: z.string().trim().min(1, "message is required").max(4000), -}); diff --git a/apps/landing/src/shared/components/footer-contact/FooterContactButton.astro b/apps/landing/src/shared/components/footer-contact/FooterContactButton.astro index f1b6150d..dc0b5c3e 100644 --- a/apps/landing/src/shared/components/footer-contact/FooterContactButton.astro +++ b/apps/landing/src/shared/components/footer-contact/FooterContactButton.astro @@ -1,3 +1,7 @@ +--- +import { actions } from "astro:actions"; +--- + - - - - diff --git a/apps/landing/src/shared/components/footer-contact/FooterContactSection.astro b/apps/landing/src/shared/components/footer-contact/FooterContactSection.astro new file mode 100644 index 00000000..02e77031 --- /dev/null +++ b/apps/landing/src/shared/components/footer-contact/FooterContactSection.astro @@ -0,0 +1,173 @@ +--- +import { actions } from "astro:actions"; +--- + + + + diff --git a/apps/landing/src/shared/components/footer-contact/contact-modal.ts b/apps/landing/src/shared/components/footer-contact/contact-modal.ts deleted file mode 100644 index 5c277994..00000000 --- a/apps/landing/src/shared/components/footer-contact/contact-modal.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { - trackContactFormSubmitted, - trackContactModalOpened, -} from "@/shared/analytics/events"; - -export type ContactSubmissionResult = - | { - ok: true; - } - | { - message: string; - ok: false; - }; - -type FooterContactModalOptions = { - submit: (formData: FormData) => Promise; -}; - -type ContactElements = { - backdrop: HTMLElement; - closeButton: HTMLButtonElement; - errorMessage: HTMLElement; - fields: Array; - form: HTMLFormElement; - modal: HTMLElement; - openButton: HTMLButtonElement; - submitButton: HTMLButtonElement | null; -}; - -function readRootCssTimeMs(name: string, fallback: number) { - const rawValue = getComputedStyle(document.documentElement) - .getPropertyValue(name) - .trim(); - const value = parseFloat(rawValue); - - if (!Number.isFinite(value)) { - return fallback; - } - - return rawValue.endsWith("ms") ? value : value * 1000; -} - -function readContactElements(): ContactElements | null { - const openButton = document.querySelector("[data-contact-open]"); - const backdrop = document.querySelector("[data-contact-backdrop]"); - const modal = document.querySelector("[data-contact-modal]"); - const form = document.querySelector("[data-contact-form]"); - const closeButton = document.querySelector("[data-contact-close]"); - const errorMessage = document.querySelector("[data-contact-error]"); - - if ( - !(openButton instanceof HTMLButtonElement) || - !(backdrop instanceof HTMLElement) || - !(modal instanceof HTMLElement) || - !(form instanceof HTMLFormElement) || - !(closeButton instanceof HTMLButtonElement) || - !(errorMessage instanceof HTMLElement) - ) { - return null; - } - - return { - backdrop, - closeButton, - errorMessage, - fields: Array.from( - form.querySelectorAll(".t-input") - ), - form, - modal, - openButton, - submitButton: form.querySelector( - ".contact-modal-submit" - ), - }; -} - -export function installFooterContactModal({ - submit, -}: FooterContactModalOptions) { - const elements = readContactElements(); - - if (!elements) { - return; - } - - const { - backdrop, - closeButton, - errorMessage, - fields, - form, - modal, - openButton, - submitButton, - } = elements; - let closeTimer = 0; - let focusedBeforeOpen: Element | null = null; - let previousBodyOverflow = ""; - let shakeTimer = 0; - let revertTimer = 0; - let pendingSubmissionController: AbortController | null = null; - let submissionId = 0; - - function clearError() { - window.clearTimeout(shakeTimer); - window.clearTimeout(revertTimer); - shakeTimer = 0; - revertTimer = 0; - form.classList.remove("is-error"); - - for (const field of fields) { - field.classList.remove("is-error", "is-shaking"); - } - } - - function showError(message: string) { - clearError(); - errorMessage.textContent = message; - form.classList.add("is-error"); - - for (const field of fields) { - field.classList.add("is-error"); - field.classList.remove("is-shaking"); - } - - void form.offsetWidth; - - for (const field of fields) { - field.classList.add("is-shaking"); - } - - const shakeMs = - readRootCssTimeMs("--shake-dur-a", 80) * 2 + - readRootCssTimeMs("--shake-dur-b", 60) * 2; - - shakeTimer = window.setTimeout(() => { - for (const field of fields) { - field.classList.remove("is-shaking"); - } - shakeTimer = 0; - }, shakeMs + 20); - - revertTimer = window.setTimeout( - clearError, - shakeMs + readRootCssTimeMs("--revert-hold", 3000) - ); - } - - function setPending(isPending: boolean) { - for (const field of fields) { - field.disabled = isPending; - } - - if (submitButton) { - submitButton.disabled = isPending; - submitButton.textContent = isPending ? "Sending..." : "Send message"; - } - } - - function isCurrentSubmission( - controller: AbortController, - currentSubmissionId: number - ) { - return ( - pendingSubmissionController === controller && - submissionId === currentSubmissionId - ); - } - - function cancelPendingSubmission() { - if (pendingSubmissionController) { - pendingSubmissionController.abort(); - pendingSubmissionController = null; - } - - submissionId += 1; - setPending(false); - } - - function closeModal() { - window.clearTimeout(closeTimer); - cancelPendingSubmission(); - clearError(); - backdrop.classList.remove("is-open"); - backdrop.classList.add("is-closing"); - modal.classList.remove("is-open"); - modal.classList.add("is-closing"); - openButton.setAttribute("aria-expanded", "false"); - - closeTimer = window.setTimeout( - () => { - backdrop.hidden = true; - backdrop.classList.remove("is-closing"); - modal.classList.remove("is-closing"); - document.body.style.overflow = previousBodyOverflow; - clearError(); - - if (focusedBeforeOpen instanceof HTMLElement) { - focusedBeforeOpen.focus(); - } - }, - readRootCssTimeMs("--modal-close-dur", 150) - ); - } - - function openModal() { - window.clearTimeout(closeTimer); - clearError(); - focusedBeforeOpen = document.activeElement; - previousBodyOverflow = document.body.style.overflow; - document.body.style.overflow = "hidden"; - backdrop.hidden = false; - backdrop.classList.remove("is-closing"); - modal.classList.remove("is-closing"); - openButton.setAttribute("aria-expanded", "true"); - trackContactModalOpened(); - - window.requestAnimationFrame(() => { - backdrop.classList.add("is-open"); - modal.classList.add("is-open"); - const nameField = form.elements.namedItem("name"); - if (nameField instanceof HTMLElement) { - nameField.focus(); - } - }); - } - - async function submitContactForm(event: SubmitEvent) { - event.preventDefault(); - - if (pendingSubmissionController) { - return; - } - - if (!form.reportValidity()) { - showError("Please fill out the required fields"); - return; - } - - const formData = new FormData(form); - const controller = new AbortController(); - const currentSubmissionId = submissionId + 1; - - pendingSubmissionController = controller; - submissionId = currentSubmissionId; - clearError(); - setPending(true); - - try { - const result = await submit(formData); - - if (!isCurrentSubmission(controller, currentSubmissionId)) { - return; - } - - if (!result.ok) { - showError(result.message); - return; - } - - trackContactFormSubmitted(); - form.reset(); - closeModal(); - } catch { - if ( - !isCurrentSubmission(controller, currentSubmissionId) || - controller.signal.aborted - ) { - return; - } - - showError("Failed to send message"); - } finally { - if (isCurrentSubmission(controller, currentSubmissionId)) { - pendingSubmissionController = null; - setPending(false); - } - } - } - - openButton.addEventListener("click", openModal); - closeButton.addEventListener("click", closeModal); - backdrop.addEventListener("mousedown", closeModal); - modal.addEventListener("mousedown", (event) => { - event.stopPropagation(); - }); - form.addEventListener("submit", submitContactForm); - form.addEventListener("input", clearError); - form.addEventListener( - "invalid", - () => { - showError("Please fill out the required fields"); - }, - true - ); - window.addEventListener("keydown", (event) => { - if (event.key === "Escape" && !backdrop.hidden) { - closeModal(); - } - }); -} diff --git a/apps/landing/src/shared/styles/base.css b/apps/landing/src/shared/styles/base.css index ebd7433a..89108119 100644 --- a/apps/landing/src/shared/styles/base.css +++ b/apps/landing/src/shared/styles/base.css @@ -56,12 +56,6 @@ --dropdown-pre-scale: 0.97; --dropdown-closing-scale: 0.99; --dropdown-ease: cubic-bezier(0.22, 1, 0.36, 1); - /* Modal open / close */ - --modal-open-dur: 250ms; - --modal-close-dur: 150ms; - --modal-scale: 0.96; - --modal-scale-close: 0.96; - --modal-ease: cubic-bezier(0.22, 1, 0.36, 1); /* Panel reveal */ --panel-open-dur: 400ms; --panel-close-dur: 350ms; @@ -104,14 +98,6 @@ --avatar-falloff: 0.45; --avatar-ease-in: cubic-bezier(0.22, 1, 0.36, 1); --avatar-ease-out: cubic-bezier(0.34, 3.85, 0.64, 1); - /* Error state shake */ - --shake-distance: 6px; - --shake-overshoot: 4px; - --shake-dur-a: 80ms; - --shake-dur-b: 60ms; - --shake-ease: cubic-bezier(0.22, 1, 0.36, 1); - --revert-hold: 3000ms; - --revert-dur: 280ms; } /* React ViewTransition recipes from $vercel-react-view-transitions. */ @@ -528,8 +514,8 @@ code { color: #0f766e; } -.contact-modal-input, -.contact-modal-textarea { +.contact-input, +.contact-textarea { width: 100%; border: 1px solid rgba(15, 23, 42, 0.18); background: #ffffff; @@ -537,180 +523,44 @@ code { outline: none; } -.contact-modal-input:focus, -.contact-modal-textarea:focus { +.contact-input:focus, +.contact-textarea:focus { border-color: rgba(37, 99, 235, 0.45); box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.12); } .contact-link-button { - padding: 0; + display: inline-flex; + align-items: center; + min-height: 32px; + padding: 0 2px; border: 0; background: transparent; color: var(--text-soft); font-size: 14px; line-height: 20px; cursor: pointer; + text-decoration: none; } .contact-link-button:hover { color: var(--ink); } -.contact-link-button-loading { - cursor: progress; -} - -.contact-modal-backdrop { - position: fixed; - inset: 0; - z-index: 40; +.contact-section { display: grid; - place-items: center; - padding: 24px; - background: rgba(10, 10, 10, 0.28); - opacity: 0; - pointer-events: none; - backdrop-filter: blur(0); - transition: - opacity var(--modal-open-dur) var(--modal-ease), - backdrop-filter var(--modal-open-dur) var(--modal-ease); -} - -.contact-modal-backdrop.is-open { - opacity: 1; - pointer-events: auto; - backdrop-filter: blur(12px); -} - -.contact-modal-backdrop.is-closing { - opacity: 0; - pointer-events: none; - backdrop-filter: blur(0); - transition: - opacity var(--modal-close-dur) var(--modal-ease), - backdrop-filter var(--modal-close-dur) var(--modal-ease); -} - -.t-modal { - transform-origin: center; - transform: scale(var(--modal-scale)); - opacity: 0; - pointer-events: none; - transition: - transform var(--modal-open-dur) var(--modal-ease), - opacity var(--modal-open-dur) var(--modal-ease); - will-change: transform, opacity; -} -.t-modal.is-open { - transform: scale(1); - opacity: 1; - pointer-events: auto; -} -.t-modal.is-closing { - transform: scale(var(--modal-scale-close)); - opacity: 0; - pointer-events: none; - transition: - transform var(--modal-close-dur) var(--modal-ease), - opacity var(--modal-close-dur) var(--modal-ease); -} - -@media (prefers-reduced-motion: reduce) { - .t-modal { - transition: none !important; - } -} - -/* Border-color tween. Define your input's default / focused - / error border-color in your own component CSS; this rule - only owns the interpolation. Use a constant border-width - across states so the tween never shifts inner content. */ -.t-input { - transition: border-color 150ms ease-out; - will-change: transform; -} -.t-input.is-error { - /* Error border auto-reverts on the hold timer, so the - fade-out uses the slower revert duration (matches the - message fade). */ - transition: border-color var(--revert-dur, 280ms) ease-out; -} - -/* Error message reveal. Visibility is delayed by --revert-dur - on hide so the message stays painted for the full opacity - fade-out. Entering .is-error drops the delay to 0 so the - message becomes visible immediately. */ -.t-error-msg { - opacity: 0; - visibility: hidden; - transition: - opacity var(--revert-dur, 280ms) ease-out, - visibility 0s linear var(--revert-dur, 280ms); -} -.t-input-wrap.is-error .t-error-msg { - opacity: 1; - visibility: visible; - transition: - opacity var(--revert-dur, 280ms) ease-out, - visibility 0s linear 0s; -} - -/* Multi-segment keyframe with per-stop easing so each leg - of the shake follows its own cubic-bezier independently. - %-stops are cumulative durations as a fraction of the - total (80, 60, 80, 60 = 280ms): 28.57%, 57.14%, 78.57%, - 100%. Recompute if any segment duration changes. */ -.t-input.is-shaking { - animation: t-input-shake calc(var(--shake-dur-a) * 2 + var(--shake-dur-b) * 2) - linear; -} -@keyframes t-input-shake { - 0% { - transform: translateX(0); - animation-timing-function: var(--shake-ease); - } - 28.57% { - transform: translateX(var(--shake-distance)); - animation-timing-function: var(--shake-ease); - } - 57.14% { - transform: translateX(calc(var(--shake-distance) * -1)); - animation-timing-function: var(--shake-ease); - } - 78.57% { - transform: translateX(var(--shake-overshoot)); - animation-timing-function: var(--shake-ease); - } - 100% { - transform: translateX(0); - } -} - -@media (prefers-reduced-motion: reduce) { - .t-input { - animation: none !important; - transform: none !important; - } -} - -.contact-modal { - position: relative; - width: min(100%, 640px); - padding: 32px; - border: 1px solid var(--line); - border-radius: 18px; - background: - linear-gradient(180deg, rgba(0, 0, 0, 0.015), rgba(0, 0, 0, 0.04)), - var(--surface); - box-shadow: var(--shadow), var(--shadow-ring); + grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); + gap: 36px; + margin-top: 72px; + padding-top: 32px; + border-top: 1px solid var(--line); } -.contact-modal-header { - max-width: 480px; +.contact-section-header { + max-width: 520px; } -.contact-modal h2 { +.contact-section h2 { margin: 0; color: var(--ink); font-size: clamp(2rem, 4vw, 3rem); @@ -719,31 +569,30 @@ code { line-height: 1.02; } -.contact-modal-copy { +.contact-section-copy { margin: 18px 0 0; color: var(--text-muted); font-size: 16px; line-height: 1.65; } -.contact-modal-form { +.contact-form { display: grid; gap: 18px; - margin-top: 28px; } -.contact-modal-field-grid { +.contact-field-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; } -.contact-modal-field { +.contact-field { display: grid; gap: 8px; } -.contact-modal-label { +.contact-label { color: var(--ink); font-size: 12px; font-weight: 600; @@ -751,33 +600,25 @@ code { text-transform: uppercase; } -.contact-modal-input, -.contact-modal-textarea { +.contact-input, +.contact-textarea { min-height: 48px; padding: 0 14px; - border-radius: 12px; + border-radius: 8px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3); color: var(--ink); font-size: 15px; line-height: 1.5; } -.contact-modal-textarea { +.contact-textarea { min-height: 152px; padding-top: 14px; padding-bottom: 14px; resize: vertical; } -.contact-modal-input.t-input.is-error, -.contact-modal-textarea.t-input.is-error { - border-color: rgba(180, 35, 24, 0.52); - box-shadow: - 0 0 0 4px rgba(180, 35, 24, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.contact-modal-actions { +.contact-actions { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; @@ -785,51 +626,16 @@ code { margin-top: 6px; } -.contact-modal-note { +.contact-feedback { margin: 0; - color: var(--text-soft); - font-size: 13px; - line-height: 1.6; -} - -.contact-modal-actions .marketing-form-feedback-error { - grid-column: 1 / -1; } -.contact-modal-submit { +.contact-submit { min-width: 152px; min-height: 44px; border-radius: 10px; } -.contact-modal-close { - position: absolute; - top: 16px; - right: 16px; - display: inline-flex; - align-items: center; - justify-content: center; - width: 40px; - height: 40px; - border: 1px solid var(--line); - border-radius: 12px; - background: rgba(0, 0, 0, 0.02); - color: var(--text-soft); - font-size: 22px; - line-height: 1; - cursor: pointer; - transition: - color 160ms ease, - background-color 160ms ease, - border-color 160ms ease; -} - -.contact-modal-close:hover { - color: var(--ink); - border-color: var(--line-strong); - background: rgba(0, 0, 0, 0.05); -} - .site-footer { display: flex; align-items: center; @@ -840,6 +646,10 @@ code { border-top: 1px solid var(--line); } +.contact-section + .site-footer { + margin-top: 32px; +} + .site-footer p { margin: 0; color: var(--text-soft); @@ -881,6 +691,12 @@ code { padding-inline: 24px; } + .contact-section { + grid-template-columns: 1fr; + gap: 24px; + margin-top: 56px; + } + .site-footer { flex-direction: column; align-items: flex-start; @@ -898,10 +714,6 @@ code { grid-row: 1; justify-self: end; } - - .contact-modal { - padding: 28px 22px 24px; - } } @media (max-width: 640px) { @@ -914,12 +726,12 @@ code { padding-bottom: 16px; } - .contact-modal-field-grid, - .contact-modal-actions { + .contact-field-grid, + .contact-actions { grid-template-columns: 1fr; } - .contact-modal-submit { + .contact-submit { width: 100%; } } @@ -938,8 +750,4 @@ code { .button { transition: none; } - - .contact-modal-backdrop { - transition: none; - } } From 9100e1fd725a6ed82ca919ebe4fb0299a0daf612 Mon Sep 17 00:00:00 2001 From: lentil32 Date: Thu, 4 Jun 2026 13:14:57 +0900 Subject: [PATCH 13/13] fix(landing): address PR review feedback --- apps/landing/src/server/notifications.ts | 52 ++++- apps/landing/wrangler.toml | 2 +- bun.lock | 249 +---------------------- package.json | 4 +- packages/datetime/package.json | 4 +- 5 files changed, 59 insertions(+), 252 deletions(-) diff --git a/apps/landing/src/server/notifications.ts b/apps/landing/src/server/notifications.ts index eab68f28..d327f1ee 100644 --- a/apps/landing/src/server/notifications.ts +++ b/apps/landing/src/server/notifications.ts @@ -1,4 +1,7 @@ const LEAD_CAPTURE_SOURCE = "onequery_landing"; +const SLACK_SECTION_TEXT_LIMIT = 3000; +const MESSAGE_BLOCK_PREFIX = "*Message*\n"; +const CONTINUED_MESSAGE_BLOCK_PREFIX = "*Message (continued)*\n"; type SlackPlainText = { text: string; @@ -83,13 +86,7 @@ export function createContactNotification(input: { ], type: "section", }, - { - text: { - text: `*Message*\n${escapeSlackText(input.message)}`, - type: "mrkdwn", - }, - type: "section", - }, + ...createContactMessageBlocks(input.message), { elements: [{ text: `Source: ${LEAD_CAPTURE_SOURCE}`, type: "mrkdwn" }], type: "context", @@ -99,6 +96,47 @@ export function createContactNotification(input: { }; } +function createContactMessageBlocks(message: string): SlackSectionBlock[] { + const escapedMessage = escapeSlackText(message); + const firstChunkSize = SLACK_SECTION_TEXT_LIMIT - MESSAGE_BLOCK_PREFIX.length; + const continuedChunkSize = + SLACK_SECTION_TEXT_LIMIT - CONTINUED_MESSAGE_BLOCK_PREFIX.length; + const blocks = [ + createMarkdownSectionBlock( + MESSAGE_BLOCK_PREFIX, + escapedMessage.slice(0, firstChunkSize) + ), + ]; + + for ( + let offset = firstChunkSize; + offset < escapedMessage.length; + offset += continuedChunkSize + ) { + blocks.push( + createMarkdownSectionBlock( + CONTINUED_MESSAGE_BLOCK_PREFIX, + escapedMessage.slice(offset, offset + continuedChunkSize) + ) + ); + } + + return blocks; +} + +function createMarkdownSectionBlock( + prefix: string, + text: string +): SlackSectionBlock { + return { + text: { + text: `${prefix}${text}`, + type: "mrkdwn", + }, + type: "section", + }; +} + export async function deliverSlackNotification(input: { notificationType: NotificationType; payload: SlackNotificationPayload; diff --git a/apps/landing/wrangler.toml b/apps/landing/wrangler.toml index 9c0506c9..2931afd5 100644 --- a/apps/landing/wrangler.toml +++ b/apps/landing/wrangler.toml @@ -20,7 +20,7 @@ directory = "./dist/client" binding = "ASSETS" # Routes with generated Markdown sidecars need Worker-first handling so # Accept: text/markdown can be negotiated before static asset serving. -run_worker_first = ["/", "/connectors/*", "/blog/*", "/docs/*"] +run_worker_first = ["/", "/connectors/*", "/blog/*", "/docs/*", "/compare/*"] [observability] enabled = true diff --git a/bun.lock b/bun.lock index 482c1a21..21160755 100644 --- a/bun.lock +++ b/bun.lock @@ -283,6 +283,9 @@ "packages/datetime": { "name": "@onequery/datetime", "version": "0.0.0", + "devDependencies": { + "vitest": "catalog:testing", + }, }, "packages/db": { "name": "@onequery/db", @@ -486,8 +489,8 @@ "nanostores": "1.3.0", "next-themes": "0.4.6", "pg": "8.20.0", - "react": "19.3.0-canary-d5736f09-20260507", - "react-dom": "19.3.0-canary-d5736f09-20260507", + "react": "19.2.3", + "react-dom": "19.2.3", "rehype-minify-whitespace": "6.0.2", "rehype-parse": "9.0.1", "rehype-remark": "10.0.1", @@ -3793,11 +3796,11 @@ "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], - "react": ["react@19.3.0-canary-d5736f09-20260507", "", {}, "sha512-EL3w0mHylqEtiySCjcj/nPOkK1j6KvKsaFkeavTqR6hbd6bQi7gyCcTSHXQ2XpTjv8hfKWFArSVF6he1sgQcEQ=="], + "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], "react-day-picker": ["react-day-picker@9.13.0", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0", "date-fns-jalali": "^4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-euzj5Hlq+lOHqI53NiuNhCP8HWgsPf/bBAVijR50hNaY1XwjKjShAnIe8jm8RD2W9IJUvihDIZ+KrmqfFzNhFQ=="], - "react-dom": ["react-dom@19.3.0-canary-d5736f09-20260507", "", { "dependencies": { "scheduler": "0.28.0-canary-d5736f09-20260507" }, "peerDependencies": { "react": "19.3.0-canary-d5736f09-20260507" } }, "sha512-PrjUaYOYc1dX65Td8StJSNJ3TFTeO2KBpAdXQJiOmW5kxDbKK+lvkJmSK/U+f7LcNnJxQKwHzKVf8WdJVjJohg=="], + "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], "react-hook-form": ["react-hook-form@7.71.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w=="], @@ -3945,7 +3948,7 @@ "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], - "scheduler": ["scheduler@0.28.0-canary-d5736f09-20260507", "", {}, "sha512-HkpDsMMSty/+FrYjvNnBZRwfU5P+LhZs8xRaWKVwTnB0rffXMg+BOntOebDmvlwI8hhB6D8ONBGXeOlWTzwVdA=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "schema-dts": ["schema-dts@2.0.0", "", { "dependencies": { "schema-dts-lib": "^1.0.0" } }, "sha512-t7NoCy3Rn5GHGx6p7s1qIYK/AeIb8ZxJNR9WUNFkwMv2CiiGZBmqqYWc2FlZVm5ZbiHMY4OvBWhj7QtyrFO2Jw=="], @@ -4443,10 +4446,6 @@ "@astrojs/react/@vitejs/plugin-react": ["@vitejs/plugin-react@5.2.0", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="], - "@astrojs/react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@astrojs/react/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@astrojs/react/vite": ["vite@7.3.3", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA=="], "@aws-crypto/crc32/@aws-sdk/types": ["@aws-sdk/types@3.973.7", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg=="], @@ -4815,14 +4814,6 @@ "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@base-ui/react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@base-ui/react/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "@base-ui/utils/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@base-ui/utils/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@better-auth/core/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@buape/carbon/@hono/node-server": ["@hono/node-server@1.19.13", "", { "peerDependencies": { "hono": "^4" } }, "sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ=="], @@ -4863,10 +4854,6 @@ "@expressive-code/core/postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], - "@floating-ui/react-dom/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@floating-ui/react-dom/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], "@jimp/core/file-type": ["file-type@21.3.4", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g=="], @@ -4933,114 +4920,40 @@ "@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "@nanostores/react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "@noble/curves/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], - "@onequery/ui/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@onequery/ui/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@poppinss/dumper/supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], "@qwik.dev/partytown/dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], - "@radix-ui/react-compose-refs/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-context/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "@radix-ui/react-dialog/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - "@radix-ui/react-dialog/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-dialog/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - "@radix-ui/react-dismissable-layer/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-dismissable-layer/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "@radix-ui/react-focus-guards/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "@radix-ui/react-focus-scope/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - "@radix-ui/react-focus-scope/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-focus-scope/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "@radix-ui/react-id/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "@radix-ui/react-portal/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - "@radix-ui/react-portal/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-portal/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "@radix-ui/react-presence/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-presence/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], - "@radix-ui/react-primitive/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-primitive/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "@radix-ui/react-slot/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-use-callback-ref/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-use-controllable-state/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-use-effect-event/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-use-escape-keydown/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@radix-ui/react-use-layout-effect/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "@remotion/bundler/esbuild": ["esbuild@0.25.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.0", "@esbuild/android-arm": "0.25.0", "@esbuild/android-arm64": "0.25.0", "@esbuild/android-x64": "0.25.0", "@esbuild/darwin-arm64": "0.25.0", "@esbuild/darwin-x64": "0.25.0", "@esbuild/freebsd-arm64": "0.25.0", "@esbuild/freebsd-x64": "0.25.0", "@esbuild/linux-arm": "0.25.0", "@esbuild/linux-arm64": "0.25.0", "@esbuild/linux-ia32": "0.25.0", "@esbuild/linux-loong64": "0.25.0", "@esbuild/linux-mips64el": "0.25.0", "@esbuild/linux-ppc64": "0.25.0", "@esbuild/linux-riscv64": "0.25.0", "@esbuild/linux-s390x": "0.25.0", "@esbuild/linux-x64": "0.25.0", "@esbuild/netbsd-arm64": "0.25.0", "@esbuild/netbsd-x64": "0.25.0", "@esbuild/openbsd-arm64": "0.25.0", "@esbuild/openbsd-x64": "0.25.0", "@esbuild/sunos-x64": "0.25.0", "@esbuild/win32-arm64": "0.25.0", "@esbuild/win32-ia32": "0.25.0", "@esbuild/win32-x64": "0.25.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw=="], "@remotion/bundler/postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], - "@remotion/bundler/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@remotion/bundler/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@remotion/bundler/source-map": ["source-map@0.7.3", "", {}, "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="], "@remotion/cli/dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], "@remotion/cli/minimist": ["minimist@1.2.6", "", {}, "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="], - "@remotion/cli/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@remotion/cli/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "@remotion/media-utils/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@remotion/media-utils/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "@remotion/player/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@remotion/player/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@remotion/renderer/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], - "@remotion/renderer/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@remotion/renderer/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@remotion/renderer/source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], "@remotion/renderer/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], "@remotion/studio/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], - "@remotion/studio/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@remotion/studio/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@remotion/studio/semver": ["semver@7.5.3", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ=="], "@remotion/studio/source-map": ["source-map@0.7.3", "", {}, "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="], @@ -5059,10 +4972,6 @@ "@remotion/tailwind-v4/tailwindcss": ["tailwindcss@4.2.0", "", {}, "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q=="], - "@remotion/web-renderer/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@remotion/web-renderer/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@remotion/zod-types/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], @@ -5101,8 +5010,6 @@ "@smithy/util-waiter/@smithy/core": ["@smithy/core@3.24.3", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-Ep/7tPamGY8mgESE3LyLKtxJyy6U52WWAqr/3wial47Sj4u3PiIF73AOGI27UyLy9duTkhZbgzodOfLV4TduZg=="], - "@tabler/icons-react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], @@ -5123,18 +5030,6 @@ "@tailwindcss/webpack/tailwindcss": ["tailwindcss@4.2.0", "", {}, "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q=="], - "@tanstack/react-query/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@tanstack/react-query-persist-client/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@tanstack/react-router/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@tanstack/react-router/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "@tanstack/react-store/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "@tanstack/react-store/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "@tanstack/router-generator/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@tanstack/router-plugin/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], @@ -5173,8 +5068,6 @@ "@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="], - "@xstate/react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "accepts/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], @@ -5199,10 +5092,6 @@ "better-auth/nanostores": ["nanostores@1.2.0", "", {}, "sha512-F0wCzbsH80G7XXo0Jd9/AVQC7ouWY6idUCTnMwW5t/Rv9W8qmO6endavDwg7TNp5GbugwSukFMVZqzPSrSMndg=="], - "better-auth/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "better-auth/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "better-auth/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "chalk-template/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -5213,10 +5102,6 @@ "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "cmdk/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "cmdk/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "color/color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="], "color-string/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], @@ -5239,8 +5124,6 @@ "eciesjs/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "embla-carousel-react/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "eslint/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], @@ -5291,10 +5174,6 @@ "image-q/@types/node": ["@types/node@16.9.1", "", {}, "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g=="], - "input-otp/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "input-otp/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "istanbul-reports/html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], @@ -5319,10 +5198,6 @@ "miniflare/ws": ["ws@8.20.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="], - "next-themes/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "next-themes/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "node-edge-tts/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "nostr-tools/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], @@ -5371,38 +5246,8 @@ "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], - "react-day-picker/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "react-hook-form/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "react-remove-scroll/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "react-remove-scroll-bar/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "react-resizable-panels/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "react-resizable-panels/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "react-smooth/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "react-smooth/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "react-style-singleton/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "react-transition-group/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "react-transition-group/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "recharts/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "recharts/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - - "remotion/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "remotion/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -5429,10 +5274,6 @@ "snowflake-sdk/open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], - "sonner/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "sonner/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -5449,18 +5290,6 @@ "type-is/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "use-callback-ref/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "use-isomorphic-layout-effect/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "use-sidecar/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "use-sync-external-store/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "vaul/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - - "vaul/react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], - "vite/postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], "vite/rolldown": ["rolldown@1.0.0-rc.11", "", { "dependencies": { "@oxc-project/types": "=0.122.0", "@rolldown/pluginutils": "1.0.0-rc.11" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.11", "@rolldown/binding-darwin-arm64": "1.0.0-rc.11", "@rolldown/binding-darwin-x64": "1.0.0-rc.11", "@rolldown/binding-freebsd-x64": "1.0.0-rc.11", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.11", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.11", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.11", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw=="], @@ -5491,8 +5320,6 @@ "@astrojs/react/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], - "@astrojs/react/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@astrojs/react/vite/postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], "@aws-crypto/crc32c/@aws-sdk/types/@smithy/types": ["@smithy/types@4.14.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw=="], @@ -5615,10 +5442,6 @@ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@base-ui/react/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@base-ui/utils/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@buape/carbon/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], "@cloudflare/vite-plugin/miniflare/undici": ["undici@7.24.8", "", {}, "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ=="], @@ -5699,8 +5522,6 @@ "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], - "@floating-ui/react-dom/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "@larksuiteoapi/node-sdk/axios/proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], @@ -5723,20 +5544,6 @@ "@matrix-org/matrix-sdk-crypto-nodejs/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "@onequery/ui/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@radix-ui/react-dialog/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@radix-ui/react-dismissable-layer/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@radix-ui/react-focus-scope/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@radix-ui/react-portal/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@radix-ui/react-presence/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@radix-ui/react-primitive/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@remotion/bundler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ=="], "@remotion/bundler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.0", "", { "os": "android", "cpu": "arm" }, "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g=="], @@ -5787,14 +5594,6 @@ "@remotion/bundler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ=="], - "@remotion/bundler/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@remotion/cli/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@remotion/media-utils/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@remotion/player/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@remotion/renderer/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], "@remotion/renderer/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], @@ -5805,8 +5604,6 @@ "@remotion/renderer/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "@remotion/renderer/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@remotion/renderer/source-map/whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], "@remotion/studio-server/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], @@ -5823,12 +5620,8 @@ "@remotion/studio/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "@remotion/studio/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@remotion/studio/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "@remotion/web-renderer/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@slack/logger/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], "@slack/oauth/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], @@ -5875,10 +5668,6 @@ "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ=="], - "@tanstack/react-router/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "@tanstack/react-store/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "@tanstack/router-plugin/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "@tanstack/router-plugin/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], @@ -5915,16 +5704,12 @@ "axios/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - "better-auth/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "cli-highlight/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], "cli-highlight/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cmdk/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "color/color-convert/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -6005,12 +5790,8 @@ "hast-util-raw/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - "input-otp/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "jest-worker/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], - "next-themes/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "node-edge-tts/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -6019,16 +5800,6 @@ "protobufjs/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], - "react-resizable-panels/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "react-smooth/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "react-transition-group/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "recharts/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - - "remotion/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "rollup-plugin-visualizer/yargs/cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], @@ -6065,16 +5836,12 @@ "snowflake-sdk/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "sonner/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "telegraf/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "vaul/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.122.0", "", {}, "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA=="], "vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.11", "", { "os": "android", "cpu": "arm64" }, "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A=="], diff --git a/package.json b/package.json index 7ba72f26..b0d1299e 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "nanostores": "1.3.0", "next-themes": "0.4.6", "pg": "8.20.0", - "react": "19.3.0-canary-d5736f09-20260507", - "react-dom": "19.3.0-canary-d5736f09-20260507", + "react": "19.2.3", + "react-dom": "19.2.3", "rehype-minify-whitespace": "6.0.2", "rehype-parse": "9.0.1", "rehype-remark": "10.0.1", diff --git a/packages/datetime/package.json b/packages/datetime/package.json index 4b6170d8..98448e05 100644 --- a/packages/datetime/package.json +++ b/packages/datetime/package.json @@ -14,5 +14,7 @@ "test": "vitest run", "test:watch": "vitest" }, - "devDependencies": {} + "devDependencies": { + "vitest": "catalog:testing" + } }