@navios/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 (72) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +145 -0
  3. package/dist/index.d.mts +425 -0
  4. package/dist/index.d.ts +425 -0
  5. package/dist/index.js +1744 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +1657 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +45 -0
  10. package/src/__tests__/controller.spec.mts +59 -0
  11. package/src/attribute.factory.mts +155 -0
  12. package/src/decorators/controller.decorator.mts +36 -0
  13. package/src/decorators/endpoint.decorator.mts +81 -0
  14. package/src/decorators/index.mts +4 -0
  15. package/src/decorators/module.decorator.mts +47 -0
  16. package/src/decorators/use-guards.decorator.mts +43 -0
  17. package/src/exceptions/bad-request.exception.mts +7 -0
  18. package/src/exceptions/conflict.exception.mts +7 -0
  19. package/src/exceptions/forbidden.exception.mts +7 -0
  20. package/src/exceptions/http.exception.mts +7 -0
  21. package/src/exceptions/index.mts +7 -0
  22. package/src/exceptions/internal-server-error.exception.mts +7 -0
  23. package/src/exceptions/not-found.exception.mts +10 -0
  24. package/src/exceptions/unauthorized.exception.mts +7 -0
  25. package/src/index.mts +10 -0
  26. package/src/interfaces/can-activate.mts +5 -0
  27. package/src/interfaces/index.mts +2 -0
  28. package/src/interfaces/navios-module.mts +3 -0
  29. package/src/metadata/controller.metadata.mts +71 -0
  30. package/src/metadata/endpoint.metadata.mts +69 -0
  31. package/src/metadata/index.mts +4 -0
  32. package/src/metadata/injectable.metadata.mts +11 -0
  33. package/src/metadata/module.metadata.mts +62 -0
  34. package/src/navios.application.mts +113 -0
  35. package/src/navios.factory.mts +17 -0
  36. package/src/service-locator/__tests__/injectable.spec.mts +170 -0
  37. package/src/service-locator/decorators/get-injectable-token.mts +23 -0
  38. package/src/service-locator/decorators/index.mts +2 -0
  39. package/src/service-locator/decorators/injectable.decorator.mts +103 -0
  40. package/src/service-locator/enums/index.mts +1 -0
  41. package/src/service-locator/enums/injectable-scope.enum.mts +10 -0
  42. package/src/service-locator/errors/errors.enum.mts +7 -0
  43. package/src/service-locator/errors/factory-not-found.mts +8 -0
  44. package/src/service-locator/errors/index.mts +6 -0
  45. package/src/service-locator/errors/instance-destroying.mts +8 -0
  46. package/src/service-locator/errors/instance-expired.mts +8 -0
  47. package/src/service-locator/errors/instance-not-found.mts +8 -0
  48. package/src/service-locator/errors/unknown-error.mts +15 -0
  49. package/src/service-locator/event-emitter.mts +107 -0
  50. package/src/service-locator/index.mts +14 -0
  51. package/src/service-locator/inject.mts +37 -0
  52. package/src/service-locator/injection-token.mts +36 -0
  53. package/src/service-locator/injector.mts +18 -0
  54. package/src/service-locator/interfaces/factory.interface.mts +3 -0
  55. package/src/service-locator/override.mts +22 -0
  56. package/src/service-locator/proxy-service-locator.mts +80 -0
  57. package/src/service-locator/service-locator-abstract-factory-context.mts +23 -0
  58. package/src/service-locator/service-locator-event-bus.mts +96 -0
  59. package/src/service-locator/service-locator-instance-holder.mts +63 -0
  60. package/src/service-locator/service-locator-manager.mts +89 -0
  61. package/src/service-locator/service-locator.mts +445 -0
  62. package/src/service-locator/sync-injector.mts +55 -0
  63. package/src/services/controller-adapter.service.mts +124 -0
  64. package/src/services/execution-context.mts +53 -0
  65. package/src/services/guard-runner.service.mts +93 -0
  66. package/src/services/index.mts +4 -0
  67. package/src/services/module-loader.service.mts +68 -0
  68. package/src/tokens/application.token.mts +9 -0
  69. package/src/tokens/execution-context.token.mts +8 -0
  70. package/src/tokens/index.mts +4 -0
  71. package/src/tokens/reply.token.mts +7 -0
  72. package/src/tokens/request.token.mts +9 -0
package/dist/index.js ADDED
@@ -0,0 +1,1744 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __knownSymbol = (name2, symbol) => (symbol = Symbol[name2]) ? symbol : Symbol.for("Symbol." + name2);
9
+ var __typeError = (msg) => {
10
+ throw TypeError(msg);
11
+ };
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
14
+ var __export = (target, all) => {
15
+ for (var name2 in all)
16
+ __defProp(target, name2, { get: all[name2], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
27
+ // If the importer is in node compatibility mode or this is not an ESM
28
+ // file that has been converted to a CommonJS file using a Babel-
29
+ // compatible transform (i.e. "__esModule" has not been set), then set
30
+ // "default" to the CommonJS "module.exports" for node compatibility.
31
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
32
+ mod
33
+ ));
34
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
+ var __decoratorStart = (base) => [, , , __create((base == null ? void 0 : base[__knownSymbol("metadata")]) ?? null)];
36
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
37
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
38
+ var __decoratorContext = (kind, name2, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name: name2, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
39
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
40
+ var __runInitializers = (array, flags, self, value) => {
41
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
42
+ return value;
43
+ };
44
+ var __decorateElement = (array, flags, name2, decorators, target, extra) => {
45
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
46
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
47
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
48
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name2]() {
49
+ return __privateGet(this, extra);
50
+ }, set [name2](x) {
51
+ return __privateSet(this, extra, x);
52
+ } }, name2));
53
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name2) : __name(target, name2);
54
+ for (var i = decorators.length - 1; i >= 0; i--) {
55
+ ctx = __decoratorContext(k, name2, done = {}, array[3], extraInitializers);
56
+ if (k) {
57
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name2 in x };
58
+ if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name2];
59
+ if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name2] = y;
60
+ }
61
+ it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
62
+ if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
63
+ else if (typeof it !== "object" || it === null) __typeError("Object expected");
64
+ else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
65
+ }
66
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name2, desc), p ? k ^ 4 ? extra : desc : target;
67
+ };
68
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
69
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
70
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
71
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
72
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
73
+
74
+ // packages/core/src/index.mts
75
+ var src_exports = {};
76
+ __export(src_exports, {
77
+ Application: () => Application,
78
+ AttributeFactory: () => AttributeFactory,
79
+ BadRequestException: () => BadRequestException,
80
+ ConflictException: () => ConflictException,
81
+ Controller: () => Controller,
82
+ ControllerAdapterService: () => ControllerAdapterService,
83
+ ControllerMetadataKey: () => ControllerMetadataKey,
84
+ Endpoint: () => Endpoint,
85
+ EndpointMetadataKey: () => EndpointMetadataKey,
86
+ ErrorsEnum: () => ErrorsEnum,
87
+ EventEmitter: () => EventEmitter,
88
+ ExecutionContext: () => ExecutionContext2,
89
+ ExecutionContextInjectionToken: () => ExecutionContextInjectionToken,
90
+ ExecutionContextToken: () => ExecutionContextToken,
91
+ FactoryNotFound: () => FactoryNotFound,
92
+ ForbiddenException: () => ForbiddenException,
93
+ GuardRunnerService: () => GuardRunnerService,
94
+ HttpException: () => HttpException,
95
+ Injectable: () => Injectable,
96
+ InjectableScope: () => InjectableScope,
97
+ InjectableTokenMeta: () => InjectableTokenMeta,
98
+ InjectableType: () => InjectableType,
99
+ InjectionToken: () => InjectionToken,
100
+ InstanceDestroying: () => InstanceDestroying,
101
+ InstanceExpired: () => InstanceExpired,
102
+ InstanceNotFound: () => InstanceNotFound,
103
+ InternalServerErrorException: () => InternalServerErrorException,
104
+ Module: () => Module,
105
+ ModuleLoaderService: () => ModuleLoaderService,
106
+ ModuleMetadataKey: () => ModuleMetadataKey,
107
+ NaviosApplication: () => NaviosApplication,
108
+ NaviosFactory: () => NaviosFactory,
109
+ NotFoundException: () => NotFoundException,
110
+ Reply: () => Reply,
111
+ Request: () => Request,
112
+ ServiceLocator: () => ServiceLocator,
113
+ ServiceLocatorEventBus: () => ServiceLocatorEventBus,
114
+ ServiceLocatorInstanceHolderKind: () => ServiceLocatorInstanceHolderKind,
115
+ ServiceLocatorInstanceHolderStatus: () => ServiceLocatorInstanceHolderStatus,
116
+ ServiceLocatorManager: () => ServiceLocatorManager,
117
+ UnauthorizedException: () => UnauthorizedException,
118
+ UnknownError: () => UnknownError,
119
+ UseGuards: () => UseGuards,
120
+ extractControllerMetadata: () => extractControllerMetadata,
121
+ extractModuleMetadata: () => extractModuleMetadata,
122
+ getAllEndpointMetadata: () => getAllEndpointMetadata,
123
+ getControllerMetadata: () => getControllerMetadata,
124
+ getEndpointMetadata: () => getEndpointMetadata,
125
+ getInjectableToken: () => getInjectableToken,
126
+ getModuleMetadata: () => getModuleMetadata,
127
+ getServiceLocator: () => getServiceLocator,
128
+ hasControllerMetadata: () => hasControllerMetadata,
129
+ hasModuleMetadata: () => hasModuleMetadata,
130
+ inject: () => inject,
131
+ override: () => override,
132
+ provideServiceLocator: () => provideServiceLocator,
133
+ setPromiseCollector: () => setPromiseCollector,
134
+ syncInject: () => syncInject
135
+ });
136
+ module.exports = __toCommonJS(src_exports);
137
+
138
+ // packages/core/src/metadata/endpoint.metadata.mts
139
+ var EndpointMetadataKey = Symbol("EndpointMetadataKey");
140
+ function getAllEndpointMetadata(context) {
141
+ if (context.metadata) {
142
+ const metadata = context.metadata[EndpointMetadataKey];
143
+ if (metadata) {
144
+ return metadata;
145
+ } else {
146
+ context.metadata[EndpointMetadataKey] = /* @__PURE__ */ new Set();
147
+ return context.metadata[EndpointMetadataKey];
148
+ }
149
+ }
150
+ throw new Error("[Navios] Wrong environment.");
151
+ }
152
+ function getEndpointMetadata(target, context) {
153
+ if (context.metadata) {
154
+ const metadata = getAllEndpointMetadata(context);
155
+ if (metadata) {
156
+ const endpointMetadata = Array.from(metadata).find(
157
+ (item) => item.classMethod === target.name
158
+ );
159
+ if (endpointMetadata) {
160
+ return endpointMetadata;
161
+ } else {
162
+ const newMetadata = {
163
+ classMethod: target.name,
164
+ url: "",
165
+ httpMethod: "GET",
166
+ config: null,
167
+ guards: /* @__PURE__ */ new Set(),
168
+ customAttributes: /* @__PURE__ */ new Map()
169
+ };
170
+ metadata.add(newMetadata);
171
+ return newMetadata;
172
+ }
173
+ }
174
+ }
175
+ throw new Error("[Navios] Wrong environment.");
176
+ }
177
+
178
+ // packages/core/src/metadata/controller.metadata.mts
179
+ var ControllerMetadataKey = Symbol("ControllerMetadataKey");
180
+ function getControllerMetadata(target, context) {
181
+ if (context.metadata) {
182
+ const metadata = context.metadata[ControllerMetadataKey];
183
+ if (metadata) {
184
+ return metadata;
185
+ } else {
186
+ const endpointsMetadata = getAllEndpointMetadata(context);
187
+ const newMetadata = {
188
+ endpoints: endpointsMetadata,
189
+ guards: /* @__PURE__ */ new Set(),
190
+ customAttributes: /* @__PURE__ */ new Map()
191
+ };
192
+ context.metadata[ControllerMetadataKey] = newMetadata;
193
+ target[ControllerMetadataKey] = newMetadata;
194
+ return newMetadata;
195
+ }
196
+ }
197
+ throw new Error("[Navios] Wrong environment.");
198
+ }
199
+ function extractControllerMetadata(target) {
200
+ const metadata = target[ControllerMetadataKey];
201
+ if (!metadata) {
202
+ throw new Error(
203
+ "[Navios] Controller metadata not found. Make sure to use @Controller decorator."
204
+ );
205
+ }
206
+ return metadata;
207
+ }
208
+ function hasControllerMetadata(target) {
209
+ const metadata = target[ControllerMetadataKey];
210
+ return !!metadata;
211
+ }
212
+
213
+ // packages/core/src/metadata/module.metadata.mts
214
+ var ModuleMetadataKey = Symbol("ControllerMetadataKey");
215
+ function getModuleMetadata(target, context) {
216
+ if (context.metadata) {
217
+ const metadata = context.metadata[ModuleMetadataKey];
218
+ if (metadata) {
219
+ return metadata;
220
+ } else {
221
+ const newMetadata = {
222
+ controllers: /* @__PURE__ */ new Set(),
223
+ imports: /* @__PURE__ */ new Set(),
224
+ guards: /* @__PURE__ */ new Set(),
225
+ customAttributes: /* @__PURE__ */ new Map()
226
+ };
227
+ context.metadata[ModuleMetadataKey] = newMetadata;
228
+ target[ModuleMetadataKey] = newMetadata;
229
+ return newMetadata;
230
+ }
231
+ }
232
+ throw new Error("[Navios] Wrong environment.");
233
+ }
234
+ function extractModuleMetadata(target) {
235
+ const metadata = target[ModuleMetadataKey];
236
+ if (!metadata) {
237
+ throw new Error(
238
+ "[Navios] Module metadata not found. Make sure to use @Module decorator."
239
+ );
240
+ }
241
+ return metadata;
242
+ }
243
+ function hasModuleMetadata(target) {
244
+ return !!target[ModuleMetadataKey];
245
+ }
246
+
247
+ // packages/core/src/service-locator/enums/injectable-scope.enum.mts
248
+ var InjectableScope = /* @__PURE__ */ ((InjectableScope2) => {
249
+ InjectableScope2["Singleton"] = "Singleton";
250
+ InjectableScope2["Instance"] = "Instance";
251
+ return InjectableScope2;
252
+ })(InjectableScope || {});
253
+
254
+ // packages/core/src/service-locator/injection-token.mts
255
+ var import_crypto = require("crypto");
256
+ var InjectionToken = class _InjectionToken {
257
+ constructor(name2, schema) {
258
+ this.name = name2;
259
+ this.schema = schema;
260
+ }
261
+ id = (0, import_crypto.randomUUID)();
262
+ static create(name2, schema) {
263
+ return new _InjectionToken(name2, schema);
264
+ }
265
+ toString() {
266
+ return this.name;
267
+ }
268
+ };
269
+
270
+ // packages/core/src/service-locator/errors/errors.enum.mts
271
+ var ErrorsEnum = /* @__PURE__ */ ((ErrorsEnum2) => {
272
+ ErrorsEnum2["InstanceExpired"] = "InstanceExpired";
273
+ ErrorsEnum2["InstanceNotFound"] = "InstanceNotFound";
274
+ ErrorsEnum2["InstanceDestroying"] = "InstanceDestroying";
275
+ ErrorsEnum2["UnknownError"] = "UnknownError";
276
+ ErrorsEnum2["FactoryNotFound"] = "FactoryNotFound";
277
+ return ErrorsEnum2;
278
+ })(ErrorsEnum || {});
279
+
280
+ // packages/core/src/service-locator/errors/factory-not-found.mts
281
+ var FactoryNotFound = class extends Error {
282
+ constructor(name2) {
283
+ super(`Factory ${name2} not found`);
284
+ this.name = name2;
285
+ }
286
+ code = "FactoryNotFound" /* FactoryNotFound */;
287
+ };
288
+
289
+ // packages/core/src/service-locator/errors/instance-destroying.mts
290
+ var InstanceDestroying = class extends Error {
291
+ constructor(name2) {
292
+ super(`Instance ${name2} destroying`);
293
+ this.name = name2;
294
+ }
295
+ code = "InstanceDestroying" /* InstanceDestroying */;
296
+ };
297
+
298
+ // packages/core/src/service-locator/errors/instance-expired.mts
299
+ var InstanceExpired = class extends Error {
300
+ constructor(name2) {
301
+ super(`Instance ${name2} expired`);
302
+ this.name = name2;
303
+ }
304
+ code = "InstanceExpired" /* InstanceExpired */;
305
+ };
306
+
307
+ // packages/core/src/service-locator/errors/instance-not-found.mts
308
+ var InstanceNotFound = class extends Error {
309
+ constructor(name2) {
310
+ super(`Instance ${name2} not found`);
311
+ this.name = name2;
312
+ }
313
+ code = "InstanceNotFound" /* InstanceNotFound */;
314
+ };
315
+
316
+ // packages/core/src/service-locator/errors/unknown-error.mts
317
+ var UnknownError = class extends Error {
318
+ code = "UnknownError" /* UnknownError */;
319
+ parent;
320
+ constructor(message) {
321
+ if (message instanceof Error) {
322
+ super(message.message);
323
+ this.parent = message;
324
+ return;
325
+ }
326
+ super(message);
327
+ }
328
+ };
329
+
330
+ // packages/core/src/service-locator/service-locator-event-bus.mts
331
+ var ServiceLocatorEventBus = class {
332
+ constructor(logger = null) {
333
+ this.logger = logger;
334
+ }
335
+ listeners = /* @__PURE__ */ new Map();
336
+ on(ns, event, listener) {
337
+ var _a;
338
+ (_a = this.logger) == null ? void 0 : _a.debug(`[ServiceLocatorEventBus]#on(): ns:${ns} event:${event}`);
339
+ if (!this.listeners.has(ns)) {
340
+ this.listeners.set(ns, /* @__PURE__ */ new Map());
341
+ }
342
+ const nsEvents = this.listeners.get(ns);
343
+ if (!nsEvents.has(event)) {
344
+ nsEvents.set(event, /* @__PURE__ */ new Set());
345
+ }
346
+ nsEvents.get(event).add(listener);
347
+ return () => {
348
+ var _a2;
349
+ nsEvents.get(event).delete(listener);
350
+ if (((_a2 = nsEvents.get(event)) == null ? void 0 : _a2.size) === 0) {
351
+ nsEvents.delete(event);
352
+ }
353
+ if (nsEvents.size === 0) {
354
+ this.listeners.delete(ns);
355
+ }
356
+ };
357
+ }
358
+ async emit(key, event) {
359
+ var _a, _b, _c;
360
+ if (!this.listeners.has(key)) {
361
+ return;
362
+ }
363
+ const events = this.listeners.get(key);
364
+ const preEvent = `pre:${event}`;
365
+ const postEvent = `post:${event}`;
366
+ (_a = this.logger) == null ? void 0 : _a.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${preEvent}`);
367
+ await Promise.allSettled(
368
+ [...events.get(preEvent) ?? []].map((listener) => listener(preEvent))
369
+ ).then((results) => {
370
+ results.filter((result) => result.status === "rejected").forEach((result) => {
371
+ var _a2;
372
+ (_a2 = this.logger) == null ? void 0 : _a2.warn(
373
+ `[ServiceLocatorEventBus]#emit(): ${key}:${preEvent} rejected with`,
374
+ result.reason
375
+ );
376
+ });
377
+ });
378
+ (_b = this.logger) == null ? void 0 : _b.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${event}`);
379
+ const res = await Promise.allSettled(
380
+ [...events.get(event) ?? []].map((listener) => listener(event))
381
+ ).then((results) => {
382
+ const res2 = results.filter((result) => result.status === "rejected").map((result) => {
383
+ var _a2;
384
+ (_a2 = this.logger) == null ? void 0 : _a2.warn(
385
+ `[ServiceLocatorEventBus]#emit(): ${key}:${event} rejected with`,
386
+ result.reason
387
+ );
388
+ return result;
389
+ });
390
+ if (res2.length > 0) {
391
+ return Promise.reject(res2);
392
+ }
393
+ return results;
394
+ });
395
+ (_c = this.logger) == null ? void 0 : _c.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${postEvent}`);
396
+ await Promise.allSettled(
397
+ [...events.get(postEvent) ?? []].map((listener) => listener(postEvent))
398
+ ).then((results) => {
399
+ results.filter((result) => result.status === "rejected").forEach((result) => {
400
+ var _a2;
401
+ (_a2 = this.logger) == null ? void 0 : _a2.warn(
402
+ `[ServiceLocatorEventBus]#emit(): ${key}:${postEvent} rejected with`,
403
+ result.reason
404
+ );
405
+ });
406
+ });
407
+ return res;
408
+ }
409
+ };
410
+
411
+ // packages/core/src/service-locator/service-locator-instance-holder.mts
412
+ var ServiceLocatorInstanceHolderKind = /* @__PURE__ */ ((ServiceLocatorInstanceHolderKind2) => {
413
+ ServiceLocatorInstanceHolderKind2["Instance"] = "instance";
414
+ ServiceLocatorInstanceHolderKind2["Factory"] = "factory";
415
+ ServiceLocatorInstanceHolderKind2["AbstractFactory"] = "abstractFactory";
416
+ return ServiceLocatorInstanceHolderKind2;
417
+ })(ServiceLocatorInstanceHolderKind || {});
418
+ var ServiceLocatorInstanceHolderStatus = /* @__PURE__ */ ((ServiceLocatorInstanceHolderStatus2) => {
419
+ ServiceLocatorInstanceHolderStatus2["Created"] = "created";
420
+ ServiceLocatorInstanceHolderStatus2["Creating"] = "creating";
421
+ ServiceLocatorInstanceHolderStatus2["Destroying"] = "destroying";
422
+ return ServiceLocatorInstanceHolderStatus2;
423
+ })(ServiceLocatorInstanceHolderStatus || {});
424
+
425
+ // packages/core/src/service-locator/service-locator-manager.mts
426
+ var ServiceLocatorManager = class {
427
+ constructor(logger = null) {
428
+ this.logger = logger;
429
+ }
430
+ instancesHolders = /* @__PURE__ */ new Map();
431
+ get(name2) {
432
+ var _a, _b, _c;
433
+ const holder = this.instancesHolders.get(name2);
434
+ if (holder) {
435
+ if (holder.ttl !== Infinity) {
436
+ const now = Date.now();
437
+ if (now - holder.createdAt > holder.ttl) {
438
+ (_a = this.logger) == null ? void 0 : _a.log(
439
+ `[ServiceLocatorManager]#getInstanceHolder() TTL expired for ${holder.name}`
440
+ );
441
+ return [new InstanceExpired(holder.name), holder];
442
+ }
443
+ } else if (holder.status === "destroying" /* Destroying */) {
444
+ (_b = this.logger) == null ? void 0 : _b.log(
445
+ `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is destroying`
446
+ );
447
+ return [new InstanceDestroying(holder.name), holder];
448
+ }
449
+ return [void 0, holder];
450
+ } else {
451
+ (_c = this.logger) == null ? void 0 : _c.log(
452
+ `[ServiceLocatorManager]#getInstanceHolder() Instance ${name2} not found`
453
+ );
454
+ return [new InstanceNotFound(name2)];
455
+ }
456
+ }
457
+ set(name2, holder) {
458
+ this.instancesHolders.set(name2, holder);
459
+ }
460
+ has(name2) {
461
+ const [error, holder] = this.get(name2);
462
+ if (!error) {
463
+ return [void 0, true];
464
+ }
465
+ if (["InstanceExpired" /* InstanceExpired */, "InstanceDestroying" /* InstanceDestroying */].includes(
466
+ error.code
467
+ )) {
468
+ return [error];
469
+ }
470
+ return [void 0, !!holder];
471
+ }
472
+ delete(name2) {
473
+ return this.instancesHolders.delete(name2);
474
+ }
475
+ filter(predicate) {
476
+ return new Map(
477
+ [...this.instancesHolders].filter(
478
+ ([key, value]) => predicate(value, key)
479
+ )
480
+ );
481
+ }
482
+ };
483
+
484
+ // packages/core/src/service-locator/service-locator.mts
485
+ var ServiceLocator = class {
486
+ constructor(logger = null) {
487
+ this.logger = logger;
488
+ this.eventBus = new ServiceLocatorEventBus(logger);
489
+ this.manager = new ServiceLocatorManager(logger);
490
+ }
491
+ abstractFactories = /* @__PURE__ */ new Map();
492
+ instanceFactories = /* @__PURE__ */ new Map();
493
+ eventBus;
494
+ manager;
495
+ getEventBus() {
496
+ return this.eventBus;
497
+ }
498
+ registerInstance(token, instance) {
499
+ const instanceName = this.getInstanceIdentifier(token, void 0);
500
+ this.manager.set(instanceName, {
501
+ name: instanceName,
502
+ instance,
503
+ status: "created" /* Created */,
504
+ kind: "instance" /* Instance */,
505
+ createdAt: Date.now(),
506
+ ttl: Infinity,
507
+ deps: [],
508
+ destroyListeners: [],
509
+ effects: [],
510
+ destroyPromise: null,
511
+ creationPromise: null
512
+ });
513
+ }
514
+ removeInstance(token) {
515
+ const instanceName = this.getInstanceIdentifier(token, void 0);
516
+ return this.invalidate(instanceName);
517
+ }
518
+ registerAbstractFactory(token, factory, type = "Singleton" /* Singleton */) {
519
+ var _a;
520
+ (_a = this.logger) == null ? void 0 : _a.log(
521
+ `[ServiceLocator]#registerAbstractFactory(): Registering abstract factory for ${name}`
522
+ );
523
+ if (type === "Instance" /* Instance */) {
524
+ this.instanceFactories.set(token, factory);
525
+ this.abstractFactories.delete(token);
526
+ } else {
527
+ this.abstractFactories.set(token, factory);
528
+ this.instanceFactories.delete(token);
529
+ }
530
+ }
531
+ getInstanceIdentifier(token, args) {
532
+ var _a;
533
+ const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
534
+ if (validatedArgs && !validatedArgs.success) {
535
+ (_a = this.logger) == null ? void 0 : _a.error(
536
+ `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
537
+ validatedArgs.error
538
+ );
539
+ throw new UnknownError(validatedArgs.error);
540
+ }
541
+ return this.makeInstanceName(token, validatedArgs);
542
+ }
543
+ async getInstance(token, args) {
544
+ var _a, _b, _c;
545
+ const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
546
+ if (validatedArgs && !validatedArgs.success) {
547
+ (_a = this.logger) == null ? void 0 : _a.error(
548
+ `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
549
+ validatedArgs.error
550
+ );
551
+ return [new UnknownError(validatedArgs.error)];
552
+ }
553
+ const instanceName = this.makeInstanceName(token, validatedArgs);
554
+ const [error, holder] = this.manager.get(instanceName);
555
+ if (!error) {
556
+ if (holder.status === "creating" /* Creating */) {
557
+ return holder.creationPromise;
558
+ } else if (holder.status === "destroying" /* Destroying */) {
559
+ return [new UnknownError("InstanceDestroying" /* InstanceDestroying */)];
560
+ }
561
+ return [void 0, holder.instance];
562
+ }
563
+ switch (error.code) {
564
+ case "InstanceDestroying" /* InstanceDestroying */:
565
+ (_b = this.logger) == null ? void 0 : _b.log(
566
+ `[ServiceLocator]#getInstance() TTL expired for ${holder == null ? void 0 : holder.name}`
567
+ );
568
+ await (holder == null ? void 0 : holder.destroyPromise);
569
+ return this.getInstance(token, args);
570
+ case "InstanceExpired" /* InstanceExpired */:
571
+ (_c = this.logger) == null ? void 0 : _c.log(
572
+ `[ServiceLocator]#getInstance() TTL expired for ${holder == null ? void 0 : holder.name}`
573
+ );
574
+ await this.invalidate(instanceName);
575
+ return this.getInstance(token, args);
576
+ case "InstanceNotFound" /* InstanceNotFound */:
577
+ break;
578
+ default:
579
+ return [error];
580
+ }
581
+ return this.createInstance(instanceName, token, args);
582
+ }
583
+ async getOrThrowInstance(token, args) {
584
+ const [error, instance] = await this.getInstance(token, args);
585
+ if (error) {
586
+ throw error;
587
+ }
588
+ return instance;
589
+ }
590
+ notifyListeners(name2, event = "create") {
591
+ var _a;
592
+ (_a = this.logger) == null ? void 0 : _a.log(
593
+ `[ServiceLocator]#notifyListeners() Notifying listeners for ${name2} with event ${event}`
594
+ );
595
+ return this.eventBus.emit(name2, event);
596
+ }
597
+ async createInstance(instanceName, token, args) {
598
+ var _a;
599
+ (_a = this.logger) == null ? void 0 : _a.log(
600
+ `[ServiceLocator]#createInstance() Creating instance for ${instanceName}`
601
+ );
602
+ if (this.abstractFactories.has(token) || this.instanceFactories.has(token)) {
603
+ return this.createInstanceFromAbstractFactory(instanceName, token, args);
604
+ } else {
605
+ return [new FactoryNotFound(token.name.toString())];
606
+ }
607
+ }
608
+ async createInstanceFromAbstractFactory(instanceName, token, args) {
609
+ var _a;
610
+ (_a = this.logger) == null ? void 0 : _a.log(
611
+ `[ServiceLocator]#createInstanceFromAbstractFactory(): Creating instance for ${instanceName} from abstract factory`
612
+ );
613
+ const ctx = this.createContextForAbstractFactory(instanceName);
614
+ let shouldStore = true;
615
+ let abstractFactory = this.abstractFactories.get(token);
616
+ if (!abstractFactory) {
617
+ abstractFactory = this.instanceFactories.get(token);
618
+ shouldStore = false;
619
+ if (!abstractFactory) {
620
+ return [new FactoryNotFound(token.name.toString())];
621
+ }
622
+ }
623
+ const holder = {
624
+ name: instanceName,
625
+ instance: null,
626
+ status: "creating" /* Creating */,
627
+ kind: "abstractFactory" /* AbstractFactory */,
628
+ // @ts-expect-error TS2322 This is correct type
629
+ creationPromise: abstractFactory(ctx, args).then(async (instance) => {
630
+ var _a2;
631
+ holder.instance = instance;
632
+ holder.status = "created" /* Created */;
633
+ holder.deps = ctx.getDependencies();
634
+ holder.destroyListeners = ctx.getDestroyListeners();
635
+ holder.ttl = ctx.getTtl();
636
+ if (holder.deps.length > 0) {
637
+ (_a2 = this.logger) == null ? void 0 : _a2.log(
638
+ `[ServiceLocator]#createInstanceFromAbstractFactory(): Adding subscriptions for ${instanceName} dependencies for their invalidations: ${holder.deps.join(
639
+ ", "
640
+ )}`
641
+ );
642
+ holder.deps.forEach((dependency) => {
643
+ holder.destroyListeners.push(
644
+ this.eventBus.on(
645
+ dependency,
646
+ "destroy",
647
+ () => this.invalidate(instanceName)
648
+ )
649
+ );
650
+ });
651
+ }
652
+ if (holder.ttl === 0) {
653
+ await this.invalidate(instanceName);
654
+ }
655
+ await this.notifyListeners(instanceName);
656
+ return [void 0, instance];
657
+ }).catch((error) => {
658
+ var _a2;
659
+ (_a2 = this.logger) == null ? void 0 : _a2.error(
660
+ `[ServiceLocator]#createInstanceFromAbstractFactory(): Error creating instance for ${instanceName}`,
661
+ error
662
+ );
663
+ return [new UnknownError(error)];
664
+ }),
665
+ effects: [],
666
+ deps: [],
667
+ destroyListeners: [],
668
+ createdAt: Date.now(),
669
+ ttl: Infinity
670
+ };
671
+ if (shouldStore) {
672
+ this.manager.set(instanceName, holder);
673
+ }
674
+ return holder.creationPromise;
675
+ }
676
+ createContextForAbstractFactory(instanceName) {
677
+ const dependencies = /* @__PURE__ */ new Set();
678
+ const destroyListeners = /* @__PURE__ */ new Set();
679
+ const self = this;
680
+ function invalidate(name2 = instanceName) {
681
+ return self.invalidate(name2);
682
+ }
683
+ function addEffect(listener) {
684
+ destroyListeners.add(listener);
685
+ }
686
+ let ttl = Infinity;
687
+ function setTtl(value) {
688
+ ttl = value;
689
+ }
690
+ function getTtl() {
691
+ return ttl;
692
+ }
693
+ function on(key, event, listener) {
694
+ destroyListeners.add(self.eventBus.on(key, event, listener));
695
+ }
696
+ return {
697
+ // @ts-expect-error This is correct type
698
+ async inject(token, args) {
699
+ let injectionToken = token;
700
+ if (typeof token === "function") {
701
+ injectionToken = getInjectableToken(token);
702
+ }
703
+ if (injectionToken instanceof InjectionToken) {
704
+ const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
705
+ const instanceName2 = self.makeInstanceName(token, validatedArgs);
706
+ dependencies.add(instanceName2);
707
+ return self.getOrThrowInstance(injectionToken, args);
708
+ }
709
+ throw new Error(
710
+ `[ServiceLocator]#inject(): Invalid token type: ${typeof token}. Expected a class or an InjectionToken.`
711
+ );
712
+ },
713
+ invalidate,
714
+ eventBus: self.eventBus,
715
+ on,
716
+ getDependencies: () => Array.from(dependencies),
717
+ addEffect,
718
+ getDestroyListeners: () => Array.from(destroyListeners),
719
+ setTtl,
720
+ getTtl
721
+ };
722
+ }
723
+ getSyncInstance(token, args) {
724
+ var _a;
725
+ const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
726
+ if (validatedArgs && !validatedArgs.success) {
727
+ (_a = this.logger) == null ? void 0 : _a.error(
728
+ `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
729
+ validatedArgs.error
730
+ );
731
+ throw new UnknownError(validatedArgs.error);
732
+ }
733
+ const instanceName = this.makeInstanceName(token, validatedArgs);
734
+ const [error, holder] = this.manager.get(instanceName);
735
+ if (error) {
736
+ return null;
737
+ }
738
+ return holder.instance;
739
+ }
740
+ invalidate(service, round = 1) {
741
+ var _a, _b, _c, _d, _e;
742
+ (_a = this.logger) == null ? void 0 : _a.log(
743
+ `[ServiceLocator]#invalidate(): Starting Invalidating process of ${service}`
744
+ );
745
+ const toInvalidate = this.manager.filter(
746
+ (holder) => holder.name === service || holder.deps.includes(service)
747
+ );
748
+ const promises = [];
749
+ for (const [key, holder] of toInvalidate.entries()) {
750
+ if (holder.status === "destroying" /* Destroying */) {
751
+ (_b = this.logger) == null ? void 0 : _b.trace(
752
+ `[ServiceLocator]#invalidate(): ${key} is already being destroyed`
753
+ );
754
+ promises.push(holder.destroyPromise);
755
+ continue;
756
+ }
757
+ if (holder.status === "creating" /* Creating */) {
758
+ (_c = this.logger) == null ? void 0 : _c.trace(
759
+ `[ServiceLocator]#invalidate(): ${key} is being created, waiting for creation to finish`
760
+ );
761
+ promises.push(
762
+ (_d = holder.creationPromise) == null ? void 0 : _d.then(() => {
763
+ var _a2;
764
+ if (round > 3) {
765
+ (_a2 = this.logger) == null ? void 0 : _a2.error(
766
+ `[ServiceLocator]#invalidate(): ${key} creation is triggering a new invalidation round, but it is still not created`
767
+ );
768
+ return;
769
+ }
770
+ return this.invalidate(key, round + 1);
771
+ })
772
+ );
773
+ continue;
774
+ }
775
+ holder.status = "destroying" /* Destroying */;
776
+ (_e = this.logger) == null ? void 0 : _e.log(
777
+ `[ServiceLocator]#invalidate(): Invalidating ${key} and notifying listeners`
778
+ );
779
+ holder.destroyPromise = Promise.all(
780
+ holder.destroyListeners.map((listener) => listener())
781
+ ).then(async () => {
782
+ this.manager.delete(key);
783
+ await this.notifyListeners(key, "destroy");
784
+ });
785
+ promises.push(holder.destroyPromise);
786
+ }
787
+ return Promise.all(promises);
788
+ }
789
+ async ready() {
790
+ return Promise.all(
791
+ Array.from(this.manager.filter(() => true)).map(([, holder]) => {
792
+ var _a;
793
+ if (holder.status === "creating" /* Creating */) {
794
+ return (_a = holder.creationPromise) == null ? void 0 : _a.then(() => null);
795
+ }
796
+ if (holder.status === "destroying" /* Destroying */) {
797
+ return holder.destroyPromise.then(() => null);
798
+ }
799
+ return Promise.resolve(null);
800
+ })
801
+ ).then(() => null);
802
+ }
803
+ makeInstanceName(token, args) {
804
+ let stringifiedArgs = args ? ":" + JSON.stringify(args).replaceAll(/"/g, "").replaceAll(/:/g, "=").replaceAll(/,/g, "|") : "";
805
+ const { name: name2 } = token;
806
+ if (typeof name2 === "function") {
807
+ const className = name2.name;
808
+ return `${className}(${token.id})${stringifiedArgs}`;
809
+ } else if (typeof name2 === "symbol") {
810
+ return `${name2.toString()}(${token.id})${stringifiedArgs}`;
811
+ } else {
812
+ return `${name2}(${token.id})${stringifiedArgs}`;
813
+ }
814
+ }
815
+ };
816
+
817
+ // packages/core/src/service-locator/injector.mts
818
+ var serviceLocator = new ServiceLocator();
819
+ function provideServiceLocator(locator) {
820
+ const original = serviceLocator;
821
+ serviceLocator = locator;
822
+ return original;
823
+ }
824
+ function getServiceLocator() {
825
+ if (!serviceLocator) {
826
+ throw new Error(
827
+ "[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator."
828
+ );
829
+ }
830
+ return serviceLocator;
831
+ }
832
+
833
+ // packages/core/src/service-locator/proxy-service-locator.mts
834
+ var ProxyServiceLocator = class {
835
+ constructor(serviceLocator2, ctx) {
836
+ this.serviceLocator = serviceLocator2;
837
+ this.ctx = ctx;
838
+ }
839
+ get abstractFactories() {
840
+ return this.serviceLocator["abstractFactories"];
841
+ }
842
+ getEventBus() {
843
+ return this.serviceLocator.getEventBus();
844
+ }
845
+ registerAbstractFactory(token, factory) {
846
+ return this.serviceLocator.registerAbstractFactory(token, factory);
847
+ }
848
+ getInstance(token, args) {
849
+ return this.ctx.inject(token, args).then(
850
+ (instance) => {
851
+ return [void 0, instance];
852
+ },
853
+ (error) => {
854
+ return [error];
855
+ }
856
+ );
857
+ }
858
+ getOrThrowInstance(token, args) {
859
+ return this.ctx.inject(token, args);
860
+ }
861
+ getSyncInstance(token, args) {
862
+ return this.serviceLocator.getSyncInstance(token, args);
863
+ }
864
+ invalidate(service, round) {
865
+ return this.serviceLocator.invalidate(service, round);
866
+ }
867
+ ready() {
868
+ return this.serviceLocator.ready();
869
+ }
870
+ makeInstanceName(token, args) {
871
+ return this.serviceLocator.makeInstanceName(token, args);
872
+ }
873
+ };
874
+ function makeProxyServiceLocator(serviceLocator2, ctx) {
875
+ return new ProxyServiceLocator(serviceLocator2, ctx);
876
+ }
877
+
878
+ // packages/core/src/service-locator/sync-injector.mts
879
+ var promiseCollector = null;
880
+ function syncInject(token, args) {
881
+ if (token.schema) {
882
+ const parsed = token.schema.safeParse(args);
883
+ if (!parsed.success) {
884
+ throw new Error(
885
+ `[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`
886
+ );
887
+ }
888
+ }
889
+ let realToken = token;
890
+ if (!(token instanceof InjectionToken)) {
891
+ realToken = getInjectableToken(token);
892
+ }
893
+ const instance = getServiceLocator().getSyncInstance(realToken, args);
894
+ if (!instance) {
895
+ if (promiseCollector) {
896
+ const promise = getServiceLocator().getInstance(realToken, args);
897
+ promiseCollector(promise);
898
+ } else {
899
+ throw new Error(
900
+ `[ServiceLocator] No instance found for ${realToken.name.toString()}`
901
+ );
902
+ }
903
+ }
904
+ return instance;
905
+ }
906
+ function setPromiseCollector(collector) {
907
+ const original = promiseCollector;
908
+ promiseCollector = collector;
909
+ return original;
910
+ }
911
+
912
+ // packages/core/src/service-locator/decorators/injectable.decorator.mts
913
+ var InjectableType = /* @__PURE__ */ ((InjectableType2) => {
914
+ InjectableType2["Class"] = "Class";
915
+ InjectableType2["Factory"] = "Factory";
916
+ return InjectableType2;
917
+ })(InjectableType || {});
918
+ var InjectableTokenMeta = Symbol("InjectableTokenMeta");
919
+ function Injectable({
920
+ scope = "Singleton" /* Singleton */,
921
+ type = "Class" /* Class */,
922
+ token
923
+ } = {}) {
924
+ return (target, context) => {
925
+ if (context.kind !== "class") {
926
+ throw new Error(
927
+ "[ServiceLocator] @Injectable decorator can only be used on classes."
928
+ );
929
+ }
930
+ let injectableToken = token ?? InjectionToken.create(target);
931
+ const locator = getServiceLocator();
932
+ if (!locator) {
933
+ throw new Error(
934
+ "[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator."
935
+ );
936
+ }
937
+ if (type === "Class" /* Class */) {
938
+ locator.registerAbstractFactory(
939
+ injectableToken,
940
+ async (ctx) => {
941
+ if (scope === "Instance" /* Instance */) {
942
+ ctx.setTtl(0);
943
+ }
944
+ const proxyServiceLocator = makeProxyServiceLocator(
945
+ getServiceLocator(),
946
+ ctx
947
+ );
948
+ const promises = [];
949
+ const promiseCollector2 = (promise) => {
950
+ promises.push(promise);
951
+ };
952
+ const originalPromiseCollector = setPromiseCollector(promiseCollector2);
953
+ const tryInit = () => {
954
+ const original = provideServiceLocator(proxyServiceLocator);
955
+ let result2 = new target();
956
+ provideServiceLocator(original);
957
+ return result2;
958
+ };
959
+ const result = tryInit();
960
+ setPromiseCollector(originalPromiseCollector);
961
+ if (promises.length > 0) {
962
+ await Promise.all(promises);
963
+ return tryInit();
964
+ }
965
+ return result;
966
+ },
967
+ scope
968
+ );
969
+ } else if (type === "Factory" /* Factory */) {
970
+ locator.registerAbstractFactory(
971
+ injectableToken,
972
+ async (ctx, args) => {
973
+ if (scope === "Instance" /* Instance */) {
974
+ ctx.setTtl(0);
975
+ }
976
+ const proxyServiceLocator = makeProxyServiceLocator(
977
+ getServiceLocator(),
978
+ ctx
979
+ );
980
+ const original = provideServiceLocator(proxyServiceLocator);
981
+ const builder = new target();
982
+ if (typeof builder.create !== "function") {
983
+ throw new Error(
984
+ `[ServiceLocator] Factory ${target.name} does not implement the create method.`
985
+ );
986
+ }
987
+ provideServiceLocator(original);
988
+ return builder.create(ctx, args);
989
+ },
990
+ scope
991
+ );
992
+ }
993
+ target[InjectableTokenMeta] = injectableToken;
994
+ return target;
995
+ };
996
+ }
997
+
998
+ // packages/core/src/service-locator/decorators/get-injectable-token.mts
999
+ function getInjectableToken(target) {
1000
+ const token = target[InjectableTokenMeta];
1001
+ if (!token) {
1002
+ throw new Error(
1003
+ `[ServiceLocator] Class ${target.name} is not decorated with @Injectable.`
1004
+ );
1005
+ }
1006
+ return token;
1007
+ }
1008
+
1009
+ // packages/core/src/service-locator/event-emitter.mts
1010
+ var EventEmitter = class {
1011
+ listeners = /* @__PURE__ */ new Map();
1012
+ on(event, listener) {
1013
+ if (!this.listeners.has(event)) {
1014
+ this.listeners.set(event, /* @__PURE__ */ new Set());
1015
+ }
1016
+ this.listeners.get(event).add(listener);
1017
+ return () => {
1018
+ this.off(event, listener);
1019
+ };
1020
+ }
1021
+ off(event, listener) {
1022
+ if (!this.listeners.has(event)) {
1023
+ return;
1024
+ }
1025
+ this.listeners.get(event).delete(listener);
1026
+ if (this.listeners.get(event).size === 0) {
1027
+ this.listeners.delete(event);
1028
+ }
1029
+ }
1030
+ once(event, listener) {
1031
+ const off = this.on(event, (...args) => {
1032
+ off();
1033
+ listener(...args);
1034
+ });
1035
+ return off;
1036
+ }
1037
+ async emit(event, ...args) {
1038
+ if (!this.listeners.has(event)) {
1039
+ return;
1040
+ }
1041
+ return Promise.all(Array.from(this.listeners.get(event)).map((listener) => listener(...args)));
1042
+ }
1043
+ addChannel(ns, event, target) {
1044
+ return this.on(event, (...args) => target.emit(ns, event, ...args));
1045
+ }
1046
+ };
1047
+
1048
+ // packages/core/src/service-locator/inject.mts
1049
+ function inject(token, args) {
1050
+ if (token.schema) {
1051
+ const parsed = token.schema.safeParse(args);
1052
+ if (!parsed.success) {
1053
+ throw new Error(
1054
+ `[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`
1055
+ );
1056
+ }
1057
+ }
1058
+ let realToken = token;
1059
+ if (!(token instanceof InjectionToken)) {
1060
+ realToken = getInjectableToken(token);
1061
+ }
1062
+ return getServiceLocator().getOrThrowInstance(realToken, args);
1063
+ }
1064
+
1065
+ // packages/core/src/service-locator/override.mts
1066
+ function override(token, target) {
1067
+ const serviceLocator2 = getServiceLocator();
1068
+ const originalDefinition = serviceLocator2["abstractFactories"].get(token);
1069
+ serviceLocator2.registerAbstractFactory(token, async (ctx, args) => {
1070
+ const builder = new target();
1071
+ return builder.create(ctx, args);
1072
+ });
1073
+ return () => {
1074
+ if (originalDefinition) {
1075
+ serviceLocator2.registerAbstractFactory(token, originalDefinition);
1076
+ }
1077
+ };
1078
+ }
1079
+
1080
+ // packages/core/src/decorators/controller.decorator.mts
1081
+ function Controller({ guards } = {}) {
1082
+ return function(target, context) {
1083
+ if (context.kind !== "class") {
1084
+ throw new Error(
1085
+ "[Navios] @Controller decorator can only be used on classes."
1086
+ );
1087
+ }
1088
+ const token = InjectionToken.create(target);
1089
+ if (context.metadata) {
1090
+ const controllerMetadata = getControllerMetadata(target, context);
1091
+ if (guards) {
1092
+ for (const guard of Array.from(guards).reverse()) {
1093
+ controllerMetadata.guards.add(guard);
1094
+ }
1095
+ }
1096
+ }
1097
+ return Injectable({
1098
+ token,
1099
+ type: "Class" /* Class */,
1100
+ scope: "Instance" /* Instance */
1101
+ })(target, context);
1102
+ };
1103
+ }
1104
+
1105
+ // packages/core/src/decorators/endpoint.decorator.mts
1106
+ function Endpoint(endpoint) {
1107
+ return (target, context) => {
1108
+ if (typeof target !== "function") {
1109
+ throw new Error(
1110
+ "[Navios] Endpoint decorator can only be used on functions."
1111
+ );
1112
+ }
1113
+ if (context.kind !== "method") {
1114
+ throw new Error(
1115
+ "[Navios] Endpoint decorator can only be used on methods."
1116
+ );
1117
+ }
1118
+ const config = endpoint.config;
1119
+ if (context.metadata) {
1120
+ let endpointMetadata = getEndpointMetadata(target, context);
1121
+ if (endpointMetadata.config && endpointMetadata.config.url) {
1122
+ throw new Error(
1123
+ `[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`
1124
+ );
1125
+ }
1126
+ endpointMetadata.config = config;
1127
+ endpointMetadata.classMethod = target.name;
1128
+ endpointMetadata.httpMethod = config.method;
1129
+ endpointMetadata.url = config.url;
1130
+ }
1131
+ return target;
1132
+ };
1133
+ }
1134
+
1135
+ // packages/core/src/decorators/module.decorator.mts
1136
+ function Module(metadata) {
1137
+ return (target, context) => {
1138
+ if (context.kind !== "class") {
1139
+ throw new Error("[Navios] @Module decorator can only be used on classes.");
1140
+ }
1141
+ const token = InjectionToken.create(target);
1142
+ const moduleMetadata = getModuleMetadata(target, context);
1143
+ if (metadata.controllers) {
1144
+ for (const controller of metadata.controllers) {
1145
+ moduleMetadata.controllers.add(controller);
1146
+ }
1147
+ }
1148
+ if (metadata.imports) {
1149
+ for (const importedModule of metadata.imports) {
1150
+ moduleMetadata.imports.add(importedModule);
1151
+ }
1152
+ }
1153
+ if (metadata.guards) {
1154
+ for (const guard of Array.from(metadata.guards).reverse()) {
1155
+ moduleMetadata.guards.add(guard);
1156
+ }
1157
+ }
1158
+ return Injectable({
1159
+ token,
1160
+ type: "Class" /* Class */,
1161
+ scope: "Singleton" /* Singleton */
1162
+ })(target, context);
1163
+ };
1164
+ }
1165
+
1166
+ // packages/core/src/decorators/use-guards.decorator.mts
1167
+ function UseGuards(...guards) {
1168
+ return function(target, context) {
1169
+ if (context.kind === "class") {
1170
+ const controllerMetadata = getControllerMetadata(
1171
+ target,
1172
+ context
1173
+ );
1174
+ for (const guard of guards.reverse()) {
1175
+ controllerMetadata.guards.add(guard);
1176
+ }
1177
+ } else if (context.kind === "method") {
1178
+ const endpointMetadata = getEndpointMetadata(target, context);
1179
+ for (const guard of guards.reverse()) {
1180
+ endpointMetadata.guards.add(guard);
1181
+ }
1182
+ } else {
1183
+ throw new Error(
1184
+ "[Navios] @UseGuards decorator can only be used on classes or methods."
1185
+ );
1186
+ }
1187
+ return target;
1188
+ };
1189
+ }
1190
+
1191
+ // packages/core/src/exceptions/http.exception.mts
1192
+ var HttpException = class {
1193
+ constructor(statusCode, response, error) {
1194
+ this.statusCode = statusCode;
1195
+ this.response = response;
1196
+ this.error = error;
1197
+ }
1198
+ };
1199
+
1200
+ // packages/core/src/exceptions/bad-request.exception.mts
1201
+ var BadRequestException = class extends HttpException {
1202
+ constructor(message) {
1203
+ super(400, message);
1204
+ }
1205
+ };
1206
+
1207
+ // packages/core/src/exceptions/forbidden.exception.mts
1208
+ var ForbiddenException = class extends HttpException {
1209
+ constructor(message) {
1210
+ super(403, message);
1211
+ }
1212
+ };
1213
+
1214
+ // packages/core/src/exceptions/internal-server-error.exception.mts
1215
+ var InternalServerErrorException = class extends HttpException {
1216
+ constructor(message, error) {
1217
+ super(500, message, error);
1218
+ }
1219
+ };
1220
+
1221
+ // packages/core/src/exceptions/not-found.exception.mts
1222
+ var NotFoundException = class extends HttpException {
1223
+ constructor(response, error) {
1224
+ super(404, response, error);
1225
+ this.response = response;
1226
+ this.error = error;
1227
+ }
1228
+ };
1229
+
1230
+ // packages/core/src/exceptions/unauthorized.exception.mts
1231
+ var UnauthorizedException = class extends HttpException {
1232
+ constructor(message, error) {
1233
+ super(401, message, error);
1234
+ }
1235
+ };
1236
+
1237
+ // packages/core/src/exceptions/conflict.exception.mts
1238
+ var ConflictException = class extends HttpException {
1239
+ constructor(message, error) {
1240
+ super(409, message, error);
1241
+ }
1242
+ };
1243
+
1244
+ // packages/core/src/tokens/application.token.mts
1245
+ var ApplicationInjectionToken = "ApplicationInjectionToken";
1246
+ var Application = InjectionToken.create(
1247
+ ApplicationInjectionToken
1248
+ );
1249
+
1250
+ // packages/core/src/tokens/execution-context.token.mts
1251
+ var ExecutionContextInjectionToken = "ExecutionContextInjectionToken";
1252
+ var ExecutionContextToken = InjectionToken.create(
1253
+ ExecutionContextInjectionToken
1254
+ );
1255
+
1256
+ // packages/core/src/tokens/reply.token.mts
1257
+ var ReplyInjectionToken = "ReplyInjectionToken";
1258
+ var Reply = InjectionToken.create(ReplyInjectionToken);
1259
+
1260
+ // packages/core/src/tokens/request.token.mts
1261
+ var RequestInjectionToken = "RequestInjectionToken";
1262
+ var Request = InjectionToken.create(
1263
+ RequestInjectionToken
1264
+ );
1265
+
1266
+ // packages/core/src/services/execution-context.mts
1267
+ var ExecutionContext2 = class {
1268
+ constructor(module2, controller, handler) {
1269
+ this.module = module2;
1270
+ this.controller = controller;
1271
+ this.handler = handler;
1272
+ }
1273
+ request;
1274
+ reply;
1275
+ getModule() {
1276
+ return this.module;
1277
+ }
1278
+ getController() {
1279
+ return this.controller;
1280
+ }
1281
+ getHandler() {
1282
+ return this.handler;
1283
+ }
1284
+ getRequest() {
1285
+ if (!this.request) {
1286
+ throw new Error(
1287
+ "[Navios] Request is not set. Make sure to set it before using it."
1288
+ );
1289
+ }
1290
+ return this.request;
1291
+ }
1292
+ getReply() {
1293
+ if (!this.reply) {
1294
+ throw new Error(
1295
+ "[Navios] Reply is not set. Make sure to set it before using it."
1296
+ );
1297
+ }
1298
+ return this.reply;
1299
+ }
1300
+ provideRequest(request) {
1301
+ this.request = request;
1302
+ }
1303
+ provideReply(reply) {
1304
+ this.reply = reply;
1305
+ }
1306
+ };
1307
+
1308
+ // packages/core/src/services/guard-runner.service.mts
1309
+ var _GuardRunnerService_decorators, _init;
1310
+ _GuardRunnerService_decorators = [Injectable()];
1311
+ var GuardRunnerService = class {
1312
+ async runGuards(allGuards, executionContext) {
1313
+ let canActivate = true;
1314
+ for (const guard of Array.from(allGuards).reverse()) {
1315
+ const guardInstance = await inject(
1316
+ guard
1317
+ );
1318
+ if (!guardInstance.canActivate) {
1319
+ throw new Error(
1320
+ `[Navios] Guard ${guard.name} does not implement canActivate()`
1321
+ );
1322
+ }
1323
+ try {
1324
+ canActivate = await guardInstance.canActivate(executionContext);
1325
+ if (!canActivate) {
1326
+ break;
1327
+ }
1328
+ } catch (error) {
1329
+ if (error instanceof HttpException) {
1330
+ executionContext.getReply().status(error.statusCode).send(error.response);
1331
+ return false;
1332
+ } else {
1333
+ executionContext.getReply().status(500).send({
1334
+ message: "Internal server error",
1335
+ error: error.message
1336
+ });
1337
+ return false;
1338
+ }
1339
+ }
1340
+ }
1341
+ if (!canActivate) {
1342
+ executionContext.getReply().status(403).send({
1343
+ message: "Forbidden"
1344
+ });
1345
+ return false;
1346
+ }
1347
+ return canActivate;
1348
+ }
1349
+ makeContext(executionContext) {
1350
+ const guards = /* @__PURE__ */ new Set();
1351
+ const endpointGuards = executionContext.getHandler().guards;
1352
+ const controllerGuards = executionContext.getController().guards;
1353
+ const moduleGuards = executionContext.getModule().guards;
1354
+ if (endpointGuards.size > 0) {
1355
+ for (const guard of endpointGuards) {
1356
+ guards.add(guard);
1357
+ }
1358
+ }
1359
+ if (controllerGuards.size > 0) {
1360
+ for (const guard of controllerGuards) {
1361
+ guards.add(guard);
1362
+ }
1363
+ }
1364
+ if (moduleGuards.size > 0) {
1365
+ for (const guard of moduleGuards) {
1366
+ guards.add(guard);
1367
+ }
1368
+ }
1369
+ return guards;
1370
+ }
1371
+ };
1372
+ _init = __decoratorStart(null);
1373
+ GuardRunnerService = __decorateElement(_init, 0, "GuardRunnerService", _GuardRunnerService_decorators, GuardRunnerService);
1374
+ __runInitializers(_init, 1, GuardRunnerService);
1375
+
1376
+ // packages/core/src/services/controller-adapter.service.mts
1377
+ var _ControllerAdapterService_decorators, _init2;
1378
+ _ControllerAdapterService_decorators = [Injectable()];
1379
+ var ControllerAdapterService = class {
1380
+ guardRunner = syncInject(GuardRunnerService);
1381
+ setupController(controller, instance, moduleMetadata) {
1382
+ const controllerMetadata = extractControllerMetadata(controller);
1383
+ for (const endpoint of controllerMetadata.endpoints) {
1384
+ const { classMethod, url, httpMethod, config } = endpoint;
1385
+ if (!url || !config) {
1386
+ throw new Error(
1387
+ `[Navios] Malformed Endpoint ${controller.name}:${classMethod}`
1388
+ );
1389
+ }
1390
+ const executionContext = new ExecutionContext2(
1391
+ moduleMetadata,
1392
+ controllerMetadata,
1393
+ endpoint
1394
+ );
1395
+ const guards = this.guardRunner.makeContext(executionContext);
1396
+ const { querySchema, requestSchema, responseSchema } = config;
1397
+ const schema = {};
1398
+ if (querySchema) {
1399
+ schema.querystring = querySchema;
1400
+ }
1401
+ if (requestSchema) {
1402
+ schema.body = requestSchema;
1403
+ }
1404
+ if (responseSchema) {
1405
+ schema.response = {
1406
+ 200: responseSchema
1407
+ };
1408
+ }
1409
+ instance.withTypeProvider().route({
1410
+ method: httpMethod,
1411
+ url: url.replaceAll("$", ":"),
1412
+ schema,
1413
+ preHandler: async (request, reply) => {
1414
+ if (guards.size > 0) {
1415
+ getServiceLocator().registerInstance(Request, request);
1416
+ getServiceLocator().registerInstance(Reply, reply);
1417
+ getServiceLocator().registerInstance(
1418
+ ExecutionContextToken,
1419
+ executionContext
1420
+ );
1421
+ executionContext.provideRequest(request);
1422
+ executionContext.provideReply(reply);
1423
+ const canActivate = await this.guardRunner.runGuards(
1424
+ guards,
1425
+ executionContext
1426
+ );
1427
+ getServiceLocator().removeInstance(Request);
1428
+ getServiceLocator().removeInstance(Reply);
1429
+ getServiceLocator().removeInstance(ExecutionContextToken);
1430
+ if (!canActivate) {
1431
+ return reply;
1432
+ }
1433
+ }
1434
+ },
1435
+ handler: async (request, reply) => {
1436
+ getServiceLocator().registerInstance(Request, request);
1437
+ getServiceLocator().registerInstance(Reply, reply);
1438
+ getServiceLocator().registerInstance(
1439
+ ExecutionContextToken,
1440
+ executionContext
1441
+ );
1442
+ executionContext.provideRequest(request);
1443
+ executionContext.provideReply(reply);
1444
+ const controllerInstance = await inject(controller);
1445
+ try {
1446
+ const { query, params, body } = request;
1447
+ const argument = {};
1448
+ if (query && Object.keys(query).length > 0) {
1449
+ argument.params = query;
1450
+ }
1451
+ if (params && Object.keys(params).length > 0) {
1452
+ argument.urlParams = params;
1453
+ }
1454
+ if (body) {
1455
+ argument.data = body;
1456
+ }
1457
+ const result = await controllerInstance[classMethod](argument);
1458
+ reply.status(200).send(result);
1459
+ } catch (error) {
1460
+ if (error instanceof HttpException) {
1461
+ reply.status(error.statusCode).send(error.response);
1462
+ } else {
1463
+ reply.status(500).send({
1464
+ message: "Internal server error",
1465
+ error: error.message
1466
+ });
1467
+ }
1468
+ } finally {
1469
+ getServiceLocator().removeInstance(Request);
1470
+ getServiceLocator().removeInstance(Reply);
1471
+ getServiceLocator().removeInstance(ExecutionContextToken);
1472
+ }
1473
+ }
1474
+ });
1475
+ }
1476
+ }
1477
+ };
1478
+ _init2 = __decoratorStart(null);
1479
+ ControllerAdapterService = __decorateElement(_init2, 0, "ControllerAdapterService", _ControllerAdapterService_decorators, ControllerAdapterService);
1480
+ __runInitializers(_init2, 1, ControllerAdapterService);
1481
+
1482
+ // packages/core/src/services/module-loader.service.mts
1483
+ var _ModuleLoaderService_decorators, _init3;
1484
+ _ModuleLoaderService_decorators = [Injectable()];
1485
+ var ModuleLoaderService = class {
1486
+ modulesMetadata = /* @__PURE__ */ new Map();
1487
+ loadedModules = /* @__PURE__ */ new Map();
1488
+ initialized = false;
1489
+ async loadModules(appModule) {
1490
+ if (this.initialized) {
1491
+ return;
1492
+ }
1493
+ await this.traverseModules(appModule);
1494
+ this.initialized = true;
1495
+ }
1496
+ async traverseModules(module2, parentMetadata) {
1497
+ const metadata = extractModuleMetadata(module2);
1498
+ if (parentMetadata) {
1499
+ this.mergeMetadata(metadata, parentMetadata);
1500
+ }
1501
+ const moduleName = module2.name;
1502
+ if (this.modulesMetadata.has(moduleName)) {
1503
+ return;
1504
+ }
1505
+ this.modulesMetadata.set(moduleName, metadata);
1506
+ const imports = metadata.imports ?? /* @__PURE__ */ new Set();
1507
+ const loadingPromises = Array.from(imports).map(
1508
+ async (importedModule) => this.traverseModules(importedModule, metadata)
1509
+ );
1510
+ await Promise.all(loadingPromises);
1511
+ const instance = await inject(module2);
1512
+ if (instance.onModuleInit) {
1513
+ await instance.onModuleInit();
1514
+ }
1515
+ this.loadedModules.set(moduleName, instance);
1516
+ }
1517
+ mergeMetadata(metadata, parentMetadata) {
1518
+ if (parentMetadata.guards) {
1519
+ for (const guard of parentMetadata.guards) {
1520
+ metadata.guards.add(guard);
1521
+ }
1522
+ }
1523
+ if (parentMetadata.customAttributes) {
1524
+ for (const [key, value] of parentMetadata.customAttributes) {
1525
+ if (metadata.customAttributes.has(key)) {
1526
+ continue;
1527
+ }
1528
+ metadata.customAttributes.set(key, value);
1529
+ }
1530
+ }
1531
+ }
1532
+ getAllModules() {
1533
+ return this.modulesMetadata;
1534
+ }
1535
+ };
1536
+ _init3 = __decoratorStart(null);
1537
+ ModuleLoaderService = __decorateElement(_init3, 0, "ModuleLoaderService", _ModuleLoaderService_decorators, ModuleLoaderService);
1538
+ __runInitializers(_init3, 1, ModuleLoaderService);
1539
+
1540
+ // packages/core/src/attribute.factory.mts
1541
+ var AttributeFactory = class {
1542
+ static createAttribute(token, schema) {
1543
+ const res = (value) => (target, context) => {
1544
+ if (context.kind !== "class" && context.kind !== "method") {
1545
+ throw new Error(
1546
+ "[Navios] Attribute can only be applied to classes or methods"
1547
+ );
1548
+ }
1549
+ const isController = context.kind === "class" && hasControllerMetadata(target);
1550
+ const isModule = context.kind === "class" && hasModuleMetadata(target);
1551
+ if (context.kind === "class" && !isController && !isModule) {
1552
+ throw new Error(
1553
+ "[Navios] Attribute can only be applied to classes with @Controller or @Module decorators"
1554
+ );
1555
+ }
1556
+ let metadata = context.kind === "class" ? isController ? getControllerMetadata(target, context) : getModuleMetadata(target, context) : getEndpointMetadata(target, context);
1557
+ if (schema) {
1558
+ const validatedValue = schema.safeParse(value);
1559
+ if (!validatedValue.success) {
1560
+ throw new Error(
1561
+ `[Navios] Invalid value for attribute ${token.toString()}: ${validatedValue.error}`
1562
+ );
1563
+ }
1564
+ metadata.customAttributes.set(token, validatedValue.data);
1565
+ } else {
1566
+ metadata.customAttributes.set(token, true);
1567
+ }
1568
+ return target;
1569
+ };
1570
+ res.token = token;
1571
+ if (schema) {
1572
+ res.schema = schema;
1573
+ }
1574
+ return res;
1575
+ }
1576
+ static get(attribute, target) {
1577
+ return target.customAttributes.get(attribute.token) ?? null;
1578
+ }
1579
+ static getAll(attribute, target) {
1580
+ const values = Array.from(target.customAttributes.entries()).filter(([key]) => key === attribute.token).map(([, value]) => value);
1581
+ return values.length > 0 ? values : null;
1582
+ }
1583
+ static getLast(attribute, target) {
1584
+ for (let i = target.length - 1; i >= 0; i--) {
1585
+ const value = target[i].customAttributes.get(attribute.token);
1586
+ if (value) {
1587
+ return value;
1588
+ }
1589
+ }
1590
+ return null;
1591
+ }
1592
+ static has(attribute, target) {
1593
+ return target.customAttributes.has(attribute.token);
1594
+ }
1595
+ };
1596
+
1597
+ // packages/core/src/navios.application.mts
1598
+ var import_cors = __toESM(require("@fastify/cors"), 1);
1599
+ var import_fastify = require("fastify");
1600
+ var import_fastify_type_provider_zod = require("fastify-type-provider-zod");
1601
+ var _NaviosApplication_decorators, _init4;
1602
+ _NaviosApplication_decorators = [Injectable()];
1603
+ var NaviosApplication = class {
1604
+ moduleLoader = syncInject(ModuleLoaderService);
1605
+ controllerAdapter = syncInject(ControllerAdapterService);
1606
+ server = null;
1607
+ corsOptions = null;
1608
+ globalPrefix = null;
1609
+ appModule = null;
1610
+ options = {};
1611
+ setup(appModule, options = {}) {
1612
+ this.appModule = appModule;
1613
+ this.options = options;
1614
+ }
1615
+ async init() {
1616
+ if (!this.appModule) {
1617
+ throw new Error("App module is not set. Call setAppModule() first.");
1618
+ }
1619
+ await this.moduleLoader.loadModules(this.appModule);
1620
+ this.server = (0, import_fastify.fastify)(this.options);
1621
+ getServiceLocator().registerInstance(Application, this.server);
1622
+ this.server.setValidatorCompiler(import_fastify_type_provider_zod.validatorCompiler);
1623
+ this.server.setSerializerCompiler(import_fastify_type_provider_zod.serializerCompiler);
1624
+ if (this.corsOptions) {
1625
+ await this.server.register(import_cors.default, this.corsOptions);
1626
+ }
1627
+ const modules = this.moduleLoader.getAllModules();
1628
+ const globalPrefix = this.globalPrefix ?? "";
1629
+ for (const [moduleName, moduleMetadata] of modules) {
1630
+ if (!moduleMetadata.controllers || moduleMetadata.controllers.size === 0) {
1631
+ continue;
1632
+ }
1633
+ this.server.register(
1634
+ (instance, opts, done) => {
1635
+ for (const controller of moduleMetadata.controllers) {
1636
+ this.controllerAdapter.setupController(
1637
+ controller,
1638
+ instance,
1639
+ moduleMetadata
1640
+ );
1641
+ }
1642
+ done();
1643
+ },
1644
+ {
1645
+ prefix: globalPrefix
1646
+ }
1647
+ );
1648
+ }
1649
+ }
1650
+ enableCors(options) {
1651
+ var _a;
1652
+ this.corsOptions = options;
1653
+ (_a = this.server) == null ? void 0 : _a.register;
1654
+ }
1655
+ setGlobalPrefix(prefix) {
1656
+ this.globalPrefix = prefix;
1657
+ }
1658
+ getServer() {
1659
+ if (!this.server) {
1660
+ throw new Error("Server is not initialized. Call init() first.");
1661
+ }
1662
+ return this.server;
1663
+ }
1664
+ async listen(options) {
1665
+ if (!this.server) {
1666
+ throw new Error("Server is not initialized. Call init() first.");
1667
+ }
1668
+ await this.server.listen(options);
1669
+ }
1670
+ };
1671
+ _init4 = __decoratorStart(null);
1672
+ NaviosApplication = __decorateElement(_init4, 0, "NaviosApplication", _NaviosApplication_decorators, NaviosApplication);
1673
+ __runInitializers(_init4, 1, NaviosApplication);
1674
+
1675
+ // packages/core/src/navios.factory.mts
1676
+ var NaviosFactory = class {
1677
+ static async create(appModule, options = {}) {
1678
+ const app = await inject(NaviosApplication);
1679
+ app.setup(appModule, options);
1680
+ return app;
1681
+ }
1682
+ };
1683
+ // Annotate the CommonJS export names for ESM import in node:
1684
+ 0 && (module.exports = {
1685
+ Application,
1686
+ AttributeFactory,
1687
+ BadRequestException,
1688
+ ConflictException,
1689
+ Controller,
1690
+ ControllerAdapterService,
1691
+ ControllerMetadataKey,
1692
+ Endpoint,
1693
+ EndpointMetadataKey,
1694
+ ErrorsEnum,
1695
+ EventEmitter,
1696
+ ExecutionContext,
1697
+ ExecutionContextInjectionToken,
1698
+ ExecutionContextToken,
1699
+ FactoryNotFound,
1700
+ ForbiddenException,
1701
+ GuardRunnerService,
1702
+ HttpException,
1703
+ Injectable,
1704
+ InjectableScope,
1705
+ InjectableTokenMeta,
1706
+ InjectableType,
1707
+ InjectionToken,
1708
+ InstanceDestroying,
1709
+ InstanceExpired,
1710
+ InstanceNotFound,
1711
+ InternalServerErrorException,
1712
+ Module,
1713
+ ModuleLoaderService,
1714
+ ModuleMetadataKey,
1715
+ NaviosApplication,
1716
+ NaviosFactory,
1717
+ NotFoundException,
1718
+ Reply,
1719
+ Request,
1720
+ ServiceLocator,
1721
+ ServiceLocatorEventBus,
1722
+ ServiceLocatorInstanceHolderKind,
1723
+ ServiceLocatorInstanceHolderStatus,
1724
+ ServiceLocatorManager,
1725
+ UnauthorizedException,
1726
+ UnknownError,
1727
+ UseGuards,
1728
+ extractControllerMetadata,
1729
+ extractModuleMetadata,
1730
+ getAllEndpointMetadata,
1731
+ getControllerMetadata,
1732
+ getEndpointMetadata,
1733
+ getInjectableToken,
1734
+ getModuleMetadata,
1735
+ getServiceLocator,
1736
+ hasControllerMetadata,
1737
+ hasModuleMetadata,
1738
+ inject,
1739
+ override,
1740
+ provideServiceLocator,
1741
+ setPromiseCollector,
1742
+ syncInject
1743
+ });
1744
+ //# sourceMappingURL=index.js.map