create-nifra 2.2.0 → 2.3.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 +4 -4
- package/dist/agent-files.d.ts +14 -14
- package/dist/agent-files.js +29 -29
- package/dist/agents.d.ts +4 -4
- package/dist/agents.js +63 -63
- package/dist/auth.d.ts +2 -2
- package/dist/auth.js +8 -8
- package/dist/cli.d.ts +6 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -35
- package/dist/cli.js.map +1 -1
- package/dist/db.d.ts +6 -6
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +138 -41
- package/dist/db.js.map +1 -1
- package/dist/scaffold/features.d.ts +41 -0
- package/dist/scaffold/features.d.ts.map +1 -0
- package/dist/scaffold/features.js +48 -0
- package/dist/scaffold/features.js.map +1 -0
- package/dist/scaffold/frameworks.d.ts +73 -0
- package/dist/scaffold/frameworks.d.ts.map +1 -0
- package/dist/scaffold/frameworks.js +100 -0
- package/dist/scaffold/frameworks.js.map +1 -0
- package/dist/scaffold/site-build.d.ts +60 -0
- package/dist/scaffold/site-build.d.ts.map +1 -0
- package/dist/scaffold/site-build.js +198 -0
- package/dist/scaffold/site-build.js.map +1 -0
- package/dist/scaffold/site-files.d.ts +16 -0
- package/dist/scaffold/site-files.d.ts.map +1 -0
- package/dist/scaffold/site-files.js +112 -0
- package/dist/scaffold/site-files.js.map +1 -0
- package/dist/scaffold/site.d.ts +33 -0
- package/dist/scaffold/site.d.ts.map +1 -0
- package/dist/scaffold/site.js +99 -0
- package/dist/scaffold/site.js.map +1 -0
- package/package.json +2 -2
- package/src/agent-files.ts +29 -29
- package/template/README.md +3 -3
- package/template/nifra.assurance.ts +80 -0
- package/template/package.json +5 -3
- package/template/src/app.ts +10 -11
- package/template/src/routes.ts +13 -0
- package/template-isr/README.md +1 -1
- package/template-isr/backend.ts +11 -15
- package/template-isr/nifra.assurance.ts +81 -0
- package/template-isr/package.json +8 -7
- package/template-isr/page.ts +12 -0
- package/template-isr/routes/_404.tsx +1 -1
- package/template-isr/routes/_layout.tsx +1 -1
- package/template-isr/routes/index.tsx +2 -2
- package/template-isr/server.ts +1 -1
- package/template-isr/worker.ts +2 -2
- package/template-isr/wrangler.toml +2 -2
- package/template-site/Dockerfile +1 -1
- package/template-site/README.md +6 -6
- package/template-site/backend.ts +11 -13
- package/template-site/counter.ts +16 -0
- package/template-site/nifra.assurance.ts +83 -0
- package/template-site/nifra.config.ts +1 -1
- package/template-site/routes/index.tsx +1 -1
- package/template-site/server-node.ts +1 -1
- package/template-site/server-vercel.ts +1 -1
- package/template-site-preact/README.md +7 -7
- package/template-site-preact/nifra.config.ts +1 -1
- package/template-site-preact/routes/index.tsx +1 -1
- package/template-site-solid/README.md +7 -7
- package/template-site-solid/nifra.config.ts +2 -2
- package/template-site-solid/routes/index.tsx +1 -1
- package/template-site-svelte/README.md +7 -7
- package/template-site-svelte/nifra.config.ts +2 -2
- package/template-site-svelte/routes/_layout.svelte +1 -1
- package/template-site-svelte/routes/index.svelte +1 -1
- package/template-site-vue/README.md +7 -7
- package/template-site-vue/nifra.config.ts +2 -2
- package/template-site-vue/routes/_layout.vue +2 -2
- package/template-site-vue/routes/index.vue +3 -3
- package/template-site/build-bun.ts +0 -27
- package/template-site/build-deno.ts +0 -25
- package/template-site/build-node.ts +0 -26
- package/template-site/build-vercel.ts +0 -45
- package/template-site/build.ts +0 -29
- package/template-site/framework.ts +0 -6
- package/template-site/package.json +0 -38
- package/template-site/tsconfig.json +0 -37
- package/template-site-preact/.dockerignore +0 -14
- package/template-site-preact/Dockerfile +0 -20
- package/template-site-preact/_worker.ts +0 -17
- package/template-site-preact/backend.ts +0 -15
- package/template-site-preact/build-bun.ts +0 -27
- package/template-site-preact/build-deno.ts +0 -25
- package/template-site-preact/build-node.ts +0 -26
- package/template-site-preact/build-vercel.ts +0 -45
- package/template-site-preact/build.ts +0 -29
- package/template-site-preact/deno.json +0 -7
- package/template-site-preact/framework.ts +0 -6
- package/template-site-preact/gitignore +0 -16
- package/template-site-preact/package.json +0 -35
- package/template-site-preact/server-bun.ts +0 -35
- package/template-site-preact/server-deno.ts +0 -38
- package/template-site-preact/server-node.ts +0 -40
- package/template-site-preact/server-vercel.ts +0 -17
- package/template-site-preact/tsconfig.json +0 -38
- package/template-site-preact/wrangler.toml +0 -4
- package/template-site-solid/.dockerignore +0 -14
- package/template-site-solid/Dockerfile +0 -20
- package/template-site-solid/_worker.ts +0 -17
- package/template-site-solid/backend.ts +0 -15
- package/template-site-solid/build-bun.ts +0 -33
- package/template-site-solid/build-deno.ts +0 -32
- package/template-site-solid/build-node.ts +0 -33
- package/template-site-solid/build-vercel.ts +0 -47
- package/template-site-solid/build.ts +0 -36
- package/template-site-solid/deno.json +0 -7
- package/template-site-solid/framework.ts +0 -6
- package/template-site-solid/gitignore +0 -16
- package/template-site-solid/package.json +0 -35
- package/template-site-solid/server-bun.ts +0 -35
- package/template-site-solid/server-deno.ts +0 -38
- package/template-site-solid/server-node.ts +0 -40
- package/template-site-solid/server-vercel.ts +0 -17
- package/template-site-solid/tsconfig.json +0 -38
- package/template-site-solid/wrangler.toml +0 -4
- package/template-site-svelte/.dockerignore +0 -14
- package/template-site-svelte/Dockerfile +0 -20
- package/template-site-svelte/_worker.ts +0 -17
- package/template-site-svelte/backend.ts +0 -15
- package/template-site-svelte/build-bun.ts +0 -32
- package/template-site-svelte/build-deno.ts +0 -31
- package/template-site-svelte/build-node.ts +0 -32
- package/template-site-svelte/build-vercel.ts +0 -46
- package/template-site-svelte/build.ts +0 -35
- package/template-site-svelte/deno.json +0 -7
- package/template-site-svelte/framework.ts +0 -6
- package/template-site-svelte/gitignore +0 -16
- package/template-site-svelte/package.json +0 -35
- package/template-site-svelte/server-bun.ts +0 -35
- package/template-site-svelte/server-deno.ts +0 -38
- package/template-site-svelte/server-node.ts +0 -40
- package/template-site-svelte/server-vercel.ts +0 -17
- package/template-site-svelte/tsconfig.json +0 -37
- package/template-site-svelte/wrangler.toml +0 -4
- package/template-site-vue/.dockerignore +0 -14
- package/template-site-vue/Dockerfile +0 -20
- package/template-site-vue/_worker.ts +0 -17
- package/template-site-vue/backend.ts +0 -15
- package/template-site-vue/build-bun.ts +0 -37
- package/template-site-vue/build-deno.ts +0 -36
- package/template-site-vue/build-node.ts +0 -37
- package/template-site-vue/build-vercel.ts +0 -54
- package/template-site-vue/build.ts +0 -40
- package/template-site-vue/deno.json +0 -7
- package/template-site-vue/framework.ts +0 -6
- package/template-site-vue/gitignore +0 -16
- package/template-site-vue/package.json +0 -36
- package/template-site-vue/server-bun.ts +0 -35
- package/template-site-vue/server-deno.ts +0 -38
- package/template-site-vue/server-node.ts +0 -40
- package/template-site-vue/server-vercel.ts +0 -17
- package/template-site-vue/tsconfig.json +0 -37
- package/template-site-vue/wrangler.toml +0 -4
|
@@ -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,15 +0,0 @@
|
|
|
1
|
-
import { server } from "@nifrajs/core/server"
|
|
2
|
-
import { t } from "@nifrajs/schema"
|
|
3
|
-
|
|
4
|
-
// Your backend contract — page loaders/actions call it in-process during SSR (no network). Replace
|
|
5
|
-
// the demo counter with real data (KV/D1/Postgres/…); on the edge, reach bindings via `c.env`.
|
|
6
|
-
let count = 0
|
|
7
|
-
|
|
8
|
-
const Counter = t.object({ count: t.number() })
|
|
9
|
-
|
|
10
|
-
export const backend = server()
|
|
11
|
-
.get("/count", { response: Counter }, () => ({ count }))
|
|
12
|
-
.post("/count", { response: Counter }, () => {
|
|
13
|
-
count += 1
|
|
14
|
-
return { count }
|
|
15
|
-
})
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
// Build for Bun (nifra's flagship runtime) → dist-bun/ (server-bun.js + client assets).
|
|
2
|
-
// `bun run build:bun`. Run: `bun dist-bun/server-bun.js`.
|
|
3
|
-
import { cpSync, mkdirSync, rmSync } from "node:fs"
|
|
4
|
-
import { buildClient, buildServer } from "@nifrajs/web/build"
|
|
5
|
-
import { solidBunPlugin } from "@nifrajs/web-solid"
|
|
6
|
-
|
|
7
|
-
const dir = import.meta.dir
|
|
8
|
-
const dist = `${dir}/dist-bun`
|
|
9
|
-
const define = { "process.env.NODE_ENV": '"production"' }
|
|
10
|
-
rmSync(dist, { recursive: true, force: true })
|
|
11
|
-
mkdirSync(`${dist}/assets`, { recursive: true })
|
|
12
|
-
|
|
13
|
-
const client = await buildClient({
|
|
14
|
-
routesDir: `${dir}/routes`,
|
|
15
|
-
outDir: `${dist}/assets`,
|
|
16
|
-
clientModule: "@nifrajs/web-solid/client",
|
|
17
|
-
plugins: [solidBunPlugin("dom")],
|
|
18
|
-
conditions: ["bun", "solid", "browser"],
|
|
19
|
-
define,
|
|
20
|
-
})
|
|
21
|
-
const { worker } = await buildServer({
|
|
22
|
-
routesDir: `${dir}/routes`,
|
|
23
|
-
serverEntry: `${dir}/server-bun.ts`,
|
|
24
|
-
outDir: `${dir}/.build-bun`,
|
|
25
|
-
target: "bun",
|
|
26
|
-
clientEntry: client.entry,
|
|
27
|
-
plugins: [solidBunPlugin("ssr")],
|
|
28
|
-
conditions: ["bun", "solid"],
|
|
29
|
-
define,
|
|
30
|
-
})
|
|
31
|
-
cpSync(worker, `${dist}/server-bun.js`)
|
|
32
|
-
rmSync(`${dir}/.build-bun`, { recursive: true, force: true })
|
|
33
|
-
console.log("Bun output → dist-bun (run: bun dist-bun/server-bun.js)")
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// Build for Deno → dist-deno/ (server-deno.js + client assets). `bun run build:deno`.
|
|
2
|
-
// Run: `deno task start` (or deployctl). Deno runs the edge bundle (workerd/edge-light + solid).
|
|
3
|
-
import { cpSync, mkdirSync, rmSync } from "node:fs"
|
|
4
|
-
import { buildClient, buildServer } from "@nifrajs/web/build"
|
|
5
|
-
import { solidBunPlugin } from "@nifrajs/web-solid"
|
|
6
|
-
|
|
7
|
-
const dir = import.meta.dir
|
|
8
|
-
const dist = `${dir}/dist-deno`
|
|
9
|
-
const define = { "process.env.NODE_ENV": '"production"' }
|
|
10
|
-
rmSync(dist, { recursive: true, force: true })
|
|
11
|
-
mkdirSync(`${dist}/assets`, { recursive: true })
|
|
12
|
-
|
|
13
|
-
const client = await buildClient({
|
|
14
|
-
routesDir: `${dir}/routes`,
|
|
15
|
-
outDir: `${dist}/assets`,
|
|
16
|
-
clientModule: "@nifrajs/web-solid/client",
|
|
17
|
-
plugins: [solidBunPlugin("dom")],
|
|
18
|
-
conditions: ["bun", "solid", "browser"],
|
|
19
|
-
define,
|
|
20
|
-
})
|
|
21
|
-
const { worker } = await buildServer({
|
|
22
|
-
routesDir: `${dir}/routes`,
|
|
23
|
-
serverEntry: `${dir}/server-deno.ts`,
|
|
24
|
-
outDir: `${dir}/.build-deno`,
|
|
25
|
-
clientEntry: client.entry,
|
|
26
|
-
plugins: [solidBunPlugin("ssr")],
|
|
27
|
-
conditions: ["workerd", "edge-light", "solid", "browser"],
|
|
28
|
-
define,
|
|
29
|
-
})
|
|
30
|
-
cpSync(worker, `${dist}/server-deno.js`)
|
|
31
|
-
rmSync(`${dir}/.build-deno`, { recursive: true, force: true })
|
|
32
|
-
console.log("Deno output → dist-deno (run: deno run -A dist-deno/server-deno.js)")
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
// Build for Node → dist-node/ (server-node.js + client assets). `bun run build:node`.
|
|
2
|
-
// Run: `node dist-node/server-node.js` (or the Dockerfile). `node`+`solid` → solid-js/web's server build.
|
|
3
|
-
import { cpSync, mkdirSync, rmSync } from "node:fs"
|
|
4
|
-
import { buildClient, buildServer } from "@nifrajs/web/build"
|
|
5
|
-
import { solidBunPlugin } from "@nifrajs/web-solid"
|
|
6
|
-
|
|
7
|
-
const dir = import.meta.dir
|
|
8
|
-
const dist = `${dir}/dist-node`
|
|
9
|
-
const define = { "process.env.NODE_ENV": '"production"' }
|
|
10
|
-
rmSync(dist, { recursive: true, force: true })
|
|
11
|
-
mkdirSync(`${dist}/assets`, { recursive: true })
|
|
12
|
-
|
|
13
|
-
const client = await buildClient({
|
|
14
|
-
routesDir: `${dir}/routes`,
|
|
15
|
-
outDir: `${dist}/assets`,
|
|
16
|
-
clientModule: "@nifrajs/web-solid/client",
|
|
17
|
-
plugins: [solidBunPlugin("dom")],
|
|
18
|
-
conditions: ["bun", "solid", "browser"],
|
|
19
|
-
define,
|
|
20
|
-
})
|
|
21
|
-
const { worker } = await buildServer({
|
|
22
|
-
routesDir: `${dir}/routes`,
|
|
23
|
-
serverEntry: `${dir}/server-node.ts`,
|
|
24
|
-
outDir: `${dir}/.build-node`,
|
|
25
|
-
target: "node",
|
|
26
|
-
clientEntry: client.entry,
|
|
27
|
-
plugins: [solidBunPlugin("ssr")],
|
|
28
|
-
conditions: ["node", "solid"],
|
|
29
|
-
define,
|
|
30
|
-
})
|
|
31
|
-
cpSync(worker, `${dist}/server-node.js`)
|
|
32
|
-
rmSync(`${dir}/.build-node`, { recursive: true, force: true })
|
|
33
|
-
console.log("Node output → dist-node (run: node dist-node/server-node.js)")
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
// Build for Vercel, emitting Vercel's Build Output API v3 at .vercel/output/ so it deploys with no
|
|
2
|
-
// framework preset: `vercel deploy --prebuilt`.
|
|
3
|
-
import { cpSync, mkdirSync, rmSync, writeFileSync } from "node:fs"
|
|
4
|
-
import { buildClient, buildServer } from "@nifrajs/web/build"
|
|
5
|
-
import { solidBunPlugin } from "@nifrajs/web-solid"
|
|
6
|
-
|
|
7
|
-
const dir = import.meta.dir
|
|
8
|
-
const out = `${dir}/.vercel/output`
|
|
9
|
-
const fn = `${out}/functions/index.func`
|
|
10
|
-
const define = { "process.env.NODE_ENV": '"production"' }
|
|
11
|
-
rmSync(`${dir}/.vercel`, { recursive: true, force: true })
|
|
12
|
-
mkdirSync(`${out}/static/assets`, { recursive: true })
|
|
13
|
-
mkdirSync(fn, { recursive: true })
|
|
14
|
-
|
|
15
|
-
const client = await buildClient({
|
|
16
|
-
routesDir: `${dir}/routes`,
|
|
17
|
-
outDir: `${out}/static/assets`,
|
|
18
|
-
clientModule: "@nifrajs/web-solid/client",
|
|
19
|
-
plugins: [solidBunPlugin("dom")],
|
|
20
|
-
conditions: ["bun", "solid", "browser"],
|
|
21
|
-
define,
|
|
22
|
-
})
|
|
23
|
-
const { worker } = await buildServer({
|
|
24
|
-
routesDir: `${dir}/routes`,
|
|
25
|
-
serverEntry: `${dir}/server-vercel.ts`,
|
|
26
|
-
outDir: `${dir}/.build-vercel`,
|
|
27
|
-
clientEntry: client.entry,
|
|
28
|
-
plugins: [solidBunPlugin("ssr")],
|
|
29
|
-
conditions: ["workerd", "edge-light", "solid", "browser"],
|
|
30
|
-
define,
|
|
31
|
-
})
|
|
32
|
-
cpSync(worker, `${fn}/index.js`)
|
|
33
|
-
rmSync(`${dir}/.build-vercel`, { recursive: true, force: true })
|
|
34
|
-
|
|
35
|
-
writeFileSync(
|
|
36
|
-
`${fn}/.vc-config.json`,
|
|
37
|
-
`${JSON.stringify({ runtime: "edge", entrypoint: "index.js" }, null, 2)}\n`,
|
|
38
|
-
)
|
|
39
|
-
writeFileSync(
|
|
40
|
-
`${out}/config.json`,
|
|
41
|
-
`${JSON.stringify(
|
|
42
|
-
{ version: 3, routes: [{ handle: "filesystem" }, { src: "/(.*)", dest: "/index" }] },
|
|
43
|
-
null,
|
|
44
|
-
2,
|
|
45
|
-
)}\n`,
|
|
46
|
-
)
|
|
47
|
-
console.log("Vercel output → .vercel/output (deploy: vercel deploy --prebuilt)")
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
// Build for Cloudflare Pages → dist/ (_worker.js + _routes.json + client assets). `bun run build`.
|
|
2
|
-
// Solid: solidBunPlugin("dom") for the client, ("ssr") for the server + the `solid` export condition.
|
|
3
|
-
import { cpSync, mkdirSync, rmSync, writeFileSync } from "node:fs"
|
|
4
|
-
import { buildClient, buildServer } from "@nifrajs/web/build"
|
|
5
|
-
import { solidBunPlugin } from "@nifrajs/web-solid"
|
|
6
|
-
|
|
7
|
-
const dir = import.meta.dir
|
|
8
|
-
const dist = `${dir}/dist`
|
|
9
|
-
const define = { "process.env.NODE_ENV": '"production"' }
|
|
10
|
-
rmSync(dist, { recursive: true, force: true })
|
|
11
|
-
mkdirSync(`${dist}/assets`, { recursive: true })
|
|
12
|
-
|
|
13
|
-
const client = await buildClient({
|
|
14
|
-
routesDir: `${dir}/routes`,
|
|
15
|
-
outDir: `${dist}/assets`,
|
|
16
|
-
clientModule: "@nifrajs/web-solid/client",
|
|
17
|
-
plugins: [solidBunPlugin("dom")],
|
|
18
|
-
conditions: ["bun", "solid", "browser"],
|
|
19
|
-
define,
|
|
20
|
-
})
|
|
21
|
-
const { worker } = await buildServer({
|
|
22
|
-
routesDir: `${dir}/routes`,
|
|
23
|
-
serverEntry: `${dir}/_worker.ts`,
|
|
24
|
-
outDir: `${dir}/.build`,
|
|
25
|
-
clientEntry: client.entry,
|
|
26
|
-
plugins: [solidBunPlugin("ssr")],
|
|
27
|
-
conditions: ["workerd", "edge-light", "solid", "browser"],
|
|
28
|
-
define,
|
|
29
|
-
})
|
|
30
|
-
cpSync(worker, `${dist}/_worker.js`)
|
|
31
|
-
rmSync(`${dir}/.build`, { recursive: true, force: true })
|
|
32
|
-
writeFileSync(
|
|
33
|
-
`${dist}/_routes.json`,
|
|
34
|
-
`${JSON.stringify({ version: 1, include: ["/*"], exclude: ["/assets/*"] }, null, 2)}\n`,
|
|
35
|
-
)
|
|
36
|
-
console.log("Cloudflare Pages output → dist (deploy: wrangler pages deploy dist)")
|
|
@@ -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,6 +0,0 @@
|
|
|
1
|
-
// The frontend adapter for this app. `create-nifra --framework <react|preact|vue|solid|svelte>` swaps
|
|
2
|
-
// this one line (and the routes + build config); every server entry imports the adapter from here, so
|
|
3
|
-
// they stay framework-agnostic.
|
|
4
|
-
import { solidAdapter } from "@nifrajs/web-solid"
|
|
5
|
-
|
|
6
|
-
export const adapter = solidAdapter
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
node_modules
|
|
2
|
-
dist
|
|
3
|
-
dist-bun
|
|
4
|
-
dist-node
|
|
5
|
-
dist-deno
|
|
6
|
-
.vercel
|
|
7
|
-
.build
|
|
8
|
-
.build-bun
|
|
9
|
-
.build-node
|
|
10
|
-
.build-deno
|
|
11
|
-
.build-vercel
|
|
12
|
-
.wrangler
|
|
13
|
-
# generated by buildServer next to the entry
|
|
14
|
-
server-manifest.ts
|
|
15
|
-
# generated by `nifra dev` (the Vite dev client entry) at the project root
|
|
16
|
-
.nifra-vite-entry.tsx
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "nifra-site",
|
|
3
|
-
"version": "0.0.0",
|
|
4
|
-
"type": "module",
|
|
5
|
-
"private": true,
|
|
6
|
-
"scripts": {
|
|
7
|
-
"dev": "nifra dev",
|
|
8
|
-
"preview": "bunx wrangler pages dev dist",
|
|
9
|
-
"build": "bun run build.ts",
|
|
10
|
-
"build:bun": "bun run build-bun.ts",
|
|
11
|
-
"build:node": "bun run build-node.ts",
|
|
12
|
-
"build:deno": "bun run build-deno.ts",
|
|
13
|
-
"build:vercel": "bun run build-vercel.ts",
|
|
14
|
-
"start": "bun dist-bun/server-bun.js",
|
|
15
|
-
"start:node": "node dist-node/server-node.js",
|
|
16
|
-
"deploy:cf": "wrangler pages deploy dist",
|
|
17
|
-
"deploy:vercel": "vercel deploy --prebuilt"
|
|
18
|
-
},
|
|
19
|
-
"dependencies": {
|
|
20
|
-
"@nifrajs/client": "^2.2.0",
|
|
21
|
-
"@nifrajs/core": "^2.2.0",
|
|
22
|
-
"@nifrajs/schema": "^2.2.0",
|
|
23
|
-
"@nifrajs/deno": "^2.2.0",
|
|
24
|
-
"@nifrajs/node": "^2.2.0",
|
|
25
|
-
"@nifrajs/web": "^2.2.0",
|
|
26
|
-
"@nifrajs/web-solid": "^2.2.0",
|
|
27
|
-
"solid-js": "^1.9.0"
|
|
28
|
-
},
|
|
29
|
-
"devDependencies": {
|
|
30
|
-
"@nifrajs/cli": "^2.2.0",
|
|
31
|
-
"typescript": "^6.0.3",
|
|
32
|
-
"vite": "^8.0.0",
|
|
33
|
-
"vite-plugin-solid": "^2.10.0"
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -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,38 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
7
|
-
"jsx": "preserve",
|
|
8
|
-
"jsxImportSource": "solid-js",
|
|
9
|
-
"strict": true,
|
|
10
|
-
"noUncheckedIndexedAccess": true,
|
|
11
|
-
"skipLibCheck": true,
|
|
12
|
-
"noEmit": true,
|
|
13
|
-
"verbatimModuleSyntax": true
|
|
14
|
-
},
|
|
15
|
-
"include": ["**/*.ts", "**/*.tsx"],
|
|
16
|
-
"exclude": [
|
|
17
|
-
"node_modules",
|
|
18
|
-
"dist",
|
|
19
|
-
"dist-bun",
|
|
20
|
-
"dist-node",
|
|
21
|
-
"dist-deno",
|
|
22
|
-
"dist-vercel",
|
|
23
|
-
".nifra",
|
|
24
|
-
".wrangler",
|
|
25
|
-
".vercel",
|
|
26
|
-
"server-manifest.ts",
|
|
27
|
-
"server-bun.ts",
|
|
28
|
-
"server-node.ts",
|
|
29
|
-
"server-deno.ts",
|
|
30
|
-
"server-vercel.ts",
|
|
31
|
-
"_worker.ts",
|
|
32
|
-
"build.ts",
|
|
33
|
-
"build-bun.ts",
|
|
34
|
-
"build-node.ts",
|
|
35
|
-
"build-deno.ts",
|
|
36
|
-
"build-vercel.ts"
|
|
37
|
-
]
|
|
38
|
-
}
|
|
@@ -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,15 +0,0 @@
|
|
|
1
|
-
import { server } from "@nifrajs/core/server"
|
|
2
|
-
import { t } from "@nifrajs/schema"
|
|
3
|
-
|
|
4
|
-
// Your backend contract — page loaders/actions call it in-process during SSR (no network). Replace
|
|
5
|
-
// the demo counter with real data (KV/D1/Postgres/…); on the edge, reach bindings via `c.env`.
|
|
6
|
-
let count = 0
|
|
7
|
-
|
|
8
|
-
const Counter = t.object({ count: t.number() })
|
|
9
|
-
|
|
10
|
-
export const backend = server()
|
|
11
|
-
.get("/count", { response: Counter }, () => ({ count }))
|
|
12
|
-
.post("/count", { response: Counter }, () => {
|
|
13
|
-
count += 1
|
|
14
|
-
return { count }
|
|
15
|
-
})
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// Build for Bun (nifra's flagship runtime) → dist-bun/ (server-bun.js + client assets).
|
|
2
|
-
// `bun run build:bun`. Run: `bun dist-bun/server-bun.js`.
|
|
3
|
-
import { cpSync, mkdirSync, rmSync } from "node:fs"
|
|
4
|
-
import { buildClient, buildServer } from "@nifrajs/web/build"
|
|
5
|
-
import { svelteBunPlugin } from "@nifrajs/web-svelte/plugin"
|
|
6
|
-
|
|
7
|
-
const dir = import.meta.dir
|
|
8
|
-
const dist = `${dir}/dist-bun`
|
|
9
|
-
const define = { "process.env.NODE_ENV": '"production"' }
|
|
10
|
-
rmSync(dist, { recursive: true, force: true })
|
|
11
|
-
mkdirSync(`${dist}/assets`, { recursive: true })
|
|
12
|
-
|
|
13
|
-
const client = await buildClient({
|
|
14
|
-
routesDir: `${dir}/routes`,
|
|
15
|
-
outDir: `${dist}/assets`,
|
|
16
|
-
clientModule: "@nifrajs/web-svelte/client",
|
|
17
|
-
plugins: [svelteBunPlugin("dom")],
|
|
18
|
-
conditions: ["bun", "browser"],
|
|
19
|
-
define,
|
|
20
|
-
})
|
|
21
|
-
const { worker } = await buildServer({
|
|
22
|
-
routesDir: `${dir}/routes`,
|
|
23
|
-
serverEntry: `${dir}/server-bun.ts`,
|
|
24
|
-
outDir: `${dir}/.build-bun`,
|
|
25
|
-
target: "bun",
|
|
26
|
-
clientEntry: client.entry,
|
|
27
|
-
plugins: [svelteBunPlugin("ssr")],
|
|
28
|
-
define,
|
|
29
|
-
})
|
|
30
|
-
cpSync(worker, `${dist}/server-bun.js`)
|
|
31
|
-
rmSync(`${dir}/.build-bun`, { recursive: true, force: true })
|
|
32
|
-
console.log("Bun output → dist-bun (run: bun dist-bun/server-bun.js)")
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// Build for Deno → dist-deno/ (server-deno.js + client assets). `bun run build:deno`.
|
|
2
|
-
// Run: `deno task start` (or deployctl).
|
|
3
|
-
import { cpSync, mkdirSync, rmSync } from "node:fs"
|
|
4
|
-
import { buildClient, buildServer } from "@nifrajs/web/build"
|
|
5
|
-
import { svelteBunPlugin } from "@nifrajs/web-svelte/plugin"
|
|
6
|
-
|
|
7
|
-
const dir = import.meta.dir
|
|
8
|
-
const dist = `${dir}/dist-deno`
|
|
9
|
-
const define = { "process.env.NODE_ENV": '"production"' }
|
|
10
|
-
rmSync(dist, { recursive: true, force: true })
|
|
11
|
-
mkdirSync(`${dist}/assets`, { recursive: true })
|
|
12
|
-
|
|
13
|
-
const client = await buildClient({
|
|
14
|
-
routesDir: `${dir}/routes`,
|
|
15
|
-
outDir: `${dist}/assets`,
|
|
16
|
-
clientModule: "@nifrajs/web-svelte/client",
|
|
17
|
-
plugins: [svelteBunPlugin("dom")],
|
|
18
|
-
conditions: ["bun", "browser"],
|
|
19
|
-
define,
|
|
20
|
-
})
|
|
21
|
-
const { worker } = await buildServer({
|
|
22
|
-
routesDir: `${dir}/routes`,
|
|
23
|
-
serverEntry: `${dir}/server-deno.ts`,
|
|
24
|
-
outDir: `${dir}/.build-deno`,
|
|
25
|
-
clientEntry: client.entry,
|
|
26
|
-
plugins: [svelteBunPlugin("ssr")],
|
|
27
|
-
define,
|
|
28
|
-
})
|
|
29
|
-
cpSync(worker, `${dist}/server-deno.js`)
|
|
30
|
-
rmSync(`${dir}/.build-deno`, { recursive: true, force: true })
|
|
31
|
-
console.log("Deno output → dist-deno (run: deno run -A dist-deno/server-deno.js)")
|