lanka 1.0.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 (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/ALankaGateway-ExlRGT3D.d.ts +122 -0
  4. package/dist/ALankaSharedStore-B7uepuuk.d.ts +29 -0
  5. package/dist/ILankaApiError-zI_2bNs0.d.ts +16 -0
  6. package/dist/ILankaRuntimeConfig-Vl436GWK.d.ts +62 -0
  7. package/dist/ILankaScenarioMetadata-Bu-yggTZ.d.ts +14 -0
  8. package/dist/ILankaScenarioVM-DuCyPoyT.d.ts +260 -0
  9. package/dist/LankaError-B1HtuIkw.d.ts +86 -0
  10. package/dist/LankaScenarioLocator-BGQHwf3n.d.ts +144 -0
  11. package/dist/LankaSharedStoreLocator-MvCpav5F.d.ts +126 -0
  12. package/dist/TLankaErrorHandler-Yfqtdh1M.d.ts +3 -0
  13. package/dist/_extend/index.d.ts +34 -0
  14. package/dist/_extend/index.js +36 -0
  15. package/dist/_extend/index.js.map +1 -0
  16. package/dist/_internal/index.d.ts +43 -0
  17. package/dist/_internal/index.js +34 -0
  18. package/dist/_internal/index.js.map +1 -0
  19. package/dist/activeRuntime-FcsSJvUg.d.ts +84 -0
  20. package/dist/bootstrap/index.d.ts +242 -0
  21. package/dist/bootstrap/index.js +22 -0
  22. package/dist/bootstrap/index.js.map +1 -0
  23. package/dist/chunk-73IVH3C6.js +52 -0
  24. package/dist/chunk-73IVH3C6.js.map +1 -0
  25. package/dist/chunk-BGVDPDX4.js +29 -0
  26. package/dist/chunk-BGVDPDX4.js.map +1 -0
  27. package/dist/chunk-C2HP7CRD.js +224 -0
  28. package/dist/chunk-C2HP7CRD.js.map +1 -0
  29. package/dist/chunk-D27MREPB.js +13 -0
  30. package/dist/chunk-D27MREPB.js.map +1 -0
  31. package/dist/chunk-DTO27QFR.js +59 -0
  32. package/dist/chunk-DTO27QFR.js.map +1 -0
  33. package/dist/chunk-EWVDJYCC.js +296 -0
  34. package/dist/chunk-EWVDJYCC.js.map +1 -0
  35. package/dist/chunk-FIR4XTBL.js +136 -0
  36. package/dist/chunk-FIR4XTBL.js.map +1 -0
  37. package/dist/chunk-ILQNYQY5.js +200 -0
  38. package/dist/chunk-ILQNYQY5.js.map +1 -0
  39. package/dist/chunk-J5LA3Q6D.js +14 -0
  40. package/dist/chunk-J5LA3Q6D.js.map +1 -0
  41. package/dist/chunk-MDZ42XRH.js +10 -0
  42. package/dist/chunk-MDZ42XRH.js.map +1 -0
  43. package/dist/chunk-Q3SOVBIJ.js +176 -0
  44. package/dist/chunk-Q3SOVBIJ.js.map +1 -0
  45. package/dist/chunk-Q7QESSYF.js +49 -0
  46. package/dist/chunk-Q7QESSYF.js.map +1 -0
  47. package/dist/chunk-RKYKK6MN.js +19 -0
  48. package/dist/chunk-RKYKK6MN.js.map +1 -0
  49. package/dist/chunk-RYFZCAQ3.js +637 -0
  50. package/dist/chunk-RYFZCAQ3.js.map +1 -0
  51. package/dist/chunk-UJEC7H6K.js +39 -0
  52. package/dist/chunk-UJEC7H6K.js.map +1 -0
  53. package/dist/chunk-XESL274R.js +23 -0
  54. package/dist/chunk-XESL274R.js.map +1 -0
  55. package/dist/chunk-YR4MZXMU.js +13 -0
  56. package/dist/chunk-YR4MZXMU.js.map +1 -0
  57. package/dist/config/index.d.ts +63 -0
  58. package/dist/config/index.js +16 -0
  59. package/dist/config/index.js.map +1 -0
  60. package/dist/createLankaScope-Bc_vChRs.d.ts +30 -0
  61. package/dist/errors/index.d.ts +37 -0
  62. package/dist/errors/index.js +16 -0
  63. package/dist/errors/index.js.map +1 -0
  64. package/dist/gateway/index.d.ts +258 -0
  65. package/dist/gateway/index.js +438 -0
  66. package/dist/gateway/index.js.map +1 -0
  67. package/dist/index.d.ts +20 -0
  68. package/dist/index.js +43 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/lankaHttpInFlight-Bk1eIuSx.d.ts +43 -0
  71. package/dist/lankaRequestMiddleware-DAC5kCb7.d.ts +62 -0
  72. package/dist/lankaStandardValidator-CL-r-zEV.d.ts +34 -0
  73. package/dist/locator/index.d.ts +282 -0
  74. package/dist/locator/index.js +67 -0
  75. package/dist/locator/index.js.map +1 -0
  76. package/dist/logger/index.d.ts +146 -0
  77. package/dist/logger/index.js +11 -0
  78. package/dist/logger/index.js.map +1 -0
  79. package/dist/mock/index.d.ts +16 -0
  80. package/dist/mock/index.js +58 -0
  81. package/dist/mock/index.js.map +1 -0
  82. package/dist/role/index.d.ts +48 -0
  83. package/dist/role/index.js +7 -0
  84. package/dist/role/index.js.map +1 -0
  85. package/dist/scenario/index.d.ts +204 -0
  86. package/dist/scenario/index.js +28 -0
  87. package/dist/scenario/index.js.map +1 -0
  88. package/dist/validation/index.d.ts +18 -0
  89. package/dist/validation/index.js +53 -0
  90. package/dist/validation/index.js.map +1 -0
  91. package/dist/viewmodel/index.d.ts +478 -0
  92. package/dist/viewmodel/index.js +701 -0
  93. package/dist/viewmodel/index.js.map +1 -0
  94. package/package.json +99 -0
  95. package/skills/lanka-core/SKILL.md +241 -0
  96. package/skills/lanka-core/reference.md +1090 -0
  97. package/skills/lanka-packages/SKILL.md +70 -0
@@ -0,0 +1,224 @@
1
+ import {
2
+ getLankaFlags
3
+ } from "./chunk-D27MREPB.js";
4
+
5
+ // src/logger/lanka-logger/LankaLogger.ts
6
+ var noop = () => {
7
+ };
8
+ var isProd = () => getLankaFlags().isProduction ?? false;
9
+ var resolveFlagValue = (val) => {
10
+ if (val === void 0) return false;
11
+ return typeof val === "function" ? val() : val;
12
+ };
13
+ var formatBadgeStyle = (color) => `background: ${color}; color: white; padding: 2px 4px; border-radius: 2px; font-weight: bold;`;
14
+ var consoleSink = {
15
+ emit: ({ layer, level, style, color, message, args }) => {
16
+ const fn = (console[level] ?? console.log).bind(console);
17
+ if (style === "badge") {
18
+ const badgeColor = color ?? "#7f8c8d";
19
+ fn(`%c[${layer}]`, formatBadgeStyle(badgeColor), message, ...args);
20
+ return;
21
+ }
22
+ fn(`[${layer}]`, message, ...args);
23
+ }
24
+ };
25
+ var FLAG_KEYS = {
26
+ GATEWAY: "loggerGateway",
27
+ SCENARIO: "loggerScenario",
28
+ VIEWMODEL: "loggerViewModel",
29
+ VIEW: "loggerView",
30
+ BOOTSTRAP: "loggerBootstrap",
31
+ ENABLED: "loggerEnabled"
32
+ };
33
+ var BUILT_IN_PRINTERS = [
34
+ { key: "printGatewayLog", layer: "GW", color: "#7e501f", level: "log", flag: "GATEWAY" },
35
+ {
36
+ key: "printScenarioLog",
37
+ layer: "SC",
38
+ color: "rgba(225,198,15,0.86)",
39
+ level: "log",
40
+ flag: "SCENARIO"
41
+ },
42
+ { key: "printViewModelLog", layer: "VM", color: "#1a85d6", level: "log", flag: "VIEWMODEL" },
43
+ { key: "printViewLog", layer: "UI", color: "#c32222", level: "log", flag: "VIEW" },
44
+ { key: "printBootstrapLog", layer: "BT", color: "#9b59b6", level: "log", flag: "BOOTSTRAP" }
45
+ ];
46
+ var LankaLogger = class {
47
+ style = "badge";
48
+ sinks = /* @__PURE__ */ new Set([consoleSink]);
49
+ flags = /* @__PURE__ */ new Map();
50
+ printers = /* @__PURE__ */ new Map();
51
+ /** The gateway layer's printer. */
52
+ printGatewayLog;
53
+ /** The scenario layer's printer. */
54
+ printScenarioLog;
55
+ /** The ViewModel layer's printer. */
56
+ printViewModelLog;
57
+ /** The view layer's printer. */
58
+ printViewLog;
59
+ /** The bootstrap sequence's printer. */
60
+ printBootstrapLog;
61
+ constructor() {
62
+ if (!isProd()) {
63
+ for (const printer of BUILT_IN_PRINTERS) this.printers.set(printer.key, { ...printer });
64
+ }
65
+ this.printGatewayLog = this.createPrinterFn("printGatewayLog");
66
+ this.printScenarioLog = this.createPrinterFn("printScenarioLog");
67
+ this.printViewModelLog = this.createPrinterFn("printViewModelLog");
68
+ this.printViewLog = this.createPrinterFn("printViewLog");
69
+ this.printBootstrapLog = this.createPrinterFn("printBootstrapLog");
70
+ }
71
+ // ── Global configuration ─────────────────────────────────────────────────
72
+ /**
73
+ * Enables or silences the WHOLE log, overriding the environment.
74
+ *
75
+ * Equivalent to setting the `ENABLED` flag.
76
+ */
77
+ setEnabled(value) {
78
+ if (isProd()) return;
79
+ this.flags.set("ENABLED", value);
80
+ }
81
+ /** Switches output between badges and plain text. */
82
+ setStyle(style) {
83
+ if (isProd()) return;
84
+ this.style = style;
85
+ }
86
+ /**
87
+ * Goes completely silent by removing the sinks; config and printers remain.
88
+ *
89
+ * Output is restored with `resetSinks()` or `addSink()`.
90
+ */
91
+ silent() {
92
+ if (isProd()) return;
93
+ this.sinks.clear();
94
+ }
95
+ /** Restores the single default sink: the console. */
96
+ resetSinks() {
97
+ if (isProd()) return;
98
+ this.sinks = /* @__PURE__ */ new Set([consoleSink]);
99
+ }
100
+ addSink(sink) {
101
+ if (isProd()) return;
102
+ this.sinks.add(sink);
103
+ }
104
+ removeSink(sink) {
105
+ if (isProd()) return;
106
+ this.sinks.delete(sink);
107
+ }
108
+ // ── Flags, built-in and custom ───────────────────────────────────────────
109
+ /**
110
+ * Declares a flag the printers use, or overrides an existing one.
111
+ *
112
+ * The value may be a boolean or a resolver function — for example one reading
113
+ * localStorage.
114
+ */
115
+ setFlag(flag, value) {
116
+ if (isProd()) return;
117
+ this.flags.set(flag, value);
118
+ }
119
+ /** Removes a flag override, falling back to the environment value. */
120
+ unsetFlag(flag) {
121
+ if (isProd()) return;
122
+ this.flags.delete(flag);
123
+ }
124
+ isFlagEnabled(flag) {
125
+ if (isProd()) return false;
126
+ const runtimeFlag = this.flags.get(flag);
127
+ if (runtimeFlag !== void 0) return resolveFlagValue(runtimeFlag);
128
+ const flags = getLankaFlags();
129
+ const key = FLAG_KEYS[flag];
130
+ if (key && flags[key] !== void 0) return flags[key] ?? false;
131
+ return false;
132
+ }
133
+ // ── Printers, built-in and custom ────────────────────────────────────────
134
+ /**
135
+ * Registers a printer, or replaces an existing one.
136
+ *
137
+ * @returns The callable bound to this printer
138
+ */
139
+ registerPrinter(config) {
140
+ if (isProd()) return noop;
141
+ this.printers.set(config.key, {
142
+ key: config.key,
143
+ layer: config.layer,
144
+ color: config.color,
145
+ level: config.level ?? "log",
146
+ flag: config.flag,
147
+ enabled: config.enabled
148
+ });
149
+ return this.createPrinterFn(config.key);
150
+ }
151
+ /** Updates a printer's config; a no-op when there is no such printer. */
152
+ updatePrinter(key, patch) {
153
+ if (isProd()) return;
154
+ const existing = this.printers.get(key);
155
+ if (!existing) return;
156
+ this.printers.set(key, {
157
+ key,
158
+ layer: patch.layer ?? existing.layer,
159
+ color: patch.color ?? existing.color,
160
+ level: patch.level ?? existing.level,
161
+ flag: patch.flag ?? existing.flag,
162
+ enabled: patch.enabled ?? existing.enabled
163
+ });
164
+ }
165
+ /** A printer by key; a silent function when there is none. */
166
+ getPrinter(key) {
167
+ if (isProd()) return noop;
168
+ return this.printers.has(key) ? this.createPrinterFn(key) : noop;
169
+ }
170
+ /** The keys of every registered printer. */
171
+ listPrinters() {
172
+ if (isProd()) return [];
173
+ return Array.from(this.printers.keys());
174
+ }
175
+ // ── The path a message takes ─────────────────────────────────────────────
176
+ isEnabled() {
177
+ if (isProd()) return false;
178
+ const runtimeFlag = this.flags.get("ENABLED");
179
+ if (runtimeFlag !== void 0) return resolveFlagValue(runtimeFlag);
180
+ return getLankaFlags().loggerEnabled ?? false;
181
+ }
182
+ isPrinterEnabled(printer) {
183
+ if (isProd()) return false;
184
+ if (!this.isEnabled()) return false;
185
+ if (printer.enabled !== void 0) return resolveFlagValue(printer.enabled);
186
+ if (printer.flag) return this.isFlagEnabled(printer.flag);
187
+ return true;
188
+ }
189
+ emit(printer, msg, args) {
190
+ if (isProd() || !this.isPrinterEnabled(printer)) return;
191
+ const message = typeof msg === "function" ? msg() : msg;
192
+ for (const sink of this.sinks) {
193
+ sink.emit({
194
+ layer: printer.layer,
195
+ level: printer.level,
196
+ style: this.style,
197
+ color: printer.color,
198
+ message,
199
+ args
200
+ });
201
+ }
202
+ }
203
+ /**
204
+ * A printer resolved at CALL time, not at registration.
205
+ *
206
+ * `updatePrinter` has to reach a callable a screen took a reference to long
207
+ * before; looking the key up on every call is what makes that true.
208
+ */
209
+ createPrinterFn(key) {
210
+ if (isProd()) return noop;
211
+ return (msg, ...args) => {
212
+ const printer = this.printers.get(key);
213
+ if (!printer) return;
214
+ this.emit(printer, msg, args);
215
+ };
216
+ }
217
+ };
218
+ var lankaLogger = new LankaLogger();
219
+
220
+ export {
221
+ LankaLogger,
222
+ lankaLogger
223
+ };
224
+ //# sourceMappingURL=chunk-C2HP7CRD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logger/lanka-logger/LankaLogger.ts"],"sourcesContent":["import { getLankaFlags } from \"../../config/get-lanka-flags/getLankaFlags\";\nimport { TLankaLoggerFn } from \"../_types/TLankaLoggerFn\";\nimport { TLankaLoggerFlagValue } from \"../_types/TLankaLoggerFlagValue\";\nimport { ILankaLoggerSink } from \"../_interfaces/ILankaLoggerSink\";\nimport { TLankaLoggerStyle } from \"../_types/TLankaLoggerStyle\";\nimport { TPrinterInternal } from \"../_types/TPrinterInternal\";\nimport { TLankaLogMessage } from \"../_types/TLankaLogMessage\";\nimport { TLankaLogMessageFactory } from \"../_types/TLankaLogMessageFactory\";\nimport { ILankaLoggerConfig } from \"../_interfaces/ILankaLoggerConfig\";\n\nconst noop: TLankaLoggerFn = () => {};\n\nconst isProd = (): boolean => getLankaFlags().isProduction ?? false;\n\nconst resolveFlagValue = (val: TLankaLoggerFlagValue | undefined): boolean => {\n\tif (val === undefined) return false;\n\treturn typeof val === \"function\" ? val() : val;\n};\n\nconst formatBadgeStyle = (color: string) =>\n\t`background: ${color}; color: white; padding: 2px 4px; border-radius: 2px; font-weight: bold;`;\n\nconst consoleSink: ILankaLoggerSink = {\n\temit: ({ layer, level, style, color, message, args }) => {\n\t\t// Bound deliberately. Reading a console method off the object and calling it\n\t\t// detached is what `unbound-method` warns about, and it is not merely a\n\t\t// lint concern: several environments throw \"Illegal invocation\" when a\n\t\t// console method runs with the wrong `this`.\n\t\tconst fn = (console[level] ?? console.log).bind(console);\n\t\tif (style === \"badge\") {\n\t\t\tconst badgeColor = color ?? \"#7f8c8d\";\n\t\t\tfn(`%c[${layer}]`, formatBadgeStyle(badgeColor), message, ...args);\n\t\t\treturn;\n\t\t}\n\t\tfn(`[${layer}]`, message, ...args);\n\t},\n};\n\n/** Which environment flag stands behind each built-in printer's flag name. */\nconst FLAG_KEYS = {\n\tGATEWAY: \"loggerGateway\",\n\tSCENARIO: \"loggerScenario\",\n\tVIEWMODEL: \"loggerViewModel\",\n\tVIEW: \"loggerView\",\n\tBOOTSTRAP: \"loggerBootstrap\",\n\tENABLED: \"loggerEnabled\",\n} as const;\n\n/** The five printers every application gets, and how each is coloured. */\nconst BUILT_IN_PRINTERS: readonly TPrinterInternal[] = [\n\t{ key: \"printGatewayLog\", layer: \"GW\", color: \"#7e501f\", level: \"log\", flag: \"GATEWAY\" },\n\t{\n\t\tkey: \"printScenarioLog\",\n\t\tlayer: \"SC\",\n\t\tcolor: \"rgba(225,198,15,0.86)\",\n\t\tlevel: \"log\",\n\t\tflag: \"SCENARIO\",\n\t},\n\t{ key: \"printViewModelLog\", layer: \"VM\", color: \"#1a85d6\", level: \"log\", flag: \"VIEWMODEL\" },\n\t{ key: \"printViewLog\", layer: \"UI\", color: \"#c32222\", level: \"log\", flag: \"VIEW\" },\n\t{ key: \"printBootstrapLog\", layer: \"BT\", color: \"#9b59b6\", level: \"log\", flag: \"BOOTSTRAP\" },\n];\n\n/**\n * Output that is not bound to the console, and is silent in production.\n *\n * The ambient one is `lankaLogger`, and it is what an application and the\n * framework both write: `lankaLogger.printGatewayLog(...)`. The class is here for\n * the reason node exposes `Console` beside `console` — a second logger with its\n * own sinks, flags and printers is a real thing to want, and a test that builds\n * one is not fighting a global.\n *\n * ```ts\n * const audit = new LankaLogger();\n * audit.silent();\n * audit.addSink({ emit: (entry) => rows.push(entry) });\n * ```\n *\n * Every method is a no-op in production, checked per call rather than once at\n * import: a flag flipped at runtime must not be able to start the log.\n */\nexport class LankaLogger {\n\tprivate style: TLankaLoggerStyle = \"badge\";\n\n\tprivate sinks = new Set<ILankaLoggerSink>([consoleSink]);\n\n\tprivate readonly flags = new Map<string, TLankaLoggerFlagValue>();\n\n\tprivate readonly printers = new Map<string, TPrinterInternal>();\n\n\t/** The gateway layer's printer. */\n\tpublic readonly printGatewayLog: TLankaLoggerFn;\n\n\t/** The scenario layer's printer. */\n\tpublic readonly printScenarioLog: TLankaLoggerFn;\n\n\t/** The ViewModel layer's printer. */\n\tpublic readonly printViewModelLog: TLankaLoggerFn;\n\n\t/** The view layer's printer. */\n\tpublic readonly printViewLog: TLankaLoggerFn;\n\n\t/** The bootstrap sequence's printer. */\n\tpublic readonly printBootstrapLog: TLankaLoggerFn;\n\n\tpublic constructor() {\n\t\t// Registered outside production only: there is nothing to print from, so\n\t\t// there is nothing to hold. The printer callables still exist and answer\n\t\t// with silence, so no call site needs a branch.\n\t\tif (!isProd()) {\n\t\t\tfor (const printer of BUILT_IN_PRINTERS) this.printers.set(printer.key, { ...printer });\n\t\t}\n\n\t\tthis.printGatewayLog = this.createPrinterFn(\"printGatewayLog\");\n\t\tthis.printScenarioLog = this.createPrinterFn(\"printScenarioLog\");\n\t\tthis.printViewModelLog = this.createPrinterFn(\"printViewModelLog\");\n\t\tthis.printViewLog = this.createPrinterFn(\"printViewLog\");\n\t\tthis.printBootstrapLog = this.createPrinterFn(\"printBootstrapLog\");\n\t}\n\n\t// ── Global configuration ─────────────────────────────────────────────────\n\n\t/**\n\t * Enables or silences the WHOLE log, overriding the environment.\n\t *\n\t * Equivalent to setting the `ENABLED` flag.\n\t */\n\tpublic setEnabled(value: boolean): void {\n\t\tif (isProd()) return;\n\t\tthis.flags.set(\"ENABLED\", value);\n\t}\n\n\t/** Switches output between badges and plain text. */\n\tpublic setStyle(style: TLankaLoggerStyle): void {\n\t\tif (isProd()) return;\n\t\tthis.style = style;\n\t}\n\n\t/**\n\t * Goes completely silent by removing the sinks; config and printers remain.\n\t *\n\t * Output is restored with `resetSinks()` or `addSink()`.\n\t */\n\tpublic silent(): void {\n\t\tif (isProd()) return;\n\t\tthis.sinks.clear();\n\t}\n\n\t/** Restores the single default sink: the console. */\n\tpublic resetSinks(): void {\n\t\tif (isProd()) return;\n\t\tthis.sinks = new Set<ILankaLoggerSink>([consoleSink]);\n\t}\n\n\tpublic addSink(sink: ILankaLoggerSink): void {\n\t\tif (isProd()) return;\n\t\tthis.sinks.add(sink);\n\t}\n\n\tpublic removeSink(sink: ILankaLoggerSink): void {\n\t\tif (isProd()) return;\n\t\tthis.sinks.delete(sink);\n\t}\n\n\t// ── Flags, built-in and custom ───────────────────────────────────────────\n\n\t/**\n\t * Declares a flag the printers use, or overrides an existing one.\n\t *\n\t * The value may be a boolean or a resolver function — for example one reading\n\t * localStorage.\n\t */\n\tpublic setFlag(flag: string, value: TLankaLoggerFlagValue): void {\n\t\tif (isProd()) return;\n\t\tthis.flags.set(flag, value);\n\t}\n\n\t/** Removes a flag override, falling back to the environment value. */\n\tpublic unsetFlag(flag: string): void {\n\t\tif (isProd()) return;\n\t\tthis.flags.delete(flag);\n\t}\n\n\tpublic isFlagEnabled(flag: string): boolean {\n\t\tif (isProd()) return false;\n\n\t\tconst runtimeFlag = this.flags.get(flag);\n\t\tif (runtimeFlag !== undefined) return resolveFlagValue(runtimeFlag);\n\n\t\tconst flags = getLankaFlags();\n\t\tconst key = FLAG_KEYS[flag as keyof typeof FLAG_KEYS];\n\t\tif (key && flags[key] !== undefined) return flags[key] ?? false;\n\n\t\treturn false;\n\t}\n\n\t// ── Printers, built-in and custom ────────────────────────────────────────\n\n\t/**\n\t * Registers a printer, or replaces an existing one.\n\t *\n\t * @returns The callable bound to this printer\n\t */\n\tpublic registerPrinter(config: ILankaLoggerConfig): TLankaLoggerFn {\n\t\tif (isProd()) return noop;\n\n\t\tthis.printers.set(config.key, {\n\t\t\tkey: config.key,\n\t\t\tlayer: config.layer,\n\t\t\tcolor: config.color,\n\t\t\tlevel: config.level ?? \"log\",\n\t\t\tflag: config.flag,\n\t\t\tenabled: config.enabled,\n\t\t});\n\n\t\treturn this.createPrinterFn(config.key);\n\t}\n\n\t/** Updates a printer's config; a no-op when there is no such printer. */\n\tpublic updatePrinter(key: string, patch: Partial<Omit<ILankaLoggerConfig, \"key\">>): void {\n\t\tif (isProd()) return;\n\n\t\tconst existing = this.printers.get(key);\n\t\tif (!existing) return;\n\n\t\t// Every field defended, not two of five: a patch says what to change, and a\n\t\t// key it did not mention — or mentioned as `undefined` — must keep its value.\n\t\tthis.printers.set(key, {\n\t\t\tkey,\n\t\t\tlayer: patch.layer ?? existing.layer,\n\t\t\tcolor: patch.color ?? existing.color,\n\t\t\tlevel: patch.level ?? existing.level,\n\t\t\tflag: patch.flag ?? existing.flag,\n\t\t\tenabled: patch.enabled ?? existing.enabled,\n\t\t});\n\t}\n\n\t/** A printer by key; a silent function when there is none. */\n\tpublic getPrinter(key: string): TLankaLoggerFn {\n\t\tif (isProd()) return noop;\n\t\treturn this.printers.has(key) ? this.createPrinterFn(key) : noop;\n\t}\n\n\t/** The keys of every registered printer. */\n\tpublic listPrinters(): string[] {\n\t\tif (isProd()) return [];\n\t\treturn Array.from(this.printers.keys());\n\t}\n\n\t// ── The path a message takes ─────────────────────────────────────────────\n\n\tprivate isEnabled(): boolean {\n\t\tif (isProd()) return false;\n\n\t\tconst runtimeFlag = this.flags.get(\"ENABLED\");\n\t\tif (runtimeFlag !== undefined) return resolveFlagValue(runtimeFlag);\n\n\t\treturn getLankaFlags().loggerEnabled ?? false;\n\t}\n\n\tprivate isPrinterEnabled(printer: TPrinterInternal): boolean {\n\t\tif (isProd()) return false;\n\t\tif (!this.isEnabled()) return false;\n\t\tif (printer.enabled !== undefined) return resolveFlagValue(printer.enabled);\n\t\tif (printer.flag) return this.isFlagEnabled(printer.flag);\n\n\t\treturn true;\n\t}\n\n\tprivate emit(\n\t\tprinter: TPrinterInternal,\n\t\tmsg: TLankaLogMessage | TLankaLogMessageFactory,\n\t\targs: unknown[],\n\t): void {\n\t\tif (isProd() || !this.isPrinterEnabled(printer)) return;\n\n\t\t// Annotated, not inferred: `TLankaLogMessage` admits `object`, and a\n\t\t// function IS an object, so narrowing this union by `typeof` leaves the\n\t\t// call's result wider than the union it came from.\n\t\tconst message: TLankaLogMessage =\n\t\t\ttypeof msg === \"function\" ? (msg as TLankaLogMessageFactory)() : msg;\n\n\t\tfor (const sink of this.sinks) {\n\t\t\tsink.emit({\n\t\t\t\tlayer: printer.layer,\n\t\t\t\tlevel: printer.level,\n\t\t\t\tstyle: this.style,\n\t\t\t\tcolor: printer.color,\n\t\t\t\tmessage,\n\t\t\t\targs,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * A printer resolved at CALL time, not at registration.\n\t *\n\t * `updatePrinter` has to reach a callable a screen took a reference to long\n\t * before; looking the key up on every call is what makes that true.\n\t */\n\tprivate createPrinterFn(key: string): TLankaLoggerFn {\n\t\tif (isProd()) return noop;\n\n\t\treturn (msg, ...args) => {\n\t\t\tconst printer = this.printers.get(key);\n\t\t\tif (!printer) return;\n\n\t\t\tthis.emit(printer, msg, args);\n\t\t};\n\t}\n}\n\n/**\n * The logger the framework itself writes to, and an application with it.\n *\n * `console` to this file's `Console`: ready before anything is configured, and\n * the one every call site in the framework uses.\n */\nexport const lankaLogger = new LankaLogger();\n"],"mappings":"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","names":[]}
@@ -0,0 +1,13 @@
1
+ import {
2
+ getActiveRuntime
3
+ } from "./chunk-BGVDPDX4.js";
4
+
5
+ // src/config/get-lanka-flags/getLankaFlags.ts
6
+ function getLankaFlags() {
7
+ return getActiveRuntime()?.getFlags() ?? {};
8
+ }
9
+
10
+ export {
11
+ getLankaFlags
12
+ };
13
+ //# sourceMappingURL=chunk-D27MREPB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/get-lanka-flags/getLankaFlags.ts"],"sourcesContent":["import { getActiveRuntime } from \"../../_internal/active-runtime/activeRuntime\";\nimport type { ILankaFlags } from \"../_interfaces/ILankaFlags\";\n\n/**\n * Flags of the active instance — or empty when there is none.\n *\n * A missing instance is NOT an error here, unlike a missing host. Flags are read\n * earliest of all: `LankaLogger` decides from them whether to write at all, and\n * does so before any `createLanka()`. Empty flags mean \"everything off\", which\n * is a correct answer; a missing host has no correct answer.\n *\n * This is the AMBIENT read — for modules and plugins that never see an instance.\n * Whoever holds one asks it: `lanka.getFlags()`.\n */\nexport function getLankaFlags(): ILankaFlags {\n\treturn getActiveRuntime()?.getFlags() ?? {};\n}\n"],"mappings":";;;;;AAcO,SAAS,gBAA6B;AAC5C,SAAO,iBAAiB,GAAG,SAAS,KAAK,CAAC;AAC3C;","names":[]}
@@ -0,0 +1,59 @@
1
+ import {
2
+ requireActiveRuntime
3
+ } from "./chunk-BGVDPDX4.js";
4
+
5
+ // src/locator/_factories/create-lanka-locator-proxy/createLankaLocatorProxy.ts
6
+ function createLankaLocatorProxy(config) {
7
+ const { locator, protectedProperties = [], errorPrefix = "Cannot access" } = config;
8
+ return new Proxy(locator, {
9
+ get(target, prop) {
10
+ if (typeof prop !== "string") {
11
+ throw new Error(`${errorPrefix} with symbol property: ${String(prop)}`);
12
+ }
13
+ const internalProps = ["_", "constructor", "prototype", ...protectedProperties];
14
+ if (prop.startsWith("_") || internalProps.some((internalProp) => prop === internalProp)) {
15
+ throw new Error(`${errorPrefix} with property: ${prop}`);
16
+ }
17
+ return target.get(prop);
18
+ }
19
+ });
20
+ }
21
+
22
+ // src/locator/singleton/_facades/lanka-singletons/lankaSingletons.ts
23
+ var singletonLocator = {
24
+ get: (propertyName) => requireActiveRuntime().locators.singletons.get(propertyName)
25
+ };
26
+ var lankaSingletons = createLankaLocatorProxy({
27
+ locator: singletonLocator,
28
+ protectedProperties: [
29
+ "clearCache",
30
+ "register",
31
+ "registerInstance",
32
+ "unregister",
33
+ "isRegistered"
34
+ ],
35
+ errorPrefix: "Cannot access singleton"
36
+ });
37
+
38
+ // src/locator/shared-store/_facades/lanka-shared-stores/lankaSharedStores.ts
39
+ var sharedStoreLocator = {
40
+ get: (propertyName) => requireActiveRuntime().locators.sharedStores.get(propertyName)
41
+ };
42
+ var lankaSharedStores = createLankaLocatorProxy({
43
+ locator: sharedStoreLocator,
44
+ protectedProperties: [
45
+ "clearCache",
46
+ "register",
47
+ "registerInstance",
48
+ "unregister",
49
+ "isRegistered"
50
+ ],
51
+ errorPrefix: "Cannot access shared store"
52
+ });
53
+
54
+ export {
55
+ createLankaLocatorProxy,
56
+ lankaSingletons,
57
+ lankaSharedStores
58
+ };
59
+ //# sourceMappingURL=chunk-DTO27QFR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/locator/_factories/create-lanka-locator-proxy/createLankaLocatorProxy.ts","../src/locator/singleton/_facades/lanka-singletons/lankaSingletons.ts","../src/locator/shared-store/_facades/lanka-shared-stores/lankaSharedStores.ts"],"sourcesContent":["import type { ILankaLocator } from \"../../_interfaces/ILankaLocator\";\n\n/**\n * Configuration of the global locator proxy.\n */\nexport interface ILankaLocatorProxyConfig<TInstance> {\n\t/** The locator that actually resolves instances. */\n\tlocator: ILankaLocator<TInstance>;\n\t/** Properties whose access must throw. */\n\tprotectedProperties?: string[];\n\t/** Prefix of the message thrown for an unknown property. */\n\terrorPrefix?: string;\n}\n\n/**\n * Creates a Proxy for dynamic access to instances with type safety.\n * Converts camelCase property access to PascalCase instance names.\n *\n * @param config Proxy configuration\n * @returns Proxy object typed as TType\n */\nexport function createLankaLocatorProxy<TInstance, TType extends Record<string, TInstance>>(\n\tconfig: ILankaLocatorProxyConfig<TInstance>,\n): TType {\n\tconst { locator, protectedProperties = [], errorPrefix = \"Cannot access\" } = config;\n\n\treturn new Proxy(locator, {\n\t\tget(target, prop: string | symbol): TInstance {\n\t\t\t// Symbols such as `Symbol.iterator` are not instance names.\n\t\t\tif (typeof prop !== \"string\") {\n\t\t\t\tthrow new Error(`${errorPrefix} with symbol property: ${String(prop)}`);\n\t\t\t}\n\n\t\t\t// Internal properties are rejected.\n\t\t\tconst internalProps = [\"_\", \"constructor\", \"prototype\", ...protectedProperties];\n\n\t\t\tif (\n\t\t\t\tprop.startsWith(\"_\") ||\n\t\t\t\tinternalProps.some((internalProp) => prop === internalProp)\n\t\t\t) {\n\t\t\t\tthrow new Error(`${errorPrefix} with property: ${prop}`);\n\t\t\t}\n\n\t\t\t// The instance for a camelCase property name.\n\t\t\treturn target.get(prop);\n\t\t},\n\t}) as unknown as TType;\n}\n","import { requireActiveRuntime } from \"../../../../_internal/active-runtime/activeRuntime\";\nimport type { ILankaLocator } from \"../../../_interfaces/ILankaLocator\";\nimport type { TLankaSingletons } from \"../../../_types/TLankaSingletons\";\nimport { createLankaLocatorProxy } from \"../../../_factories/create-lanka-locator-proxy/createLankaLocatorProxy\";\nexport { LankaSingletonLocator } from \"../../lanka-singleton-locator/LankaSingletonLocator\";\nexport type { ILankaSingletonLocatorConfig } from \"../../lanka-singleton-locator/LankaSingletonLocator\";\n\n/**\n * Access to every singleton at once.\n *\n * A class appears here by itself as soon as the consumer's barrel exports it.\n * The property is camelCase, the class name PascalCase.\n *\n * ```ts\n * import { lankaSingletons } from \"lanka\";\n *\n * const profile = lankaSingletons.userProfile;\n * ```\n *\n * `LankaSingletonLocator` itself registers a class or a ready object by hand —\n * for tests and for objects that arrive already built. Those methods are NOT\n * called through this proxy: `registerSingleton`,\n * `registerSingletonInstance`, `unregisterSingleton`, `isRegistered` and\n * `clearCache` are closed here deliberately, or reaching for them would read as\n * a request for a singleton by that name and the failure would come from the\n * wrong place.\n */\n/**\n * The locator comes from the active instance rather than being created here.\n *\n * The cache of resolved objects is state, and module-level state means two\n * frameworks in one process resolve the same gateway. The proxy stays in\n * place; what moved is the cache.\n */\nconst singletonLocator: ILankaLocator<unknown> = {\n\tget: (propertyName: string) => requireActiveRuntime().locators.singletons.get(propertyName),\n};\n\nexport const lankaSingletons = createLankaLocatorProxy<unknown, TLankaSingletons>({\n\tlocator: singletonLocator,\n\tprotectedProperties: [\n\t\t\"clearCache\",\n\t\t\"register\",\n\t\t\"registerInstance\",\n\t\t\"unregister\",\n\t\t\"isRegistered\",\n\t],\n\terrorPrefix: \"Cannot access singleton\",\n});\n","import { requireActiveRuntime } from \"../../../../_internal/active-runtime/activeRuntime\";\nimport type { ILankaLocator } from \"../../../_interfaces/ILankaLocator\";\nimport { createLankaLocatorProxy } from \"../../../_factories/create-lanka-locator-proxy/createLankaLocatorProxy\";\nimport { ALankaSharedStore } from \"../../../../viewmodel/_abstractions/lanka-shared-store/ALankaSharedStore\";\nimport type { TLankaSharedStores } from \"../../_types/TLankaSharedStores\";\n\nexport { LankaSharedStoreLocator } from \"../../lanka-shared-store-locator/LankaSharedStoreLocator\";\nexport type { ILankaSharedStoreLocatorConfig } from \"../../lanka-shared-store-locator/LankaSharedStoreLocator\";\n\n/**\n * The locator comes from the active instance rather than being created here.\n *\n * The cache of resolved objects is state, and module-level state would let two\n * frameworks in one process resolve the same store. The proxy stays at module\n * level because it has hundreds of call sites; only the cache moved.\n */\nconst sharedStoreLocator: ILankaLocator<ALankaSharedStore<object>> = {\n\tget: (propertyName: string) => requireActiveRuntime().locators.sharedStores.get(propertyName),\n};\n\n/**\n * Access to every shared store at once.\n *\n * An `ALankaSharedStore` subclass appears here by itself once it is exported from\n * `@lanka_di/SharedStores`. The property is camelCase, the class name PascalCase.\n */\nexport const lankaSharedStores = createLankaLocatorProxy<\n\tALankaSharedStore<object>,\n\tTLankaSharedStores\n>({\n\tlocator: sharedStoreLocator,\n\tprotectedProperties: [\n\t\t\"clearCache\",\n\t\t\"register\",\n\t\t\"registerInstance\",\n\t\t\"unregister\",\n\t\t\"isRegistered\",\n\t],\n\terrorPrefix: \"Cannot access shared store\",\n});\n"],"mappings":";;;;;AAqBO,SAAS,wBACf,QACQ;AACR,QAAM,EAAE,SAAS,sBAAsB,CAAC,GAAG,cAAc,gBAAgB,IAAI;AAE7E,SAAO,IAAI,MAAM,SAAS;AAAA,IACzB,IAAI,QAAQ,MAAkC;AAE7C,UAAI,OAAO,SAAS,UAAU;AAC7B,cAAM,IAAI,MAAM,GAAG,WAAW,0BAA0B,OAAO,IAAI,CAAC,EAAE;AAAA,MACvE;AAGA,YAAM,gBAAgB,CAAC,KAAK,eAAe,aAAa,GAAG,mBAAmB;AAE9E,UACC,KAAK,WAAW,GAAG,KACnB,cAAc,KAAK,CAAC,iBAAiB,SAAS,YAAY,GACzD;AACD,cAAM,IAAI,MAAM,GAAG,WAAW,mBAAmB,IAAI,EAAE;AAAA,MACxD;AAGA,aAAO,OAAO,IAAI,IAAI;AAAA,IACvB;AAAA,EACD,CAAC;AACF;;;ACbA,IAAM,mBAA2C;AAAA,EAChD,KAAK,CAAC,iBAAyB,qBAAqB,EAAE,SAAS,WAAW,IAAI,YAAY;AAC3F;AAEO,IAAM,kBAAkB,wBAAmD;AAAA,EACjF,SAAS;AAAA,EACT,qBAAqB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EACA,aAAa;AACd,CAAC;;;AChCD,IAAM,qBAA+D;AAAA,EACpE,KAAK,CAAC,iBAAyB,qBAAqB,EAAE,SAAS,aAAa,IAAI,YAAY;AAC7F;AAQO,IAAM,oBAAoB,wBAG/B;AAAA,EACD,SAAS;AAAA,EACT,qBAAqB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EACA,aAAa;AACd,CAAC;","names":[]}
@@ -0,0 +1,296 @@
1
+ import {
2
+ lankaLogger
3
+ } from "./chunk-C2HP7CRD.js";
4
+ import {
5
+ requireActiveRuntime
6
+ } from "./chunk-BGVDPDX4.js";
7
+
8
+ // src/scenario/event-bus/_facades/lanka-event-bus/lankaEventBus.ts
9
+ var bus = () => requireActiveRuntime().eventBus;
10
+ var lankaEventBus = Object.freeze({
11
+ enableLogs: () => {
12
+ bus().enableLogs();
13
+ },
14
+ disableLogs: () => {
15
+ bus().disableLogs();
16
+ },
17
+ registerEvent: (eventType, metadata) => {
18
+ bus().registerEvent(eventType, metadata);
19
+ },
20
+ getRegisteredEvents: () => bus().getRegisteredEvents(),
21
+ getEventInfo: (eventType) => bus().getEventInfo(eventType),
22
+ getSubscriptions: (eventType) => bus().getSubscriptions(eventType),
23
+ subscribe: (eventType, callback, options) => bus().subscribe(eventType, callback, options),
24
+ unsubscribe: (eventType, callback) => {
25
+ bus().unsubscribe(eventType, callback);
26
+ },
27
+ dispatch: (eventType, data, usedBy) => {
28
+ bus().dispatch(eventType, data, usedBy);
29
+ },
30
+ addMiddleware: (middleware) => {
31
+ bus().addMiddleware(middleware);
32
+ },
33
+ removeMiddleware: (middleware) => {
34
+ bus().removeMiddleware(middleware);
35
+ },
36
+ getEventLogs: (eventType, limit = 100) => bus().getEventLogs(eventType, limit),
37
+ clearEvent: (eventType) => {
38
+ bus().clearEvent(eventType);
39
+ },
40
+ clearAllEvents: () => {
41
+ bus().clearAllEvents();
42
+ },
43
+ reset: () => {
44
+ bus().reset();
45
+ }
46
+ });
47
+
48
+ // src/scenario/_registries/lanka-scenario-vm-registry/LankaScenarioVMRegistry.ts
49
+ var LankaScenarioVMRegistry = class {
50
+ registeredViewModels = /* @__PURE__ */ new Set();
51
+ /**
52
+ * Public: the registry belongs to a framework instance rather than to the
53
+ * module.
54
+ */
55
+ constructor() {
56
+ }
57
+ /**
58
+ * The active instance's registry, for callers that cannot hold one — the
59
+ * static `LankaScenarioBootstrap`. Instance holders read `lanka.viewModels`.
60
+ */
61
+ static getInstance() {
62
+ return requireActiveRuntime().viewModels;
63
+ }
64
+ /** Whether this ViewModel is already registered. */
65
+ isRegistered(viewModel) {
66
+ return this.registeredViewModels.has(viewModel);
67
+ }
68
+ /**
69
+ * Registers a ViewModel.
70
+ *
71
+ * @returns `false` when it was already registered
72
+ */
73
+ register(viewModel) {
74
+ if (this.registeredViewModels.has(viewModel)) {
75
+ return false;
76
+ }
77
+ this.registeredViewModels.add(viewModel);
78
+ return true;
79
+ }
80
+ /** Removes a ViewModel from the registry. */
81
+ unregister(viewModel) {
82
+ this.registeredViewModels.delete(viewModel);
83
+ }
84
+ /** Every registered ViewModel. */
85
+ getAllViewModels() {
86
+ return Array.from(this.registeredViewModels);
87
+ }
88
+ /**
89
+ * Clears every registered ViewModel. Required by tests.
90
+ */
91
+ clear() {
92
+ this.registeredViewModels.clear();
93
+ }
94
+ /**
95
+ * Unsubscribes every registered ViewModel from its scenarios and clears the
96
+ * registry.
97
+ *
98
+ * Without it tests are not isolated: a subscription leaks from test to test.
99
+ */
100
+ resetAll() {
101
+ this.registeredViewModels.forEach((vm) => {
102
+ try {
103
+ vm.resetScenario();
104
+ } catch {
105
+ }
106
+ });
107
+ this.clear();
108
+ }
109
+ };
110
+
111
+ // src/scenario/_registries/lanka-scenarios-registry/LankaScenariosRegistry.ts
112
+ var LankaScenariosRegistry = class {
113
+ registeredScenarios = /* @__PURE__ */ new Map();
114
+ scenarioMetadata = /* @__PURE__ */ new Map();
115
+ /**
116
+ * Public: the registry belongs to a framework instance rather than to the
117
+ * module.
118
+ */
119
+ constructor() {
120
+ }
121
+ /**
122
+ * The active instance's registry, for callers that cannot hold one:
123
+ * `ALankaScenario` (a base class the consumer extends) and the static
124
+ * `LankaScenarioBootstrap`. Instance holders read `lanka.scenarios`.
125
+ */
126
+ static getInstance() {
127
+ return requireActiveRuntime().scenarios;
128
+ }
129
+ /**
130
+ * Registers a scenario by hand.
131
+ *
132
+ * @param scenario What to register
133
+ * @returns `false` when it was already registered
134
+ */
135
+ register(scenario) {
136
+ if (this.registeredScenarios.has(scenario.name)) {
137
+ return false;
138
+ }
139
+ this.registeredScenarios.set(scenario.name, scenario);
140
+ this.scenarioMetadata.set(scenario.name, {
141
+ scenario,
142
+ name: scenario.name,
143
+ eventType: scenario.eventType,
144
+ dataTypeName: scenario.dataTypeName,
145
+ isRegistered: true
146
+ });
147
+ return true;
148
+ }
149
+ /**
150
+ * Unregister a scenario
151
+ * @param scenarioName Name of the scenario to unregister
152
+ * @returns true if unregistered successfully, false if not found
153
+ */
154
+ unregister(scenarioName) {
155
+ if (!this.registeredScenarios.has(scenarioName)) {
156
+ return false;
157
+ }
158
+ const metadata = this.scenarioMetadata.get(scenarioName);
159
+ if (metadata) {
160
+ metadata.isRegistered = false;
161
+ }
162
+ this.registeredScenarios.delete(scenarioName);
163
+ return true;
164
+ }
165
+ /**
166
+ * Get metadata for a specific scenario
167
+ * @param scenarioName Name of the scenario
168
+ * @returns Scenario metadata or undefined if not found
169
+ */
170
+ getMetadata(scenarioName) {
171
+ return this.scenarioMetadata.get(scenarioName);
172
+ }
173
+ /** Every registered scenario. */
174
+ getAllScenarios() {
175
+ return Array.from(this.registeredScenarios.values());
176
+ }
177
+ /** Metadata of every scenario. */
178
+ getAllMetadata() {
179
+ return Array.from(this.scenarioMetadata.values());
180
+ }
181
+ /** Whether a scenario with this name is registered. */
182
+ isRegistered(scenarioName) {
183
+ return this.registeredScenarios.has(scenarioName);
184
+ }
185
+ /**
186
+ * Collects every scenario that registered itself at construction.
187
+ */
188
+ collectAutoRegisteredScenarios() {
189
+ const autoRegistered = ALankaScenario.getAutoRegisteredScenarios();
190
+ autoRegistered.forEach((scenario) => {
191
+ if (!this.registeredScenarios.has(scenario.name)) {
192
+ this.register(scenario);
193
+ }
194
+ });
195
+ }
196
+ /**
197
+ * A scenario by name.
198
+ *
199
+ * @returns `undefined` when there is none
200
+ */
201
+ getScenarioByName(scenarioName) {
202
+ return this.registeredScenarios.get(scenarioName);
203
+ }
204
+ /** Every registered ViewModel. */
205
+ getAllViewModels() {
206
+ return LankaScenarioVMRegistry.getInstance().getAllViewModels();
207
+ }
208
+ /**
209
+ * Clears every registered scenario. Required by tests.
210
+ */
211
+ clear() {
212
+ this.registeredScenarios.clear();
213
+ this.scenarioMetadata.clear();
214
+ }
215
+ };
216
+
217
+ // src/scenario/_abstractions/lanka-scenario/ALankaScenario.ts
218
+ var ALankaScenario = class _ALankaScenario {
219
+ /** A subclass sets this to opt out of self-registration. */
220
+ static skipAutoRegistration;
221
+ /**
222
+ * The self-registration pool.
223
+ *
224
+ * Class-level deliberately: a registry of DEFINITIONS, not runtime state. The
225
+ * classes come from one barrel and both framework instances must see the same
226
+ * list — splitting it would be divergence, not isolation.
227
+ */
228
+ static autoRegisteredScenarios = /* @__PURE__ */ new Set();
229
+ /** Registers the scenario itself unless the subclass opted out. */
230
+ constructor() {
231
+ const constructor = this.constructor;
232
+ if (!constructor.skipAutoRegistration) {
233
+ _ALankaScenario.autoRegisteredScenarios.add(this);
234
+ }
235
+ }
236
+ /**
237
+ * Every scenario that registered itself.
238
+ *
239
+ * @internal
240
+ */
241
+ static getAutoRegisteredScenarios() {
242
+ return Array.from(_ALankaScenario.autoRegisteredScenarios);
243
+ }
244
+ /**
245
+ * Clears the auto-registration pool. Required by tests.
246
+ * @internal
247
+ */
248
+ static clearAutoRegisteredScenarios() {
249
+ _ALankaScenario.autoRegisteredScenarios.clear();
250
+ }
251
+ /**
252
+ * Registers the scenario by hand.
253
+ *
254
+ * @returns `false` when it was already registered
255
+ */
256
+ register() {
257
+ return LankaScenariosRegistry.getInstance().register(this);
258
+ }
259
+ /**
260
+ * Removes the scenario from the registry.
261
+ *
262
+ * @returns `false` when it was not there
263
+ */
264
+ unregister() {
265
+ return LankaScenariosRegistry.getInstance().unregister(this.name);
266
+ }
267
+ trigger(data) {
268
+ lankaLogger.printScenarioLog("TRIGGER Scenario", this.name, data);
269
+ lankaEventBus.dispatch(this.eventType, data, this.name);
270
+ }
271
+ /**
272
+ * Subscribes a handler and returns an unsubscribe function.
273
+ *
274
+ * Without the return, unsubscribing is possible only by callback identity, and
275
+ * every ViewModel factory has to keep a map of references for it.
276
+ */
277
+ subscribe(callback, options) {
278
+ lankaLogger.printScenarioLog("SUBSCRIBE Scenario", this.name, this.dataTypeName);
279
+ return lankaEventBus.subscribe(this.eventType, callback, {
280
+ ...options,
281
+ usedBy: options?.usedBy ?? this.name
282
+ });
283
+ }
284
+ };
285
+
286
+ // ../tools/testing/_fixtures/.lanka_di/Scenarios.ts
287
+ var Scenarios_exports = {};
288
+
289
+ export {
290
+ lankaEventBus,
291
+ ALankaScenario,
292
+ LankaScenarioVMRegistry,
293
+ LankaScenariosRegistry,
294
+ Scenarios_exports
295
+ };
296
+ //# sourceMappingURL=chunk-EWVDJYCC.js.map