theokit 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/{actions-virtual-module-IY46EEEX.js → actions-virtual-module-DL74V6SR.js} +2 -2
  2. package/dist/actions-virtual-module-DL74V6SR.js.map +1 -0
  3. package/dist/{actions-virtual-module-XNHDNCZ6.js → actions-virtual-module-ZDD54ZZE.js} +2 -2
  4. package/dist/actions-virtual-module-ZDD54ZZE.js.map +1 -0
  5. package/dist/{app-typed-client-OUJO3V5J.js → app-typed-client-4GIKUKRT.js} +4 -4
  6. package/dist/app-typed-client-4GIKUKRT.js.map +1 -0
  7. package/dist/{app-typed-client-YOMWSA3F.js → app-typed-client-4M4NVSK3.js} +3 -3
  8. package/dist/app-typed-client-4M4NVSK3.js.map +1 -0
  9. package/dist/{aws-lambda-GKSTX6HD.js → aws-lambda-SCRGTGF5.js} +5 -5
  10. package/dist/aws-lambda-SCRGTGF5.js.map +1 -0
  11. package/dist/{build-2WZ6XXVY.js → build-R74EU6BP.js} +11 -11
  12. package/dist/build-R74EU6BP.js.map +1 -0
  13. package/dist/{bun-ISHSNFIO.js → bun-FURRCQMS.js} +7 -7
  14. package/dist/bun-FURRCQMS.js.map +1 -0
  15. package/dist/{chunk-FI7MPTJW.js → chunk-3IOFTG3L.js} +1 -1
  16. package/dist/chunk-3IOFTG3L.js.map +1 -0
  17. package/dist/{chunk-U6TPSW4L.js → chunk-DUKXQNM7.js} +2 -2
  18. package/dist/{chunk-4S2UCILN.js → chunk-FGOX37NB.js} +8 -8
  19. package/dist/chunk-FGOX37NB.js.map +1 -0
  20. package/dist/{chunk-MR7OLIC6.js → chunk-GPF64ENM.js} +2 -2
  21. package/dist/{chunk-4S6YHNG2.js → chunk-GUUWDMR2.js} +2 -2
  22. package/dist/chunk-GUUWDMR2.js.map +1 -0
  23. package/dist/{chunk-WEGALZEU.js → chunk-HDA6M7P4.js} +3 -3
  24. package/dist/{chunk-K4M64WD6.js → chunk-IZQN5CDS.js} +4 -4
  25. package/dist/chunk-IZQN5CDS.js.map +1 -0
  26. package/dist/{chunk-M2EY7KDR.js → chunk-JD7AQNJS.js} +15 -15
  27. package/dist/chunk-JD7AQNJS.js.map +1 -0
  28. package/dist/{chunk-5Z2727GV.js → chunk-KJLECZWQ.js} +1 -1
  29. package/dist/chunk-KJLECZWQ.js.map +1 -0
  30. package/dist/{chunk-LC5PYNJP.js → chunk-MWYSRZI4.js} +7 -7
  31. package/dist/chunk-MWYSRZI4.js.map +1 -0
  32. package/dist/{chunk-VBZCVFSA.js → chunk-P2RS3WWY.js} +2 -2
  33. package/dist/{chunk-R7OC6UDK.js → chunk-P3SGM4NR.js} +1 -1
  34. package/dist/chunk-P3SGM4NR.js.map +1 -0
  35. package/dist/{chunk-ABVITXFH.js → chunk-S74FECKW.js} +1 -1
  36. package/dist/{chunk-ABVITXFH.js.map → chunk-S74FECKW.js.map} +1 -1
  37. package/dist/{chunk-COXLEZCN.js → chunk-UVHRD33F.js} +1 -1
  38. package/dist/chunk-UVHRD33F.js.map +1 -0
  39. package/dist/{chunk-27LWMYNK.js → chunk-X32KQH5C.js} +2 -2
  40. package/dist/chunk-X32KQH5C.js.map +1 -0
  41. package/dist/{chunk-2F4FROEQ.js → chunk-X3VNROZ7.js} +17 -17
  42. package/dist/chunk-X3VNROZ7.js.map +1 -0
  43. package/dist/{chunk-Y4H3JNVK.js → chunk-YB5DJJ4U.js} +1 -1
  44. package/dist/chunk-YB5DJJ4U.js.map +1 -0
  45. package/dist/cli/index.js +8 -8
  46. package/dist/{cloudflare-OJGJ7R2D.js → cloudflare-IZ6VJ2OU.js} +7 -7
  47. package/dist/cloudflare-IZ6VJ2OU.js.map +1 -0
  48. package/dist/{deno-deploy-BHWKFTOW.js → deno-deploy-O73NBXIW.js} +6 -6
  49. package/dist/deno-deploy-O73NBXIW.js.map +1 -0
  50. package/dist/{dev-U4UDZFDB.js → dev-ZU46C5AZ.js} +8 -8
  51. package/dist/{dev-emit-HHP2XJXE.js → dev-emit-66FCOS7V.js} +4 -4
  52. package/dist/{dev-emit-5VPRCHOD.js → dev-emit-JBVINGHU.js} +3 -3
  53. package/dist/devtools/entry.js +3 -4
  54. package/dist/devtools/entry.js.map +1 -1
  55. package/dist/{docker-EZDA5FT7.js → docker-AZSJFLP2.js} +3 -3
  56. package/dist/docker-AZSJFLP2.js.map +1 -0
  57. package/dist/{index-DWWEdFh5.d.ts → index-CuHICqb9.d.ts} +2 -2
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.js +3 -3
  60. package/dist/{info-47VB62MV.js → info-CORLCPEJ.js} +4 -4
  61. package/dist/{netlify-GSNSJGMN.js → netlify-O7G3RLK4.js} +3 -3
  62. package/dist/netlify-O7G3RLK4.js.map +1 -0
  63. package/dist/{node-6I5B6RL3.js → node-LXPQLMVB.js} +3 -3
  64. package/dist/{openapi-NFLSNNVQ.js → openapi-TEOUOIJ2.js} +7 -7
  65. package/dist/registry-KW4F4D2L.js +25 -0
  66. package/dist/{routes-3A4XGIEJ.js → routes-GAXVWJUK.js} +6 -6
  67. package/dist/{schema-KZVOV333.js → schema-Z5VJ2I76.js} +3 -3
  68. package/dist/server/cron/index.js +2 -2
  69. package/dist/server/http/index.d.ts +1 -1
  70. package/dist/server/http/index.js +2 -2
  71. package/dist/server/index.d.ts +3 -3
  72. package/dist/server/index.js +18 -11
  73. package/dist/server/index.js.map +1 -1
  74. package/dist/server/jobs/index.d.ts +1 -1
  75. package/dist/server/jobs/index.js +2 -2
  76. package/dist/server/scan/index.d.ts +1 -1
  77. package/dist/server/scan/index.js +2 -2
  78. package/dist/{services-json-Z2QNGVPW.js → services-json-6SHWMYJH.js} +1 -1
  79. package/dist/services-json-6SHWMYJH.js.map +1 -0
  80. package/dist/{services-typed-client-T7M5VPBP.js → services-typed-client-ASZL7FQV.js} +2 -2
  81. package/dist/{start-QDRSRNXK.js → start-HGUNNF5X.js} +10 -10
  82. package/dist/start-HGUNNF5X.js.map +1 -0
  83. package/dist/{static-QI5NQT2X.js → static-EO73I4C7.js} +6 -6
  84. package/dist/static-EO73I4C7.js.map +1 -0
  85. package/dist/{theo-cloud-RSQCBNXL.js → theo-cloud-HBCYEODQ.js} +2 -2
  86. package/dist/theo-cloud-HBCYEODQ.js.map +1 -0
  87. package/dist/{vercel-TKPZK62A.js → vercel-GSFDMF7K.js} +4 -4
  88. package/dist/vercel-GSFDMF7K.js.map +1 -0
  89. package/dist/vite-plugin/index.js +3 -3
  90. package/dist/{vite-plugin-CR4JDFUQ.js → vite-plugin-TX5H4MB6.js} +8 -8
  91. package/package.json +1 -1
  92. package/dist/actions-virtual-module-IY46EEEX.js.map +0 -1
  93. package/dist/actions-virtual-module-XNHDNCZ6.js.map +0 -1
  94. package/dist/app-typed-client-OUJO3V5J.js.map +0 -1
  95. package/dist/app-typed-client-YOMWSA3F.js.map +0 -1
  96. package/dist/aws-lambda-GKSTX6HD.js.map +0 -1
  97. package/dist/build-2WZ6XXVY.js.map +0 -1
  98. package/dist/bun-ISHSNFIO.js.map +0 -1
  99. package/dist/chunk-27LWMYNK.js.map +0 -1
  100. package/dist/chunk-2F4FROEQ.js.map +0 -1
  101. package/dist/chunk-4S2UCILN.js.map +0 -1
  102. package/dist/chunk-4S6YHNG2.js.map +0 -1
  103. package/dist/chunk-5Z2727GV.js.map +0 -1
  104. package/dist/chunk-COXLEZCN.js.map +0 -1
  105. package/dist/chunk-FI7MPTJW.js.map +0 -1
  106. package/dist/chunk-K4M64WD6.js.map +0 -1
  107. package/dist/chunk-LC5PYNJP.js.map +0 -1
  108. package/dist/chunk-M2EY7KDR.js.map +0 -1
  109. package/dist/chunk-R7OC6UDK.js.map +0 -1
  110. package/dist/chunk-Y4H3JNVK.js.map +0 -1
  111. package/dist/cloudflare-OJGJ7R2D.js.map +0 -1
  112. package/dist/deno-deploy-BHWKFTOW.js.map +0 -1
  113. package/dist/docker-EZDA5FT7.js.map +0 -1
  114. package/dist/netlify-GSNSJGMN.js.map +0 -1
  115. package/dist/registry-QHEZ3BWB.js +0 -25
  116. package/dist/services-json-Z2QNGVPW.js.map +0 -1
  117. package/dist/start-QDRSRNXK.js.map +0 -1
  118. package/dist/static-QI5NQT2X.js.map +0 -1
  119. package/dist/theo-cloud-RSQCBNXL.js.map +0 -1
  120. package/dist/vercel-TKPZK62A.js.map +0 -1
  121. /package/dist/{chunk-U6TPSW4L.js.map → chunk-DUKXQNM7.js.map} +0 -0
  122. /package/dist/{chunk-MR7OLIC6.js.map → chunk-GPF64ENM.js.map} +0 -0
  123. /package/dist/{chunk-WEGALZEU.js.map → chunk-HDA6M7P4.js.map} +0 -0
  124. /package/dist/{chunk-VBZCVFSA.js.map → chunk-P2RS3WWY.js.map} +0 -0
  125. /package/dist/{dev-U4UDZFDB.js.map → dev-ZU46C5AZ.js.map} +0 -0
  126. /package/dist/{dev-emit-HHP2XJXE.js.map → dev-emit-66FCOS7V.js.map} +0 -0
  127. /package/dist/{dev-emit-5VPRCHOD.js.map → dev-emit-JBVINGHU.js.map} +0 -0
  128. /package/dist/{info-47VB62MV.js.map → info-CORLCPEJ.js.map} +0 -0
  129. /package/dist/{node-6I5B6RL3.js.map → node-LXPQLMVB.js.map} +0 -0
  130. /package/dist/{openapi-NFLSNNVQ.js.map → openapi-TEOUOIJ2.js.map} +0 -0
  131. /package/dist/{registry-QHEZ3BWB.js.map → registry-KW4F4D2L.js.map} +0 -0
  132. /package/dist/{routes-3A4XGIEJ.js.map → routes-GAXVWJUK.js.map} +0 -0
  133. /package/dist/{schema-KZVOV333.js.map → schema-Z5VJ2I76.js.map} +0 -0
  134. /package/dist/{services-typed-client-T7M5VPBP.js.map → services-typed-client-ASZL7FQV.js.map} +0 -0
  135. /package/dist/{vite-plugin-CR4JDFUQ.js.map → vite-plugin-TX5H4MB6.js.map} +0 -0
package/dist/cli/index.js CHANGED
@@ -6,12 +6,12 @@ import "../chunk-KT3MWNZG.js";
6
6
  import cac from "cac";
7
7
  var cli = cac("theokit");
8
8
  cli.command("dev", "Start development server").option("--port <port>", "Port number").action(async (options) => {
9
- const { devCommand } = await import("../dev-U4UDZFDB.js");
9
+ const { devCommand } = await import("../dev-ZU46C5AZ.js");
10
10
  await devCommand({ port: options.port ? Number(options.port) : void 0 });
11
11
  });
12
12
  cli.command("build", "Build for production").option("--target <target>", "Deploy target (node, vercel, cloudflare)").action(async (options) => {
13
13
  try {
14
- const { buildCommand } = await import("../build-2WZ6XXVY.js");
14
+ const { buildCommand } = await import("../build-R74EU6BP.js");
15
15
  await buildCommand({ target: options.target });
16
16
  } catch (err) {
17
17
  const msg = err instanceof Error ? err.message : String(err);
@@ -23,7 +23,7 @@ cli.command("build", "Build for production").option("--target <target>", "Deploy
23
23
  });
24
24
  cli.command("start", "Start production server").option("--port <port>", "Port number").action(async (options) => {
25
25
  try {
26
- const { startCommand } = await import("../start-QDRSRNXK.js");
26
+ const { startCommand } = await import("../start-HGUNNF5X.js");
27
27
  await startCommand({ port: options.port ? Number(options.port) : void 0 });
28
28
  } catch (err) {
29
29
  const msg = err instanceof Error ? err.message : String(err);
@@ -47,7 +47,7 @@ cli.command("generate <type> <name>", "Generate a route, action, page, ws, or co
47
47
  });
48
48
  cli.command("routes", "List all routes, actions, and WebSocket endpoints").action(async () => {
49
49
  try {
50
- const { routesCommand } = await import("../routes-3A4XGIEJ.js");
50
+ const { routesCommand } = await import("../routes-GAXVWJUK.js");
51
51
  await routesCommand();
52
52
  } catch (err) {
53
53
  const msg = err instanceof Error ? err.message : String(err);
@@ -88,7 +88,7 @@ cli.command("add <package>", "Install a known TheoKit adapter or plugin (whiteli
88
88
  await addCommand(pkg);
89
89
  });
90
90
  cli.command("info", "Print environment info (runtime, config, routes)").action(async () => {
91
- const { infoCommand } = await import("../info-47VB62MV.js");
91
+ const { infoCommand } = await import("../info-CORLCPEJ.js");
92
92
  await infoCommand();
93
93
  });
94
94
  cli.command(
@@ -96,7 +96,7 @@ cli.command(
96
96
  "Generate <distDir>/openapi.json from route schemas (opt-in via config.openapi)"
97
97
  ).option("--dry-run", "Print the document to stdout without writing to disk (EC-3)").action(async (options) => {
98
98
  try {
99
- const { openapiCommand } = await import("../openapi-NFLSNNVQ.js");
99
+ const { openapiCommand } = await import("../openapi-TEOUOIJ2.js");
100
100
  await openapiCommand({ dryRun: Boolean(options.dryRun) });
101
101
  } catch (err) {
102
102
  const msg = err instanceof Error ? err.message : String(err);
@@ -120,7 +120,7 @@ cli.command(
120
120
  return;
121
121
  }
122
122
  if (kind === "services-json-v1-to-v2" || kind === "services-json") {
123
- const { servicesJsonMigrateCommand } = await import("../services-json-Z2QNGVPW.js");
123
+ const { servicesJsonMigrateCommand } = await import("../services-json-6SHWMYJH.js");
124
124
  await servicesJsonMigrateCommand({
125
125
  dryRun: Boolean(options.dryRun),
126
126
  name: options.name
@@ -143,7 +143,7 @@ cli.command(
143
143
  });
144
144
  cli.command("docker", "Generate Dockerfile for production").option("--force", "Overwrite existing Dockerfile").action(async (options) => {
145
145
  try {
146
- const { dockerCommand } = await import("../docker-EZDA5FT7.js");
146
+ const { dockerCommand } = await import("../docker-AZSJFLP2.js");
147
147
  await dockerCommand({ force: options.force });
148
148
  } catch (err) {
149
149
  const msg = err instanceof Error ? err.message : String(err);
@@ -2,11 +2,11 @@
2
2
  import "tsx/esm";
3
3
  import {
4
4
  nodeAdapter
5
- } from "./chunk-LC5PYNJP.js";
5
+ } from "./chunk-MWYSRZI4.js";
6
6
  import {
7
7
  assertServicesUnsupported,
8
8
  readManifest
9
- } from "./chunk-27LWMYNK.js";
9
+ } from "./chunk-X32KQH5C.js";
10
10
  import "./chunk-KT3MWNZG.js";
11
11
 
12
12
  // src/adapters/cloudflare.ts
@@ -89,12 +89,12 @@ function renderWranglerToml() {
89
89
  return [
90
90
  `# Generated by Theo \u2014 Cloudflare Workers`,
91
91
  `name = "theo-app"`,
92
- `main = ".theo/cloudflare/worker.mjs"`,
92
+ `main = ".theokit/cloudflare/worker.mjs"`,
93
93
  `compatibility_date = "2025-09-01"`,
94
94
  `compatibility_flags = ["nodejs_compat"]`,
95
95
  ``,
96
96
  `[site]`,
97
- `bucket = ".theo/client"`,
97
+ `bucket = ".theokit/client"`,
98
98
  ``,
99
99
  `# Environment variables are set via wrangler secret or dashboard`,
100
100
  `# Example: wrangler secret put DATABASE_URL`
@@ -105,14 +105,14 @@ var cloudflareAdapter = {
105
105
  async build(config, cwd, ctx) {
106
106
  assertServicesUnsupported("cloudflare", readManifest(cwd));
107
107
  await nodeAdapter.build(config, cwd, ctx);
108
- const outputDir = resolve(cwd, ".theo/cloudflare");
108
+ const outputDir = resolve(cwd, ".theokit/cloudflare");
109
109
  mkdirSync(outputDir, { recursive: true });
110
110
  writeFileSync(
111
111
  resolve(outputDir, "worker.mjs"),
112
112
  renderCloudflareWorkerEntry({ ssrStreaming: config.ssrStreaming })
113
113
  );
114
114
  writeFileSync(resolve(cwd, "wrangler.toml"), renderWranglerToml());
115
- console.log("\n \u2713 Cloudflare output \u2192 .theo/cloudflare/ + wrangler.toml\n");
115
+ console.log("\n \u2713 Cloudflare output \u2192 .theokit/cloudflare/ + wrangler.toml\n");
116
116
  }
117
117
  };
118
118
  export {
@@ -120,4 +120,4 @@ export {
120
120
  renderCloudflareWorkerEntry,
121
121
  renderWranglerToml
122
122
  };
123
- //# sourceMappingURL=cloudflare-OJGJ7R2D.js.map
123
+ //# sourceMappingURL=cloudflare-IZ6VJ2OU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/cloudflare.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * Cloudflare deploy adapter. All write paths are under `cwd/.theokit/cloudflare/`\n * and `cwd/wrangler.toml`. Build-time tool — no HTTP input.\n */\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport type { TheoConfig } from '../config/schema.js'\nimport { assertServicesUnsupported, readManifest } from '../services/index.js'\n\nimport { nodeAdapter } from './node.js'\nimport type { AdapterBuildContext, DeployAdapter } from './types.js'\n\n/**\n * T2.1 — Cloudflare adapter rewritten to consume `theokit/adapters/web-shim`\n * instead of emitting an inline plain-object Request/Response shim. Reduces\n * template from ~50 lines to ~25 and centralizes maintenance.\n */\n\nexport function renderCloudflareWorkerEntry(opts: { ssrStreaming?: boolean } = {}): string {\n const streamingImport = opts.ssrStreaming\n ? `import { renderStreamingWeb } from '/@theo/entry-server'`\n : `// (ssrStreaming off: renderStreamingWeb not imported)`\n const nonApiBranch = opts.ssrStreaming\n ? ` // T2.3 — streaming SSR for non-API routes\\n return renderStreamingWeb(request)`\n : ` return notFoundResponse()`\n // CR-006: Workers lack `process.cwd()` and the `node:*` import surface\n // is brittle even under `nodejs_compat`. We use the Web Crypto\n // `crypto.randomUUID()` instead of `node:crypto.randomUUID`, and embed\n // the server directory as a build-time literal instead of resolving via\n // `node:path` at runtime.\n return [\n `// Generated by Theo — Cloudflare Workers Adapter`,\n `//`,\n `// REQUIREMENTS (EC-3):`,\n `// - wrangler.toml MUST include compatibility_flags = [\"nodejs_compat\"]`,\n `// (still required for transitive theokit/server deps, e.g. busboy)`,\n `// - package.json MUST list \"theokit\" in dependencies (not devDependencies)`,\n `// so Wrangler bundles theokit and its transitive deps`,\n `// - Deploy: wrangler deploy`,\n ``,\n `import { scanServerRoutes, matchRoute, executeRoute, createProductionLoader, scanWebSocketRoutes } from 'theokit/server'`,\n `import { createWebShim } from 'theokit/adapters/web-shim'`,\n `// T3.4 — WS bridge for Cloudflare Workers`,\n `import { createCloudflareWsBridge } from 'theokit/adapters/ws-shim'`,\n streamingImport,\n ``,\n `// Cold-start cache (avoid scanning routes on every request)`,\n `let routesCache = null`,\n `let wsRoutesCache = null`,\n `let loaderCache = null`,\n `// CR-006: server directory is a build-time literal — Workers cannot`,\n `// call process.cwd() and resolving paths at runtime returned '/server'.`,\n `const serverDir = 'server'`,\n ``,\n `function notFoundResponse() {`,\n ` return new Response(`,\n ` JSON.stringify({ error: { code: 'NOT_FOUND', message: 'Route not found' } }),`,\n ` { status: 404, headers: { 'Content-Type': 'application/json' } },`,\n ` )`,\n `}`,\n ``,\n `export default {`,\n ` async fetch(request, env, ctx) {`,\n ` const url = new URL(request.url)`,\n ``,\n ` // T3.4 — Detect WebSocket upgrade and delegate to the CF bridge`,\n ` if (request.headers.get('upgrade')?.toLowerCase() === 'websocket') {`,\n ` if (!wsRoutesCache) wsRoutesCache = scanWebSocketRoutes(serverDir)`,\n ` if (wsRoutesCache.length === 0) return notFoundResponse()`,\n ` const cfWs = createCloudflareWsBridge({`,\n ` onOpen: () => {},`,\n ` onMessage: (ws, data) => { ws.send(data) },`,\n ` onClose: () => {},`,\n ` })`,\n ` return cfWs.handle(request)`,\n ` }`,\n ``,\n ` if (!url.pathname.startsWith('/api/')) {`,\n nonApiBranch,\n ` }`,\n ``,\n ` if (!routesCache) routesCache = scanServerRoutes(serverDir)`,\n ` if (!loaderCache) loaderCache = createProductionLoader()`,\n ``,\n ` const match = matchRoute(url.pathname, routesCache)`,\n ` if (!match) return notFoundResponse()`,\n ``,\n ` const { req, res, toResponse } = createWebShim(request, { trustedProxy: 'platform' })`,\n ` const requestId = crypto.randomUUID()`,\n ` const method = request.method.toUpperCase()`,\n ` await executeRoute({`,\n ` route: match.route, method, params: match.params,`,\n ` req, res, loadModule: loaderCache, serverDir, requestId,`,\n ` })`,\n ` return toResponse()`,\n ` },`,\n `}`,\n ].join('\\n')\n}\n\nexport function renderWranglerToml(): string {\n return [\n `# Generated by Theo — Cloudflare Workers`,\n `name = \"theo-app\"`,\n `main = \".theokit/cloudflare/worker.mjs\"`,\n `compatibility_date = \"2025-09-01\"`,\n `compatibility_flags = [\"nodejs_compat\"]`,\n ``,\n `[site]`,\n `bucket = \".theokit/client\"`,\n ``,\n `# Environment variables are set via wrangler secret or dashboard`,\n `# Example: wrangler secret put DATABASE_URL`,\n ].join('\\n')\n}\n\nexport const cloudflareAdapter: DeployAdapter = {\n name: 'cloudflare',\n\n async build(config: TheoConfig, cwd: string, ctx?: AdapterBuildContext): Promise<void> {\n // Wave 2 (T2.2) — reject polyglot services on this adapter.\n assertServicesUnsupported('cloudflare', readManifest(cwd))\n\n // 1. Run the standard Node build first (ctx forwarded so nodeAdapter has makeVitePlugins)\n await nodeAdapter.build(config, cwd, ctx)\n\n const outputDir = resolve(cwd, '.theokit/cloudflare')\n mkdirSync(outputDir, { recursive: true })\n\n // 2. Emit Worker entry (now uses the shared web-shim)\n writeFileSync(\n resolve(outputDir, 'worker.mjs'),\n renderCloudflareWorkerEntry({ ssrStreaming: config.ssrStreaming }),\n )\n\n // 3. Emit wrangler.toml (with nodejs_compat enforced)\n writeFileSync(resolve(cwd, 'wrangler.toml'), renderWranglerToml())\n\n // eslint-disable-next-line no-console -- CLI build progress\n console.log('\\n ✓ Cloudflare output → .theokit/cloudflare/ + wrangler.toml\\n')\n },\n}\n"],"mappings":";;;;;;;;;;;;AAIA,SAAS,WAAW,qBAAqB;AACzC,SAAS,eAAe;AAcjB,SAAS,4BAA4B,OAAmC,CAAC,GAAW;AACzF,QAAM,kBAAkB,KAAK,eACzB,6DACA;AACJ,QAAM,eAAe,KAAK,eACtB;AAAA,4CACA;AAMJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,qBAA6B;AAC3C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,IAAM,oBAAmC;AAAA,EAC9C,MAAM;AAAA,EAEN,MAAM,MAAM,QAAoB,KAAa,KAA0C;AAErF,8BAA0B,cAAc,aAAa,GAAG,CAAC;AAGzD,UAAM,YAAY,MAAM,QAAQ,KAAK,GAAG;AAExC,UAAM,YAAY,QAAQ,KAAK,qBAAqB;AACpD,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAGxC;AAAA,MACE,QAAQ,WAAW,YAAY;AAAA,MAC/B,4BAA4B,EAAE,cAAc,OAAO,aAAa,CAAC;AAAA,IACnE;AAGA,kBAAc,QAAQ,KAAK,eAAe,GAAG,mBAAmB,CAAC;AAGjE,YAAQ,IAAI,4EAAkE;AAAA,EAChF;AACF;","names":[]}
@@ -2,11 +2,11 @@
2
2
  import "tsx/esm";
3
3
  import {
4
4
  nodeAdapter
5
- } from "./chunk-LC5PYNJP.js";
5
+ } from "./chunk-MWYSRZI4.js";
6
6
  import {
7
7
  assertServicesUnsupported,
8
8
  readManifest
9
- } from "./chunk-27LWMYNK.js";
9
+ } from "./chunk-X32KQH5C.js";
10
10
  import "./chunk-KT3MWNZG.js";
11
11
 
12
12
  // src/adapters/deno-deploy.ts
@@ -15,7 +15,7 @@ import { resolve } from "path";
15
15
  function renderDenoEntry(port) {
16
16
  return [
17
17
  `// Generated by Theo \u2014 Deno Deploy Adapter`,
18
- `// Deploy: deployctl deploy --project=<name> .theo/deno/server.ts`,
18
+ `// Deploy: deployctl deploy --project=<name> .theokit/deno/server.ts`,
19
19
  `// Requires Deno >= 1.40 (Deno.serve + npm: specifier support)`,
20
20
  ``,
21
21
  `// Runtime guard`,
@@ -84,7 +84,7 @@ async function buildDeno(config, cwd, deps = {}, ctx) {
84
84
  assertServicesUnsupported("deno-deploy", readManifest(cwd));
85
85
  const runNodeBuild = deps.runNodeBuild ?? nodeAdapter.build.bind(nodeAdapter);
86
86
  await runNodeBuild(config, cwd, ctx);
87
- const outputDir = resolve(cwd, ".theo/deno");
87
+ const outputDir = resolve(cwd, ".theokit/deno");
88
88
  const ensureDir = deps.ensureDir ?? ((p) => mkdirSync(p, { recursive: true }));
89
89
  ensureDir(outputDir);
90
90
  const entry = renderDenoEntry(config.port);
@@ -92,7 +92,7 @@ async function buildDeno(config, cwd, deps = {}, ctx) {
92
92
  writeFileSync(p, c);
93
93
  });
94
94
  write(resolve(outputDir, "server.ts"), entry);
95
- console.log("\n \u2713 Deno Deploy output \u2192 .theo/deno/server.ts\n");
95
+ console.log("\n \u2713 Deno Deploy output \u2192 .theokit/deno/server.ts\n");
96
96
  }
97
97
  var denoDeployAdapter = {
98
98
  name: "deno-deploy",
@@ -105,4 +105,4 @@ export {
105
105
  denoDeployAdapter,
106
106
  renderDenoEntry
107
107
  };
108
- //# sourceMappingURL=deno-deploy-BHWKFTOW.js.map
108
+ //# sourceMappingURL=deno-deploy-O73NBXIW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/deno-deploy.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * Deno Deploy adapter. Writes to `cwd/.theokit/deno-deploy/`. Build-time.\n */\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport type { TheoConfig } from '../config/schema.js'\nimport { assertServicesUnsupported, readManifest } from '../services/index.js'\n\nimport { nodeAdapter } from './node.js'\nimport type { AdapterBuildContext, DeployAdapter } from './types.js'\n\nexport interface DenoBuildDeps {\n runNodeBuild?: (config: TheoConfig, cwd: string, ctx?: AdapterBuildContext) => Promise<void>\n writeEntry?: (path: string, content: string) => void\n ensureDir?: (path: string) => void\n}\n\nexport function renderDenoEntry(port: number): string {\n return [\n `// Generated by Theo — Deno Deploy Adapter`,\n `// Deploy: deployctl deploy --project=<name> .theokit/deno/server.ts`,\n `// Requires Deno >= 1.40 (Deno.serve + npm: specifier support)`,\n ``,\n `// Runtime guard`,\n `if (typeof Deno === 'undefined') {`,\n ` throw new Error('TheoDenoDeployAdapter must run inside Deno.')`,\n `}`,\n ``,\n `// Use npm: specifier so Deno resolves theokit from the user's package.json`,\n `// equivalent (works in both local 'deno run' and Deno Deploy).`,\n `import { scanServerRoutes, matchRoute, executeRoute, createProductionLoader, scanWebSocketRoutes } from 'npm:theokit/server'`,\n `import { createWebShim } from 'npm:theokit/adapters/web-shim'`,\n `// T3.3 — WS bridge for Deno runtime`,\n `import { createDenoWsBridge } from 'npm:theokit/adapters/ws-shim'`,\n ``,\n `const port = Number(Deno.env.get('PORT') ?? '${port}')`,\n `const cwd = Deno.cwd()`,\n `const serverDir = cwd + '/server'`,\n `let routesCache = null`,\n `let wsRoutesCache = null`,\n `let loaderCache = null`,\n ``,\n `function notFound() {`,\n ` return new Response(JSON.stringify({ error: { code: 'NOT_FOUND' } }), {`,\n ` status: 404,`,\n ` headers: { 'Content-Type': 'application/json' },`,\n ` })`,\n `}`,\n ``,\n `Deno.serve({ port }, async (request) => {`,\n ` const url = new URL(request.url)`,\n ``,\n ` // T3.3 — Detect WebSocket upgrade and delegate to the Deno bridge`,\n ` if (request.headers.get('upgrade')?.toLowerCase() === 'websocket') {`,\n ` if (!wsRoutesCache) wsRoutesCache = scanWebSocketRoutes(serverDir)`,\n ` if (wsRoutesCache.length === 0) return notFound()`,\n ` const denoWs = createDenoWsBridge({`,\n ` onOpen: () => {},`,\n ` onMessage: (ws, data) => { ws.send(data) },`,\n ` onClose: () => {},`,\n ` }, Deno)`,\n ` return denoWs.handle(request)`,\n ` }`,\n ``,\n ` if (!url.pathname.startsWith('/api/')) {`,\n ` // Static + SPA fallback are served by Deno Deploy's static asset handler.`,\n ` return notFound()`,\n ` }`,\n ``,\n ` if (!routesCache) routesCache = scanServerRoutes(serverDir)`,\n ` if (!loaderCache) loaderCache = createProductionLoader()`,\n ``,\n ` const match = matchRoute(url.pathname, routesCache)`,\n ` if (!match) return notFound()`,\n ``,\n ` const { req, res, toResponse } = createWebShim(request)`,\n ` const requestId = crypto.randomUUID()`,\n ` const method = request.method.toUpperCase()`,\n ` await executeRoute({ route: match.route, method, params: match.params, req, res, loadModule: loaderCache, serverDir, requestId })`,\n ` return toResponse()`,\n `})`,\n ``,\n `console.log('Theo (Deno Deploy) listening on :' + port)`,\n ].join('\\n')\n}\n\nexport async function buildDeno(\n config: TheoConfig,\n cwd: string,\n deps: DenoBuildDeps = {},\n ctx?: AdapterBuildContext,\n): Promise<void> {\n // Wave 2 (T2.2) — reject polyglot services on this adapter.\n assertServicesUnsupported('deno-deploy', readManifest(cwd))\n\n const runNodeBuild = deps.runNodeBuild ?? nodeAdapter.build.bind(nodeAdapter)\n await runNodeBuild(config, cwd, ctx)\n\n const outputDir = resolve(cwd, '.theokit/deno')\n const ensureDir = deps.ensureDir ?? ((p: string) => mkdirSync(p, { recursive: true }))\n ensureDir(outputDir)\n\n const entry = renderDenoEntry(config.port)\n const write =\n deps.writeEntry ??\n ((p, c) => {\n writeFileSync(p, c)\n })\n write(resolve(outputDir, 'server.ts'), entry)\n\n // eslint-disable-next-line no-console -- CLI build progress\n console.log('\\n ✓ Deno Deploy output → .theokit/deno/server.ts\\n')\n}\n\nexport const denoDeployAdapter: DeployAdapter = {\n name: 'deno-deploy',\n build(config, cwd, ctx) {\n return buildDeno(config, cwd, {}, ctx)\n },\n}\n"],"mappings":";;;;;;;;;;;;AAGA,SAAS,WAAW,qBAAqB;AACzC,SAAS,eAAe;AAcjB,SAAS,gBAAgB,MAAsB;AACpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gDAAgD,IAAI;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAsB,UACpB,QACA,KACA,OAAsB,CAAC,GACvB,KACe;AAEf,4BAA0B,eAAe,aAAa,GAAG,CAAC;AAE1D,QAAM,eAAe,KAAK,gBAAgB,YAAY,MAAM,KAAK,WAAW;AAC5E,QAAM,aAAa,QAAQ,KAAK,GAAG;AAEnC,QAAM,YAAY,QAAQ,KAAK,eAAe;AAC9C,QAAM,YAAY,KAAK,cAAc,CAAC,MAAc,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpF,YAAU,SAAS;AAEnB,QAAM,QAAQ,gBAAgB,OAAO,IAAI;AACzC,QAAM,QACJ,KAAK,eACJ,CAAC,GAAG,MAAM;AACT,kBAAc,GAAG,CAAC;AAAA,EACpB;AACF,QAAM,QAAQ,WAAW,WAAW,GAAG,KAAK;AAG5C,UAAQ,IAAI,gEAAsD;AACpE;AAEO,IAAM,oBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,MAAM,QAAQ,KAAK,KAAK;AACtB,WAAO,UAAU,QAAQ,KAAK,CAAC,GAAG,GAAG;AAAA,EACvC;AACF;","names":[]}
@@ -8,20 +8,20 @@ import {
8
8
  } from "./chunk-HNBWZKIQ.js";
9
9
  import {
10
10
  theoPluginAsync
11
- } from "./chunk-M2EY7KDR.js";
12
- import "./chunk-ABVITXFH.js";
11
+ } from "./chunk-JD7AQNJS.js";
12
+ import "./chunk-S74FECKW.js";
13
13
  import {
14
14
  loadConfig,
15
15
  loadEnv
16
- } from "./chunk-U6TPSW4L.js";
17
- import "./chunk-4S2UCILN.js";
16
+ } from "./chunk-DUKXQNM7.js";
17
+ import "./chunk-FGOX37NB.js";
18
18
  import {
19
19
  orchestrateDev
20
- } from "./chunk-27LWMYNK.js";
20
+ } from "./chunk-X32KQH5C.js";
21
21
  import "./chunk-5ODOE6EF.js";
22
22
  import "./chunk-CG563V5M.js";
23
- import "./chunk-VBZCVFSA.js";
24
- import "./chunk-COXLEZCN.js";
23
+ import "./chunk-P2RS3WWY.js";
24
+ import "./chunk-UVHRD33F.js";
25
25
  import "./chunk-KT3MWNZG.js";
26
26
 
27
27
  // src/cli/commands/dev.ts
@@ -89,4 +89,4 @@ export {
89
89
  devCommand,
90
90
  startDevServer
91
91
  };
92
- //# sourceMappingURL=dev-U4UDZFDB.js.map
92
+ //# sourceMappingURL=dev-ZU46C5AZ.js.map
@@ -6,9 +6,9 @@ import {
6
6
  } from "./chunk-WGHJD6I7.js";
7
7
  import {
8
8
  generateManifest
9
- } from "./chunk-WEGALZEU.js";
10
- import "./chunk-VBZCVFSA.js";
11
- import "./chunk-COXLEZCN.js";
9
+ } from "./chunk-HDA6M7P4.js";
10
+ import "./chunk-P2RS3WWY.js";
11
+ import "./chunk-UVHRD33F.js";
12
12
  import "./chunk-KT3MWNZG.js";
13
13
 
14
14
  // src/vite-plugin/openapi-emit/dev-emit.ts
@@ -41,4 +41,4 @@ export {
41
41
  _resetInFlightForTests,
42
42
  reEmitOpenApi
43
43
  };
44
- //# sourceMappingURL=dev-emit-HHP2XJXE.js.map
44
+ //# sourceMappingURL=dev-emit-66FCOS7V.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  generateManifest
3
- } from "./chunk-MR7OLIC6.js";
3
+ } from "./chunk-GPF64ENM.js";
4
4
  import "./chunk-OLPB36O2.js";
5
- import "./chunk-R7OC6UDK.js";
5
+ import "./chunk-P3SGM4NR.js";
6
6
  import "./chunk-WSJKACWB.js";
7
7
  import "./chunk-X2VVCJ4V.js";
8
8
  import "./chunk-DGUM43GV.js";
@@ -284,4 +284,4 @@ export {
284
284
  _resetInFlightForTests,
285
285
  reEmitOpenApi
286
286
  };
287
- //# sourceMappingURL=dev-emit-5VPRCHOD.js.map
287
+ //# sourceMappingURL=dev-emit-JBVINGHU.js.map
@@ -447,7 +447,7 @@ function methodColor(method) {
447
447
  }
448
448
 
449
449
  // src/devtools/assets/logo-data.ts
450
- var THEO_LOGO_BASE64 = "data:image/png;base64,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";
450
+ var THEO_LOGO_BASE64 = "data:image/png;base64,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";
451
451
 
452
452
  // src/devtools/components/TheoLogo.tsx
453
453
  import { jsx } from "react/jsx-runtime";
@@ -456,13 +456,12 @@ function TheoLogo({ size = 18 }) {
456
456
  "img",
457
457
  {
458
458
  src: THEO_LOGO_BASE64,
459
- alt: "Theo",
459
+ alt: "TheoKit",
460
460
  width: size,
461
461
  height: size,
462
462
  style: {
463
463
  display: "inline-block",
464
- flexShrink: 0,
465
- imageRendering: "pixelated"
464
+ flexShrink: 0
466
465
  }
467
466
  }
468
467
  );