@cullet/erp-core 1.0.5 → 1.0.7
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.
- package/dist/gate-engine-registry.js.map +1 -1
- package/dist/gate-types.d.ts +1 -1
- package/dist/gate-v1-payload.schema.js +43 -0
- package/dist/gate-v1-payload.schema.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/outcome.js.map +1 -1
- package/dist/policies/engines/v1/gate/index.d.ts +4 -0
- package/dist/policies/engines/v1/gate/index.js.map +1 -1
- package/dist/policy-service.js +14 -11
- package/dist/policy-service.js.map +1 -1
- package/dist/validation-code.js +43 -9
- package/dist/validation-code.js.map +1 -1
- package/dist/validation-error.d.ts +15 -1
- package/dist/validation-error.js.map +1 -1
- package/meta.json +2 -2
- package/package.json +1 -1
- package/src/core/application/commands/command.ts +4 -4
- package/src/core/application/commands/index.ts +2 -2
- package/src/core/application/commands/requested-by.ts +3 -3
- package/src/core/application/index.ts +8 -8
- package/src/core/application/policy-error-mapper.ts +2 -2
- package/src/core/application/ports/index.ts +10 -6
- package/src/core/application/ports/policy-port.ts +6 -3
- package/src/core/application/ports/temporal-repository.port.ts +2 -2
- package/src/core/application/queries/index.ts +2 -2
- package/src/core/application/queries/query.ts +4 -4
- package/src/core/application/temporal/index.ts +2 -2
- package/src/core/application/temporal/temporal-context.ts +2 -2
- package/src/core/application/temporal/temporal-use-case.ts +4 -4
- package/src/core/application/use-case.ts +3 -3
- package/src/core/config/core-config.instance.ts +2 -2
- package/src/core/config/core-config.ts +3 -3
- package/src/core/config/index.ts +8 -5
- package/src/core/config/policy-reporter.ts +3 -3
- package/src/core/config/silent-policy-reporter.ts +1 -1
- package/src/core/domain/entity.ts +11 -5
- package/src/core/domain/rulesets/entity-ruleset.contracts.ts +2 -2
- package/src/core/domain/rulesets/ruleset-registry.ts +2 -2
- package/src/core/domain/rulesets/value-object-ruleset.contracts.ts +2 -2
- package/src/core/domain/temporal/index.ts +4 -4
- package/src/core/domain/temporal/temporal-range.ts +2 -2
- package/src/core/domain/temporal/temporal-snapshot.ts +3 -3
- package/src/core/domain/temporal/transaction-time.ts +3 -3
- package/src/core/domain/temporal/valid-time.ts +3 -3
- package/src/core/domain/value-object.ts +3 -3
- package/src/core/errors/app-error.ts +6 -2
- package/src/core/errors/authentication-error.ts +3 -3
- package/src/core/errors/authorization-error.ts +3 -3
- package/src/core/errors/business-rule-violation-error.ts +3 -3
- package/src/core/errors/conflict-error.ts +3 -3
- package/src/core/errors/idempotency-error.ts +3 -3
- package/src/core/errors/index.ts +23 -23
- package/src/core/errors/integration-error.ts +3 -3
- package/src/core/errors/legacy-incompatible-error.ts +3 -3
- package/src/core/errors/not-found-error.ts +3 -3
- package/src/core/errors/serialization-error.ts +3 -3
- package/src/core/errors/temporal-error.ts +3 -3
- package/src/core/errors/unexpected-error.ts +3 -3
- package/src/core/errors/utils/index.ts +2 -1
- package/src/core/errors/utils/json-safe.ts +25 -7
- package/src/core/errors/validation-error.ts +5 -5
- package/src/core/exceptions/business-rule-violation-exception.ts +1 -1
- package/src/core/exceptions/entity-not-found-exception.ts +1 -1
- package/src/core/exceptions/invalid-state-transition-exception.ts +1 -1
- package/src/core/exceptions/invariant-violation-exception.ts +1 -1
- package/src/core/exceptions/validation-exception.ts +3 -3
- package/src/core/index.ts +7 -7
- package/src/core/policies/asof/asof.ts +4 -4
- package/src/core/policies/asof/index.ts +2 -2
- package/src/core/policies/catalog/catalog.instance.ts +3 -3
- package/src/core/policies/catalog/index.ts +6 -6
- package/src/core/policies/catalog/policy-catalog-entry.ts +3 -3
- package/src/core/policies/catalog/policy-catalog.ts +3 -3
- package/src/core/policies/catalog/policy-key.ts +1 -1
- package/src/core/policies/context/context-builder.ts +5 -5
- package/src/core/policies/context/context-registry.instance.ts +3 -3
- package/src/core/policies/context/context-registry.ts +2 -2
- package/src/core/policies/context/context-resolver.ts +2 -2
- package/src/core/policies/context/context-seed.ts +2 -2
- package/src/core/policies/context/index.ts +9 -9
- package/src/core/policies/context/path.ts +1 -1
- package/src/core/policies/defs/in-memory-policy-definition-repo.ts +3 -3
- package/src/core/policies/defs/index.ts +8 -8
- package/src/core/policies/defs/policy-definition-repository.ts +1 -1
- package/src/core/policies/defs/policy-definition.ts +6 -6
- package/src/core/policies/defs/policy-payload.contracts.ts +1 -1
- package/src/core/policies/defs/policy-scope.ts +2 -2
- package/src/core/policies/defs/policy-semver.ts +12 -5
- package/src/core/policies/engines/compute-engine-registry.ts +9 -6
- package/src/core/policies/engines/compute-evaluator-registry.ts +1 -1
- package/src/core/policies/engines/compute-payload.ts +1 -1
- package/src/core/policies/engines/compute-registry.ts +7 -7
- package/src/core/policies/engines/compute-types.ts +4 -4
- package/src/core/policies/engines/condition-evaluator-reporter.ts +2 -0
- package/src/core/policies/engines/gate-engine-registry.ts +3 -3
- package/src/core/policies/engines/gate-payload.ts +1 -1
- package/src/core/policies/engines/gate-types.ts +3 -3
- package/src/core/policies/engines/index.ts +14 -14
- package/src/core/policies/engines/parse-compute-payload.ts +4 -4
- package/src/core/policies/engines/parse-gate-payload.ts +4 -4
- package/src/core/policies/engines/v1/compute/compute-engine-v1.ts +6 -6
- package/src/core/policies/engines/v1/compute/compute-payload.schema.ts +3 -3
- package/src/core/policies/engines/v1/compute/index.ts +4 -4
- package/src/core/policies/engines/v1/compute/resolve-decision-table-v1.ts +4 -4
- package/src/core/policies/engines/v1/condition-evaluator.ts +90 -6
- package/src/core/policies/engines/v1/condition-schema.ts +1 -1
- package/src/core/policies/engines/v1/gate/gate-engine-v1.ts +7 -7
- package/src/core/policies/engines/v1/gate/gate-types-v1.ts +1 -1
- package/src/core/policies/engines/v1/gate/gate-v1-payload.schema.ts +3 -3
- package/src/core/policies/engines/v1/gate/index.ts +4 -4
- package/src/core/policies/engines/v1/index.ts +3 -3
- package/src/core/policies/index.ts +30 -23
- package/src/core/policies/package/policy-package.ts +3 -3
- package/src/core/policies/policy-ids.ts +3 -3
- package/src/core/policies/resolver/index.ts +1 -1
- package/src/core/policies/resolver/policy-resolver.ts +4 -4
- package/src/core/policies/service/index.ts +3 -3
- package/src/core/policies/service/policy-evaluation-error.ts +1 -1
- package/src/core/policies/service/policy-service.ts +21 -14
- package/src/core/policies/utils/date.ts +1 -1
- package/src/core/policies/utils/hash.ts +23 -11
- package/src/core/policies/utils/index.ts +3 -3
- package/src/core/policies/utils/result.ts +1 -1
- package/src/core/result/outcome.ts +1 -1
- package/src/core/shared/aggregate-version.ts +1 -1
- package/src/core/shared/hashing.ts +33 -4
- package/src/core/shared/immutable.ts +13 -2
- package/src/core/shared/temporal-guards.ts +1 -1
- package/src/core/versioning/domain-event-contracts.ts +5 -5
- package/src/examples/rulesets/entity/order-creation-rules-v1.ts +2 -2
- package/src/examples/rulesets/entity/order-invariants-v1.ts +2 -2
- package/src/examples/rulesets/entity/order-invariants-v2.ts +3 -3
- package/src/examples/rulesets/entity/order.ts +1 -1
- package/src/examples/rulesets/value-object/cpf-rules-v1.ts +1 -1
- package/src/examples/rulesets/value-object/cpf-rules-v2.ts +2 -2
- package/src/examples/rulesets/value-object/cpf.ts +1 -1
- package/src/examples/rulesets/value-object/customer.ts +3 -3
- package/src/examples/rulesets/value-object/person-name-rules-v1.ts +1 -1
- package/src/examples/rulesets/value-object/person-name-rules-v2.ts +2 -2
- package/src/examples/rulesets/value-object/person-name.ts +1 -1
- package/src/version.ts +1 -1
|
@@ -1 +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\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\";\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(\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\";\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(\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\";\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(\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\";\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(\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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"}
|
|
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.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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"}
|
package/dist/gate-types.d.ts
CHANGED
|
@@ -86,7 +86,7 @@ interface ConditionEvaluationCause {
|
|
|
86
86
|
readonly message: string;
|
|
87
87
|
}
|
|
88
88
|
type ConditionEvaluationReportLevel = "warn" | "error";
|
|
89
|
-
type ConditionEvaluationReportTag = "MISSING_CONTEXT_FIELD" | "NULLISH_NUMERIC_OPERAND_NOT_ALLOWED" | "NULLISH_DATE_OPERAND_NOT_ALLOWED" | "INVALID_DATE_OPERAND" | "CONDITION_EVAL_THREW";
|
|
89
|
+
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";
|
|
90
90
|
interface ConditionEvaluationReport {
|
|
91
91
|
readonly occurredAt: Date;
|
|
92
92
|
readonly level: ConditionEvaluationReportLevel;
|
|
@@ -331,6 +331,8 @@ const CONDITION_EVAL_THROWN_TAG = "CONDITION_EVAL_THREW";
|
|
|
331
331
|
const NULLISH_NUMERIC_OPERAND_NOT_ALLOWED_TAG = "NULLISH_NUMERIC_OPERAND_NOT_ALLOWED";
|
|
332
332
|
const NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG = "NULLISH_DATE_OPERAND_NOT_ALLOWED";
|
|
333
333
|
const INVALID_DATE_OPERAND_TAG = "INVALID_DATE_OPERAND";
|
|
334
|
+
const INVALID_NUMERIC_OPERAND_TAG = "INVALID_NUMERIC_OPERAND";
|
|
335
|
+
const INVALID_SET_OPERAND_TAG = "INVALID_SET_OPERAND";
|
|
334
336
|
const EMPTY_OR_CONDITION_TAG = "EMPTY_OR_CONDITION";
|
|
335
337
|
const EMPTY_AND_CONDITION_TAG = "EMPTY_AND_CONDITION";
|
|
336
338
|
const ISO_8601_UTC_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
@@ -375,6 +377,12 @@ var ConditionEvaluatorV1 = class ConditionEvaluatorV1 {
|
|
|
375
377
|
static buildInvalidDateOperandMessage(node) {
|
|
376
378
|
return `${INVALID_DATE_OPERAND_TAG}: "${node.field}" with operator "${node.op}" requires Date or ISO 8601 UTC string operands`;
|
|
377
379
|
}
|
|
380
|
+
static buildInvalidNumericOperandMessage(node) {
|
|
381
|
+
return `${INVALID_NUMERIC_OPERAND_TAG}: "${node.field}" with operator "${node.op}" requires numeric operands`;
|
|
382
|
+
}
|
|
383
|
+
static buildInvalidSetOperandMessage(node) {
|
|
384
|
+
return `${INVALID_SET_OPERAND_TAG}: "${node.field}" with operator "${node.op}" requires an array operand`;
|
|
385
|
+
}
|
|
378
386
|
static buildEmptyOrConditionMessage() {
|
|
379
387
|
return `${EMPTY_OR_CONDITION_TAG}: OR nodes must contain at least one child condition`;
|
|
380
388
|
}
|
|
@@ -439,6 +447,38 @@ var ConditionEvaluatorV1 = class ConditionEvaluatorV1 {
|
|
|
439
447
|
}));
|
|
440
448
|
return Result.err(message);
|
|
441
449
|
}
|
|
450
|
+
reportInvalidNumericOperand(node, actual) {
|
|
451
|
+
const message = ConditionEvaluatorV1.buildInvalidNumericOperandMessage(node);
|
|
452
|
+
this.options.reporter.error(this.buildReport({
|
|
453
|
+
level: "error",
|
|
454
|
+
tag: INVALID_NUMERIC_OPERAND_TAG,
|
|
455
|
+
message,
|
|
456
|
+
details: {
|
|
457
|
+
field: node.field,
|
|
458
|
+
op: node.op,
|
|
459
|
+
actual,
|
|
460
|
+
expected: node.value,
|
|
461
|
+
node
|
|
462
|
+
}
|
|
463
|
+
}));
|
|
464
|
+
return Result.err(message);
|
|
465
|
+
}
|
|
466
|
+
reportInvalidSetOperand(node, actual) {
|
|
467
|
+
const message = ConditionEvaluatorV1.buildInvalidSetOperandMessage(node);
|
|
468
|
+
this.options.reporter.error(this.buildReport({
|
|
469
|
+
level: "error",
|
|
470
|
+
tag: INVALID_SET_OPERAND_TAG,
|
|
471
|
+
message,
|
|
472
|
+
details: {
|
|
473
|
+
field: node.field,
|
|
474
|
+
op: node.op,
|
|
475
|
+
actual,
|
|
476
|
+
expected: node.value,
|
|
477
|
+
node
|
|
478
|
+
}
|
|
479
|
+
}));
|
|
480
|
+
return Result.err(message);
|
|
481
|
+
}
|
|
442
482
|
evaluateDateRelationalNode(node, actual) {
|
|
443
483
|
if (!ConditionEvaluatorV1.isRelationalOperator(node.op)) return null;
|
|
444
484
|
const actualDateResult = ConditionEvaluatorV1.parseComparableDate(actual);
|
|
@@ -516,6 +556,8 @@ var ConditionEvaluatorV1 = class ConditionEvaluatorV1 {
|
|
|
516
556
|
}));
|
|
517
557
|
return Result.err(message);
|
|
518
558
|
}
|
|
559
|
+
if (actual === null) return Result.ok(false);
|
|
560
|
+
if (typeof actual !== "number" || typeof node.value !== "number") return this.reportInvalidNumericOperand(node, actual);
|
|
519
561
|
return Result.ok(this.evaluateOperator(actual, node.op, node.value));
|
|
520
562
|
}
|
|
521
563
|
evaluateLeafNode(node) {
|
|
@@ -539,6 +581,7 @@ var ConditionEvaluatorV1 = class ConditionEvaluatorV1 {
|
|
|
539
581
|
if (dateResult !== null) return dateResult;
|
|
540
582
|
return this.evaluateNumericRelationalNode(node, actual);
|
|
541
583
|
}
|
|
584
|
+
if ((node.op === "in" || node.op === "notIn") && !Array.isArray(node.value)) return this.reportInvalidSetOperand(node, actual);
|
|
542
585
|
return Result.ok(this.evaluateOperator(actual, node.op, node.value));
|
|
543
586
|
} catch (error) {
|
|
544
587
|
return this.conditionEvalErr(node, error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-v1-payload.schema.js","names":["#initialReporter","#currentReporter","#bridgeToConditionReporter"],"sources":["../src/core/exceptions/domain-exception.ts","../src/core/exceptions/invariant-violation-exception.ts","../src/core/shared/temporal-guards.ts","../src/core/config/silent-policy-reporter.ts","../src/core/config/core-config.ts","../src/core/config/core-config.instance.ts","../src/core/result/result.ts","../src/core/policies/utils/date.ts","../src/core/policies/context/path.ts","../src/core/policies/engines/v1/condition-schema.ts","../src/core/policies/engines/v1/condition-evaluator.ts","../src/core/policies/engines/v1/gate/gate-v1-payload.schema.ts"],"sourcesContent":["abstract class DomainException extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = new.target.name;\n }\n}\n\nexport { DomainException };\n","import { DomainException } from \"./domain-exception\";\n\nclass InvariantViolationException extends DomainException {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport { InvariantViolationException };\n","import { InvariantViolationException } from \"../exceptions/invariant-violation-exception\";\n\nfunction isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\nfunction cloneDate(date: Date): Date {\n return new Date(date.getTime());\n}\n\nfunction assertValidDate(\n fieldName: string,\n value: unknown,\n): asserts value is Date {\n if (!isValidDate(value)) {\n throw new InvariantViolationException(\n `${fieldName} must be a valid Date instance`,\n );\n }\n}\n\nexport { assertValidDate, cloneDate, isValidDate };\n","import type { PolicyReporter } from \"./policy-reporter\";\n\nexport class SilentPolicyReporter implements PolicyReporter {\n report(_event: Parameters<PolicyReporter[\"report\"]>[0]): void {}\n}\n","import type {\n ConditionEvaluationOptions,\n ConditionEvaluatorReporter,\n} from \"../policies/engines/condition-evaluator-reporter\";\nimport type { PolicyEvent, PolicyReporter } from \"./policy-reporter\";\nimport { SilentPolicyReporter } from \"./silent-policy-reporter\";\n\nexport interface CoreObservabilityConfig {\n readonly reporter?: PolicyReporter;\n}\n\nexport interface CoreConfigOptions {\n readonly observability?: CoreObservabilityConfig;\n}\n\nfunction reportSafely(\n policyReporter: PolicyReporter,\n event: PolicyEvent,\n): void {\n try {\n policyReporter.report(event);\n } catch {\n // Falhas de telemetria nao podem interromper o fluxo de dominio.\n }\n}\n\n/**\n * Centraliza a configuracao pura do core sem depender de implementacoes\n * concretas de logging, tracing ou report.\n */\nexport class CoreConfig {\n readonly #initialReporter: PolicyReporter;\n #currentReporter: PolicyReporter;\n\n constructor(options: CoreConfigOptions = {}) {\n const reporter =\n options.observability?.reporter ?? new SilentPolicyReporter();\n this.#initialReporter = reporter;\n this.#currentReporter = reporter;\n }\n\n configure(options: CoreConfigOptions): this {\n const reporter = options.observability?.reporter;\n if (reporter) {\n this.#currentReporter = reporter;\n }\n return this;\n }\n\n // Restores the reporter captured at construction time.\n reset(): this {\n this.#currentReporter = this.#initialReporter;\n return this;\n }\n\n getPolicyReporter(): PolicyReporter {\n return this.#currentReporter;\n }\n\n getConditionEvaluationOptions(\n engineVersion: number,\n ): ConditionEvaluationOptions {\n return {\n reporter: this.#bridgeToConditionReporter(this.#currentReporter),\n engineVersion,\n };\n }\n\n #bridgeToConditionReporter(\n policyReporter: PolicyReporter,\n ): ConditionEvaluatorReporter {\n return {\n warn(report) {\n reportSafely(policyReporter, {\n kind: \"condition-eval\",\n ...report,\n } satisfies PolicyEvent);\n },\n error(report) {\n reportSafely(policyReporter, {\n kind: \"condition-eval\",\n ...report,\n } satisfies PolicyEvent);\n },\n };\n }\n}\n","import { CoreConfig } from \"./core-config\";\nimport { SilentPolicyReporter } from \"./silent-policy-reporter\";\n\n/**\n * Shared instance for the application composition root.\n * Use `new CoreConfig()` for isolated runtimes, tests, or multi-tenant hosts.\n *\n * The default reporter is silent so the core has no runtime logging dependency.\n * Hosts can swap in their own `PolicyReporter` via\n * `coreConfig.configure({ observability: { reporter } })`.\n */\nexport const coreConfig = new CoreConfig({\n observability: { reporter: new SilentPolicyReporter() },\n});\n","/**\n * Represents the outcome of an operation that may succeed or fail.\n * Useful for avoiding excessive exceptions and making error flows explicit.\n */\nexport abstract class Result<T, E> {\n protected constructor() {\n // prevent direct instantiation\n }\n\n /**\n * Creates a success result containing a value.\n */\n static ok<T>(value: T): Result<T, never> {\n return new Ok(value);\n }\n\n /**\n * Creates an error result containing an error object.\n */\n static err<E>(error: E): Result<never, E> {\n return new Err(error);\n }\n\n /**\n * Returns true when this is a success result.\n */\n abstract isOk(): this is Ok<T>;\n\n /**\n * Returns true when this is an error result.\n */\n abstract isErr(): this is Err<E>;\n\n /**\n * Runs a handler based on the result state (similar to pattern matching).\n */\n abstract match<R>(handlers: {\n ok: (value: T) => R;\n err: (error: E) => R;\n }): R;\n\n /**\n * Returns the value when this is success, or null when this is an error.\n */\n getOrNull(): T | null {\n return this.match({\n ok: (value) => value,\n err: () => null,\n });\n }\n\n /**\n * Returns the error when this is a failure, or null when this is a success.\n */\n errorOrNull(): E | null {\n return this.match({\n ok: () => null,\n err: (error) => error,\n });\n }\n\n /**\n * Returns the value when this is a success, or throws the error when this is a failure.\n */\n getOrThrow(): T {\n return this.match({\n ok: (value) => value,\n err: (error) => {\n throw error instanceof Error ? error : new Error(String(error));\n },\n });\n }\n\n /**\n * Transforms the success value using the provided function. Keeps the error when this is a failure.\n */\n map<R>(transform: (value: T) => R): Result<R, E> {\n return this.match<Result<R, E>>({\n ok: (value) => Result.ok(transform(value)),\n // TS does not \"see\" variance here; the cast is intentional and safe:\n // Err carries no T, so it can be widened to Result<R, E> safely.\n err: (error) => Result.err(error) as unknown as Result<R, E>,\n });\n }\n\n /**\n * Transforms the error using the provided function. Keeps the value when this is a success.\n */\n mapError<F>(transform: (error: E) => F): Result<T, F> {\n return this.match<Result<T, F>>({\n // Ok carries no E, so it can be widened to Result<T, F>.\n ok: (value) => Result.ok(value) as unknown as Result<T, F>,\n err: (error) => Result.err(transform(error)),\n });\n }\n\n /**\n * Chains another operation that returns a Result when this result is a success.\n */\n flatMap<R>(transform: (value: T) => Result<R, E>): Result<R, E> {\n return this.match<Result<R, E>>({\n ok: (value) => transform(value),\n err: (error) => Result.err(error) as unknown as Result<R, E>,\n });\n }\n}\n\n/**\n * Success variant of Result.\n */\nexport class Ok<T> extends Result<T, never> {\n public readonly value: T;\n\n constructor(value: T) {\n super();\n this.value = value;\n Object.freeze(this);\n }\n\n isOk(): this is Ok<T> {\n return true;\n }\n\n isErr(): this is Err<never> {\n return false;\n }\n\n match<R>(handlers: { ok: (value: T) => R; err: (error: never) => R }): R {\n return handlers.ok(this.value);\n }\n}\n\n/**\n * Error variant of Result.\n */\nexport class Err<E> extends Result<never, E> {\n public readonly error: E;\n\n constructor(error: E) {\n super();\n this.error = error;\n Object.freeze(this);\n }\n\n isOk(): this is Ok<never> {\n return false;\n }\n\n isErr(): this is Err<E> {\n return true;\n }\n\n match<R>(handlers: { ok: (value: never) => R; err: (error: E) => R }): R {\n return handlers.err(this.error);\n }\n}\n","import { isValidDate } from \"../../shared/temporal-guards\";\n\nexport class PolicyDateUtils {\n static isValid(value: Date): boolean {\n return isValidDate(value);\n }\n}\n","/**\n * Utilities for reading/writing values at dot-separated paths\n * in plain objects, e.g. \"installment.dueDate\".\n */\n\nimport { Result } from \"../../result/result\";\n\nexport class PolicyContextPath {\n private static readonly FORBIDDEN_SEGMENTS = new Set([\n \"__proto__\",\n \"prototype\",\n \"constructor\",\n ]);\n\n private static resolve(\n obj: Record<string, unknown>,\n path: string,\n ): Result<\n {\n readonly found: boolean;\n readonly value: unknown;\n },\n string\n > {\n const segmentsResult = PolicyContextPath.parseSegments(path);\n if (segmentsResult.isErr()) {\n return Result.err(segmentsResult.errorOrNull()!);\n }\n\n const segments = segmentsResult.getOrNull()!;\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (\n current === null ||\n current === undefined ||\n typeof current !== \"object\"\n ) {\n return Result.ok({ found: false, value: undefined });\n }\n\n const record = current as Record<string, unknown>;\n if (!Object.prototype.hasOwnProperty.call(record, segment)) {\n return Result.ok({ found: false, value: undefined });\n }\n\n current = record[segment];\n }\n\n return Result.ok({ found: true, value: current });\n }\n\n private static parseSegments(\n path: string,\n ): Result<readonly string[], string> {\n if (path.trim().length === 0) {\n return Result.err(\"Path cannot be empty\");\n }\n\n const segments = path.split(\".\");\n if (segments.some((segment) => segment.length === 0)) {\n return Result.err(`Path \"${path}\" contains an empty segment`);\n }\n\n const forbiddenSegment = segments.find((segment) =>\n PolicyContextPath.FORBIDDEN_SEGMENTS.has(segment),\n );\n if (forbiddenSegment !== undefined) {\n return Result.err(\n `Path \"${path}\" contains forbidden segment \"${forbiddenSegment}\"`,\n );\n }\n\n return Result.ok(segments);\n }\n\n private static isPlainRecord(\n value: unknown,\n ): value is Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n }\n\n static getOrAbsent(\n obj: Record<string, unknown>,\n path: string,\n ): Result<unknown, \"absent\"> {\n const resolvedPath = PolicyContextPath.resolve(obj, path);\n if (resolvedPath.isErr()) {\n return Result.err(\"absent\");\n }\n\n const { found, value } = resolvedPath.getOrNull()!;\n if (!found) {\n return Result.err(\"absent\");\n }\n\n return Result.ok(value);\n }\n\n static has(obj: Record<string, unknown>, path: string): boolean {\n const resolvedPath = PolicyContextPath.resolve(obj, path);\n if (resolvedPath.isErr()) {\n return false;\n }\n\n return resolvedPath.getOrNull()!.found;\n }\n\n static set(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n ): Result<void, string> {\n const segmentsResult = PolicyContextPath.parseSegments(path);\n if (segmentsResult.isErr()) {\n return Result.err(segmentsResult.errorOrNull()!);\n }\n\n const segments = segmentsResult.getOrNull()!;\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n const next = current[seg];\n\n if (next === undefined) {\n const container = Object.create(null) as Record<\n string,\n unknown\n >;\n current[seg] = container;\n current = container;\n continue;\n }\n\n if (!PolicyContextPath.isPlainRecord(next)) {\n return Result.err(\n `Cannot create nested path \"${path}\" because \"${segments\n .slice(0, i + 1)\n .join(\".\")}\" already contains a non-plain object`,\n );\n }\n\n current = next;\n }\n\n current[segments[segments.length - 1]] = value;\n return Result.ok(undefined);\n }\n}\n","import { z } from \"zod\";\n\nimport type { ConditionLeafNode, ConditionNode } from \"./condition-types\";\n\n// ─── Shared v1 condition Zod schemas ─────────────────────────────────────────\n// Extracted from gate/v1 so both gate/v1 and compute/v1 can validate\n// condition nodes without either engine depending on the other.\n\nconst conditionOpSchema = z.enum([\n \"eq\",\n \"neq\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"in\",\n \"notIn\",\n \"isNull\",\n \"isNotNull\",\n]);\n\nexport const conditionLeafNodeSchema: z.ZodType<ConditionLeafNode> = z\n .object({\n field: z.string().min(1),\n op: conditionOpSchema,\n value: z.unknown(),\n allowNull: z.literal(true).optional(),\n })\n .strict() as z.ZodType<ConditionLeafNode>;\n\nexport const conditionNodeSchema: z.ZodType<ConditionNode> = z.lazy(() =>\n z.union([\n conditionLeafNodeSchema,\n z\n .object({\n and: z.array(conditionNodeSchema).min(1),\n })\n .strict(),\n z\n .object({\n or: z.array(conditionNodeSchema).min(1),\n })\n .strict(),\n z\n .object({\n not: conditionNodeSchema,\n })\n .strict(),\n ]),\n);\n","import { PolicyContextPath } from \"../../context\";\nimport { PolicyDateUtils } from \"../../utils\";\nimport { Result } from \"../../../result/result\";\n\nimport type {\n ConditionAndNode,\n ConditionLeafNode,\n ConditionNode,\n ConditionNotNode,\n ConditionOp,\n ConditionOrNode,\n} from \"./condition-types\";\nimport type {\n ConditionEvaluationOptions,\n ConditionEvaluationReport,\n} from \"../condition-evaluator-reporter\";\nimport type { PolicyContext } from \"../gate-types\";\n\nconst CONDITION_EVAL_THROWN_TAG = \"CONDITION_EVAL_THREW\";\nconst NULLISH_NUMERIC_OPERAND_NOT_ALLOWED_TAG =\n \"NULLISH_NUMERIC_OPERAND_NOT_ALLOWED\";\nconst NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG = \"NULLISH_DATE_OPERAND_NOT_ALLOWED\";\nconst INVALID_DATE_OPERAND_TAG = \"INVALID_DATE_OPERAND\";\nconst EMPTY_OR_CONDITION_TAG = \"EMPTY_OR_CONDITION\";\nconst EMPTY_AND_CONDITION_TAG = \"EMPTY_AND_CONDITION\";\nconst ISO_8601_UTC_DATE_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nexport interface ConditionEvaluationTrace {\n readonly conditionPath: string;\n readonly decisiveNode: ConditionNode;\n readonly lastEvaluatedLeaf: ConditionLeafNode;\n readonly lastEvaluatedLeafPath: string;\n readonly lastEvaluatedLeafResult: boolean;\n}\n\nexport interface TracedConditionEvaluation {\n readonly matched: boolean;\n readonly trace: ConditionEvaluationTrace;\n}\n\ntype RelationalOperator = Extract<ConditionOp, \"gt\" | \"gte\" | \"lt\" | \"lte\">;\n\nexport class ConditionEvaluatorV1 {\n constructor(\n private readonly context: PolicyContext,\n private readonly options: ConditionEvaluationOptions,\n ) {}\n\n private static isLeafNode(node: ConditionNode): node is ConditionLeafNode {\n return \"field\" in node && \"op\" in node;\n }\n\n private static isAndNode(node: ConditionNode): node is ConditionAndNode {\n return \"and\" in node;\n }\n\n private static isOrNode(node: ConditionNode): node is ConditionOrNode {\n return \"or\" in node;\n }\n\n private static isNotNode(node: ConditionNode): node is ConditionNotNode {\n return \"not\" in node;\n }\n\n private static isRelationalOperator(\n op: ConditionOp,\n ): op is RelationalOperator {\n return op === \"gt\" || op === \"gte\" || op === \"lt\" || op === \"lte\";\n }\n\n private static describeError(error: unknown): {\n name: string;\n message: string;\n } {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n\n return {\n name: \"NonErrorThrown\",\n message: String(error),\n };\n }\n\n private static buildNullishNumericOperandMessage(\n node: ConditionLeafNode,\n actual: null | undefined,\n ): string {\n const resolvedValue = actual === null ? \"null\" : \"undefined\";\n\n return `${NULLISH_NUMERIC_OPERAND_NOT_ALLOWED_TAG}: \"${node.field}\" resolved to ${resolvedValue} for numeric operator \"${node.op}\"`;\n }\n\n private static buildNullishDateOperandMessage(\n node: ConditionLeafNode,\n actual: null | undefined,\n ): string {\n const resolvedValue = actual === null ? \"null\" : \"undefined\";\n\n return `${NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG}: \"${node.field}\" resolved to ${resolvedValue} for date comparison operator \"${node.op}\"`;\n }\n\n private static buildInvalidDateOperandMessage(\n node: ConditionLeafNode,\n ): string {\n return `${INVALID_DATE_OPERAND_TAG}: \"${node.field}\" with operator \"${node.op}\" requires Date or ISO 8601 UTC string operands`;\n }\n\n private static buildEmptyOrConditionMessage(): string {\n return `${EMPTY_OR_CONDITION_TAG}: OR nodes must contain at least one child condition`;\n }\n\n private static buildEmptyAndConditionMessage(): string {\n return `${EMPTY_AND_CONDITION_TAG}: AND nodes must contain at least one child condition`;\n }\n\n private static parseComparableDate(\n value: unknown,\n ): Result<Date, string> | null {\n if (value instanceof Date) {\n if (!PolicyDateUtils.isValid(value)) {\n return Result.err(\"Invalid Date instance\");\n }\n\n return Result.ok(value);\n }\n\n if (\n typeof value !== \"string\" ||\n !ISO_8601_UTC_DATE_PATTERN.test(value)\n ) {\n return null;\n }\n\n const parsed = new Date(value);\n if (\n !PolicyDateUtils.isValid(parsed) ||\n parsed.toISOString() !== value\n ) {\n return Result.err(\"Invalid ISO 8601 UTC date string\");\n }\n\n return Result.ok(parsed);\n }\n\n private static evaluateRelationalNumbers(\n actual: number,\n op: RelationalOperator,\n expected: number,\n ): boolean {\n switch (op) {\n case \"gt\":\n return actual > expected;\n case \"gte\":\n return actual >= expected;\n case \"lt\":\n return actual < expected;\n case \"lte\":\n return actual <= expected;\n }\n }\n\n private buildReport(params: {\n readonly level: ConditionEvaluationReport[\"level\"];\n readonly tag: ConditionEvaluationReport[\"tag\"];\n readonly message: string;\n readonly details: Readonly<Record<string, unknown>>;\n }): ConditionEvaluationReport {\n return {\n occurredAt: new Date(),\n level: params.level,\n tag: params.tag,\n message: params.message,\n engineVersion: this.options.engineVersion,\n details: params.details,\n };\n }\n\n private conditionEvalErr<TValue>(\n node: ConditionNode,\n error: unknown,\n ): Result<TValue, string> {\n const cause = ConditionEvaluatorV1.describeError(error);\n const message = `${CONDITION_EVAL_THROWN_TAG}: ${cause.name}: ${cause.message}`;\n\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: CONDITION_EVAL_THROWN_TAG,\n message,\n details: { node, cause },\n }),\n );\n\n return Result.err(message);\n }\n\n private reportDateOperandError(\n node: ConditionLeafNode,\n actual: unknown,\n ): Result<boolean, string> {\n const message =\n ConditionEvaluatorV1.buildInvalidDateOperandMessage(node);\n\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: INVALID_DATE_OPERAND_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n private evaluateDateRelationalNode(\n node: ConditionLeafNode,\n actual: unknown,\n ): Result<boolean, string> | null {\n if (!ConditionEvaluatorV1.isRelationalOperator(node.op)) {\n return null;\n }\n\n const actualDateResult =\n ConditionEvaluatorV1.parseComparableDate(actual);\n const expectedDateResult = ConditionEvaluatorV1.parseComparableDate(\n node.value,\n );\n\n if (actualDateResult === null && expectedDateResult === null) {\n return null;\n }\n\n const allowsNull = node.allowNull === true;\n\n if (actual === null) {\n if (allowsNull) {\n return Result.ok(false);\n }\n\n const message = ConditionEvaluatorV1.buildNullishDateOperandMessage(\n node,\n actual,\n );\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n allowNull: allowsNull,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n if (actual === undefined) {\n const message = ConditionEvaluatorV1.buildNullishDateOperandMessage(\n node,\n actual,\n );\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n allowNull: allowsNull,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n if (\n actualDateResult === null ||\n actualDateResult.isErr() ||\n expectedDateResult === null ||\n expectedDateResult.isErr()\n ) {\n return this.reportDateOperandError(node, actual);\n }\n\n return Result.ok(\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actualDateResult.getOrNull()!.getTime(),\n node.op,\n expectedDateResult.getOrNull()!.getTime(),\n ),\n );\n }\n\n private evaluateOperator(\n actual: unknown,\n op: ConditionOp,\n expected: unknown,\n ): boolean {\n switch (op) {\n case \"eq\":\n return actual === expected;\n case \"neq\":\n return actual !== expected;\n case \"gt\":\n return (\n typeof actual === \"number\" &&\n typeof expected === \"number\" &&\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actual,\n op,\n expected,\n )\n );\n case \"gte\":\n return (\n typeof actual === \"number\" &&\n typeof expected === \"number\" &&\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actual,\n op,\n expected,\n )\n );\n case \"lt\":\n return (\n typeof actual === \"number\" &&\n typeof expected === \"number\" &&\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actual,\n op,\n expected,\n )\n );\n case \"lte\":\n return (\n typeof actual === \"number\" &&\n typeof expected === \"number\" &&\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actual,\n op,\n expected,\n )\n );\n case \"in\":\n return Array.isArray(expected) && expected.includes(actual);\n case \"notIn\":\n return Array.isArray(expected) && !expected.includes(actual);\n case \"isNull\":\n return actual === null;\n case \"isNotNull\":\n return actual !== null && actual !== undefined;\n }\n }\n\n private evaluateNumericRelationalNode(\n node: ConditionLeafNode,\n actual: unknown,\n ): Result<boolean, string> {\n const allowsNull = node.allowNull === true;\n if (actual === undefined || (actual === null && !allowsNull)) {\n const message =\n ConditionEvaluatorV1.buildNullishNumericOperandMessage(\n node,\n actual as null | undefined,\n );\n\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: NULLISH_NUMERIC_OPERAND_NOT_ALLOWED_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n allowNull: allowsNull,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n return Result.ok(this.evaluateOperator(actual, node.op, node.value));\n }\n\n private evaluateLeafNode(node: ConditionLeafNode): Result<boolean, string> {\n const actualResult = PolicyContextPath.getOrAbsent(\n this.context,\n node.field,\n );\n if (actualResult.isErr()) {\n this.options.reporter.warn(\n this.buildReport({\n level: \"warn\",\n tag: \"MISSING_CONTEXT_FIELD\",\n message: `MISSING_CONTEXT_FIELD: \"${node.field}\" not found in context`,\n details: { field: node.field, node },\n }),\n );\n\n return Result.err(\n `MISSING_CONTEXT_FIELD: \"${node.field}\" not found in context`,\n );\n }\n\n try {\n const actual = actualResult.getOrThrow();\n if (ConditionEvaluatorV1.isRelationalOperator(node.op)) {\n const dateResult = this.evaluateDateRelationalNode(\n node,\n actual,\n );\n if (dateResult !== null) {\n return dateResult;\n }\n\n return this.evaluateNumericRelationalNode(node, actual);\n }\n\n return Result.ok(\n this.evaluateOperator(actual, node.op, node.value),\n );\n } catch (error) {\n return this.conditionEvalErr(node, error);\n }\n }\n\n private buildTrace(params: {\n readonly conditionPath: string;\n readonly decisiveNode: ConditionNode;\n readonly lastEvaluatedLeaf: ConditionLeafNode;\n readonly lastEvaluatedLeafPath: string;\n readonly lastEvaluatedLeafResult: boolean;\n }): ConditionEvaluationTrace {\n return {\n conditionPath: params.conditionPath,\n decisiveNode: params.decisiveNode,\n lastEvaluatedLeaf: params.lastEvaluatedLeaf,\n lastEvaluatedLeafPath: params.lastEvaluatedLeafPath,\n lastEvaluatedLeafResult: params.lastEvaluatedLeafResult,\n };\n }\n\n private evaluateWithTraceInternal(\n node: ConditionNode,\n path: string,\n ): Result<TracedConditionEvaluation, string> {\n if (ConditionEvaluatorV1.isLeafNode(node)) {\n const leafResult = this.evaluateLeafNode(node);\n if (leafResult.isErr()) {\n return Result.err(leafResult.errorOrNull()!);\n }\n\n const matched = leafResult.getOrNull()!;\n return Result.ok({\n matched,\n trace: this.buildTrace({\n conditionPath: path,\n decisiveNode: node,\n lastEvaluatedLeaf: node,\n lastEvaluatedLeafPath: path,\n lastEvaluatedLeafResult: matched,\n }),\n });\n }\n\n if (ConditionEvaluatorV1.isAndNode(node)) {\n if (node.and.length === 0) {\n return Result.err(\n ConditionEvaluatorV1.buildEmptyAndConditionMessage(),\n );\n }\n\n let lastTracedChild: TracedConditionEvaluation | null = null;\n\n for (const [index, child] of node.and.entries()) {\n const childPath = `${path}.and[${index}]`;\n const childResult = this.evaluateWithTraceInternal(\n child,\n childPath,\n );\n if (childResult.isErr()) {\n return Result.err(childResult.errorOrNull()!);\n }\n\n const tracedChild = childResult.getOrNull()!;\n lastTracedChild = tracedChild;\n if (!tracedChild.matched) {\n return Result.ok({\n matched: false,\n trace: this.buildTrace({\n conditionPath: childPath,\n decisiveNode: child,\n lastEvaluatedLeaf:\n tracedChild.trace.lastEvaluatedLeaf,\n lastEvaluatedLeafPath:\n tracedChild.trace.lastEvaluatedLeafPath,\n lastEvaluatedLeafResult:\n tracedChild.trace.lastEvaluatedLeafResult,\n }),\n });\n }\n }\n\n return Result.ok({\n matched: true,\n trace: lastTracedChild!.trace,\n });\n }\n\n if (ConditionEvaluatorV1.isOrNode(node)) {\n let lastTrace: ConditionEvaluationTrace | null = null;\n\n for (const [index, child] of node.or.entries()) {\n const childResult = this.evaluateWithTraceInternal(\n child,\n `${path}.or[${index}]`,\n );\n if (childResult.isErr()) {\n return Result.err(childResult.errorOrNull()!);\n }\n\n const tracedChild = childResult.getOrNull()!;\n lastTrace = tracedChild.trace;\n if (tracedChild.matched) {\n return Result.ok({\n matched: true,\n trace: tracedChild.trace,\n });\n }\n }\n\n if (lastTrace === null) {\n return Result.err(\n ConditionEvaluatorV1.buildEmptyOrConditionMessage(),\n );\n }\n\n return Result.ok({ matched: false, trace: lastTrace! });\n }\n\n if (ConditionEvaluatorV1.isNotNode(node)) {\n const childPath = `${path}.not`;\n const childResult = this.evaluateWithTraceInternal(\n node.not,\n childPath,\n );\n if (childResult.isErr()) {\n return Result.err(childResult.errorOrNull()!);\n }\n\n const tracedChild = childResult.getOrNull()!;\n return Result.ok({\n matched: !tracedChild.matched,\n trace: this.buildTrace({\n conditionPath: path,\n decisiveNode: node,\n lastEvaluatedLeaf: tracedChild.trace.lastEvaluatedLeaf,\n lastEvaluatedLeafPath:\n tracedChild.trace.lastEvaluatedLeafPath,\n lastEvaluatedLeafResult:\n tracedChild.trace.lastEvaluatedLeafResult,\n }),\n });\n }\n\n return this.conditionEvalErr(\n node,\n new TypeError(\"Invalid condition node shape\"),\n );\n }\n\n evaluate(node: ConditionNode): Result<boolean, string> {\n try {\n const result = this.evaluateWithTraceInternal(node, \"$\");\n if (result.isErr()) {\n return Result.err(result.errorOrNull()!);\n }\n\n return Result.ok(result.getOrNull()!.matched);\n } catch (error) {\n return this.conditionEvalErr(node, error);\n }\n }\n\n evaluateWithTrace(\n node: ConditionNode,\n ): Result<TracedConditionEvaluation, string> {\n try {\n return this.evaluateWithTraceInternal(node, \"$\");\n } catch (error) {\n return this.conditionEvalErr(node, error);\n }\n }\n\n static extractFields(node: ConditionNode): string[] {\n if (ConditionEvaluatorV1.isLeafNode(node)) {\n return [node.field];\n }\n\n if (ConditionEvaluatorV1.isAndNode(node)) {\n return node.and.flatMap((child) =>\n ConditionEvaluatorV1.extractFields(child),\n );\n }\n\n if (ConditionEvaluatorV1.isOrNode(node)) {\n return node.or.flatMap((child) =>\n ConditionEvaluatorV1.extractFields(child),\n );\n }\n\n if (ConditionEvaluatorV1.isNotNode(node)) {\n return ConditionEvaluatorV1.extractFields(node.not);\n }\n\n return [];\n }\n}\n","import { z } from \"zod\";\n\nimport { Result } from \"../../../../result/result\";\n\nimport type { GatePayloadV1 } from \"./gate-types-v1\";\nimport {\n conditionLeafNodeSchema,\n conditionNodeSchema,\n} from \"../condition-schema\";\n\n// Re-export so gate/v1 public API remains unchanged.\nexport { conditionLeafNodeSchema, conditionNodeSchema };\n\nexport class GatePayloadSchemaV1 {\n static readonly schema = z.union([\n z\n .object({\n condition: conditionNodeSchema,\n })\n .strict(),\n z\n .object({\n allowIf: conditionNodeSchema,\n defaultOutcome: z.enum([\"ALLOW\", \"DENY\"]),\n })\n .strict(),\n ]);\n\n static parse(payload: unknown): Result<GatePayloadV1, string> {\n const parsed = GatePayloadSchemaV1.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 gate payload: ${details}`);\n }\n\n return Result.ok(parsed.data as GatePayloadV1);\n }\n}\n\nexport const gatePayloadSchema = GatePayloadSchemaV1.schema;\n"],"mappings":";;AAAA,IAAe,kBAAf,cAAuC,MAAM;CACzC,YAAY,SAAiB;EACzB,MAAM,OAAO;EACb,OAAO,eAAe,MAAM,IAAI,OAAO,SAAS;EAChD,KAAK,OAAO,IAAI,OAAO;CAC3B;AACJ;;;ACJA,IAAM,8BAAN,cAA0C,gBAAgB;CACtD,YAAY,SAAiB;EACzB,MAAM,OAAO;CACjB;AACJ;;;ACJA,SAAS,YAAY,OAA+B;CAChD,OAAO,iBAAiB,QAAQ,CAAC,OAAO,MAAM,MAAM,QAAQ,CAAC;AACjE;AAEA,SAAS,UAAU,MAAkB;CACjC,OAAO,IAAI,KAAK,KAAK,QAAQ,CAAC;AAClC;AAEA,SAAS,gBACL,WACA,OACqB;CACrB,IAAI,CAAC,YAAY,KAAK,GAClB,MAAM,IAAI,4BACN,GAAG,UAAU,+BACjB;AAER;;;ACjBA,IAAa,uBAAb,MAA4D;CACxD,OAAO,QAAuD,CAAC;AACnE;;;ACWA,SAAS,aACL,gBACA,OACI;CACJ,IAAI;EACA,eAAe,OAAO,KAAK;CAC/B,QAAQ,CAER;AACJ;;;;;AAMA,IAAa,aAAb,MAAwB;CACpB;CACA;CAEA,YAAY,UAA6B,CAAC,GAAG;EACzC,MAAM,WACF,QAAQ,eAAe,YAAY,IAAI,qBAAqB;EAChE,KAAKA,mBAAmB;EACxB,KAAKC,mBAAmB;CAC5B;CAEA,UAAU,SAAkC;EACxC,MAAM,WAAW,QAAQ,eAAe;EACxC,IAAI,UACA,KAAKA,mBAAmB;EAE5B,OAAO;CACX;CAGA,QAAc;EACV,KAAKA,mBAAmB,KAAKD;EAC7B,OAAO;CACX;CAEA,oBAAoC;EAChC,OAAO,KAAKC;CAChB;CAEA,8BACI,eAC0B;EAC1B,OAAO;GACH,UAAU,KAAKC,2BAA2B,KAAKD,gBAAgB;GAC/D;EACJ;CACJ;CAEA,2BACI,gBAC0B;EAC1B,OAAO;GACH,KAAK,QAAQ;IACT,aAAa,gBAAgB;KACzB,MAAM;KACN,GAAG;IACP,CAAuB;GAC3B;GACA,MAAM,QAAQ;IACV,aAAa,gBAAgB;KACzB,MAAM;KACN,GAAG;IACP,CAAuB;GAC3B;EACJ;CACJ;AACJ;;;;;;;;;;;AC3EA,MAAa,aAAa,IAAI,WAAW,EACrC,eAAe,EAAE,UAAU,IAAI,qBAAqB,EAAE,EAC1D,CAAC;;;;;;;ACTD,IAAsB,SAAtB,MAAsB,OAAa;CAC/B,cAAwB,CAExB;;;;CAKA,OAAO,GAAM,OAA4B;EACrC,OAAO,IAAI,GAAG,KAAK;CACvB;;;;CAKA,OAAO,IAAO,OAA4B;EACtC,OAAO,IAAI,IAAI,KAAK;CACxB;;;;CAuBA,YAAsB;EAClB,OAAO,KAAK,MAAM;GACd,KAAK,UAAU;GACf,WAAW;EACf,CAAC;CACL;;;;CAKA,cAAwB;EACpB,OAAO,KAAK,MAAM;GACd,UAAU;GACV,MAAM,UAAU;EACpB,CAAC;CACL;;;;CAKA,aAAgB;EACZ,OAAO,KAAK,MAAM;GACd,KAAK,UAAU;GACf,MAAM,UAAU;IACZ,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GAClE;EACJ,CAAC;CACL;;;;CAKA,IAAO,WAA0C;EAC7C,OAAO,KAAK,MAAoB;GAC5B,KAAK,UAAU,OAAO,GAAG,UAAU,KAAK,CAAC;GAGzC,MAAM,UAAU,OAAO,IAAI,KAAK;EACpC,CAAC;CACL;;;;CAKA,SAAY,WAA0C;EAClD,OAAO,KAAK,MAAoB;GAE5B,KAAK,UAAU,OAAO,GAAG,KAAK;GAC9B,MAAM,UAAU,OAAO,IAAI,UAAU,KAAK,CAAC;EAC/C,CAAC;CACL;;;;CAKA,QAAW,WAAqD;EAC5D,OAAO,KAAK,MAAoB;GAC5B,KAAK,UAAU,UAAU,KAAK;GAC9B,MAAM,UAAU,OAAO,IAAI,KAAK;EACpC,CAAC;CACL;AACJ;;;;AAKA,IAAa,KAAb,cAA2B,OAAiB;CAGxC,YAAY,OAAU;EAClB,MAAM;EACN,KAAK,QAAQ;EACb,OAAO,OAAO,IAAI;CACtB;CAEA,OAAsB;EAClB,OAAO;CACX;CAEA,QAA4B;EACxB,OAAO;CACX;CAEA,MAAS,UAAgE;EACrE,OAAO,SAAS,GAAG,KAAK,KAAK;CACjC;AACJ;;;;AAKA,IAAa,MAAb,cAA4B,OAAiB;CAGzC,YAAY,OAAU;EAClB,MAAM;EACN,KAAK,QAAQ;EACb,OAAO,OAAO,IAAI;CACtB;CAEA,OAA0B;EACtB,OAAO;CACX;CAEA,QAAwB;EACpB,OAAO;CACX;CAEA,MAAS,UAAgE;EACrE,OAAO,SAAS,IAAI,KAAK,KAAK;CAClC;AACJ;;;ACzJA,IAAa,kBAAb,MAA6B;CACzB,OAAO,QAAQ,OAAsB;EACjC,OAAO,YAAY,KAAK;CAC5B;AACJ;;;;;;;ACCA,IAAa,oBAAb,MAAa,kBAAkB;;4BACkB,IAAI,IAAI;GACjD;GACA;GACA;EACJ,CAAC;;CAED,OAAe,QACX,KACA,MAOF;EACE,MAAM,iBAAiB,kBAAkB,cAAc,IAAI;EAC3D,IAAI,eAAe,MAAM,GACrB,OAAO,OAAO,IAAI,eAAe,YAAY,CAAE;EAGnD,MAAM,WAAW,eAAe,UAAU;EAC1C,IAAI,UAAmB;EAEvB,KAAK,MAAM,WAAW,UAAU;GAC5B,IACI,YAAY,QACZ,YAAY,KAAA,KACZ,OAAO,YAAY,UAEnB,OAAO,OAAO,GAAG;IAAE,OAAO;IAAO,OAAO,KAAA;GAAU,CAAC;GAGvD,MAAM,SAAS;GACf,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,QAAQ,OAAO,GACrD,OAAO,OAAO,GAAG;IAAE,OAAO;IAAO,OAAO,KAAA;GAAU,CAAC;GAGvD,UAAU,OAAO;EACrB;EAEA,OAAO,OAAO,GAAG;GAAE,OAAO;GAAM,OAAO;EAAQ,CAAC;CACpD;CAEA,OAAe,cACX,MACiC;EACjC,IAAI,KAAK,KAAK,EAAE,WAAW,GACvB,OAAO,OAAO,IAAI,sBAAsB;EAG5C,MAAM,WAAW,KAAK,MAAM,GAAG;EAC/B,IAAI,SAAS,MAAM,YAAY,QAAQ,WAAW,CAAC,GAC/C,OAAO,OAAO,IAAI,SAAS,KAAK,4BAA4B;EAGhE,MAAM,mBAAmB,SAAS,MAAM,YACpC,kBAAkB,mBAAmB,IAAI,OAAO,CACpD;EACA,IAAI,qBAAqB,KAAA,GACrB,OAAO,OAAO,IACV,SAAS,KAAK,gCAAgC,iBAAiB,EACnE;EAGJ,OAAO,OAAO,GAAG,QAAQ;CAC7B;CAEA,OAAe,cACX,OACgC;EAChC,IACI,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAQ,KAAK,GAEnB,OAAO;EAGX,MAAM,YAAY,OAAO,eAAe,KAAK;EAC7C,OAAO,cAAc,OAAO,aAAa,cAAc;CAC3D;CAEA,OAAO,YACH,KACA,MACyB;EACzB,MAAM,eAAe,kBAAkB,QAAQ,KAAK,IAAI;EACxD,IAAI,aAAa,MAAM,GACnB,OAAO,OAAO,IAAI,QAAQ;EAG9B,MAAM,EAAE,OAAO,UAAU,aAAa,UAAU;EAChD,IAAI,CAAC,OACD,OAAO,OAAO,IAAI,QAAQ;EAG9B,OAAO,OAAO,GAAG,KAAK;CAC1B;CAEA,OAAO,IAAI,KAA8B,MAAuB;EAC5D,MAAM,eAAe,kBAAkB,QAAQ,KAAK,IAAI;EACxD,IAAI,aAAa,MAAM,GACnB,OAAO;EAGX,OAAO,aAAa,UAAU,EAAG;CACrC;CAEA,OAAO,IACH,KACA,MACA,OACoB;EACpB,MAAM,iBAAiB,kBAAkB,cAAc,IAAI;EAC3D,IAAI,eAAe,MAAM,GACrB,OAAO,OAAO,IAAI,eAAe,YAAY,CAAE;EAGnD,MAAM,WAAW,eAAe,UAAU;EAC1C,IAAI,UAAmC;EAEvC,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;GAC1C,MAAM,MAAM,SAAS;GACrB,MAAM,OAAO,QAAQ;GAErB,IAAI,SAAS,KAAA,GAAW;IACpB,MAAM,YAAY,OAAO,OAAO,IAAI;IAIpC,QAAQ,OAAO;IACf,UAAU;IACV;GACJ;GAEA,IAAI,CAAC,kBAAkB,cAAc,IAAI,GACrC,OAAO,OAAO,IACV,8BAA8B,KAAK,aAAa,SAC3C,MAAM,GAAG,IAAI,CAAC,EACd,KAAK,GAAG,EAAE,sCACnB;GAGJ,UAAU;EACd;EAEA,QAAQ,SAAS,SAAS,SAAS,MAAM;EACzC,OAAO,OAAO,GAAG,KAAA,CAAS;CAC9B;AACJ;;;ACtJA,MAAM,oBAAoB,EAAE,KAAK;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACJ,CAAC;AAED,MAAa,0BAAwD,EAChE,OAAO;CACJ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;CACvB,IAAI;CACJ,OAAO,EAAE,QAAQ;CACjB,WAAW,EAAE,QAAQ,IAAI,EAAE,SAAS;AACxC,CAAC,EACA,OAAO;AAEZ,MAAa,sBAAgD,EAAE,WAC3D,EAAE,MAAM;CACJ;CACA,EACK,OAAO,EACJ,KAAK,EAAE,MAAM,mBAAmB,EAAE,IAAI,CAAC,EAC3C,CAAC,EACA,OAAO;CACZ,EACK,OAAO,EACJ,IAAI,EAAE,MAAM,mBAAmB,EAAE,IAAI,CAAC,EAC1C,CAAC,EACA,OAAO;CACZ,EACK,OAAO,EACJ,KAAK,oBACT,CAAC,EACA,OAAO;AAChB,CAAC,CACL;;;AC/BA,MAAM,4BAA4B;AAClC,MAAM,0CACF;AACJ,MAAM,uCAAuC;AAC7C,MAAM,2BAA2B;AACjC,MAAM,yBAAyB;AAC/B,MAAM,0BAA0B;AAChC,MAAM,4BACF;AAiBJ,IAAa,uBAAb,MAAa,qBAAqB;CAC9B,YACI,SACA,SACF;EAFmB,KAAA,UAAA;EACA,KAAA,UAAA;CAClB;CAEH,OAAe,WAAW,MAAgD;EACtE,OAAO,WAAW,QAAQ,QAAQ;CACtC;CAEA,OAAe,UAAU,MAA+C;EACpE,OAAO,SAAS;CACpB;CAEA,OAAe,SAAS,MAA8C;EAClE,OAAO,QAAQ;CACnB;CAEA,OAAe,UAAU,MAA+C;EACpE,OAAO,SAAS;CACpB;CAEA,OAAe,qBACX,IACwB;EACxB,OAAO,OAAO,QAAQ,OAAO,SAAS,OAAO,QAAQ,OAAO;CAChE;CAEA,OAAe,cAAc,OAG3B;EACE,IAAI,iBAAiB,OACjB,OAAO;GACH,MAAM,MAAM;GACZ,SAAS,MAAM;EACnB;EAGJ,OAAO;GACH,MAAM;GACN,SAAS,OAAO,KAAK;EACzB;CACJ;CAEA,OAAe,kCACX,MACA,QACM;EACN,MAAM,gBAAgB,WAAW,OAAO,SAAS;EAEjD,OAAO,GAAG,wCAAwC,KAAK,KAAK,MAAM,gBAAgB,cAAc,yBAAyB,KAAK,GAAG;CACrI;CAEA,OAAe,+BACX,MACA,QACM;EACN,MAAM,gBAAgB,WAAW,OAAO,SAAS;EAEjD,OAAO,GAAG,qCAAqC,KAAK,KAAK,MAAM,gBAAgB,cAAc,iCAAiC,KAAK,GAAG;CAC1I;CAEA,OAAe,+BACX,MACM;EACN,OAAO,GAAG,yBAAyB,KAAK,KAAK,MAAM,mBAAmB,KAAK,GAAG;CAClF;CAEA,OAAe,+BAAuC;EAClD,OAAO,GAAG,uBAAuB;CACrC;CAEA,OAAe,gCAAwC;EACnD,OAAO,GAAG,wBAAwB;CACtC;CAEA,OAAe,oBACX,OAC2B;EAC3B,IAAI,iBAAiB,MAAM;GACvB,IAAI,CAAC,gBAAgB,QAAQ,KAAK,GAC9B,OAAO,OAAO,IAAI,uBAAuB;GAG7C,OAAO,OAAO,GAAG,KAAK;EAC1B;EAEA,IACI,OAAO,UAAU,YACjB,CAAC,0BAA0B,KAAK,KAAK,GAErC,OAAO;EAGX,MAAM,SAAS,IAAI,KAAK,KAAK;EAC7B,IACI,CAAC,gBAAgB,QAAQ,MAAM,KAC/B,OAAO,YAAY,MAAM,OAEzB,OAAO,OAAO,IAAI,kCAAkC;EAGxD,OAAO,OAAO,GAAG,MAAM;CAC3B;CAEA,OAAe,0BACX,QACA,IACA,UACO;EACP,QAAQ,IAAR;GACI,KAAK,MACD,OAAO,SAAS;GACpB,KAAK,OACD,OAAO,UAAU;GACrB,KAAK,MACD,OAAO,SAAS;GACpB,KAAK,OACD,OAAO,UAAU;EACzB;CACJ;CAEA,YAAoB,QAKU;EAC1B,OAAO;GACH,4BAAY,IAAI,KAAK;GACrB,OAAO,OAAO;GACd,KAAK,OAAO;GACZ,SAAS,OAAO;GAChB,eAAe,KAAK,QAAQ;GAC5B,SAAS,OAAO;EACpB;CACJ;CAEA,iBACI,MACA,OACsB;EACtB,MAAM,QAAQ,qBAAqB,cAAc,KAAK;EACtD,MAAM,UAAU,GAAG,0BAA0B,IAAI,MAAM,KAAK,IAAI,MAAM;EAEtE,KAAK,QAAQ,SAAS,MAClB,KAAK,YAAY;GACb,OAAO;GACP,KAAK;GACL;GACA,SAAS;IAAE;IAAM;GAAM;EAC3B,CAAC,CACL;EAEA,OAAO,OAAO,IAAI,OAAO;CAC7B;CAEA,uBACI,MACA,QACuB;EACvB,MAAM,UACF,qBAAqB,+BAA+B,IAAI;EAE5D,KAAK,QAAQ,SAAS,MAClB,KAAK,YAAY;GACb,OAAO;GACP,KAAK;GACL;GACA,SAAS;IACL,OAAO,KAAK;IACZ,IAAI,KAAK;IACT;IACA,UAAU,KAAK;IACf;GACJ;EACJ,CAAC,CACL;EAEA,OAAO,OAAO,IAAI,OAAO;CAC7B;CAEA,2BACI,MACA,QAC8B;EAC9B,IAAI,CAAC,qBAAqB,qBAAqB,KAAK,EAAE,GAClD,OAAO;EAGX,MAAM,mBACF,qBAAqB,oBAAoB,MAAM;EACnD,MAAM,qBAAqB,qBAAqB,oBAC5C,KAAK,KACT;EAEA,IAAI,qBAAqB,QAAQ,uBAAuB,MACpD,OAAO;EAGX,MAAM,aAAa,KAAK,cAAc;EAEtC,IAAI,WAAW,MAAM;GACjB,IAAI,YACA,OAAO,OAAO,GAAG,KAAK;GAG1B,MAAM,UAAU,qBAAqB,+BACjC,MACA,MACJ;GACA,KAAK,QAAQ,SAAS,MAClB,KAAK,YAAY;IACb,OAAO;IACP,KAAK;IACL;IACA,SAAS;KACL,OAAO,KAAK;KACZ,IAAI,KAAK;KACT;KACA,UAAU,KAAK;KACf,WAAW;KACX;IACJ;GACJ,CAAC,CACL;GAEA,OAAO,OAAO,IAAI,OAAO;EAC7B;EAEA,IAAI,WAAW,KAAA,GAAW;GACtB,MAAM,UAAU,qBAAqB,+BACjC,MACA,MACJ;GACA,KAAK,QAAQ,SAAS,MAClB,KAAK,YAAY;IACb,OAAO;IACP,KAAK;IACL;IACA,SAAS;KACL,OAAO,KAAK;KACZ,IAAI,KAAK;KACT;KACA,UAAU,KAAK;KACf,WAAW;KACX;IACJ;GACJ,CAAC,CACL;GAEA,OAAO,OAAO,IAAI,OAAO;EAC7B;EAEA,IACI,qBAAqB,QACrB,iBAAiB,MAAM,KACvB,uBAAuB,QACvB,mBAAmB,MAAM,GAEzB,OAAO,KAAK,uBAAuB,MAAM,MAAM;EAGnD,OAAO,OAAO,GACV,qBAAqB,0BACjB,iBAAiB,UAAU,EAAG,QAAQ,GACtC,KAAK,IACL,mBAAmB,UAAU,EAAG,QAAQ,CAC5C,CACJ;CACJ;CAEA,iBACI,QACA,IACA,UACO;EACP,QAAQ,IAAR;GACI,KAAK,MACD,OAAO,WAAW;GACtB,KAAK,OACD,OAAO,WAAW;GACtB,KAAK,MACD,OACI,OAAO,WAAW,YAClB,OAAO,aAAa,YACpB,qBAAqB,0BACjB,QACA,IACA,QACJ;GAER,KAAK,OACD,OACI,OAAO,WAAW,YAClB,OAAO,aAAa,YACpB,qBAAqB,0BACjB,QACA,IACA,QACJ;GAER,KAAK,MACD,OACI,OAAO,WAAW,YAClB,OAAO,aAAa,YACpB,qBAAqB,0BACjB,QACA,IACA,QACJ;GAER,KAAK,OACD,OACI,OAAO,WAAW,YAClB,OAAO,aAAa,YACpB,qBAAqB,0BACjB,QACA,IACA,QACJ;GAER,KAAK,MACD,OAAO,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,MAAM;GAC9D,KAAK,SACD,OAAO,MAAM,QAAQ,QAAQ,KAAK,CAAC,SAAS,SAAS,MAAM;GAC/D,KAAK,UACD,OAAO,WAAW;GACtB,KAAK,aACD,OAAO,WAAW,QAAQ,WAAW,KAAA;EAC7C;CACJ;CAEA,8BACI,MACA,QACuB;EACvB,MAAM,aAAa,KAAK,cAAc;EACtC,IAAI,WAAW,KAAA,KAAc,WAAW,QAAQ,CAAC,YAAa;GAC1D,MAAM,UACF,qBAAqB,kCACjB,MACA,MACJ;GAEJ,KAAK,QAAQ,SAAS,MAClB,KAAK,YAAY;IACb,OAAO;IACP,KAAK;IACL;IACA,SAAS;KACL,OAAO,KAAK;KACZ,IAAI,KAAK;KACT;KACA,UAAU,KAAK;KACf,WAAW;KACX;IACJ;GACJ,CAAC,CACL;GAEA,OAAO,OAAO,IAAI,OAAO;EAC7B;EAEA,OAAO,OAAO,GAAG,KAAK,iBAAiB,QAAQ,KAAK,IAAI,KAAK,KAAK,CAAC;CACvE;CAEA,iBAAyB,MAAkD;EACvE,MAAM,eAAe,kBAAkB,YACnC,KAAK,SACL,KAAK,KACT;EACA,IAAI,aAAa,MAAM,GAAG;GACtB,KAAK,QAAQ,SAAS,KAClB,KAAK,YAAY;IACb,OAAO;IACP,KAAK;IACL,SAAS,2BAA2B,KAAK,MAAM;IAC/C,SAAS;KAAE,OAAO,KAAK;KAAO;IAAK;GACvC,CAAC,CACL;GAEA,OAAO,OAAO,IACV,2BAA2B,KAAK,MAAM,uBAC1C;EACJ;EAEA,IAAI;GACA,MAAM,SAAS,aAAa,WAAW;GACvC,IAAI,qBAAqB,qBAAqB,KAAK,EAAE,GAAG;IACpD,MAAM,aAAa,KAAK,2BACpB,MACA,MACJ;IACA,IAAI,eAAe,MACf,OAAO;IAGX,OAAO,KAAK,8BAA8B,MAAM,MAAM;GAC1D;GAEA,OAAO,OAAO,GACV,KAAK,iBAAiB,QAAQ,KAAK,IAAI,KAAK,KAAK,CACrD;EACJ,SAAS,OAAO;GACZ,OAAO,KAAK,iBAAiB,MAAM,KAAK;EAC5C;CACJ;CAEA,WAAmB,QAMU;EACzB,OAAO;GACH,eAAe,OAAO;GACtB,cAAc,OAAO;GACrB,mBAAmB,OAAO;GAC1B,uBAAuB,OAAO;GAC9B,yBAAyB,OAAO;EACpC;CACJ;CAEA,0BACI,MACA,MACyC;EACzC,IAAI,qBAAqB,WAAW,IAAI,GAAG;GACvC,MAAM,aAAa,KAAK,iBAAiB,IAAI;GAC7C,IAAI,WAAW,MAAM,GACjB,OAAO,OAAO,IAAI,WAAW,YAAY,CAAE;GAG/C,MAAM,UAAU,WAAW,UAAU;GACrC,OAAO,OAAO,GAAG;IACb;IACA,OAAO,KAAK,WAAW;KACnB,eAAe;KACf,cAAc;KACd,mBAAmB;KACnB,uBAAuB;KACvB,yBAAyB;IAC7B,CAAC;GACL,CAAC;EACL;EAEA,IAAI,qBAAqB,UAAU,IAAI,GAAG;GACtC,IAAI,KAAK,IAAI,WAAW,GACpB,OAAO,OAAO,IACV,qBAAqB,8BAA8B,CACvD;GAGJ,IAAI,kBAAoD;GAExD,KAAK,MAAM,CAAC,OAAO,UAAU,KAAK,IAAI,QAAQ,GAAG;IAC7C,MAAM,YAAY,GAAG,KAAK,OAAO,MAAM;IACvC,MAAM,cAAc,KAAK,0BACrB,OACA,SACJ;IACA,IAAI,YAAY,MAAM,GAClB,OAAO,OAAO,IAAI,YAAY,YAAY,CAAE;IAGhD,MAAM,cAAc,YAAY,UAAU;IAC1C,kBAAkB;IAClB,IAAI,CAAC,YAAY,SACb,OAAO,OAAO,GAAG;KACb,SAAS;KACT,OAAO,KAAK,WAAW;MACnB,eAAe;MACf,cAAc;MACd,mBACI,YAAY,MAAM;MACtB,uBACI,YAAY,MAAM;MACtB,yBACI,YAAY,MAAM;KAC1B,CAAC;IACL,CAAC;GAET;GAEA,OAAO,OAAO,GAAG;IACb,SAAS;IACT,OAAO,gBAAiB;GAC5B,CAAC;EACL;EAEA,IAAI,qBAAqB,SAAS,IAAI,GAAG;GACrC,IAAI,YAA6C;GAEjD,KAAK,MAAM,CAAC,OAAO,UAAU,KAAK,GAAG,QAAQ,GAAG;IAC5C,MAAM,cAAc,KAAK,0BACrB,OACA,GAAG,KAAK,MAAM,MAAM,EACxB;IACA,IAAI,YAAY,MAAM,GAClB,OAAO,OAAO,IAAI,YAAY,YAAY,CAAE;IAGhD,MAAM,cAAc,YAAY,UAAU;IAC1C,YAAY,YAAY;IACxB,IAAI,YAAY,SACZ,OAAO,OAAO,GAAG;KACb,SAAS;KACT,OAAO,YAAY;IACvB,CAAC;GAET;GAEA,IAAI,cAAc,MACd,OAAO,OAAO,IACV,qBAAqB,6BAA6B,CACtD;GAGJ,OAAO,OAAO,GAAG;IAAE,SAAS;IAAO,OAAO;GAAW,CAAC;EAC1D;EAEA,IAAI,qBAAqB,UAAU,IAAI,GAAG;GACtC,MAAM,YAAY,GAAG,KAAK;GAC1B,MAAM,cAAc,KAAK,0BACrB,KAAK,KACL,SACJ;GACA,IAAI,YAAY,MAAM,GAClB,OAAO,OAAO,IAAI,YAAY,YAAY,CAAE;GAGhD,MAAM,cAAc,YAAY,UAAU;GAC1C,OAAO,OAAO,GAAG;IACb,SAAS,CAAC,YAAY;IACtB,OAAO,KAAK,WAAW;KACnB,eAAe;KACf,cAAc;KACd,mBAAmB,YAAY,MAAM;KACrC,uBACI,YAAY,MAAM;KACtB,yBACI,YAAY,MAAM;IAC1B,CAAC;GACL,CAAC;EACL;EAEA,OAAO,KAAK,iBACR,sBACA,IAAI,UAAU,8BAA8B,CAChD;CACJ;CAEA,SAAS,MAA8C;EACnD,IAAI;GACA,MAAM,SAAS,KAAK,0BAA0B,MAAM,GAAG;GACvD,IAAI,OAAO,MAAM,GACb,OAAO,OAAO,IAAI,OAAO,YAAY,CAAE;GAG3C,OAAO,OAAO,GAAG,OAAO,UAAU,EAAG,OAAO;EAChD,SAAS,OAAO;GACZ,OAAO,KAAK,iBAAiB,MAAM,KAAK;EAC5C;CACJ;CAEA,kBACI,MACyC;EACzC,IAAI;GACA,OAAO,KAAK,0BAA0B,MAAM,GAAG;EACnD,SAAS,OAAO;GACZ,OAAO,KAAK,iBAAiB,MAAM,KAAK;EAC5C;CACJ;CAEA,OAAO,cAAc,MAA+B;EAChD,IAAI,qBAAqB,WAAW,IAAI,GACpC,OAAO,CAAC,KAAK,KAAK;EAGtB,IAAI,qBAAqB,UAAU,IAAI,GACnC,OAAO,KAAK,IAAI,SAAS,UACrB,qBAAqB,cAAc,KAAK,CAC5C;EAGJ,IAAI,qBAAqB,SAAS,IAAI,GAClC,OAAO,KAAK,GAAG,SAAS,UACpB,qBAAqB,cAAc,KAAK,CAC5C;EAGJ,IAAI,qBAAqB,UAAU,IAAI,GACnC,OAAO,qBAAqB,cAAc,KAAK,GAAG;EAGtD,OAAO,CAAC;CACZ;AACJ;;;ACvnBA,IAAa,sBAAb,MAAa,oBAAoB;;gBACJ,EAAE,MAAM,CAC7B,EACK,OAAO,EACJ,WAAW,oBACf,CAAC,EACA,OAAO,GACZ,EACK,OAAO;GACJ,SAAS;GACT,gBAAgB,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC;EAC5C,CAAC,EACA,OAAO,CAChB,CAAC;;CAED,OAAO,MAAM,SAAiD;EAC1D,MAAM,SAAS,oBAAoB,OAAO,UAAU,OAAO;EAC3D,IAAI,CAAC,OAAO,SAAS;GACjB,MAAM,UAAU,OAAO,MAAM,OACxB,KAAK,UAAU;IACZ,MAAM,OAAO,MAAM,KAAK,KAAK,GAAG;IAChC,OAAO,KAAK,SAAS,IACf,GAAG,KAAK,IAAI,MAAM,YAClB,MAAM;GAChB,CAAC,EACA,KAAK,IAAI;GAEd,OAAO,OAAO,IAAI,yBAAyB,SAAS;EACxD;EAEA,OAAO,OAAO,GAAG,OAAO,IAAqB;CACjD;AACJ;AAEA,MAAa,oBAAoB,oBAAoB"}
|
|
1
|
+
{"version":3,"file":"gate-v1-payload.schema.js","names":["#initialReporter","#currentReporter","#bridgeToConditionReporter"],"sources":["../src/core/exceptions/domain-exception.ts","../src/core/exceptions/invariant-violation-exception.ts","../src/core/shared/temporal-guards.ts","../src/core/config/silent-policy-reporter.ts","../src/core/config/core-config.ts","../src/core/config/core-config.instance.ts","../src/core/result/result.ts","../src/core/policies/utils/date.ts","../src/core/policies/context/path.ts","../src/core/policies/engines/v1/condition-schema.ts","../src/core/policies/engines/v1/condition-evaluator.ts","../src/core/policies/engines/v1/gate/gate-v1-payload.schema.ts"],"sourcesContent":["abstract class DomainException extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = new.target.name;\n }\n}\n\nexport { DomainException };\n","import { DomainException } from \"./domain-exception.js\";\n\nclass InvariantViolationException extends DomainException {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport { InvariantViolationException };\n","import { InvariantViolationException } from \"../exceptions/invariant-violation-exception.js\";\n\nfunction isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\nfunction cloneDate(date: Date): Date {\n return new Date(date.getTime());\n}\n\nfunction assertValidDate(\n fieldName: string,\n value: unknown,\n): asserts value is Date {\n if (!isValidDate(value)) {\n throw new InvariantViolationException(\n `${fieldName} must be a valid Date instance`,\n );\n }\n}\n\nexport { assertValidDate, cloneDate, isValidDate };\n","import type { PolicyReporter } from \"./policy-reporter.js\";\n\nexport class SilentPolicyReporter implements PolicyReporter {\n report(_event: Parameters<PolicyReporter[\"report\"]>[0]): void {}\n}\n","import type {\n ConditionEvaluationOptions,\n ConditionEvaluatorReporter,\n} from \"../policies/engines/condition-evaluator-reporter.js\";\nimport type { PolicyEvent, PolicyReporter } from \"./policy-reporter.js\";\nimport { SilentPolicyReporter } from \"./silent-policy-reporter.js\";\n\nexport interface CoreObservabilityConfig {\n readonly reporter?: PolicyReporter;\n}\n\nexport interface CoreConfigOptions {\n readonly observability?: CoreObservabilityConfig;\n}\n\nfunction reportSafely(\n policyReporter: PolicyReporter,\n event: PolicyEvent,\n): void {\n try {\n policyReporter.report(event);\n } catch {\n // Falhas de telemetria nao podem interromper o fluxo de dominio.\n }\n}\n\n/**\n * Centraliza a configuracao pura do core sem depender de implementacoes\n * concretas de logging, tracing ou report.\n */\nexport class CoreConfig {\n readonly #initialReporter: PolicyReporter;\n #currentReporter: PolicyReporter;\n\n constructor(options: CoreConfigOptions = {}) {\n const reporter =\n options.observability?.reporter ?? new SilentPolicyReporter();\n this.#initialReporter = reporter;\n this.#currentReporter = reporter;\n }\n\n configure(options: CoreConfigOptions): this {\n const reporter = options.observability?.reporter;\n if (reporter) {\n this.#currentReporter = reporter;\n }\n return this;\n }\n\n // Restores the reporter captured at construction time.\n reset(): this {\n this.#currentReporter = this.#initialReporter;\n return this;\n }\n\n getPolicyReporter(): PolicyReporter {\n return this.#currentReporter;\n }\n\n getConditionEvaluationOptions(\n engineVersion: number,\n ): ConditionEvaluationOptions {\n return {\n reporter: this.#bridgeToConditionReporter(this.#currentReporter),\n engineVersion,\n };\n }\n\n #bridgeToConditionReporter(\n policyReporter: PolicyReporter,\n ): ConditionEvaluatorReporter {\n return {\n warn(report) {\n reportSafely(policyReporter, {\n kind: \"condition-eval\",\n ...report,\n } satisfies PolicyEvent);\n },\n error(report) {\n reportSafely(policyReporter, {\n kind: \"condition-eval\",\n ...report,\n } satisfies PolicyEvent);\n },\n };\n }\n}\n","import { CoreConfig } from \"./core-config.js\";\nimport { SilentPolicyReporter } from \"./silent-policy-reporter.js\";\n\n/**\n * Shared instance for the application composition root.\n * Use `new CoreConfig()` for isolated runtimes, tests, or multi-tenant hosts.\n *\n * The default reporter is silent so the core has no runtime logging dependency.\n * Hosts can swap in their own `PolicyReporter` via\n * `coreConfig.configure({ observability: { reporter } })`.\n */\nexport const coreConfig = new CoreConfig({\n observability: { reporter: new SilentPolicyReporter() },\n});\n","/**\n * Represents the outcome of an operation that may succeed or fail.\n * Useful for avoiding excessive exceptions and making error flows explicit.\n */\nexport abstract class Result<T, E> {\n protected constructor() {\n // prevent direct instantiation\n }\n\n /**\n * Creates a success result containing a value.\n */\n static ok<T>(value: T): Result<T, never> {\n return new Ok(value);\n }\n\n /**\n * Creates an error result containing an error object.\n */\n static err<E>(error: E): Result<never, E> {\n return new Err(error);\n }\n\n /**\n * Returns true when this is a success result.\n */\n abstract isOk(): this is Ok<T>;\n\n /**\n * Returns true when this is an error result.\n */\n abstract isErr(): this is Err<E>;\n\n /**\n * Runs a handler based on the result state (similar to pattern matching).\n */\n abstract match<R>(handlers: {\n ok: (value: T) => R;\n err: (error: E) => R;\n }): R;\n\n /**\n * Returns the value when this is success, or null when this is an error.\n */\n getOrNull(): T | null {\n return this.match({\n ok: (value) => value,\n err: () => null,\n });\n }\n\n /**\n * Returns the error when this is a failure, or null when this is a success.\n */\n errorOrNull(): E | null {\n return this.match({\n ok: () => null,\n err: (error) => error,\n });\n }\n\n /**\n * Returns the value when this is a success, or throws the error when this is a failure.\n */\n getOrThrow(): T {\n return this.match({\n ok: (value) => value,\n err: (error) => {\n throw error instanceof Error ? error : new Error(String(error));\n },\n });\n }\n\n /**\n * Transforms the success value using the provided function. Keeps the error when this is a failure.\n */\n map<R>(transform: (value: T) => R): Result<R, E> {\n return this.match<Result<R, E>>({\n ok: (value) => Result.ok(transform(value)),\n // TS does not \"see\" variance here; the cast is intentional and safe:\n // Err carries no T, so it can be widened to Result<R, E> safely.\n err: (error) => Result.err(error) as unknown as Result<R, E>,\n });\n }\n\n /**\n * Transforms the error using the provided function. Keeps the value when this is a success.\n */\n mapError<F>(transform: (error: E) => F): Result<T, F> {\n return this.match<Result<T, F>>({\n // Ok carries no E, so it can be widened to Result<T, F>.\n ok: (value) => Result.ok(value) as unknown as Result<T, F>,\n err: (error) => Result.err(transform(error)),\n });\n }\n\n /**\n * Chains another operation that returns a Result when this result is a success.\n */\n flatMap<R>(transform: (value: T) => Result<R, E>): Result<R, E> {\n return this.match<Result<R, E>>({\n ok: (value) => transform(value),\n err: (error) => Result.err(error) as unknown as Result<R, E>,\n });\n }\n}\n\n/**\n * Success variant of Result.\n */\nexport class Ok<T> extends Result<T, never> {\n public readonly value: T;\n\n constructor(value: T) {\n super();\n this.value = value;\n Object.freeze(this);\n }\n\n isOk(): this is Ok<T> {\n return true;\n }\n\n isErr(): this is Err<never> {\n return false;\n }\n\n match<R>(handlers: { ok: (value: T) => R; err: (error: never) => R }): R {\n return handlers.ok(this.value);\n }\n}\n\n/**\n * Error variant of Result.\n */\nexport class Err<E> extends Result<never, E> {\n public readonly error: E;\n\n constructor(error: E) {\n super();\n this.error = error;\n Object.freeze(this);\n }\n\n isOk(): this is Ok<never> {\n return false;\n }\n\n isErr(): this is Err<E> {\n return true;\n }\n\n match<R>(handlers: { ok: (value: never) => R; err: (error: E) => R }): R {\n return handlers.err(this.error);\n }\n}\n","import { isValidDate } from \"../../shared/temporal-guards.js\";\n\nexport class PolicyDateUtils {\n static isValid(value: Date): boolean {\n return isValidDate(value);\n }\n}\n","/**\n * Utilities for reading/writing values at dot-separated paths\n * in plain objects, e.g. \"installment.dueDate\".\n */\n\nimport { Result } from \"../../result/result.js\";\n\nexport class PolicyContextPath {\n private static readonly FORBIDDEN_SEGMENTS = new Set([\n \"__proto__\",\n \"prototype\",\n \"constructor\",\n ]);\n\n private static resolve(\n obj: Record<string, unknown>,\n path: string,\n ): Result<\n {\n readonly found: boolean;\n readonly value: unknown;\n },\n string\n > {\n const segmentsResult = PolicyContextPath.parseSegments(path);\n if (segmentsResult.isErr()) {\n return Result.err(segmentsResult.errorOrNull()!);\n }\n\n const segments = segmentsResult.getOrNull()!;\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (\n current === null ||\n current === undefined ||\n typeof current !== \"object\"\n ) {\n return Result.ok({ found: false, value: undefined });\n }\n\n const record = current as Record<string, unknown>;\n if (!Object.prototype.hasOwnProperty.call(record, segment)) {\n return Result.ok({ found: false, value: undefined });\n }\n\n current = record[segment];\n }\n\n return Result.ok({ found: true, value: current });\n }\n\n private static parseSegments(\n path: string,\n ): Result<readonly string[], string> {\n if (path.trim().length === 0) {\n return Result.err(\"Path cannot be empty\");\n }\n\n const segments = path.split(\".\");\n if (segments.some((segment) => segment.length === 0)) {\n return Result.err(`Path \"${path}\" contains an empty segment`);\n }\n\n const forbiddenSegment = segments.find((segment) =>\n PolicyContextPath.FORBIDDEN_SEGMENTS.has(segment),\n );\n if (forbiddenSegment !== undefined) {\n return Result.err(\n `Path \"${path}\" contains forbidden segment \"${forbiddenSegment}\"`,\n );\n }\n\n return Result.ok(segments);\n }\n\n private static isPlainRecord(\n value: unknown,\n ): value is Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n }\n\n static getOrAbsent(\n obj: Record<string, unknown>,\n path: string,\n ): Result<unknown, \"absent\"> {\n const resolvedPath = PolicyContextPath.resolve(obj, path);\n if (resolvedPath.isErr()) {\n return Result.err(\"absent\");\n }\n\n const { found, value } = resolvedPath.getOrNull()!;\n if (!found) {\n return Result.err(\"absent\");\n }\n\n return Result.ok(value);\n }\n\n static has(obj: Record<string, unknown>, path: string): boolean {\n const resolvedPath = PolicyContextPath.resolve(obj, path);\n if (resolvedPath.isErr()) {\n return false;\n }\n\n return resolvedPath.getOrNull()!.found;\n }\n\n static set(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n ): Result<void, string> {\n const segmentsResult = PolicyContextPath.parseSegments(path);\n if (segmentsResult.isErr()) {\n return Result.err(segmentsResult.errorOrNull()!);\n }\n\n const segments = segmentsResult.getOrNull()!;\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n const next = current[seg];\n\n if (next === undefined) {\n const container = Object.create(null) as Record<\n string,\n unknown\n >;\n current[seg] = container;\n current = container;\n continue;\n }\n\n if (!PolicyContextPath.isPlainRecord(next)) {\n return Result.err(\n `Cannot create nested path \"${path}\" because \"${segments\n .slice(0, i + 1)\n .join(\".\")}\" already contains a non-plain object`,\n );\n }\n\n current = next;\n }\n\n current[segments[segments.length - 1]] = value;\n return Result.ok(undefined);\n }\n}\n","import { z } from \"zod\";\n\nimport type { ConditionLeafNode, ConditionNode } from \"./condition-types.js\";\n\n// ─── Shared v1 condition Zod schemas ─────────────────────────────────────────\n// Extracted from gate/v1 so both gate/v1 and compute/v1 can validate\n// condition nodes without either engine depending on the other.\n\nconst conditionOpSchema = z.enum([\n \"eq\",\n \"neq\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"in\",\n \"notIn\",\n \"isNull\",\n \"isNotNull\",\n]);\n\nexport const conditionLeafNodeSchema: z.ZodType<ConditionLeafNode> = z\n .object({\n field: z.string().min(1),\n op: conditionOpSchema,\n value: z.unknown(),\n allowNull: z.literal(true).optional(),\n })\n .strict() as z.ZodType<ConditionLeafNode>;\n\nexport const conditionNodeSchema: z.ZodType<ConditionNode> = z.lazy(() =>\n z.union([\n conditionLeafNodeSchema,\n z\n .object({\n and: z.array(conditionNodeSchema).min(1),\n })\n .strict(),\n z\n .object({\n or: z.array(conditionNodeSchema).min(1),\n })\n .strict(),\n z\n .object({\n not: conditionNodeSchema,\n })\n .strict(),\n ]),\n);\n","import { PolicyContextPath } from \"../../context/index.js\";\nimport { PolicyDateUtils } from \"../../utils/index.js\";\nimport { Result } from \"../../../result/result.js\";\n\nimport type {\n ConditionAndNode,\n ConditionLeafNode,\n ConditionNode,\n ConditionNotNode,\n ConditionOp,\n ConditionOrNode,\n} from \"./condition-types.js\";\nimport type {\n ConditionEvaluationOptions,\n ConditionEvaluationReport,\n} from \"../condition-evaluator-reporter.js\";\nimport type { PolicyContext } from \"../gate-types.js\";\n\nconst CONDITION_EVAL_THROWN_TAG = \"CONDITION_EVAL_THREW\";\nconst NULLISH_NUMERIC_OPERAND_NOT_ALLOWED_TAG =\n \"NULLISH_NUMERIC_OPERAND_NOT_ALLOWED\";\nconst NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG = \"NULLISH_DATE_OPERAND_NOT_ALLOWED\";\nconst INVALID_DATE_OPERAND_TAG = \"INVALID_DATE_OPERAND\";\nconst INVALID_NUMERIC_OPERAND_TAG = \"INVALID_NUMERIC_OPERAND\";\nconst INVALID_SET_OPERAND_TAG = \"INVALID_SET_OPERAND\";\nconst EMPTY_OR_CONDITION_TAG = \"EMPTY_OR_CONDITION\";\nconst EMPTY_AND_CONDITION_TAG = \"EMPTY_AND_CONDITION\";\nconst ISO_8601_UTC_DATE_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nexport interface ConditionEvaluationTrace {\n readonly conditionPath: string;\n readonly decisiveNode: ConditionNode;\n readonly lastEvaluatedLeaf: ConditionLeafNode;\n readonly lastEvaluatedLeafPath: string;\n readonly lastEvaluatedLeafResult: boolean;\n}\n\nexport interface TracedConditionEvaluation {\n readonly matched: boolean;\n readonly trace: ConditionEvaluationTrace;\n}\n\ntype RelationalOperator = Extract<ConditionOp, \"gt\" | \"gte\" | \"lt\" | \"lte\">;\n\nexport class ConditionEvaluatorV1 {\n constructor(\n private readonly context: PolicyContext,\n private readonly options: ConditionEvaluationOptions,\n ) {}\n\n private static isLeafNode(node: ConditionNode): node is ConditionLeafNode {\n return \"field\" in node && \"op\" in node;\n }\n\n private static isAndNode(node: ConditionNode): node is ConditionAndNode {\n return \"and\" in node;\n }\n\n private static isOrNode(node: ConditionNode): node is ConditionOrNode {\n return \"or\" in node;\n }\n\n private static isNotNode(node: ConditionNode): node is ConditionNotNode {\n return \"not\" in node;\n }\n\n private static isRelationalOperator(\n op: ConditionOp,\n ): op is RelationalOperator {\n return op === \"gt\" || op === \"gte\" || op === \"lt\" || op === \"lte\";\n }\n\n private static describeError(error: unknown): {\n name: string;\n message: string;\n } {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n\n return {\n name: \"NonErrorThrown\",\n message: String(error),\n };\n }\n\n private static buildNullishNumericOperandMessage(\n node: ConditionLeafNode,\n actual: null | undefined,\n ): string {\n const resolvedValue = actual === null ? \"null\" : \"undefined\";\n\n return `${NULLISH_NUMERIC_OPERAND_NOT_ALLOWED_TAG}: \"${node.field}\" resolved to ${resolvedValue} for numeric operator \"${node.op}\"`;\n }\n\n private static buildNullishDateOperandMessage(\n node: ConditionLeafNode,\n actual: null | undefined,\n ): string {\n const resolvedValue = actual === null ? \"null\" : \"undefined\";\n\n return `${NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG}: \"${node.field}\" resolved to ${resolvedValue} for date comparison operator \"${node.op}\"`;\n }\n\n private static buildInvalidDateOperandMessage(\n node: ConditionLeafNode,\n ): string {\n return `${INVALID_DATE_OPERAND_TAG}: \"${node.field}\" with operator \"${node.op}\" requires Date or ISO 8601 UTC string operands`;\n }\n\n private static buildInvalidNumericOperandMessage(\n node: ConditionLeafNode,\n ): string {\n return `${INVALID_NUMERIC_OPERAND_TAG}: \"${node.field}\" with operator \"${node.op}\" requires numeric operands`;\n }\n\n private static buildInvalidSetOperandMessage(\n node: ConditionLeafNode,\n ): string {\n return `${INVALID_SET_OPERAND_TAG}: \"${node.field}\" with operator \"${node.op}\" requires an array operand`;\n }\n\n private static buildEmptyOrConditionMessage(): string {\n return `${EMPTY_OR_CONDITION_TAG}: OR nodes must contain at least one child condition`;\n }\n\n private static buildEmptyAndConditionMessage(): string {\n return `${EMPTY_AND_CONDITION_TAG}: AND nodes must contain at least one child condition`;\n }\n\n private static parseComparableDate(\n value: unknown,\n ): Result<Date, string> | null {\n if (value instanceof Date) {\n if (!PolicyDateUtils.isValid(value)) {\n return Result.err(\"Invalid Date instance\");\n }\n\n return Result.ok(value);\n }\n\n if (\n typeof value !== \"string\" ||\n !ISO_8601_UTC_DATE_PATTERN.test(value)\n ) {\n return null;\n }\n\n const parsed = new Date(value);\n if (\n !PolicyDateUtils.isValid(parsed) ||\n parsed.toISOString() !== value\n ) {\n return Result.err(\"Invalid ISO 8601 UTC date string\");\n }\n\n return Result.ok(parsed);\n }\n\n private static evaluateRelationalNumbers(\n actual: number,\n op: RelationalOperator,\n expected: number,\n ): boolean {\n switch (op) {\n case \"gt\":\n return actual > expected;\n case \"gte\":\n return actual >= expected;\n case \"lt\":\n return actual < expected;\n case \"lte\":\n return actual <= expected;\n }\n }\n\n private buildReport(params: {\n readonly level: ConditionEvaluationReport[\"level\"];\n readonly tag: ConditionEvaluationReport[\"tag\"];\n readonly message: string;\n readonly details: Readonly<Record<string, unknown>>;\n }): ConditionEvaluationReport {\n return {\n occurredAt: new Date(),\n level: params.level,\n tag: params.tag,\n message: params.message,\n engineVersion: this.options.engineVersion,\n details: params.details,\n };\n }\n\n private conditionEvalErr<TValue>(\n node: ConditionNode,\n error: unknown,\n ): Result<TValue, string> {\n const cause = ConditionEvaluatorV1.describeError(error);\n const message = `${CONDITION_EVAL_THROWN_TAG}: ${cause.name}: ${cause.message}`;\n\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: CONDITION_EVAL_THROWN_TAG,\n message,\n details: { node, cause },\n }),\n );\n\n return Result.err(message);\n }\n\n private reportDateOperandError(\n node: ConditionLeafNode,\n actual: unknown,\n ): Result<boolean, string> {\n const message =\n ConditionEvaluatorV1.buildInvalidDateOperandMessage(node);\n\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: INVALID_DATE_OPERAND_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n private reportInvalidNumericOperand(\n node: ConditionLeafNode,\n actual: unknown,\n ): Result<boolean, string> {\n const message =\n ConditionEvaluatorV1.buildInvalidNumericOperandMessage(node);\n\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: INVALID_NUMERIC_OPERAND_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n private reportInvalidSetOperand(\n node: ConditionLeafNode,\n actual: unknown,\n ): Result<boolean, string> {\n const message =\n ConditionEvaluatorV1.buildInvalidSetOperandMessage(node);\n\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: INVALID_SET_OPERAND_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n private evaluateDateRelationalNode(\n node: ConditionLeafNode,\n actual: unknown,\n ): Result<boolean, string> | null {\n if (!ConditionEvaluatorV1.isRelationalOperator(node.op)) {\n return null;\n }\n\n const actualDateResult =\n ConditionEvaluatorV1.parseComparableDate(actual);\n const expectedDateResult = ConditionEvaluatorV1.parseComparableDate(\n node.value,\n );\n\n if (actualDateResult === null && expectedDateResult === null) {\n return null;\n }\n\n const allowsNull = node.allowNull === true;\n\n if (actual === null) {\n if (allowsNull) {\n return Result.ok(false);\n }\n\n const message = ConditionEvaluatorV1.buildNullishDateOperandMessage(\n node,\n actual,\n );\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n allowNull: allowsNull,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n if (actual === undefined) {\n const message = ConditionEvaluatorV1.buildNullishDateOperandMessage(\n node,\n actual,\n );\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: NULLISH_DATE_OPERAND_NOT_ALLOWED_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n allowNull: allowsNull,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n if (\n actualDateResult === null ||\n actualDateResult.isErr() ||\n expectedDateResult === null ||\n expectedDateResult.isErr()\n ) {\n return this.reportDateOperandError(node, actual);\n }\n\n return Result.ok(\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actualDateResult.getOrNull()!.getTime(),\n node.op,\n expectedDateResult.getOrNull()!.getTime(),\n ),\n );\n }\n\n private evaluateOperator(\n actual: unknown,\n op: ConditionOp,\n expected: unknown,\n ): boolean {\n switch (op) {\n case \"eq\":\n return actual === expected;\n case \"neq\":\n return actual !== expected;\n case \"gt\":\n return (\n typeof actual === \"number\" &&\n typeof expected === \"number\" &&\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actual,\n op,\n expected,\n )\n );\n case \"gte\":\n return (\n typeof actual === \"number\" &&\n typeof expected === \"number\" &&\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actual,\n op,\n expected,\n )\n );\n case \"lt\":\n return (\n typeof actual === \"number\" &&\n typeof expected === \"number\" &&\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actual,\n op,\n expected,\n )\n );\n case \"lte\":\n return (\n typeof actual === \"number\" &&\n typeof expected === \"number\" &&\n ConditionEvaluatorV1.evaluateRelationalNumbers(\n actual,\n op,\n expected,\n )\n );\n case \"in\":\n return Array.isArray(expected) && expected.includes(actual);\n case \"notIn\":\n return Array.isArray(expected) && !expected.includes(actual);\n case \"isNull\":\n return actual === null;\n case \"isNotNull\":\n return actual !== null && actual !== undefined;\n }\n }\n\n private evaluateNumericRelationalNode(\n node: ConditionLeafNode,\n actual: unknown,\n ): Result<boolean, string> {\n const allowsNull = node.allowNull === true;\n if (actual === undefined || (actual === null && !allowsNull)) {\n const message =\n ConditionEvaluatorV1.buildNullishNumericOperandMessage(\n node,\n actual as null | undefined,\n );\n\n this.options.reporter.error(\n this.buildReport({\n level: \"error\",\n tag: NULLISH_NUMERIC_OPERAND_NOT_ALLOWED_TAG,\n message,\n details: {\n field: node.field,\n op: node.op,\n actual,\n expected: node.value,\n allowNull: allowsNull,\n node,\n },\n }),\n );\n\n return Result.err(message);\n }\n\n // null + allowNull: a relational comparison against a missing value\n // never matches.\n if (actual === null) {\n return Result.ok(false);\n }\n\n // Both operands must be numbers. A present but wrong-typed operand is a\n // context/configuration error, surfaced like the date path instead of\n // silently collapsing to \"no match\".\n if (typeof actual !== \"number\" || typeof node.value !== \"number\") {\n return this.reportInvalidNumericOperand(node, actual);\n }\n\n return Result.ok(this.evaluateOperator(actual, node.op, node.value));\n }\n\n private evaluateLeafNode(node: ConditionLeafNode): Result<boolean, string> {\n const actualResult = PolicyContextPath.getOrAbsent(\n this.context,\n node.field,\n );\n if (actualResult.isErr()) {\n this.options.reporter.warn(\n this.buildReport({\n level: \"warn\",\n tag: \"MISSING_CONTEXT_FIELD\",\n message: `MISSING_CONTEXT_FIELD: \"${node.field}\" not found in context`,\n details: { field: node.field, node },\n }),\n );\n\n return Result.err(\n `MISSING_CONTEXT_FIELD: \"${node.field}\" not found in context`,\n );\n }\n\n try {\n const actual = actualResult.getOrThrow();\n if (ConditionEvaluatorV1.isRelationalOperator(node.op)) {\n const dateResult = this.evaluateDateRelationalNode(\n node,\n actual,\n );\n if (dateResult !== null) {\n return dateResult;\n }\n\n return this.evaluateNumericRelationalNode(node, actual);\n }\n\n if (\n (node.op === \"in\" || node.op === \"notIn\") &&\n !Array.isArray(node.value)\n ) {\n return this.reportInvalidSetOperand(node, actual);\n }\n\n return Result.ok(\n this.evaluateOperator(actual, node.op, node.value),\n );\n } catch (error) {\n return this.conditionEvalErr(node, error);\n }\n }\n\n private buildTrace(params: {\n readonly conditionPath: string;\n readonly decisiveNode: ConditionNode;\n readonly lastEvaluatedLeaf: ConditionLeafNode;\n readonly lastEvaluatedLeafPath: string;\n readonly lastEvaluatedLeafResult: boolean;\n }): ConditionEvaluationTrace {\n return {\n conditionPath: params.conditionPath,\n decisiveNode: params.decisiveNode,\n lastEvaluatedLeaf: params.lastEvaluatedLeaf,\n lastEvaluatedLeafPath: params.lastEvaluatedLeafPath,\n lastEvaluatedLeafResult: params.lastEvaluatedLeafResult,\n };\n }\n\n private evaluateWithTraceInternal(\n node: ConditionNode,\n path: string,\n ): Result<TracedConditionEvaluation, string> {\n if (ConditionEvaluatorV1.isLeafNode(node)) {\n const leafResult = this.evaluateLeafNode(node);\n if (leafResult.isErr()) {\n return Result.err(leafResult.errorOrNull()!);\n }\n\n const matched = leafResult.getOrNull()!;\n return Result.ok({\n matched,\n trace: this.buildTrace({\n conditionPath: path,\n decisiveNode: node,\n lastEvaluatedLeaf: node,\n lastEvaluatedLeafPath: path,\n lastEvaluatedLeafResult: matched,\n }),\n });\n }\n\n if (ConditionEvaluatorV1.isAndNode(node)) {\n if (node.and.length === 0) {\n return Result.err(\n ConditionEvaluatorV1.buildEmptyAndConditionMessage(),\n );\n }\n\n let lastTracedChild: TracedConditionEvaluation | null = null;\n\n for (const [index, child] of node.and.entries()) {\n const childPath = `${path}.and[${index}]`;\n const childResult = this.evaluateWithTraceInternal(\n child,\n childPath,\n );\n if (childResult.isErr()) {\n return Result.err(childResult.errorOrNull()!);\n }\n\n const tracedChild = childResult.getOrNull()!;\n lastTracedChild = tracedChild;\n if (!tracedChild.matched) {\n return Result.ok({\n matched: false,\n trace: this.buildTrace({\n conditionPath: childPath,\n decisiveNode: child,\n lastEvaluatedLeaf:\n tracedChild.trace.lastEvaluatedLeaf,\n lastEvaluatedLeafPath:\n tracedChild.trace.lastEvaluatedLeafPath,\n lastEvaluatedLeafResult:\n tracedChild.trace.lastEvaluatedLeafResult,\n }),\n });\n }\n }\n\n return Result.ok({\n matched: true,\n trace: lastTracedChild!.trace,\n });\n }\n\n if (ConditionEvaluatorV1.isOrNode(node)) {\n let lastTrace: ConditionEvaluationTrace | null = null;\n\n for (const [index, child] of node.or.entries()) {\n const childResult = this.evaluateWithTraceInternal(\n child,\n `${path}.or[${index}]`,\n );\n if (childResult.isErr()) {\n return Result.err(childResult.errorOrNull()!);\n }\n\n const tracedChild = childResult.getOrNull()!;\n lastTrace = tracedChild.trace;\n if (tracedChild.matched) {\n return Result.ok({\n matched: true,\n trace: tracedChild.trace,\n });\n }\n }\n\n if (lastTrace === null) {\n return Result.err(\n ConditionEvaluatorV1.buildEmptyOrConditionMessage(),\n );\n }\n\n return Result.ok({ matched: false, trace: lastTrace! });\n }\n\n if (ConditionEvaluatorV1.isNotNode(node)) {\n const childPath = `${path}.not`;\n const childResult = this.evaluateWithTraceInternal(\n node.not,\n childPath,\n );\n if (childResult.isErr()) {\n return Result.err(childResult.errorOrNull()!);\n }\n\n const tracedChild = childResult.getOrNull()!;\n return Result.ok({\n matched: !tracedChild.matched,\n trace: this.buildTrace({\n conditionPath: path,\n decisiveNode: node,\n lastEvaluatedLeaf: tracedChild.trace.lastEvaluatedLeaf,\n lastEvaluatedLeafPath:\n tracedChild.trace.lastEvaluatedLeafPath,\n lastEvaluatedLeafResult:\n tracedChild.trace.lastEvaluatedLeafResult,\n }),\n });\n }\n\n return this.conditionEvalErr(\n node,\n new TypeError(\"Invalid condition node shape\"),\n );\n }\n\n evaluate(node: ConditionNode): Result<boolean, string> {\n try {\n const result = this.evaluateWithTraceInternal(node, \"$\");\n if (result.isErr()) {\n return Result.err(result.errorOrNull()!);\n }\n\n return Result.ok(result.getOrNull()!.matched);\n } catch (error) {\n return this.conditionEvalErr(node, error);\n }\n }\n\n evaluateWithTrace(\n node: ConditionNode,\n ): Result<TracedConditionEvaluation, string> {\n try {\n return this.evaluateWithTraceInternal(node, \"$\");\n } catch (error) {\n return this.conditionEvalErr(node, error);\n }\n }\n\n static extractFields(node: ConditionNode): string[] {\n if (ConditionEvaluatorV1.isLeafNode(node)) {\n return [node.field];\n }\n\n if (ConditionEvaluatorV1.isAndNode(node)) {\n return node.and.flatMap((child) =>\n ConditionEvaluatorV1.extractFields(child),\n );\n }\n\n if (ConditionEvaluatorV1.isOrNode(node)) {\n return node.or.flatMap((child) =>\n ConditionEvaluatorV1.extractFields(child),\n );\n }\n\n if (ConditionEvaluatorV1.isNotNode(node)) {\n return ConditionEvaluatorV1.extractFields(node.not);\n }\n\n return [];\n }\n}\n","import { z } from \"zod\";\n\nimport { Result } from \"../../../../result/result.js\";\n\nimport type { GatePayloadV1 } from \"./gate-types-v1.js\";\nimport {\n conditionLeafNodeSchema,\n conditionNodeSchema,\n} from \"../condition-schema.js\";\n\n// Re-export so gate/v1 public API remains unchanged.\nexport { conditionLeafNodeSchema, conditionNodeSchema };\n\nexport class GatePayloadSchemaV1 {\n static readonly schema = z.union([\n z\n .object({\n condition: conditionNodeSchema,\n })\n .strict(),\n z\n .object({\n allowIf: conditionNodeSchema,\n defaultOutcome: z.enum([\"ALLOW\", \"DENY\"]),\n })\n .strict(),\n ]);\n\n static parse(payload: unknown): Result<GatePayloadV1, string> {\n const parsed = GatePayloadSchemaV1.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 gate payload: ${details}`);\n }\n\n return Result.ok(parsed.data as GatePayloadV1);\n }\n}\n\nexport const gatePayloadSchema = GatePayloadSchemaV1.schema;\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -78,10 +78,10 @@ declare abstract class ValueObject<T, P> {
|
|
|
78
78
|
//#endregion
|
|
79
79
|
//#region src/index.d.ts
|
|
80
80
|
declare const ERP_CORE_NAME = "erp-core";
|
|
81
|
-
declare const ERP_CORE_VERSION = "1.0.
|
|
81
|
+
declare const ERP_CORE_VERSION = "1.0.7";
|
|
82
82
|
declare const erpCoreRelease: {
|
|
83
83
|
readonly name: "erp-core";
|
|
84
|
-
readonly version: "1.0.
|
|
84
|
+
readonly version: "1.0.7";
|
|
85
85
|
};
|
|
86
86
|
//#endregion
|
|
87
87
|
export { AlreadyExistsError, AppError, AppErrorOptions, AsOfSource, AuthenticationError, AuthenticationErrorMetadata, AuthenticationErrorReason, AuthorizationError, AuthorizationErrorMetadata, AuthorizationErrorReason, AuthorizationRequirement, BasePolicyDefinitionProps, BusinessRuleViolationError, CommonOutcomeStatus, ComputeEngineRegistry, ComputeEvaluator, ComputeEvaluatorRegistration, ComputeEvaluatorRegistry, ComputeOutcome, ComputeOutcomeData, ComputePayloadParserRegistry, ComputePayloadParsers, ComputePolicyDefinitionProps, ComputeRegistry, ComputeStatus, ConditionEvaluationCause, ConditionEvaluationOptions, ConditionEvaluationReport, ConditionEvaluationReportLevel, ConditionEvaluationReportTag, ConditionEvaluatorReporter, ConflictError, ConflictErrorMetadata, ConflictKind, ContextResolverCircuitBreakerOptions, ContextResolverRegistry, ContextResolverResilienceOptions, ContextResolverRetryOptions, ContextSeed, ContextSeedValidator, ContextValueResolver, CoreConfig, CoreConfigOptions, CoreObservabilityConfig, type DeepReadonly, DeriveAsOfOptions, SerializationInError as DeserializationError, SerializationInError, DuplicateError, ERP_CORE_NAME, ERP_CORE_VERSION, Entity, type EntityState, Err, ErrorCodes, ErrorSeverity, EvaluateInput, ExpiredError, TemporalErrorMetadata as ExpiredErrorMetadata, TemporalErrorMetadata, TemporalPrecision as ExpiredErrorPrecision, TemporalPrecision, FindCandidatesParams, GateEngineRegistry, GateOutcome, GateOutcomeData, GatePayload, GatePayloadParsers, GatePolicyDefinitionProps, GateStatus, GateTraceLeafSnapshot, GateTraceNodeSnapshot, GateViolationTrace, IdempotencyError, IdempotencyErrorMetadata, IdempotencyFailureKind, IdempotencyInProgressError, IdempotencyKeyMissingError, IdempotencyPayloadMismatchError, IdempotencyReplayNotSupportedError, InMemoryPolicyDefinitionRepository, IntegrationError, IntegrationErrorMetadata, IntegrationErrorReason, JsonSafePrimitive, JsonSafeRecord, JsonSafeValue, LegacyIncompatibleError, type LogPayload, type LoggerPort, type MetricLabels, type MetricsPort, NotFoundError, NotYetValidError, Ok, Outcome, PolicyAsOfResolver, PolicyCatalog, PolicyCatalogEntryProps, PolicyCatalogFactory, PolicyContext, PolicyContextBuilder, PolicyContextBuilderOptions, PolicyContextPath, PolicyDecision, PolicyDecisionId, PolicyDefinition, PolicyDefinitionId, PolicyDefinitionProps, PolicyDefinitionStatus, PolicyEvaluationError, PolicyEvaluationErrors, PolicyEvaluationResult, PolicyHashing, PolicyKey, PolicyKind, PolicyOwner, PolicyPackage, PolicyResolver, PolicyScope, PolicyScopeLevel, PolicyScopeMatcher, PolicyService, PolicyServiceOptions, PolicyServiceParams, PolicyViolation, Result, SchoolId, ScopeChain, SerializationBoundary, SerializationCodes, SerializationDirection, SerializationError, SerializationErrorMetadata, SerializationFailureCategory, SerializationMessages, SerializationOutError, TemporalError, TemporalKind, TenantId, type TraceAttributeValue, type TraceSpan, type TracerPort, UnexpectedError, UniqueConstraintViolation, UniqueConstraintViolationError, ValidationError, ValidationField, ValueObject, VersionedComputeEngine, VersionedGateEngine, asPolicyDecisionId, asPolicyDefinitionId, asSchoolId, asTenantId, assertJsonSafeMetadata, contextResolverRegistry, coreConfig, erpCoreRelease, evaluateTemporalWindow, mapPolicyEvaluationError, payloadHash, registerNamespacedContextResolvers, registerNamespacedContextResolversIn, safePreview, serializationErrorCode, sha256Hex, stableStringify, translateUniqueViolationToDuplicate };
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { t as Outcome } from "./outcome.js";
|
|
|
6
6
|
import { _ as asPolicyDecisionId, a as ContextSeedValidator, b as asTenantId, c as ContextResolverRegistry, d as PolicyDefinition, f as InMemoryPolicyDefinitionRepository, g as PolicyCatalog, h as PolicyCatalogFactory, i as PolicyAsOfResolver, l as registerNamespacedContextResolversIn, m as PolicyKey, n as PolicyEvaluationErrors, o as contextResolverRegistry, p as PolicyScopeMatcher, r as PolicyResolver, s as registerNamespacedContextResolvers, t as PolicyService, u as PolicyContextBuilder, v as asPolicyDefinitionId, x as PolicyHashing, y as asSchoolId } from "./policy-service.js";
|
|
7
7
|
import { a as ComputeEvaluatorRegistry, c as ComputePayloadParsers, i as ComputeRegistry, o as ComputeEngineRegistry, r as GatePayloadParsers, s as ComputePayloadParserRegistry, t as GateEngineRegistry } from "./gate-engine-registry.js";
|
|
8
8
|
//#region src/version.ts
|
|
9
|
-
const version$1 = "1.0.
|
|
9
|
+
const version$1 = "1.0.7";
|
|
10
10
|
//#endregion
|
|
11
11
|
//#region src/core/application/policy-error-mapper.ts
|
|
12
12
|
function mapPolicyEvaluationError(err) {
|
|
@@ -96,6 +96,7 @@ let Entity = class Entity {
|
|
|
96
96
|
}
|
|
97
97
|
markAsModified(updatedAt = /* @__PURE__ */ new Date()) {
|
|
98
98
|
assertValidDate("updatedAt", updatedAt);
|
|
99
|
+
if (updatedAt.getTime() < this._createdAt.getTime()) throw new InvariantViolationException("updatedAt cannot be earlier than createdAt");
|
|
99
100
|
this._updatedAt = cloneDate(updatedAt);
|
|
100
101
|
this._aggregateVersion += 1;
|
|
101
102
|
return this._aggregateVersion;
|
|
@@ -105,13 +106,18 @@ Entity = _Entity = __decorate([version("1.0")], Entity);
|
|
|
105
106
|
//#endregion
|
|
106
107
|
//#region src/core/shared/immutable.ts
|
|
107
108
|
function deepFreeze(value) {
|
|
109
|
+
return deepFreezeInternal(value, /* @__PURE__ */ new WeakSet());
|
|
110
|
+
}
|
|
111
|
+
function deepFreezeInternal(value, seen) {
|
|
108
112
|
if (typeof value !== "object" || value === null || value instanceof Date) return value;
|
|
113
|
+
if (seen.has(value)) return value;
|
|
114
|
+
seen.add(value);
|
|
109
115
|
if (Array.isArray(value)) {
|
|
110
|
-
for (const item of value)
|
|
116
|
+
for (const item of value) deepFreezeInternal(item, seen);
|
|
111
117
|
return Object.freeze(value);
|
|
112
118
|
}
|
|
113
119
|
const objectValue = value;
|
|
114
|
-
for (const propertyKey of Reflect.ownKeys(objectValue))
|
|
120
|
+
for (const propertyKey of Reflect.ownKeys(objectValue)) deepFreezeInternal(objectValue[propertyKey], seen);
|
|
115
121
|
return Object.freeze(value);
|
|
116
122
|
}
|
|
117
123
|
function makeImmutable(value) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["version","version"],"sources":["../src/version.ts","../src/core/application/policy-error-mapper.ts","../src/core/shared/aggregate-version.ts","../src/core/versioning/version.ts","../src/core/domain/entity.ts","../src/core/shared/immutable.ts","../src/core/domain/value-object.ts","../src/index.ts"],"sourcesContent":["// Versao do kit, sincronizada com package.json por scripts/sync-kit-version.mjs.\n// Nao edite a mao: rode `npm run sync-kit-version` (ou e regenerado no release).\n//\n// Mantemos a versao aqui, dentro de src/, para que a copia full-control seja\n// auto-contida: ao copiar so o conteudo de src/, o entry nao depende de um\n// `../package.json` que deixaria de existir no projeto consumidor.\nexport const version = \"1.0.5\";\n","import {\n type AppError,\n BusinessRuleViolationError,\n NotFoundError,\n UnexpectedError,\n} from \"../errors\";\nimport type { PolicyEvaluationError } from \"../policies\";\n\nexport function mapPolicyEvaluationError(err: PolicyEvaluationError): AppError {\n switch (err.kind) {\n case \"INVALID_CONTEXT\":\n return new BusinessRuleViolationError(\n `policy.${err.stage.toLowerCase()}`,\n err.message,\n { policyKey: err.policyKey, stage: err.stage },\n { cause: err.cause },\n );\n case \"INVALID_POLICY_KEY\":\n return new BusinessRuleViolationError(\n \"policy.invalid_key\",\n err.message,\n { rawPolicyKey: err.rawPolicyKey },\n { cause: err.cause },\n );\n case \"POLICY_NOT_FOUND\":\n return new NotFoundError(\n \"Policy\",\n { policyKey: err.policyKey },\n { cause: err.cause },\n );\n case \"POLICY_DEFINITION_NOT_FOUND\":\n return new NotFoundError(\n \"PolicyDefinition\",\n {\n policyKey: err.policyKey,\n contextVersion: err.contextVersion,\n asOf: err.asOf.toISOString(),\n },\n { cause: err.cause },\n );\n case \"POLICY_VARIANT_NOT_FOUND\":\n return new NotFoundError(\n \"PolicyVariant\",\n {\n policyKey: err.policyKey,\n policyKind: err.policyKind,\n payloadSchemaVersion: err.payloadSchemaVersion,\n },\n { cause: err.cause },\n );\n case \"ENGINE_FAILURE\":\n return new UnexpectedError(err.message, err.cause, {\n metadata: {\n policyKey: err.policyKey,\n engine: err.engine,\n engineVersion: err.engineVersion,\n },\n });\n }\n}\n","import { InvariantViolationException } from \"../exceptions/invariant-violation-exception\";\n\nfunction assertValidAggregateVersion(aggregateVersion: number): void {\n if (!Number.isInteger(aggregateVersion) || aggregateVersion < 0) {\n throw new InvariantViolationException(\n `aggregateVersion must be a non-negative integer. Received: ${aggregateVersion}`,\n );\n }\n}\n\nexport { assertValidAggregateVersion };\n","type ContractVersion = `${number}.${number}`;\n\ntype VersionedTarget = {\n readonly prototype: object;\n};\n\nconst CONTRACT_VERSION_PROPERTY = \"CONTRACT_VERSION\" as const;\nconst CONTRACT_VERSION_PATTERN = /^\\d+\\.\\d+$/;\n\nfunction version<const TVersion extends ContractVersion>(\n contractVersion: TVersion,\n) {\n if (!CONTRACT_VERSION_PATTERN.test(contractVersion)) {\n throw new TypeError(\n `Invalid contract version \"${contractVersion}\". Expected MAJOR.MINOR.`,\n );\n }\n\n return (target: VersionedTarget): void => {\n Object.defineProperty(target, CONTRACT_VERSION_PROPERTY, {\n value: contractVersion,\n writable: false,\n configurable: false,\n enumerable: false,\n });\n };\n}\n\nexport {\n CONTRACT_VERSION_PROPERTY,\n type ContractVersion,\n version,\n type VersionedTarget,\n};\n","import { InvariantViolationException } from \"../exceptions/invariant-violation-exception\";\nimport { assertValidAggregateVersion } from \"../shared/aggregate-version\";\nimport { assertValidDate, cloneDate } from \"../shared/temporal-guards\";\nimport { type ContractVersion, version } from \"../versioning/version\";\n\ninterface EntityState<TIdentifier> {\n readonly id: TIdentifier;\n readonly createdAt: Date;\n readonly updatedAt: Date;\n readonly aggregateVersion: number;\n}\n\n@version(\"1.0\")\nabstract class Entity<TIdentifier> {\n public static readonly CONTRACT_VERSION: ContractVersion;\n\n private readonly _id: TIdentifier;\n private readonly _createdAt: Date;\n private _updatedAt: Date;\n private _aggregateVersion: number;\n\n protected constructor(state: EntityState<TIdentifier>) {\n assertValidDate(\"createdAt\", state.createdAt);\n assertValidDate(\"updatedAt\", state.updatedAt);\n assertValidAggregateVersion(state.aggregateVersion);\n\n if (state.updatedAt.getTime() < state.createdAt.getTime()) {\n throw new InvariantViolationException(\n \"updatedAt cannot be earlier than createdAt\",\n );\n }\n\n this._id = state.id;\n this._createdAt = cloneDate(state.createdAt);\n this._updatedAt = cloneDate(state.updatedAt);\n this._aggregateVersion = state.aggregateVersion;\n }\n\n public get id(): TIdentifier {\n return this._id;\n }\n\n public get createdAt(): Date {\n return cloneDate(this._createdAt);\n }\n\n public get updatedAt(): Date {\n return cloneDate(this._updatedAt);\n }\n\n public get aggregateVersion(): number {\n return this._aggregateVersion;\n }\n\n public get contractVersion(): ContractVersion {\n return Entity.CONTRACT_VERSION;\n }\n\n protected markAsModified(updatedAt: Date = new Date()): number {\n assertValidDate(\"updatedAt\", updatedAt);\n\n this._updatedAt = cloneDate(updatedAt);\n this._aggregateVersion += 1;\n\n return this._aggregateVersion;\n }\n}\n\nexport { Entity, type EntityState };\n","type PrimitiveValue =\n | bigint\n | boolean\n | null\n | number\n | string\n | symbol\n | undefined;\n\ntype DeepReadonly<T> = T extends PrimitiveValue | Date\n ? T\n : T extends readonly (infer TItem)[]\n ? readonly DeepReadonly<TItem>[]\n : { readonly [TKey in keyof T]: DeepReadonly<T[TKey]> };\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || value instanceof Date) {\n return value;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n deepFreeze(item);\n }\n\n return Object.freeze(value);\n }\n\n const objectValue = value as Record<PropertyKey, object | PrimitiveValue>;\n\n for (const propertyKey of Reflect.ownKeys(objectValue)) {\n deepFreeze(objectValue[propertyKey]);\n }\n\n return Object.freeze(value);\n}\n\nfunction makeImmutable<T>(value: T): DeepReadonly<T> {\n if (typeof value !== \"object\" || value === null) {\n return value as DeepReadonly<T>;\n }\n\n return deepFreeze(structuredClone(value)) as DeepReadonly<T>;\n}\n\nexport { deepFreeze, makeImmutable, type DeepReadonly };\n","import { type DeepReadonly, makeImmutable } from \"../shared/immutable\";\nimport { type ContractVersion, version } from \"../versioning/version\";\n\n@version(\"1.0\")\nabstract class ValueObject<T, P> {\n public static readonly CONTRACT_VERSION: ContractVersion;\n public readonly value: DeepReadonly<T>;\n\n protected constructor(value: T) {\n this.value = makeImmutable(value);\n }\n\n public get contractVersion(): ContractVersion {\n return ValueObject.CONTRACT_VERSION;\n }\n\n protected finalize(): void {\n Object.freeze(this);\n }\n\n public toJSON(): P {\n return this.toPrimitive();\n }\n\n public abstract equals(other: this): boolean;\n\n public abstract toPrimitive(): P;\n}\n\nexport { type DeepReadonly, ValueObject };\n","import { version } from \"./version.js\";\n\nexport * from \"./core/index.js\";\n\nexport const ERP_CORE_NAME = \"erp-core\";\nexport const ERP_CORE_VERSION = version;\n\nexport const erpCoreRelease = {\n name: ERP_CORE_NAME,\n version: ERP_CORE_VERSION,\n} as const;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["version","version"],"sources":["../src/version.ts","../src/core/application/policy-error-mapper.ts","../src/core/shared/aggregate-version.ts","../src/core/versioning/version.ts","../src/core/domain/entity.ts","../src/core/shared/immutable.ts","../src/core/domain/value-object.ts","../src/index.ts"],"sourcesContent":["// Versao do kit, sincronizada com package.json por scripts/sync-kit-version.mjs.\n// Nao edite a mao: rode `npm run sync-kit-version` (ou e regenerado no release).\n//\n// Mantemos a versao aqui, dentro de src/, para que a copia full-control seja\n// auto-contida: ao copiar so o conteudo de src/, o entry nao depende de um\n// `../package.json` que deixaria de existir no projeto consumidor.\nexport const version = \"1.0.7\";\n","import {\n type AppError,\n BusinessRuleViolationError,\n NotFoundError,\n UnexpectedError,\n} from \"../errors/index.js\";\nimport type { PolicyEvaluationError } from \"../policies/index.js\";\n\nexport function mapPolicyEvaluationError(err: PolicyEvaluationError): AppError {\n switch (err.kind) {\n case \"INVALID_CONTEXT\":\n return new BusinessRuleViolationError(\n `policy.${err.stage.toLowerCase()}`,\n err.message,\n { policyKey: err.policyKey, stage: err.stage },\n { cause: err.cause },\n );\n case \"INVALID_POLICY_KEY\":\n return new BusinessRuleViolationError(\n \"policy.invalid_key\",\n err.message,\n { rawPolicyKey: err.rawPolicyKey },\n { cause: err.cause },\n );\n case \"POLICY_NOT_FOUND\":\n return new NotFoundError(\n \"Policy\",\n { policyKey: err.policyKey },\n { cause: err.cause },\n );\n case \"POLICY_DEFINITION_NOT_FOUND\":\n return new NotFoundError(\n \"PolicyDefinition\",\n {\n policyKey: err.policyKey,\n contextVersion: err.contextVersion,\n asOf: err.asOf.toISOString(),\n },\n { cause: err.cause },\n );\n case \"POLICY_VARIANT_NOT_FOUND\":\n return new NotFoundError(\n \"PolicyVariant\",\n {\n policyKey: err.policyKey,\n policyKind: err.policyKind,\n payloadSchemaVersion: err.payloadSchemaVersion,\n },\n { cause: err.cause },\n );\n case \"ENGINE_FAILURE\":\n return new UnexpectedError(err.message, err.cause, {\n metadata: {\n policyKey: err.policyKey,\n engine: err.engine,\n engineVersion: err.engineVersion,\n },\n });\n }\n}\n","import { InvariantViolationException } from \"../exceptions/invariant-violation-exception.js\";\n\nfunction assertValidAggregateVersion(aggregateVersion: number): void {\n if (!Number.isInteger(aggregateVersion) || aggregateVersion < 0) {\n throw new InvariantViolationException(\n `aggregateVersion must be a non-negative integer. Received: ${aggregateVersion}`,\n );\n }\n}\n\nexport { assertValidAggregateVersion };\n","type ContractVersion = `${number}.${number}`;\n\ntype VersionedTarget = {\n readonly prototype: object;\n};\n\nconst CONTRACT_VERSION_PROPERTY = \"CONTRACT_VERSION\" as const;\nconst CONTRACT_VERSION_PATTERN = /^\\d+\\.\\d+$/;\n\nfunction version<const TVersion extends ContractVersion>(\n contractVersion: TVersion,\n) {\n if (!CONTRACT_VERSION_PATTERN.test(contractVersion)) {\n throw new TypeError(\n `Invalid contract version \"${contractVersion}\". Expected MAJOR.MINOR.`,\n );\n }\n\n return (target: VersionedTarget): void => {\n Object.defineProperty(target, CONTRACT_VERSION_PROPERTY, {\n value: contractVersion,\n writable: false,\n configurable: false,\n enumerable: false,\n });\n };\n}\n\nexport {\n CONTRACT_VERSION_PROPERTY,\n type ContractVersion,\n version,\n type VersionedTarget,\n};\n","import { InvariantViolationException } from \"../exceptions/invariant-violation-exception.js\";\nimport { assertValidAggregateVersion } from \"../shared/aggregate-version.js\";\nimport { assertValidDate, cloneDate } from \"../shared/temporal-guards.js\";\nimport { type ContractVersion, version } from \"../versioning/version.js\";\n\ninterface EntityState<TIdentifier> {\n readonly id: TIdentifier;\n readonly createdAt: Date;\n readonly updatedAt: Date;\n readonly aggregateVersion: number;\n}\n\n@version(\"1.0\")\nabstract class Entity<TIdentifier> {\n declare public static readonly CONTRACT_VERSION: ContractVersion;\n\n private readonly _id: TIdentifier;\n private readonly _createdAt: Date;\n private _updatedAt: Date;\n private _aggregateVersion: number;\n\n protected constructor(state: EntityState<TIdentifier>) {\n assertValidDate(\"createdAt\", state.createdAt);\n assertValidDate(\"updatedAt\", state.updatedAt);\n assertValidAggregateVersion(state.aggregateVersion);\n\n if (state.updatedAt.getTime() < state.createdAt.getTime()) {\n throw new InvariantViolationException(\n \"updatedAt cannot be earlier than createdAt\",\n );\n }\n\n this._id = state.id;\n this._createdAt = cloneDate(state.createdAt);\n this._updatedAt = cloneDate(state.updatedAt);\n this._aggregateVersion = state.aggregateVersion;\n }\n\n public get id(): TIdentifier {\n return this._id;\n }\n\n public get createdAt(): Date {\n return cloneDate(this._createdAt);\n }\n\n public get updatedAt(): Date {\n return cloneDate(this._updatedAt);\n }\n\n public get aggregateVersion(): number {\n return this._aggregateVersion;\n }\n\n public get contractVersion(): ContractVersion {\n return Entity.CONTRACT_VERSION;\n }\n\n protected markAsModified(updatedAt: Date = new Date()): number {\n assertValidDate(\"updatedAt\", updatedAt);\n\n if (updatedAt.getTime() < this._createdAt.getTime()) {\n throw new InvariantViolationException(\n \"updatedAt cannot be earlier than createdAt\",\n );\n }\n\n this._updatedAt = cloneDate(updatedAt);\n this._aggregateVersion += 1;\n\n return this._aggregateVersion;\n }\n}\n\nexport { Entity, type EntityState };\n","type PrimitiveValue =\n | bigint\n | boolean\n | null\n | number\n | string\n | symbol\n | undefined;\n\ntype DeepReadonly<T> = T extends PrimitiveValue | Date\n ? T\n : T extends readonly (infer TItem)[]\n ? readonly DeepReadonly<TItem>[]\n : { readonly [TKey in keyof T]: DeepReadonly<T[TKey]> };\n\nfunction deepFreeze<T>(value: T): T {\n return deepFreezeInternal(value, new WeakSet<object>());\n}\n\nfunction deepFreezeInternal<T>(value: T, seen: WeakSet<object>): T {\n if (typeof value !== \"object\" || value === null || value instanceof Date) {\n return value;\n }\n\n // A value already on `seen` has been visited on this pass (cyclic graph or a\n // shared reference); revisiting it would recurse forever.\n if (seen.has(value)) {\n return value;\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n deepFreezeInternal(item, seen);\n }\n\n return Object.freeze(value);\n }\n\n const objectValue = value as Record<PropertyKey, object | PrimitiveValue>;\n\n for (const propertyKey of Reflect.ownKeys(objectValue)) {\n deepFreezeInternal(objectValue[propertyKey], seen);\n }\n\n return Object.freeze(value);\n}\n\nfunction makeImmutable<T>(value: T): DeepReadonly<T> {\n if (typeof value !== \"object\" || value === null) {\n return value as DeepReadonly<T>;\n }\n\n return deepFreeze(structuredClone(value)) as DeepReadonly<T>;\n}\n\nexport { deepFreeze, makeImmutable, type DeepReadonly };\n","import { type DeepReadonly, makeImmutable } from \"../shared/immutable.js\";\nimport { type ContractVersion, version } from \"../versioning/version.js\";\n\n@version(\"1.0\")\nabstract class ValueObject<T, P> {\n declare public static readonly CONTRACT_VERSION: ContractVersion;\n public readonly value: DeepReadonly<T>;\n\n protected constructor(value: T) {\n this.value = makeImmutable(value);\n }\n\n public get contractVersion(): ContractVersion {\n return ValueObject.CONTRACT_VERSION;\n }\n\n protected finalize(): void {\n Object.freeze(this);\n }\n\n public toJSON(): P {\n return this.toPrimitive();\n }\n\n public abstract equals(other: this): boolean;\n\n public abstract toPrimitive(): P;\n}\n\nexport { type DeepReadonly, ValueObject };\n","import { version } from \"./version.js\";\n\nexport * from \"./core/index.js\";\n\nexport const ERP_CORE_NAME = \"erp-core\";\nexport const ERP_CORE_VERSION = version;\n\nexport const erpCoreRelease = {\n name: ERP_CORE_NAME,\n version: ERP_CORE_VERSION,\n} as const;\n"],"mappings":"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"}
|