@tulipes/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/acl/acl.d.ts +49 -0
  2. package/dist/acl/acl.js +123 -0
  3. package/dist/acl/acl.js.map +1 -0
  4. package/dist/acl/index.d.ts +2 -0
  5. package/dist/acl/index.js +3 -0
  6. package/dist/acl/index.js.map +1 -0
  7. package/dist/acl/load-acl.d.ts +11 -0
  8. package/dist/acl/load-acl.js +38 -0
  9. package/dist/acl/load-acl.js.map +1 -0
  10. package/dist/boot/app-files.d.ts +17 -0
  11. package/dist/boot/app-files.js +31 -0
  12. package/dist/boot/app-files.js.map +1 -0
  13. package/dist/boot/banner.d.ts +9 -0
  14. package/dist/boot/banner.js +82 -0
  15. package/dist/boot/banner.js.map +1 -0
  16. package/dist/boot/boot.d.ts +32 -0
  17. package/dist/boot/boot.js +212 -0
  18. package/dist/boot/boot.js.map +1 -0
  19. package/dist/boot/contracts.d.ts +47 -0
  20. package/dist/boot/contracts.js +2 -0
  21. package/dist/boot/contracts.js.map +1 -0
  22. package/dist/boot/import-file.d.ts +7 -0
  23. package/dist/boot/import-file.js +23 -0
  24. package/dist/boot/import-file.js.map +1 -0
  25. package/dist/boot/index.d.ts +3 -0
  26. package/dist/boot/index.js +2 -0
  27. package/dist/boot/index.js.map +1 -0
  28. package/dist/cli/bin.d.ts +2 -0
  29. package/dist/cli/bin.js +7 -0
  30. package/dist/cli/bin.js.map +1 -0
  31. package/dist/cli/dev.d.ts +8 -0
  32. package/dist/cli/dev.js +22 -0
  33. package/dist/cli/dev.js.map +1 -0
  34. package/dist/cli/env-check.d.ts +6 -0
  35. package/dist/cli/env-check.js +28 -0
  36. package/dist/cli/env-check.js.map +1 -0
  37. package/dist/cli/main.d.ts +1 -0
  38. package/dist/cli/main.js +45 -0
  39. package/dist/cli/main.js.map +1 -0
  40. package/dist/cli/new-module.d.ts +6 -0
  41. package/dist/cli/new-module.js +84 -0
  42. package/dist/cli/new-module.js.map +1 -0
  43. package/dist/cli/sync.d.ts +12 -0
  44. package/dist/cli/sync.js +117 -0
  45. package/dist/cli/sync.js.map +1 -0
  46. package/dist/config/build-config.d.ts +13 -0
  47. package/dist/config/build-config.js +63 -0
  48. package/dist/config/build-config.js.map +1 -0
  49. package/dist/config/index.d.ts +13 -0
  50. package/dist/config/index.js +2 -0
  51. package/dist/config/index.js.map +1 -0
  52. package/dist/db/database.d.ts +25 -0
  53. package/dist/db/database.js +111 -0
  54. package/dist/db/database.js.map +1 -0
  55. package/dist/db/index.d.ts +2 -0
  56. package/dist/db/index.js +3 -0
  57. package/dist/db/index.js.map +1 -0
  58. package/dist/db/model-store.d.ts +22 -0
  59. package/dist/db/model-store.js +37 -0
  60. package/dist/db/model-store.js.map +1 -0
  61. package/dist/env/coerce.d.ts +17 -0
  62. package/dist/env/coerce.js +53 -0
  63. package/dist/env/coerce.js.map +1 -0
  64. package/dist/env/environment.d.ts +42 -0
  65. package/dist/env/environment.js +117 -0
  66. package/dist/env/environment.js.map +1 -0
  67. package/dist/env/index.d.ts +14 -0
  68. package/dist/env/index.js +5 -0
  69. package/dist/env/index.js.map +1 -0
  70. package/dist/env/meta-discovery.d.ts +17 -0
  71. package/dist/env/meta-discovery.js +65 -0
  72. package/dist/env/meta-discovery.js.map +1 -0
  73. package/dist/env/spec.d.ts +133 -0
  74. package/dist/env/spec.js +63 -0
  75. package/dist/env/spec.js.map +1 -0
  76. package/dist/env/variable-store.d.ts +26 -0
  77. package/dist/env/variable-store.js +49 -0
  78. package/dist/env/variable-store.js.map +1 -0
  79. package/dist/errors/boot-error.d.ts +28 -0
  80. package/dist/errors/boot-error.js +44 -0
  81. package/dist/errors/boot-error.js.map +1 -0
  82. package/dist/errors/index.d.ts +1 -0
  83. package/dist/errors/index.js +2 -0
  84. package/dist/errors/index.js.map +1 -0
  85. package/dist/http/error-handler.d.ts +23 -0
  86. package/dist/http/error-handler.js +48 -0
  87. package/dist/http/error-handler.js.map +1 -0
  88. package/dist/http/index.d.ts +1 -0
  89. package/dist/http/index.js +2 -0
  90. package/dist/http/index.js.map +1 -0
  91. package/dist/index.d.ts +10 -0
  92. package/dist/index.js +11 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/modules/discovery.d.ts +10 -0
  95. package/dist/modules/discovery.js +91 -0
  96. package/dist/modules/discovery.js.map +1 -0
  97. package/dist/modules/explorer.d.ts +38 -0
  98. package/dist/modules/explorer.js +64 -0
  99. package/dist/modules/explorer.js.map +1 -0
  100. package/dist/modules/graph.d.ts +16 -0
  101. package/dist/modules/graph.js +80 -0
  102. package/dist/modules/graph.js.map +1 -0
  103. package/dist/modules/index.d.ts +4 -0
  104. package/dist/modules/index.js +5 -0
  105. package/dist/modules/index.js.map +1 -0
  106. package/dist/modules/manifest.d.ts +43 -0
  107. package/dist/modules/manifest.js +26 -0
  108. package/dist/modules/manifest.js.map +1 -0
  109. package/dist/queues/index.d.ts +2 -0
  110. package/dist/queues/index.js +3 -0
  111. package/dist/queues/index.js.map +1 -0
  112. package/dist/queues/load-queues.d.ts +12 -0
  113. package/dist/queues/load-queues.js +56 -0
  114. package/dist/queues/load-queues.js.map +1 -0
  115. package/dist/queues/queue-manager.d.ts +44 -0
  116. package/dist/queues/queue-manager.js +134 -0
  117. package/dist/queues/queue-manager.js.map +1 -0
  118. package/dist/sockets/index.d.ts +2 -0
  119. package/dist/sockets/index.js +3 -0
  120. package/dist/sockets/index.js.map +1 -0
  121. package/dist/sockets/load-sockets.d.ts +13 -0
  122. package/dist/sockets/load-sockets.js +42 -0
  123. package/dist/sockets/load-sockets.js.map +1 -0
  124. package/dist/sockets/socket-manager.d.ts +39 -0
  125. package/dist/sockets/socket-manager.js +85 -0
  126. package/dist/sockets/socket-manager.js.map +1 -0
  127. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/boot/boot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Express, Router } from "express";
2
+ import type { Environment } from "../env/environment.js";
3
+ import type { GlobalConfig } from "../config/index.js";
4
+ import type { Acl } from "../acl/acl.js";
5
+ import type { ModelStore } from "../db/model-store.js";
6
+ import type { QueueManager } from "../queues/queue-manager.js";
7
+ import type { SocketManager } from "../sockets/socket-manager.js";
8
+ /**
9
+ * The context object threaded through every module-authored function.
10
+ * Later-phase members only exist once their phase has run: config factories
11
+ * (phase 6) see neither `acl` (phase 7) nor `app` (web branch, phase 9).
12
+ */
13
+ export interface Ctx {
14
+ Environment: Environment;
15
+ config: GlobalConfig;
16
+ acl?: Acl;
17
+ models?: ModelStore;
18
+ queues?: QueueManager;
19
+ sockets?: SocketManager;
20
+ app?: Express;
21
+ }
22
+ /**
23
+ * Default export of `module.config.ts`. Returns the module's config
24
+ * namespace (stored at `config.<module>`); returning nothing is a valid
25
+ * "this module has no config" answer.
26
+ *
27
+ * Factories run in load order against the growing global config, so a
28
+ * module can read the namespaces of everything it `dependsOn`.
29
+ */
30
+ export type ModuleConfigFn = (ctx: Ctx) => Record<string, unknown> | void | Promise<Record<string, unknown> | void>;
31
+ export type LifecycleHook = (ctx: Ctx) => void | Promise<void>;
32
+ /**
33
+ * Optional named exports of `module.config.ts`:
34
+ * onReady — after the process is fully up (server listening / worker consuming)
35
+ * onShutdown — graceful shutdown, invoked in REVERSE load order
36
+ */
37
+ export interface ModuleLifecycle {
38
+ module: string;
39
+ onReady?: LifecycleHook;
40
+ onShutdown?: LifecycleHook;
41
+ }
42
+ /**
43
+ * Default export of `routes/*.routes.ts` (web branch only). May mount
44
+ * directly on `ctx.app`, or return a Router for core to `app.use()` —
45
+ * returning one is the recommended style.
46
+ */
47
+ export type RoutesFn = (ctx: Ctx) => Router | void | Promise<Router | void>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/boot/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { BootReport, type BootScope } from "../errors/boot-error.js";
2
+ /**
3
+ * Dynamic-import one conventional module file, funneling failures into the
4
+ * boot report instead of letting a single broken file produce a bare stack
5
+ * trace. Returns undefined on failure so callers can keep collecting.
6
+ */
7
+ export declare function importFile<T extends object = Record<string, unknown>>(filePath: string, scope: BootScope, moduleName: string, report: BootReport): Promise<T | undefined>;
@@ -0,0 +1,23 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { BootReport } from "../errors/boot-error.js";
3
+ /**
4
+ * Dynamic-import one conventional module file, funneling failures into the
5
+ * boot report instead of letting a single broken file produce a bare stack
6
+ * trace. Returns undefined on failure so callers can keep collecting.
7
+ */
8
+ export async function importFile(filePath, scope, moduleName, report) {
9
+ try {
10
+ // pathToFileURL: plain absolute paths are not valid ESM specifiers on
11
+ // every platform (Windows drive letters parse as URL schemes).
12
+ return (await import(pathToFileURL(filePath).href));
13
+ }
14
+ catch (error) {
15
+ report.add({
16
+ scope,
17
+ module: moduleName,
18
+ message: `failed to import ${filePath}: ${error.message}`,
19
+ });
20
+ return undefined;
21
+ }
22
+ }
23
+ //# sourceMappingURL=import-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-file.js","sourceRoot":"","sources":["../../src/boot/import-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAkB,MAAM,yBAAyB,CAAC;AAErE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,KAAgB,EAChB,UAAkB,EAClB,MAAkB;IAElB,IAAI,CAAC;QACH,sEAAsE;QACtE,+DAA+D;QAC/D,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAM,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,CAAC;YACT,KAAK;YACL,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,oBAAoB,QAAQ,KAAM,KAAe,CAAC,OAAO,EAAE;SACrE,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { boot, processModes, type BootHandle, type BootOptions, type ProcessMode } from "./boot.js";
2
+ export type { AppConfigFn } from "./app-files.js";
3
+ export type { Ctx, LifecycleHook, ModuleConfigFn, ModuleLifecycle, RoutesFn, } from "./contracts.js";
@@ -0,0 +1,2 @@
1
+ export { boot, processModes } from "./boot.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/boot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAuD,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ // Published bin entry — compiled to dist/cli/bin.js. The dev workspace uses
3
+ // bin/tulipes.js (a tsx shim over the same main) instead; publishConfig.bin
4
+ // swaps this one in at pack time.
5
+ import { main } from "./main.js";
6
+ await main(process.argv.slice(2));
7
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AACA,4EAA4E;AAC5E,4EAA4E;AAC5E,kCAAkC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `tulipes dev [entry]` — sync first (generated types must never be stale
3
+ * when the dev server starts), then hand off to tsx in watch mode.
4
+ *
5
+ * tsx is resolved from core's own dependencies rather than trusting PATH,
6
+ * so the command works in any workspace layout.
7
+ */
8
+ export declare function runDev(rootDir: string, entry: string): Promise<void>;
@@ -0,0 +1,22 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, join } from "node:path";
4
+ import { runSync } from "./sync.js";
5
+ /**
6
+ * `tulipes dev [entry]` — sync first (generated types must never be stale
7
+ * when the dev server starts), then hand off to tsx in watch mode.
8
+ *
9
+ * tsx is resolved from core's own dependencies rather than trusting PATH,
10
+ * so the command works in any workspace layout.
11
+ */
12
+ export async function runDev(rootDir, entry) {
13
+ await runSync(rootDir);
14
+ const require = createRequire(import.meta.url);
15
+ const tsxPackage = require.resolve("tsx/package.json");
16
+ const tsxCli = join(dirname(tsxPackage), "dist", "cli.mjs");
17
+ const child = spawn(process.execPath, [tsxCli, "watch", "--clear-screen=false", entry], { cwd: rootDir, stdio: "inherit" });
18
+ child.on("exit", (code) => {
19
+ process.exitCode = code ?? 0;
20
+ });
21
+ }
22
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAe,EAAE,KAAa;IACzD,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAE5D,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,KAAK,CAAC,EAChD,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CACnC,CAAC;IACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `tulipes env:check` — boot phases 1–3 and nothing else: validate the
3
+ * current environment against every module's declared contract, print the
4
+ * verdict, exit accordingly. Built for CI gates and deploy preflights.
5
+ */
6
+ export declare function runEnvCheck(rootDir: string): Promise<void>;
@@ -0,0 +1,28 @@
1
+ import { Environment } from "../env/environment.js";
2
+ import { TulipesBootError } from "../errors/boot-error.js";
3
+ /**
4
+ * `tulipes env:check` — boot phases 1–3 and nothing else: validate the
5
+ * current environment against every module's declared contract, print the
6
+ * verdict, exit accordingly. Built for CI gates and deploy preflights.
7
+ */
8
+ export async function runEnvCheck(rootDir) {
9
+ let env;
10
+ try {
11
+ env = Environment.load({ rootDir });
12
+ }
13
+ catch (error) {
14
+ if (error instanceof TulipesBootError) {
15
+ console.error(error.message);
16
+ process.exitCode = 1;
17
+ return;
18
+ }
19
+ throw error;
20
+ }
21
+ const snapshot = env.store.snapshot(); // secrets redacted
22
+ const names = Object.keys(snapshot);
23
+ console.log(`APP_ENV=${env.appEnv} — ${names.length} variable(s) resolved:`);
24
+ for (const name of names) {
25
+ console.log(` ✔ ${name}=${String(snapshot[name])}`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=env-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-check.js","sourceRoot":"","sources":["../../src/cli/env-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,mBAAmB;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,wBAAwB,CAAC,CAAC;IAC7E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function main(argv: readonly string[]): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import { runSync } from "./sync.js";
2
+ import { runEnvCheck } from "./env-check.js";
3
+ import { runNewModule } from "./new-module.js";
4
+ import { runDev } from "./dev.js";
5
+ /**
6
+ * The `tulipes` CLI. Deliberately dependency-free argument handling — four
7
+ * commands don't justify a parser library.
8
+ * All commands operate on the app in the current working directory.
9
+ */
10
+ const HELP = `tulipes — module-based express framework
11
+
12
+ Usage:
13
+ tulipes sync regenerate types/config.d.ts and .env.example
14
+ tulipes env:check validate env against every meta.variables.json (CI-friendly)
15
+ tulipes new module <name> scaffold a module under ./modules
16
+ tulipes dev [entry] run with tsx in watch mode (default entry: app.ts), sync first
17
+ `;
18
+ export async function main(argv) {
19
+ const [command, ...rest] = argv;
20
+ const rootDir = process.cwd();
21
+ switch (command) {
22
+ case "sync":
23
+ return runSync(rootDir);
24
+ case "env:check":
25
+ return runEnvCheck(rootDir);
26
+ case "new":
27
+ if (rest[0] !== "module" || !rest[1]) {
28
+ console.error('Usage: tulipes new module <name>');
29
+ process.exitCode = 2;
30
+ return;
31
+ }
32
+ return runNewModule(rootDir, rest[1]);
33
+ case "dev":
34
+ return runDev(rootDir, rest[0] ?? "app.ts");
35
+ case undefined:
36
+ case "help":
37
+ case "--help":
38
+ console.log(HELP);
39
+ return;
40
+ default:
41
+ console.error(`Unknown command "${command}"\n\n${HELP}`);
42
+ process.exitCode = 2;
43
+ }
44
+ }
45
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC;;;;GAIG;AACH,MAAM,IAAI,GAAG;;;;;;;CAOZ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAuB;IAChD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE9B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B,KAAK,KAAK;YACR,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAClD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;QAC9C,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,QAAQ,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `tulipes new module <name>` — scaffold the full module skeleton. The scope
3
+ * is borrowed from an existing sibling module so the app keeps one naming
4
+ * convention without configuring it anywhere.
5
+ */
6
+ export declare function runNewModule(rootDir: string, name: string): Promise<void>;
@@ -0,0 +1,84 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ /**
4
+ * `tulipes new module <name>` — scaffold the full module skeleton. The scope
5
+ * is borrowed from an existing sibling module so the app keeps one naming
6
+ * convention without configuring it anywhere.
7
+ */
8
+ export async function runNewModule(rootDir, name) {
9
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) {
10
+ console.error(`module name "${name}" is invalid — lowercase kebab-case required`);
11
+ process.exitCode = 2;
12
+ return;
13
+ }
14
+ const modulesDir = join(rootDir, "modules");
15
+ const dir = join(modulesDir, name);
16
+ if (existsSync(dir)) {
17
+ console.error(`modules/${name} already exists`);
18
+ process.exitCode = 1;
19
+ return;
20
+ }
21
+ const scope = detectScope(modulesDir) ?? "@app";
22
+ mkdirSync(join(dir, "routes"), { recursive: true });
23
+ write(dir, "package.json", JSON.stringify({
24
+ name: `${scope}/${name}`,
25
+ version: "0.0.0",
26
+ private: true,
27
+ type: "module",
28
+ tulipes: { tier: "app", priority: 100, dependsOn: [] },
29
+ dependencies: { "@tulipes/core": "workspace:*", express: "^5" },
30
+ }, null, 2) + "\n");
31
+ write(dir, "meta.variables.json", JSON.stringify({ variables: [] }, null, 2) + "\n");
32
+ write(dir, "module.config.ts", [
33
+ `import type { Ctx } from "@tulipes/core/boot";`,
34
+ ``,
35
+ `export default function ${camel(name)}Config(_ctx: Ctx) {`,
36
+ ` return {};`,
37
+ `}`,
38
+ ``,
39
+ ].join("\n"));
40
+ write(dir, join("routes", `${name}.routes.ts`), [
41
+ `import { Router } from "express";`,
42
+ `import type { Ctx } from "@tulipes/core/boot";`,
43
+ ``,
44
+ `export default function ${camel(name)}Routes(_ctx: Ctx): Router {`,
45
+ ` const router = Router();`,
46
+ ``,
47
+ ` router.get("/${name}/ping", (_req, res) => {`,
48
+ ` res.json({ module: "${name}" });`,
49
+ ` });`,
50
+ ``,
51
+ ` return router;`,
52
+ `}`,
53
+ ``,
54
+ ].join("\n"));
55
+ console.log(`scaffolded modules/${name} (${scope}/${name})`);
56
+ console.log(`next: yarn install && tulipes sync`);
57
+ }
58
+ function detectScope(modulesDir) {
59
+ let entries;
60
+ try {
61
+ entries = readdirSync(modulesDir);
62
+ }
63
+ catch {
64
+ return undefined;
65
+ }
66
+ for (const entry of entries) {
67
+ try {
68
+ const pkg = JSON.parse(readFileSync(join(modulesDir, entry, "package.json"), "utf8"));
69
+ if (pkg.name?.startsWith("@"))
70
+ return pkg.name.split("/")[0];
71
+ }
72
+ catch {
73
+ continue; // not a module folder
74
+ }
75
+ }
76
+ return undefined;
77
+ }
78
+ function write(dir, file, content) {
79
+ writeFileSync(join(dir, file), content);
80
+ }
81
+ function camel(kebab) {
82
+ return kebab.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
83
+ }
84
+ //# sourceMappingURL=new-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-module.js","sourceRoot":"","sources":["../../src/cli/new-module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `tulipes sync` — everything derivable from the meta files, derived:
3
+ *
4
+ * types/config.d.ts KnownVariables + GlobalConfig augmentations. Config
5
+ * namespaces are typed as each factory's RETURN TYPE via
6
+ * `typeof import(...)` — the compiler does the inference,
7
+ * codegen never executes module code.
8
+ * .env.example every variable, grouped by module and `group`.
9
+ *
10
+ * Both files are committed and marked generated.
11
+ */
12
+ export declare function runSync(rootDir: string): Promise<void>;
@@ -0,0 +1,117 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join, relative } from "node:path";
3
+ import { BootReport } from "../errors/boot-error.js";
4
+ import { discoverModuleMeta } from "../env/meta-discovery.js";
5
+ import { discoverModules } from "../modules/discovery.js";
6
+ import { sortModules } from "../modules/graph.js";
7
+ import { exploreModules } from "../modules/explorer.js";
8
+ /**
9
+ * `tulipes sync` — everything derivable from the meta files, derived:
10
+ *
11
+ * types/config.d.ts KnownVariables + GlobalConfig augmentations. Config
12
+ * namespaces are typed as each factory's RETURN TYPE via
13
+ * `typeof import(...)` — the compiler does the inference,
14
+ * codegen never executes module code.
15
+ * .env.example every variable, grouped by module and `group`.
16
+ *
17
+ * Both files are committed and marked generated.
18
+ */
19
+ export async function runSync(rootDir) {
20
+ const report = new BootReport();
21
+ const modulesDir = join(rootDir, "modules");
22
+ const metas = discoverModuleMeta(modulesDir, report);
23
+ const order = sortModules(discoverModules(modulesDir, report), report);
24
+ report.throwIfAny("sync");
25
+ const metaByModule = new Map(metas.map((meta) => [meta.module, meta]));
26
+ // Meta discovery walks folders; align it to load order for stable output.
27
+ const orderedMetas = order
28
+ .map((module) => metaByModule.get(module.name))
29
+ .filter((meta) => meta !== undefined);
30
+ const typesDir = join(rootDir, "types");
31
+ mkdirSync(typesDir, { recursive: true });
32
+ const dtsPath = join(typesDir, "config.d.ts");
33
+ writeFileSync(dtsPath, renderDts(rootDir, orderedMetas, order));
34
+ console.log(`wrote ${relative(rootDir, dtsPath)}`);
35
+ const envExamplePath = join(rootDir, ".env.example");
36
+ writeFileSync(envExamplePath, renderEnvExample(orderedMetas));
37
+ console.log(`wrote ${relative(rootDir, envExamplePath)}`);
38
+ }
39
+ function renderDts(rootDir, metas, order) {
40
+ const variableLines = metas.flatMap((meta) => meta.variables.flatMap((spec) => [
41
+ ` /** [${meta.module}] ${spec.description} */`,
42
+ ` ${spec.name}: ${tsTypeOf(spec)};`,
43
+ ]));
44
+ // Only modules with a config factory get a typed namespace; the rest fall
45
+ // back to GlobalConfig's index signature.
46
+ const configLines = exploreModules(order)
47
+ .filter((files) => files.configFile)
48
+ .flatMap((files) => {
49
+ const specifier = "./" + relative(join(rootDir, "types"), files.configFile).replace(/\.ts$/, ".js");
50
+ // Optional on purpose: a namespace only exists once phase 6 has run
51
+ // its factory, and an empty config seed must stay assignable.
52
+ return [
53
+ ` ${files.module.name}?: Awaited<`,
54
+ ` ReturnType<(typeof import("${specifier}"))["default"]>`,
55
+ ` >;`,
56
+ ];
57
+ });
58
+ return [
59
+ "// AUTO-GENERATED by `tulipes sync` — do not edit.",
60
+ "",
61
+ 'declare module "@tulipes/core/env" {',
62
+ " interface KnownVariables {",
63
+ ...variableLines,
64
+ " }",
65
+ "}",
66
+ "",
67
+ 'declare module "@tulipes/core/config" {',
68
+ " interface GlobalConfig {",
69
+ ...configLines,
70
+ " }",
71
+ "}",
72
+ "",
73
+ "export {};",
74
+ "",
75
+ ].join("\n");
76
+ }
77
+ function tsTypeOf(spec) {
78
+ switch (spec.type) {
79
+ case "number":
80
+ return "number";
81
+ case "boolean":
82
+ return "boolean";
83
+ case "enum":
84
+ return spec.enum.map((value) => JSON.stringify(value)).join(" | ");
85
+ default: // string, url, secret
86
+ return "string";
87
+ }
88
+ }
89
+ function renderEnvExample(metas) {
90
+ const lines = [
91
+ "# AUTO-GENERATED by `tulipes sync` from every module's meta.variables.json.",
92
+ "# Copy into .envs/.env.<mode> and fill in the blanks.",
93
+ ];
94
+ for (const meta of metas) {
95
+ if (meta.variables.length === 0)
96
+ continue;
97
+ lines.push("", `# ━━━ ${meta.module} ━━━`);
98
+ // Stable grouping: order of first appearance, ungrouped vars last.
99
+ const groups = new Map();
100
+ for (const spec of meta.variables) {
101
+ const key = spec.group ?? "";
102
+ (groups.get(key) ?? groups.set(key, []).get(key)).push(spec);
103
+ }
104
+ for (const [group, specs] of [...groups.entries()].sort(([a], [b]) => Number(a === "") - Number(b === ""))) {
105
+ if (group)
106
+ lines.push("", `# ── ${group} ──`);
107
+ for (const spec of specs) {
108
+ const constraint = spec.type === "enum" ? `enum: ${spec.enum.join(" | ")}` : spec.type;
109
+ const requirement = spec.required ? ", REQUIRED" : "";
110
+ lines.push(`# ${spec.description} (${constraint}${requirement})`);
111
+ lines.push(`${spec.name}=${spec.default ?? ""}`);
112
+ }
113
+ }
114
+ }
115
+ return lines.join("\n") + "\n";
116
+ }
117
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { BootReport } from "../errors/boot-error.js";
2
+ import type { ModuleFiles } from "../modules/explorer.js";
3
+ import type { Ctx, ModuleLifecycle } from "../boot/contracts.js";
4
+ /**
5
+ * Boot phase 6: run every `module.config.ts` factory in load order, merging
6
+ * each result into the global config under the module's short name, and
7
+ * collect the lifecycle hooks exported alongside them.
8
+ *
9
+ * The ctx handed to each factory carries the config built *so far* — load
10
+ * order is dependency order, so a module can safely read the namespaces of
11
+ * anything it declared in `dependsOn`.
12
+ */
13
+ export declare function buildGlobalConfig(explored: readonly ModuleFiles[], ctx: Ctx, report: BootReport): Promise<ModuleLifecycle[]>;
@@ -0,0 +1,63 @@
1
+ import { BootReport } from "../errors/boot-error.js";
2
+ import { importFile } from "../boot/import-file.js";
3
+ /**
4
+ * Boot phase 6: run every `module.config.ts` factory in load order, merging
5
+ * each result into the global config under the module's short name, and
6
+ * collect the lifecycle hooks exported alongside them.
7
+ *
8
+ * The ctx handed to each factory carries the config built *so far* — load
9
+ * order is dependency order, so a module can safely read the namespaces of
10
+ * anything it declared in `dependsOn`.
11
+ */
12
+ export async function buildGlobalConfig(explored, ctx, report) {
13
+ const lifecycles = [];
14
+ for (const { module, configFile } of explored) {
15
+ if (!configFile)
16
+ continue;
17
+ const exported = await importFile(configFile, "config", module.name, report);
18
+ if (!exported)
19
+ continue;
20
+ const lifecycle = collectLifecycle(module.name, exported, report);
21
+ if (lifecycle)
22
+ lifecycles.push(lifecycle);
23
+ if (typeof exported.default !== "function") {
24
+ report.add({
25
+ scope: "config",
26
+ module: module.name,
27
+ message: "module.config must default-export a function (ctx) => config",
28
+ });
29
+ continue;
30
+ }
31
+ try {
32
+ const result = await exported.default(ctx);
33
+ ctx.config[module.name] = result ?? {};
34
+ }
35
+ catch (error) {
36
+ report.add({
37
+ scope: "config",
38
+ module: module.name,
39
+ message: `config factory threw: ${error.message}`,
40
+ });
41
+ }
42
+ }
43
+ return lifecycles;
44
+ }
45
+ function collectLifecycle(moduleName, exported, report) {
46
+ const lifecycle = { module: moduleName };
47
+ for (const hook of ["onReady", "onShutdown"]) {
48
+ const value = exported[hook];
49
+ if (value === undefined)
50
+ continue;
51
+ if (typeof value !== "function") {
52
+ report.add({
53
+ scope: "config",
54
+ module: moduleName,
55
+ message: `exported "${hook}" must be a function`,
56
+ });
57
+ continue;
58
+ }
59
+ lifecycle[hook] = value;
60
+ }
61
+ return lifecycle.onReady || lifecycle.onShutdown ? lifecycle : undefined;
62
+ }
63
+ //# sourceMappingURL=build-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.js","sourceRoot":"","sources":["../../src/config/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAcpD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgC,EAChC,GAAQ,EACR,MAAkB;IAElB,MAAM,UAAU,GAAsB,EAAE,CAAC;IAEzC,KAAK,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC9C,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,UAAU,EACV,QAAQ,EACR,MAAM,CAAC,IAAI,EACX,MAAM,CACP,CAAC;QACF,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,SAAS;YAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC;gBACT,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,OAAO,EAAE,8DAA8D;aACxE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAO,QAAQ,CAAC,OAA0B,CAAC,GAAG,CAAC,CAAC;YAC/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CAAC;gBACT,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,OAAO,EAAE,yBAA0B,KAAe,CAAC,OAAO,EAAE;aAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CACvB,UAAkB,EAClB,QAA2B,EAC3B,MAAkB;IAElB,MAAM,SAAS,GAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAE1D,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,YAAY,CAAU,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC;gBACT,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,aAAa,IAAI,sBAAsB;aACjD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,GAAG,KAAsB,CAAC;IAC3C,CAAC;IAED,OAAO,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { buildGlobalConfig } from "./build-config.js";
2
+ /**
3
+ * The global config: one plain object, namespaced by module short-name —
4
+ * whatever `modules/users/module.config.ts` returns lives at `config.users`.
5
+ *
6
+ * Augmentation target for the generated `types/config.d.ts` (`tulipes sync`):
7
+ * codegen adds one property per module, typed as its factory's return type.
8
+ * Declared in THIS module (not re-exported) because TypeScript module
9
+ * augmentation only merges with the module that declares the interface.
10
+ */
11
+ export interface GlobalConfig {
12
+ [moduleName: string]: Record<string, unknown> | undefined;
13
+ }
@@ -0,0 +1,2 @@
1
+ export { buildGlobalConfig } from "./build-config.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}