@aihu/adapter-cloudflare 0.1.9 → 1.0.0
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.
- package/README.md +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ npm install @aihu/adapter-cloudflare
|
|
|
21
21
|
bun add @aihu/adapter-cloudflare
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@0.
|
|
24
|
+
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@1.0.0`.</i></sub>
|
|
25
25
|
|
|
26
26
|
<!-- END_AUTOGEN: install -->
|
|
27
27
|
|
|
@@ -32,12 +32,12 @@ bun add @aihu/adapter-cloudflare
|
|
|
32
32
|
|
|
33
33
|
| | |
|
|
34
34
|
|---|---|
|
|
35
|
-
| **Version** | `0.
|
|
35
|
+
| **Version** | `1.0.0` |
|
|
36
36
|
| **Tier** | B — Meta-framework — Cloudflare Workers/Pages deploy adapter |
|
|
37
37
|
| **Published files** | 3 entries |
|
|
38
38
|
| **License** | MIT |
|
|
39
39
|
|
|
40
|
-
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@0.
|
|
40
|
+
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@1.0.0`.</i></sub>
|
|
41
41
|
|
|
42
42
|
<!-- END_AUTOGEN: stats -->
|
|
43
43
|
|
|
@@ -50,7 +50,7 @@ bun add @aihu/adapter-cloudflare
|
|
|
50
50
|
|---|---|---|
|
|
51
51
|
| `.` | `./dist/index.js` | `—` |
|
|
52
52
|
|
|
53
|
-
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@0.
|
|
53
|
+
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@1.0.0`.</i></sub>
|
|
54
54
|
|
|
55
55
|
<!-- END_AUTOGEN: exports -->
|
|
56
56
|
|
|
@@ -64,7 +64,7 @@ bun add @aihu/adapter-cloudflare
|
|
|
64
64
|
- `@aihu/app` — `workspace:*`
|
|
65
65
|
- `vite` — `>=5.0.0`
|
|
66
66
|
|
|
67
|
-
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@0.
|
|
67
|
+
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@1.0.0`.</i></sub>
|
|
68
68
|
|
|
69
69
|
<!-- END_AUTOGEN: deps -->
|
|
70
70
|
|
|
@@ -77,7 +77,7 @@ bun add @aihu/adapter-cloudflare
|
|
|
77
77
|
- [@aihu/server](../server)
|
|
78
78
|
- [Aihu framework root](../../README.md)
|
|
79
79
|
|
|
80
|
-
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@0.
|
|
80
|
+
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@1.0.0`.</i></sub>
|
|
81
81
|
|
|
82
82
|
<!-- END_AUTOGEN: see-also -->
|
|
83
83
|
|
|
@@ -88,6 +88,6 @@ bun add @aihu/adapter-cloudflare
|
|
|
88
88
|
|
|
89
89
|
MIT — see [LICENSE](../../LICENSE).
|
|
90
90
|
|
|
91
|
-
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@0.
|
|
91
|
+
<sub><i>Auto-generated against `@aihu/adapter-cloudflare@1.0.0`.</i></sub>
|
|
92
92
|
|
|
93
93
|
<!-- END_AUTOGEN: license -->
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;UAYiB,wBAAA;;AAAjB;;;EAKE,IAAA;EAAA;;;;;;EAOA,IAAA;EAwKwB;;;;;EAlKxB,gBAAA;EAkKyE;;;;;;;;;;;;EArJzE,GAAA;AAAA;;;;;;;;;;;;;;;;iBAqJc,UAAA,CAAW,OAAA,GAAU,wBAAA,GAA2B,WAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import{existsSync as e,readFileSync as t}from"node:fs";import{resolve as n}from"node:path";function r(r){let i=n(r,`package.json`);if(!e(i))return null;try{let e=JSON.parse(t(i,`utf8`));return typeof e.name==`string`?e.name:null}catch{return null}}function i(){return[`// AUTO-GENERATED by @aihu/adapter-cloudflare — do not edit`,`// Cloudflare Workers entry — SPA mode`,`//`,`// All page requests are served from the ASSETS binding (Cloudflare CDN).`,`// For SSR mode use: cloudflare({ ssr: true })`,``,`export default {`,` async fetch(request, env, _ctx) {`,` try {`,` return await env.ASSETS.fetch(request)`,` } catch {`,` // Fallback to index.html for client-side routing (404 from ASSETS).`,` const url = new URL(request.url)`,` const indexUrl = new URL('/index.html', url.origin)`,` return env.ASSETS.fetch(new Request(indexUrl, request))`,` }`,` },`,`}`].join(`
|
|
2
2
|
`)}function a(e){return[`// AUTO-GENERATED by @aihu/adapter-cloudflare — do not edit`,`// Cloudflare Workers entry — SSR + static hybrid`,`//`,`// Route priority:`,`// 1. SSR handler — your aihu routes (API, agent-readiness, server-rendered pages)`,`// 2. ASSETS — pre-rendered static files served from Cloudflare CDN`,`// 3. /index.html — SPA shell fallback for client-side-routed pages`,``,e,``,`export default {`,` async fetch(request, env, _ctx) {`,` // SSR: try your server routes first`,` const response = await handler(request, { env })`,` if (response.status !== 404) return response`,``,` // Static: pre-rendered pages and assets from ASSETS binding`,` try {`,` return await env.ASSETS.fetch(request)`,` } catch {`,` // SPA shell fallback for client-side routing`,` const url = new URL(request.url)`,` return env.ASSETS.fetch(new Request(new URL('/index.html', url.origin), request))`,` }`,` },`,`}`].join(`
|
|
3
|
-
`)}function o(e){return
|
|
4
|
-
`)}
|
|
3
|
+
`)}function o(e){let t=e.map(e=>{let t=e,n={pattern:t.pattern,segments:t.segments};return typeof t.name==`string`&&(n.name=t.name),typeof t.ssr==`boolean`&&(n.ssr=t.ssr),n});return[`// AUTO-GENERATED by @aihu/adapter-cloudflare — do not edit`,`// Routes manifest consumed by the SSR worker handler.`,`//`,"// `routes` is the default export and is wired into createRequestRouter via","// `const _manifest = { routes }`. Each route carries a `pattern` (required",`// by the router) plus serialized metadata. The page component itself is not`,`// serializable, so each route uses a placeholder handler that 404s, letting`,`// the worker fall through to the ASSETS binding (pre-rendered static files).`,``,`const notFound = () => new Response(null, { status: 404 })`,``,`const routes = ${JSON.stringify(t,null,2)}.map((route) => ({`,` ...route,`,` handler: notFound,`,`}))`,``,`export default routes`,``].join(`
|
|
4
|
+
`)}function s(e){return`${[`# AUTO-GENERATED by @aihu/adapter-cloudflare`,`# Edit this file to customize your Worker configuration.`,`# Reference: https://developers.cloudflare.com/workers/wrangler/configuration/`,``,`name = "${e}"`,`main = "_worker.js"`,`compatibility_date = "2024-01-01"`,``,`[assets]`,`directory = "."`,`binding = "ASSETS"`].join(`
|
|
5
|
+
`)}\n`}function c(t){return{name:`cloudflare`,async adapt(c){let l=t?.name??r(c.root)??`aihu-app`,u=t?.ssr===!0,d=`./routes-manifest.js`;if(u){let e=d.replace(/^\.\//,``);await c.emitFile(e,o(c.routes)),console.log(`[@aihu/adapter-cloudflare] Wrote ${e} (${c.routes.length} route(s))`)}let f=u?a(c.createHandlerSource({routesSpecifier:d})):i();await c.emitFile(`_worker.js`,f),console.log(`[@aihu/adapter-cloudflare] Wrote _worker.js (${u?`SSR hybrid`:`SPA`} mode)`);let p=n(c.root,`wrangler.toml`);if(t?.generateWrangler!==!1&&!e(p)){let e=s(l);await c.writeFile(p,e),console.log(`[@aihu/adapter-cloudflare] Created wrangler.toml (name = "${l}")`)}console.log(`[@aihu/adapter-cloudflare] Build complete → ${c.outDir}`),console.log(`[@aihu/adapter-cloudflare] Deploy with: wrangler deploy --config wrangler.toml`)}}}export{c as cloudflare};
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["resolvePath"],"sources":["../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { resolve as resolvePath } from 'node:path'\nimport type { AdapterContext, AihuAdapter } from '@aihu/app'\n\nexport interface CloudflareAdapterOptions {\n /**\n * Cloudflare Worker name. Used in generated wrangler.toml.\n * Default: value of \"name\" in the project's package.json, or 'aihu-app'.\n */\n name?: string\n /**\n * Deployment mode.\n * - 'workers': Cloudflare Workers with static assets via env.ASSETS binding\n * - 'pages': Cloudflare Pages (_worker.js convention — same output, different deploy target)\n * Default: 'workers'\n */\n mode?: 'workers' | 'pages'\n /**\n * Whether to write wrangler.toml in the project root if it does not exist.\n * Never overwrites an existing wrangler.toml.\n * Default: true\n */\n generateWrangler?: boolean\n /**\n * Enable SSR + static hybrid mode.\n *\n * When true, the generated `_worker.js` calls your aihu server handler first\n * (SSR routes, API routes, agent-readiness endpoints), then falls back to\n * Cloudflare's ASSETS binding for pre-rendered static files, and finally\n * falls back to `/index.html` for client-side-routed SPA pages.\n *\n * Route priority: SSR handler → ASSETS (CDN edge) → /index.html (SPA shell)\n *\n * Default: false (SPA-only mode, all requests served from ASSETS)\n */\n ssr?: boolean\n}\n\nfunction readPackageJsonName(root: string): string | null {\n const pkgPath = resolvePath(root, 'package.json')\n if (!existsSync(pkgPath)) return null\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { name?: string }\n return typeof pkg.name === 'string' ? pkg.name : null\n } catch {\n return null\n }\n}\n\nfunction generateWorkerEntry(): string {\n return [\n '// AUTO-GENERATED by @aihu/adapter-cloudflare — do not edit',\n '// Cloudflare Workers entry — SPA mode',\n '//',\n '// All page requests are served from the ASSETS binding (Cloudflare CDN).',\n '// For SSR mode use: cloudflare({ ssr: true })',\n '',\n 'export default {',\n ' async fetch(request, env, _ctx) {',\n ' try {',\n ' return await env.ASSETS.fetch(request)',\n ' } catch {',\n ' // Fallback to index.html for client-side routing (404 from ASSETS).',\n ' const url = new URL(request.url)',\n \" const indexUrl = new URL('/index.html', url.origin)\",\n ' return env.ASSETS.fetch(new Request(indexUrl, request))',\n ' }',\n ' },',\n '}',\n ].join('\\n')\n}\n\nfunction generateSsrWorkerEntry(handlerSource: string): string {\n return [\n '// AUTO-GENERATED by @aihu/adapter-cloudflare — do not edit',\n '// Cloudflare Workers entry — SSR + static hybrid',\n '//',\n '// Route priority:',\n '// 1. SSR handler — your aihu routes (API, agent-readiness, server-rendered pages)',\n '// 2. ASSETS — pre-rendered static files served from Cloudflare CDN',\n '// 3. /index.html — SPA shell fallback for client-side-routed pages',\n '',\n handlerSource,\n '',\n 'export default {',\n ' async fetch(request, env, _ctx) {',\n ' // SSR: try your server routes first',\n ' const response = await handler(request, { env })',\n ' if (response.status !== 404) return response',\n '',\n ' // Static: pre-rendered pages and assets from ASSETS binding',\n ' try {',\n ' return await env.ASSETS.fetch(request)',\n ' } catch {',\n ' // SPA shell fallback for client-side routing',\n ' const url = new URL(request.url)',\n \" return env.ASSETS.fetch(new Request(new URL('/index.html', url.origin), request))\",\n ' }',\n ' },',\n '}',\n ].join('\\n')\n}\n\nfunction generateWranglerToml(name: string): string {\n return `${[\n '# AUTO-GENERATED by @aihu/adapter-cloudflare',\n '# Edit this file to customize your Worker configuration.',\n '# Reference: https://developers.cloudflare.com/workers/wrangler/configuration/',\n '',\n `name = \"${name}\"`,\n 'main = \"_worker.js\"',\n 'compatibility_date = \"2024-01-01\"',\n '',\n '[assets]',\n 'directory = \".\"',\n 'binding = \"ASSETS\"',\n ].join('\\n')}\\n`\n}\n\n/**\n * Cloudflare Workers / Pages adapter for aihu.\n *\n * Writes `_worker.js` to the Vite output directory and optionally creates\n * `wrangler.toml` in the project root (if absent).\n *\n * @example\n * // aihu.config.ts\n * import { defineConfig } from '@aihu/app'\n * import { cloudflare } from '@aihu/adapter-cloudflare'\n *\n * export default defineConfig({\n * adapter: cloudflare({ name: 'my-worker' }),\n * })\n */\nexport function cloudflare(options?: CloudflareAdapterOptions): AihuAdapter {\n return {\n name: 'cloudflare',\n\n async adapt(context: AdapterContext): Promise<void> {\n const workerName = options?.name ?? readPackageJsonName(context.root) ?? 'aihu-app'\n const ssrEnabled = options?.ssr === true\n\n // Step 1 — Write _worker.js\n const workerEntry = ssrEnabled\n ? generateSsrWorkerEntry(context.createHandlerSource())\n : generateWorkerEntry()\n await context.emitFile('_worker.js', workerEntry)\n console.log(\n `[@aihu/adapter-cloudflare] Wrote _worker.js (${ssrEnabled ? 'SSR hybrid' : 'SPA'} mode)`,\n )\n\n // Step 2 — Write wrangler.toml (only if absent, never overwrites)\n const wranglerPath = resolvePath(context.root, 'wrangler.toml')\n if (options?.generateWrangler !== false && !existsSync(wranglerPath)) {\n const toml = generateWranglerToml(workerName)\n await context.writeFile(wranglerPath, toml)\n console.log(`[@aihu/adapter-cloudflare] Created wrangler.toml (name = \"${workerName}\")`)\n }\n\n console.log(`[@aihu/adapter-cloudflare] Build complete → ${context.outDir}`)\n console.log(`[@aihu/adapter-cloudflare] Deploy with: wrangler deploy --config wrangler.toml`)\n },\n }\n}\n"],"mappings":"2FAsCA,SAAS,EAAoB,EAA6B,CACxD,IAAM,EAAUA,EAAY,EAAM,eAAe,CACjD,GAAI,CAAC,EAAW,EAAQ,CAAE,OAAO,KACjC,GAAI,CACF,IAAM,EAAM,KAAK,MAAM,EAAa,EAAS,OAAO,CAAC,CACrD,OAAO,OAAO,EAAI,MAAS,SAAW,EAAI,KAAO,UAC3C,CACN,OAAO,MAIX,SAAS,GAA8B,CACrC,MAAO,CACL,8DACA,yCACA,KACA,4EACA,iDACA,GACA,mBACA,sCACA,YACA,+CACA,gBACA,6EACA,yCACA,4DACA,gEACA,QACA,OACA,IACD,CAAC,KAAK;EAAK,CAGd,SAAS,EAAuB,EAA+B,CAC7D,MAAO,CACL,8DACA,oDACA,KACA,qBACA,wFACA,8EACA,yEACA,GACA,EACA,GACA,mBACA,sCACA,2CACA,uDACA,mDACA,GACA,mEACA,YACA,+CACA,gBACA,sDACA,yCACA,0FACA,QACA,OACA,IACD,CAAC,KAAK;EAAK,CAGd,SAAS,EAAqB,EAAsB,CAClD,MAAO,GAAG,CACR,+CACA,2DACA,iFACA,GACA,WAAW,EAAK,GAChB,sBACA,oCACA,GACA,WACA,kBACA,qBACD,CAAC,KAAK;EAAK,CAAC,IAkBf,SAAgB,EAAW,EAAiD,CAC1E,MAAO,CACL,KAAM,aAEN,MAAM,MAAM,EAAwC,CAClD,IAAM,EAAa,GAAS,MAAQ,EAAoB,EAAQ,KAAK,EAAI,WACnE,EAAa,GAAS,MAAQ,GAG9B,EAAc,EAChB,EAAuB,EAAQ,qBAAqB,CAAC,CACrD,GAAqB,CACzB,MAAM,EAAQ,SAAS,aAAc,EAAY,CACjD,QAAQ,IACN,gDAAgD,EAAa,aAAe,MAAM,QACnF,CAGD,IAAM,EAAeA,EAAY,EAAQ,KAAM,gBAAgB,CAC/D,GAAI,GAAS,mBAAqB,IAAS,CAAC,EAAW,EAAa,CAAE,CACpE,IAAM,EAAO,EAAqB,EAAW,CAC7C,MAAM,EAAQ,UAAU,EAAc,EAAK,CAC3C,QAAQ,IAAI,6DAA6D,EAAW,IAAI,CAG1F,QAAQ,IAAI,+CAA+C,EAAQ,SAAS,CAC5E,QAAQ,IAAI,iFAAiF,EAEhG"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["resolvePath"],"sources":["../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { resolve as resolvePath } from 'node:path'\nimport type { AdapterContext, AihuAdapter } from '@aihu/app'\n\n/**\n * A single route as exposed on AdapterContext.routes. We derive the element\n * type from the context interface so the adapter never takes a direct\n * dependency on @aihu/router. The non-serializable `module()` function is\n * irrelevant at adapt() time and is dropped from the emitted manifest.\n */\ntype ContextRoute = AdapterContext['routes'][number]\n\nexport interface CloudflareAdapterOptions {\n /**\n * Cloudflare Worker name. Used in generated wrangler.toml.\n * Default: value of \"name\" in the project's package.json, or 'aihu-app'.\n */\n name?: string\n /**\n * Deployment mode.\n * - 'workers': Cloudflare Workers with static assets via env.ASSETS binding\n * - 'pages': Cloudflare Pages (_worker.js convention — same output, different deploy target)\n * Default: 'workers'\n */\n mode?: 'workers' | 'pages'\n /**\n * Whether to write wrangler.toml in the project root if it does not exist.\n * Never overwrites an existing wrangler.toml.\n * Default: true\n */\n generateWrangler?: boolean\n /**\n * Enable SSR + static hybrid mode.\n *\n * When true, the generated `_worker.js` calls your aihu server handler first\n * (SSR routes, API routes, agent-readiness endpoints), then falls back to\n * Cloudflare's ASSETS binding for pre-rendered static files, and finally\n * falls back to `/index.html` for client-side-routed SPA pages.\n *\n * Route priority: SSR handler → ASSETS (CDN edge) → /index.html (SPA shell)\n *\n * Default: false (SPA-only mode, all requests served from ASSETS)\n */\n ssr?: boolean\n}\n\nfunction readPackageJsonName(root: string): string | null {\n const pkgPath = resolvePath(root, 'package.json')\n if (!existsSync(pkgPath)) return null\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { name?: string }\n return typeof pkg.name === 'string' ? pkg.name : null\n } catch {\n return null\n }\n}\n\nfunction generateWorkerEntry(): string {\n return [\n '// AUTO-GENERATED by @aihu/adapter-cloudflare — do not edit',\n '// Cloudflare Workers entry — SPA mode',\n '//',\n '// All page requests are served from the ASSETS binding (Cloudflare CDN).',\n '// For SSR mode use: cloudflare({ ssr: true })',\n '',\n 'export default {',\n ' async fetch(request, env, _ctx) {',\n ' try {',\n ' return await env.ASSETS.fetch(request)',\n ' } catch {',\n ' // Fallback to index.html for client-side routing (404 from ASSETS).',\n ' const url = new URL(request.url)',\n \" const indexUrl = new URL('/index.html', url.origin)\",\n ' return env.ASSETS.fetch(new Request(indexUrl, request))',\n ' }',\n ' },',\n '}',\n ].join('\\n')\n}\n\nfunction generateSsrWorkerEntry(handlerSource: string): string {\n return [\n '// AUTO-GENERATED by @aihu/adapter-cloudflare — do not edit',\n '// Cloudflare Workers entry — SSR + static hybrid',\n '//',\n '// Route priority:',\n '// 1. SSR handler — your aihu routes (API, agent-readiness, server-rendered pages)',\n '// 2. ASSETS — pre-rendered static files served from Cloudflare CDN',\n '// 3. /index.html — SPA shell fallback for client-side-routed pages',\n '',\n handlerSource,\n '',\n 'export default {',\n ' async fetch(request, env, _ctx) {',\n ' // SSR: try your server routes first',\n ' const response = await handler(request, { env })',\n ' if (response.status !== 404) return response',\n '',\n ' // Static: pre-rendered pages and assets from ASSETS binding',\n ' try {',\n ' return await env.ASSETS.fetch(request)',\n ' } catch {',\n ' // SPA shell fallback for client-side routing',\n ' const url = new URL(request.url)',\n \" return env.ASSETS.fetch(new Request(new URL('/index.html', url.origin), request))\",\n ' }',\n ' },',\n '}',\n ].join('\\n')\n}\n\n/**\n * Generate the source text of `routes-manifest.js`.\n *\n * The SSR worker's handler does `import routes from './routes-manifest.js'`\n * and then `createRequestRouter({ routes })`. So this module MUST provide a\n * default export that is an array of route entries, each carrying at least a\n * `pattern` (required by createRequestRouter) and a `handler`.\n *\n * The page component referenced by each route lives behind a non-serializable\n * `module()` thunk on AdapterContext.routes, so it cannot be inlined here.\n * Each emitted route therefore gets a placeholder handler that returns a 404,\n * which causes the worker to fall through to the ASSETS binding (pre-rendered\n * static pages) — preserving today's behavior while making the worker boot.\n * The serializable route metadata (pattern, segments, name, ssr) is preserved\n * in the manifest for transparency and future SSR wiring.\n */\nfunction generateRoutesManifest(routes: ReadonlyArray<ContextRoute>): string {\n const serialized = routes.map((route) => {\n const r = route as ContextRoute & { name?: string; ssr?: boolean }\n const entry: { pattern: string; segments: unknown; name?: string; ssr?: boolean } = {\n pattern: r.pattern,\n segments: r.segments,\n }\n if (typeof r.name === 'string') entry.name = r.name\n if (typeof r.ssr === 'boolean') entry.ssr = r.ssr\n return entry\n })\n\n return [\n '// AUTO-GENERATED by @aihu/adapter-cloudflare — do not edit',\n '// Routes manifest consumed by the SSR worker handler.',\n '//',\n '// `routes` is the default export and is wired into createRequestRouter via',\n '// `const _manifest = { routes }`. Each route carries a `pattern` (required',\n '// by the router) plus serialized metadata. The page component itself is not',\n '// serializable, so each route uses a placeholder handler that 404s, letting',\n '// the worker fall through to the ASSETS binding (pre-rendered static files).',\n '',\n 'const notFound = () => new Response(null, { status: 404 })',\n '',\n `const routes = ${JSON.stringify(serialized, null, 2)}.map((route) => ({`,\n ' ...route,',\n ' handler: notFound,',\n '}))',\n '',\n 'export default routes',\n '',\n ].join('\\n')\n}\n\nfunction generateWranglerToml(name: string): string {\n return `${[\n '# AUTO-GENERATED by @aihu/adapter-cloudflare',\n '# Edit this file to customize your Worker configuration.',\n '# Reference: https://developers.cloudflare.com/workers/wrangler/configuration/',\n '',\n `name = \"${name}\"`,\n 'main = \"_worker.js\"',\n 'compatibility_date = \"2024-01-01\"',\n '',\n '[assets]',\n 'directory = \".\"',\n 'binding = \"ASSETS\"',\n ].join('\\n')}\\n`\n}\n\n/**\n * Cloudflare Workers / Pages adapter for aihu.\n *\n * Writes `_worker.js` to the Vite output directory and optionally creates\n * `wrangler.toml` in the project root (if absent).\n *\n * @example\n * // aihu.config.ts\n * import { defineConfig } from '@aihu/app'\n * import { cloudflare } from '@aihu/adapter-cloudflare'\n *\n * export default defineConfig({\n * adapter: cloudflare({ name: 'my-worker' }),\n * })\n */\nexport function cloudflare(options?: CloudflareAdapterOptions): AihuAdapter {\n return {\n name: 'cloudflare',\n\n async adapt(context: AdapterContext): Promise<void> {\n const workerName = options?.name ?? readPackageJsonName(context.root) ?? 'aihu-app'\n const ssrEnabled = options?.ssr === true\n\n // Default specifier the handler imports. Keep in sync with the file we\n // emit below so `import routes from '<spec>'` always resolves.\n const routesSpecifier = './routes-manifest.js'\n\n // Step 1 — In SSR mode, write routes-manifest.js BEFORE _worker.js.\n // The generated handler does `import routes from './routes-manifest.js'`,\n // so this file must exist for the worker to load.\n if (ssrEnabled) {\n const manifestRelPath = routesSpecifier.replace(/^\\.\\//, '')\n await context.emitFile(manifestRelPath, generateRoutesManifest(context.routes))\n console.log(\n `[@aihu/adapter-cloudflare] Wrote ${manifestRelPath} (${context.routes.length} route(s))`,\n )\n }\n\n // Step 2 — Write _worker.js\n const workerEntry = ssrEnabled\n ? generateSsrWorkerEntry(context.createHandlerSource({ routesSpecifier }))\n : generateWorkerEntry()\n await context.emitFile('_worker.js', workerEntry)\n console.log(\n `[@aihu/adapter-cloudflare] Wrote _worker.js (${ssrEnabled ? 'SSR hybrid' : 'SPA'} mode)`,\n )\n\n // Step 3 — Write wrangler.toml (only if absent, never overwrites)\n const wranglerPath = resolvePath(context.root, 'wrangler.toml')\n if (options?.generateWrangler !== false && !existsSync(wranglerPath)) {\n const toml = generateWranglerToml(workerName)\n await context.writeFile(wranglerPath, toml)\n console.log(`[@aihu/adapter-cloudflare] Created wrangler.toml (name = \"${workerName}\")`)\n }\n\n console.log(`[@aihu/adapter-cloudflare] Build complete → ${context.outDir}`)\n console.log(`[@aihu/adapter-cloudflare] Deploy with: wrangler deploy --config wrangler.toml`)\n },\n }\n}\n"],"mappings":"2FA8CA,SAAS,EAAoB,EAA6B,CACxD,IAAM,EAAUA,EAAY,EAAM,eAAe,CACjD,GAAI,CAAC,EAAW,EAAQ,CAAE,OAAO,KACjC,GAAI,CACF,IAAM,EAAM,KAAK,MAAM,EAAa,EAAS,OAAO,CAAC,CACrD,OAAO,OAAO,EAAI,MAAS,SAAW,EAAI,KAAO,UAC3C,CACN,OAAO,MAIX,SAAS,GAA8B,CACrC,MAAO,CACL,8DACA,yCACA,KACA,4EACA,iDACA,GACA,mBACA,sCACA,YACA,+CACA,gBACA,6EACA,yCACA,4DACA,gEACA,QACA,OACA,IACD,CAAC,KAAK;EAAK,CAGd,SAAS,EAAuB,EAA+B,CAC7D,MAAO,CACL,8DACA,oDACA,KACA,qBACA,wFACA,8EACA,yEACA,GACA,EACA,GACA,mBACA,sCACA,2CACA,uDACA,mDACA,GACA,mEACA,YACA,+CACA,gBACA,sDACA,yCACA,0FACA,QACA,OACA,IACD,CAAC,KAAK;EAAK,CAmBd,SAAS,EAAuB,EAA6C,CAC3E,IAAM,EAAa,EAAO,IAAK,GAAU,CACvC,IAAM,EAAI,EACJ,EAA8E,CAClF,QAAS,EAAE,QACX,SAAU,EAAE,SACb,CAGD,OAFI,OAAO,EAAE,MAAS,WAAU,EAAM,KAAO,EAAE,MAC3C,OAAO,EAAE,KAAQ,YAAW,EAAM,IAAM,EAAE,KACvC,GACP,CAEF,MAAO,CACL,8DACA,yDACA,KACA,8EACA,8EACA,+EACA,+EACA,gFACA,GACA,6DACA,GACA,kBAAkB,KAAK,UAAU,EAAY,KAAM,EAAE,CAAC,oBACtD,cACA,uBACA,MACA,GACA,wBACA,GACD,CAAC,KAAK;EAAK,CAGd,SAAS,EAAqB,EAAsB,CAClD,MAAO,GAAG,CACR,+CACA,2DACA,iFACA,GACA,WAAW,EAAK,GAChB,sBACA,oCACA,GACA,WACA,kBACA,qBACD,CAAC,KAAK;EAAK,CAAC,IAkBf,SAAgB,EAAW,EAAiD,CAC1E,MAAO,CACL,KAAM,aAEN,MAAM,MAAM,EAAwC,CAClD,IAAM,EAAa,GAAS,MAAQ,EAAoB,EAAQ,KAAK,EAAI,WACnE,EAAa,GAAS,MAAQ,GAI9B,EAAkB,uBAKxB,GAAI,EAAY,CACd,IAAM,EAAkB,EAAgB,QAAQ,QAAS,GAAG,CAC5D,MAAM,EAAQ,SAAS,EAAiB,EAAuB,EAAQ,OAAO,CAAC,CAC/E,QAAQ,IACN,oCAAoC,EAAgB,IAAI,EAAQ,OAAO,OAAO,YAC/E,CAIH,IAAM,EAAc,EAChB,EAAuB,EAAQ,oBAAoB,CAAE,kBAAiB,CAAC,CAAC,CACxE,GAAqB,CACzB,MAAM,EAAQ,SAAS,aAAc,EAAY,CACjD,QAAQ,IACN,gDAAgD,EAAa,aAAe,MAAM,QACnF,CAGD,IAAM,EAAeA,EAAY,EAAQ,KAAM,gBAAgB,CAC/D,GAAI,GAAS,mBAAqB,IAAS,CAAC,EAAW,EAAa,CAAE,CACpE,IAAM,EAAO,EAAqB,EAAW,CAC7C,MAAM,EAAQ,UAAU,EAAc,EAAK,CAC3C,QAAQ,IAAI,6DAA6D,EAAW,IAAI,CAG1F,QAAQ,IAAI,+CAA+C,EAAQ,SAAS,CAC5E,QAAQ,IAAI,iFAAiF,EAEhG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aihu/adapter-cloudflare",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"prepublishOnly": "bun run build"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@aihu/app": "0.
|
|
28
|
+
"@aihu/app": "0.3.0",
|
|
29
29
|
"vite": ">=5.0.0"
|
|
30
30
|
},
|
|
31
31
|
"description": "Cloudflare Workers/Pages deployment adapter for @aihu/app.",
|