create-nifra 3.3.0 → 4.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.
Files changed (106) hide show
  1. package/README.md +3 -3
  2. package/dist/agent-files.d.ts +41 -26
  3. package/dist/agent-files.d.ts.map +1 -1
  4. package/dist/agent-files.js +80 -47
  5. package/dist/agent-files.js.map +1 -1
  6. package/dist/agents.d.ts +3 -3
  7. package/dist/agents.d.ts.map +1 -1
  8. package/dist/agents.js +65 -69
  9. package/dist/agents.js.map +1 -1
  10. package/dist/auth.d.ts +5 -4
  11. package/dist/auth.d.ts.map +1 -1
  12. package/dist/auth.js +27 -14
  13. package/dist/auth.js.map +1 -1
  14. package/dist/cli.d.ts +23 -25
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +141 -130
  17. package/dist/cli.js.map +1 -1
  18. package/dist/db.d.ts.map +1 -1
  19. package/dist/db.js +49 -48
  20. package/dist/db.js.map +1 -1
  21. package/dist/scaffold/frameworks.d.ts +13 -38
  22. package/dist/scaffold/frameworks.d.ts.map +1 -1
  23. package/dist/scaffold/frameworks.js +9 -32
  24. package/dist/scaffold/frameworks.js.map +1 -1
  25. package/dist/scaffold/route-types.d.ts +9 -0
  26. package/dist/scaffold/route-types.d.ts.map +1 -0
  27. package/dist/scaffold/route-types.js +61 -0
  28. package/dist/scaffold/route-types.js.map +1 -0
  29. package/dist/scaffold/site-files.d.ts +14 -8
  30. package/dist/scaffold/site-files.d.ts.map +1 -1
  31. package/dist/scaffold/site-files.js +29 -60
  32. package/dist/scaffold/site-files.js.map +1 -1
  33. package/dist/scaffold/site.d.ts +8 -5
  34. package/dist/scaffold/site.d.ts.map +1 -1
  35. package/dist/scaffold/site.js +47 -34
  36. package/dist/scaffold/site.js.map +1 -1
  37. package/dist/scaffold/targets.d.ts +39 -0
  38. package/dist/scaffold/targets.d.ts.map +1 -0
  39. package/dist/scaffold/targets.js +116 -0
  40. package/dist/scaffold/targets.js.map +1 -0
  41. package/package.json +4 -1
  42. package/src/agent-files.ts +89 -47
  43. package/template/README.md +12 -6
  44. package/template/{src → backend}/app.test.ts +2 -2
  45. package/template/{src → backend}/app.ts +8 -3
  46. package/template/{src → backend}/index.ts +2 -2
  47. package/template/{src → backend}/routes.ts +1 -1
  48. package/template/nifra.assurance.ts +16 -14
  49. package/template/package.json +7 -7
  50. package/template/tsconfig.json +1 -1
  51. package/template-batteries/README.md +10 -6
  52. package/template-batteries/{src → backend}/app.test.ts +23 -23
  53. package/template-batteries/{src → backend}/app.ts +8 -3
  54. package/template-batteries/{src → backend}/index.ts +2 -2
  55. package/template-batteries/{src → backend}/notes.ts +1 -1
  56. package/template-batteries/nifra.assurance.ts +16 -14
  57. package/template-batteries/package.json +10 -9
  58. package/template-batteries/tsconfig.json +1 -1
  59. package/template-isr/README.md +3 -0
  60. package/template-isr/{backend.ts → backend/app.ts} +2 -0
  61. package/template-isr/{server.ts → backend/dev-server.ts} +4 -4
  62. package/template-isr/{worker.ts → backend/worker.ts} +4 -2
  63. package/template-isr/build.ts +3 -1
  64. package/template-isr/gitignore +7 -1
  65. package/template-isr/nifra.assurance.ts +15 -13
  66. package/template-isr/package.json +10 -9
  67. package/template-isr/routes/index.backend.ts +14 -0
  68. package/template-isr/routes/index.tsx +5 -17
  69. package/template-isr/tsconfig.json +5 -4
  70. package/template-isr/wrangler.toml +6 -1
  71. package/template-site/README.md +24 -23
  72. package/template-site/{backend.ts → backend/app.ts} +6 -4
  73. package/template-site/gitignore +5 -10
  74. package/template-site/nifra.assurance.ts +15 -13
  75. package/template-site/nifra.config.ts +4 -4
  76. package/template-site/routes/index.backend.ts +18 -0
  77. package/template-site/routes/index.tsx +2 -15
  78. package/template-site-preact/README.md +21 -20
  79. package/template-site-preact/nifra.config.ts +4 -4
  80. package/template-site-preact/routes/_layout.tsx +3 -1
  81. package/template-site-preact/routes/index.tsx +2 -15
  82. package/template-site-solid/README.md +21 -19
  83. package/template-site-solid/nifra.config.ts +5 -4
  84. package/template-site-solid/routes/index.tsx +2 -15
  85. package/template-site-svelte/README.md +21 -19
  86. package/template-site-svelte/nifra.config.ts +3 -2
  87. package/template-site-svelte/routes/index.svelte +3 -16
  88. package/template-site-vue/README.md +21 -20
  89. package/template-site-vue/nifra.config.ts +4 -3
  90. package/template-site-vue/routes/_layout.vue +21 -25
  91. package/template-site-vue/routes/index.vue +12 -18
  92. package/dist/scaffold/site-build.d.ts +0 -60
  93. package/dist/scaffold/site-build.d.ts.map +0 -1
  94. package/dist/scaffold/site-build.js +0 -198
  95. package/dist/scaffold/site-build.js.map +0 -1
  96. package/template-site/.dockerignore +0 -14
  97. package/template-site/Dockerfile +0 -20
  98. package/template-site/_worker.ts +0 -17
  99. package/template-site/deno.json +0 -7
  100. package/template-site/server-bun.ts +0 -35
  101. package/template-site/server-deno.ts +0 -38
  102. package/template-site/server-node.ts +0 -40
  103. package/template-site/server-vercel.ts +0 -17
  104. package/template-site/wrangler.toml +0 -4
  105. /package/template-isr/{page.ts → backend/page.ts} +0 -0
  106. /package/template-site/{counter.ts → backend/counter.ts} +0 -0
@@ -1,198 +0,0 @@
1
- const NODE_ENV_DEFINE = `"process.env.NODE_ENV": '"production"'`;
2
- /**
3
- * A framework with no compiler plugin keeps the define inline in the client call, exactly as the
4
- * React and Preact templates had it: nothing is shared, so hoisting it would name a constant used
5
- * once. A framework WITH a plugin needs the same defines in both calls, so it hoists.
6
- */
7
- function injectionsFor(framework, target) {
8
- const extraDefines = Object.entries(framework.define ?? {}).map(([k, v]) => `${k}: ${v}`);
9
- const hoist = framework.bunPlugin !== undefined;
10
- const defineEntries = [NODE_ENV_DEFINE, ...extraDefines];
11
- const defineLiteral = defineEntries.length === 1
12
- ? `{ ${defineEntries[0]} }`
13
- : `{\n${defineEntries.map((e) => ` ${e},`).join("\n")}\n}`;
14
- const plugin = framework.bunPlugin;
15
- const call = (mode) => {
16
- if (plugin === undefined)
17
- return "";
18
- return ` plugins: [${plugin.name}("${mode}")],${plugin.note?.[mode] ?? ""}\n`;
19
- };
20
- const list = (values) => ` conditions: [${values.map((c) => `"${c}"`).join(", ")}],\n`;
21
- // The client call always names its conditions (`bun`, then anything the framework adds, then
22
- // `browser`). The server call names them ONLY when the framework contributes one - otherwise the
23
- // build's own default is right and spelling it out would be noise.
24
- const clientConditions = (extra) => list(["bun", ...(extra ?? []), "browser"]);
25
- const serverConditions = (extra) => extra === undefined || extra.length === 0
26
- ? ""
27
- : list([...target.serverConditions.before, ...extra, ...target.serverConditions.after]);
28
- return {
29
- pluginImport: plugin === undefined ? "" : `import { ${plugin.name} } from "${plugin.specifier}"\n`,
30
- defineConst: hoist
31
- ? `${framework.defineNote === undefined ? "" : `${framework.defineNote}\n`}const define = ${defineLiteral}\n`
32
- : "",
33
- clientPlugins: call("dom"),
34
- clientConditions: clientConditions(framework.conditions?.client),
35
- clientDefine: hoist ? " define,\n" : ` define: ${defineLiteral},\n`,
36
- serverPlugins: call("ssr"),
37
- serverConditions: serverConditions(framework.conditions?.ssr),
38
- serverDefine: hoist ? " define,\n" : "",
39
- };
40
- }
41
- export const BUILD_TARGETS = [
42
- {
43
- file: "build.ts",
44
- header: "// Build for Cloudflare Pages → dist/ (_worker.js + _routes.json + client assets). `bun run build`.",
45
- headerOverrides: {
46
- solid: `// Build for Cloudflare Pages → dist/ (_worker.js + _routes.json + client assets). \`bun run build\`.
47
- // Solid: solidBunPlugin("dom") for the client, ("ssr") for the server + the \`solid\` export condition.`,
48
- svelte: `// Build for Cloudflare Pages → dist/ (_worker.js + _routes.json + client assets). \`bun run build\`.
49
- // Svelte: svelteBunPlugin("dom") compiles .svelte for the client, ("ssr") for the server bundle.`,
50
- },
51
- serverConditions: { before: ["workerd", "edge-light"], after: ["browser"] },
52
- extraFsImports: ["writeFileSync"],
53
- setup: "const dist = `${dir}/dist`\n",
54
- clientOutDir: "`${dist}/assets`",
55
- serverEntry: "`${dir}/_worker.ts`",
56
- serverOutDir: "`${dir}/.build`",
57
- serverTarget: "",
58
- tail: `cpSync(worker, \`\${dist}/_worker.js\`)
59
- rmSync(\`\${dir}/.build\`, { recursive: true, force: true })
60
- writeFileSync(
61
- \`\${dist}/_routes.json\`,
62
- \`\${JSON.stringify({ version: 1, include: ["/*"], exclude: ["/assets/*"] }, null, 2)}\\n\`,
63
- )
64
- console.log("Cloudflare Pages output → dist (deploy: wrangler pages deploy dist)")
65
- `,
66
- },
67
- {
68
- file: "build-bun.ts",
69
- header: `// Build for Bun (nifra's flagship runtime) → dist-bun/ (server-bun.js + client assets).
70
- // \`bun run build:bun\`. Run: \`bun dist-bun/server-bun.js\`.`,
71
- serverConditions: { before: ["bun"], after: [] },
72
- setup: "const dist = `${dir}/dist-bun`\n",
73
- clientOutDir: "`${dist}/assets`",
74
- serverEntry: "`${dir}/server-bun.ts`",
75
- serverOutDir: "`${dir}/.build-bun`",
76
- serverTarget: ' target: "bun",\n',
77
- tail: `cpSync(worker, \`\${dist}/server-bun.js\`)
78
- rmSync(\`\${dir}/.build-bun\`, { recursive: true, force: true })
79
- console.log("Bun output → dist-bun (run: bun dist-bun/server-bun.js)")
80
- `,
81
- },
82
- {
83
- file: "build-node.ts",
84
- header: "// Build for Node → dist-node/ (server-node.js + client assets). `bun run build:node`.",
85
- headerOverrides: {
86
- solid: `// Build for Node → dist-node/ (server-node.js + client assets). \`bun run build:node\`.
87
- // Run: \`node dist-node/server-node.js\` (or the Dockerfile). \`node\`+\`solid\` → solid-js/web's server build.`,
88
- svelte: `// Build for Node → dist-node/ (server-node.js + client assets). \`bun run build:node\`.
89
- // Run: \`node dist-node/server-node.js\` (or the Dockerfile).`,
90
- vue: `// Build for Node → dist-node/ (server-node.js + client assets). \`bun run build:node\`.
91
- // Run: \`node dist-node/server-node.js\` (or the Dockerfile).`,
92
- },
93
- serverConditions: { before: ["node"], after: [] },
94
- setup: "const dist = `${dir}/dist-node`\n",
95
- clientOutDir: "`${dist}/assets`",
96
- serverEntry: "`${dir}/server-node.ts`",
97
- serverOutDir: "`${dir}/.build-node`",
98
- serverTarget: ' target: "node",\n',
99
- tail: `cpSync(worker, \`\${dist}/server-node.js\`)
100
- rmSync(\`\${dir}/.build-node\`, { recursive: true, force: true })
101
- console.log("Node output → dist-node (run: node dist-node/server-node.js)")
102
- `,
103
- },
104
- {
105
- file: "build-deno.ts",
106
- header: "// Build for Deno → dist-deno/ (server-deno.js + client assets). `bun run build:deno`.",
107
- headerOverrides: {
108
- solid: `// Build for Deno → dist-deno/ (server-deno.js + client assets). \`bun run build:deno\`.
109
- // Run: \`deno task start\` (or deployctl). Deno runs the edge bundle (workerd/edge-light + solid).`,
110
- svelte: `// Build for Deno → dist-deno/ (server-deno.js + client assets). \`bun run build:deno\`.
111
- // Run: \`deno task start\` (or deployctl).`,
112
- vue: `// Build for Deno → dist-deno/ (server-deno.js + client assets). \`bun run build:deno\`.
113
- // Run: \`deno task start\` (or deployctl for Deno Deploy).`,
114
- },
115
- serverConditions: { before: ["workerd", "edge-light"], after: ["browser"] },
116
- setup: "const dist = `${dir}/dist-deno`\n",
117
- clientOutDir: "`${dist}/assets`",
118
- serverEntry: "`${dir}/server-deno.ts`",
119
- serverOutDir: "`${dir}/.build-deno`",
120
- serverTarget: "",
121
- tail: `cpSync(worker, \`\${dist}/server-deno.js\`)
122
- rmSync(\`\${dir}/.build-deno\`, { recursive: true, force: true })
123
- console.log("Deno output → dist-deno (run: deno run -A dist-deno/server-deno.js)")
124
- `,
125
- },
126
- {
127
- file: "build-vercel.ts",
128
- header: `// Build for Vercel, emitting Vercel's Build Output API v3 at .vercel/output/ so it deploys with no
129
- // framework preset: \`vercel deploy --prebuilt\`. Layout:
130
- // .vercel/output/config.json - serve static files, else SSR via the function
131
- // .vercel/output/static/assets/<client bundle> - Vercel's CDN serves these directly
132
- // .vercel/output/functions/index.func/index.js - the Edge SSR function (+ .vc-config.json)`,
133
- serverConditions: { before: ["workerd", "edge-light"], after: ["browser"] },
134
- extraFsImports: ["writeFileSync"],
135
- setup: `const out = \`\${dir}/.vercel/output\`
136
- const fn = \`\${out}/functions/index.func\`
137
- `,
138
- clientOutDir: "`${out}/static/assets`",
139
- serverEntry: "`${dir}/server-vercel.ts`",
140
- serverOutDir: "`${dir}/.build-vercel`",
141
- serverTarget: "",
142
- tail: `cpSync(worker, \`\${fn}/index.js\`)
143
- rmSync(\`\${dir}/.build-vercel\`, { recursive: true, force: true })
144
-
145
- // Build Output API v3: serve real files first (\`handle: filesystem\` → /assets/*), then SSR the rest.
146
- writeFileSync(
147
- \`\${fn}/.vc-config.json\`,
148
- \`\${JSON.stringify({ runtime: "edge", entrypoint: "index.js" }, null, 2)}\\n\`,
149
- )
150
- writeFileSync(
151
- \`\${out}/config.json\`,
152
- \`\${JSON.stringify(
153
- { version: 3, routes: [{ handle: "filesystem" }, { src: "/(.*)", dest: "/index" }] },
154
- null,
155
- 2,
156
- )}\\n\`,
157
- )
158
- console.log("Vercel output → .vercel/output (deploy: vercel deploy --prebuilt)")
159
- `,
160
- },
161
- ];
162
- /** The `rm`/`mkdir` preamble differs only for Vercel, which builds two trees rather than one. */
163
- function preambleFor(target) {
164
- if (target.file !== "build-vercel.ts") {
165
- return `rmSync(dist, { recursive: true, force: true })
166
- mkdirSync(\`\${dist}/assets\`, { recursive: true })
167
- `;
168
- }
169
- return `rmSync(\`\${dir}/.vercel\`, { recursive: true, force: true })
170
- mkdirSync(\`\${out}/static/assets\`, { recursive: true })
171
- mkdirSync(fn, { recursive: true })
172
- `;
173
- }
174
- /** Emit one target's build entry for one framework. */
175
- export function renderBuildFile(target, framework) {
176
- const injections = injectionsFor(framework, target);
177
- const header = target.headerOverrides?.[framework.id] ?? target.header;
178
- const fsImports = ["cpSync", "mkdirSync", "rmSync", ...(target.extraFsImports ?? [])].sort();
179
- return `${header}
180
- import { ${fsImports.join(", ")} } from "node:fs"
181
- import { buildClient, buildServer } from "@nifrajs/web/build"
182
- ${injections.pluginImport}
183
- const dir = import.meta.dir
184
- ${target.setup}${injections.defineConst}${preambleFor(target)}
185
- const client = await buildClient({
186
- routesDir: \`\${dir}/routes\`,
187
- outDir: ${target.clientOutDir},
188
- clientModule: "${framework.package}/client",
189
- ${injections.clientPlugins}${injections.clientConditions}${injections.clientDefine}})
190
- const { worker } = await buildServer({
191
- routesDir: \`\${dir}/routes\`,
192
- serverEntry: ${target.serverEntry},
193
- outDir: ${target.serverOutDir},
194
- ${target.serverTarget} clientEntry: client.entry,
195
- ${injections.serverPlugins}${injections.serverConditions}${injections.serverDefine}})
196
- ${target.tail}`;
197
- }
198
- //# sourceMappingURL=site-build.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"site-build.js","sourceRoot":"","sources":["../../src/scaffold/site-build.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- node_modules
2
- dist
3
- dist-node
4
- dist-bun
5
- dist-deno
6
- .vercel
7
- .build
8
- .build-node
9
- .build-bun
10
- .build-deno
11
- .build-vercel
12
- .wrangler
13
- .git
14
- *.log
@@ -1,20 +0,0 @@
1
- # nifra on Node, containerized. Build with Bun (nifra's build toolchain), then run the self-contained
2
- # bundle on a slim Node image - the final image carries no build tools or node_modules.
3
- # docker build -t my-nifra-app .
4
- # docker run -p 3000:3000 my-nifra-app
5
- FROM oven/bun:1 AS build
6
- WORKDIR /app
7
- # Copy manifests first so the install layer caches across source-only changes.
8
- COPY package.json bun.lock* ./
9
- RUN bun install
10
- COPY . .
11
- RUN bun run build:node
12
-
13
- FROM node:22-slim AS run
14
- WORKDIR /app
15
- ENV NODE_ENV=production
16
- ENV PORT=3000
17
- # build:node emits a self-contained server-bundle + the client assets it serves from disk.
18
- COPY --from=build /app/dist-node ./dist-node
19
- EXPOSE 3000
20
- CMD ["node", "dist-node/server-node.js"]
@@ -1,17 +0,0 @@
1
- import { inProcessClient } from "@nifrajs/client"
2
- import { toFetchHandler } from "@nifrajs/core/server"
3
- import { createWebApp } from "@nifrajs/web"
4
- import { backend } from "./backend"
5
- import { adapter } from "./framework"
6
- import { clientEntry, manifest } from "./server-manifest"
7
-
8
- const app = createWebApp({
9
- adapter,
10
- manifest,
11
- clientEntry,
12
- api: inProcessClient(backend),
13
- title: "nifra site",
14
- })
15
-
16
- // Cloudflare Pages: _routes.json serves /assets/* statically; everything else hits this (SSR).
17
- export default toFetchHandler(app)
@@ -1,7 +0,0 @@
1
- {
2
- "tasks": {
3
- "build": "bun run build-deno.ts",
4
- "start": "deno run --allow-net --allow-read --allow-env dist-deno/server-deno.js"
5
- },
6
- "//": "Build with Bun (nifra's toolchain), run/deploy the self-contained bundle on Deno. Deploy to Deno Deploy: deployctl deploy --prod --entrypoint=dist-deno/server-deno.js"
7
- }
@@ -1,35 +0,0 @@
1
- import { inProcessClient } from "@nifrajs/client"
2
- import { createWebApp } from "@nifrajs/web"
3
- import { backend } from "./backend"
4
- import { adapter } from "./framework"
5
- import { clientEntry, manifest } from "./server-manifest"
6
-
7
- const app = createWebApp({
8
- adapter,
9
- manifest,
10
- clientEntry,
11
- api: inProcessClient(backend),
12
- title: "nifra site",
13
- })
14
-
15
- // Bun (nifra's flagship runtime): Bun.serve handles app.fetch; serve the client bundle (/assets/*)
16
- // from disk with Bun.file. Assets live next to this file in the built dist-bun/ output.
17
- const ASSETS = new URL("./assets/", import.meta.url)
18
- const TYPES: Readonly<Record<string, string>> = { js: "text/javascript", css: "text/css" }
19
-
20
- const server = Bun.serve({
21
- port: Number(Bun.env.PORT ?? 3000),
22
- async fetch(req) {
23
- const { pathname } = new URL(req.url)
24
- if (pathname.startsWith("/assets/")) {
25
- const name = pathname.slice("/assets/".length)
26
- if (!/^[A-Za-z0-9._-]+$/.test(name)) return new Response("bad request", { status: 400 })
27
- const file = Bun.file(new URL(name, ASSETS))
28
- if (!(await file.exists())) return new Response("not found", { status: 404 })
29
- const ext = name.slice(name.lastIndexOf(".") + 1)
30
- return new Response(file, { headers: { "content-type": TYPES[ext] ?? "application/octet-stream" } })
31
- }
32
- return app.fetch(req)
33
- },
34
- })
35
- console.log(`nifra (Bun) → http://localhost:${server.port}`)
@@ -1,38 +0,0 @@
1
- import { inProcessClient } from "@nifrajs/client"
2
- import { serve } from "@nifrajs/deno"
3
- import { createWebApp } from "@nifrajs/web"
4
- import { backend } from "./backend"
5
- import { adapter } from "./framework"
6
- import { clientEntry, manifest } from "./server-manifest"
7
-
8
- const app = createWebApp({
9
- adapter,
10
- manifest,
11
- clientEntry,
12
- api: inProcessClient(backend),
13
- title: "nifra site",
14
- })
15
-
16
- const ASSETS = new URL("./assets/", import.meta.url)
17
- const TYPES: Readonly<Record<string, string>> = { js: "text/javascript", css: "text/css" }
18
-
19
- await serve(
20
- {
21
- async fetch(req) {
22
- const { pathname } = new URL(req.url)
23
- if (pathname.startsWith("/assets/")) {
24
- const name = pathname.slice("/assets/".length)
25
- if (!/^[A-Za-z0-9._-]+$/.test(name)) return new Response("bad request", { status: 400 })
26
- try {
27
- const body = await Deno.readFile(new URL(name, ASSETS))
28
- const ext = name.slice(name.lastIndexOf(".") + 1)
29
- return new Response(body, { headers: { "content-type": TYPES[ext] ?? "application/octet-stream" } })
30
- } catch {
31
- return new Response("not found", { status: 404 })
32
- }
33
- }
34
- return app.fetch(req)
35
- },
36
- },
37
- { port: Number(Deno.env.get("PORT") ?? "3000") },
38
- )
@@ -1,40 +0,0 @@
1
- import { readFile } from "node:fs/promises"
2
- import { inProcessClient } from "@nifrajs/client"
3
- import { serve } from "@nifrajs/node"
4
- import { createWebApp } from "@nifrajs/web"
5
- import { backend } from "./backend"
6
- import { adapter } from "./framework"
7
- import { clientEntry, manifest } from "./server-manifest"
8
-
9
- const app = createWebApp({
10
- adapter,
11
- manifest,
12
- clientEntry,
13
- api: inProcessClient(backend),
14
- title: "nifra site",
15
- })
16
-
17
- // @nifrajs/node serves app.fetch only - so serve /assets/* (the client bundle) from disk here.
18
- const ASSETS = new URL("./assets/", import.meta.url)
19
- const TYPES: Readonly<Record<string, string>> = { js: "text/javascript", css: "text/css" }
20
-
21
- await serve(
22
- {
23
- async fetch(req) {
24
- const { pathname } = new URL(req.url)
25
- if (pathname.startsWith("/assets/")) {
26
- const name = pathname.slice("/assets/".length)
27
- if (!/^[A-Za-z0-9._-]+$/.test(name)) return new Response("bad request", { status: 400 })
28
- try {
29
- const body = await readFile(new URL(name, ASSETS))
30
- const ext = name.slice(name.lastIndexOf(".") + 1)
31
- return new Response(body, { headers: { "content-type": TYPES[ext] ?? "application/octet-stream" } })
32
- } catch {
33
- return new Response("not found", { status: 404 })
34
- }
35
- }
36
- return app.fetch(req)
37
- },
38
- },
39
- { port: Number(process.env.PORT ?? 3000) },
40
- )
@@ -1,17 +0,0 @@
1
- import { inProcessClient } from "@nifrajs/client"
2
- import { createWebApp } from "@nifrajs/web"
3
- import { backend } from "./backend"
4
- import { adapter } from "./framework"
5
- import { clientEntry, manifest } from "./server-manifest"
6
-
7
- const app = createWebApp({
8
- adapter,
9
- manifest,
10
- clientEntry,
11
- api: inProcessClient(backend),
12
- title: "nifra site",
13
- })
14
-
15
- // Vercel Edge Function - Vercel serves /assets/* from its CDN, so this only SSRs page routes.
16
- export const config = { runtime: "edge" }
17
- export default (req: Request): Response | Promise<Response> => app.fetch(req)
@@ -1,4 +0,0 @@
1
- name = "nifra-site"
2
- pages_build_output_dir = "dist"
3
- compatibility_date = "2025-01-01"
4
- compatibility_flags = ["nodejs_compat"]
File without changes