@cullet/erp-core 1.2.0 → 1.3.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 (101) hide show
  1. package/dist/app-error.d.cts +108 -0
  2. package/dist/application/index.cjs +26 -0
  3. package/dist/application/index.d.cts +2 -0
  4. package/dist/domain/index.cjs +16 -0
  5. package/dist/domain/index.d.cts +3 -0
  6. package/dist/domain-event-contracts.cjs +33 -0
  7. package/dist/domain-event-contracts.cjs.map +1 -0
  8. package/dist/domain-event-contracts.d.cts +27 -0
  9. package/dist/domain-exception.cjs +17 -0
  10. package/dist/domain-exception.cjs.map +1 -0
  11. package/dist/domain-exception.d.cts +7 -0
  12. package/dist/errors/index.cjs +41 -0
  13. package/dist/errors/index.d.cts +3 -0
  14. package/dist/exceptions/index.cjs +17 -0
  15. package/dist/exceptions/index.d.cts +5 -0
  16. package/dist/exceptions/validation-field.cjs +3 -0
  17. package/dist/exceptions/validation-field.d.cts +2 -0
  18. package/dist/gate-engine-registry.cjs +308 -0
  19. package/dist/gate-engine-registry.cjs.map +1 -0
  20. package/dist/gate-engine-registry.d.cts +81 -0
  21. package/dist/gate-types.d.cts +171 -0
  22. package/dist/gate-v1-payload.schema.cjs +638 -0
  23. package/dist/gate-v1-payload.schema.cjs.map +1 -0
  24. package/dist/hashing.cjs +66 -0
  25. package/dist/hashing.cjs.map +1 -0
  26. package/dist/immutable.cjs +77 -0
  27. package/dist/immutable.cjs.map +1 -0
  28. package/dist/immutable.d.cts +6 -0
  29. package/dist/index.cjs +163 -0
  30. package/dist/index.cjs.map +1 -0
  31. package/dist/index.d.cts +30 -0
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/invalid-state-transition-exception.cjs +47 -0
  36. package/dist/invalid-state-transition-exception.cjs.map +1 -0
  37. package/dist/invariant-violation-exception.cjs +16 -0
  38. package/dist/invariant-violation-exception.cjs.map +1 -0
  39. package/dist/not-found-error.cjs +65 -0
  40. package/dist/not-found-error.cjs.map +1 -0
  41. package/dist/outcome.cjs +97 -0
  42. package/dist/outcome.cjs.map +1 -0
  43. package/dist/outcome.d.cts +140 -0
  44. package/dist/parse-gate-payload.d.cts +62 -0
  45. package/dist/path.d.cts +90 -0
  46. package/dist/plugin.cjs +79 -0
  47. package/dist/plugin.cjs.map +1 -0
  48. package/dist/plugin.d.cts +85 -0
  49. package/dist/plugins/index.cjs +3 -0
  50. package/dist/plugins/index.d.cts +2 -0
  51. package/dist/policies/engines/index.cjs +10 -0
  52. package/dist/policies/engines/index.d.cts +4 -0
  53. package/dist/policies/engines/v1/gate/index.cjs +91 -0
  54. package/dist/policies/engines/v1/gate/index.cjs.map +1 -0
  55. package/dist/policies/engines/v1/gate/index.d.cts +121 -0
  56. package/dist/policies/index.cjs +41 -0
  57. package/dist/policies/index.d.cts +7 -0
  58. package/dist/policy-service.cjs +1190 -0
  59. package/dist/policy-service.cjs.map +1 -0
  60. package/dist/policy-service.d.cts +559 -0
  61. package/dist/result/index.cjs +7 -0
  62. package/dist/result/index.d.cts +2 -0
  63. package/dist/result.cjs +135 -0
  64. package/dist/result.cjs.map +1 -0
  65. package/dist/ruleset-registry.cjs +47 -0
  66. package/dist/ruleset-registry.cjs.map +1 -0
  67. package/dist/rulesets/index.cjs +3 -0
  68. package/dist/rulesets/index.d.cts +2 -0
  69. package/dist/temporal-guards.cjs +32 -0
  70. package/dist/temporal-guards.cjs.map +1 -0
  71. package/dist/temporal-use-case.cjs +191 -0
  72. package/dist/temporal-use-case.cjs.map +1 -0
  73. package/dist/temporal-use-case.d.cts +304 -0
  74. package/dist/unexpected-error.cjs +208 -0
  75. package/dist/unexpected-error.cjs.map +1 -0
  76. package/dist/use-case.cjs +96 -0
  77. package/dist/use-case.cjs.map +1 -0
  78. package/dist/uuid-identifier.cjs +65 -0
  79. package/dist/uuid-identifier.cjs.map +1 -0
  80. package/dist/uuid-identifier.d.cts +230 -0
  81. package/dist/validation-code.cjs +60 -0
  82. package/dist/validation-code.cjs.map +1 -0
  83. package/dist/validation-code.d.cts +23 -0
  84. package/dist/validation-error.cjs +1020 -0
  85. package/dist/validation-error.cjs.map +1 -0
  86. package/dist/validation-error.d.cts +777 -0
  87. package/dist/validation-exception.cjs +41 -0
  88. package/dist/validation-exception.cjs.map +1 -0
  89. package/dist/validation-exception.d.cts +50 -0
  90. package/dist/validation-field.cjs +28 -0
  91. package/dist/validation-field.cjs.map +1 -0
  92. package/dist/validation-field.d.cts +12 -0
  93. package/dist/value-object-ruleset.contracts.d.cts +36 -0
  94. package/dist/value-object.cjs +208 -0
  95. package/dist/value-object.cjs.map +1 -0
  96. package/dist/version.d.cts +10 -0
  97. package/dist/versioning/index.cjs +7 -0
  98. package/dist/versioning/index.d.cts +3 -0
  99. package/meta.json +3 -2
  100. package/package.json +147 -28
  101. package/src/version.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-engine-registry.cjs","names":["z","conditionNodeSchema","Result","Result","Result","Result","ConditionEvaluatorV1","coreConfig","Result","coreConfig","Result","GatePayloadSchemaV1","Result"],"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.js\";\n\nimport { conditionNodeSchema } from \"../condition-schema.js\";\nimport type { ConditionNode } from \"../condition-types.js\";\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\n ? `${path}: ${issue.message}`\n : 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.js\";\nimport { Result } from \"../../result/result.js\";\n\nimport type { ComputePayload } from \"./compute-payload.js\";\nimport { ComputePayloadSchemaV1 } from \"./v1/compute/compute-payload.schema.js\";\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(\n 1,\n ComputePayloadSchemaV1.parse,\n );\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(\n payloadSchemaVersion,\n payload,\n );\n }\n}\n\nexport type { ComputePayload };\n","import { Result } from \"../../result/result.js\";\n\nimport type { PolicyContext } from \"./gate-types.js\";\nimport { ComputePayloadParsers } from \"./parse-compute-payload.js\";\nimport type { ComputeEvaluatorRegistry } from \"./compute-evaluator-registry.js\";\nimport type {\n ComputeOutcome,\n VersionedComputeEngine,\n} from \"./compute-types.js\";\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.js\";\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.js\";\n\nimport type { ConditionEvaluationOptions } from \"../../condition-evaluator-reporter.js\";\n\nimport { ConditionEvaluatorV1 } from \"../condition-evaluator.js\";\nimport type { ComputeDecisionTablePayload } from \"./compute-payload.schema.js\";\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(\n error: string,\n ): 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/index.js\";\nimport { Result } from \"../../../../result/result.js\";\n\nimport type { ComputePayloadV1 as ComputePayload } from \"./compute-payload.schema.js\";\nimport { DecisionTableResolverV1 } from \"./resolve-decision-table-v1.js\";\nimport type {\n ComputeEvaluator,\n ComputeOutcome,\n VersionedComputeEngine,\n} from \"../../compute-types.js\";\nimport type { PolicyContext } from \"../../gate-types.js\";\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(\n COMPUTE_ENGINE_VERSION,\n ),\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/index.js\";\nimport type { Result } from \"../../result/result.js\";\n\nimport { ComputeEngineRegistry } from \"./compute-engine-registry.js\";\nimport { ComputeEvaluatorRegistry } from \"./compute-evaluator-registry.js\";\nimport type { PolicyContext } from \"./gate-types.js\";\nimport type {\n ComputeEvaluator,\n ComputeEvaluatorRegistration,\n ComputeOutcome,\n VersionedComputeEngine,\n} from \"./compute-types.js\";\nimport { ComputeEngineV1 } from \"./v1/compute/index.js\";\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.js\";\nimport { Result } from \"../../result/result.js\";\n\nimport type { GatePayload } from \"./gate-payload.js\";\nimport { GatePayloadSchemaV1 } from \"./v1/gate/gate-v1-payload.schema.js\";\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.js\";\n\nimport type {\n GateOutcome,\n PolicyContext,\n VersionedGateEngine,\n} from \"./gate-types.js\";\nimport { GatePayloadParsers } from \"./parse-gate-payload.js\";\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(\n `No gate engine registered for version \"${version}\"`,\n );\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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"}
@@ -0,0 +1,81 @@
1
+ import { a as Result, n as Outcome } from "./outcome.cjs";
2
+ import { c as PolicyViolation, l as VersionedGateEngine, m as CoreConfig, p as ConditionNode, s as PolicyContext, t as GateOutcome } from "./gate-types.cjs";
3
+ import { z } from "zod";
4
+
5
+ //#region src/core/policies/engines/v1/compute/compute-payload.schema.d.ts
6
+ interface ComputeParamsPayload {
7
+ readonly type: "params";
8
+ readonly data: Readonly<Record<string, unknown>>;
9
+ }
10
+ interface ComputeDecisionTableRule<R = unknown> {
11
+ readonly conditions: ConditionNode;
12
+ readonly result: R;
13
+ }
14
+ interface ComputeDecisionTablePayload<R = unknown> {
15
+ readonly type: "decision-table";
16
+ readonly rules: readonly ComputeDecisionTableRule<R>[];
17
+ readonly default: R;
18
+ }
19
+ type ComputePayloadV1 = ComputeDecisionTablePayload<unknown> | ComputeParamsPayload;
20
+ //#endregion
21
+ //#region src/core/policies/engines/compute-payload.d.ts
22
+ type ComputePayload = ComputePayloadV1;
23
+ //#endregion
24
+ //#region src/core/policies/engines/compute-types.d.ts
25
+ type ComputeStatus = "OK" | "NOT_APPLICABLE" | "ERROR";
26
+ interface ComputeOutcomeData {
27
+ readonly values: unknown | null;
28
+ readonly violations: readonly PolicyViolation[];
29
+ }
30
+ /** Semantic outcome of a COMPUTE policy evaluation. */
31
+ type ComputeOutcome = Outcome<ComputeStatus, ComputeOutcomeData>;
32
+ /**
33
+ * Pure compute operation: receives a resolved value + context, returns a
34
+ * business decision. Registration metadata (policy key/version) lives outside
35
+ * this contract.
36
+ *
37
+ * The engine resolves the structural payload before calling the evaluator:
38
+ * - `params` -> `payload.data`
39
+ * - `decision-table` -> matching `rule.result` or `default`
40
+ *
41
+ * Result wraps technical failures (invalid value shape).
42
+ * Outcome carries the semantic business decision.
43
+ */
44
+ interface ComputeEvaluator {
45
+ evaluate(resolvedValue: unknown, context: Record<string, unknown>): Result<ComputeOutcome, string>;
46
+ }
47
+ interface ComputeEvaluatorRegistration {
48
+ readonly policyKey: string;
49
+ readonly version: number;
50
+ readonly evaluator: ComputeEvaluator;
51
+ }
52
+ interface VersionedComputeEngine {
53
+ readonly version: number;
54
+ evaluate(payload: ComputePayload, context: PolicyContext, evaluator: ComputeEvaluator): Result<ComputeOutcome, string>;
55
+ }
56
+ //#endregion
57
+ //#region src/core/policies/engines/compute-registry.d.ts
58
+ interface ComputeRegistryOptions {
59
+ readonly coreConfig?: CoreConfig;
60
+ }
61
+ declare class ComputeRegistry {
62
+ private readonly engines;
63
+ private readonly evaluators;
64
+ constructor(params?: ComputeRegistryOptions);
65
+ register(registration: ComputeEvaluatorRegistration): void;
66
+ registerEngine(engine: VersionedComputeEngine): void;
67
+ getEngine(version: number): VersionedComputeEngine | undefined;
68
+ getEvaluator(policyKey: string, version: number): ComputeEvaluator | undefined;
69
+ evaluate(policyKey: string, computeEngineVersion: number, payloadSchemaVersion: number, payload: unknown, context: PolicyContext): Result<ComputeOutcome, string>;
70
+ }
71
+ //#endregion
72
+ //#region src/core/policies/engines/gate-engine-registry.d.ts
73
+ declare class GateEngineRegistry {
74
+ private readonly engines;
75
+ register(engine: VersionedGateEngine): void;
76
+ get(version: number): VersionedGateEngine | undefined;
77
+ evaluate(version: number, payload: unknown, context: PolicyContext): Result<GateOutcome, string>;
78
+ }
79
+ //#endregion
80
+ export { ComputeOutcome as a, VersionedComputeEngine as c, ComputeDecisionTableRule as d, ComputeParamsPayload as f, ComputeEvaluatorRegistration as i, ComputePayload as l, ComputeRegistry as n, ComputeOutcomeData as o, ComputePayloadV1 as p, ComputeEvaluator as r, ComputeStatus as s, GateEngineRegistry as t, ComputeDecisionTablePayload as u };
81
+ //# sourceMappingURL=gate-engine-registry.d.cts.map
@@ -0,0 +1,171 @@
1
+ import { a as Result, n as Outcome } from "./outcome.cjs";
2
+
3
+ //#region src/core/policies/engines/condition-evaluator-reporter.d.ts
4
+ interface ConditionEvaluationCause {
5
+ readonly name: string;
6
+ readonly message: string;
7
+ }
8
+ type ConditionEvaluationReportLevel = "warn" | "error";
9
+ type ConditionEvaluationReportTag = "MISSING_CONTEXT_FIELD" | "NULLISH_NUMERIC_OPERAND_NOT_ALLOWED" | "NULLISH_DATE_OPERAND_NOT_ALLOWED" | "INVALID_DATE_OPERAND" | "INVALID_NUMERIC_OPERAND" | "INVALID_SET_OPERAND" | "CONDITION_EVAL_THREW";
10
+ interface ConditionEvaluationReport {
11
+ readonly occurredAt: Date;
12
+ readonly level: ConditionEvaluationReportLevel;
13
+ readonly tag: ConditionEvaluationReportTag;
14
+ readonly message: string;
15
+ readonly engineVersion: number;
16
+ readonly details: Readonly<Record<string, unknown>>;
17
+ }
18
+ interface ConditionEvaluatorReporter {
19
+ warn(report: ConditionEvaluationReport): void;
20
+ error(report: ConditionEvaluationReport): void;
21
+ }
22
+ type ConditionEvaluationOptions = {
23
+ readonly reporter: ConditionEvaluatorReporter;
24
+ readonly engineVersion: number;
25
+ };
26
+ //#endregion
27
+ //#region src/core/policies/policy-ids.d.ts
28
+ type Brand<TValue, TBrand extends string> = TValue & {
29
+ readonly __brand: TBrand;
30
+ };
31
+ type PolicyDefinitionId = Brand<string, "PolicyDefinitionId">;
32
+ type PolicyDecisionId = Brand<string, "PolicyDecisionId">;
33
+ type TenantId = Brand<string, "TenantId">;
34
+ type SchoolId = Brand<string, "SchoolId">;
35
+ declare function asPolicyDefinitionId(value: string): PolicyDefinitionId;
36
+ declare function asPolicyDecisionId(value: string): PolicyDecisionId;
37
+ declare function asTenantId(value: string): TenantId;
38
+ declare function asSchoolId(value: string): SchoolId;
39
+ //#endregion
40
+ //#region src/core/config/policy-reporter.d.ts
41
+ type ConditionEvalEvent = ConditionEvaluationReport & {
42
+ readonly kind: "condition-eval";
43
+ };
44
+ interface PolicyResolutionEvent {
45
+ readonly kind: "policy-resolution";
46
+ readonly level: "info";
47
+ readonly policyKey: string;
48
+ readonly definitionId: PolicyDefinitionId;
49
+ readonly policyVersion: string;
50
+ readonly engineKind: "GATE" | "COMPUTE";
51
+ readonly engineVersion: number;
52
+ readonly occurredAt: Date;
53
+ }
54
+ interface PolicyEvaluationFailedEvent {
55
+ readonly kind: "policy-evaluation-failed";
56
+ readonly level: "error";
57
+ readonly policyKey: string | undefined;
58
+ readonly errorKind: string;
59
+ readonly message: string;
60
+ readonly cause: string;
61
+ readonly occurredAt: Date;
62
+ }
63
+ interface PolicyEvaluationCompletedEvent {
64
+ readonly kind: "policy-evaluation-completed";
65
+ readonly level: "info";
66
+ readonly policyKey: string;
67
+ readonly decisionId: PolicyDecisionId;
68
+ readonly engineKind: "GATE" | "COMPUTE";
69
+ readonly occurredAt: Date;
70
+ }
71
+ type PolicyEvent = ConditionEvalEvent | PolicyResolutionEvent | PolicyEvaluationFailedEvent | PolicyEvaluationCompletedEvent;
72
+ interface PolicyReporter {
73
+ report(event: PolicyEvent): void;
74
+ }
75
+ //#endregion
76
+ //#region src/core/config/core-config.d.ts
77
+ interface CoreObservabilityConfig {
78
+ readonly reporter?: PolicyReporter;
79
+ }
80
+ interface CoreConfigOptions {
81
+ readonly observability?: CoreObservabilityConfig;
82
+ }
83
+ /**
84
+ * Centraliza a configuracao pura do core sem depender de implementacoes
85
+ * concretas de logging, tracing ou report.
86
+ */
87
+ declare class CoreConfig {
88
+ #private;
89
+ constructor(options?: CoreConfigOptions);
90
+ configure(options: CoreConfigOptions): this;
91
+ reset(): this;
92
+ getPolicyReporter(): PolicyReporter;
93
+ getConditionEvaluationOptions(engineVersion: number): ConditionEvaluationOptions;
94
+ }
95
+ //#endregion
96
+ //#region src/core/policies/engines/v1/condition-types.d.ts
97
+ type ConditionOp = "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "notIn" | "isNull" | "isNotNull";
98
+ interface ConditionLeafNode {
99
+ readonly field: string;
100
+ readonly op: ConditionOp;
101
+ readonly value: unknown;
102
+ readonly allowNull?: true;
103
+ }
104
+ interface ConditionAndNode {
105
+ readonly and: readonly ConditionNode[];
106
+ }
107
+ interface ConditionOrNode {
108
+ readonly or: readonly ConditionNode[];
109
+ }
110
+ interface ConditionNotNode {
111
+ readonly not: ConditionNode;
112
+ }
113
+ type ConditionNode = ConditionLeafNode | ConditionAndNode | ConditionOrNode | ConditionNotNode;
114
+ //#endregion
115
+ //#region src/core/policies/engines/v1/gate/gate-types-v1.d.ts
116
+ type GatePayloadV1 = {
117
+ readonly condition: ConditionNode;
118
+ } | {
119
+ readonly allowIf: ConditionNode;
120
+ readonly defaultOutcome: "ALLOW" | "DENY";
121
+ };
122
+ //#endregion
123
+ //#region src/core/policies/engines/gate-payload.d.ts
124
+ type GatePayload = GatePayloadV1;
125
+ //#endregion
126
+ //#region src/core/policies/engines/gate-types.d.ts
127
+ type PolicyContext = Record<string, unknown>;
128
+ interface GateTraceLeafSnapshot {
129
+ readonly kind: "LEAF";
130
+ readonly field: string;
131
+ readonly op: string;
132
+ readonly allowNull?: true;
133
+ }
134
+ type GateTraceNodeSnapshot = GateTraceLeafSnapshot | {
135
+ readonly kind: "AND" | "OR";
136
+ readonly childCount: number;
137
+ } | {
138
+ readonly kind: "NOT";
139
+ };
140
+ interface GateViolationTrace {
141
+ readonly conditionPath: string;
142
+ readonly decisiveNode: GateTraceNodeSnapshot;
143
+ readonly lastEvaluatedLeaf: GateTraceLeafSnapshot;
144
+ readonly lastEvaluatedLeafPath: string;
145
+ readonly lastEvaluatedLeafResult: boolean;
146
+ readonly field: string;
147
+ readonly op: string;
148
+ }
149
+ interface PolicyViolation {
150
+ readonly code: string;
151
+ readonly message: string;
152
+ readonly trace?: GateViolationTrace;
153
+ }
154
+ type GateStatus = "ALLOW" | "DENY";
155
+ interface GateOutcomeData {
156
+ readonly violations: readonly PolicyViolation[];
157
+ }
158
+ /** Semantic outcome of a GATE policy evaluation. */
159
+ type GateOutcome = Outcome<GateStatus, GateOutcomeData>;
160
+ /**
161
+ * Contract every versioned gate engine must satisfy.
162
+ * Receives an already-parsed `GatePayload`; parsing from raw `unknown` is
163
+ * the registry's responsibility via `parseGatePayload`.
164
+ */
165
+ interface VersionedGateEngine {
166
+ readonly version: number;
167
+ evaluate(payload: GatePayload, context: PolicyContext): Result<GateOutcome, string>;
168
+ }
169
+ //#endregion
170
+ export { ConditionEvaluationReportTag as A, asPolicyDefinitionId as C, ConditionEvaluationOptions as D, ConditionEvaluationCause as E, ConditionEvaluationReport as O, asPolicyDecisionId as S, asTenantId as T, PolicyReporter as _, GateTraceNodeSnapshot as a, SchoolId as b, PolicyViolation as c, GatePayloadV1 as d, ConditionLeafNode as f, CoreObservabilityConfig as g, CoreConfigOptions as h, GateTraceLeafSnapshot as i, ConditionEvaluatorReporter as j, ConditionEvaluationReportLevel as k, VersionedGateEngine as l, CoreConfig as m, GateOutcomeData as n, GateViolationTrace as o, ConditionNode as p, GateStatus as r, PolicyContext as s, GateOutcome as t, GatePayload as u, PolicyDecisionId as v, asSchoolId as w, TenantId as x, PolicyDefinitionId as y };
171
+ //# sourceMappingURL=gate-types.d.cts.map