@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,39 @@
1
+ import type { Server as HttpServer } from "node:http";
2
+ import { Server, type Namespace, type ServerOptions } from "socket.io";
3
+ import { BootReport } from "../errors/boot-error.js";
4
+ /**
5
+ * Wraps the process-wide Socket.IO server (web branch only, phase 11w).
6
+ *
7
+ * Namespaces are the socket-side equivalent of route prefixes, and get the
8
+ * same ownership rule as everything else in Tulipes: a module claims its
9
+ * namespace ("/users") exactly once, and emitting into a namespace nobody
10
+ * claimed throws instead of silently broadcasting to nothing.
11
+ */
12
+ export declare class SocketManager {
13
+ #private;
14
+ constructor(httpServer: HttpServer, options?: Partial<ServerOptions>);
15
+ /** Escape hatch for advanced use — prefer `of()` for claimed namespaces. */
16
+ get io(): Server;
17
+ /** Emit-side accessor, fail-closed on unclaimed namespaces. */
18
+ of(name: string): Namespace;
19
+ /** Claimed namespace names — for the startup banner and tooling. */
20
+ namespaces(): string[];
21
+ /** @internal Module-scoped facade for the loader. */
22
+ forModule(moduleName: string, report: BootReport): SocketRegistry;
23
+ /** @internal SocketRegistry only. */
24
+ claim_(name: string, owner: string): string | undefined;
25
+ /**
26
+ * Disconnects every client. Deliberately NOT io.close() — that would also
27
+ * close the attached http server, whose lifecycle belongs to boot.
28
+ */
29
+ close(): void;
30
+ }
31
+ export declare class SocketRegistry {
32
+ #private;
33
+ constructor(manager: SocketManager, moduleName: string, report: BootReport);
34
+ /**
35
+ * Claim a namespace and wire it up. The setup callback receives the live
36
+ * Namespace — attach middleware and connection handlers there.
37
+ */
38
+ namespace(name: string, setup: (nsp: Namespace) => void): this;
39
+ }
@@ -0,0 +1,85 @@
1
+ import { Server } from "socket.io";
2
+ import { BootReport } from "../errors/boot-error.js";
3
+ /**
4
+ * Wraps the process-wide Socket.IO server (web branch only, phase 11w).
5
+ *
6
+ * Namespaces are the socket-side equivalent of route prefixes, and get the
7
+ * same ownership rule as everything else in Tulipes: a module claims its
8
+ * namespace ("/users") exactly once, and emitting into a namespace nobody
9
+ * claimed throws instead of silently broadcasting to nothing.
10
+ */
11
+ export class SocketManager {
12
+ #io;
13
+ /** namespace name → owning module */
14
+ #namespaces = new Map();
15
+ constructor(httpServer, options) {
16
+ this.#io = new Server(httpServer, options);
17
+ }
18
+ /** Escape hatch for advanced use — prefer `of()` for claimed namespaces. */
19
+ get io() {
20
+ return this.#io;
21
+ }
22
+ /** Emit-side accessor, fail-closed on unclaimed namespaces. */
23
+ of(name) {
24
+ if (!this.#namespaces.has(name)) {
25
+ throw new Error(`Socket namespace "${name}" was never claimed by any module (known: ${[...this.#namespaces.keys()].join(", ") || "none"})`);
26
+ }
27
+ return this.#io.of(name);
28
+ }
29
+ /** Claimed namespace names — for the startup banner and tooling. */
30
+ namespaces() {
31
+ return [...this.#namespaces.keys()];
32
+ }
33
+ /** @internal Module-scoped facade for the loader. */
34
+ forModule(moduleName, report) {
35
+ return new SocketRegistry(this, moduleName, report);
36
+ }
37
+ /** @internal SocketRegistry only. */
38
+ claim_(name, owner) {
39
+ const existing = this.#namespaces.get(name);
40
+ if (existing)
41
+ return existing;
42
+ this.#namespaces.set(name, owner);
43
+ return undefined;
44
+ }
45
+ /**
46
+ * Disconnects every client. Deliberately NOT io.close() — that would also
47
+ * close the attached http server, whose lifecycle belongs to boot.
48
+ */
49
+ close() {
50
+ this.#io.disconnectSockets(true);
51
+ }
52
+ }
53
+ /** "/", or "/name" — lowercase kebab-case. */
54
+ const NAMESPACE = /^\/([a-z0-9-]+)?$/;
55
+ export class SocketRegistry {
56
+ #manager;
57
+ #module;
58
+ #report;
59
+ constructor(manager, moduleName, report) {
60
+ this.#manager = manager;
61
+ this.#module = moduleName;
62
+ this.#report = report;
63
+ }
64
+ /**
65
+ * Claim a namespace and wire it up. The setup callback receives the live
66
+ * Namespace — attach middleware and connection handlers there.
67
+ */
68
+ namespace(name, setup) {
69
+ if (!NAMESPACE.test(name)) {
70
+ this.#issue(`namespace "${name}" is invalid — expected "/" or "/kebab-case-name"`);
71
+ return this;
72
+ }
73
+ const owner = this.#manager.claim_(name, this.#module);
74
+ if (owner) {
75
+ this.#issue(`namespace "${name}" is already claimed by module "${owner}"`);
76
+ return this;
77
+ }
78
+ setup(this.#manager.io.of(name));
79
+ return this;
80
+ }
81
+ #issue(message) {
82
+ this.#report.add({ scope: "boot", module: this.#module, message });
83
+ }
84
+ }
85
+ //# sourceMappingURL=socket-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-manager.js","sourceRoot":"","sources":["../../src/sockets/socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAsC,MAAM,WAAW,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;;;;;GAOG;AACH,MAAM,OAAO,aAAa;IACf,GAAG,CAAS;IACrB,qCAAqC;IAC5B,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,YAAY,UAAsB,EAAE,OAAgC;QAClE,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,4EAA4E;IAC5E,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,+DAA+D;IAC/D,EAAE,CAAC,IAAY;QACb,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,6CAA6C,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAC3H,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,oEAAoE;IACpE,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,qDAAqD;IACrD,SAAS,CAAC,UAAkB,EAAE,MAAkB;QAC9C,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,qCAAqC;IACrC,MAAM,CAAC,IAAY,EAAE,KAAa;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAED,8CAA8C;AAC9C,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC,MAAM,OAAO,cAAc;IAChB,QAAQ,CAAgB;IACxB,OAAO,CAAS;IAChB,OAAO,CAAa;IAE7B,YAAY,OAAsB,EAAE,UAAkB,EAAE,MAAkB;QACxE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,IAAY,EAAE,KAA+B;QACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,mDAAmD,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,mCAAmC,KAAK,GAAG,CAAC,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@tulipes/core",
3
+ "version": "0.1.0",
4
+ "description": "Module-based Express framework: convention-driven boot pipeline, env contracts, ACL, queues, sockets and CLI",
5
+ "type": "module",
6
+ "bin": {
7
+ "tulipes": "./dist/cli/bin.js"
8
+ },
9
+ "exports": {
10
+ ".": "./dist/index.js",
11
+ "./env": "./dist/env/index.js",
12
+ "./modules": "./dist/modules/index.js",
13
+ "./boot": "./dist/boot/index.js",
14
+ "./acl": "./dist/acl/index.js",
15
+ "./db": "./dist/db/index.js",
16
+ "./queues": "./dist/queues/index.js",
17
+ "./sockets": "./dist/sockets/index.js",
18
+ "./http": "./dist/http/index.js",
19
+ "./config": "./dist/config/index.js",
20
+ "./errors": "./dist/errors/index.js"
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "scripts": {
26
+ "typecheck": "tsc --noEmit",
27
+ "build": "tsc -p tsconfig.json",
28
+ "prepack": "yarn build"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public",
32
+ "bin": {
33
+ "tulipes": "./dist/cli/bin.js"
34
+ },
35
+ "exports": {
36
+ ".": "./dist/index.js",
37
+ "./env": "./dist/env/index.js",
38
+ "./modules": "./dist/modules/index.js",
39
+ "./boot": "./dist/boot/index.js",
40
+ "./acl": "./dist/acl/index.js",
41
+ "./db": "./dist/db/index.js",
42
+ "./queues": "./dist/queues/index.js",
43
+ "./sockets": "./dist/sockets/index.js",
44
+ "./http": "./dist/http/index.js",
45
+ "./config": "./dist/config/index.js",
46
+ "./errors": "./dist/errors/index.js"
47
+ }
48
+ },
49
+ "dependencies": {
50
+ "bullmq": "^5",
51
+ "colorette": "^2",
52
+ "dotenv": "^16.4.7",
53
+ "express": "^5",
54
+ "ioredis": "^5",
55
+ "mongoose": "^8",
56
+ "socket.io": "^4",
57
+ "tsx": "^4",
58
+ "zod": "^3.24.1"
59
+ },
60
+ "devDependencies": {
61
+ "@types/express": "^5",
62
+ "@types/node": "^24.2.0",
63
+ "typescript": "^7.0.2"
64
+ }
65
+ }