create-nifra 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/agents.d.ts +22 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +259 -0
- package/dist/agents.js.map +1 -0
- package/dist/auth.d.ts +30 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +90 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +101 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +450 -0
- package/dist/cli.js.map +1 -0
- package/dist/db.d.ts +39 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +467 -0
- package/dist/db.js.map +1 -0
- package/package.json +50 -0
- package/template/README.md +24 -0
- package/template/gitignore +6 -0
- package/template/package.json +20 -0
- package/template/src/app.test.ts +8 -0
- package/template/src/app.ts +8 -0
- package/template/src/index.ts +5 -0
- package/template/tsconfig.json +16 -0
- package/template-isr/README.md +46 -0
- package/template-isr/backend.ts +12 -0
- package/template-isr/build.ts +23 -0
- package/template-isr/gitignore +7 -0
- package/template-isr/package.json +24 -0
- package/template-isr/routes/_404.tsx +10 -0
- package/template-isr/routes/_layout.tsx +18 -0
- package/template-isr/routes/index.tsx +34 -0
- package/template-isr/server.ts +56 -0
- package/template-isr/tsconfig.json +28 -0
- package/template-isr/worker.ts +52 -0
- package/template-isr/wrangler.toml +20 -0
- package/template-site/.dockerignore +14 -0
- package/template-site/Dockerfile +20 -0
- package/template-site/README.md +44 -0
- package/template-site/_worker.ts +17 -0
- package/template-site/backend.ts +12 -0
- package/template-site/build-bun.ts +27 -0
- package/template-site/build-deno.ts +25 -0
- package/template-site/build-node.ts +26 -0
- package/template-site/build-vercel.ts +45 -0
- package/template-site/build.ts +29 -0
- package/template-site/deno.json +7 -0
- package/template-site/framework.ts +6 -0
- package/template-site/gitignore +16 -0
- package/template-site/nifra.config.ts +9 -0
- package/template-site/package.json +37 -0
- package/template-site/routes/_404.tsx +20 -0
- package/template-site/routes/_layout.tsx +40 -0
- package/template-site/routes/index.tsx +53 -0
- package/template-site/server-bun.ts +35 -0
- package/template-site/server-deno.ts +38 -0
- package/template-site/server-node.ts +40 -0
- package/template-site/server-vercel.ts +17 -0
- package/template-site/tsconfig.json +37 -0
- package/template-site/wrangler.toml +4 -0
- package/template-site-preact/.dockerignore +14 -0
- package/template-site-preact/Dockerfile +20 -0
- package/template-site-preact/README.md +43 -0
- package/template-site-preact/_worker.ts +17 -0
- package/template-site-preact/backend.ts +12 -0
- package/template-site-preact/build-bun.ts +27 -0
- package/template-site-preact/build-deno.ts +25 -0
- package/template-site-preact/build-node.ts +26 -0
- package/template-site-preact/build-vercel.ts +45 -0
- package/template-site-preact/build.ts +29 -0
- package/template-site-preact/deno.json +7 -0
- package/template-site-preact/framework.ts +6 -0
- package/template-site-preact/gitignore +16 -0
- package/template-site-preact/nifra.config.ts +9 -0
- package/template-site-preact/package.json +34 -0
- package/template-site-preact/routes/_404.tsx +20 -0
- package/template-site-preact/routes/_layout.tsx +40 -0
- package/template-site-preact/routes/index.tsx +53 -0
- package/template-site-preact/server-bun.ts +35 -0
- package/template-site-preact/server-deno.ts +38 -0
- package/template-site-preact/server-node.ts +40 -0
- package/template-site-preact/server-vercel.ts +17 -0
- package/template-site-preact/tsconfig.json +38 -0
- package/template-site-preact/wrangler.toml +4 -0
- package/template-site-solid/.dockerignore +14 -0
- package/template-site-solid/Dockerfile +20 -0
- package/template-site-solid/README.md +43 -0
- package/template-site-solid/_worker.ts +17 -0
- package/template-site-solid/backend.ts +12 -0
- package/template-site-solid/build-bun.ts +33 -0
- package/template-site-solid/build-deno.ts +32 -0
- package/template-site-solid/build-node.ts +33 -0
- package/template-site-solid/build-vercel.ts +47 -0
- package/template-site-solid/build.ts +36 -0
- package/template-site-solid/deno.json +7 -0
- package/template-site-solid/framework.ts +6 -0
- package/template-site-solid/gitignore +16 -0
- package/template-site-solid/nifra.config.ts +14 -0
- package/template-site-solid/package.json +34 -0
- package/template-site-solid/routes/_404.tsx +20 -0
- package/template-site-solid/routes/_layout.tsx +39 -0
- package/template-site-solid/routes/index.tsx +53 -0
- package/template-site-solid/server-bun.ts +35 -0
- package/template-site-solid/server-deno.ts +38 -0
- package/template-site-solid/server-node.ts +40 -0
- package/template-site-solid/server-vercel.ts +17 -0
- package/template-site-solid/tsconfig.json +38 -0
- package/template-site-solid/wrangler.toml +4 -0
- package/template-site-svelte/.dockerignore +14 -0
- package/template-site-svelte/Dockerfile +20 -0
- package/template-site-svelte/README.md +45 -0
- package/template-site-svelte/_worker.ts +17 -0
- package/template-site-svelte/backend.ts +12 -0
- package/template-site-svelte/build-bun.ts +32 -0
- package/template-site-svelte/build-deno.ts +31 -0
- package/template-site-svelte/build-node.ts +32 -0
- package/template-site-svelte/build-vercel.ts +46 -0
- package/template-site-svelte/build.ts +35 -0
- package/template-site-svelte/deno.json +7 -0
- package/template-site-svelte/framework.ts +6 -0
- package/template-site-svelte/gitignore +16 -0
- package/template-site-svelte/nifra.config.ts +13 -0
- package/template-site-svelte/package.json +34 -0
- package/template-site-svelte/routes/_404.svelte +16 -0
- package/template-site-svelte/routes/_layout.svelte +35 -0
- package/template-site-svelte/routes/index.svelte +47 -0
- package/template-site-svelte/server-bun.ts +35 -0
- package/template-site-svelte/server-deno.ts +38 -0
- package/template-site-svelte/server-node.ts +40 -0
- package/template-site-svelte/server-vercel.ts +17 -0
- package/template-site-svelte/tsconfig.json +37 -0
- package/template-site-svelte/wrangler.toml +4 -0
- package/template-site-vue/.dockerignore +14 -0
- package/template-site-vue/Dockerfile +20 -0
- package/template-site-vue/README.md +45 -0
- package/template-site-vue/_worker.ts +17 -0
- package/template-site-vue/backend.ts +12 -0
- package/template-site-vue/build-bun.ts +37 -0
- package/template-site-vue/build-deno.ts +36 -0
- package/template-site-vue/build-node.ts +37 -0
- package/template-site-vue/build-vercel.ts +54 -0
- package/template-site-vue/build.ts +40 -0
- package/template-site-vue/deno.json +7 -0
- package/template-site-vue/framework.ts +6 -0
- package/template-site-vue/gitignore +16 -0
- package/template-site-vue/nifra.config.ts +19 -0
- package/template-site-vue/package.json +35 -0
- package/template-site-vue/routes/_404.vue +18 -0
- package/template-site-vue/routes/_layout.vue +40 -0
- package/template-site-vue/routes/index.vue +56 -0
- package/template-site-vue/server-bun.ts +35 -0
- package/template-site-vue/server-deno.ts +38 -0
- package/template-site-vue/server-node.ts +40 -0
- package/template-site-vue/server-vercel.ts +17 -0
- package/template-site-vue/tsconfig.json +37 -0
- package/template-site-vue/wrangler.toml +4 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Scaffold a new nifra app: `bun create nifra <directory>` (or `npm create nifra <dir>`).
|
|
4
|
+
*
|
|
5
|
+
* bun create nifra my-app # api backend (default)
|
|
6
|
+
* bun create nifra my-app --template site # multi-target SSR site
|
|
7
|
+
* bun create nifra my-app --deploy vercel # site, with Vercel as the default deploy target
|
|
8
|
+
*
|
|
9
|
+
* Copies the bundled template, restores `.gitignore` (npm strips a literal one from packages), sets the
|
|
10
|
+
* app's `package.json` name, and — with `--deploy <target>` (site template only) — repoints the default
|
|
11
|
+
* `build`/`deploy` scripts at that target and fills the project name into its config. Refuses to overwrite.
|
|
12
|
+
*/
|
|
13
|
+
import { realpathSync } from "node:fs";
|
|
14
|
+
import { cp, mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
15
|
+
import { basename, join, relative, resolve } from "node:path";
|
|
16
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
17
|
+
import { agentsMd } from "./agents.js";
|
|
18
|
+
import { AUTH_CHOICES, AUTH_PRESETS, assertAuthableDb, writeAuthFiles, } from "./auth.js";
|
|
19
|
+
import { DB_CHOICES, DB_PRESETS, writeDbFiles } from "./db.js";
|
|
20
|
+
const TEMPLATES = {
|
|
21
|
+
api: "../template",
|
|
22
|
+
site: "../template-site",
|
|
23
|
+
isr: "../template-isr",
|
|
24
|
+
};
|
|
25
|
+
/** Frontend frameworks the `site` template can scaffold. React is the default (`template-site`); the
|
|
26
|
+
* rest live in `template-site-<framework>` siblings — same multi-target deploy story, different adapter
|
|
27
|
+
* + routes. */
|
|
28
|
+
const FRAMEWORKS = ["react", "preact", "vue", "solid", "svelte"];
|
|
29
|
+
const DEPLOY = {
|
|
30
|
+
bun: {
|
|
31
|
+
label: "Bun",
|
|
32
|
+
build: "bun run build-bun.ts",
|
|
33
|
+
deploy: "bun run start",
|
|
34
|
+
steps: ["bun run build", "bun run start # serves on $PORT (default 3000), any host"],
|
|
35
|
+
},
|
|
36
|
+
node: {
|
|
37
|
+
label: "Node (Docker)",
|
|
38
|
+
build: "bun run build-node.ts",
|
|
39
|
+
deploy: "docker build -t NAME . && docker run -p 3000:3000 NAME",
|
|
40
|
+
steps: ["bun run build", "bun run deploy # docker build + run (or `bun run start:node`)"],
|
|
41
|
+
},
|
|
42
|
+
deno: {
|
|
43
|
+
label: "Deno Deploy",
|
|
44
|
+
build: "bun run build-deno.ts",
|
|
45
|
+
deploy: "deployctl deploy --prod --entrypoint=dist-deno/server-deno.js",
|
|
46
|
+
steps: [
|
|
47
|
+
"bun run build",
|
|
48
|
+
"bun run deploy # deployctl (install: deno install -A jsr:@deno/deployctl)",
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
"cf-pages": {
|
|
52
|
+
label: "Cloudflare Pages",
|
|
53
|
+
build: "bun run build.ts",
|
|
54
|
+
deploy: "wrangler pages deploy dist",
|
|
55
|
+
steps: ["bun run build", "bun run deploy # wrangler pages deploy dist"],
|
|
56
|
+
},
|
|
57
|
+
vercel: {
|
|
58
|
+
label: "Vercel Edge",
|
|
59
|
+
build: "bun run build-vercel.ts",
|
|
60
|
+
deploy: "vercel deploy --prebuilt",
|
|
61
|
+
steps: ["bun run build", "bun run deploy # vercel deploy --prebuilt"],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
// Self-hosted servers (bun/node) have no canonical push-to-deploy — CI builds + uploads the artifact and
|
|
65
|
+
// leaves a host-specific placeholder. The managed targets use the vendor's official action/CLI.
|
|
66
|
+
const SELF_HOSTED_STEP = (hint) => ` # Self-hosted: deploy is host-specific. The build output is in dist*/ — add your step here
|
|
67
|
+
# (${hint}). Until then, CI builds on every push and uploads the bundle as an artifact.
|
|
68
|
+
- name: Upload build
|
|
69
|
+
if: github.ref == 'refs/heads/main'
|
|
70
|
+
uses: actions/upload-artifact@v4
|
|
71
|
+
with:
|
|
72
|
+
name: build
|
|
73
|
+
path: dist*`;
|
|
74
|
+
const CI_DEPLOY = {
|
|
75
|
+
bun: {
|
|
76
|
+
permissions: " contents: read",
|
|
77
|
+
secrets: [],
|
|
78
|
+
step: SELF_HOSTED_STEP("flyctl deploy, an SSH/rsync to a VM, a container push, …"),
|
|
79
|
+
},
|
|
80
|
+
node: {
|
|
81
|
+
permissions: " contents: read",
|
|
82
|
+
secrets: [],
|
|
83
|
+
step: SELF_HOSTED_STEP("the template ships a Dockerfile — push to a registry, or flyctl/SSH"),
|
|
84
|
+
},
|
|
85
|
+
deno: {
|
|
86
|
+
// OIDC: link the repo in the Deno Deploy dashboard (no token needed) — needs id-token: write.
|
|
87
|
+
permissions: " contents: read\n id-token: write",
|
|
88
|
+
secrets: [],
|
|
89
|
+
step: ` - name: Publish to Deno Deploy
|
|
90
|
+
if: github.ref == 'refs/heads/main'
|
|
91
|
+
uses: denoland/deployctl@v1
|
|
92
|
+
with:
|
|
93
|
+
project: NAME
|
|
94
|
+
entrypoint: dist-deno/server-deno.js`,
|
|
95
|
+
},
|
|
96
|
+
"cf-pages": {
|
|
97
|
+
permissions: " contents: read",
|
|
98
|
+
secrets: ["CLOUDFLARE_API_TOKEN", "CLOUDFLARE_ACCOUNT_ID"],
|
|
99
|
+
step: ` - name: Publish to Cloudflare Pages
|
|
100
|
+
if: github.ref == 'refs/heads/main'
|
|
101
|
+
uses: cloudflare/wrangler-action@v3
|
|
102
|
+
with:
|
|
103
|
+
apiToken: \${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
104
|
+
accountId: \${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
|
105
|
+
command: pages deploy dist --project-name=NAME`,
|
|
106
|
+
},
|
|
107
|
+
vercel: {
|
|
108
|
+
permissions: " contents: read",
|
|
109
|
+
secrets: ["VERCEL_TOKEN", "VERCEL_ORG_ID", "VERCEL_PROJECT_ID"],
|
|
110
|
+
step: ` - name: Publish to Vercel
|
|
111
|
+
if: github.ref == 'refs/heads/main'
|
|
112
|
+
run: bunx vercel deploy --prebuilt --prod --token="$VERCEL_TOKEN"
|
|
113
|
+
env:
|
|
114
|
+
VERCEL_TOKEN: \${{ secrets.VERCEL_TOKEN }}
|
|
115
|
+
VERCEL_ORG_ID: \${{ secrets.VERCEL_ORG_ID }}
|
|
116
|
+
VERCEL_PROJECT_ID: \${{ secrets.VERCEL_PROJECT_ID }}`,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Build a GitHub Actions workflow that builds on every push/PR and deploys `target` on a push to `main`.
|
|
121
|
+
* Reuses the canonical `bun run build` (the deploy preset repoints it), then runs the target's official
|
|
122
|
+
* deploy mechanism. Exported for unit tests. Throws on an unknown target.
|
|
123
|
+
*/
|
|
124
|
+
export function githubDeployWorkflow(target, appName) {
|
|
125
|
+
const ci = CI_DEPLOY[target];
|
|
126
|
+
if (ci === undefined) {
|
|
127
|
+
throw new Error(`no CI workflow for deploy target "${target}"`);
|
|
128
|
+
}
|
|
129
|
+
const header = ci.secrets.length > 0
|
|
130
|
+
? `# Set these repository secrets (Settings → Secrets and variables → Actions):\n${ci.secrets
|
|
131
|
+
.map((s) => `# ${s}`)
|
|
132
|
+
.join("\n")}\n`
|
|
133
|
+
: "# No deploy secrets required (see the deploy step below).\n";
|
|
134
|
+
return `${header}name: Deploy
|
|
135
|
+
on:
|
|
136
|
+
push:
|
|
137
|
+
branches: [main]
|
|
138
|
+
pull_request:
|
|
139
|
+
permissions:
|
|
140
|
+
${ci.permissions}
|
|
141
|
+
jobs:
|
|
142
|
+
deploy:
|
|
143
|
+
runs-on: ubuntu-latest
|
|
144
|
+
steps:
|
|
145
|
+
- uses: actions/checkout@v4
|
|
146
|
+
- uses: oven-sh/setup-bun@v2
|
|
147
|
+
- run: bun install --frozen-lockfile
|
|
148
|
+
- run: bun run build
|
|
149
|
+
${ci.step.replaceAll("NAME", appName)}
|
|
150
|
+
`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Copy a template into `target` and finalize it (gitignore rename, package name, optional deploy preset).
|
|
154
|
+
* Throws on: unknown template, `--deploy` with a non-site template, unknown deploy target, or an existing
|
|
155
|
+
* destination. Pure enough to unit-test (no argv, no process.exit).
|
|
156
|
+
*/
|
|
157
|
+
export async function scaffold(opts) {
|
|
158
|
+
const template = opts.template ?? "api";
|
|
159
|
+
if (TEMPLATES[template] === undefined) {
|
|
160
|
+
throw new Error(`unknown template "${template}". options: ${Object.keys(TEMPLATES).join(", ")}`);
|
|
161
|
+
}
|
|
162
|
+
// Framework picker (site only): non-React frameworks live in `template-site-<framework>`.
|
|
163
|
+
let framework;
|
|
164
|
+
if (opts.framework !== undefined) {
|
|
165
|
+
if (template !== "site") {
|
|
166
|
+
throw new Error(`--framework requires the site template (got "${template}")`);
|
|
167
|
+
}
|
|
168
|
+
if (!FRAMEWORKS.includes(opts.framework)) {
|
|
169
|
+
throw new Error(`unknown framework "${opts.framework}". options: ${FRAMEWORKS.join(", ")}`);
|
|
170
|
+
}
|
|
171
|
+
framework = opts.framework;
|
|
172
|
+
}
|
|
173
|
+
const templateRel = template === "site" && framework !== undefined && framework !== "react"
|
|
174
|
+
? `../template-site-${framework}`
|
|
175
|
+
: TEMPLATES[template];
|
|
176
|
+
let preset;
|
|
177
|
+
if (opts.deploy !== undefined) {
|
|
178
|
+
if (template !== "site") {
|
|
179
|
+
throw new Error(`--deploy requires the site template (got "${template}")`);
|
|
180
|
+
}
|
|
181
|
+
preset = DEPLOY[opts.deploy];
|
|
182
|
+
if (preset === undefined) {
|
|
183
|
+
throw new Error(`unknown deploy target "${opts.deploy}". options: ${Object.keys(DEPLOY).join(", ")}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (opts.ci !== undefined) {
|
|
187
|
+
if (opts.ci !== "github")
|
|
188
|
+
throw new Error(`unknown --ci "${opts.ci}". options: github`);
|
|
189
|
+
if (preset === undefined) {
|
|
190
|
+
throw new Error("--ci requires --deploy <target> (the workflow deploys that target)");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// DB preset (any template — an API or a site can both want persistence).
|
|
194
|
+
let db;
|
|
195
|
+
if (opts.db !== undefined) {
|
|
196
|
+
if (!DB_CHOICES.includes(opts.db)) {
|
|
197
|
+
throw new Error(`unknown --db "${opts.db}". options: ${DB_CHOICES.join(", ")}`);
|
|
198
|
+
}
|
|
199
|
+
db = opts.db;
|
|
200
|
+
}
|
|
201
|
+
// Auth preset — needs a database, so it requires `--db` (the auth tables live in your Drizzle DB).
|
|
202
|
+
let auth;
|
|
203
|
+
if (opts.auth !== undefined) {
|
|
204
|
+
if (!AUTH_CHOICES.includes(opts.auth)) {
|
|
205
|
+
throw new Error(`unknown --auth "${opts.auth}". options: ${AUTH_CHOICES.join(", ")}`);
|
|
206
|
+
}
|
|
207
|
+
if (db === undefined) {
|
|
208
|
+
throw new Error("--auth requires --db (better-auth needs a database; e.g. --db drizzle-libsql)");
|
|
209
|
+
}
|
|
210
|
+
assertAuthableDb(db); // reject --auth + an ORM with no drop-in better-auth adapter (e.g. Kysely)
|
|
211
|
+
auth = opts.auth;
|
|
212
|
+
}
|
|
213
|
+
const templateDir = fileURLToPath(new URL(templateRel, import.meta.url));
|
|
214
|
+
// Default: errorOnExist + force:false → reject rather than clobber an existing directory.
|
|
215
|
+
// --force: allow overwriting an existing destination (needed for `bun create nifra .`).
|
|
216
|
+
await cp(templateDir, opts.target, {
|
|
217
|
+
recursive: true,
|
|
218
|
+
...(opts.force ? { force: true } : { errorOnExist: true, force: false }),
|
|
219
|
+
});
|
|
220
|
+
// The template ships its ignore file as `gitignore` (npm strips a literal `.gitignore`); restore the dot.
|
|
221
|
+
try {
|
|
222
|
+
await rename(join(opts.target, "gitignore"), join(opts.target, ".gitignore"));
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// A template without a `gitignore` — nothing to restore.
|
|
226
|
+
}
|
|
227
|
+
const name = basename(opts.target);
|
|
228
|
+
const pkgPath = join(opts.target, "package.json");
|
|
229
|
+
const pkg = JSON.parse(await readFile(pkgPath, "utf8"));
|
|
230
|
+
pkg.name = name;
|
|
231
|
+
if (preset !== undefined) {
|
|
232
|
+
// Multi-target stays intact (build:*, deploy:* scripts); just point the canonical aliases at the pick.
|
|
233
|
+
pkg.scripts = { ...(pkg.scripts ?? {}) };
|
|
234
|
+
pkg.scripts.build = preset.build;
|
|
235
|
+
pkg.scripts.deploy = preset.deploy.replaceAll("NAME", name);
|
|
236
|
+
}
|
|
237
|
+
if (db !== undefined) {
|
|
238
|
+
// Merge the Drizzle preset's deps + db:* scripts; `bun install` then resolves them.
|
|
239
|
+
const dbp = DB_PRESETS[db];
|
|
240
|
+
pkg.dependencies = { ...(pkg.dependencies ?? {}), ...dbp.deps };
|
|
241
|
+
pkg.devDependencies = { ...(pkg.devDependencies ?? {}), ...dbp.devDeps };
|
|
242
|
+
pkg.scripts = { ...(pkg.scripts ?? {}), ...dbp.scripts };
|
|
243
|
+
}
|
|
244
|
+
if (auth !== undefined) {
|
|
245
|
+
pkg.dependencies = { ...(pkg.dependencies ?? {}), ...AUTH_PRESETS[auth].deps };
|
|
246
|
+
}
|
|
247
|
+
// --link: replace @nifrajs/* semver refs with file: paths pointing at the local monorepo's packages/
|
|
248
|
+
// directory — lets an app consume nifra from a sibling repo before the packages are published.
|
|
249
|
+
if (opts.link !== undefined) {
|
|
250
|
+
const linkPackages = resolve(opts.link, "packages");
|
|
251
|
+
const targetAbs = resolve(opts.target);
|
|
252
|
+
for (const section of ["dependencies", "devDependencies"]) {
|
|
253
|
+
const deps = pkg[section];
|
|
254
|
+
if (deps === undefined)
|
|
255
|
+
continue;
|
|
256
|
+
for (const dep of Object.keys(deps)) {
|
|
257
|
+
if (!dep.startsWith("@nifrajs/"))
|
|
258
|
+
continue;
|
|
259
|
+
const pkgDir = join(linkPackages, dep.slice("@nifrajs/".length));
|
|
260
|
+
if (await Bun.file(join(pkgDir, "package.json")).exists()) {
|
|
261
|
+
deps[dep] = `file:${relative(targetAbs, pkgDir)}`;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
await writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
267
|
+
// Ship agent guidance so a coding agent (Claude Code, Cursor, …) writes correct nifra code from the
|
|
268
|
+
// first prompt — the conventions + the gotchas, tailored to this template.
|
|
269
|
+
await writeFile(join(opts.target, "AGENTS.md"), agentsMd({
|
|
270
|
+
template,
|
|
271
|
+
framework: framework ?? "react",
|
|
272
|
+
name,
|
|
273
|
+
...(db !== undefined ? { db } : {}),
|
|
274
|
+
...(auth !== undefined ? { auth } : {}),
|
|
275
|
+
}));
|
|
276
|
+
// Wire the Drizzle data layer (db/ module + drizzle.config + .env.example + gitignore entries).
|
|
277
|
+
if (db !== undefined)
|
|
278
|
+
await writeDbFiles(opts.target, db);
|
|
279
|
+
// Wire auth AFTER the DB (it appends to the .env.example the DB preset wrote; --auth requires --db).
|
|
280
|
+
if (auth !== undefined && db !== undefined)
|
|
281
|
+
await writeAuthFiles(opts.target, auth, db);
|
|
282
|
+
// Fill the project name into the site template's wrangler config (CF Pages project name).
|
|
283
|
+
if (template === "site") {
|
|
284
|
+
const wranglerPath = join(opts.target, "wrangler.toml");
|
|
285
|
+
try {
|
|
286
|
+
const toml = await readFile(wranglerPath, "utf8");
|
|
287
|
+
await writeFile(wranglerPath, toml.replace(/^name = ".*"$/m, `name = "${name}"`));
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// No wrangler.toml — skip the name fill.
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Emit a CI deploy workflow for the chosen target (validated above to require a deploy preset).
|
|
294
|
+
let ciResult;
|
|
295
|
+
if (opts.ci === "github" && opts.deploy !== undefined) {
|
|
296
|
+
const workflowsDir = join(opts.target, ".github", "workflows");
|
|
297
|
+
await mkdir(workflowsDir, { recursive: true });
|
|
298
|
+
await writeFile(join(workflowsDir, "deploy.yml"), githubDeployWorkflow(opts.deploy, name));
|
|
299
|
+
ciResult = { ci: "github", ciSecrets: CI_DEPLOY[opts.deploy]?.secrets ?? [] };
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
name,
|
|
303
|
+
template,
|
|
304
|
+
...(framework !== undefined ? { framework } : {}),
|
|
305
|
+
...(preset !== undefined ? { deploy: preset } : {}),
|
|
306
|
+
...(ciResult !== undefined ? ciResult : {}),
|
|
307
|
+
...(db !== undefined ? { db } : {}),
|
|
308
|
+
...(auth !== undefined ? { auth } : {}),
|
|
309
|
+
...(opts.link !== undefined ? { link: opts.link } : {}),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/** Parse `[dir] [--template|-t <t>] [--framework|-f <fw>] [--deploy|-d <target>] [--ci|-c github]
|
|
313
|
+
* [--db <preset>] [--auth <preset>] [--force] [--link <path>]`.
|
|
314
|
+
* `--framework`/`--deploy`/`--ci` all default the template to `site`. */
|
|
315
|
+
export function parseArgs(argv) {
|
|
316
|
+
const rest = [...argv];
|
|
317
|
+
const take = (...flags) => {
|
|
318
|
+
const i = rest.findIndex((a) => flags.includes(a));
|
|
319
|
+
if (i === -1)
|
|
320
|
+
return undefined;
|
|
321
|
+
const value = rest[i + 1];
|
|
322
|
+
rest.splice(i, 2);
|
|
323
|
+
return value;
|
|
324
|
+
};
|
|
325
|
+
const hasFlag = (...flags) => {
|
|
326
|
+
const i = rest.findIndex((a) => flags.includes(a));
|
|
327
|
+
if (i === -1)
|
|
328
|
+
return false;
|
|
329
|
+
rest.splice(i, 1);
|
|
330
|
+
return true;
|
|
331
|
+
};
|
|
332
|
+
const templateFlag = take("--template", "-t");
|
|
333
|
+
const framework = take("--framework", "-f");
|
|
334
|
+
const deploy = take("--deploy", "-d");
|
|
335
|
+
const ci = take("--ci", "-c");
|
|
336
|
+
const db = take("--db");
|
|
337
|
+
const auth = take("--auth");
|
|
338
|
+
const link = take("--link");
|
|
339
|
+
const force = hasFlag("--force");
|
|
340
|
+
const target = rest.find((a) => !a.startsWith("-"));
|
|
341
|
+
// `--framework`/`--deploy`/`--ci` imply the multi-target site template unless one was named explicitly.
|
|
342
|
+
const template = (templateFlag ??
|
|
343
|
+
(framework !== undefined || deploy !== undefined || ci !== undefined ? "site" : undefined));
|
|
344
|
+
return {
|
|
345
|
+
...(target !== undefined ? { target } : {}),
|
|
346
|
+
...(template !== undefined ? { template } : {}),
|
|
347
|
+
...(framework !== undefined ? { framework } : {}),
|
|
348
|
+
...(deploy !== undefined ? { deploy } : {}),
|
|
349
|
+
...(ci !== undefined ? { ci } : {}),
|
|
350
|
+
...(db !== undefined ? { db } : {}),
|
|
351
|
+
...(auth !== undefined ? { auth } : {}),
|
|
352
|
+
...(link !== undefined ? { link } : {}),
|
|
353
|
+
...(force ? { force } : {}),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
const USAGE = `usage: bun create nifra <directory> [--template api|site|isr] [--framework react|preact|vue|solid|svelte] [--deploy bun|node|deno|cf-pages|vercel] [--ci github] [--db ${DB_CHOICES.join("|")}] [--auth ${AUTH_CHOICES.join("|")}] [--force] [--link <path-to-nifra-repo>]`;
|
|
357
|
+
/**
|
|
358
|
+
* Run the CLI for `argv` and return the exit code + the message to print — no `process.exit`, `console`,
|
|
359
|
+
* or `process.argv`, so the whole flow (parse → scaffold → next-steps) is unit-testable in-process.
|
|
360
|
+
*/
|
|
361
|
+
export async function run(argv) {
|
|
362
|
+
const { target, template, framework, deploy, ci, db, auth, force, link } = parseArgs(argv);
|
|
363
|
+
if (target === undefined)
|
|
364
|
+
return { code: 1, message: USAGE };
|
|
365
|
+
let result;
|
|
366
|
+
try {
|
|
367
|
+
result = await scaffold({
|
|
368
|
+
target,
|
|
369
|
+
...(template !== undefined ? { template } : {}),
|
|
370
|
+
...(framework !== undefined ? { framework } : {}),
|
|
371
|
+
...(deploy !== undefined ? { deploy } : {}),
|
|
372
|
+
...(ci !== undefined ? { ci } : {}),
|
|
373
|
+
...(db !== undefined ? { db } : {}),
|
|
374
|
+
...(auth !== undefined ? { auth } : {}),
|
|
375
|
+
...(force ? { force } : {}),
|
|
376
|
+
...(link !== undefined ? { link } : {}),
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
catch (err) {
|
|
380
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
381
|
+
// A copy failure is almost always "destination exists" — say so plainly.
|
|
382
|
+
const friendly = /exist/i.test(msg)
|
|
383
|
+
? `refusing to scaffold: "${target}" already exists. Use --force to overwrite.`
|
|
384
|
+
: msg;
|
|
385
|
+
return { code: 1, message: `✗ ${friendly}` };
|
|
386
|
+
}
|
|
387
|
+
const steps = [`cd ${target}`, "bun install", "bun run dev"];
|
|
388
|
+
if (result.ci !== undefined) {
|
|
389
|
+
// CI deploys on push — surface the workflow + the secrets to set first.
|
|
390
|
+
steps[2] = "bun run dev # local preview";
|
|
391
|
+
if (result.ciSecrets !== undefined && result.ciSecrets.length > 0) {
|
|
392
|
+
steps.push(`# set repo secrets: ${result.ciSecrets.join(", ")}`);
|
|
393
|
+
}
|
|
394
|
+
steps.push("git push # CI builds + deploys on push to main (.github/workflows/deploy.yml)");
|
|
395
|
+
}
|
|
396
|
+
else if (result.deploy !== undefined) {
|
|
397
|
+
steps[2] = "bun run dev # local preview";
|
|
398
|
+
steps.push(...result.deploy.steps);
|
|
399
|
+
}
|
|
400
|
+
if (result.db !== undefined) {
|
|
401
|
+
// After install: set the connection string. When auth is wired, generate its tables into the schema
|
|
402
|
+
// FIRST, then create + apply the migration so the auth tables are included.
|
|
403
|
+
steps.push(`cp .env.example .env # then set DATABASE_URL${result.auth ? " + BETTER_AUTH_SECRET" : ""}`);
|
|
404
|
+
if (result.auth !== undefined) {
|
|
405
|
+
steps.push("bunx @better-auth/cli@latest generate # writes auth tables into db/schema.ts");
|
|
406
|
+
}
|
|
407
|
+
steps.push("bun run db:generate # SQL from db/schema.ts", "bun run db:migrate # apply it");
|
|
408
|
+
}
|
|
409
|
+
// Tag the chosen framework + deploy target + db + auth, e.g. "(Vue, Drizzle + libSQL, better-auth)".
|
|
410
|
+
const tags = [
|
|
411
|
+
...(result.framework !== undefined ? [result.framework] : []),
|
|
412
|
+
...(result.deploy !== undefined ? [result.deploy.label] : []),
|
|
413
|
+
...(result.db !== undefined ? [DB_PRESETS[result.db].label] : []),
|
|
414
|
+
...(result.auth !== undefined ? [AUTH_PRESETS[result.auth].label] : []),
|
|
415
|
+
];
|
|
416
|
+
if (result.link !== undefined) {
|
|
417
|
+
steps.push(`# @nifrajs/* packages linked from ${result.link} — move the app and update file: paths if you relocate it`);
|
|
418
|
+
}
|
|
419
|
+
const header = tags.length > 0 ? `✓ Created ${target} (${tags.join(", ")})` : `✓ Created ${target}`;
|
|
420
|
+
return {
|
|
421
|
+
code: 0,
|
|
422
|
+
message: `\n${header}\n\nNext steps:\n${steps.map((s) => ` ${s}`).join("\n")}\n`,
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* True when this module is the program entry point. `import.meta.main` covers Bun, Deno, and Node ≥ 24;
|
|
427
|
+
* on older Node it's `undefined`, so fall back to comparing the resolved entry path — otherwise
|
|
428
|
+
* `npx create-nifra` / `npm create nifra` would silently no-op (the block below never runs).
|
|
429
|
+
*/
|
|
430
|
+
function isMainModule() {
|
|
431
|
+
const metaMain = import.meta.main;
|
|
432
|
+
if (metaMain !== undefined)
|
|
433
|
+
return metaMain;
|
|
434
|
+
const entry = process.argv[1];
|
|
435
|
+
if (entry === undefined)
|
|
436
|
+
return false;
|
|
437
|
+
try {
|
|
438
|
+
// realpath resolves the npm/npx bin symlink so it matches `import.meta.url` (which is realpath-based).
|
|
439
|
+
return pathToFileURL(realpathSync(entry)).href === import.meta.url;
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (isMainModule()) {
|
|
446
|
+
const { code, message } = await run(process.argv.slice(2));
|
|
447
|
+
(code === 0 ? console.log : console.error)(message);
|
|
448
|
+
process.exit(code);
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--db <preset>` — wire a Drizzle data layer into a freshly scaffolded app, so a human (or a coding
|
|
3
|
+
* agent) starts from a correct, production-grade DB setup instead of inventing one. nifra ships NO DB
|
|
4
|
+
* abstraction (that belongs to Drizzle/libSQL, not a web framework) — this just bundles the existing
|
|
5
|
+
* tool, the Redwood-style "batteries available" move: a starter schema, a typed client, a migration
|
|
6
|
+
* config, scripts, and env, all rip-out-able.
|
|
7
|
+
*
|
|
8
|
+
* Three presets, by runtime fit:
|
|
9
|
+
* - drizzle-libsql — SQLite that runs EVERYWHERE incl. the edge (local file, or Turso). The default
|
|
10
|
+
* cross-runtime answer.
|
|
11
|
+
* - drizzle-postgres — Postgres (postgres.js) on Bun/Node/Deno.
|
|
12
|
+
* - drizzle-sqlite — Bun's built-in `bun:sqlite` (sync, local file). Bun-only.
|
|
13
|
+
*
|
|
14
|
+
* The starter `notes` table follows the production-grade DB defaults for its dialect; what a dialect
|
|
15
|
+
* can't express inline (CHECK constraints, RLS, uuidv7) is called out in a comment, per those rules.
|
|
16
|
+
*/
|
|
17
|
+
export declare const DB_CHOICES: readonly ["drizzle-libsql", "drizzle-postgres", "drizzle-sqlite", "prisma-postgres", "prisma-sqlite", "kysely-postgres"];
|
|
18
|
+
export type DbChoice = (typeof DB_CHOICES)[number];
|
|
19
|
+
/** ORM family of a preset — drives the auth adapter, the AGENTS DB rules, and the `c.db` query idiom. */
|
|
20
|
+
export type Orm = "drizzle" | "prisma" | "kysely";
|
|
21
|
+
export interface DbPreset {
|
|
22
|
+
/** Human label for messages, e.g. "Drizzle + libSQL". */
|
|
23
|
+
readonly label: string;
|
|
24
|
+
/** Which ORM/query-layer this preset wires (its query idiom + migration story differ). */
|
|
25
|
+
readonly orm: Orm;
|
|
26
|
+
/** SQL dialect, for the auth adapter's `provider` mapping. */
|
|
27
|
+
readonly dialect: "postgres" | "sqlite";
|
|
28
|
+
/** One-line runtime-fit note (next-steps message + AGENTS.md). */
|
|
29
|
+
readonly note: string;
|
|
30
|
+
readonly deps: Readonly<Record<string, string>>;
|
|
31
|
+
readonly devDeps: Readonly<Record<string, string>>;
|
|
32
|
+
readonly scripts: Readonly<Record<string, string>>;
|
|
33
|
+
/** Relative path → file contents to write into the scaffolded app. */
|
|
34
|
+
readonly files: Readonly<Record<string, string>>;
|
|
35
|
+
}
|
|
36
|
+
export declare const DB_PRESETS: Readonly<Record<DbChoice, DbPreset>>;
|
|
37
|
+
/** Write a DB preset's files into `target` and ensure local DB artifacts + .env are gitignored. */
|
|
38
|
+
export declare function writeDbFiles(target: string, choice: DbChoice): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,eAAO,MAAM,UAAU,0HAOb,CAAA;AACV,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAElD,yGAAyG;AACzG,MAAM,MAAM,GAAG,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEjD,MAAM,WAAW,QAAQ;IACvB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,0FAA0F;IAC1F,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAA;IACvC,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACjD;AA6VD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CA0F3D,CAAA;AAWD,mGAAmG;AACnG,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBlF"}
|