@tulipes/core 0.1.6 → 0.1.7
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 +5 -2
- package/dist/boot/boot.d.ts +9 -1
- package/dist/boot/boot.js +29 -14
- package/dist/boot/boot.js.map +1 -1
- package/dist/cli/init.js +547 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/db/database.d.ts +9 -1
- package/dist/db/database.js +2 -10
- package/dist/db/database.js.map +1 -1
- package/package.json +1 -1
- package/templates/CLAUDE.md +2 -0
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ await boot({ rootDir: import.meta.dirname, mode: "backend" });
|
|
|
29
29
|
|
|
30
30
|
- **Modules, not layers.** A feature lives in one folder: its routes, models, config, permissions, background jobs, and env contract. Delete the folder, the feature is gone.
|
|
31
31
|
- **Fail-closed everywhere.** Missing env vars, dependency cycles, duplicate ACL grants, colliding queue names — all crash the boot with a full report. Reading an undeclared variable or model throws at the call site. Unknown roles deny. Unrouted requests 404. Unexpected errors never leak internals outside development.
|
|
32
|
-
- **One
|
|
32
|
+
- **One codebase, three modes.** The same app boots as a `backend` server, a queue-consuming `worker`, or a one-shot `script` — same modules, same config, forked at the last pipeline phase. A maintenance script therefore runs against exactly the configuration the server has, never a hand-rolled approximation of it.
|
|
33
33
|
- **Types generated, not hand-written.** `tulipes sync` reads your modules and emits a `config.d.ts` that types every env variable and every config namespace — enum variables become literal unions, config shapes are inferred from your factories' return types.
|
|
34
34
|
- **The framework stays out of your request path.** Core mounts *no* middleware. Your sys-tier modules own the pipeline head; core only guarantees the tail (404 + terminal error handler).
|
|
35
35
|
|
|
@@ -148,8 +148,11 @@ ctx.Environment.get("TYPO_NAME"); // throws: never declared by any modul
|
|
|
148
148
|
6. Database connect Mongoose → model store → bootstrap tasks
|
|
149
149
|
7. Queues every *.queues.ts registers in BOTH modes
|
|
150
150
|
8. ── mode fork ──
|
|
151
|
-
backend
|
|
151
|
+
backend module routers (load order) → 404 → error handler → listen
|
|
152
152
|
worker start a BullMQ worker per registered processor
|
|
153
|
+
script start nothing; the caller owns the process and calls
|
|
154
|
+
handle.shutdown() when done (also skips bootstrap
|
|
155
|
+
tasks, the banner and onReady)
|
|
153
156
|
9. onReady hooks in load order → startup banner
|
|
154
157
|
shutdown SIGTERM/SIGINT → onShutdown hooks in REVERSE order →
|
|
155
158
|
disconnect sockets → close http → drain queues → close redis → close mongo
|
package/dist/boot/boot.d.ts
CHANGED
|
@@ -3,7 +3,15 @@ import type { Connection } from "mongoose";
|
|
|
3
3
|
import { type Express } from "express";
|
|
4
4
|
import { Environment, type AppEnv } from "../env/environment.js";
|
|
5
5
|
import type { Ctx } from "./contracts.js";
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* "script" is a one-shot mode: it runs every shared phase — environment,
|
|
8
|
+
* modules, config, ACL, database, models, queue registration — then starts
|
|
9
|
+
* nothing at all, so a maintenance script gets exactly what a request
|
|
10
|
+
* handler gets minus the server. It is deliberately the same code path as
|
|
11
|
+
* the long-running modes, so a script can never be handed config the real
|
|
12
|
+
* app does not have.
|
|
13
|
+
*/
|
|
14
|
+
export declare const processModes: readonly ["backend", "worker", "script"];
|
|
7
15
|
export type ProcessMode = (typeof processModes)[number];
|
|
8
16
|
export interface BootOptions {
|
|
9
17
|
/** App root — the directory containing `modules/` and `.envs/`. */
|
package/dist/boot/boot.js
CHANGED
|
@@ -15,7 +15,15 @@ import { errorHandler, notFoundHandler } from "../http/error-handler.js";
|
|
|
15
15
|
import { loadAppConfigSeed } from "./app-files.js";
|
|
16
16
|
import { printStartupBanner } from "./banner.js";
|
|
17
17
|
import { importFile } from "./import-file.js";
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* "script" is a one-shot mode: it runs every shared phase — environment,
|
|
20
|
+
* modules, config, ACL, database, models, queue registration — then starts
|
|
21
|
+
* nothing at all, so a maintenance script gets exactly what a request
|
|
22
|
+
* handler gets minus the server. It is deliberately the same code path as
|
|
23
|
+
* the long-running modes, so a script can never be handed config the real
|
|
24
|
+
* app does not have.
|
|
25
|
+
*/
|
|
26
|
+
export const processModes = ["backend", "worker", "script"];
|
|
19
27
|
/**
|
|
20
28
|
* The whole run workflow, in the order the POC pins down:
|
|
21
29
|
* environment → module graph → exploration → global config → (acl, db —
|
|
@@ -49,7 +57,9 @@ export async function boot(options) {
|
|
|
49
57
|
aclReport.throwIfAny("acl");
|
|
50
58
|
// Phase 8 — DB + models + bootstrap
|
|
51
59
|
const dbReport = new BootReport();
|
|
52
|
-
const connection = await initDatabase(explored, ctx, dbReport
|
|
60
|
+
const connection = await initDatabase(explored, ctx, dbReport, {
|
|
61
|
+
runBootstrap: mode !== "script",
|
|
62
|
+
});
|
|
53
63
|
dbReport.throwIfAny("database");
|
|
54
64
|
// Phase 9 — mode fork
|
|
55
65
|
const handle = {
|
|
@@ -67,7 +77,7 @@ export async function boot(options) {
|
|
|
67
77
|
if (mode === "backend") {
|
|
68
78
|
await startBackend(handle, explored);
|
|
69
79
|
}
|
|
70
|
-
else {
|
|
80
|
+
else if (mode === "worker") {
|
|
71
81
|
const workerReport = new BootReport();
|
|
72
82
|
const started = ctx.queues?.startWorkers(workerReport) ?? 0;
|
|
73
83
|
workerReport.throwIfAny("workers");
|
|
@@ -77,19 +87,24 @@ export async function boot(options) {
|
|
|
77
87
|
throw new Error("worker mode started with zero processors — no module registered queue work");
|
|
78
88
|
}
|
|
79
89
|
}
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
// "script" starts nothing: the caller owns what happens next, and owns
|
|
91
|
+
// calling handle.shutdown() when it is done.
|
|
92
|
+
// Phase 12 — onReady, load order. Scripts skip it: those hooks announce a
|
|
93
|
+
// process that is up and serving, which a script never is.
|
|
94
|
+
if (mode !== "script") {
|
|
95
|
+
for (const { module, onReady } of lifecycles) {
|
|
96
|
+
try {
|
|
97
|
+
await onReady?.(ctx);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
// Late-phase hook failures must still take the process down cleanly:
|
|
101
|
+
// a half-ready app serving traffic is worse than no app.
|
|
102
|
+
await handle.shutdown();
|
|
103
|
+
throw new Error(`onReady hook of "${module}" failed: ${error.message}`);
|
|
104
|
+
}
|
|
90
105
|
}
|
|
106
|
+
printStartupBanner(handle, order, Date.now() - bootStartedAt);
|
|
91
107
|
}
|
|
92
|
-
printStartupBanner(handle, order, Date.now() - bootStartedAt);
|
|
93
108
|
if (options.handleSignals !== false) {
|
|
94
109
|
for (const signal of ["SIGINT", "SIGTERM"]) {
|
|
95
110
|
process.once(signal, () => {
|
package/dist/boot/boot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/boot/boot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,OAAO,EAAE,EAAgB,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAe,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAoB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/boot/boot.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/init.js
CHANGED
|
@@ -96,6 +96,15 @@ function renderProject(name, coreVersion) {
|
|
|
96
96
|
sync: "tulipes sync",
|
|
97
97
|
check: "tulipes env:check",
|
|
98
98
|
typecheck: "tsc --noEmit",
|
|
99
|
+
script: "tsx",
|
|
100
|
+
"pm2:start": "pm2 start ecosystem.config.cjs",
|
|
101
|
+
"pm2:start:staging": "pm2 start ecosystem.config.cjs --env staging",
|
|
102
|
+
"pm2:start:production": "pm2 start ecosystem.config.cjs --env production",
|
|
103
|
+
"pm2:stop": "pm2 stop ecosystem.config.cjs",
|
|
104
|
+
"pm2:restart": "pm2 restart ecosystem.config.cjs",
|
|
105
|
+
"pm2:delete": "pm2 delete ecosystem.config.cjs",
|
|
106
|
+
"pm2:logs": "pm2 logs",
|
|
107
|
+
"pm2:status": "pm2 status",
|
|
99
108
|
},
|
|
100
109
|
dependencies: {
|
|
101
110
|
"@tulipes/core": core,
|
|
@@ -104,6 +113,8 @@ function renderProject(name, coreVersion) {
|
|
|
104
113
|
devDependencies: {
|
|
105
114
|
"@types/express": "^5",
|
|
106
115
|
"@types/node": "^24",
|
|
116
|
+
// Local convenience: servers usually install pm2 globally instead.
|
|
117
|
+
pm2: "^6",
|
|
107
118
|
tsx: "^4",
|
|
108
119
|
typescript: "^7",
|
|
109
120
|
},
|
|
@@ -121,8 +132,71 @@ function renderProject(name, coreVersion) {
|
|
|
121
132
|
forceConsistentCasingInFileNames: true,
|
|
122
133
|
noEmit: true,
|
|
123
134
|
},
|
|
124
|
-
include: ["app.ts", "worker.ts", "types", "modules", "config"],
|
|
135
|
+
include: ["app.ts", "worker.ts", "types", "modules", "config", "scripts"],
|
|
125
136
|
})],
|
|
137
|
+
["ecosystem.config.cjs", [
|
|
138
|
+
`// PM2 definitions for both Tulipes processes in all three modes.`,
|
|
139
|
+
`//`,
|
|
140
|
+
`// yarn pm2:start development`,
|
|
141
|
+
`// yarn pm2:start:staging staging`,
|
|
142
|
+
`// yarn pm2:start:production production`,
|
|
143
|
+
`// yarn pm2:stop | pm2:restart | pm2:delete | pm2:logs | pm2:status`,
|
|
144
|
+
`//`,
|
|
145
|
+
`// CommonJS on purpose: this app is an ESM package, and PM2 reads its`,
|
|
146
|
+
`// config with require().`,
|
|
147
|
+
``,
|
|
148
|
+
`/**`,
|
|
149
|
+
` * Each block repeats both variables rather than relying on PM2 merging`,
|
|
150
|
+
` * env_<name> over env: a half-applied environment (right APP_ENV, wrong`,
|
|
151
|
+
` * PROCESS_MODE) would start the wrong process against the wrong config,`,
|
|
152
|
+
` * and the repetition is cheap insurance against that.`,
|
|
153
|
+
` */`,
|
|
154
|
+
`const modes = (processMode) => ({`,
|
|
155
|
+
` env: { APP_ENV: "development", PROCESS_MODE: processMode },`,
|
|
156
|
+
` env_staging: { APP_ENV: "staging", PROCESS_MODE: processMode },`,
|
|
157
|
+
` env_production: { APP_ENV: "production", PROCESS_MODE: processMode },`,
|
|
158
|
+
`});`,
|
|
159
|
+
``,
|
|
160
|
+
`/** Shared by both apps. */`,
|
|
161
|
+
`const common = {`,
|
|
162
|
+
` cwd: __dirname,`,
|
|
163
|
+
` // The app runs from TypeScript, so PM2 drives it through tsx. Point`,
|
|
164
|
+
` // script at the compiled entrypoint instead once you add a build.`,
|
|
165
|
+
` interpreter: "./node_modules/.bin/tsx",`,
|
|
166
|
+
` // Fork, not cluster: Socket.IO needs sticky sessions or the Redis`,
|
|
167
|
+
` // adapter before a second instance is safe, and bootstrap tasks would`,
|
|
168
|
+
` // run once per instance. Scale out only after wiring the adapter.`,
|
|
169
|
+
` exec_mode: "fork",`,
|
|
170
|
+
` instances: 1,`,
|
|
171
|
+
` autorestart: true,`,
|
|
172
|
+
` max_memory_restart: "512M",`,
|
|
173
|
+
` // Graceful shutdown drains queues and closes mongo and redis. PM2's`,
|
|
174
|
+
` // default 1.6s SIGKILL would cut that short and lose in-flight jobs.`,
|
|
175
|
+
` kill_timeout: 10000,`,
|
|
176
|
+
`};`,
|
|
177
|
+
``,
|
|
178
|
+
`module.exports = {`,
|
|
179
|
+
` apps: [`,
|
|
180
|
+
` {`,
|
|
181
|
+
` ...common,`,
|
|
182
|
+
` name: ${JSON.stringify(name)},`,
|
|
183
|
+
` script: "app.ts",`,
|
|
184
|
+
` error_file: "logs/backend-error.log",`,
|
|
185
|
+
` out_file: "logs/backend-out.log",`,
|
|
186
|
+
` ...modes("backend"),`,
|
|
187
|
+
` },`,
|
|
188
|
+
` {`,
|
|
189
|
+
` ...common,`,
|
|
190
|
+
` name: ${JSON.stringify(name + "-worker")},`,
|
|
191
|
+
` script: "worker.ts",`,
|
|
192
|
+
` error_file: "logs/worker-error.log",`,
|
|
193
|
+
` out_file: "logs/worker-out.log",`,
|
|
194
|
+
` ...modes("worker"),`,
|
|
195
|
+
` },`,
|
|
196
|
+
` ],`,
|
|
197
|
+
`};`,
|
|
198
|
+
``,
|
|
199
|
+
].join("\n")],
|
|
126
200
|
[".yarnrc.yml", [
|
|
127
201
|
`nodeLinker: node-modules`,
|
|
128
202
|
``,
|
|
@@ -140,6 +214,7 @@ function renderProject(name, coreVersion) {
|
|
|
140
214
|
[".gitignore", [
|
|
141
215
|
"node_modules/",
|
|
142
216
|
"dist/",
|
|
217
|
+
"logs/",
|
|
143
218
|
"*.log",
|
|
144
219
|
"",
|
|
145
220
|
"# local env overrides — the committed .envs/.env.<mode> files hold",
|
|
@@ -272,7 +347,14 @@ function renderProject(name, coreVersion) {
|
|
|
272
347
|
` * these instead of guessing the host from a request.`,
|
|
273
348
|
` */`,
|
|
274
349
|
` urls: {`,
|
|
275
|
-
`
|
|
350
|
+
` // Built from PUBLIC_DOMAIN so links generated in production —`,
|
|
351
|
+
` // reset emails, webhook callbacks — point at the real host`,
|
|
352
|
+
` // instead of a localhost URL that is broken everywhere but this`,
|
|
353
|
+
` // machine. The "localhost" sentinel separates the two cases.`,
|
|
354
|
+
` api:`,
|
|
355
|
+
` Environment.get("PUBLIC_DOMAIN") === "localhost"`,
|
|
356
|
+
` ? \`http://localhost:\${Environment.get("PORT")}\``,
|
|
357
|
+
` : \`https://\${Environment.get("PUBLIC_DOMAIN")}\`,`,
|
|
276
358
|
` frontend: "http://localhost:5173",`,
|
|
277
359
|
` },`,
|
|
278
360
|
``,
|
|
@@ -333,6 +415,386 @@ function renderProject(name, coreVersion) {
|
|
|
333
415
|
`MONGO_URI=mongodb://127.0.0.1:27017/${name}`,
|
|
334
416
|
`REDIS_URL=redis://127.0.0.1:6379`,
|
|
335
417
|
``,
|
|
418
|
+
`# Public hostname. "localhost" means not deployed; the nginx deploy`,
|
|
419
|
+
`# script refuses until this is a real domain.`,
|
|
420
|
+
`PUBLIC_DOMAIN=localhost`,
|
|
421
|
+
``,
|
|
422
|
+
].join("\n")],
|
|
423
|
+
[".envs/.env.staging", [
|
|
424
|
+
`# Staging. Committed like the development file: it holds structure and`,
|
|
425
|
+
`# non-secret defaults, never credentials.`,
|
|
426
|
+
`#`,
|
|
427
|
+
`# The blanks below are intentional. Real deployments inject MONGO_URI,`,
|
|
428
|
+
`# REDIS_URL and any secret through the container environment, which`,
|
|
429
|
+
`# always wins over this file. Booting without them fails closed with a`,
|
|
430
|
+
`# report naming every missing variable — run \`yarn check\` to see it`,
|
|
431
|
+
`# without starting the app.`,
|
|
432
|
+
``,
|
|
433
|
+
`PORT=3000`,
|
|
434
|
+
`LOG_LEVEL=info`,
|
|
435
|
+
``,
|
|
436
|
+
`# The hostname nginx serves this app from; also the filename the`,
|
|
437
|
+
`# deploy script writes into sites-available.`,
|
|
438
|
+
`PUBLIC_DOMAIN=`,
|
|
439
|
+
`CORS_ORIGINS=`,
|
|
440
|
+
``,
|
|
441
|
+
`# MONGO_URI=`,
|
|
442
|
+
`# REDIS_URL=`,
|
|
443
|
+
``,
|
|
444
|
+
].join("\n")],
|
|
445
|
+
[".envs/.env.production", [
|
|
446
|
+
`# Production. Committed like the development file: it holds structure`,
|
|
447
|
+
`# and non-secret defaults, never credentials.`,
|
|
448
|
+
`#`,
|
|
449
|
+
`# The blanks below are intentional. Real deployments inject MONGO_URI,`,
|
|
450
|
+
`# REDIS_URL and any secret through the container environment, which`,
|
|
451
|
+
`# always wins over this file. Booting without them fails closed with a`,
|
|
452
|
+
`# report naming every missing variable — run \`yarn check\` to see it`,
|
|
453
|
+
`# without starting the app.`,
|
|
454
|
+
``,
|
|
455
|
+
`PORT=3000`,
|
|
456
|
+
`LOG_LEVEL=info`,
|
|
457
|
+
``,
|
|
458
|
+
`# The hostname nginx serves this app from; also the filename the`,
|
|
459
|
+
`# deploy script writes into sites-available.`,
|
|
460
|
+
`PUBLIC_DOMAIN=`,
|
|
461
|
+
`CORS_ORIGINS=`,
|
|
462
|
+
``,
|
|
463
|
+
`# MONGO_URI=`,
|
|
464
|
+
`# REDIS_URL=`,
|
|
465
|
+
``,
|
|
466
|
+
].join("\n")],
|
|
467
|
+
["nginx/development.conf", [
|
|
468
|
+
`# {{DOMAIN}} — rendered from nginx/development.conf by scripts/deploy-nginx.ts.`,
|
|
469
|
+
`#`,
|
|
470
|
+
`# Development rarely needs nginx at all: \`yarn dev\` already serves on`,
|
|
471
|
+
`# {{PORT}}. This exists so the proxy layer itself can be exercised locally —`,
|
|
472
|
+
`# websocket upgrades and forwarded headers behave differently through a`,
|
|
473
|
+
`# proxy, and finding that out in staging is finding out late.`,
|
|
474
|
+
`#`,
|
|
475
|
+
`# The deploy script refuses while PUBLIC_DOMAIN is still "localhost", so`,
|
|
476
|
+
`# using this means pointing a real hostname at the machine first.`,
|
|
477
|
+
``,
|
|
478
|
+
`server {`,
|
|
479
|
+
` listen 80;`,
|
|
480
|
+
` server_name {{DOMAIN}};`,
|
|
481
|
+
``,
|
|
482
|
+
` access_log /var/log/nginx/{{DOMAIN}}.access.log;`,
|
|
483
|
+
` error_log /var/log/nginx/{{DOMAIN}}.error.log;`,
|
|
484
|
+
``,
|
|
485
|
+
` client_max_body_size 1m;`,
|
|
486
|
+
``,
|
|
487
|
+
` location / {`,
|
|
488
|
+
` proxy_pass http://127.0.0.1:{{PORT}};`,
|
|
489
|
+
` proxy_http_version 1.1;`,
|
|
490
|
+
``,
|
|
491
|
+
` proxy_set_header Upgrade $http_upgrade;`,
|
|
492
|
+
` proxy_set_header Connection $http_connection;`,
|
|
493
|
+
``,
|
|
494
|
+
` proxy_set_header Host $host;`,
|
|
495
|
+
` proxy_set_header X-Real-IP $remote_addr;`,
|
|
496
|
+
` proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;`,
|
|
497
|
+
` proxy_set_header X-Forwarded-Proto $scheme;`,
|
|
498
|
+
``,
|
|
499
|
+
` proxy_read_timeout 3600s;`,
|
|
500
|
+
` proxy_send_timeout 3600s;`,
|
|
501
|
+
` }`,
|
|
502
|
+
`}`,
|
|
503
|
+
``,
|
|
504
|
+
].join("\n")],
|
|
505
|
+
["nginx/staging.conf", [
|
|
506
|
+
`# {{DOMAIN}} — rendered from nginx/staging.conf by scripts/deploy-nginx.ts.`,
|
|
507
|
+
`# Placeholders are substituted at deploy time; edit this template, never the`,
|
|
508
|
+
`# copy in /etc/nginx/sites-available.`,
|
|
509
|
+
`#`,
|
|
510
|
+
`# Identical to production except for the noindex header below.`,
|
|
511
|
+
``,
|
|
512
|
+
`server {`,
|
|
513
|
+
` listen 80;`,
|
|
514
|
+
` listen [::]:80;`,
|
|
515
|
+
` server_name {{DOMAIN}};`,
|
|
516
|
+
``,
|
|
517
|
+
` access_log /var/log/nginx/{{DOMAIN}}.access.log;`,
|
|
518
|
+
` error_log /var/log/nginx/{{DOMAIN}}.error.log;`,
|
|
519
|
+
``,
|
|
520
|
+
` # Staging must never reach a search index, even if a link leaks.`,
|
|
521
|
+
` add_header X-Robots-Tag "noindex, nofollow" always;`,
|
|
522
|
+
``,
|
|
523
|
+
` location /.well-known/acme-challenge/ {`,
|
|
524
|
+
` root /var/www/html;`,
|
|
525
|
+
` }`,
|
|
526
|
+
``,
|
|
527
|
+
` client_max_body_size 1m;`,
|
|
528
|
+
``,
|
|
529
|
+
` location / {`,
|
|
530
|
+
` proxy_pass http://127.0.0.1:{{PORT}};`,
|
|
531
|
+
` proxy_http_version 1.1;`,
|
|
532
|
+
``,
|
|
533
|
+
` proxy_set_header Upgrade $http_upgrade;`,
|
|
534
|
+
` proxy_set_header Connection $http_connection;`,
|
|
535
|
+
``,
|
|
536
|
+
` proxy_set_header Host $host;`,
|
|
537
|
+
` proxy_set_header X-Real-IP $remote_addr;`,
|
|
538
|
+
` proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;`,
|
|
539
|
+
` proxy_set_header X-Forwarded-Proto $scheme;`,
|
|
540
|
+
``,
|
|
541
|
+
` proxy_read_timeout 3600s;`,
|
|
542
|
+
` proxy_send_timeout 3600s;`,
|
|
543
|
+
` }`,
|
|
544
|
+
`}`,
|
|
545
|
+
``,
|
|
546
|
+
`# TLS: see nginx/production.conf — same block, same reason it ships`,
|
|
547
|
+
`# commented out.`,
|
|
548
|
+
``,
|
|
549
|
+
].join("\n")],
|
|
550
|
+
["nginx/production.conf", [
|
|
551
|
+
`# {{DOMAIN}} — rendered from nginx/production.conf by scripts/deploy-nginx.ts.`,
|
|
552
|
+
`# Placeholders are substituted at deploy time; edit this template, never the`,
|
|
553
|
+
`# copy in /etc/nginx/sites-available.`,
|
|
554
|
+
`#`,
|
|
555
|
+
`# Debian/Ubuntu layout (sites-available + sites-enabled).`,
|
|
556
|
+
``,
|
|
557
|
+
`server {`,
|
|
558
|
+
` listen 80;`,
|
|
559
|
+
` listen [::]:80;`,
|
|
560
|
+
` server_name {{DOMAIN}};`,
|
|
561
|
+
``,
|
|
562
|
+
` access_log /var/log/nginx/{{DOMAIN}}.access.log;`,
|
|
563
|
+
` error_log /var/log/nginx/{{DOMAIN}}.error.log;`,
|
|
564
|
+
``,
|
|
565
|
+
` # Certbot's HTTP-01 challenge, kept above the proxy so certificate`,
|
|
566
|
+
` # issuance and renewal work without touching this file.`,
|
|
567
|
+
` location /.well-known/acme-challenge/ {`,
|
|
568
|
+
` root /var/www/html;`,
|
|
569
|
+
` }`,
|
|
570
|
+
``,
|
|
571
|
+
` # Keep in step with config.app.ts http.bodyLimit. If nginx is stricter,`,
|
|
572
|
+
` # oversized requests die here as an nginx HTML page instead of the`,
|
|
573
|
+
` # API's JSON 413.`,
|
|
574
|
+
` client_max_body_size 1m;`,
|
|
575
|
+
``,
|
|
576
|
+
` location / {`,
|
|
577
|
+
` proxy_pass http://127.0.0.1:{{PORT}};`,
|
|
578
|
+
` proxy_http_version 1.1;`,
|
|
579
|
+
``,
|
|
580
|
+
` # Socket.IO upgrades. Without these the handshake still succeeds and`,
|
|
581
|
+
` # every connection silently degrades to HTTP polling.`,
|
|
582
|
+
` proxy_set_header Upgrade $http_upgrade;`,
|
|
583
|
+
` # Passing the client's own Connection header rather than a mapped`,
|
|
584
|
+
` # variable: a \`map\` block here would collide the moment a second`,
|
|
585
|
+
` # site on this server defines the same variable.`,
|
|
586
|
+
` proxy_set_header Connection $http_connection;`,
|
|
587
|
+
``,
|
|
588
|
+
` proxy_set_header Host $host;`,
|
|
589
|
+
` proxy_set_header X-Real-IP $remote_addr;`,
|
|
590
|
+
` proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;`,
|
|
591
|
+
` proxy_set_header X-Forwarded-Proto $scheme;`,
|
|
592
|
+
``,
|
|
593
|
+
` # Set config.http.trustProxy to true so the app reads the real`,
|
|
594
|
+
` # client IP from the headers above.`,
|
|
595
|
+
``,
|
|
596
|
+
` # Long-lived websockets must outlive nginx's 60s default.`,
|
|
597
|
+
` proxy_read_timeout 3600s;`,
|
|
598
|
+
` proxy_send_timeout 3600s;`,
|
|
599
|
+
` }`,
|
|
600
|
+
`}`,
|
|
601
|
+
``,
|
|
602
|
+
`# ── TLS ────────────────────────────────────────────────────────────────────`,
|
|
603
|
+
`# Commented out on purpose: nginx -t fails on certificate paths that do not`,
|
|
604
|
+
`# exist yet, which would make the very first deploy impossible. Install the`,
|
|
605
|
+
`# certificate, then uncomment this block, redeploy with --force, and add a`,
|
|
606
|
+
`# 301 redirect to the :80 server above.`,
|
|
607
|
+
`#`,
|
|
608
|
+
`# server {`,
|
|
609
|
+
`# listen 443 ssl;`,
|
|
610
|
+
`# listen [::]:443 ssl;`,
|
|
611
|
+
`# http2 on;`,
|
|
612
|
+
`# server_name {{DOMAIN}};`,
|
|
613
|
+
`#`,
|
|
614
|
+
`# ssl_certificate /etc/letsencrypt/live/{{DOMAIN}}/fullchain.pem;`,
|
|
615
|
+
`# ssl_certificate_key /etc/letsencrypt/live/{{DOMAIN}}/privkey.pem;`,
|
|
616
|
+
`#`,
|
|
617
|
+
`# # …repeat the location / block from above…`,
|
|
618
|
+
`# }`,
|
|
619
|
+
``,
|
|
620
|
+
].join("\n")],
|
|
621
|
+
["scripts/deploy-nginx.ts", [
|
|
622
|
+
`/**`,
|
|
623
|
+
` * Install this app's nginx site config.`,
|
|
624
|
+
` *`,
|
|
625
|
+
` * sudo -E APP_ENV=production yarn script scripts/deploy-nginx.ts`,
|
|
626
|
+
` * APP_ENV=production yarn script scripts/deploy-nginx.ts --dry-run`,
|
|
627
|
+
` *`,
|
|
628
|
+
` * APP_ENV picks everything at once — which template is rendered, and the`,
|
|
629
|
+
` * domain and port rendered into it — so the three can never disagree.`,
|
|
630
|
+
` *`,
|
|
631
|
+
` * It boots in script mode like every other script, which means the database`,
|
|
632
|
+
` * and redis must be reachable from wherever you run it. That is the price`,
|
|
633
|
+
` * of every script looking the same; run --dry-run from anywhere to preview.`,
|
|
634
|
+
` *`,
|
|
635
|
+
` * Debian/Ubuntu only: it writes sites-available and links sites-enabled.`,
|
|
636
|
+
` * Certificates are yours to install — the rendered conf is HTTP-only, with`,
|
|
637
|
+
` * a commented TLS block to uncomment once they exist.`,
|
|
638
|
+
` */`,
|
|
639
|
+
`import { execFileSync } from "node:child_process";`,
|
|
640
|
+
`import { existsSync, lstatSync, readFileSync, readlinkSync, symlinkSync, writeFileSync } from "node:fs";`,
|
|
641
|
+
`import { join } from "node:path";`,
|
|
642
|
+
``,
|
|
643
|
+
`import { boot } from "@tulipes/core/boot";`,
|
|
644
|
+
``,
|
|
645
|
+
`const SITES_AVAILABLE = "/etc/nginx/sites-available";`,
|
|
646
|
+
`const SITES_ENABLED = "/etc/nginx/sites-enabled";`,
|
|
647
|
+
``,
|
|
648
|
+
`const flags = new Set(process.argv.slice(2));`,
|
|
649
|
+
`const dryRun = flags.has("--dry-run");`,
|
|
650
|
+
`const force = flags.has("--force");`,
|
|
651
|
+
``,
|
|
652
|
+
`const rootDir = join(import.meta.dirname, "..");`,
|
|
653
|
+
`const handle = await boot({ rootDir, mode: "script" });`,
|
|
654
|
+
``,
|
|
655
|
+
`try {`,
|
|
656
|
+
` await deploy();`,
|
|
657
|
+
`} finally {`,
|
|
658
|
+
` // Without this the open mongo and redis handles keep the process alive`,
|
|
659
|
+
` // and the script appears to hang after doing its work.`,
|
|
660
|
+
` await handle.shutdown();`,
|
|
661
|
+
`}`,
|
|
662
|
+
``,
|
|
663
|
+
`async function deploy(): Promise<void> {`,
|
|
664
|
+
` const { appEnv } = handle.env;`,
|
|
665
|
+
` const domain = String(handle.env.get("PUBLIC_DOMAIN")).trim();`,
|
|
666
|
+
` const port = Number(handle.env.get("PORT"));`,
|
|
667
|
+
``,
|
|
668
|
+
` const templatePath = join(rootDir, "nginx", \`\${appEnv}.conf\`);`,
|
|
669
|
+
` if (!existsSync(templatePath)) {`,
|
|
670
|
+
` return fail(\`no template for APP_ENV=\${appEnv} — expected nginx/\${appEnv}.conf\`);`,
|
|
671
|
+
` }`,
|
|
672
|
+
``,
|
|
673
|
+
` const conf = readFileSync(templatePath, "utf8")`,
|
|
674
|
+
` .replaceAll("{{DOMAIN}}", domain)`,
|
|
675
|
+
` .replaceAll("{{PORT}}", String(port));`,
|
|
676
|
+
``,
|
|
677
|
+
` // Preview stays available everywhere, including a laptop with no nginx`,
|
|
678
|
+
` // and a domain still set to localhost.`,
|
|
679
|
+
` if (dryRun) {`,
|
|
680
|
+
` console.log(\`# \${templatePath} → \${SITES_AVAILABLE}/\${domain}\\n\`);`,
|
|
681
|
+
` console.log(conf);`,
|
|
682
|
+
` return;`,
|
|
683
|
+
` }`,
|
|
684
|
+
``,
|
|
685
|
+
` if (domain === "localhost" || domain === "") {`,
|
|
686
|
+
` return fail(`,
|
|
687
|
+
` \`PUBLIC_DOMAIN is "\${domain}" — set a real hostname in .envs/.env.\${appEnv} before deploying\`,`,
|
|
688
|
+
` );`,
|
|
689
|
+
` }`,
|
|
690
|
+
``,
|
|
691
|
+
` // getuid is absent on Windows; its absence is itself a "not supported here".`,
|
|
692
|
+
` if (process.getuid?.() !== 0) {`,
|
|
693
|
+
` return fail("must run as root to write /etc/nginx — re-run with sudo -E");`,
|
|
694
|
+
` }`,
|
|
695
|
+
``,
|
|
696
|
+
` if (!existsSync(SITES_AVAILABLE)) {`,
|
|
697
|
+
` return fail(`,
|
|
698
|
+
` \`\${SITES_AVAILABLE} does not exist — this script targets the Debian/Ubuntu nginx layout\`,`,
|
|
699
|
+
` );`,
|
|
700
|
+
` }`,
|
|
701
|
+
``,
|
|
702
|
+
` const availablePath = join(SITES_AVAILABLE, domain);`,
|
|
703
|
+
` if (existsSync(availablePath) && !force) {`,
|
|
704
|
+
` return fail(`,
|
|
705
|
+
` \`\${availablePath} already exists — re-run with --force to overwrite it (it may have been hand-tuned on this box)\`,`,
|
|
706
|
+
` );`,
|
|
707
|
+
` }`,
|
|
708
|
+
``,
|
|
709
|
+
` writeFileSync(availablePath, conf);`,
|
|
710
|
+
` console.log(\`wrote \${availablePath}\`);`,
|
|
711
|
+
``,
|
|
712
|
+
` const enabledPath = join(SITES_ENABLED, domain);`,
|
|
713
|
+
` if (!linkSite(availablePath, enabledPath)) return;`,
|
|
714
|
+
``,
|
|
715
|
+
` if (!run("nginx", ["-t"], "nginx rejected the configuration — nothing was reloaded")) {`,
|
|
716
|
+
` return;`,
|
|
717
|
+
` }`,
|
|
718
|
+
` if (!run("systemctl", ["reload", "nginx"], "nginx reload failed")) return;`,
|
|
719
|
+
``,
|
|
720
|
+
` console.log(\`\\n\${domain} → 127.0.0.1:\${port} (\${appEnv}) — nginx reloaded\`);`,
|
|
721
|
+
`}`,
|
|
722
|
+
``,
|
|
723
|
+
`/** Idempotent: a link already pointing at the right file is the goal state. */`,
|
|
724
|
+
`function linkSite(target: string, link: string): boolean {`,
|
|
725
|
+
` if (existsSync(link) || isSymlink(link)) {`,
|
|
726
|
+
` const current = isSymlink(link) ? readlinkSync(link) : "(a regular file)";`,
|
|
727
|
+
` if (current === target) {`,
|
|
728
|
+
` console.log(\`link \${link} already correct\`);`,
|
|
729
|
+
` return true;`,
|
|
730
|
+
` }`,
|
|
731
|
+
` fail(\`\${link} exists and points at \${current} — remove it and re-run\`);`,
|
|
732
|
+
` return false;`,
|
|
733
|
+
` }`,
|
|
734
|
+
``,
|
|
735
|
+
` symlinkSync(target, link);`,
|
|
736
|
+
` console.log(\`linked \${link}\`);`,
|
|
737
|
+
` return true;`,
|
|
738
|
+
`}`,
|
|
739
|
+
``,
|
|
740
|
+
`function isSymlink(path: string): boolean {`,
|
|
741
|
+
` try {`,
|
|
742
|
+
` return lstatSync(path).isSymbolicLink();`,
|
|
743
|
+
` } catch {`,
|
|
744
|
+
` return false;`,
|
|
745
|
+
` }`,
|
|
746
|
+
`}`,
|
|
747
|
+
``,
|
|
748
|
+
`function run(command: string, args: string[], message: string): boolean {`,
|
|
749
|
+
` try {`,
|
|
750
|
+
` execFileSync(command, args, { stdio: "inherit" });`,
|
|
751
|
+
` return true;`,
|
|
752
|
+
` } catch (error) {`,
|
|
753
|
+
` // A missing binary is not a rejected config: reporting the latter would`,
|
|
754
|
+
` // send you hunting a syntax error that does not exist.`,
|
|
755
|
+
` const missing = (error as NodeJS.ErrnoException).code === "ENOENT";`,
|
|
756
|
+
` fail(missing ? \`could not run "\${command}" — is it installed and on PATH?\` : message);`,
|
|
757
|
+
` return false;`,
|
|
758
|
+
` }`,
|
|
759
|
+
`}`,
|
|
760
|
+
``,
|
|
761
|
+
`function fail(message: string): void {`,
|
|
762
|
+
` console.error(\`deploy-nginx: \${message}\`);`,
|
|
763
|
+
` process.exitCode = 1;`,
|
|
764
|
+
`}`,
|
|
765
|
+
``,
|
|
766
|
+
].join("\n")],
|
|
767
|
+
["scripts/count-greetings.ts", [
|
|
768
|
+
`/**`,
|
|
769
|
+
` * Example maintenance script. Run it with:`,
|
|
770
|
+
` *`,
|
|
771
|
+
` * yarn script scripts/count-greetings.ts`,
|
|
772
|
+
` *`,
|
|
773
|
+
` * Script mode runs every phase the backend runs — environment, modules,`,
|
|
774
|
+
` * config, ACL, database, models, queue producers — and then starts nothing.`,
|
|
775
|
+
` * So a script gets exactly what a route handler gets, minus the server.`,
|
|
776
|
+
` *`,
|
|
777
|
+
` * The one thing to always copy from this file is the try/finally: the mongo`,
|
|
778
|
+
` * and redis connections hold the event loop open, so a script that skips`,
|
|
779
|
+
` * shutdown() prints its output and then hangs forever.`,
|
|
780
|
+
` */`,
|
|
781
|
+
`import { join } from "node:path";`,
|
|
782
|
+
``,
|
|
783
|
+
`import { boot } from "@tulipes/core/boot";`,
|
|
784
|
+
``,
|
|
785
|
+
`const handle = await boot({ rootDir: join(import.meta.dirname, ".."), mode: "script" });`,
|
|
786
|
+
``,
|
|
787
|
+
`try {`,
|
|
788
|
+
` const { models, config } = handle.ctx;`,
|
|
789
|
+
``,
|
|
790
|
+
` const greetings = await models!.get("Greeting").find().select("name timesUsed -_id").lean();`,
|
|
791
|
+
``,
|
|
792
|
+
` console.log(\`\${config.app?.name} — \${greetings.length} greeting(s)\\n\`);`,
|
|
793
|
+
` console.table(greetings);`,
|
|
794
|
+
`} finally {`,
|
|
795
|
+
` await handle.shutdown();`,
|
|
796
|
+
`}`,
|
|
797
|
+
``,
|
|
336
798
|
].join("\n")],
|
|
337
799
|
// ── modules/core — sys tier, priority 0: the very first router ─────────
|
|
338
800
|
["modules/core/package.json", json({
|
|
@@ -368,6 +830,13 @@ function renderProject(name, coreVersion) {
|
|
|
368
830
|
required: true,
|
|
369
831
|
description: "Redis connection string (queues, cache)",
|
|
370
832
|
},
|
|
833
|
+
{
|
|
834
|
+
name: "PUBLIC_DOMAIN",
|
|
835
|
+
type: "string",
|
|
836
|
+
group: "deploy",
|
|
837
|
+
description: 'Public hostname this API is served from; "localhost" means not deployed',
|
|
838
|
+
default: "localhost",
|
|
839
|
+
},
|
|
371
840
|
],
|
|
372
841
|
})],
|
|
373
842
|
["modules/core/module.acl.ts", [
|
|
@@ -909,6 +1378,82 @@ function renderProject(name, coreVersion) {
|
|
|
909
1378
|
`| \`yarn tulipes new module <name>\` | scaffold a module |`,
|
|
910
1379
|
`| \`yarn tulipes update\` | upgrade the framework everywhere it is declared |`,
|
|
911
1380
|
``,
|
|
1381
|
+
`## Scripts`,
|
|
1382
|
+
``,
|
|
1383
|
+
`\`scripts/\` holds one-off tasks — backfills, exports, admin chores.`,
|
|
1384
|
+
`They boot the app in **script mode**, which runs every phase the`,
|
|
1385
|
+
`backend runs and then starts no server, so a script gets exactly what`,
|
|
1386
|
+
`a route handler gets: config, ACL, models, queue producers.`,
|
|
1387
|
+
``,
|
|
1388
|
+
"```sh",
|
|
1389
|
+
`yarn script scripts/count-greetings.ts`,
|
|
1390
|
+
"```",
|
|
1391
|
+
``,
|
|
1392
|
+
`Copy the try/finally from \`scripts/count-greetings.ts\`: mongo and`,
|
|
1393
|
+
`redis hold the event loop open, so a script that forgets`,
|
|
1394
|
+
`\`handle.shutdown()\` prints its output and then hangs.`,
|
|
1395
|
+
``,
|
|
1396
|
+
`## Deploying nginx`,
|
|
1397
|
+
``,
|
|
1398
|
+
`\`nginx/{development,staging,production}.conf\` are templates with`,
|
|
1399
|
+
`\`{{DOMAIN}}\` and \`{{PORT}}\` placeholders. The deploy script renders`,
|
|
1400
|
+
`the one matching \`APP_ENV\`, using that same environment's`,
|
|
1401
|
+
`\`PUBLIC_DOMAIN\` and \`PORT\`, so template, domain and port can never`,
|
|
1402
|
+
`disagree:`,
|
|
1403
|
+
``,
|
|
1404
|
+
"```sh",
|
|
1405
|
+
`APP_ENV=production yarn script scripts/deploy-nginx.ts --dry-run`,
|
|
1406
|
+
`sudo -E APP_ENV=production yarn script scripts/deploy-nginx.ts`,
|
|
1407
|
+
"```",
|
|
1408
|
+
``,
|
|
1409
|
+
`It writes \`sites-available/<domain>\`, links \`sites-enabled\`, runs`,
|
|
1410
|
+
`\`nginx -t\`, then reloads. It refuses when not root, while`,
|
|
1411
|
+
`\`PUBLIC_DOMAIN\` is still \`localhost\`, or when the conf already exists`,
|
|
1412
|
+
`(pass \`--force\` to overwrite one). Debian/Ubuntu layout.`,
|
|
1413
|
+
``,
|
|
1414
|
+
`The rendered conf is HTTP-only with the TLS block commented out —`,
|
|
1415
|
+
`\`nginx -t\` fails on certificate paths that do not exist yet, which`,
|
|
1416
|
+
`would make the first deploy impossible. Install the certificate,`,
|
|
1417
|
+
`uncomment the block, redeploy with \`--force\`.`,
|
|
1418
|
+
``,
|
|
1419
|
+
`## Running under PM2`,
|
|
1420
|
+
``,
|
|
1421
|
+
`\`ecosystem.config.cjs\` defines both processes — the backend and the`,
|
|
1422
|
+
`queue worker — in all three modes:`,
|
|
1423
|
+
``,
|
|
1424
|
+
"```sh",
|
|
1425
|
+
`yarn pm2:start # development`,
|
|
1426
|
+
`yarn pm2:start:staging`,
|
|
1427
|
+
`yarn pm2:start:production`,
|
|
1428
|
+
``,
|
|
1429
|
+
`yarn pm2:status # what is running`,
|
|
1430
|
+
`yarn pm2:logs # tail both processes`,
|
|
1431
|
+
`yarn pm2:restart # reload code`,
|
|
1432
|
+
`yarn pm2:stop # stop, keep them in the process list`,
|
|
1433
|
+
`yarn pm2:delete # remove from the process list`,
|
|
1434
|
+
"```",
|
|
1435
|
+
``,
|
|
1436
|
+
`Switching environment requires a restart carrying the flag, because`,
|
|
1437
|
+
`PM2 remembers the environment a process was started with:`,
|
|
1438
|
+
`\`pm2 restart ecosystem.config.cjs --env production\`.`,
|
|
1439
|
+
``,
|
|
1440
|
+
`\`.envs/\` holds one file per mode. All three are committed because they`,
|
|
1441
|
+
`carry structure and non-secret defaults only — connection strings and`,
|
|
1442
|
+
`secrets are injected by the server or container, which always wins over`,
|
|
1443
|
+
`the file. \`yarn check\` validates the current environment without`,
|
|
1444
|
+
`booting, so a deploy can fail on configuration before it fails on`,
|
|
1445
|
+
`traffic.`,
|
|
1446
|
+
``,
|
|
1447
|
+
`PM2 is a devDependency so the scripts work straight after install;`,
|
|
1448
|
+
`servers usually install it globally instead (\`npm i -g pm2\`), in`,
|
|
1449
|
+
`which case the same scripts still work.`,
|
|
1450
|
+
``,
|
|
1451
|
+
`Two defaults worth knowing: processes run in **fork** mode with a`,
|
|
1452
|
+
`single instance, because Socket.IO needs sticky sessions or the Redis`,
|
|
1453
|
+
`adapter before a second instance is safe; and \`kill_timeout\` is 10s so`,
|
|
1454
|
+
`graceful shutdown can drain queues and close mongo and redis before`,
|
|
1455
|
+
`PM2 sends SIGKILL.`,
|
|
1456
|
+
``,
|
|
912
1457
|
].join("\n")]);
|
|
913
1458
|
return files;
|
|
914
1459
|
}
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
package/dist/db/database.d.ts
CHANGED
|
@@ -22,4 +22,12 @@ export type BootstrapFn = (ctx: Ctx) => void | Promise<void>;
|
|
|
22
22
|
* phase. Declaring models *without* a connection string, though, is a
|
|
23
23
|
* contradiction the boot must refuse.
|
|
24
24
|
*/
|
|
25
|
-
export
|
|
25
|
+
export interface InitDatabaseOptions {
|
|
26
|
+
/**
|
|
27
|
+
* Bootstrap tasks seed and ensure indexes for a process about to serve.
|
|
28
|
+
* A one-shot script skips them: they are somebody else's startup work,
|
|
29
|
+
* and running them on every `ls`-style script is wasted writes.
|
|
30
|
+
*/
|
|
31
|
+
runBootstrap?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare function initDatabase(explored: readonly ModuleFiles[], ctx: Ctx, report: BootReport, options?: InitDatabaseOptions): Promise<Connection | undefined>;
|
package/dist/db/database.js
CHANGED
|
@@ -4,15 +4,7 @@ import { importFile } from "../boot/import-file.js";
|
|
|
4
4
|
import { ModelStore } from "./model-store.js";
|
|
5
5
|
/** Well-known infra variable, declared by the app's sys core module. */
|
|
6
6
|
const MONGO_URI = "MONGO_URI";
|
|
7
|
-
|
|
8
|
-
* Boot phase 8: connect, register every model in load order, then run every
|
|
9
|
-
* bootstrap task in load order (indexes, seed roles, default records).
|
|
10
|
-
*
|
|
11
|
-
* A DB-less app is legitimate — no models and no MONGO_URI simply skips the
|
|
12
|
-
* phase. Declaring models *without* a connection string, though, is a
|
|
13
|
-
* contradiction the boot must refuse.
|
|
14
|
-
*/
|
|
15
|
-
export async function initDatabase(explored, ctx, report) {
|
|
7
|
+
export async function initDatabase(explored, ctx, report, options = {}) {
|
|
16
8
|
const hasModels = explored.some((files) => files.modelFiles.length > 0);
|
|
17
9
|
const uri = ctx.Environment.store.has(MONGO_URI)
|
|
18
10
|
? String(ctx.Environment.get(MONGO_URI))
|
|
@@ -46,7 +38,7 @@ export async function initDatabase(explored, ctx, report) {
|
|
|
46
38
|
await registerModels(explored, connection, store, report);
|
|
47
39
|
// Bootstrap tasks only make sense against a fully-populated model store,
|
|
48
40
|
// and only when nothing above them failed.
|
|
49
|
-
if (report.issues.length === 0) {
|
|
41
|
+
if ((options.runBootstrap ?? true) && report.issues.length === 0) {
|
|
50
42
|
await runBootstrapTasks(explored, ctx, report);
|
|
51
43
|
}
|
|
52
44
|
return connection;
|
package/dist/db/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAmB,MAAM,UAAU,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAgB9C,wEAAwE;AACxE,MAAM,SAAS,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/templates/CLAUDE.md
CHANGED
|
@@ -44,6 +44,7 @@ applies before you write code.
|
|
|
44
44
|
| Middleware for one feature's routes | that module's own `Router` |
|
|
45
45
|
| Helper used by ≥2 modules | `lib/` |
|
|
46
46
|
| Helper used by one module | that module's `helpers/` |
|
|
47
|
+
| One-off task (backfill, export, admin chore) | `scripts/`, booted with `mode: "script"` |
|
|
47
48
|
|
|
48
49
|
## Boot order (why load order matters)
|
|
49
50
|
|
|
@@ -63,6 +64,7 @@ queues → routes. If code needs something another module provides, declare
|
|
|
63
64
|
| `yarn typecheck` | typecheck the whole app |
|
|
64
65
|
| `yarn tulipes new module <name>` | scaffold a module |
|
|
65
66
|
| `yarn tulipes update` | upgrade the framework in the root and every module |
|
|
67
|
+
| `yarn script scripts/x.ts` | run a one-off script against the real app |
|
|
66
68
|
|
|
67
69
|
## Verifying your work
|
|
68
70
|
|