diff --git a/examples/cloudflare-workers/README.md b/examples/cloudflare-workers/README.md index 585a4750..f4a3f917 100644 --- a/examples/cloudflare-workers/README.md +++ b/examples/cloudflare-workers/README.md @@ -21,7 +21,15 @@ This writes these files into the project root: - `worker.js` - The bundled Cloudflare Worker - `wrangler.jsonc` - Wrangler configuration template (only if you don't already have `wrangler.toml/jsonc`) -3. Test locally with Wrangler: +3. Start development mode (watch + rebuild worker output) and Wrangler: + +```bash +pnpm dev +``` + +This runs `xmcp dev --cf` (rebuilds `worker.js`) and `wrangler dev` together. + +4. Test with curl: ```bash pnpm preview @@ -29,8 +37,6 @@ pnpm preview npx wrangler dev ``` -4. Test with curl: - ```bash # Health check curl http://localhost:8787/health diff --git a/examples/cloudflare-workers/package.json b/examples/cloudflare-workers/package.json index 94a2df7f..650e9e48 100644 --- a/examples/cloudflare-workers/package.json +++ b/examples/cloudflare-workers/package.json @@ -6,7 +6,7 @@ "type": "module", "scripts": { "build": "xmcp build --cf", - "dev": "xmcp dev", + "dev": "concurrently \"xmcp dev --cf\" \"npx wrangler dev\"", "deploy": "npx wrangler deploy", "preview": "npx wrangler dev" }, @@ -16,7 +16,8 @@ }, "devDependencies": { "@cloudflare/workers-types": "^4.20241112.0", + "concurrently": "^9.2.0", "typescript": "^5.7.2", - "wrangler": "^4.61.1" + "wrangler": "^4.62.0" } } diff --git a/packages/create-xmcp-app/src/helpers/cloudflare.ts b/packages/create-xmcp-app/src/helpers/cloudflare.ts index 5be34dd2..e71b8825 100644 --- a/packages/create-xmcp-app/src/helpers/cloudflare.ts +++ b/packages/create-xmcp-app/src/helpers/cloudflare.ts @@ -87,6 +87,10 @@ export function applyCloudflareSettings(projectPath: string): void { packageJson.scripts = packageJson.scripts ?? {}; packageJson.scripts.build = "xmcp build --cf"; + if (!packageJson.scripts.dev || packageJson.scripts.dev === "xmcp dev") { + packageJson.scripts.dev = + "concurrently \"xmcp dev --cf\" \"npx wrangler dev\""; + } packageJson.scripts.deploy = packageJson.scripts.deploy ?? "npx wrangler deploy"; packageJson.scripts.preview = @@ -97,6 +101,8 @@ export function applyCloudflareSettings(projectPath: string): void { } packageJson.devDependencies = packageJson.devDependencies ?? {}; + packageJson.devDependencies.concurrently = + packageJson.devDependencies.concurrently ?? "^9.2.0"; packageJson.devDependencies.wrangler = packageJson.devDependencies.wrangler ?? DEFAULT_WRANGLER_VERSION; packageJson.devDependencies["@cloudflare/workers-types"] = diff --git a/packages/xmcp/src/cli.ts b/packages/xmcp/src/cli.ts index 33406bc8..76bdb724 100644 --- a/packages/xmcp/src/cli.ts +++ b/packages/xmcp/src/cli.ts @@ -18,13 +18,16 @@ program.name("xmcp").description("The MCP framework CLI").version("0.0.1"); program .command("dev") .description("Start development mode") - .action(async () => { + .option("--cf", "Enable Cloudflare Workers output in development") + .action(async (options) => { console.log(`${xmcpLogo} Starting development mode...`); + const isCloudflareDev = options.cf || process.env.CF_PAGES === "1"; await compilerContextProvider( { mode: "development", - // Ignore platforms on dev mode - platforms: {}, + platforms: { + cloudflare: isCloudflareDev, + }, }, async () => { await compile(); diff --git a/packages/xmcp/src/compiler/index.ts b/packages/xmcp/src/compiler/index.ts index 1788a314..c80abd5f 100644 --- a/packages/xmcp/src/compiler/index.ts +++ b/packages/xmcp/src/compiler/index.ts @@ -33,6 +33,7 @@ import { isValidPath } from "@/utils/path-validation"; import { getResolvedPathsConfig } from "./config/utils"; import { pathToToolName } from "./utils/path-utils"; import { transpileClientComponent } from "./client/transpile"; +import { buildCloudflareOutput } from "../platforms/build-cloudflare-output"; const { version: XMCP_VERSION } = require("../../package.json"); dotenv.config(); @@ -43,7 +44,7 @@ export interface CompileOptions { } export async function compile({ onBuild }: CompileOptions = {}) { - const { mode, toolPaths, promptPaths, resourcePaths } = + const { mode, toolPaths, promptPaths, resourcePaths, platforms } = compilerContext.getContext(); const startTime = Date.now(); let compilerStarted = false; @@ -177,7 +178,7 @@ export async function compile({ onBuild }: CompileOptions = {}) { // Generate all code (including client bundles) BEFORE bundler runs await generateCode(); - rspack(bundlerConfig, (err, stats) => { + rspack(bundlerConfig, async (err, stats) => { // Track compilation time let compilationTime: number; if (stats?.endTime && stats?.startTime) { @@ -280,6 +281,17 @@ export async function compile({ onBuild }: CompileOptions = {}) { } } + if (mode === "development" && platforms.cloudflare) { + try { + await buildCloudflareOutput({ log: firstBuild }); + } catch (error) { + console.error( + chalk.red("❌ Failed to sync Cloudflare Workers output:"), + error + ); + } + } + if (mode === "production") { logBuildSuccess({ ...collectBaseTelemetryData(), diff --git a/packages/xmcp/src/platforms/build-cloudflare-output.ts b/packages/xmcp/src/platforms/build-cloudflare-output.ts index e7766c54..00ec8302 100644 --- a/packages/xmcp/src/platforms/build-cloudflare-output.ts +++ b/packages/xmcp/src/platforms/build-cloudflare-output.ts @@ -3,13 +3,20 @@ import fs from "fs"; const rootDir = process.cwd(); +interface BuildCloudflareOutputOptions { + log?: boolean; +} + /** * Build the Cloudflare Workers output structure. * Writes Cloudflare Worker files to the project root: * - worker.js * - wrangler.jsonc (only if not already present) */ -async function buildCloudflareOutput() { +async function buildCloudflareOutput( + options: BuildCloudflareOutputOptions = {} +) { + const { log = true } = options; const outputDir = rootDir; const buildDir = path.join(rootDir, ".xmcp", "cloudflare"); @@ -32,11 +39,13 @@ async function buildCloudflareOutput() { fs.writeFileSync(wranglerJsoncPath, wranglerConfig); } - console.log("Cloudflare Workers output structure created successfully"); - console.log(""); - console.log("Next steps:"); - console.log(" 1. npx wrangler dev # Test locally"); - console.log(" 2. npx wrangler deploy # Deploy to Cloudflare"); + if (log) { + console.log("Cloudflare Workers output structure created successfully"); + console.log(""); + console.log("Next steps:"); + console.log(" 1. npx wrangler dev # Test locally"); + console.log(" 2. npx wrangler deploy # Deploy to Cloudflare"); + } } /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c34fc128..f743175b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -415,12 +415,15 @@ importers: '@cloudflare/workers-types': specifier: ^4.20241112.0 version: 4.20260127.0 + concurrently: + specifier: ^9.2.0 + version: 9.2.1 typescript: specifier: ^5.7.2 version: 5.9.3 wrangler: - specifier: ^4.61.1 - version: 4.61.1(@cloudflare/workers-types@4.20260127.0) + specifier: ^4.62.0 + version: 4.62.0(@cloudflare/workers-types@4.20260127.0) examples/custom-bundler-config: dependencies: @@ -1575,32 +1578,32 @@ packages: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20260128.0': - resolution: {integrity: sha512-XJN8zWWNG3JwAUqqwMLNKJ9fZfdlQkx/zTTHW/BB8wHat9LjKD6AzxqCu432YmfjR+NxEKCzUOxMu1YOxlVxmg==} + '@cloudflare/workerd-darwin-64@1.20260131.0': + resolution: {integrity: sha512-+1X4qErc715NUhJZNhtlpuCxajhD5YNre7Cz50WPMmj+BMUrh9h7fntKEadtrUo5SM2YONY7CDzK7wdWbJJBVA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260128.0': - resolution: {integrity: sha512-vKnRcmnm402GQ5DOdfT5H34qeR2m07nhnTtky8mTkNWP+7xmkz32AMdclwMmfO/iX9ncyKwSqmml2wPG32eq/w==} + '@cloudflare/workerd-darwin-arm64@1.20260131.0': + resolution: {integrity: sha512-M84mXR8WEMEBuX4/dL2IQ4wHV/ALwYjx9if5ePZR8rdbD7if/fkEEoMBq0bGS/1gMLRqqCZLstabxHV+g92NNg==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20260128.0': - resolution: {integrity: sha512-RiaR+Qugof/c6oI5SagD2J5wJmIfI8wQWaV2Y9905Raj6sAYOFaEKfzkKnoLLLNYb4NlXicBrffJi1j7R/ypUA==} + '@cloudflare/workerd-linux-64@1.20260131.0': + resolution: {integrity: sha512-SWzr48bCL9y5wjkj23tXS6t/6us99EAH9T5TAscMV0hfJFZQt97RY/gaHKyRRjFv6jfJZvk7d4g+OmGeYBnwcg==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260128.0': - resolution: {integrity: sha512-U39U9vcXLXYDbrJ112Q7D0LDUUnM54oXfAxPgrL2goBwio7Z6RnsM25TRvm+Q06F4+FeDOC4D51JXlFHb9t1OA==} + '@cloudflare/workerd-linux-arm64@1.20260131.0': + resolution: {integrity: sha512-mL0kLPGIBJRPeHS3+erJ2t5dJT3ODhsKvR9aA4BcsY7M30/QhlgJIF6wsgwNisTJ23q8PbobZNHBUKIe8l/E9A==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20260128.0': - resolution: {integrity: sha512-fdJwSqRkJsAJFJ7+jy0th2uMO6fwaDA8Ny6+iFCssfzlNkc4dP/twXo+3F66FMLMe/6NIqjzVts0cpiv7ERYbQ==} + '@cloudflare/workerd-windows-64@1.20260131.0': + resolution: {integrity: sha512-hoQqTFBpP1zntP2OQSpt5dEWbd9vSBliK+G7LmDXjKitPkmkRFo2PB4P9aBRE1edPAIO/fpdoJv928k2HaAn4A==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -5083,6 +5086,9 @@ packages: caniuse-lite@1.0.30001760: resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} + caniuse-lite@1.0.30001767: + resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -5179,6 +5185,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -5239,6 +5249,11 @@ packages: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -6106,6 +6121,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} @@ -7222,8 +7241,8 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - miniflare@4.20260128.0: - resolution: {integrity: sha512-AVCn3vDRY+YXu1sP4mRn81ssno6VUqxo29uY2QVfgxXU2TMLvhRIoGwm7RglJ3Gzfuidit5R86CMQ6AvdFTGAw==} + miniflare@4.20260131.0: + resolution: {integrity: sha512-CtObRzlAzOUpCFH+MgImykxmDNKthrgIYtC+oLC3UGpve6bGLomKUW4u4EorTvzlQFHe66/9m/+AYbBbpzG0mQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -8027,6 +8046,10 @@ packages: remark@15.0.1: resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -8219,6 +8242,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + shiki@1.17.7: resolution: {integrity: sha512-Zf6hNtWhFyF4XP5OOsXkBTEx9JFPiN0TQx4wSe+Vqeuczewgk2vT4IZhF4gka55uelm052BD5BaHavNqUNZd+A==} @@ -8574,6 +8601,10 @@ packages: peerDependencies: tslib: '2' + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -8974,17 +9005,17 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerd@1.20260128.0: - resolution: {integrity: sha512-EhLJGptSGFi8AEErLiamO3PoGpbRqL+v4Ve36H2B38VxmDgFOSmDhfepBnA14sCQzGf1AEaoZX2DCwZsmO74yQ==} + workerd@1.20260131.0: + resolution: {integrity: sha512-4zZxOdWeActbRfydQQlj7vZ2ay01AjjNC4K3stjmWC3xZHeXeN3EAROwsWE83SZHhtw4rn18srrhtXoQvQMw3Q==} engines: {node: '>=16'} hasBin: true - wrangler@4.61.1: - resolution: {integrity: sha512-hfYQ16VLPkNi8xE1/V3052S2stM5e+vq3Idpt83sXoDC3R7R1CLgMkK6M6+Qp3G+9GVDNyHCkvohMPdfFTaD4Q==} + wrangler@4.62.0: + resolution: {integrity: sha512-DogP9jifqw85g33BqwF6m21YBW5J7+Ep9IJLgr6oqHU0RkA79JMN5baeWXdmnIWZl+VZh6bmtNtR+5/Djd32tg==} engines: {node: '>=20.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20260128.0 + '@cloudflare/workers-types': ^4.20260131.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -9067,6 +9098,10 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -9083,6 +9118,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -9488,25 +9527,25 @@ snapshots: '@cloudflare/kv-asset-handler@0.4.2': {} - '@cloudflare/unenv-preset@2.12.0(unenv@2.0.0-rc.24)(workerd@1.20260128.0)': + '@cloudflare/unenv-preset@2.12.0(unenv@2.0.0-rc.24)(workerd@1.20260131.0)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20260128.0 + workerd: 1.20260131.0 - '@cloudflare/workerd-darwin-64@1.20260128.0': + '@cloudflare/workerd-darwin-64@1.20260131.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260128.0': + '@cloudflare/workerd-darwin-arm64@1.20260131.0': optional: true - '@cloudflare/workerd-linux-64@1.20260128.0': + '@cloudflare/workerd-linux-64@1.20260131.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20260128.0': + '@cloudflare/workerd-linux-arm64@1.20260131.0': optional: true - '@cloudflare/workerd-windows-64@1.20260128.0': + '@cloudflare/workerd-windows-64@1.20260131.0': optional: true '@cloudflare/workers-types@4.20260127.0': {} @@ -12833,6 +12872,9 @@ snapshots: caniuse-lite@1.0.30001760: {} + caniuse-lite@1.0.30001767: + optional: true + ccount@2.0.1: {} chalk@4.1.2: @@ -12930,6 +12972,12 @@ snapshots: client-only@0.0.1: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clone@1.0.4: {} clsx@2.1.1: {} @@ -12977,6 +13025,15 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 + concurrently@9.2.1: + dependencies: + chalk: 4.1.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + consola@3.4.2: {} content-disposition@0.5.4: @@ -14182,6 +14239,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} get-intrinsic@1.3.0: @@ -15617,12 +15676,12 @@ snapshots: mimic-function@5.0.1: {} - miniflare@4.20260128.0: + miniflare@4.20260131.0: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.34.5 undici: 7.18.2 - workerd: 1.20260128.0 + workerd: 1.20260131.0 ws: 8.18.0 youch: 4.1.0-beta.10 transitivePeerDependencies: @@ -15732,7 +15791,7 @@ snapshots: dependencies: '@next/env': 15.5.9 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001760 + caniuse-lite: 1.0.30001767 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -15757,7 +15816,7 @@ snapshots: dependencies: '@next/env': 15.5.9 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001760 + caniuse-lite: 1.0.30001767 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -16570,6 +16629,8 @@ snapshots: transitivePeerDependencies: - supports-color + require-directory@2.1.1: {} + require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -16877,6 +16938,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + shiki@1.17.7: dependencies: '@shikijs/core': 1.17.7 @@ -17299,6 +17362,8 @@ snapshots: dependencies: tslib: 2.8.1 + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} troika-three-text@0.52.4(three@0.178.0): @@ -17811,24 +17876,24 @@ snapshots: word-wrap@1.2.5: {} - workerd@1.20260128.0: + workerd@1.20260131.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260128.0 - '@cloudflare/workerd-darwin-arm64': 1.20260128.0 - '@cloudflare/workerd-linux-64': 1.20260128.0 - '@cloudflare/workerd-linux-arm64': 1.20260128.0 - '@cloudflare/workerd-windows-64': 1.20260128.0 + '@cloudflare/workerd-darwin-64': 1.20260131.0 + '@cloudflare/workerd-darwin-arm64': 1.20260131.0 + '@cloudflare/workerd-linux-64': 1.20260131.0 + '@cloudflare/workerd-linux-arm64': 1.20260131.0 + '@cloudflare/workerd-windows-64': 1.20260131.0 - wrangler@4.61.1(@cloudflare/workers-types@4.20260127.0): + wrangler@4.62.0(@cloudflare/workers-types@4.20260127.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 - '@cloudflare/unenv-preset': 2.12.0(unenv@2.0.0-rc.24)(workerd@1.20260128.0) + '@cloudflare/unenv-preset': 2.12.0(unenv@2.0.0-rc.24)(workerd@1.20260131.0) blake3-wasm: 2.1.5 esbuild: 0.27.0 - miniflare: 4.20260128.0 + miniflare: 4.20260131.0 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20260128.0 + workerd: 1.20260131.0 optionalDependencies: '@cloudflare/workers-types': 4.20260127.0 fsevents: 2.3.3 @@ -17944,6 +18009,8 @@ snapshots: xtend@4.0.2: {} + y18n@5.0.8: {} + yallist@3.1.1: {} yallist@5.0.0: {} @@ -17952,6 +18019,16 @@ snapshots: yargs-parser@21.1.1: {} + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.3: {}