@tulipes/core 0.1.6 → 0.1.8
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 +16 -4
- 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/cli/main.js +11 -5
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/package-info.d.ts +6 -0
- package/dist/cli/package-info.js +18 -2
- package/dist/cli/package-info.js.map +1 -1
- package/dist/cli/update.d.ts +12 -6
- package/dist/cli/update.js +90 -34
- package/dist/cli/update.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 +3 -1
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
|
|
@@ -251,8 +254,8 @@ tulipes init [dir] scaffold a new application (needs mongo + redis)
|
|
|
251
254
|
tulipes sync regenerate types/config.d.ts and .env.example
|
|
252
255
|
tulipes env:check validate env against every meta contract — CI gate, exit 1 on failure
|
|
253
256
|
tulipes new module <name> scaffold a module (scope auto-detected from siblings)
|
|
254
|
-
tulipes update upgrade
|
|
255
|
-
tulipes -v print the
|
|
257
|
+
tulipes update upgrade the global cli and, inside an app, the app itself
|
|
258
|
+
tulipes -v print the cli version (and the app's, when they differ)
|
|
256
259
|
tulipes dev [entry] sync, then run the entry under tsx watch
|
|
257
260
|
```
|
|
258
261
|
|
|
@@ -271,6 +274,15 @@ would otherwise guess wrong: declaring variables instead of reaching for
|
|
|
271
274
|
`process.env`, where global middleware belongs, why `mongoose.model()` is
|
|
272
275
|
never called directly, and how to read an aggregate boot report.
|
|
273
276
|
|
|
277
|
+
The global CLI on your PATH and the `@tulipes/core` an app installs are
|
|
278
|
+
**separate installs** that drift apart. `tulipes update` handles both: it
|
|
279
|
+
reinstalls the global CLI into the prefix it already lives in (which is what
|
|
280
|
+
makes it work under nvm, where a plain `npm install -g` may target a
|
|
281
|
+
different node version than the one holding your `tulipes` binary), and,
|
|
282
|
+
when run inside an app, rewrites the range in the app root and every module
|
|
283
|
+
before installing. Outside an app it still updates the CLI. `tulipes -v`
|
|
284
|
+
prints both numbers whenever they differ.
|
|
285
|
+
|
|
274
286
|
`sync` output — committed, marked generated:
|
|
275
287
|
|
|
276
288
|
- **`types/config.d.ts`** — augments `KnownVariables` (every variable typed from its spec) and `GlobalConfig` (each namespace typed as its factory's return type via `typeof import(...)` — inference, never execution).
|
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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"}
|