@kithinji/orca 1.0.26 → 1.0.29

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 (52) hide show
  1. package/dist/browser/index.iife.js +429 -714
  2. package/dist/browser/index.iife.js.map +4 -4
  3. package/dist/browser/index.mjs +1272 -750
  4. package/dist/browser/index.mjs.map +4 -4
  5. package/dist/node/index.cjs +563 -676
  6. package/dist/node/index.cjs.map +4 -4
  7. package/dist/node/index.mjs +543 -647
  8. package/dist/node/index.mjs.map +4 -4
  9. package/dist/types/browser/factory.d.ts +1 -1
  10. package/dist/types/browser/factory.d.ts.map +1 -1
  11. package/dist/types/browser/modules/router_module/navigate.d.ts +13 -5
  12. package/dist/types/browser/modules/router_module/navigate.d.ts.map +1 -1
  13. package/dist/types/browser/modules/router_module/outlet.d.ts +3 -2
  14. package/dist/types/browser/modules/router_module/outlet.d.ts.map +1 -1
  15. package/dist/types/index.browser.d.ts +0 -2
  16. package/dist/types/index.browser.d.ts.map +1 -1
  17. package/dist/types/index.node.d.ts +0 -2
  18. package/dist/types/index.node.d.ts.map +1 -1
  19. package/dist/types/node/factory.d.ts +1 -0
  20. package/dist/types/node/factory.d.ts.map +1 -1
  21. package/dist/types/shared/decorators.d.ts +13 -1
  22. package/dist/types/shared/decorators.d.ts.map +1 -1
  23. package/dist/types/shared/dom/osc.d.ts.map +1 -1
  24. package/dist/types/shared/index.d.ts +0 -2
  25. package/dist/types/shared/index.d.ts.map +1 -1
  26. package/dist/types/shared/jsx/types.d.ts +3 -0
  27. package/dist/types/shared/jsx/types.d.ts.map +1 -1
  28. package/dist/types/shared/module/compiler.d.ts +3 -0
  29. package/dist/types/shared/module/compiler.d.ts.map +1 -1
  30. package/dist/types/shared/module/injector.d.ts +8 -1
  31. package/dist/types/shared/module/injector.d.ts.map +1 -1
  32. package/dist/types/shared/module_libs/http_client/module.d.ts +1 -1
  33. package/dist/types/shared/module_libs/http_client/module.d.ts.map +1 -1
  34. package/dist/types/shared/signal/index.d.ts +1 -0
  35. package/dist/types/shared/signal/index.d.ts.map +1 -1
  36. package/dist/types/shared/signal/utils.d.ts +4 -0
  37. package/dist/types/shared/signal/utils.d.ts.map +1 -0
  38. package/dist/types/shared/symbols.d.ts +3 -0
  39. package/dist/types/shared/symbols.d.ts.map +1 -1
  40. package/dist/types/shared/types.d.ts +40 -4
  41. package/dist/types/shared/types.d.ts.map +1 -1
  42. package/package.json +3 -1
  43. package/dist/types/shared/macros/index.d.ts +0 -2
  44. package/dist/types/shared/macros/index.d.ts.map +0 -1
  45. package/dist/types/shared/observable/bsubject.d.ts +0 -11
  46. package/dist/types/shared/observable/bsubject.d.ts.map +0 -1
  47. package/dist/types/shared/observable/index.d.ts +0 -4
  48. package/dist/types/shared/observable/index.d.ts.map +0 -1
  49. package/dist/types/shared/observable/observable.d.ts +0 -39
  50. package/dist/types/shared/observable/observable.d.ts.map +0 -1
  51. package/dist/types/shared/observable/subject.d.ts +0 -15
  52. package/dist/types/shared/observable/subject.d.ts.map +0 -1
@@ -9,11 +9,11 @@ var __export = (target, all) => {
9
9
  for (var name in all)
10
10
  __defProp(target, name, { get: all[name], enumerable: true });
11
11
  };
12
- var __copyProps = (to, from2, except, desc) => {
13
- if (from2 && typeof from2 === "object" || typeof from2 === "function") {
14
- for (let key of __getOwnPropNames(from2))
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
15
  if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable });
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
17
  }
18
18
  return to;
19
19
  };
@@ -34,7 +34,6 @@ __export(index_node_exports, {
34
34
  ActorModule: () => ActorModule,
35
35
  BOOTSTRAP: () => BOOTSTRAP,
36
36
  BOOTSTRAP_VNODE: () => BOOTSTRAP_VNODE,
37
- BehaviorSubject: () => BehaviorSubject,
38
37
  Body: () => Body,
39
38
  COMPONENT: () => COMPONENT,
40
39
  COMPONENT_DEPS: () => COMPONENT_DEPS,
@@ -53,6 +52,7 @@ __export(index_node_exports, {
53
52
  EXPORTS_KEY: () => EXPORTS_KEY,
54
53
  EXPRESS_ADAPTER_HOST: () => EXPRESS_ADAPTER_HOST,
55
54
  Fragment: () => Fragment,
55
+ GUARDS_KEY: () => GUARDS_KEY,
56
56
  Get: () => Get,
57
57
  HTTP_METHOD_KEY: () => HTTP_METHOD_KEY,
58
58
  HandlerParamType: () => HandlerParamType,
@@ -62,6 +62,7 @@ __export(index_node_exports, {
62
62
  IMPORTS_KEY: () => IMPORTS_KEY,
63
63
  INJECTABLE: () => INJECTABLE,
64
64
  INJECT_TOKENS_KEY: () => INJECT_TOKENS_KEY,
65
+ INTERCEPTORS_KEY: () => INTERCEPTORS_KEY,
65
66
  Inject: () => Inject,
66
67
  Injectable: () => Injectable,
67
68
  Injector: () => Injector,
@@ -74,7 +75,6 @@ __export(index_node_exports, {
74
75
  ORCA_ELEMENT_TYPE: () => ORCA_ELEMENT_TYPE,
75
76
  ORCA_FRAGMENT_TYPE: () => ORCA_FRAGMENT_TYPE,
76
77
  OSC: () => OSC,
77
- Observable: () => Observable,
78
78
  OrcaComponent: () => OrcaComponent,
79
79
  PARAMS_META_KEY: () => PARAMS_META_KEY,
80
80
  PATH_KEY: () => PATH_KEY,
@@ -84,56 +84,47 @@ __export(index_node_exports, {
84
84
  Post: () => Post,
85
85
  ProviderNormalizer: () => ProviderNormalizer,
86
86
  Query: () => Query,
87
+ REQUEST_CONTEXT: () => REQUEST_CONTEXT,
88
+ Req: () => Req,
89
+ Res: () => Res,
87
90
  RouterModule: () => RouterModule,
88
91
  SIGNATURE_METADATA_KEY: () => SIGNATURE_METADATA_KEY,
89
92
  SSE_ROUTE: () => SSE_ROUTE,
90
93
  ServeStaticModule: () => ServeStaticModule,
94
+ SetMetadata: () => SetMetadata,
95
+ Shared: () => Shared,
91
96
  Signature: () => Signature,
92
97
  Sse: () => Sse,
93
- Subject: () => Subject,
94
98
  Subscribe: () => Subscribe,
95
- assert$: () => assert$,
99
+ UploadedFile: () => UploadedFile,
100
+ UploadedFiles: () => UploadedFiles,
101
+ UseGuards: () => UseGuards,
102
+ UseInterceptors: () => UseInterceptors,
103
+ applyDecorators: () => applyDecorators,
96
104
  batch: () => batch,
97
- catchError: () => catchError,
98
105
  collectAllProvidersFromNode: () => collectAllProvidersFromNode,
99
106
  computed: () => computed,
100
- concatMap: () => concatMap,
101
107
  createRoot: () => createRoot,
102
- debounceTime: () => debounceTime,
103
- distinctUntilChanged: () => distinctUntilChanged,
104
108
  effect: () => effect,
105
- filter: () => filter,
106
- from: () => from,
107
109
  getCurrentInjector: () => getCurrentInjector,
110
+ getGuards: () => getGuards,
111
+ getInterceptors: () => getInterceptors,
108
112
  getSignatureMetadata: () => getSignatureMetadata,
109
113
  hasSignature: () => hasSignature,
110
- interval: () => interval,
111
114
  isClassComponent: () => isClassComponent,
112
115
  isFragment: () => isFragment,
113
116
  isIntrinsicElement: () => isIntrinsicElement,
114
- isObservable: () => isObservable,
115
117
  isSignal: () => isSignal,
116
118
  jsx: () => jsx,
117
119
  jsxs: () => jsxs,
118
- map: () => map,
119
- mergeMap: () => mergeMap,
120
+ mixin: () => mixin,
120
121
  node: () => node_exports,
121
- observable: () => observable,
122
- of: () => of,
123
122
  parseSignatureSchemas: () => parseSignatureSchemas,
124
- reduce: () => reduce,
125
- scan: () => scan,
126
123
  setCurrentInjector: () => setCurrentInjector,
127
124
  shared: () => shared_exports,
128
125
  signal: () => signal,
129
- skip: () => skip,
130
- startWith: () => startWith,
131
- switchMap: () => switchMap,
132
126
  symbolValueReplacer: () => symbolValueReplacer,
133
127
  symbolValueReviver: () => symbolValueReviver,
134
- take: () => take,
135
- tap: () => tap,
136
- throttleTime: () => throttleTime,
137
128
  toSignal: () => toSignal,
138
129
  untracked: () => untracked
139
130
  });
@@ -146,7 +137,6 @@ __export(shared_exports, {
146
137
  BOOTSTRAP: () => BOOTSTRAP,
147
138
  BOOTSTRAP_VNODE: () => BOOTSTRAP_VNODE,
148
139
  BaseActor: () => BaseActor,
149
- BehaviorSubject: () => BehaviorSubject,
150
140
  Body: () => Body,
151
141
  COMPONENT: () => COMPONENT,
152
142
  COMPONENT_DEPS: () => COMPONENT_DEPS,
@@ -165,6 +155,7 @@ __export(shared_exports, {
165
155
  EXPORTS_KEY: () => EXPORTS_KEY,
166
156
  EXPRESS_ADAPTER_HOST: () => EXPRESS_ADAPTER_HOST,
167
157
  Fragment: () => Fragment,
158
+ GUARDS_KEY: () => GUARDS_KEY,
168
159
  Get: () => Get,
169
160
  HTTP_METHOD_KEY: () => HTTP_METHOD_KEY,
170
161
  HandlerParamType: () => HandlerParamType,
@@ -174,6 +165,7 @@ __export(shared_exports, {
174
165
  IMPORTS_KEY: () => IMPORTS_KEY,
175
166
  INJECTABLE: () => INJECTABLE,
176
167
  INJECT_TOKENS_KEY: () => INJECT_TOKENS_KEY,
168
+ INTERCEPTORS_KEY: () => INTERCEPTORS_KEY,
177
169
  Inject: () => Inject,
178
170
  Injectable: () => Injectable,
179
171
  Injector: () => Injector,
@@ -184,7 +176,6 @@ __export(shared_exports, {
184
176
  ORCA_ELEMENT_TYPE: () => ORCA_ELEMENT_TYPE,
185
177
  ORCA_FRAGMENT_TYPE: () => ORCA_FRAGMENT_TYPE,
186
178
  OSC: () => OSC,
187
- Observable: () => Observable,
188
179
  OrcaComponent: () => OrcaComponent,
189
180
  PARAMS_META_KEY: () => PARAMS_META_KEY,
190
181
  PATH_KEY: () => PATH_KEY,
@@ -194,60 +185,54 @@ __export(shared_exports, {
194
185
  Post: () => Post,
195
186
  ProviderNormalizer: () => ProviderNormalizer,
196
187
  Query: () => Query,
188
+ REQUEST_CONTEXT: () => REQUEST_CONTEXT,
189
+ Req: () => Req,
190
+ Res: () => Res,
197
191
  SIGNATURE_METADATA_KEY: () => SIGNATURE_METADATA_KEY,
198
192
  SSE_ROUTE: () => SSE_ROUTE,
193
+ SetMetadata: () => SetMetadata,
194
+ Shared: () => Shared,
199
195
  Signature: () => Signature,
200
196
  Sse: () => Sse,
201
197
  StreamRenderer: () => StreamRenderer,
202
198
  StringRenderer: () => StringRenderer,
203
- Subject: () => Subject,
204
199
  Subscribe: () => Subscribe,
200
+ UploadedFile: () => UploadedFile,
201
+ UploadedFiles: () => UploadedFiles,
202
+ UseGuards: () => UseGuards,
203
+ UseInterceptors: () => UseInterceptors,
205
204
  VNode: () => VNode,
206
- assert$: () => assert$,
205
+ applyDecorators: () => applyDecorators,
207
206
  batch: () => batch,
208
- catchError: () => catchError,
209
207
  collectAllProvidersFromNode: () => collectAllProvidersFromNode,
210
208
  computed: () => computed,
211
- concatMap: () => concatMap,
212
209
  createRoot: () => createRoot,
213
- debounceTime: () => debounceTime,
214
- distinctUntilChanged: () => distinctUntilChanged,
215
210
  effect: () => effect,
216
- filter: () => filter,
217
- from: () => from,
218
211
  getCurrentInjector: () => getCurrentInjector,
212
+ getGuards: () => getGuards,
213
+ getInterceptors: () => getInterceptors,
219
214
  getSignatureMetadata: () => getSignatureMetadata,
220
215
  hasSignature: () => hasSignature,
221
- interval: () => interval,
222
216
  isClassComponent: () => isClassComponent,
223
217
  isFragment: () => isFragment,
224
218
  isIntrinsicElement: () => isIntrinsicElement,
225
- isObservable: () => isObservable,
226
219
  isSignal: () => isSignal,
227
220
  jsx: () => jsx,
228
221
  jsxs: () => jsxs,
229
- map: () => map,
230
- mergeMap: () => mergeMap,
231
- observable: () => observable,
232
- of: () => of,
222
+ mixin: () => mixin,
233
223
  parseSignatureSchemas: () => parseSignatureSchemas,
234
- reduce: () => reduce,
235
- scan: () => scan,
236
224
  setCurrentInjector: () => setCurrentInjector,
237
225
  signal: () => signal,
238
- skip: () => skip,
239
- startWith: () => startWith,
240
226
  store: () => store,
241
- switchMap: () => switchMap,
242
227
  symbolValueReplacer: () => symbolValueReplacer,
243
228
  symbolValueReviver: () => symbolValueReviver,
244
- take: () => take,
245
- tap: () => tap,
246
- throttleTime: () => throttleTime,
247
229
  toSignal: () => toSignal,
248
230
  untracked: () => untracked
249
231
  });
250
232
 
233
+ // src/shared/decorators.ts
234
+ var import_uid = require("uid");
235
+
251
236
  // src/shared/store.ts
252
237
  var Store = class {
253
238
  constructor() {
@@ -292,6 +277,9 @@ var EXPRESS_ADAPTER_HOST = /* @__PURE__ */ Symbol("orca:express");
292
277
  var SIGNATURE_METADATA_KEY = /* @__PURE__ */ Symbol("orca:signature:schemas");
293
278
  var SSE_ROUTE = /* @__PURE__ */ Symbol("orca:sse:route");
294
279
  var EVENT_HANDLER = /* @__PURE__ */ Symbol("orca:event:handler");
280
+ var INTERCEPTORS_KEY = /* @__PURE__ */ Symbol("interceptors");
281
+ var GUARDS_KEY = /* @__PURE__ */ Symbol("guards");
282
+ var REQUEST_CONTEXT = /* @__PURE__ */ Symbol("orca:request");
295
283
  var ERROR_ELEMENT = /* @__PURE__ */ Symbol.for("orca:error");
296
284
  var ORCA_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for("orca:element");
297
285
  var ORCA_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for("orca:fragment");
@@ -306,6 +294,8 @@ var HandlerParamType = /* @__PURE__ */ ((HandlerParamType2) => {
306
294
  HandlerParamType2["HEADERS"] = "HEADERS";
307
295
  HandlerParamType2["REQUEST"] = "REQUEST";
308
296
  HandlerParamType2["RESPONSE"] = "RESPONSE";
297
+ HandlerParamType2["FILE"] = "FILE";
298
+ HandlerParamType2["FILES"] = "FILES";
309
299
  return HandlerParamType2;
310
300
  })(HandlerParamType || {});
311
301
  var HttpMethod = /* @__PURE__ */ ((HttpMethod2) => {
@@ -331,6 +321,13 @@ function Injectable() {
331
321
  return target;
332
322
  };
333
323
  }
324
+ function mixin(mixinClass) {
325
+ Object.defineProperty(mixinClass, "name", {
326
+ value: (0, import_uid.uid)(21)
327
+ });
328
+ Injectable()(mixinClass);
329
+ return mixinClass;
330
+ }
334
331
  function Component(params = {}) {
335
332
  return function(target) {
336
333
  store.update("components", (current) => {
@@ -347,7 +344,7 @@ function Component(params = {}) {
347
344
  }
348
345
  Reflect.defineMetadata(COMPONENT, true, target);
349
346
  Reflect.defineMetadata(COMPONENT_PROVIDERS, params.providers || [], target);
350
- Reflect.defineMetadata(COMPONENT_DEPS, params.deps || [], target);
347
+ Reflect.defineMetadata(COMPONENT_DEPS, params.inject || [], target);
351
348
  return target;
352
349
  };
353
350
  }
@@ -391,6 +388,18 @@ function Body(key) {
391
388
  function Query(key) {
392
389
  return getHandlerParamDecorator("QUERY" /* QUERY */, key);
393
390
  }
391
+ function UploadedFile() {
392
+ return getHandlerParamDecorator("FILE" /* FILE */);
393
+ }
394
+ function UploadedFiles() {
395
+ return getHandlerParamDecorator("FILES" /* FILES */);
396
+ }
397
+ function Req() {
398
+ return getHandlerParamDecorator("REQUEST" /* REQUEST */);
399
+ }
400
+ function Res() {
401
+ return getHandlerParamDecorator("RESPONSE" /* RESPONSE */);
402
+ }
394
403
  function getRouteDecorator(httpMethod, path2) {
395
404
  return function(target, key, descriptor) {
396
405
  Reflect.defineMetadata(HTTP_METHOD_KEY, httpMethod, target, key);
@@ -410,6 +419,10 @@ function Sse(path2) {
410
419
  Reflect.defineMetadata(HTTP_METHOD_KEY, "get" /* GET */, target, propertyKey);
411
420
  };
412
421
  }
422
+ function Shared() {
423
+ return function(target, _propertyKey, parameterIndex) {
424
+ };
425
+ }
413
426
  function Subscribe(pattern) {
414
427
  return function(target, propertyKey, descriptor) {
415
428
  Reflect.defineMetadata(EVENT_HANDLER, pattern, target, propertyKey);
@@ -448,6 +461,61 @@ function parseSignatureSchemas(schemas, paramCount) {
448
461
  }
449
462
  return { paramSchemas, returnSchema };
450
463
  }
464
+ function UseInterceptors(...interceptors) {
465
+ return function(target, propertyKey, descriptor) {
466
+ if (propertyKey && descriptor) {
467
+ const existing = Reflect.getMetadata(INTERCEPTORS_KEY, target, propertyKey) || [];
468
+ Reflect.defineMetadata(INTERCEPTORS_KEY, [...existing, ...interceptors], target, propertyKey);
469
+ } else {
470
+ const existing = Reflect.getMetadata(INTERCEPTORS_KEY, target) || [];
471
+ Reflect.defineMetadata(INTERCEPTORS_KEY, [...existing, ...interceptors], target);
472
+ }
473
+ };
474
+ }
475
+ function getInterceptors(target, propertyKey) {
476
+ const classInterceptors = Reflect.getMetadata(INTERCEPTORS_KEY, target.constructor) || [];
477
+ const methodInterceptors = Reflect.getMetadata(INTERCEPTORS_KEY, target, propertyKey) || [];
478
+ return [...classInterceptors, ...methodInterceptors];
479
+ }
480
+ function UseGuards(...guards) {
481
+ return function(target, propertyKey, descriptor) {
482
+ if (propertyKey && descriptor) {
483
+ const existing = Reflect.getMetadata(GUARDS_KEY, target, propertyKey) || [];
484
+ Reflect.defineMetadata(GUARDS_KEY, [...existing, ...guards], target, propertyKey);
485
+ } else {
486
+ const existing = Reflect.getMetadata(GUARDS_KEY, target) || [];
487
+ Reflect.defineMetadata(GUARDS_KEY, [...existing, ...guards], target);
488
+ }
489
+ };
490
+ }
491
+ function getGuards(target, propertyKey) {
492
+ const classGuards = Reflect.getMetadata(GUARDS_KEY, target.constructor) || [];
493
+ const methodGuards = Reflect.getMetadata(GUARDS_KEY, target, propertyKey) || [];
494
+ return [...classGuards, ...methodGuards];
495
+ }
496
+ var SetMetadata = (metadataKey, metadataValue) => {
497
+ const decoratorFactory = (target, key, descriptor) => {
498
+ if (descriptor) {
499
+ Reflect.defineMetadata(metadataKey, metadataValue, descriptor.value);
500
+ return descriptor;
501
+ }
502
+ Reflect.defineMetadata(metadataKey, metadataValue, target);
503
+ return target;
504
+ };
505
+ decoratorFactory.KEY = metadataKey;
506
+ return decoratorFactory;
507
+ };
508
+ function applyDecorators(...decorators) {
509
+ return (target, propertyKey, descriptor) => {
510
+ for (const decorator of decorators) {
511
+ if (target instanceof Function && !descriptor) {
512
+ decorator(target);
513
+ continue;
514
+ }
515
+ decorator(target, propertyKey, descriptor);
516
+ }
517
+ };
518
+ }
451
519
 
452
520
  // src/shared/module/node.ts
453
521
  var ProviderNormalizer = class {
@@ -509,10 +577,11 @@ var Compiler = class {
509
577
  }
510
578
  createNode(moduleOrDynamic) {
511
579
  const target = this.isDynamicModule(moduleOrDynamic) ? moduleOrDynamic.module : moduleOrDynamic;
512
- if (this.nodes.has(target.name))
513
- return this.nodes.get(target.name);
514
- const node = new Node(target.name);
515
- this.nodes.set(target.name, node);
580
+ const nodeKey = this.getNodeKey(moduleOrDynamic, target);
581
+ if (this.nodes.has(nodeKey))
582
+ return this.nodes.get(nodeKey);
583
+ const node = new Node(nodeKey);
584
+ this.nodes.set(nodeKey, node);
516
585
  const imports = this.getImports(moduleOrDynamic);
517
586
  node.setChildren(imports.map((imp) => this.createNode(imp)));
518
587
  const providers = this.getProviders(moduleOrDynamic);
@@ -551,6 +620,38 @@ var Compiler = class {
551
620
  this.getExports(moduleOrDynamic).forEach((exp) => node.addExport(exp));
552
621
  return node;
553
622
  }
623
+ getNodeKey(moduleOrDynamic, target) {
624
+ if (this.isDynamicModule(moduleOrDynamic)) {
625
+ if (moduleOrDynamic.__uniqueId) {
626
+ return `${target.name}:${moduleOrDynamic.__uniqueId}`;
627
+ }
628
+ const autoId = this.generateAutoId(moduleOrDynamic);
629
+ if (autoId) {
630
+ return `${target.name}:${autoId}`;
631
+ }
632
+ }
633
+ return target.name;
634
+ }
635
+ generateAutoId(dynamicModule) {
636
+ const parts = [];
637
+ if (dynamicModule.providers && dynamicModule.providers.length > 0) {
638
+ const providerTokens = dynamicModule.providers.map((p) => this.getProviderToken(p)).map((t) => typeof t === "function" ? t.name : String(t)).sort().join(",");
639
+ parts.push(`p:${providerTokens}`);
640
+ }
641
+ if (dynamicModule.exports && dynamicModule.exports.length > 0) {
642
+ const exportTokens = dynamicModule.exports.map((t) => typeof t === "function" ? t.name : String(t)).sort().join(",");
643
+ parts.push(`e:${exportTokens}`);
644
+ }
645
+ if (dynamicModule.controllers && dynamicModule.controllers.length > 0) {
646
+ const controllerNames = dynamicModule.controllers.map((c) => c.name).sort().join(",");
647
+ parts.push(`c:${controllerNames}`);
648
+ }
649
+ if (dynamicModule.declarations && dynamicModule.declarations.length > 0) {
650
+ const declarationNames = dynamicModule.declarations.map((d) => d.name).sort().join(",");
651
+ parts.push(`d:${declarationNames}`);
652
+ }
653
+ return parts.length > 0 ? parts.join("|") : null;
654
+ }
554
655
  validate(rootNode) {
555
656
  const errors = [];
556
657
  const allNodes = /* @__PURE__ */ new Map();
@@ -647,14 +748,23 @@ var Compiler = class {
647
748
  return typeof provider === "function" ? provider : provider.provide;
648
749
  }
649
750
  extractDependencies(item) {
650
- if (typeof item === "object" && "deps" in item && item.deps)
651
- return item.deps;
751
+ if (typeof item === "object" && "inject" in item && item.inject) {
752
+ return item.inject.filter((dep) => {
753
+ if (this.isOptionalDependency(dep)) {
754
+ return !dep.optional;
755
+ }
756
+ return true;
757
+ }).map((dep) => this.isOptionalDependency(dep) ? dep.token : dep);
758
+ }
652
759
  if (typeof item === "object" && item.useClass)
653
760
  return this.getConstructorDependencies(item.useClass);
654
761
  if (typeof item === "function")
655
762
  return this.getConstructorDependencies(item);
656
763
  return [];
657
764
  }
765
+ isOptionalDependency(dep) {
766
+ return typeof dep === "object" && "token" in dep && "optional" in dep;
767
+ }
658
768
  getConstructorDependencies(constructor) {
659
769
  const injectTokens = Reflect.getOwnMetadata(INJECT_TOKENS_KEY, constructor) || /* @__PURE__ */ new Map();
660
770
  const paramTypes = Reflect.getMetadata(DESIGN_PARAMTYPES, constructor) || [];
@@ -729,9 +839,10 @@ var Compiler = class {
729
839
  };
730
840
 
731
841
  // src/shared/module/injector.ts
732
- var Injector = class {
842
+ var Injector = class _Injector {
733
843
  constructor(providers, parent) {
734
844
  this.instanceCache = /* @__PURE__ */ new Map();
845
+ this.promiseCache = /* @__PURE__ */ new Map();
735
846
  this.providerMap = /* @__PURE__ */ new Map();
736
847
  this.parent = parent;
737
848
  providers.forEach((p) => {
@@ -739,14 +850,20 @@ var Injector = class {
739
850
  this.providerMap.set(normalized.provide, normalized);
740
851
  });
741
852
  }
853
+ createChild(providers) {
854
+ return new _Injector(providers, this);
855
+ }
742
856
  addProvider(provider) {
743
857
  const normalized = ProviderNormalizer.normalize(provider);
744
858
  this.providerMap.set(normalized.provide, normalized);
745
859
  }
746
- resolve(token) {
860
+ async resolve(token) {
747
861
  if (this.instanceCache.has(token)) {
748
862
  return this.instanceCache.get(token);
749
863
  }
864
+ if (this.promiseCache.has(token)) {
865
+ return this.promiseCache.get(token);
866
+ }
750
867
  const provider = this.providerMap.get(token);
751
868
  if (!provider) {
752
869
  if (this.parent) {
@@ -756,23 +873,101 @@ var Injector = class {
756
873
  `No provider for token: ${typeof token === "function" ? token.name : String(token)}`
757
874
  );
758
875
  }
759
- const instance = this.createInstance(provider);
876
+ const instancePromise = this.createInstance(provider);
877
+ this.promiseCache.set(token, instancePromise);
878
+ try {
879
+ const instance = await instancePromise;
880
+ if (provider.scope !== "transient") {
881
+ this.instanceCache.set(token, instance);
882
+ }
883
+ return instance;
884
+ } finally {
885
+ this.promiseCache.delete(token);
886
+ }
887
+ }
888
+ resolveSync(token) {
889
+ if (this.instanceCache.has(token)) {
890
+ return this.instanceCache.get(token);
891
+ }
892
+ const provider = this.providerMap.get(token);
893
+ if (!provider) {
894
+ if (this.parent) {
895
+ return this.parent.resolveSync(token);
896
+ }
897
+ throw new Error(
898
+ `No provider for token: ${typeof token === "function" ? token.name : String(token)}`
899
+ );
900
+ }
901
+ const instance = this.createInstanceSync(provider);
760
902
  if (provider.scope !== "transient") {
761
903
  this.instanceCache.set(token, instance);
762
904
  }
763
905
  return instance;
764
906
  }
765
- createInstance(provider) {
766
- if ("useValue" in provider && provider.useValue !== void 0)
767
- return provider.useValue;
907
+ async createInstance(provider) {
908
+ if ("useValue" in provider) return provider.useValue;
768
909
  if (provider.useExisting) return this.resolve(provider.useExisting);
769
910
  if (provider.useFactory) {
770
- const deps2 = (provider.deps || []).map((d) => this.resolve(d));
911
+ const deps2 = await Promise.all(
912
+ (provider.inject || []).map((d) => this.resolveDependency(d))
913
+ );
771
914
  return provider.useFactory(...deps2);
772
915
  }
773
916
  const Ctor = provider.useClass || provider.provide;
774
- const deps = provider.deps || this.getConstructorDeps(Ctor);
775
- return new Ctor(...deps.map((d) => this.resolve(d)));
917
+ const deps = provider.inject || this.getConstructorDeps(Ctor);
918
+ const resolvedDeps = await Promise.all(
919
+ deps.map((d) => this.resolveDependency(d))
920
+ );
921
+ return new Ctor(...resolvedDeps);
922
+ }
923
+ createInstanceSync(provider) {
924
+ if ("useValue" in provider && provider.useValue !== void 0)
925
+ return provider.useValue;
926
+ if (provider.useExisting) return this.resolveSync(provider.useExisting);
927
+ if (provider.useFactory) {
928
+ const deps2 = (provider.inject || []).map(
929
+ (d) => this.resolveDependencySync(d)
930
+ );
931
+ const result = provider.useFactory(...deps2);
932
+ if (result instanceof Promise) {
933
+ throw new Error(
934
+ `Async factory detected but resolveSync() was called. Use resolve() instead.`
935
+ );
936
+ }
937
+ return result;
938
+ }
939
+ const Ctor = provider.useClass || provider.provide;
940
+ const deps = provider.inject || this.getConstructorDeps(Ctor);
941
+ return new Ctor(...deps.map((d) => this.resolveDependencySync(d)));
942
+ }
943
+ async resolveDependency(dep) {
944
+ if (this.isOptionalDependency(dep)) {
945
+ try {
946
+ return await this.resolve(dep.token);
947
+ } catch (error) {
948
+ if (dep.optional) {
949
+ return void 0;
950
+ }
951
+ throw error;
952
+ }
953
+ }
954
+ return this.resolve(dep);
955
+ }
956
+ resolveDependencySync(dep) {
957
+ if (this.isOptionalDependency(dep)) {
958
+ try {
959
+ return this.resolveSync(dep.token);
960
+ } catch (error) {
961
+ if (dep.optional) {
962
+ return void 0;
963
+ }
964
+ throw error;
965
+ }
966
+ }
967
+ return this.resolveSync(dep);
968
+ }
969
+ isOptionalDependency(dep) {
970
+ return typeof dep === "object" && dep !== null && "token" in dep && "optional" in dep;
776
971
  }
777
972
  getConstructorDeps(ctor) {
778
973
  const injectTokens = Reflect.getOwnMetadata(INJECT_TOKENS_KEY, ctor) || /* @__PURE__ */ new Map();
@@ -944,14 +1139,14 @@ var StringRenderer = class {
944
1139
  return "";
945
1140
  }
946
1141
  escapeHtml(text) {
947
- const map2 = {
1142
+ const map = {
948
1143
  "&": "&",
949
1144
  "<": "&lt;",
950
1145
  ">": "&gt;",
951
1146
  '"': "&quot;",
952
1147
  "'": "&#039;"
953
1148
  };
954
- return text.replace(/[&<>"']/g, (m) => map2[m]);
1149
+ return text.replace(/[&<>"']/g, (m) => map[m]);
955
1150
  }
956
1151
  };
957
1152
 
@@ -1065,7 +1260,7 @@ var StreamRenderer = class {
1065
1260
  );
1066
1261
  }
1067
1262
  }
1068
- const instance = componentInjector.resolve(ComponentClass);
1263
+ const instance = componentInjector.resolveSync(ComponentClass);
1069
1264
  const mergedProps = Object.create(
1070
1265
  Object.getPrototypeOf(instance.props || {})
1071
1266
  );
@@ -1433,86 +1628,7 @@ function untracked(fn) {
1433
1628
  }
1434
1629
  }
1435
1630
 
1436
- // src/shared/observable/observable.ts
1437
- var Observable = class {
1438
- constructor(producer) {
1439
- this.producer = producer;
1440
- this.__isObservable = true;
1441
- }
1442
- subscribe(observerOrNext, error, complete) {
1443
- const observer = typeof observerOrNext === "function" ? { next: observerOrNext, error, complete } : observerOrNext;
1444
- let cleanup;
1445
- let isUnsubscribed = false;
1446
- if (this.producer) {
1447
- try {
1448
- cleanup = this.producer(observer);
1449
- } catch (err) {
1450
- if (observer.error) {
1451
- try {
1452
- observer.error(err);
1453
- } catch (e) {
1454
- console.error("Error in error handler during subscription:", e);
1455
- }
1456
- } else {
1457
- throw err;
1458
- }
1459
- }
1460
- }
1461
- return {
1462
- unsubscribe: () => {
1463
- if (isUnsubscribed) return;
1464
- isUnsubscribed = true;
1465
- if (cleanup) {
1466
- try {
1467
- cleanup();
1468
- } catch (err) {
1469
- console.error("Error during cleanup:", err);
1470
- }
1471
- }
1472
- }
1473
- };
1474
- }
1475
- pipe(...operations) {
1476
- if (operations.length === 0) {
1477
- return this;
1478
- }
1479
- return operations.reduce((prev, fn) => fn(prev), this);
1480
- }
1481
- };
1482
- function from(iterable) {
1483
- return new Observable((observer) => {
1484
- try {
1485
- for (const value of iterable) {
1486
- observer.next(value);
1487
- }
1488
- observer.complete?.();
1489
- } catch (err) {
1490
- observer.error?.(err);
1491
- }
1492
- });
1493
- }
1494
- function interval(ms) {
1495
- return new Observable((observer) => {
1496
- let count = 0;
1497
- const id = setInterval(() => {
1498
- observer.next(count++);
1499
- }, ms);
1500
- return () => clearInterval(id);
1501
- });
1502
- }
1503
- function of(...values) {
1504
- return new Observable((observer) => {
1505
- try {
1506
- values.forEach((value) => observer.next(value));
1507
- observer.complete?.();
1508
- } catch (err) {
1509
- observer.error?.(err);
1510
- }
1511
- });
1512
- }
1513
- function observable(producer) {
1514
- return new Observable(producer);
1515
- }
1631
+ // src/shared/signal/utils.ts
1516
1632
  function toSignal(obs, instance) {
1517
1633
  const sig = signal(void 0);
1518
1634
  const subst = obs.subscribe((val) => {
@@ -1524,480 +1640,6 @@ function toSignal(obs, instance) {
1524
1640
  ];
1525
1641
  return sig;
1526
1642
  }
1527
- function isObservable(value) {
1528
- return value && value.__isObservable === true;
1529
- }
1530
- function map(fn) {
1531
- return (source) => {
1532
- return new Observable((observer) => {
1533
- const subscription = source.subscribe(
1534
- (value) => {
1535
- try {
1536
- observer.next(fn(value));
1537
- } catch (err) {
1538
- observer.error?.(err);
1539
- }
1540
- },
1541
- (err) => observer.error?.(err),
1542
- () => observer.complete?.()
1543
- );
1544
- return () => subscription.unsubscribe();
1545
- });
1546
- };
1547
- }
1548
- function filter(predicate) {
1549
- return (source) => {
1550
- return new Observable((observer) => {
1551
- const subscription = source.subscribe(
1552
- (value) => {
1553
- try {
1554
- if (predicate(value)) {
1555
- observer.next(value);
1556
- }
1557
- } catch (err) {
1558
- observer.error?.(err);
1559
- }
1560
- },
1561
- (err) => observer.error?.(err),
1562
- () => observer.complete?.()
1563
- );
1564
- return () => subscription.unsubscribe();
1565
- });
1566
- };
1567
- }
1568
- function tap(fn) {
1569
- return (source) => {
1570
- return new Observable((observer) => {
1571
- const subscription = source.subscribe(
1572
- (value) => {
1573
- try {
1574
- fn(value);
1575
- observer.next(value);
1576
- } catch (err) {
1577
- observer.error?.(err);
1578
- }
1579
- },
1580
- (err) => observer.error?.(err),
1581
- () => observer.complete?.()
1582
- );
1583
- return () => subscription.unsubscribe();
1584
- });
1585
- };
1586
- }
1587
- function take(count) {
1588
- return (source) => {
1589
- return new Observable((observer) => {
1590
- let taken = 0;
1591
- const subscription = source.subscribe(
1592
- (value) => {
1593
- if (taken < count) {
1594
- observer.next(value);
1595
- taken++;
1596
- if (taken === count) {
1597
- observer.complete?.();
1598
- subscription.unsubscribe();
1599
- }
1600
- }
1601
- },
1602
- (err) => observer.error?.(err),
1603
- () => observer.complete?.()
1604
- );
1605
- return () => subscription.unsubscribe();
1606
- });
1607
- };
1608
- }
1609
- function skip(count) {
1610
- return (source) => {
1611
- return new Observable((observer) => {
1612
- let skipped = 0;
1613
- const subscription = source.subscribe(
1614
- (value) => {
1615
- if (skipped < count) {
1616
- skipped++;
1617
- } else {
1618
- observer.next(value);
1619
- }
1620
- },
1621
- (err) => observer.error?.(err),
1622
- () => observer.complete?.()
1623
- );
1624
- return () => subscription.unsubscribe();
1625
- });
1626
- };
1627
- }
1628
- function debounceTime(ms) {
1629
- return (source) => {
1630
- return new Observable((observer) => {
1631
- let timeoutId;
1632
- const subscription = source.subscribe(
1633
- (value) => {
1634
- clearTimeout(timeoutId);
1635
- timeoutId = setTimeout(() => {
1636
- observer.next(value);
1637
- }, ms);
1638
- },
1639
- (err) => observer.error?.(err),
1640
- () => observer.complete?.()
1641
- );
1642
- return () => {
1643
- clearTimeout(timeoutId);
1644
- subscription.unsubscribe();
1645
- };
1646
- });
1647
- };
1648
- }
1649
- function throttleTime(ms) {
1650
- return (source) => {
1651
- return new Observable((observer) => {
1652
- let lastEmit = 0;
1653
- const subscription = source.subscribe(
1654
- (value) => {
1655
- const now = Date.now();
1656
- if (now - lastEmit >= ms) {
1657
- lastEmit = now;
1658
- observer.next(value);
1659
- }
1660
- },
1661
- (err) => observer.error?.(err),
1662
- () => observer.complete?.()
1663
- );
1664
- return () => subscription.unsubscribe();
1665
- });
1666
- };
1667
- }
1668
- function distinctUntilChanged(compare) {
1669
- return (source) => {
1670
- return new Observable((observer) => {
1671
- let hasLast = false;
1672
- let last;
1673
- const subscription = source.subscribe(
1674
- (value) => {
1675
- const isDistinct = !hasLast || (compare ? !compare(last, value) : last !== value);
1676
- if (isDistinct) {
1677
- hasLast = true;
1678
- last = value;
1679
- observer.next(value);
1680
- }
1681
- },
1682
- (err) => observer.error?.(err),
1683
- () => observer.complete?.()
1684
- );
1685
- return () => subscription.unsubscribe();
1686
- });
1687
- };
1688
- }
1689
- function switchMap(fn) {
1690
- return (source) => {
1691
- return new Observable((observer) => {
1692
- let innerSubscription = null;
1693
- const outerSubscription = source.subscribe(
1694
- (value) => {
1695
- if (innerSubscription) {
1696
- innerSubscription.unsubscribe();
1697
- }
1698
- try {
1699
- const innerObservable = fn(value);
1700
- innerSubscription = innerObservable.subscribe(
1701
- (innerValue) => observer.next(innerValue),
1702
- (err) => observer.error?.(err)
1703
- );
1704
- } catch (err) {
1705
- observer.error?.(err);
1706
- }
1707
- },
1708
- (err) => observer.error?.(err),
1709
- () => observer.complete?.()
1710
- );
1711
- return () => {
1712
- if (innerSubscription) {
1713
- innerSubscription.unsubscribe();
1714
- }
1715
- outerSubscription.unsubscribe();
1716
- };
1717
- });
1718
- };
1719
- }
1720
- function mergeMap(fn) {
1721
- return (source) => {
1722
- return new Observable((observer) => {
1723
- const innerSubscriptions = [];
1724
- let outerComplete = false;
1725
- let activeCount = 0;
1726
- const checkComplete = () => {
1727
- if (outerComplete && activeCount === 0) {
1728
- observer.complete?.();
1729
- }
1730
- };
1731
- const outerSubscription = source.subscribe(
1732
- (value) => {
1733
- try {
1734
- const innerObservable = fn(value);
1735
- activeCount++;
1736
- const innerSub = innerObservable.subscribe(
1737
- (innerValue) => observer.next(innerValue),
1738
- (err) => observer.error?.(err),
1739
- () => {
1740
- activeCount--;
1741
- checkComplete();
1742
- }
1743
- );
1744
- innerSubscriptions.push(innerSub);
1745
- } catch (err) {
1746
- observer.error?.(err);
1747
- }
1748
- },
1749
- (err) => observer.error?.(err),
1750
- () => {
1751
- outerComplete = true;
1752
- checkComplete();
1753
- }
1754
- );
1755
- return () => {
1756
- innerSubscriptions.forEach((sub) => sub.unsubscribe());
1757
- outerSubscription.unsubscribe();
1758
- };
1759
- });
1760
- };
1761
- }
1762
- function concatMap(fn) {
1763
- return (source) => {
1764
- return new Observable((observer) => {
1765
- const queue = [];
1766
- let innerSubscription = null;
1767
- let outerComplete = false;
1768
- let isProcessing = false;
1769
- const processNext = () => {
1770
- if (isProcessing || queue.length === 0) {
1771
- if (outerComplete && queue.length === 0) {
1772
- observer.complete?.();
1773
- }
1774
- return;
1775
- }
1776
- isProcessing = true;
1777
- const value = queue.shift();
1778
- try {
1779
- const innerObservable = fn(value);
1780
- innerSubscription = innerObservable.subscribe(
1781
- (innerValue) => observer.next(innerValue),
1782
- (err) => observer.error?.(err),
1783
- () => {
1784
- isProcessing = false;
1785
- processNext();
1786
- }
1787
- );
1788
- } catch (err) {
1789
- observer.error?.(err);
1790
- }
1791
- };
1792
- const outerSubscription = source.subscribe(
1793
- (value) => {
1794
- queue.push(value);
1795
- processNext();
1796
- },
1797
- (err) => observer.error?.(err),
1798
- () => {
1799
- outerComplete = true;
1800
- if (queue.length === 0 && !isProcessing) {
1801
- observer.complete?.();
1802
- }
1803
- }
1804
- );
1805
- return () => {
1806
- if (innerSubscription) {
1807
- innerSubscription.unsubscribe();
1808
- }
1809
- outerSubscription.unsubscribe();
1810
- };
1811
- });
1812
- };
1813
- }
1814
- function catchError(handler) {
1815
- return (source) => {
1816
- return new Observable((observer) => {
1817
- const subscription = source.subscribe(
1818
- (value) => observer.next(value),
1819
- (err) => {
1820
- try {
1821
- const fallback = handler(err);
1822
- const fallbackSub = fallback.subscribe(
1823
- (value) => observer.next(value),
1824
- (e) => observer.error?.(e),
1825
- () => observer.complete?.()
1826
- );
1827
- subscription.__fallback = fallbackSub;
1828
- } catch (e) {
1829
- observer.error?.(e);
1830
- }
1831
- },
1832
- () => observer.complete?.()
1833
- );
1834
- return () => {
1835
- if (subscription.__fallback) {
1836
- subscription.__fallback.unsubscribe();
1837
- }
1838
- subscription.unsubscribe();
1839
- };
1840
- });
1841
- };
1842
- }
1843
- function startWith(...values) {
1844
- return (source) => {
1845
- return new Observable((observer) => {
1846
- values.forEach((value) => observer.next(value));
1847
- const subscription = source.subscribe(
1848
- (value) => observer.next(value),
1849
- (err) => observer.error?.(err),
1850
- () => observer.complete?.()
1851
- );
1852
- return () => subscription.unsubscribe();
1853
- });
1854
- };
1855
- }
1856
- function scan(accumulator, seed) {
1857
- return (source) => {
1858
- return new Observable((observer) => {
1859
- let acc = seed;
1860
- const subscription = source.subscribe(
1861
- (value) => {
1862
- try {
1863
- acc = accumulator(acc, value);
1864
- observer.next(acc);
1865
- } catch (err) {
1866
- observer.error?.(err);
1867
- }
1868
- },
1869
- (err) => observer.error?.(err),
1870
- () => observer.complete?.()
1871
- );
1872
- return () => subscription.unsubscribe();
1873
- });
1874
- };
1875
- }
1876
- function reduce(accumulator, seed) {
1877
- return (source) => {
1878
- return new Observable((observer) => {
1879
- let acc = seed;
1880
- const subscription = source.subscribe(
1881
- (value) => {
1882
- try {
1883
- acc = accumulator(acc, value);
1884
- } catch (err) {
1885
- observer.error?.(err);
1886
- }
1887
- },
1888
- (err) => observer.error?.(err),
1889
- () => {
1890
- observer.next(acc);
1891
- observer.complete?.();
1892
- }
1893
- );
1894
- return () => subscription.unsubscribe();
1895
- });
1896
- };
1897
- }
1898
-
1899
- // src/shared/observable/subject.ts
1900
- var Subject = class extends Observable {
1901
- constructor() {
1902
- super();
1903
- this.subscribers = /* @__PURE__ */ new Set();
1904
- this._isCompleted = false;
1905
- this._hasError = false;
1906
- this._thrownError = null;
1907
- }
1908
- asObservable() {
1909
- return new Observable((observer) => {
1910
- const subscription = this.subscribe(observer);
1911
- return () => subscription.unsubscribe();
1912
- });
1913
- }
1914
- subscribe(observerOrNext, error, complete) {
1915
- if (this._isCompleted) {
1916
- const obs = typeof observerOrNext === "function" ? { complete } : observerOrNext;
1917
- obs.complete?.();
1918
- return { unsubscribe: () => {
1919
- } };
1920
- }
1921
- if (this._hasError) {
1922
- return { unsubscribe: () => {
1923
- } };
1924
- }
1925
- const observer = typeof observerOrNext === "function" ? { next: observerOrNext, error, complete } : observerOrNext;
1926
- this.subscribers.add(observer);
1927
- return {
1928
- unsubscribe: () => {
1929
- this.subscribers.delete(observer);
1930
- }
1931
- };
1932
- }
1933
- next(value) {
1934
- if (this._isCompleted || this._hasError) return;
1935
- const currentSubscribers = Array.from(this.subscribers);
1936
- currentSubscribers.forEach((observer) => {
1937
- if (this.subscribers.has(observer)) {
1938
- try {
1939
- observer.next(value);
1940
- } catch (err) {
1941
- console.error("Error in observer:", err);
1942
- }
1943
- }
1944
- });
1945
- }
1946
- error(err) {
1947
- if (this._isCompleted || this._hasError) return;
1948
- this._hasError = true;
1949
- this._thrownError = err;
1950
- for (const observer of this.subscribers) {
1951
- observer.error?.(err);
1952
- }
1953
- this.subscribers.clear();
1954
- }
1955
- complete() {
1956
- if (this._isCompleted || this._hasError) return;
1957
- this._isCompleted = true;
1958
- const currentSubscribers = Array.from(this.subscribers);
1959
- currentSubscribers.forEach((observer) => {
1960
- if (observer.complete) {
1961
- try {
1962
- observer.complete();
1963
- } catch (err) {
1964
- console.error("Error in complete handler:", err);
1965
- }
1966
- }
1967
- });
1968
- this.subscribers.clear();
1969
- }
1970
- };
1971
-
1972
- // src/shared/observable/bsubject.ts
1973
- var BehaviorSubject = class extends Subject {
1974
- constructor(initialValue) {
1975
- super();
1976
- this._value = initialValue;
1977
- }
1978
- get $value() {
1979
- return this._value;
1980
- }
1981
- next(value) {
1982
- this._value = value;
1983
- super.next(value);
1984
- }
1985
- subscribe(observerOrNext, error, complete) {
1986
- const observer = typeof observerOrNext === "function" ? { next: observerOrNext, error, complete } : observerOrNext;
1987
- if (this._hasError) {
1988
- observer.error?.(this._thrownError);
1989
- return { unsubscribe: () => {
1990
- } };
1991
- }
1992
- if (this._isCompleted) {
1993
- observer.complete?.();
1994
- return { unsubscribe: () => {
1995
- } };
1996
- }
1997
- observer.next(this._value);
1998
- return super.subscribe(observer);
1999
- }
2000
- };
2001
1643
 
2002
1644
  // src/shared/component.ts
2003
1645
  var OrcaComponent = class {
@@ -2015,6 +1657,7 @@ var OrcaComponent = class {
2015
1657
  };
2016
1658
 
2017
1659
  // src/shared/module_libs/http_client/module.ts
1660
+ var import_rxjs = require("rxjs");
2018
1661
  var __decorate = function(decorators, target, key, desc) {
2019
1662
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2020
1663
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -2023,7 +1666,7 @@ var __decorate = function(decorators, target, key, desc) {
2023
1666
  };
2024
1667
  var HttpClient = class HttpClient2 {
2025
1668
  get(url, { stream = "json", reviver, init } = {}) {
2026
- return new Observable((subscriber) => {
1669
+ return new import_rxjs.Observable((subscriber) => {
2027
1670
  const controller = new AbortController();
2028
1671
  fetch(url, {
2029
1672
  method: "GET",
@@ -2462,9 +2105,21 @@ var OSC = class _OSC {
2462
2105
  register2(ComponentClass, injector);
2463
2106
  const cleanProps = { ...props };
2464
2107
  delete cleanProps.__clientComponent;
2465
- const instance = injector.resolve(ComponentClass);
2108
+ const instance = await injector.resolve(ComponentClass);
2466
2109
  instance.__injector = injector;
2467
- instance.props = cleanProps;
2110
+ const mergedProps = Object.create(
2111
+ Object.getPrototypeOf(instance.props || {})
2112
+ );
2113
+ Object.defineProperties(
2114
+ mergedProps,
2115
+ Object.getOwnPropertyDescriptors(instance.props || {})
2116
+ );
2117
+ Object.defineProperties(
2118
+ mergedProps,
2119
+ Object.getOwnPropertyDescriptors(cleanProps || {})
2120
+ );
2121
+ instance.props = mergedProps;
2122
+ instance.onInit?.();
2468
2123
  if (typeof instance.build !== "function") {
2469
2124
  throw new Error(`Component ${name} does not implement build()`);
2470
2125
  }
@@ -2478,11 +2133,6 @@ var OSC = class _OSC {
2478
2133
  }
2479
2134
  };
2480
2135
 
2481
- // src/shared/macros/index.ts
2482
- function assert$(context) {
2483
- return context?.factory.createStringLiteral("assert");
2484
- }
2485
-
2486
2136
  // src/shared/providers/actor.ts
2487
2137
  var BaseActor = class {
2488
2138
  constructor() {
@@ -2569,7 +2219,7 @@ var ServeStaticModule = class _ServeStaticModule {
2569
2219
  const resolvedPath = path.resolve(options.rootPath);
2570
2220
  const indexPath = path.join(resolvedPath, "index.html");
2571
2221
  this.app.use(import_express.default.static(resolvedPath));
2572
- this.app.get(/.*/, (req, res) => {
2222
+ this.app.get(/^\/(?!api).*/, (req, res) => {
2573
2223
  res.sendFile(indexPath);
2574
2224
  });
2575
2225
  }
@@ -2668,6 +2318,7 @@ var RouterModule = class _RouterModule {
2668
2318
  };
2669
2319
 
2670
2320
  // src/node/factory.ts
2321
+ var import_rxjs2 = require("rxjs");
2671
2322
  function createErrorElement(message) {
2672
2323
  return {
2673
2324
  $$typeof: ORCA_ELEMENT_TYPE,
@@ -2754,6 +2405,174 @@ var RouteMatcherService = class {
2754
2405
  return null;
2755
2406
  }
2756
2407
  };
2408
+ var ExecutionContextImpl = class {
2409
+ constructor(classRef, handler, request, response) {
2410
+ this.classRef = classRef;
2411
+ this.handler = handler;
2412
+ this.request = request;
2413
+ this.response = response;
2414
+ }
2415
+ getClass() {
2416
+ return this.classRef;
2417
+ }
2418
+ getHandler() {
2419
+ return this.handler;
2420
+ }
2421
+ switchToHttp() {
2422
+ return {
2423
+ getRequest: () => this.request,
2424
+ getResponse: () => this.response
2425
+ };
2426
+ }
2427
+ };
2428
+ var GuardPipeline = class {
2429
+ static async execute(guards, context, injector) {
2430
+ if (guards.length === 0) {
2431
+ return true;
2432
+ }
2433
+ for (const guardOrClass of guards) {
2434
+ let guardInstance;
2435
+ if (typeof guardOrClass === "function") {
2436
+ guardInstance = await injector.resolve(guardOrClass);
2437
+ } else {
2438
+ guardInstance = guardOrClass;
2439
+ }
2440
+ const result = guardInstance.canActivate(context);
2441
+ if (result && typeof result.subscribe === "function") {
2442
+ const canActivate = await new Promise((resolve2, reject) => {
2443
+ result.subscribe({
2444
+ next: (value) => resolve2(value),
2445
+ error: (err) => reject(err),
2446
+ complete: () => {
2447
+ }
2448
+ });
2449
+ });
2450
+ if (!canActivate) {
2451
+ return false;
2452
+ }
2453
+ } else if (result instanceof Promise) {
2454
+ const canActivate = await result;
2455
+ if (!canActivate) {
2456
+ return false;
2457
+ }
2458
+ } else {
2459
+ if (!result) {
2460
+ return false;
2461
+ }
2462
+ }
2463
+ }
2464
+ return true;
2465
+ }
2466
+ };
2467
+ var InterceptorPipeline = class {
2468
+ static async execute(interceptors, context, handler, injector) {
2469
+ if (interceptors.length === 0) {
2470
+ return handler();
2471
+ }
2472
+ let index = 0;
2473
+ const createCallHandler = () => {
2474
+ const currentIndex = index++;
2475
+ return {
2476
+ handle: async () => {
2477
+ if (currentIndex >= interceptors.length) {
2478
+ return new import_rxjs2.Observable((observer) => {
2479
+ handler().then((result2) => {
2480
+ observer.next(result2);
2481
+ observer.complete?.();
2482
+ }).catch((error) => {
2483
+ observer.error?.(error);
2484
+ });
2485
+ });
2486
+ }
2487
+ const interceptorOrClass = interceptors[currentIndex];
2488
+ let interceptorInstance;
2489
+ if (typeof interceptorOrClass === "function") {
2490
+ interceptorInstance = await injector.resolve(interceptorOrClass);
2491
+ } else {
2492
+ interceptorInstance = interceptorOrClass;
2493
+ }
2494
+ const result = interceptorInstance.intercept(
2495
+ context,
2496
+ createCallHandler()
2497
+ );
2498
+ if (result instanceof Promise) {
2499
+ return new import_rxjs2.Observable((observer) => {
2500
+ result.then((observable) => {
2501
+ observable.subscribe({
2502
+ next: (value) => observer.next(value),
2503
+ error: (err) => observer.error?.(err),
2504
+ complete: () => observer.complete?.()
2505
+ });
2506
+ }).catch((error) => observer.error?.(error));
2507
+ });
2508
+ }
2509
+ return result;
2510
+ }
2511
+ };
2512
+ };
2513
+ return new Promise(async (resolve2, reject) => {
2514
+ const observable = createCallHandler().handle();
2515
+ let result;
2516
+ (await observable).subscribe({
2517
+ next: (value) => {
2518
+ result = value;
2519
+ },
2520
+ error: (error) => {
2521
+ reject(error);
2522
+ },
2523
+ complete: () => {
2524
+ resolve2(result);
2525
+ }
2526
+ });
2527
+ });
2528
+ }
2529
+ };
2530
+ var DependenciesScanner = class {
2531
+ constructor() {
2532
+ this.scannedGuards = /* @__PURE__ */ new Set();
2533
+ this.scannedInterceptors = /* @__PURE__ */ new Set();
2534
+ }
2535
+ scanController(controller) {
2536
+ this.scanGuardsFromMetadata(controller);
2537
+ this.scanInterceptorsFromMetadata(controller);
2538
+ const methodKeys = Reflect.ownKeys(controller.prototype);
2539
+ for (const methodKey of methodKeys) {
2540
+ this.scanGuardsFromMetadata(controller.prototype, methodKey);
2541
+ this.scanInterceptorsFromMetadata(controller.prototype, methodKey);
2542
+ }
2543
+ }
2544
+ scanGuardsFromMetadata(target, propertyKey) {
2545
+ const guards = propertyKey ? Reflect.getMetadata(GUARDS_KEY, target, propertyKey) : Reflect.getMetadata(GUARDS_KEY, target);
2546
+ if (!guards) return;
2547
+ for (const guard of guards) {
2548
+ if (typeof guard === "function") {
2549
+ this.scannedGuards.add(guard);
2550
+ }
2551
+ }
2552
+ }
2553
+ scanInterceptorsFromMetadata(target, propertyKey) {
2554
+ const interceptors = propertyKey ? Reflect.getMetadata(INTERCEPTORS_KEY, target, propertyKey) : Reflect.getMetadata(INTERCEPTORS_KEY, target);
2555
+ if (!interceptors) return;
2556
+ for (const interceptor of interceptors) {
2557
+ if (typeof interceptor === "function") {
2558
+ this.scannedInterceptors.add(interceptor);
2559
+ }
2560
+ }
2561
+ }
2562
+ getGuards() {
2563
+ return Array.from(this.scannedGuards);
2564
+ }
2565
+ getInterceptors() {
2566
+ return Array.from(this.scannedInterceptors);
2567
+ }
2568
+ getProviders() {
2569
+ const guards = this.getGuards().map((g) => ProviderNormalizer.normalize(g));
2570
+ const interceptors = this.getInterceptors().map(
2571
+ (i) => ProviderNormalizer.normalize(i)
2572
+ );
2573
+ return [...guards, ...interceptors];
2574
+ }
2575
+ };
2757
2576
  var ControllerRegistrationService = class {
2758
2577
  constructor(injector, app) {
2759
2578
  this.injector = injector;
@@ -2773,17 +2592,17 @@ var ControllerRegistrationService = class {
2773
2592
  actor.subscribe(eventName, (data) => handler.call(instance, data));
2774
2593
  }
2775
2594
  }
2776
- buildMethodArgs(req, paramsMeta, designParams) {
2595
+ buildMethodArgs(req, res, paramsMeta, designParams) {
2777
2596
  const args = Array(designParams.length).fill(void 0);
2778
2597
  for (let i = 0; i < designParams.length; i++) {
2779
2598
  const meta = paramsMeta[i];
2780
2599
  if (!meta) continue;
2781
- const source = this.getParamSource(req, meta.type);
2600
+ const source = this.getParamSource(req, res, meta.type);
2782
2601
  args[i] = meta.key ? source?.[meta.key] : source;
2783
2602
  }
2784
2603
  return args;
2785
2604
  }
2786
- getParamSource(req, type) {
2605
+ getParamSource(req, res, type) {
2787
2606
  switch (type) {
2788
2607
  case "BODY" /* BODY */:
2789
2608
  return req.body;
@@ -2791,13 +2610,21 @@ var ControllerRegistrationService = class {
2791
2610
  return req.params;
2792
2611
  case "QUERY" /* QUERY */:
2793
2612
  return req.query;
2613
+ case "FILE" /* FILE */:
2614
+ return req.file;
2615
+ case "FILES" /* FILES */:
2616
+ return req.files;
2617
+ case "REQUEST" /* REQUEST */:
2618
+ return req;
2619
+ case "RESPONSE" /* RESPONSE */:
2620
+ return res;
2794
2621
  default:
2795
2622
  return void 0;
2796
2623
  }
2797
2624
  }
2798
2625
  async handleMethodResult(result, res, isSSE) {
2799
2626
  if (res.headersSent) return;
2800
- if (isSSE && result instanceof Observable) {
2627
+ if (isSSE && (0, import_rxjs2.isObservable)(result)) {
2801
2628
  result.subscribe({
2802
2629
  next: (data) => {
2803
2630
  res.write(`data: ${JSON.stringify(data)}
@@ -2840,6 +2667,8 @@ var ControllerRegistrationService = class {
2840
2667
  methodKey
2841
2668
  );
2842
2669
  const paramsMeta = Reflect.getMetadata(PARAMS_META_KEY, CtrlCls.prototype, methodKey) ?? {};
2670
+ const guards = getGuards(CtrlCls.prototype, methodKey);
2671
+ const interceptors = getInterceptors(CtrlCls.prototype, methodKey);
2843
2672
  this.app[httpMethod](fullPath, async (req, res) => {
2844
2673
  try {
2845
2674
  if (isSSE) {
@@ -2847,16 +2676,52 @@ var ControllerRegistrationService = class {
2847
2676
  res.setHeader("Cache-Control", "no-cache");
2848
2677
  res.setHeader("Connection", "keep-alive");
2849
2678
  }
2679
+ const requestContext = {
2680
+ request: req,
2681
+ response: res,
2682
+ metadata: {}
2683
+ };
2850
2684
  const designParams = Reflect.getMetadata(
2851
2685
  DESIGN_PARAMTYPES,
2852
2686
  CtrlCls.prototype,
2853
2687
  methodKey
2854
2688
  ) ?? [];
2855
- const args = this.buildMethodArgs(req, paramsMeta, designParams);
2856
- const result = await instance[methodKey](...args);
2689
+ const context = new ExecutionContextImpl(
2690
+ CtrlCls,
2691
+ instance[methodKey],
2692
+ req,
2693
+ res
2694
+ );
2695
+ const canActivate = await GuardPipeline.execute(
2696
+ guards,
2697
+ context,
2698
+ this.injector
2699
+ );
2700
+ if (!canActivate) {
2701
+ res.status(403).json({
2702
+ statusCode: 403,
2703
+ message: "Forbidden",
2704
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
2705
+ });
2706
+ return;
2707
+ }
2708
+ const result = await InterceptorPipeline.execute(
2709
+ interceptors,
2710
+ context,
2711
+ async () => {
2712
+ const args = this.buildMethodArgs(
2713
+ req,
2714
+ res,
2715
+ paramsMeta,
2716
+ designParams
2717
+ );
2718
+ return instance[methodKey](...args);
2719
+ },
2720
+ this.injector
2721
+ );
2857
2722
  await this.handleMethodResult(result, res, isSSE);
2858
2723
  } catch (err) {
2859
- res.send(err.message);
2724
+ res.status(500).send(err.message);
2860
2725
  }
2861
2726
  });
2862
2727
  }
@@ -2864,10 +2729,10 @@ var ControllerRegistrationService = class {
2864
2729
  const normalizedPrefix = prefix === "/" ? "" : `/${prefix.replace(/^\/+|\/+$/g, "")}`;
2865
2730
  return `${normalizedPrefix}/${routePath}`.replace(/\/+/g, "/").replace(/\/$/, "") || "/";
2866
2731
  }
2867
- register(CtrlCls) {
2868
- const instance = this.injector.resolve(CtrlCls);
2732
+ async register(CtrlCls) {
2733
+ const instance = await this.injector.resolve(CtrlCls);
2869
2734
  const prefix = Reflect.getMetadata(CONTROLLER_PREFIX_KEY, CtrlCls) ?? "/";
2870
- const actor = this.injector.resolve(Actor);
2735
+ const actor = await this.injector.resolve(Actor);
2871
2736
  this.registerEventHandlers(CtrlCls, instance, actor);
2872
2737
  this.registerHttpMethods(CtrlCls, instance, prefix);
2873
2738
  }
@@ -2991,8 +2856,8 @@ var OscRouteHandler = class {
2991
2856
  var SocketService = class {
2992
2857
  static setup(server, injector) {
2993
2858
  const io = new import_socket.Server(server);
2994
- io.on("connection", (socket) => {
2995
- const actor = injector.resolve(Actor);
2859
+ io.on("connection", async (socket) => {
2860
+ const actor = await injector.resolve(Actor);
2996
2861
  actor.register(socket.id, {
2997
2862
  send: (message) => {
2998
2863
  io.to(socket.id).emit("message", message);
@@ -3020,15 +2885,37 @@ var NodeFactory = class {
3020
2885
  }
3021
2886
  return appNode;
3022
2887
  }
3023
- static createRootInjector(appNode, app, rootModule) {
2888
+ static scanDependencies(appNode) {
2889
+ const scanner = new DependenciesScanner();
2890
+ const rootControllers = [
2891
+ ...store.get("root_controllers")
2892
+ ];
2893
+ rootControllers.forEach((ctrl) => scanner.scanController(ctrl));
2894
+ appNode.traverse((node) => {
2895
+ const providers = [...node.getProviders().values()];
2896
+ const controllers = providers.filter((provider) => {
2897
+ const token = provider.provide;
2898
+ return typeof token === "function" && Reflect.getMetadata(CONTROLLER, token);
2899
+ });
2900
+ controllers.forEach((c) => {
2901
+ if (c.useClass) {
2902
+ scanner.scanController(c.useClass);
2903
+ }
2904
+ });
2905
+ });
2906
+ return scanner;
2907
+ }
2908
+ static createRootInjector(appNode, app, rootModule, scanner) {
3024
2909
  const allProviders = collectAllProvidersFromNode(appNode);
3025
2910
  const rootControllers = [
3026
2911
  ...store.get("root_controllers")
3027
2912
  ].map((p) => ProviderNormalizer.normalize(p));
3028
2913
  const bootstrap = Reflect.getMetadata(BOOTSTRAP, rootModule);
2914
+ const guardAndInterceptorProviders = scanner.getProviders();
3029
2915
  return new Injector([
3030
2916
  ...allProviders,
3031
2917
  ...rootControllers,
2918
+ ...guardAndInterceptorProviders,
3032
2919
  { provide: "OSC_URL", useValue: "/osc" },
3033
2920
  { provide: EXPRESS_ADAPTER_HOST, useValue: app },
3034
2921
  {
@@ -3049,11 +2936,14 @@ var NodeFactory = class {
3049
2936
  rootControllers.forEach((ctrl) => registrationService.register(ctrl));
3050
2937
  appNode.traverse((node) => {
3051
2938
  const providers = [...node.getProviders().values()];
3052
- const controllers = providers.filter(
3053
- (provider) => Reflect.getMetadata(CONTROLLER, provider.provide)
3054
- );
2939
+ const controllers = providers.filter((provider) => {
2940
+ const token = provider.provide;
2941
+ return typeof token === "function" && Reflect.getMetadata(CONTROLLER, token);
2942
+ });
3055
2943
  controllers.forEach((c) => registrationService.register(c.useClass));
3056
- providers.filter((provider) => provider.eager).forEach((p) => injector.resolve(p.provide));
2944
+ providers.filter((provider) => provider.eager).forEach(async (p) => {
2945
+ await injector.resolve(p.provide);
2946
+ });
3057
2947
  });
3058
2948
  }
3059
2949
  static setupOscRoute(app, injector, rootModule) {
@@ -3066,7 +2956,13 @@ var NodeFactory = class {
3066
2956
  app.use(import_express2.default.json());
3067
2957
  const server = import_http.default.createServer(app);
3068
2958
  const appNode = this.compileAndValidate(rootModule);
3069
- const rootInjector = this.createRootInjector(appNode, app, rootModule);
2959
+ const scanner = this.scanDependencies(appNode);
2960
+ const rootInjector = this.createRootInjector(
2961
+ appNode,
2962
+ app,
2963
+ rootModule,
2964
+ scanner
2965
+ );
3070
2966
  setCurrentInjector(rootInjector);
3071
2967
  this.registerControllers(appNode, rootInjector, app);
3072
2968
  this.setupOscRoute(app, rootInjector, rootModule);
@@ -3080,7 +2976,6 @@ var NodeFactory = class {
3080
2976
  ActorModule,
3081
2977
  BOOTSTRAP,
3082
2978
  BOOTSTRAP_VNODE,
3083
- BehaviorSubject,
3084
2979
  Body,
3085
2980
  COMPONENT,
3086
2981
  COMPONENT_DEPS,
@@ -3099,6 +2994,7 @@ var NodeFactory = class {
3099
2994
  EXPORTS_KEY,
3100
2995
  EXPRESS_ADAPTER_HOST,
3101
2996
  Fragment,
2997
+ GUARDS_KEY,
3102
2998
  Get,
3103
2999
  HTTP_METHOD_KEY,
3104
3000
  HandlerParamType,
@@ -3108,6 +3004,7 @@ var NodeFactory = class {
3108
3004
  IMPORTS_KEY,
3109
3005
  INJECTABLE,
3110
3006
  INJECT_TOKENS_KEY,
3007
+ INTERCEPTORS_KEY,
3111
3008
  Inject,
3112
3009
  Injectable,
3113
3010
  Injector,
@@ -3120,7 +3017,6 @@ var NodeFactory = class {
3120
3017
  ORCA_ELEMENT_TYPE,
3121
3018
  ORCA_FRAGMENT_TYPE,
3122
3019
  OSC,
3123
- Observable,
3124
3020
  OrcaComponent,
3125
3021
  PARAMS_META_KEY,
3126
3022
  PATH_KEY,
@@ -3130,56 +3026,47 @@ var NodeFactory = class {
3130
3026
  Post,
3131
3027
  ProviderNormalizer,
3132
3028
  Query,
3029
+ REQUEST_CONTEXT,
3030
+ Req,
3031
+ Res,
3133
3032
  RouterModule,
3134
3033
  SIGNATURE_METADATA_KEY,
3135
3034
  SSE_ROUTE,
3136
3035
  ServeStaticModule,
3036
+ SetMetadata,
3037
+ Shared,
3137
3038
  Signature,
3138
3039
  Sse,
3139
- Subject,
3140
3040
  Subscribe,
3141
- assert$,
3041
+ UploadedFile,
3042
+ UploadedFiles,
3043
+ UseGuards,
3044
+ UseInterceptors,
3045
+ applyDecorators,
3142
3046
  batch,
3143
- catchError,
3144
3047
  collectAllProvidersFromNode,
3145
3048
  computed,
3146
- concatMap,
3147
3049
  createRoot,
3148
- debounceTime,
3149
- distinctUntilChanged,
3150
3050
  effect,
3151
- filter,
3152
- from,
3153
3051
  getCurrentInjector,
3052
+ getGuards,
3053
+ getInterceptors,
3154
3054
  getSignatureMetadata,
3155
3055
  hasSignature,
3156
- interval,
3157
3056
  isClassComponent,
3158
3057
  isFragment,
3159
3058
  isIntrinsicElement,
3160
- isObservable,
3161
3059
  isSignal,
3162
3060
  jsx,
3163
3061
  jsxs,
3164
- map,
3165
- mergeMap,
3062
+ mixin,
3166
3063
  node,
3167
- observable,
3168
- of,
3169
3064
  parseSignatureSchemas,
3170
- reduce,
3171
- scan,
3172
3065
  setCurrentInjector,
3173
3066
  shared,
3174
3067
  signal,
3175
- skip,
3176
- startWith,
3177
- switchMap,
3178
3068
  symbolValueReplacer,
3179
3069
  symbolValueReviver,
3180
- take,
3181
- tap,
3182
- throttleTime,
3183
3070
  toSignal,
3184
3071
  untracked
3185
3072
  });