@v-ibe/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 (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -0
  3. package/dist/DI/__tests__/scoped-container-dependencies.test.d.ts +1 -0
  4. package/dist/DI/bootstrap.d.ts +18 -0
  5. package/dist/DI/decorators/inject.d.ts +37 -0
  6. package/dist/DI/decorators/inject.js +45 -0
  7. package/dist/DI/decorators/service.d.ts +24 -0
  8. package/dist/DI/decorators/service.js +13 -0
  9. package/dist/DI/di-container.d.ts +53 -0
  10. package/dist/DI/di-container.js +158 -0
  11. package/dist/DI/lifecycle.d.ts +37 -0
  12. package/dist/DI/lifecycle.js +6 -0
  13. package/dist/DI/scoped-container.d.ts +68 -0
  14. package/dist/DI/scoped-container.js +193 -0
  15. package/dist/DI/service-metadata.d.ts +32 -0
  16. package/dist/DI/service-metadata.js +31 -0
  17. package/dist/DI/types.d.ts +4 -0
  18. package/dist/behaviors/__tests__/behavior-system.test.d.ts +1 -0
  19. package/dist/behaviors/behavior-manager.d.ts +60 -0
  20. package/dist/behaviors/behavior-manager.js +131 -0
  21. package/dist/behaviors/behavior-registry.d.ts +68 -0
  22. package/dist/behaviors/behavior-registry.js +105 -0
  23. package/dist/behaviors/constants.d.ts +16 -0
  24. package/dist/behaviors/constants.js +8 -0
  25. package/dist/behaviors/decorators.d.ts +87 -0
  26. package/dist/behaviors/decorators.js +46 -0
  27. package/dist/behaviors/index.d.ts +4 -0
  28. package/dist/components/__tests__/host.test.d.ts +1 -0
  29. package/dist/components/app-tree.d.ts +49 -0
  30. package/dist/components/app-tree.js +122 -0
  31. package/dist/components/base-component.d.ts +85 -0
  32. package/dist/components/base-component.js +438 -0
  33. package/dist/components/decorators/component.d.ts +27 -0
  34. package/dist/components/decorators/component.js +47 -0
  35. package/dist/components/decorators/prop.d.ts +14 -0
  36. package/dist/components/decorators/prop.js +37 -0
  37. package/dist/components/types.d.ts +26 -0
  38. package/dist/core.d.ts +23 -0
  39. package/dist/core.js +8 -0
  40. package/dist/custom-components/__tests__/for.test.d.ts +1 -0
  41. package/dist/custom-components/__tests__/show.test.d.ts +1 -0
  42. package/dist/custom-components/for.d.ts +58 -0
  43. package/dist/custom-components/for.js +313 -0
  44. package/dist/custom-components/index.d.ts +2 -0
  45. package/dist/custom-components/show.d.ts +78 -0
  46. package/dist/custom-components/show.js +88 -0
  47. package/dist/data-management/cache/cache-invalidate.decorator.d.ts +35 -0
  48. package/dist/data-management/cache/cache-invalidate.decorator.js +21 -0
  49. package/dist/data-management/cache/cache-metadata.d.ts +15 -0
  50. package/dist/data-management/cache/cache-provider.interface.d.ts +67 -0
  51. package/dist/data-management/cache/cache-tags.decorator.d.ts +52 -0
  52. package/dist/data-management/cache/cache-tags.decorator.js +13 -0
  53. package/dist/data-management/cache/cache-update.decorator.d.ts +28 -0
  54. package/dist/data-management/cache/cache-update.decorator.js +21 -0
  55. package/dist/data-management/cache/cache.decorator.d.ts +28 -0
  56. package/dist/data-management/cache/cache.decorator.js +13 -0
  57. package/dist/data-management/cache/index.d.ts +11 -0
  58. package/dist/data-management/cache/local-storage-cache.d.ts +40 -0
  59. package/dist/data-management/cache/local-storage-cache.js +268 -0
  60. package/dist/data-management/cache/memory-cache.d.ts +37 -0
  61. package/dist/data-management/cache/memory-cache.js +149 -0
  62. package/dist/data-management/cache/session-storage-cache.d.ts +35 -0
  63. package/dist/data-management/cache/session-storage-cache.js +242 -0
  64. package/dist/data-management/cache/ttl.decorator.d.ts +31 -0
  65. package/dist/data-management/cache/ttl.decorator.js +34 -0
  66. package/dist/data-management/decorators/consume.d.ts +29 -0
  67. package/dist/data-management/decorators/consume.js +28 -0
  68. package/dist/data-management/decorators/id.d.ts +28 -0
  69. package/dist/data-management/decorators/id.js +19 -0
  70. package/dist/data-management/decorators/model.d.ts +48 -0
  71. package/dist/data-management/decorators/model.js +24 -0
  72. package/dist/data-management/decorators/prop.d.ts +43 -0
  73. package/dist/data-management/decorators/prop.js +32 -0
  74. package/dist/data-management/index.d.ts +13 -0
  75. package/dist/data-management/store/json-to-model.d.ts +45 -0
  76. package/dist/data-management/store/json-to-model.js +36 -0
  77. package/dist/data-management/store/store.d.ts +108 -0
  78. package/dist/data-management/store/store.js +207 -0
  79. package/dist/data-management/store/types.d.ts +53 -0
  80. package/dist/events-handler/decorators/emit.d.ts +29 -0
  81. package/dist/events-handler/decorators/emit.js +51 -0
  82. package/dist/events-handler/event-decorators.d.ts +1 -0
  83. package/dist/events-handler/event-emitter.service.d.ts +21 -0
  84. package/dist/events-handler/event-emitter.service.js +85 -0
  85. package/dist/events-handler/event-types.d.ts +12 -0
  86. package/dist/index.d.ts +55 -0
  87. package/dist/index.js +121 -0
  88. package/dist/jsx/dynamic/__tests__/granular-array-renderer.test.d.ts +1 -0
  89. package/dist/jsx/dynamic/__tests__/jsx-array-rendering.test.d.ts +1 -0
  90. package/dist/jsx/dynamic/array-renderer.d.ts +2 -0
  91. package/dist/jsx/dynamic/array-renderer.js +133 -0
  92. package/dist/jsx/dynamic/child-renderer.d.ts +1 -0
  93. package/dist/jsx/dynamic/child-renderer.js +180 -0
  94. package/dist/jsx/dynamic/dom-utils.d.ts +5 -0
  95. package/dist/jsx/dynamic/dom-utils.js +22 -0
  96. package/dist/jsx/dynamic/granular-array-renderer.d.ts +16 -0
  97. package/dist/jsx/dynamic/granular-array-renderer.js +153 -0
  98. package/dist/jsx/dynamic/node-renderer.d.ts +2 -0
  99. package/dist/jsx/dynamic/props-handler.d.ts +3 -0
  100. package/dist/jsx/dynamic/props-handler.js +281 -0
  101. package/dist/jsx/dynamic/text-renderer.d.ts +2 -0
  102. package/dist/jsx/jsx-dev-runtime.d.ts +2 -0
  103. package/dist/jsx/jsx-runtime.d.ts +3 -0
  104. package/dist/jsx/types.d.ts +35 -0
  105. package/dist/jsx/types.js +4 -0
  106. package/dist/jsx-dev-runtime.d.ts +2 -0
  107. package/dist/jsx-dev-runtime.js +8 -0
  108. package/dist/jsx-runtime.d.ts +2 -0
  109. package/dist/jsx-runtime.js +11 -0
  110. package/dist/reactivity/__tests__/context-stack.test.d.ts +1 -0
  111. package/dist/reactivity/__tests__/nested-effects-untrack.test.d.ts +22 -0
  112. package/dist/reactivity/context-scope.d.ts +57 -0
  113. package/dist/reactivity/context-scope.js +35 -0
  114. package/dist/reactivity/decorators/__tests__/ctx-integration.test.d.ts +5 -0
  115. package/dist/reactivity/decorators/__tests__/ctx-loop.test.d.ts +10 -0
  116. package/dist/reactivity/decorators/__tests__/state-intelligent.test.d.ts +1 -0
  117. package/dist/reactivity/decorators/computed.d.ts +6 -0
  118. package/dist/reactivity/decorators/computed.js +17 -0
  119. package/dist/reactivity/decorators/create-event-decorator.d.ts +5 -0
  120. package/dist/reactivity/decorators/create-event-decorator.js +28 -0
  121. package/dist/reactivity/decorators/ctx.d.ts +9 -0
  122. package/dist/reactivity/decorators/ctx.js +91 -0
  123. package/dist/reactivity/decorators/effect.d.ts +9 -0
  124. package/dist/reactivity/decorators/effect.js +24 -0
  125. package/dist/reactivity/decorators/resource.d.ts +48 -0
  126. package/dist/reactivity/decorators/resource.js +20 -0
  127. package/dist/reactivity/decorators/state.d.ts +8 -0
  128. package/dist/reactivity/decorators/state.js +68 -0
  129. package/dist/reactivity/decorators/store.d.ts +6 -0
  130. package/dist/reactivity/decorators/store.js +25 -0
  131. package/dist/reactivity/phase-scheduler.d.ts +81 -0
  132. package/dist/reactivity/phase-scheduler.js +88 -0
  133. package/dist/reactivity/phase-scheduler.test.d.ts +1 -0
  134. package/dist/reactivity/reactive-cache.d.ts +21 -0
  135. package/dist/reactivity/reactive-cache.js +31 -0
  136. package/dist/reactivity/reactive-cache.test.d.ts +1 -0
  137. package/dist/reactivity/reactive-context.d.ts +152 -0
  138. package/dist/reactivity/reactive-context.js +184 -0
  139. package/dist/reactivity/signals/__tests__/composicion-automatica.test.d.ts +1 -0
  140. package/dist/reactivity/signals/__tests__/composite/nivel-1-estructura-basica.test.d.ts +1 -0
  141. package/dist/reactivity/signals/__tests__/composite/nivel-2-registro-subscribers.test.d.ts +1 -0
  142. package/dist/reactivity/signals/__tests__/composite/nivel-3-notificaciones-basicas.test.d.ts +1 -0
  143. package/dist/reactivity/signals/__tests__/composite/nivel-4-comparacion-valores.test.d.ts +1 -0
  144. package/dist/reactivity/signals/__tests__/composite/nivel-5-tracking-automatico.test.d.ts +1 -0
  145. package/dist/reactivity/signals/__tests__/composite/nivel-6-anti-glitch.test.d.ts +1 -0
  146. package/dist/reactivity/signals/__tests__/composite/nivel-7-objetos-anidados.test.d.ts +1 -0
  147. package/dist/reactivity/signals/__tests__/composite/nivel-8-observable-array-support.test.d.ts +1 -0
  148. package/dist/reactivity/signals/__tests__/composite-shallow-tracking.test.d.ts +1 -0
  149. package/dist/reactivity/signals/__tests__/effect.test.d.ts +1 -0
  150. package/dist/reactivity/signals/__tests__/reactive-array/nivel-1-estructura-basica.test.d.ts +1 -0
  151. package/dist/reactivity/signals/__tests__/reactive-array/nivel-2-metodos-mutadores.test.d.ts +1 -0
  152. package/dist/reactivity/signals/__tests__/reactive-array/nivel-3-tracking-por-indice.test.d.ts +1 -0
  153. package/dist/reactivity/signals/__tests__/reactive-array/nivel-4-tracking-length.test.d.ts +1 -0
  154. package/dist/reactivity/signals/__tests__/reactive-array/nivel-5-tracking-mutation.test.d.ts +1 -0
  155. package/dist/reactivity/signals/__tests__/reactive-array/nivel-6-metodos-no-mutadores.test.d.ts +1 -0
  156. package/dist/reactivity/signals/__tests__/reactive-array/nivel-7-composicion-bidireccional.test.d.ts +1 -0
  157. package/dist/reactivity/signals/__tests__/reactive-array/nivel-8-proxies.test.d.ts +1 -0
  158. package/dist/reactivity/signals/__tests__/reactive-array/nivel-9-derived-cache-optimization.test.d.ts +1 -0
  159. package/dist/reactivity/signals/__tests__/resource.test.d.ts +1 -0
  160. package/dist/reactivity/signals/__tests__/signal.test.d.ts +1 -0
  161. package/dist/reactivity/signals/array-strategies.d.ts +120 -0
  162. package/dist/reactivity/signals/array-strategies.js +261 -0
  163. package/dist/reactivity/signals/composite.d.ts +89 -0
  164. package/dist/reactivity/signals/composite.js +145 -0
  165. package/dist/reactivity/signals/computed.d.ts +61 -0
  166. package/dist/reactivity/signals/computed.js +107 -0
  167. package/dist/reactivity/signals/computed.test.d.ts +1 -0
  168. package/dist/reactivity/signals/derived.d.ts +10 -0
  169. package/dist/reactivity/signals/derived.js +24 -0
  170. package/dist/reactivity/signals/effect.d.ts +27 -0
  171. package/dist/reactivity/signals/effect.js +46 -0
  172. package/dist/reactivity/signals/event.d.ts +9 -0
  173. package/dist/reactivity/signals/event.js +15 -0
  174. package/dist/reactivity/signals/reactive-array.d.ts +133 -0
  175. package/dist/reactivity/signals/reactive-array.js +490 -0
  176. package/dist/reactivity/signals/reactive-proxy.d.ts +54 -0
  177. package/dist/reactivity/signals/reactive-proxy.js +299 -0
  178. package/dist/reactivity/signals/reactive-tracking.test.d.ts +1 -0
  179. package/dist/reactivity/signals/resource.d.ts +9 -0
  180. package/dist/reactivity/signals/resource.js +58 -0
  181. package/dist/reactivity/signals/signal.d.ts +39 -0
  182. package/dist/reactivity/signals/signal.js +56 -0
  183. package/dist/reactivity/signals/subscription-management.test.d.ts +1 -0
  184. package/dist/reactivity/types.d.ts +12 -0
  185. package/dist/router/__tests__/link-behavior-active-class.test.d.ts +1 -0
  186. package/dist/router/__tests__/loop-detector.test.d.ts +1 -0
  187. package/dist/router/__tests__/params-container-resolution.test.d.ts +1 -0
  188. package/dist/router/__tests__/router-generated-routes.test.d.ts +1 -0
  189. package/dist/router/__tests__/router-params-granular.test.d.ts +1 -0
  190. package/dist/router/__tests__/router-params-simple.test.d.ts +1 -0
  191. package/dist/router/__tests__/router-query-params.test.d.ts +1 -0
  192. package/dist/router/__tests__/router-route-candidates.test.d.ts +1 -0
  193. package/dist/router/__tests__/routeview-app-articles.test.d.ts +1 -0
  194. package/dist/router/__tests__/routeview-debug.test.d.ts +1 -0
  195. package/dist/router/__tests__/routeview-integration.test.d.ts +1 -0
  196. package/dist/router/__tests__/routeview-this.test.d.ts +1 -0
  197. package/dist/router/decorators/base-policy.d.ts +141 -0
  198. package/dist/router/decorators/base-policy.js +63 -0
  199. package/dist/router/decorators/index.d.ts +6 -0
  200. package/dist/router/decorators/params.d.ts +31 -0
  201. package/dist/router/decorators/params.js +97 -0
  202. package/dist/router/decorators/route-metadata.d.ts +11 -0
  203. package/dist/router/decorators/route-metadata.js +23 -0
  204. package/dist/router/decorators/route.d.ts +39 -0
  205. package/dist/router/decorators/route.js +7 -0
  206. package/dist/router/link.behavior.d.ts +87 -0
  207. package/dist/router/link.behavior.js +227 -0
  208. package/dist/router/policy-evaluator.d.ts +81 -0
  209. package/dist/router/policy-evaluator.js +209 -0
  210. package/dist/router/route-view.d.ts +56 -0
  211. package/dist/router/route-view.js +156 -0
  212. package/dist/router/router.d.ts +67 -0
  213. package/dist/router/router.js +308 -0
  214. package/dist/router/static-analysis/index.d.ts +37 -0
  215. package/dist/router/static-analysis/parser.d.ts +14 -0
  216. package/dist/router/static-analysis/parser.js +147 -0
  217. package/dist/router/static-analysis/scanner.d.ts +27 -0
  218. package/dist/router/static-analysis/scanner.js +91 -0
  219. package/dist/router/trie.d.ts +14 -0
  220. package/dist/router/trie.js +126 -0
  221. package/dist/router/trie.types.d.ts +36 -0
  222. package/dist/styles/base-style-sheet.d.ts +96 -0
  223. package/dist/styles/base-style-sheet.js +149 -0
  224. package/dist/styles/decorators/factories.d.ts +76 -0
  225. package/dist/styles/decorators/factories.js +11 -0
  226. package/dist/styles/decorators/keyframes.d.ts +238 -0
  227. package/dist/styles/decorators/keyframes.js +79 -0
  228. package/dist/styles/decorators/rule.d.ts +177 -0
  229. package/dist/styles/decorators/rule.js +72 -0
  230. package/dist/styles/decorators/scope.d.ts +66 -0
  231. package/dist/styles/decorators/scope.js +17 -0
  232. package/dist/styles/decorators/style.d.ts +1 -0
  233. package/dist/styles/decorators/style.js +20 -0
  234. package/dist/styles/decorators/useStyles.d.ts +5 -0
  235. package/dist/styles/decorators/useStyles.js +29 -0
  236. package/dist/styles/global-styles-registry.d.ts +72 -0
  237. package/dist/styles/global-styles-registry.js +155 -0
  238. package/dist/types.d.ts +1 -0
  239. package/dist/vite-plugins/__tests__/jsx-control-flow-transform.test.d.ts +1 -0
  240. package/dist/vite-plugins/index.d.ts +4 -0
  241. package/dist/vite-plugins/index.js +10 -0
  242. package/dist/vite-plugins/jsx-contextual.d.ts +7 -0
  243. package/dist/vite-plugins/jsx-contextual.js +53 -0
  244. package/dist/vite-plugins/jsx-control-flow-transform.d.ts +60 -0
  245. package/dist/vite-plugins/jsx-control-flow-transform.js +180 -0
  246. package/dist/vite-plugins/jsx-signals.d.ts +2 -0
  247. package/dist/vite-plugins/jsx-signals.js +124 -0
  248. package/dist/vite-plugins/router/route-generator-plugin.d.ts +63 -0
  249. package/dist/vite-plugins/router/route-generator-plugin.js +310 -0
  250. package/package.json +85 -0
@@ -0,0 +1,209 @@
1
+ import { Service } from "../DI/decorators/service.js";
2
+ import { getPolicyRules } from "./decorators/base-policy.js";
3
+ import { reactiveContext } from "../reactivity/reactive-context.js";
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
8
+ var __typeError = (msg) => {
9
+ throw TypeError(msg);
10
+ };
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ var __decoratorStart = (base) => [, , , __create(null)];
14
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
15
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
16
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
17
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
18
+ var __runInitializers = (array, flags, self, value) => {
19
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
20
+ return value;
21
+ };
22
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
23
+ var it, done, ctx, k = flags & 7, p = false;
24
+ var j = 0;
25
+ var extraInitializers = array[j] || (array[j] = []);
26
+ var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc(target, name));
27
+ __name(target, name);
28
+ for (var i = decorators.length - 1; i >= 0; i--) {
29
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
30
+ it = (0, decorators[i])(target, ctx), done._ = 1;
31
+ __expectFn(it) && (target = it);
32
+ }
33
+ return __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
34
+ };
35
+ var _PolicyEvaluator_decorators, _init;
36
+ _PolicyEvaluator_decorators = [Service];
37
+ class PolicyEvaluator {
38
+ /**
39
+ * Evalúa una instancia de política ejecutando sus reglas decoradas en orden.
40
+ *
41
+ * @param policyInstance La instancia de la política a evaluar
42
+ * @param signal Optional AbortSignal para cancelar la evaluación
43
+ * @returns Una decisión sobre qué hacer con la navegación
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const decision = await evaluator.evaluate(authPolicyInstance);
48
+ *
49
+ * if (decision.type === 'skip') {
50
+ * // Esta política no opina, intentar la siguiente
51
+ * } else if (decision.type === 'allow') {
52
+ * // Permitir la navegación
53
+ * } else if (decision.type === 'block') {
54
+ * // Bloquear la navegación
55
+ * }
56
+ * ```
57
+ */
58
+ async evaluate(policyInstance, signal) {
59
+ const rules = getPolicyRules(policyInstance.constructor);
60
+ if (rules.length === 0) {
61
+ return {
62
+ type: "skip",
63
+ matched: false
64
+ };
65
+ }
66
+ for (const rule of rules) {
67
+ if (signal?.aborted) {
68
+ return {
69
+ type: "block",
70
+ matched: false
71
+ };
72
+ }
73
+ try {
74
+ const result = rule.handler.call(policyInstance);
75
+ const resolvedResult = await Promise.resolve(result);
76
+ if (!resolvedResult) {
77
+ continue;
78
+ }
79
+ if (rule.type === "skip") {
80
+ return {
81
+ type: "skip",
82
+ matched: true,
83
+ matchedRule: rule.methodName
84
+ };
85
+ }
86
+ return {
87
+ type: rule.type,
88
+ matched: true,
89
+ matchedRule: rule.methodName
90
+ };
91
+ } catch (error) {
92
+ console.error(
93
+ `Error in policy rule '${String(rule.methodName)}':`,
94
+ error
95
+ );
96
+ return {
97
+ type: "block",
98
+ matched: true,
99
+ matchedRule: rule.methodName
100
+ };
101
+ }
102
+ }
103
+ return {
104
+ type: "skip",
105
+ matched: false
106
+ };
107
+ }
108
+ /**
109
+ * Evalúa una cadena de políticas en orden hasta que una tome una decisión.
110
+ *
111
+ * Este método implementa la composición de políticas:
112
+ * - Si una política retorna 'skip' (o ninguna regla coincide), pasa a la siguiente
113
+ * - Si una política retorna 'allow', 'block', o 'redirect', se detiene y retorna esa decisión
114
+ * - Si todas las políticas hacen skip, retorna la decisión por defecto
115
+ *
116
+ * @param policyInstances Array de instancias de políticas a evaluar en orden
117
+ * @param defaultDecision La decisión a tomar si todas las políticas hacen skip (default: allow)
118
+ * @param signal Optional AbortSignal para cancelar la evaluación
119
+ * @returns La decisión tomada por la primera política que no hizo skip
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * const decision = await evaluator.evaluateChain([
124
+ * authPolicyInstance,
125
+ * featureFlagPolicyInstance,
126
+ * rolePolicyInstance
127
+ * ]);
128
+ * ```
129
+ */
130
+ async evaluateChain(policyInstances, defaultDecision = "allow", signal) {
131
+ console.log(`[PolicyEvaluator] Evaluating chain of ${policyInstances.length} policies`);
132
+ for (const policyInstance of policyInstances) {
133
+ const policyName = policyInstance.constructor.name;
134
+ console.log(`[PolicyEvaluator] Evaluating policy: ${policyName}`);
135
+ if (signal?.aborted) {
136
+ console.log("[PolicyEvaluator] Signal aborted, stopping chain evaluation");
137
+ return {
138
+ type: "block",
139
+ matched: false
140
+ };
141
+ }
142
+ const decision = await this.evaluate(policyInstance, signal);
143
+ console.log(`[PolicyEvaluator] Policy ${policyName} decision: ${decision.type}${decision.matched ? ` (matched rule: ${String(decision.matchedRule)})` : ""}`);
144
+ if (decision.type !== "skip") {
145
+ console.log(`[PolicyEvaluator] Chain stopped at policy ${policyName} with decision: ${decision.type}`);
146
+ return decision;
147
+ }
148
+ }
149
+ console.log(`[PolicyEvaluator] All policies skipped, using default decision: ${defaultDecision}`);
150
+ return {
151
+ type: defaultDecision,
152
+ matched: false
153
+ };
154
+ }
155
+ /**
156
+ * Evalúa una lista de candidatos y retorna el primero que pase las policies.
157
+ *
158
+ * Este método maneja:
159
+ * - Candidatos sin policies (permitir por defecto)
160
+ * - Instanciación de policies desde el DI container
161
+ * - Inyección de metadata
162
+ * - Evaluación secuencial hasta encontrar un allow
163
+ *
164
+ * @param candidates Lista de candidatos a evaluar
165
+ * @param signal Optional AbortSignal para cancelar
166
+ * @returns Decisión con el candidato ganador o block/redirect
167
+ */
168
+ async evaluateCandidates(candidates, signal) {
169
+ for (const candidate of candidates) {
170
+ if (signal?.aborted) {
171
+ return { type: "block", matched: false };
172
+ }
173
+ if (!candidate.policies || candidate.policies.length === 0) {
174
+ console.log(`[PolicyEvaluator] No policies for ${candidate.path}, allowing by default`);
175
+ return {
176
+ type: "allow",
177
+ matched: true,
178
+ candidate
179
+ };
180
+ }
181
+ const policyInstances = candidate.policies.map((PolicyClass) => {
182
+ const instance = this.__container.get(PolicyClass);
183
+ if (candidate.metadata) {
184
+ instance.__routeMetadata = candidate.metadata;
185
+ }
186
+ return instance;
187
+ });
188
+ const decision = await reactiveContext.untrack(async () => {
189
+ return await this.evaluateChain(policyInstances, "allow", signal);
190
+ });
191
+ if (decision.type === "allow") {
192
+ return {
193
+ ...decision,
194
+ candidate
195
+ };
196
+ }
197
+ if (decision.type === "redirect") {
198
+ return decision;
199
+ }
200
+ }
201
+ return { type: "block", matched: false };
202
+ }
203
+ }
204
+ _init = __decoratorStart();
205
+ PolicyEvaluator = __decorateElement(_init, 0, "PolicyEvaluator", _PolicyEvaluator_decorators, PolicyEvaluator);
206
+ __runInitializers(_init, 1, PolicyEvaluator);
207
+ export {
208
+ PolicyEvaluator
209
+ };
@@ -0,0 +1,56 @@
1
+ import { Router } from './router';
2
+ import { BaseComponent } from '../components/base-component';
3
+ import { IResource } from '../reactivity/signals/resource';
4
+ import { PolicyEvaluator } from './policy-evaluator';
5
+ import { RouteCandidate } from './trie.types';
6
+ export declare class RouteView extends BaseComponent {
7
+ router: Router;
8
+ policyEvaluator: PolicyEvaluator;
9
+ routeSlot?: string;
10
+ navigationLevel: number;
11
+ /**
12
+ * Contexto que mantiene el historial de slots desde la raíz hasta el nivel actual.
13
+ * Cada RouteView agrega su slot al array, preservando el historial de los padres.
14
+ *
15
+ * Ejemplo: ['@main', '@sidebar', '@panel']
16
+ *
17
+ * Los componentes pueden acceder a este array para saber:
18
+ * - En qué slot se renderizaron (último elemento)
19
+ * - Toda la cadena de slots desde la raíz
20
+ */
21
+ slotPath: string[];
22
+ /**
23
+ * Contexto que provee el patrón de ruta base desde la cual se renderiza este nivel.
24
+ * Los componentes y behaviors hijos pueden usar esta ruta base para resolver rutas relativas.
25
+ *
26
+ * Se actualiza reactivamente cuando cambian los candidatos de este nivel.
27
+ * Los hijos heredan este valor de forma reactiva (señal derivada).
28
+ *
29
+ * Ejemplo: Si este RouteView renderiza "/store/:storeId", los links hijos
30
+ * que usen "sales" se resolverán como "/store/:storeId/sales" (con params resueltos)
31
+ */
32
+ routeBasePath: string;
33
+ /**
34
+ * Computed que retorna los candidatos para este nivel de navegación,
35
+ * filtrados por el slot especificado en la prop routeSlot.
36
+ *
37
+ * Solo se re-ejecuta cuando cambian los candidatos de ESTE nivel específico.
38
+ * Esto es granularidad perfecta: cambios en otros niveles NO afectan este computed.
39
+ */
40
+ get levelCandidates(): readonly RouteCandidate[];
41
+ /**
42
+ * Effect que sincroniza routeBasePath con los candidatos actuales.
43
+ * Se ejecuta automáticamente cuando cambian los candidatos de este nivel.
44
+ *
45
+ * Si hay candidatos, actualiza routeBasePath con el path del primer candidato.
46
+ * Si no hay candidatos, mantiene el valor actual (que puede ser '/' o heredado).
47
+ */
48
+ private syncRouteBasePath;
49
+ /**
50
+ * Resource que carga el componente asociado
51
+ * SOLO cuando cambia el segmento de este nivel
52
+ * Evalúa policies de todos los candidatos y toma el primero que pase
53
+ */
54
+ componentClass: IResource<any>;
55
+ view(): any;
56
+ }
@@ -0,0 +1,156 @@
1
+ import { Fragment } from "../jsx/types.js";
2
+ import { Component } from "../components/decorators/component.js";
3
+ import { Inject } from "../DI/decorators/inject.js";
4
+ import { Router } from "./router.js";
5
+ import { BaseComponent } from "../components/base-component.js";
6
+ import { Ctx } from "../reactivity/decorators/ctx.js";
7
+ import { Prop } from "../components/decorators/prop.js";
8
+ import { Resource } from "../reactivity/decorators/resource.js";
9
+ import { Computed } from "../reactivity/decorators/computed.js";
10
+ import { Effect } from "../reactivity/decorators/effect.js";
11
+ import { Show } from "../custom-components/show.js";
12
+ import { PolicyEvaluator } from "./policy-evaluator.js";
13
+ var __create = Object.create;
14
+ var __defProp = Object.defineProperty;
15
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
16
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
17
+ var __typeError = (msg) => {
18
+ throw TypeError(msg);
19
+ };
20
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
21
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
22
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
23
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
24
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
25
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
26
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
27
+ var __runInitializers = (array, flags, self, value) => {
28
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++)
29
+ flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
30
+ return value;
31
+ };
32
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
33
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
34
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
35
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
36
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
37
+ return __privateGet(this, extra);
38
+ }, set [name](x) {
39
+ return __privateSet(this, extra, x);
40
+ } }, name));
41
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
42
+ for (var i = decorators.length - 1; i >= 0; i--) {
43
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
44
+ if (k) {
45
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
46
+ if (k ^ 3)
47
+ access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
48
+ if (k > 2)
49
+ access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
50
+ }
51
+ 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;
52
+ if (k ^ 4 || it === void 0)
53
+ __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
54
+ else if (typeof it !== "object" || it === null)
55
+ __typeError("Object expected");
56
+ else
57
+ __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
58
+ }
59
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
60
+ };
61
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
62
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
63
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
64
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
65
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
66
+ var _componentClass_dec, _syncRouteBasePath_dec, _levelCandidates_dec, _routeBasePath_dec, _slotPath_dec, _navigationLevel_dec, _routeSlot_dec, _policyEvaluator_dec, _router_dec, _a, _RouteView_decorators, _init;
67
+ const EMPTY_ARRAY = [];
68
+ _RouteView_decorators = [Component()];
69
+ class RouteView extends (_a = BaseComponent, _router_dec = [Inject(Router)], _policyEvaluator_dec = [Inject(PolicyEvaluator)], _routeSlot_dec = [Prop], _navigationLevel_dec = [Ctx((v) => v === void 0 ? 0 : v + 1)], _slotPath_dec = [Ctx((parentSlots, self) => {
70
+ const slots = parentSlots ? [...parentSlots] : [];
71
+ if (self.routeSlot) {
72
+ slots.push(self.routeSlot);
73
+ }
74
+ return slots;
75
+ })], _routeBasePath_dec = [Ctx()], _levelCandidates_dec = [Computed], _syncRouteBasePath_dec = [Effect], _componentClass_dec = [Resource(async function(signal) {
76
+ try {
77
+ const candidates = this.levelCandidates;
78
+ if (!candidates || candidates.length === 0) {
79
+ return null;
80
+ }
81
+ const decision = await this.policyEvaluator.evaluateCandidates(candidates, signal);
82
+ if (!decision.candidate) {
83
+ console.log("[RouteView] No candidate passed policy evaluation");
84
+ return null;
85
+ }
86
+ const candidate = decision.candidate;
87
+ const module = await candidate.loader(signal);
88
+ if (module?.default) {
89
+ return module.default;
90
+ }
91
+ } catch (err) {
92
+ console.error("[RouteView] Error loading component:", err);
93
+ }
94
+ return null;
95
+ })], _a) {
96
+ constructor() {
97
+ super(...arguments);
98
+ __runInitializers(_init, 5, this);
99
+ this.router = __runInitializers(_init, 8, this), __runInitializers(_init, 11, this);
100
+ this.policyEvaluator = __runInitializers(_init, 12, this), __runInitializers(_init, 15, this);
101
+ this.routeSlot = __runInitializers(_init, 16, this), __runInitializers(_init, 19, this);
102
+ this.navigationLevel = __runInitializers(_init, 20, this), __runInitializers(_init, 23, this);
103
+ this.slotPath = __runInitializers(_init, 24, this), __runInitializers(_init, 27, this);
104
+ this.routeBasePath = __runInitializers(_init, 28, this, "/"), __runInitializers(_init, 31, this);
105
+ this.componentClass = __runInitializers(_init, 32, this), __runInitializers(_init, 35, this);
106
+ }
107
+ get levelCandidates() {
108
+ const level = this.navigationLevel;
109
+ const candidates = this.router.$routeCandidates[level];
110
+ if (candidates === void 0) {
111
+ return EMPTY_ARRAY;
112
+ }
113
+ if (!candidates || candidates.length === 0) {
114
+ return EMPTY_ARRAY;
115
+ }
116
+ const filtered = candidates.filter((candidate) => {
117
+ if (!this.routeSlot) {
118
+ return !candidate.slot;
119
+ }
120
+ return candidate.slot === this.routeSlot;
121
+ });
122
+ return filtered.length > 0 ? filtered : EMPTY_ARRAY;
123
+ }
124
+ syncRouteBasePath() {
125
+ const candidates = this.levelCandidates;
126
+ if (candidates && candidates.length > 0) {
127
+ this.routeBasePath = candidates[0].path;
128
+ }
129
+ }
130
+ view() {
131
+ return /* @__PURE__ */ this.jsxs(Fragment, { children: [
132
+ /* @__PURE__ */ this.jsx(Show, { when: () => this.componentClass.state === "pending", children: () => /* @__PURE__ */ this.jsx("div", { children: "Cargando..." }) }),
133
+ /* @__PURE__ */ this.jsx(Show, { when: () => this.componentClass.state === "error", children: () => /* @__PURE__ */ this.jsxs("div", { children: [
134
+ "Error al cargar la página:",
135
+ " ",
136
+ () => this.componentClass.error
137
+ ] }) }),
138
+ /* @__PURE__ */ this.jsx(Show, { when: () => this.componentClass.state === "ready", children: () => this.jsx(this.componentClass.get() ?? null, {}) })
139
+ ] });
140
+ }
141
+ }
142
+ _init = __decoratorStart(_a);
143
+ __decorateElement(_init, 2, "levelCandidates", _levelCandidates_dec, RouteView);
144
+ __decorateElement(_init, 1, "syncRouteBasePath", _syncRouteBasePath_dec, RouteView);
145
+ __decorateElement(_init, 5, "router", _router_dec, RouteView);
146
+ __decorateElement(_init, 5, "policyEvaluator", _policyEvaluator_dec, RouteView);
147
+ __decorateElement(_init, 5, "routeSlot", _routeSlot_dec, RouteView);
148
+ __decorateElement(_init, 5, "navigationLevel", _navigationLevel_dec, RouteView);
149
+ __decorateElement(_init, 5, "slotPath", _slotPath_dec, RouteView);
150
+ __decorateElement(_init, 5, "routeBasePath", _routeBasePath_dec, RouteView);
151
+ __decorateElement(_init, 5, "componentClass", _componentClass_dec, RouteView);
152
+ RouteView = __decorateElement(_init, 0, "RouteView", _RouteView_decorators, RouteView);
153
+ __runInitializers(_init, 1, RouteView);
154
+ export {
155
+ RouteView
156
+ };
@@ -0,0 +1,67 @@
1
+ import { Trie } from './trie';
2
+ import { LifeCycle } from '../DI/lifecycle';
3
+ import { PolicyEvaluator } from './policy-evaluator';
4
+ import { Constructor } from '../DI/types';
5
+ import { RouteCandidate } from './trie.types';
6
+ /**
7
+ * Interfaz para rutas generadas por el plugin de Vite
8
+ */
9
+ export interface GeneratedRoute {
10
+ id: string;
11
+ path: string;
12
+ className: string;
13
+ loader: (signal?: AbortSignal) => Promise<{
14
+ default: any;
15
+ }>;
16
+ metadata?: Record<string, any>;
17
+ policies?: Constructor<any>[];
18
+ slot?: string;
19
+ }
20
+ export declare class Router implements LifeCycle {
21
+ pathname: string;
22
+ search: string;
23
+ get currentPath(): string;
24
+ get activePatterns(): string[];
25
+ routeTrie: Trie;
26
+ policyEvaluator: PolicyEvaluator;
27
+ $params: Record<string, string>;
28
+ $queryParams: Record<string, string>;
29
+ $routeCandidates: RouteCandidate[][];
30
+ private hasInitialized;
31
+ private routesLoaded;
32
+ constructor();
33
+ onBootstrap(): Promise<void>;
34
+ private syncRouteParams;
35
+ private syncQueryParams;
36
+ private syncRouteCandidates;
37
+ /**
38
+ * Compara dos arrays de candidatos para determinar si son iguales
39
+ * Usa comparación por id para determinar identidad
40
+ */
41
+ private candidatesAreEqual;
42
+ /**
43
+ * Fuerza la re-evaluación de todos los route candidates
44
+ * recalculando los candidatos desde el Trie.
45
+ *
46
+ * Esto hace que todos los RouteView detecten el cambio y re-ejecuten
47
+ * sus Resources, incluyendo la evaluación de policies.
48
+ *
49
+ * Útil después de cambios de estado que afectan autorización (ej: OAuth login)
50
+ */
51
+ private revalidateRouteCandidates;
52
+ navigate(to: string, options?: {
53
+ revalidate?: boolean;
54
+ replace?: boolean;
55
+ external?: 'allow' | 'block' | 'native';
56
+ }): void;
57
+ /**
58
+ * Carga las rutas generadas por el plugin de Vite
59
+ * Intenta múltiples rutas posibles donde el archivo puede estar generado
60
+ */
61
+ private loadGeneratedRoutes;
62
+ /**
63
+ * Registra un array de rutas generadas en el Trie
64
+ * @param routes Array de rutas generadas por el plugin
65
+ */
66
+ registerGeneratedRoutes(routes: GeneratedRoute[]): void;
67
+ }