@cullet/erp-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/KIT_CONTEXT.md +39 -0
  2. package/README.md +110 -0
  3. package/dist/errors/index.d.ts +2 -0
  4. package/dist/errors/index.js +3 -0
  5. package/dist/exceptions/validation-field.d.ts +2 -0
  6. package/dist/exceptions/validation-field.js +2 -0
  7. package/dist/gate-engine-registry.js +260 -0
  8. package/dist/gate-engine-registry.js.map +1 -0
  9. package/dist/gate-types.d.ts +307 -0
  10. package/dist/gate-v1-payload.schema.js +677 -0
  11. package/dist/gate-v1-payload.schema.js.map +1 -0
  12. package/dist/index.d.ts +88 -0
  13. package/dist/index.js +153 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/outcome.js +92 -0
  16. package/dist/outcome.js.map +1 -0
  17. package/dist/parse-gate-payload.d.ts +136 -0
  18. package/dist/policies/engines/index.d.ts +3 -0
  19. package/dist/policies/engines/index.js +2 -0
  20. package/dist/policies/engines/v1/gate/index.d.ts +115 -0
  21. package/dist/policies/engines/v1/gate/index.js +84 -0
  22. package/dist/policies/engines/v1/gate/index.js.map +1 -0
  23. package/dist/policies/index.d.ts +4 -0
  24. package/dist/policies/index.js +5 -0
  25. package/dist/policy-service.d.ts +541 -0
  26. package/dist/policy-service.js +992 -0
  27. package/dist/policy-service.js.map +1 -0
  28. package/dist/validation-code.js +210 -0
  29. package/dist/validation-code.js.map +1 -0
  30. package/dist/validation-error.d.ts +686 -0
  31. package/dist/validation-error.js +757 -0
  32. package/dist/validation-error.js.map +1 -0
  33. package/dist/validation-field.d.ts +12 -0
  34. package/dist/validation-field.js +23 -0
  35. package/dist/validation-field.js.map +1 -0
  36. package/meta.json +66 -0
  37. package/package.json +59 -0
  38. package/src/core/application/commands/command.ts +28 -0
  39. package/src/core/application/commands/index.ts +2 -0
  40. package/src/core/application/commands/requested-by.ts +97 -0
  41. package/src/core/application/index.ts +31 -0
  42. package/src/core/application/policy-error-mapper.ts +60 -0
  43. package/src/core/application/ports/index.ts +14 -0
  44. package/src/core/application/ports/logger.port.ts +10 -0
  45. package/src/core/application/ports/metrics.port.ts +9 -0
  46. package/src/core/application/ports/policy-port.ts +20 -0
  47. package/src/core/application/ports/repository.port.ts +7 -0
  48. package/src/core/application/ports/temporal-repository.port.ts +14 -0
  49. package/src/core/application/ports/tracer.port.ts +16 -0
  50. package/src/core/application/queries/index.ts +2 -0
  51. package/src/core/application/queries/query.ts +53 -0
  52. package/src/core/application/temporal/index.ts +11 -0
  53. package/src/core/application/temporal/temporal-context.ts +41 -0
  54. package/src/core/application/temporal/temporal-use-case.ts +41 -0
  55. package/src/core/application/use-case.ts +24 -0
  56. package/src/core/config/core-config.instance.ts +14 -0
  57. package/src/core/config/core-config.ts +87 -0
  58. package/src/core/config/index.ts +12 -0
  59. package/src/core/config/policy-reporter.ts +60 -0
  60. package/src/core/config/silent-policy-reporter.ts +5 -0
  61. package/src/core/domain/entity.ts +69 -0
  62. package/src/core/domain/rulesets/entity-ruleset.contracts.ts +16 -0
  63. package/src/core/domain/rulesets/ruleset-registry.ts +71 -0
  64. package/src/core/domain/rulesets/ruleset.contracts.ts +15 -0
  65. package/src/core/domain/rulesets/value-object-ruleset.contracts.ts +13 -0
  66. package/src/core/domain/temporal/index.ts +18 -0
  67. package/src/core/domain/temporal/temporal-range.ts +53 -0
  68. package/src/core/domain/temporal/temporal-snapshot.ts +47 -0
  69. package/src/core/domain/temporal/transaction-time.ts +60 -0
  70. package/src/core/domain/temporal/valid-time.ts +57 -0
  71. package/src/core/domain/value-object.ts +30 -0
  72. package/src/core/errors/app-error.ts +85 -0
  73. package/src/core/errors/authentication-error.ts +171 -0
  74. package/src/core/errors/authorization-error.ts +204 -0
  75. package/src/core/errors/business-rule-violation-error.ts +28 -0
  76. package/src/core/errors/conflict-error.ts +246 -0
  77. package/src/core/errors/error-codes.ts +60 -0
  78. package/src/core/errors/idempotency-error.ts +372 -0
  79. package/src/core/errors/index.ts +99 -0
  80. package/src/core/errors/integration-error.ts +157 -0
  81. package/src/core/errors/legacy-incompatible-error.ts +26 -0
  82. package/src/core/errors/not-found-error.ts +27 -0
  83. package/src/core/errors/serialization-error.ts +233 -0
  84. package/src/core/errors/temporal-error.ts +145 -0
  85. package/src/core/errors/types.ts +74 -0
  86. package/src/core/errors/unexpected-error.ts +22 -0
  87. package/src/core/errors/utils/index.ts +4 -0
  88. package/src/core/errors/utils/json-safe.ts +93 -0
  89. package/src/core/errors/validation-error.ts +34 -0
  90. package/src/core/exceptions/business-rule-violation-exception.ts +12 -0
  91. package/src/core/exceptions/domain-exception.ts +9 -0
  92. package/src/core/exceptions/entity-not-found-exception.ts +12 -0
  93. package/src/core/exceptions/invalid-state-transition-exception.ts +15 -0
  94. package/src/core/exceptions/invariant-violation-exception.ts +9 -0
  95. package/src/core/exceptions/validation-code.ts +39 -0
  96. package/src/core/exceptions/validation-exception.ts +39 -0
  97. package/src/core/exceptions/validation-field.ts +32 -0
  98. package/src/core/index.ts +15 -0
  99. package/src/core/policies/asof/asof.ts +68 -0
  100. package/src/core/policies/asof/index.ts +2 -0
  101. package/src/core/policies/catalog/catalog-types.ts +12 -0
  102. package/src/core/policies/catalog/catalog.instance.ts +21 -0
  103. package/src/core/policies/catalog/index.ts +11 -0
  104. package/src/core/policies/catalog/policy-catalog-entry.ts +220 -0
  105. package/src/core/policies/catalog/policy-catalog.ts +124 -0
  106. package/src/core/policies/catalog/policy-key.ts +78 -0
  107. package/src/core/policies/context/context-builder.ts +391 -0
  108. package/src/core/policies/context/context-registry.instance.ts +26 -0
  109. package/src/core/policies/context/context-registry.ts +95 -0
  110. package/src/core/policies/context/context-resolver.ts +31 -0
  111. package/src/core/policies/context/context-seed.ts +32 -0
  112. package/src/core/policies/context/index.ts +21 -0
  113. package/src/core/policies/context/path.ts +152 -0
  114. package/src/core/policies/defs/in-memory-policy-definition-repo.ts +73 -0
  115. package/src/core/policies/defs/index.ts +20 -0
  116. package/src/core/policies/defs/policy-definition-repository.ts +8 -0
  117. package/src/core/policies/defs/policy-definition.ts +192 -0
  118. package/src/core/policies/defs/policy-payload.contracts.ts +13 -0
  119. package/src/core/policies/defs/policy-scope.ts +53 -0
  120. package/src/core/policies/defs/policy-semver.ts +83 -0
  121. package/src/core/policies/engines/compute-engine-registry.ts +57 -0
  122. package/src/core/policies/engines/compute-evaluator-registry.ts +28 -0
  123. package/src/core/policies/engines/compute-payload.ts +5 -0
  124. package/src/core/policies/engines/compute-registry.ts +67 -0
  125. package/src/core/policies/engines/compute-types.ts +51 -0
  126. package/src/core/policies/engines/condition-evaluator-reporter.ts +34 -0
  127. package/src/core/policies/engines/gate-engine-registry.ts +38 -0
  128. package/src/core/policies/engines/gate-payload.ts +5 -0
  129. package/src/core/policies/engines/gate-types.ts +63 -0
  130. package/src/core/policies/engines/index.ts +48 -0
  131. package/src/core/policies/engines/parse-compute-payload.ts +71 -0
  132. package/src/core/policies/engines/parse-gate-payload.ts +68 -0
  133. package/src/core/policies/engines/v1/compute/compute-engine-v1.ts +55 -0
  134. package/src/core/policies/engines/v1/compute/compute-payload.schema.ts +75 -0
  135. package/src/core/policies/engines/v1/compute/index.ts +12 -0
  136. package/src/core/policies/engines/v1/compute/resolve-decision-table-v1.ts +54 -0
  137. package/src/core/policies/engines/v1/condition-evaluator.ts +592 -0
  138. package/src/core/policies/engines/v1/condition-schema.ts +50 -0
  139. package/src/core/policies/engines/v1/condition-types.ts +41 -0
  140. package/src/core/policies/engines/v1/gate/gate-engine-v1.ts +157 -0
  141. package/src/core/policies/engines/v1/gate/gate-types-v1.ts +12 -0
  142. package/src/core/policies/engines/v1/gate/gate-v1-payload.schema.ts +46 -0
  143. package/src/core/policies/engines/v1/gate/index.ts +9 -0
  144. package/src/core/policies/engines/v1/index.ts +13 -0
  145. package/src/core/policies/index.ts +132 -0
  146. package/src/core/policies/package/policy-package.ts +17 -0
  147. package/src/core/policies/policy-ids.ts +60 -0
  148. package/src/core/policies/resolver/index.ts +1 -0
  149. package/src/core/policies/resolver/policy-resolver.ts +57 -0
  150. package/src/core/policies/service/index.ts +10 -0
  151. package/src/core/policies/service/policy-evaluation-error.ts +148 -0
  152. package/src/core/policies/service/policy-service.ts +493 -0
  153. package/src/core/policies/utils/date.ts +7 -0
  154. package/src/core/policies/utils/hash.ts +90 -0
  155. package/src/core/policies/utils/index.ts +3 -0
  156. package/src/core/policies/utils/result.ts +4 -0
  157. package/src/core/result/outcome.ts +158 -0
  158. package/src/core/result/result.ts +153 -0
  159. package/src/core/shared/aggregate-version.ts +11 -0
  160. package/src/core/shared/hashing.ts +38 -0
  161. package/src/core/shared/immutable.ts +46 -0
  162. package/src/core/shared/temporal-guards.ts +22 -0
  163. package/src/core/versioning/domain-event-contracts.ts +73 -0
  164. package/src/core/versioning/version.ts +34 -0
  165. package/src/errors/index.ts +1 -0
  166. package/src/examples/rulesets/entity/order-creation-rules-v1.ts +31 -0
  167. package/src/examples/rulesets/entity/order-invariants-v1.ts +48 -0
  168. package/src/examples/rulesets/entity/order-invariants-v2.ts +28 -0
  169. package/src/examples/rulesets/entity/order.ts +162 -0
  170. package/src/examples/rulesets/value-object/cpf-rules-v1.ts +52 -0
  171. package/src/examples/rulesets/value-object/cpf-rules-v2.ts +27 -0
  172. package/src/examples/rulesets/value-object/cpf.ts +37 -0
  173. package/src/examples/rulesets/value-object/customer.ts +67 -0
  174. package/src/examples/rulesets/value-object/person-name-rules-v1.ts +37 -0
  175. package/src/examples/rulesets/value-object/person-name-rules-v2.ts +27 -0
  176. package/src/examples/rulesets/value-object/person-name.ts +39 -0
  177. package/src/exceptions/validation-field.ts +1 -0
  178. package/src/index.ts +11 -0
  179. package/src/policies/engines/index.ts +1 -0
  180. package/src/policies/engines/v1/gate/index.ts +1 -0
  181. package/src/policies/index.ts +1 -0
  182. package/src/version.ts +7 -0
package/KIT_CONTEXT.md ADDED
@@ -0,0 +1,39 @@
1
+ # erp-core — KIT_CONTEXT
2
+
3
+ ## [purpose] Propósito
4
+
5
+ Núcleo arquitetural para sistemas ERP (e domínios transacionais com temporalidade). Resolve o problema de começar um core de negócio com entidades, value objects, policies, tratamento de erros e services de aplicação já desenhados em clean architecture, sem amarrar a framework.
6
+
7
+ ## [layers] Camadas
8
+
9
+ - **`domain/`** — `Entity`, `ValueObject`. Pura: zero dependência de runtime externo. Invariantes lançam exceções tipadas.
10
+ - **`exceptions/`** — hierarquia de exceções de domínio (`DomainException`, `InvariantViolationException`, `InvalidStateTransitionException`, `ValidationException`, `BusinessRuleViolationException`, `EntityNotFoundException`).
11
+ - **`errors/`** — erros de aplicação (`AppError` e descendentes: `ValidationError`, `NotFoundError`, `ConflictError`, `AuthorizationError`, `IntegrationError`, etc.). Carregam `code` discriminado.
12
+ - **`result/`** — `Result<T, E>` e `Outcome` para retorno tipado da camada de aplicação.
13
+ - **`application/`** — `UseCase` base, `commands/`, `queries/`, `ports/`. Casos de uso consomem portas e retornam `Result`.
14
+ - **`policies/`** — catálogo, definições, resolução e avaliação de policies declarativas.
15
+ - **`versioning/`** — utilidades de versionamento de agregados temporais.
16
+
17
+ ## [key-decisions] Decisões-chave
18
+
19
+ - **Domínio lança, aplicação retorna `Result`, infra traduz.** Não há `Result` no domínio.
20
+ - **Sem lib de log/observabilidade no runtime.** Portas vivem em `application/ports/`; adapters são opt-in.
21
+ - **Temporalidade interna ao kit** — o kit mantém suporte temporal no código-base, mas a API pública principal nao publica um `Timeline<T>` nem helpers temporais dedicados no barrel raiz.
22
+ - **Policies como dados**, não como if-statements: avaliáveis, compostas, serializáveis.
23
+ - **Policies permitem disable sem remover código**: `PolicyDefinition` aceita `enabled: false` e o repositório ignora definições desabilitadas.
24
+ - **Composição isolada é de primeira classe**: use `new CoreConfig()`, `new ContextResolverRegistry()` e `registerNamespacedContextResolversIn(...)` quando precisar evitar singletons compartilhados.
25
+
26
+ ## [extension-points] Pontos de extensão
27
+
28
+ Implemente as portas em `application/ports/` para conectar a stack real:
29
+
30
+ - `LoggerPort`, `MetricsPort`, `TracerPort` — observabilidade.
31
+ - Repositórios específicos do seu domínio, sempre com verbo mínimo.
32
+ - `AuthorizerPort` / `AuthenticatorPort` quando aplicável.
33
+
34
+ ## [non-goals] Não-objetivos
35
+
36
+ - **Não é ORM.** Nenhuma mágica de mapeamento, nenhum decorator de persistência.
37
+ - **Não é framework HTTP.** Não fornece controllers, roteamento, middleware.
38
+ - **Não é runtime de workflow.** Sagas, schedulers, filas: fora do escopo — devem ser kits separados.
39
+ - **Não impõe stack de teste.** As specs usam Vitest aqui, mas o desenho não depende disso.
package/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # erp-core
2
+
3
+ Núcleo arquitetural para sistemas ERP e domínios transacionais. Primitives tipadas para domínio, policies, erros e application services com clean architecture pronta para receber adapters.
4
+
5
+ Para o sumário prompt-friendly veja [`KIT_CONTEXT.md`](./KIT_CONTEXT.md). Para os contratos comuns a todos os kits veja a [`PHILOSOPHY.md`](../../../../PHILOSOPHY.md).
6
+
7
+ ---
8
+
9
+ ## O que entrega
10
+
11
+ - **Domínio** — `Entity`, `ValueObject`.
12
+ - **Exceções de domínio** — `DomainException`, `InvariantViolationException`, `InvalidStateTransitionException`, `ValidationException`, `BusinessRuleViolationException`, `EntityNotFoundException`.
13
+ - **Erros de aplicação** — `AppError` discriminada por `code`: `ValidationError`, `NotFoundError`, `ConflictError`, `AuthorizationError`, `IntegrationError`.
14
+ - **Result** — `Result<T, E>` e `Outcome` para retorno tipado da aplicação.
15
+ - **Policies** — `PolicyCatalog`, `PolicyDefinition`, `PolicyResolver`, `PolicyService` e tipos associados para avaliação declarativa.
16
+ - **Application** — portas de observabilidade (`LoggerPort`, `MetricsPort`, `TracerPort`) e `mapPolicyEvaluationError` para integrar a camada de aplicação.
17
+ - **Exemplos** — rulesets de referência em `examples/rulesets/`, fora da superfície principal de domínio.
18
+
19
+ ## Como começa
20
+
21
+ Import direto (sempre a versão `latest` exportada pelo pacote):
22
+
23
+ ```ts
24
+ import {
25
+ Entity,
26
+ ValueObject,
27
+ PolicyCatalog,
28
+ PolicyService,
29
+ mapPolicyEvaluationError,
30
+ type PolicyDecision,
31
+ } from "@cullet/erp-core";
32
+ ```
33
+
34
+ Pinado em uma versão (recomendado em produção): fixe a versão npm do pacote no
35
+ seu `package.json` (ex.: `"@cullet/erp-core": "1.0.0"`).
36
+
37
+ ```ts
38
+ import { PolicyResolver } from "@cullet/erp-core";
39
+ ```
40
+
41
+ Full-control (kit copiado para dentro do projeto, livre para editar):
42
+
43
+ ```bash
44
+ npx cullet fc @cullet/erp-core@1.0.0
45
+ ```
46
+
47
+ ## Composicao sem singletons
48
+
49
+ Para isolamento por tenant, request ou teste, prefira instancias locais em vez
50
+ dos exports globais `coreConfig` e `contextResolverRegistry`:
51
+
52
+ ```ts
53
+ import {
54
+ ComputeRegistry,
55
+ ContextResolverRegistry,
56
+ CoreConfig,
57
+ GateEngineRegistry,
58
+ PolicyContextBuilder,
59
+ Result,
60
+ registerNamespacedContextResolversIn,
61
+ } from "@cullet/erp-core";
62
+ import { GateEngineV1 } from "@cullet/erp-core/policies/engines/v1/gate";
63
+
64
+ const coreConfig = new CoreConfig({
65
+ observability: { reporter },
66
+ });
67
+
68
+ const resolverRegistry = new ContextResolverRegistry();
69
+ registerNamespacedContextResolversIn(resolverRegistry, "billing", [
70
+ {
71
+ path: "student.contractStatus",
72
+ resilience: {
73
+ timeoutMs: 200,
74
+ retry: { maxAttempts: 3, initialDelayMs: 25, maxDelayMs: 100 },
75
+ circuitBreaker: { failureThreshold: 5, cooldownMs: 1_000 },
76
+ },
77
+ async resolve(seed) {
78
+ return Result.ok(seed.fields.contractStatus);
79
+ },
80
+ },
81
+ ]);
82
+
83
+ const contextBuilder = new PolicyContextBuilder(resolverRegistry);
84
+
85
+ const gateEngines = new GateEngineRegistry();
86
+ gateEngines.register(new GateEngineV1({ coreConfig }));
87
+
88
+ const computeRegistry = new ComputeRegistry({ coreConfig });
89
+ ```
90
+
91
+ Os singletons continuam disponiveis para apps simples, mas nao sao o caminho
92
+ recomendado quando ha risco de bleed entre composicoes concorrentes.
93
+
94
+ ## Decisões tomadas
95
+
96
+ - **Modelo de erro `mixed`**: domínio lança `DomainException`, aplicação retorna `Result<T, AppError>`, infra traduz para `Result`. Não cruze a fronteira.
97
+ - **Temporalidade interna ao kit**: o suporte temporal continua no código do kit, mas a API pública principal não expõe um container `Timeline<T>` nem helpers temporais dedicados no barrel raiz.
98
+ - **Policies como dados**: catalogadas, resolvidas e avaliadas por `PolicyCatalog`, `PolicyResolver` e `PolicyService`. Não são `if`s espalhados pela aplicação.
99
+ - **Disable first-class para definitions**: `PolicyDefinition` aceita `enabled: false` para desligar uma definicao sem removê-la do repositório; o default continua `true`.
100
+ - **Observabilidade só via portas**: `LoggerPort`, `MetricsPort`, `TracerPort` em `core/application/ports/`. Sem dependência runtime de `pino`, `winston`, OpenTelemetry no kit.
101
+ - **Dependência runtime declarada**: `zod` (validação tipada). Em modo full-control, instale manualmente — o `cullet doctor` e o `cullet fc` te avisam.
102
+
103
+ ## Como evoluir
104
+
105
+ - **Novos use cases**: criar em `core/application/` consumindo portas existentes; nunca importar de `adapters/`.
106
+ - **Novas portas**: interface em `core/application/ports/`, implementação em `adapters/<lib>/`, sem vazar tipos da lib externa.
107
+ - **Novas exceções de domínio**: derive de `DomainException` em `core/exceptions/`.
108
+ - **Novos erros de aplicação**: derive de `AppError` e adicione o `code` discriminado em `core/errors/`.
109
+ - **Mudança incompatível**: abra `versions/2.0.0/`. Regras em [`kits/VERSIONING.md`](../../../../kits/VERSIONING.md).
110
+ - **Antes de publicar**: `npm run validate-kits` para garantir aderência à filosofia.
@@ -0,0 +1,2 @@
1
+ import { $ as ErrorCodes, A as IdempotencyPayloadMismatchError, B as UniqueConstraintViolation, C as IntegrationErrorMetadata, D as IdempotencyFailureKind, E as IdempotencyErrorMetadata, F as AlreadyExistsError, G as AuthorizationErrorMetadata, H as translateUniqueViolationToDuplicate, I as ConflictError, J as AuthenticationError, K as AuthorizationErrorReason, L as ConflictErrorMetadata, M as payloadHash, N as sha256Hex, O as IdempotencyInProgressError, P as stableStringify, Q as assertJsonSafeMetadata, R as ConflictKind, S as IntegrationError, T as IdempotencyError, U as BusinessRuleViolationError, V as UniqueConstraintViolationError, W as AuthorizationError, X as AuthenticationErrorReason, Y as AuthenticationErrorMetadata, Z as AppError, _ as SerializationMessages, a as TemporalError, at as JsonSafeValue, b as NotFoundError, c as TemporalPrecision, d as SerializationCodes, et as serializationErrorCode, f as SerializationDirection, g as SerializationInError, h as SerializationFailureCategory, i as NotYetValidError, it as JsonSafeRecord, j as IdempotencyReplayNotSupportedError, k as IdempotencyKeyMissingError, l as evaluateTemporalWindow, m as SerializationErrorMetadata, n as UnexpectedError, nt as ErrorSeverity, o as TemporalErrorMetadata, p as SerializationError, q as AuthorizationRequirement, r as ExpiredError, rt as JsonSafePrimitive, s as TemporalKind, t as ValidationError, tt as AppErrorOptions, u as SerializationBoundary, v as SerializationOutError, w as IntegrationErrorReason, x as LegacyIncompatibleError, y as safePreview, z as DuplicateError } from "../validation-error.js";
2
+ export { AlreadyExistsError, AppError, AppErrorOptions, AuthenticationError, AuthenticationErrorMetadata, AuthenticationErrorReason, AuthorizationError, AuthorizationErrorMetadata, AuthorizationErrorReason, AuthorizationRequirement, BusinessRuleViolationError, ConflictError, ConflictErrorMetadata, ConflictKind, SerializationInError as DeserializationError, SerializationInError, DuplicateError, ErrorCodes, ErrorSeverity, ExpiredError, TemporalErrorMetadata as ExpiredErrorMetadata, TemporalErrorMetadata, TemporalPrecision as ExpiredErrorPrecision, TemporalPrecision, IdempotencyError, IdempotencyErrorMetadata, IdempotencyFailureKind, IdempotencyInProgressError, IdempotencyKeyMissingError, IdempotencyPayloadMismatchError, IdempotencyReplayNotSupportedError, IntegrationError, IntegrationErrorMetadata, IntegrationErrorReason, JsonSafePrimitive, JsonSafeRecord, JsonSafeValue, LegacyIncompatibleError, NotFoundError, NotYetValidError, SerializationBoundary, SerializationCodes, SerializationDirection, SerializationError, SerializationErrorMetadata, SerializationFailureCategory, SerializationMessages, SerializationOutError, TemporalError, TemporalKind, UnexpectedError, UniqueConstraintViolation, UniqueConstraintViolationError, ValidationError, assertJsonSafeMetadata, evaluateTemporalWindow, payloadHash, safePreview, serializationErrorCode, sha256Hex, stableStringify, translateUniqueViolationToDuplicate };
@@ -0,0 +1,3 @@
1
+ import { a as stableStringify, c as ErrorCodes, i as sha256Hex, l as serializationErrorCode, n as UnexpectedError, o as AppError, r as payloadHash, s as assertJsonSafeMetadata } from "../validation-code.js";
2
+ import { C as UniqueConstraintViolationError, D as AuthenticationError, E as AuthorizationError, S as DuplicateError, T as BusinessRuleViolationError, _ as IdempotencyKeyMissingError, a as evaluateTemporalWindow, b as AlreadyExistsError, c as SerializationInError, d as safePreview, f as NotFoundError, g as IdempotencyInProgressError, h as IdempotencyError, i as TemporalError, l as SerializationMessages, m as IntegrationError, n as ExpiredError, o as SerializationCodes, p as LegacyIncompatibleError, r as NotYetValidError, s as SerializationError, t as ValidationError, u as SerializationOutError, v as IdempotencyPayloadMismatchError, w as translateUniqueViolationToDuplicate, x as ConflictError, y as IdempotencyReplayNotSupportedError } from "../validation-error.js";
3
+ export { AlreadyExistsError, AppError, AuthenticationError, AuthorizationError, BusinessRuleViolationError, ConflictError, SerializationInError as DeserializationError, SerializationInError, DuplicateError, ErrorCodes, ExpiredError, IdempotencyError, IdempotencyInProgressError, IdempotencyKeyMissingError, IdempotencyPayloadMismatchError, IdempotencyReplayNotSupportedError, IntegrationError, LegacyIncompatibleError, NotFoundError, NotYetValidError, SerializationCodes, SerializationError, SerializationMessages, SerializationOutError, TemporalError, UnexpectedError, UniqueConstraintViolationError, ValidationError, assertJsonSafeMetadata, evaluateTemporalWindow, payloadHash, safePreview, serializationErrorCode, sha256Hex, stableStringify, translateUniqueViolationToDuplicate };
@@ -0,0 +1,2 @@
1
+ import { t as ValidationField } from "../validation-field.js";
2
+ export { ValidationField };
@@ -0,0 +1,2 @@
1
+ import { t as ValidationField } from "../validation-field.js";
2
+ export { ValidationField };
@@ -0,0 +1,260 @@
1
+ import { a as conditionNodeSchema, l as Result, r as ConditionEvaluatorV1, t as GatePayloadSchemaV1, u as coreConfig } from "./gate-v1-payload.schema.js";
2
+ import { z } from "zod";
3
+ //#region src/core/policies/engines/v1/compute/compute-payload.schema.ts
4
+ const computeDecisionTableRuleSchema = z.object({
5
+ conditions: conditionNodeSchema,
6
+ result: z.unknown()
7
+ });
8
+ var ComputePayloadSchemaV1 = class ComputePayloadSchemaV1 {
9
+ static {
10
+ this.schema = z.union([z.object({
11
+ type: z.literal("decision-table"),
12
+ rules: z.array(computeDecisionTableRuleSchema).min(1),
13
+ default: z.unknown()
14
+ }).strict(), z.object({
15
+ type: z.literal("params"),
16
+ data: z.record(z.string(), z.unknown())
17
+ }).strict()]);
18
+ }
19
+ static parse(payload) {
20
+ const parsed = ComputePayloadSchemaV1.schema.safeParse(payload);
21
+ if (!parsed.success) {
22
+ const details = parsed.error.issues.map((issue) => {
23
+ const path = issue.path.join(".");
24
+ return path.length > 0 ? `${path}: ${issue.message}` : issue.message;
25
+ }).join("; ");
26
+ return Result.err(`Invalid compute payload: ${details}`);
27
+ }
28
+ return Result.ok(parsed.data);
29
+ }
30
+ };
31
+ ComputePayloadSchemaV1.schema;
32
+ //#endregion
33
+ //#region src/core/policies/engines/parse-compute-payload.ts
34
+ var ComputePayloadParserRegistry = class {
35
+ constructor() {
36
+ this.parsers = /* @__PURE__ */ new Map();
37
+ }
38
+ register(payloadSchemaVersion, parser) {
39
+ this.parsers.set(payloadSchemaVersion, parser);
40
+ }
41
+ get(payloadSchemaVersion) {
42
+ return this.parsers.get(payloadSchemaVersion);
43
+ }
44
+ parse(payloadSchemaVersion, payload) {
45
+ const parser = this.parsers.get(payloadSchemaVersion);
46
+ if (parser === void 0) return Result.err(`No compute payload parser registered for schema version "${payloadSchemaVersion}"`);
47
+ return parser(payload);
48
+ }
49
+ };
50
+ var ComputePayloadParsers = class ComputePayloadParsers {
51
+ static {
52
+ this.registry = new ComputePayloadParserRegistry();
53
+ }
54
+ static {
55
+ this.defaultsRegistered = false;
56
+ }
57
+ static ensureDefaults() {
58
+ if (ComputePayloadParsers.defaultsRegistered) return;
59
+ ComputePayloadParsers.defaultsRegistered = true;
60
+ ComputePayloadParsers.registry.register(1, ComputePayloadSchemaV1.parse);
61
+ }
62
+ static register(payloadSchemaVersion, parser) {
63
+ ComputePayloadParsers.ensureDefaults();
64
+ ComputePayloadParsers.registry.register(payloadSchemaVersion, parser);
65
+ }
66
+ static get(payloadSchemaVersion) {
67
+ ComputePayloadParsers.ensureDefaults();
68
+ return ComputePayloadParsers.registry.get(payloadSchemaVersion);
69
+ }
70
+ static parse(payloadSchemaVersion, payload) {
71
+ ComputePayloadParsers.ensureDefaults();
72
+ return ComputePayloadParsers.registry.parse(payloadSchemaVersion, payload);
73
+ }
74
+ };
75
+ //#endregion
76
+ //#region src/core/policies/engines/compute-engine-registry.ts
77
+ var ComputeEngineRegistry = class {
78
+ constructor() {
79
+ this.engines = /* @__PURE__ */ new Map();
80
+ }
81
+ register(engine) {
82
+ this.engines.set(engine.version, engine);
83
+ }
84
+ get(version) {
85
+ return this.engines.get(version);
86
+ }
87
+ evaluate(version, params) {
88
+ const engine = this.get(version);
89
+ if (engine === void 0) return Result.err(`No compute engine registered for version "${version}"`);
90
+ const evaluator = params.evaluators.get(params.policyKey, version);
91
+ if (evaluator === void 0) return Result.err(`No compute evaluator registered for policy key "${params.policyKey}" and version "${version}"`);
92
+ const parsedPayloadResult = ComputePayloadParsers.parse(params.payloadSchemaVersion, params.payload);
93
+ if (parsedPayloadResult.isErr()) return Result.err(parsedPayloadResult.errorOrNull());
94
+ return engine.evaluate(parsedPayloadResult.getOrNull(), params.context, evaluator);
95
+ }
96
+ };
97
+ //#endregion
98
+ //#region src/core/policies/engines/compute-evaluator-registry.ts
99
+ var ComputeEvaluatorRegistry = class ComputeEvaluatorRegistry {
100
+ constructor() {
101
+ this.evaluators = /* @__PURE__ */ new Map();
102
+ }
103
+ static toRegistryKey(policyKey, version) {
104
+ return `${policyKey}::${version}`;
105
+ }
106
+ register(registration) {
107
+ this.evaluators.set(ComputeEvaluatorRegistry.toRegistryKey(registration.policyKey, registration.version), registration.evaluator);
108
+ }
109
+ get(policyKey, version) {
110
+ return this.evaluators.get(ComputeEvaluatorRegistry.toRegistryKey(policyKey, version));
111
+ }
112
+ };
113
+ //#endregion
114
+ //#region src/core/policies/engines/v1/compute/resolve-decision-table-v1.ts
115
+ const COMPUTE_CONDITION_EVAL_FAILED_TAG = "COMPUTE_CONDITION_EVAL_FAILED";
116
+ var DecisionTableResolverV1 = class DecisionTableResolverV1 {
117
+ constructor(payload, context, conditionEvaluationOptions) {
118
+ this.payload = payload;
119
+ this.context = context;
120
+ this.conditionEvaluationOptions = conditionEvaluationOptions;
121
+ }
122
+ wrapConditionEvaluationError(error) {
123
+ return Result.err(`${COMPUTE_CONDITION_EVAL_FAILED_TAG}: ${error}`);
124
+ }
125
+ resolve() {
126
+ const evaluator = new ConditionEvaluatorV1(this.context, this.conditionEvaluationOptions);
127
+ for (const rule of this.payload.rules) {
128
+ const conditionResult = evaluator.evaluate(rule.conditions);
129
+ if (conditionResult.isErr()) return this.wrapConditionEvaluationError(conditionResult.errorOrNull());
130
+ if (conditionResult.getOrNull()) return Result.ok(rule.result);
131
+ }
132
+ return Result.ok(this.payload.default);
133
+ }
134
+ static resolve(payload, context, conditionEvaluationOptions) {
135
+ return new DecisionTableResolverV1(payload, context, conditionEvaluationOptions).resolve();
136
+ }
137
+ };
138
+ //#endregion
139
+ //#region src/core/policies/engines/v1/compute/compute-engine-v1.ts
140
+ const COMPUTE_ENGINE_VERSION = 1;
141
+ var ComputeEngineV1 = class {
142
+ constructor(params = {}) {
143
+ this.version = COMPUTE_ENGINE_VERSION;
144
+ this.coreConfig = params.coreConfig ?? coreConfig;
145
+ }
146
+ /**
147
+ * Evaluates an already-parsed ComputePayload against a context.
148
+ * Pure function — no side effects.
149
+ *
150
+ * For `params`: forwards `payload.data` directly to the evaluator.
151
+ * For `decision-table`: evaluates the rules in order and passes the `result`
152
+ * of the first one that satisfies its conditions, or `default` if none match.
153
+ *
154
+ * The evaluator is responsible for validating and transforming the final value.
155
+ */
156
+ evaluate(payload, context, evaluator) {
157
+ if (payload.type === "params") return evaluator.evaluate(payload.data, context);
158
+ const resolvedResult = DecisionTableResolverV1.resolve(payload, context, this.coreConfig.getConditionEvaluationOptions(COMPUTE_ENGINE_VERSION));
159
+ if (resolvedResult.isErr()) return Result.err(resolvedResult.errorOrNull());
160
+ return evaluator.evaluate(resolvedResult.getOrNull(), context);
161
+ }
162
+ };
163
+ //#endregion
164
+ //#region src/core/policies/engines/compute-registry.ts
165
+ var ComputeRegistry = class {
166
+ constructor(params = {}) {
167
+ this.engines = new ComputeEngineRegistry();
168
+ this.evaluators = new ComputeEvaluatorRegistry();
169
+ const resolvedCoreConfig = params.coreConfig ?? coreConfig;
170
+ this.engines.register(new ComputeEngineV1({ coreConfig: resolvedCoreConfig }));
171
+ }
172
+ register(registration) {
173
+ this.evaluators.register(registration);
174
+ }
175
+ registerEngine(engine) {
176
+ this.engines.register(engine);
177
+ }
178
+ getEngine(version) {
179
+ return this.engines.get(version);
180
+ }
181
+ getEvaluator(policyKey, version) {
182
+ return this.evaluators.get(policyKey, version);
183
+ }
184
+ evaluate(policyKey, computeEngineVersion, payloadSchemaVersion, payload, context) {
185
+ return this.engines.evaluate(computeEngineVersion, {
186
+ policyKey,
187
+ payloadSchemaVersion,
188
+ payload,
189
+ context,
190
+ evaluators: this.evaluators
191
+ });
192
+ }
193
+ };
194
+ //#endregion
195
+ //#region src/core/policies/engines/parse-gate-payload.ts
196
+ var GatePayloadParserRegistry = class {
197
+ constructor() {
198
+ this.parsers = /* @__PURE__ */ new Map();
199
+ }
200
+ register(engineVersion, parser) {
201
+ this.parsers.set(engineVersion, parser);
202
+ }
203
+ get(engineVersion) {
204
+ return this.parsers.get(engineVersion);
205
+ }
206
+ parse(engineVersion, payload) {
207
+ const parser = this.parsers.get(engineVersion);
208
+ if (parser === void 0) return Result.err(`No gate payload parser registered for engine version "${engineVersion}"`);
209
+ return parser(payload);
210
+ }
211
+ };
212
+ var GatePayloadParsers = class GatePayloadParsers {
213
+ static {
214
+ this.registry = new GatePayloadParserRegistry();
215
+ }
216
+ static {
217
+ this.defaultsRegistered = false;
218
+ }
219
+ static ensureDefaults() {
220
+ if (GatePayloadParsers.defaultsRegistered) return;
221
+ GatePayloadParsers.defaultsRegistered = true;
222
+ GatePayloadParsers.registry.register(1, GatePayloadSchemaV1.parse);
223
+ }
224
+ static register(engineVersion, parser) {
225
+ GatePayloadParsers.ensureDefaults();
226
+ GatePayloadParsers.registry.register(engineVersion, parser);
227
+ }
228
+ static get(engineVersion) {
229
+ GatePayloadParsers.ensureDefaults();
230
+ return GatePayloadParsers.registry.get(engineVersion);
231
+ }
232
+ static parse(engineVersion, payload) {
233
+ GatePayloadParsers.ensureDefaults();
234
+ return GatePayloadParsers.registry.parse(engineVersion, payload);
235
+ }
236
+ };
237
+ //#endregion
238
+ //#region src/core/policies/engines/gate-engine-registry.ts
239
+ var GateEngineRegistry = class {
240
+ constructor() {
241
+ this.engines = /* @__PURE__ */ new Map();
242
+ }
243
+ register(engine) {
244
+ this.engines.set(engine.version, engine);
245
+ }
246
+ get(version) {
247
+ return this.engines.get(version);
248
+ }
249
+ evaluate(version, payload, context) {
250
+ const engine = this.engines.get(version);
251
+ if (!engine) return Result.err(`No gate engine registered for version "${version}"`);
252
+ const parsedPayload = GatePayloadParsers.parse(version, payload);
253
+ if (parsedPayload.isErr()) return Result.err(parsedPayload.errorOrNull());
254
+ return engine.evaluate(parsedPayload.getOrNull(), context);
255
+ }
256
+ };
257
+ //#endregion
258
+ export { ComputeEvaluatorRegistry as a, ComputePayloadParsers as c, ComputeRegistry as i, GatePayloadParserRegistry as n, ComputeEngineRegistry as o, GatePayloadParsers as r, ComputePayloadParserRegistry as s, GateEngineRegistry as t };
259
+
260
+ //# sourceMappingURL=gate-engine-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-engine-registry.js","names":[],"sources":["../src/core/policies/engines/v1/compute/compute-payload.schema.ts","../src/core/policies/engines/parse-compute-payload.ts","../src/core/policies/engines/compute-engine-registry.ts","../src/core/policies/engines/compute-evaluator-registry.ts","../src/core/policies/engines/v1/compute/resolve-decision-table-v1.ts","../src/core/policies/engines/v1/compute/compute-engine-v1.ts","../src/core/policies/engines/compute-registry.ts","../src/core/policies/engines/parse-gate-payload.ts","../src/core/policies/engines/gate-engine-registry.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport { Result } from \"../../../../result/result\";\n\nimport { conditionNodeSchema } from \"../condition-schema\";\nimport type { ConditionNode } from \"../condition-types\";\n\n// ─── Pattern 1: Params ──────────────────────────────────────────────────────\n\nexport interface ComputeParamsPayload {\n readonly type: \"params\";\n readonly data: Readonly<Record<string, unknown>>;\n}\n\n// ─── Pattern 2: Decision table ──────────────────────────────────────────────\n\nexport interface ComputeDecisionTableRule<R = unknown> {\n readonly conditions: ConditionNode;\n readonly result: R;\n}\n\nexport interface ComputeDecisionTablePayload<R = unknown> {\n readonly type: \"decision-table\";\n readonly rules: readonly ComputeDecisionTableRule<R>[];\n readonly default: R;\n}\n\n// ─── Union ──────────────────────────────────────────────────────────────────\n\nexport type ComputePayloadV1 =\n | ComputeDecisionTablePayload<unknown>\n | ComputeParamsPayload;\n\n// ─── Zod schemas ────────────────────────────────────────────────────────────\n\nconst computeDecisionTableRuleSchema = z.object({\n conditions: conditionNodeSchema,\n result: z.unknown(),\n});\n\nexport class ComputePayloadSchemaV1 {\n static readonly schema = z.union([\n z\n .object({\n type: z.literal(\"decision-table\"),\n rules: z.array(computeDecisionTableRuleSchema).min(1),\n default: z.unknown(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"params\"),\n data: z.record(z.string(), z.unknown()),\n })\n .strict(),\n ]);\n\n static parse(payload: unknown): Result<ComputePayloadV1, string> {\n const parsed = ComputePayloadSchemaV1.schema.safeParse(payload);\n if (!parsed.success) {\n const details = parsed.error.issues\n .map((issue) => {\n const path = issue.path.join(\".\");\n return path.length > 0 ? `${path}: ${issue.message}` : issue.message;\n })\n .join(\"; \");\n\n return Result.err(`Invalid compute payload: ${details}`);\n }\n\n return Result.ok(parsed.data as ComputePayloadV1);\n }\n}\n\nexport const computePayloadSchema = ComputePayloadSchemaV1.schema;\n","import type { Result as ResultType } from \"../../result/result\";\nimport { Result } from \"../../result/result\";\n\nimport type { ComputePayload } from \"./compute-payload\";\nimport { ComputePayloadSchemaV1 } from \"./v1/compute/compute-payload.schema\";\n\nexport type ComputePayloadParser = (\n payload: unknown,\n) => ResultType<ComputePayload, string>;\n\nexport class ComputePayloadParserRegistry {\n private readonly parsers = new Map<number, ComputePayloadParser>();\n\n register(payloadSchemaVersion: number, parser: ComputePayloadParser): void {\n this.parsers.set(payloadSchemaVersion, parser);\n }\n\n get(payloadSchemaVersion: number): ComputePayloadParser | undefined {\n return this.parsers.get(payloadSchemaVersion);\n }\n\n parse(payloadSchemaVersion: number, payload: unknown) {\n const parser = this.parsers.get(payloadSchemaVersion);\n\n if (parser === undefined) {\n return Result.err(\n `No compute payload parser registered for schema version \"${payloadSchemaVersion}\"`,\n );\n }\n\n return parser(payload);\n }\n}\n\nexport class ComputePayloadParsers {\n private static readonly registry = new ComputePayloadParserRegistry();\n private static defaultsRegistered = false;\n\n // Registers the built-in v1 parser lazily, the first time the default\n // dispatcher is touched. Done here — rather than as a top-level module\n // statement — so the package's `\"sideEffects\": false` flag stays honest and\n // a tree-shaking bundler cannot drop the v1 registration and leave the\n // compute engine unable to parse v1 payloads at runtime.\n private static ensureDefaults(): void {\n if (ComputePayloadParsers.defaultsRegistered) {\n return;\n }\n ComputePayloadParsers.defaultsRegistered = true;\n ComputePayloadParsers.registry.register(1, ComputePayloadSchemaV1.parse);\n }\n\n static register(\n payloadSchemaVersion: number,\n parser: ComputePayloadParser,\n ): void {\n ComputePayloadParsers.ensureDefaults();\n ComputePayloadParsers.registry.register(payloadSchemaVersion, parser);\n }\n\n static get(payloadSchemaVersion: number): ComputePayloadParser | undefined {\n ComputePayloadParsers.ensureDefaults();\n return ComputePayloadParsers.registry.get(payloadSchemaVersion);\n }\n\n static parse(payloadSchemaVersion: number, payload: unknown) {\n ComputePayloadParsers.ensureDefaults();\n return ComputePayloadParsers.registry.parse(payloadSchemaVersion, payload);\n }\n}\n\nexport type { ComputePayload };\n","import { Result } from \"../../result/result\";\n\nimport type { PolicyContext } from \"./gate-types\";\nimport { ComputePayloadParsers } from \"./parse-compute-payload\";\nimport type { ComputeEvaluatorRegistry } from \"./compute-evaluator-registry\";\nimport type { ComputeOutcome, VersionedComputeEngine } from \"./compute-types\";\n\nexport class ComputeEngineRegistry {\n private readonly engines = new Map<number, VersionedComputeEngine>();\n\n register(engine: VersionedComputeEngine): void {\n this.engines.set(engine.version, engine);\n }\n\n get(version: number): VersionedComputeEngine | undefined {\n return this.engines.get(version);\n }\n\n evaluate(\n version: number,\n params: {\n readonly policyKey: string;\n readonly payloadSchemaVersion: number;\n readonly payload: unknown;\n readonly context: PolicyContext;\n readonly evaluators: ComputeEvaluatorRegistry;\n },\n ): Result<ComputeOutcome, string> {\n const engine = this.get(version);\n if (engine === undefined) {\n return Result.err(\n `No compute engine registered for version \"${version}\"`,\n );\n }\n\n const evaluator = params.evaluators.get(params.policyKey, version);\n if (evaluator === undefined) {\n return Result.err(\n `No compute evaluator registered for policy key \"${params.policyKey}\" and version \"${version}\"`,\n );\n }\n\n const parsedPayloadResult = ComputePayloadParsers.parse(\n params.payloadSchemaVersion,\n params.payload,\n );\n if (parsedPayloadResult.isErr()) {\n return Result.err(parsedPayloadResult.errorOrNull()!);\n }\n\n return engine.evaluate(\n parsedPayloadResult.getOrNull()!,\n params.context,\n evaluator,\n );\n }\n}\n","import type {\n ComputeEvaluator,\n ComputeEvaluatorRegistration,\n} from \"./compute-types\";\n\nexport class ComputeEvaluatorRegistry {\n private readonly evaluators = new Map<string, ComputeEvaluator>();\n\n private static toRegistryKey(policyKey: string, version: number): string {\n return `${policyKey}::${version}`;\n }\n\n register(registration: ComputeEvaluatorRegistration): void {\n this.evaluators.set(\n ComputeEvaluatorRegistry.toRegistryKey(\n registration.policyKey,\n registration.version,\n ),\n registration.evaluator,\n );\n }\n\n get(policyKey: string, version: number): ComputeEvaluator | undefined {\n return this.evaluators.get(\n ComputeEvaluatorRegistry.toRegistryKey(policyKey, version),\n );\n }\n}\n","import { Result } from \"../../../../result/result\";\n\nimport type { ConditionEvaluationOptions } from \"../../condition-evaluator-reporter\";\n\nimport { ConditionEvaluatorV1 } from \"../condition-evaluator\";\nimport type { ComputeDecisionTablePayload } from \"./compute-payload.schema\";\n\nconst COMPUTE_CONDITION_EVAL_FAILED_TAG = \"COMPUTE_CONDITION_EVAL_FAILED\";\n\nexport class DecisionTableResolverV1 {\n constructor(\n private readonly payload: ComputeDecisionTablePayload,\n private readonly context: Record<string, unknown>,\n private readonly conditionEvaluationOptions: ConditionEvaluationOptions,\n ) {}\n\n private wrapConditionEvaluationError(error: string): Result<unknown, string> {\n return Result.err(`${COMPUTE_CONDITION_EVAL_FAILED_TAG}: ${error}`);\n }\n\n resolve(): Result<unknown, string> {\n const evaluator = new ConditionEvaluatorV1(\n this.context,\n this.conditionEvaluationOptions,\n );\n\n for (const rule of this.payload.rules) {\n const conditionResult = evaluator.evaluate(rule.conditions);\n if (conditionResult.isErr()) {\n return this.wrapConditionEvaluationError(\n conditionResult.errorOrNull()!,\n );\n }\n\n if (conditionResult.getOrNull()) {\n return Result.ok(rule.result);\n }\n }\n\n return Result.ok(this.payload.default);\n }\n\n static resolve(\n payload: ComputeDecisionTablePayload,\n context: Record<string, unknown>,\n conditionEvaluationOptions: ConditionEvaluationOptions,\n ): Result<unknown, string> {\n return new DecisionTableResolverV1(\n payload,\n context,\n conditionEvaluationOptions,\n ).resolve();\n }\n}\n","import { type CoreConfig, coreConfig } from \"../../../../config\";\nimport { Result } from \"../../../../result/result\";\n\nimport type { ComputePayloadV1 as ComputePayload } from \"./compute-payload.schema\";\nimport { DecisionTableResolverV1 } from \"./resolve-decision-table-v1\";\nimport type {\n ComputeEvaluator,\n ComputeOutcome,\n VersionedComputeEngine,\n} from \"../../compute-types\";\nimport type { PolicyContext } from \"../../gate-types\";\n\n// ─── Compute engine v1 ───────────────────────────────────────────────────────\n\nconst COMPUTE_ENGINE_VERSION = 1;\n\nexport class ComputeEngineV1 implements VersionedComputeEngine {\n readonly version = COMPUTE_ENGINE_VERSION;\n private readonly coreConfig: CoreConfig;\n\n constructor(params: { readonly coreConfig?: CoreConfig } = {}) {\n this.coreConfig = params.coreConfig ?? coreConfig;\n }\n\n /**\n * Evaluates an already-parsed ComputePayload against a context.\n * Pure function — no side effects.\n *\n * For `params`: forwards `payload.data` directly to the evaluator.\n * For `decision-table`: evaluates the rules in order and passes the `result`\n * of the first one that satisfies its conditions, or `default` if none match.\n *\n * The evaluator is responsible for validating and transforming the final value.\n */\n evaluate(\n payload: ComputePayload,\n context: PolicyContext,\n evaluator: ComputeEvaluator,\n ): Result<ComputeOutcome, string> {\n if (payload.type === \"params\") {\n return evaluator.evaluate(payload.data, context);\n }\n\n const resolvedResult = DecisionTableResolverV1.resolve(\n payload,\n context,\n this.coreConfig.getConditionEvaluationOptions(COMPUTE_ENGINE_VERSION),\n );\n if (resolvedResult.isErr()) {\n return Result.err(resolvedResult.errorOrNull()!);\n }\n\n return evaluator.evaluate(resolvedResult.getOrNull()!, context);\n }\n}\n","import { type CoreConfig, coreConfig } from \"../../config\";\nimport type { Result } from \"../../result/result\";\n\nimport { ComputeEngineRegistry } from \"./compute-engine-registry\";\nimport { ComputeEvaluatorRegistry } from \"./compute-evaluator-registry\";\nimport type { PolicyContext } from \"./gate-types\";\nimport type {\n ComputeEvaluator,\n ComputeEvaluatorRegistration,\n ComputeOutcome,\n VersionedComputeEngine,\n} from \"./compute-types\";\nimport { ComputeEngineV1 } from \"./v1/compute\";\n\nexport interface ComputeRegistryOptions {\n readonly coreConfig?: CoreConfig;\n}\n\nexport class ComputeRegistry {\n private readonly engines = new ComputeEngineRegistry();\n private readonly evaluators = new ComputeEvaluatorRegistry();\n\n constructor(params: ComputeRegistryOptions = {}) {\n const resolvedCoreConfig = params.coreConfig ?? coreConfig;\n\n this.engines.register(\n new ComputeEngineV1({\n coreConfig: resolvedCoreConfig,\n }),\n );\n }\n\n register(registration: ComputeEvaluatorRegistration): void {\n this.evaluators.register(registration);\n }\n\n registerEngine(engine: VersionedComputeEngine): void {\n this.engines.register(engine);\n }\n\n getEngine(version: number): VersionedComputeEngine | undefined {\n return this.engines.get(version);\n }\n\n getEvaluator(\n policyKey: string,\n version: number,\n ): ComputeEvaluator | undefined {\n return this.evaluators.get(policyKey, version);\n }\n\n evaluate(\n policyKey: string,\n computeEngineVersion: number,\n payloadSchemaVersion: number,\n payload: unknown,\n context: PolicyContext,\n ): Result<ComputeOutcome, string> {\n return this.engines.evaluate(computeEngineVersion, {\n policyKey,\n payloadSchemaVersion,\n payload,\n context,\n evaluators: this.evaluators,\n });\n }\n}\n","import type { Result as ResultType } from \"../../result/result\";\nimport { Result } from \"../../result/result\";\n\nimport type { GatePayload } from \"./gate-payload\";\nimport { GatePayloadSchemaV1 } from \"./v1/gate/gate-v1-payload.schema\";\n\nexport type GatePayloadParser = (\n payload: unknown,\n) => ResultType<GatePayload, string>;\n\nexport class GatePayloadParserRegistry {\n private readonly parsers = new Map<number, GatePayloadParser>();\n\n register(engineVersion: number, parser: GatePayloadParser): void {\n this.parsers.set(engineVersion, parser);\n }\n\n get(engineVersion: number): GatePayloadParser | undefined {\n return this.parsers.get(engineVersion);\n }\n\n parse(engineVersion: number, payload: unknown) {\n const parser = this.parsers.get(engineVersion);\n\n if (parser === undefined) {\n return Result.err(\n `No gate payload parser registered for engine version \"${engineVersion}\"`,\n );\n }\n\n return parser(payload);\n }\n}\n\nexport class GatePayloadParsers {\n private static readonly registry = new GatePayloadParserRegistry();\n private static defaultsRegistered = false;\n\n // Registers the built-in v1 parser lazily, the first time the default\n // dispatcher is touched. Done here — rather than as a top-level module\n // statement — so the package's `\"sideEffects\": false` flag stays honest and\n // a tree-shaking bundler cannot drop the v1 registration and leave the gate\n // engine unable to parse v1 payloads at runtime.\n private static ensureDefaults(): void {\n if (GatePayloadParsers.defaultsRegistered) {\n return;\n }\n GatePayloadParsers.defaultsRegistered = true;\n GatePayloadParsers.registry.register(1, GatePayloadSchemaV1.parse);\n }\n\n static register(engineVersion: number, parser: GatePayloadParser): void {\n GatePayloadParsers.ensureDefaults();\n GatePayloadParsers.registry.register(engineVersion, parser);\n }\n\n static get(engineVersion: number): GatePayloadParser | undefined {\n GatePayloadParsers.ensureDefaults();\n return GatePayloadParsers.registry.get(engineVersion);\n }\n\n static parse(engineVersion: number, payload: unknown) {\n GatePayloadParsers.ensureDefaults();\n return GatePayloadParsers.registry.parse(engineVersion, payload);\n }\n}\n\nexport type { GatePayload };\n","import { Result } from \"../../result/result\";\n\nimport type {\n GateOutcome,\n PolicyContext,\n VersionedGateEngine,\n} from \"./gate-types\";\nimport { GatePayloadParsers } from \"./parse-gate-payload\";\n\nexport class GateEngineRegistry {\n private readonly engines = new Map<number, VersionedGateEngine>();\n\n register(engine: VersionedGateEngine): void {\n this.engines.set(engine.version, engine);\n }\n\n get(version: number): VersionedGateEngine | undefined {\n return this.engines.get(version);\n }\n\n evaluate(\n version: number,\n payload: unknown,\n context: PolicyContext,\n ): Result<GateOutcome, string> {\n const engine = this.engines.get(version);\n if (!engine) {\n return Result.err(`No gate engine registered for version \"${version}\"`);\n }\n\n const parsedPayload = GatePayloadParsers.parse(version, payload);\n if (parsedPayload.isErr()) {\n return Result.err(parsedPayload.errorOrNull()!);\n }\n\n return engine.evaluate(parsedPayload.getOrNull()!, context);\n }\n}\n"],"mappings":"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"}