@cullet/erp-core 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/KIT_CONTEXT.md +11 -3
- package/README.md +160 -0
- package/dist/abac/index.cjs +7 -0
- package/dist/abac/index.d.cts +2 -0
- package/dist/abac/index.d.ts +2 -0
- package/dist/abac/index.js +2 -0
- package/dist/app-error.cjs +201 -0
- package/dist/app-error.cjs.map +1 -0
- package/dist/app-error.js +178 -0
- package/dist/app-error.js.map +1 -0
- package/dist/application/index.cjs +2 -1
- package/dist/application/index.d.cts +2 -1
- package/dist/application/index.d.ts +2 -1
- package/dist/application/index.js +2 -1
- package/dist/authorization-error.cjs +157 -0
- package/dist/authorization-error.cjs.map +1 -0
- package/dist/authorization-error.d.cts +113 -0
- package/dist/authorization-error.d.ts +113 -0
- package/dist/authorization-error.js +152 -0
- package/dist/authorization-error.js.map +1 -0
- package/dist/authorizer.port.d.cts +130 -0
- package/dist/authorizer.port.d.ts +130 -0
- package/dist/composite-authorizer.d.cts +216 -0
- package/dist/composite-authorizer.d.ts +216 -0
- package/dist/condition-evaluator.cjs +579 -0
- package/dist/condition-evaluator.cjs.map +1 -0
- package/dist/condition-evaluator.js +550 -0
- package/dist/condition-evaluator.js.map +1 -0
- package/dist/{gate-types.d.ts → core-config.d.cts} +78 -77
- package/dist/{gate-types.d.cts → core-config.d.ts} +78 -77
- package/dist/domain/index.cjs +2 -1
- package/dist/domain/index.d.cts +2 -1
- package/dist/domain/index.d.ts +2 -1
- package/dist/domain/index.js +2 -1
- package/dist/domain-event-contracts.cjs +3 -2
- package/dist/domain-event-contracts.cjs.map +1 -1
- package/dist/domain-event-contracts.js +2 -1
- package/dist/domain-event-contracts.js.map +1 -1
- package/dist/entity.cjs +122 -0
- package/dist/entity.cjs.map +1 -0
- package/dist/entity.js +111 -0
- package/dist/entity.js.map +1 -0
- package/dist/errors/index.cjs +10 -7
- package/dist/errors/index.d.cts +2 -1
- package/dist/errors/index.d.ts +2 -1
- package/dist/errors/index.js +6 -3
- package/dist/gate-engine-registry.cjs +5 -4
- package/dist/gate-engine-registry.cjs.map +1 -1
- package/dist/gate-engine-registry.d.cts +3 -2
- package/dist/gate-engine-registry.d.ts +3 -2
- package/dist/gate-engine-registry.js +2 -1
- package/dist/gate-engine-registry.js.map +1 -1
- package/dist/gate-v1-payload.schema.cjs +0 -562
- package/dist/gate-v1-payload.schema.cjs.map +1 -1
- package/dist/gate-v1-payload.schema.js +1 -533
- package/dist/gate-v1-payload.schema.js.map +1 -1
- package/dist/hashing.cjs +2 -44
- package/dist/hashing.cjs.map +1 -1
- package/dist/hashing.js +2 -38
- package/dist/hashing.js.map +1 -1
- package/dist/index.cjs +36 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -12
- package/dist/index.d.ts +19 -12
- package/dist/index.js +17 -10
- package/dist/index.js.map +1 -1
- package/dist/not-found-error.cjs +5 -5
- package/dist/not-found-error.cjs.map +1 -1
- package/dist/not-found-error.js +1 -1
- package/dist/outcome.d.cts +1 -83
- package/dist/outcome.d.ts +1 -83
- package/dist/parse-gate-payload.d.cts +2 -2
- package/dist/parse-gate-payload.d.ts +2 -2
- package/dist/path.d.cts +2 -2
- package/dist/path.d.ts +2 -2
- package/dist/policies/engines/index.d.cts +1 -1
- package/dist/policies/engines/index.d.ts +1 -1
- package/dist/policies/engines/v1/gate/index.cjs +5 -4
- package/dist/policies/engines/v1/gate/index.cjs.map +1 -1
- package/dist/policies/engines/v1/gate/index.d.cts +4 -2
- package/dist/policies/engines/v1/gate/index.d.ts +4 -2
- package/dist/policies/engines/v1/gate/index.js +2 -1
- package/dist/policies/engines/v1/gate/index.js.map +1 -1
- package/dist/policies/index.cjs +5 -5
- package/dist/policies/index.d.cts +3 -2
- package/dist/policies/index.d.ts +3 -2
- package/dist/policies/index.js +2 -2
- package/dist/policy-bridge.cjs +437 -0
- package/dist/policy-bridge.cjs.map +1 -0
- package/dist/policy-bridge.d.cts +185 -0
- package/dist/policy-bridge.d.ts +185 -0
- package/dist/policy-bridge.js +396 -0
- package/dist/policy-bridge.js.map +1 -0
- package/dist/policy-service.cjs +241 -240
- package/dist/policy-service.cjs.map +1 -1
- package/dist/policy-service.d.cts +2 -2
- package/dist/policy-service.d.ts +2 -2
- package/dist/policy-service.js +240 -239
- package/dist/policy-service.js.map +1 -1
- package/dist/rbac/index.cjs +9 -0
- package/dist/rbac/index.d.cts +3 -0
- package/dist/rbac/index.d.ts +3 -0
- package/dist/rbac/index.js +2 -0
- package/dist/requested-by.cjs +54 -0
- package/dist/requested-by.cjs.map +1 -0
- package/dist/requested-by.d.cts +25 -0
- package/dist/requested-by.d.ts +25 -0
- package/dist/requested-by.js +49 -0
- package/dist/requested-by.js.map +1 -0
- package/dist/result/index.d.cts +2 -1
- package/dist/result/index.d.ts +2 -1
- package/dist/result.d.cts +84 -0
- package/dist/result.d.ts +84 -0
- package/dist/rule.cjs +327 -0
- package/dist/rule.cjs.map +1 -0
- package/dist/rule.js +298 -0
- package/dist/rule.js.map +1 -0
- package/dist/stable-stringify.cjs +47 -0
- package/dist/stable-stringify.cjs.map +1 -0
- package/dist/stable-stringify.js +42 -0
- package/dist/stable-stringify.js.map +1 -0
- package/dist/temporal-use-case.cjs +6 -53
- package/dist/temporal-use-case.cjs.map +1 -1
- package/dist/temporal-use-case.d.cts +11 -28
- package/dist/temporal-use-case.d.ts +11 -28
- package/dist/temporal-use-case.js +7 -48
- package/dist/temporal-use-case.js.map +1 -1
- package/dist/unexpected-error.cjs +3 -192
- package/dist/unexpected-error.cjs.map +1 -1
- package/dist/unexpected-error.js +2 -167
- package/dist/unexpected-error.js.map +1 -1
- package/dist/use-case.cjs +2 -6
- package/dist/use-case.cjs.map +1 -1
- package/dist/use-case.js +2 -6
- package/dist/use-case.js.map +1 -1
- package/dist/uuid-identifier.cjs +2 -7
- package/dist/uuid-identifier.cjs.map +1 -1
- package/dist/uuid-identifier.d.cts +2 -85
- package/dist/uuid-identifier.d.ts +2 -85
- package/dist/uuid-identifier.js +1 -6
- package/dist/uuid-identifier.js.map +1 -1
- package/dist/uuid.cjs +18 -0
- package/dist/uuid.cjs.map +1 -0
- package/dist/uuid.js +13 -0
- package/dist/uuid.js.map +1 -0
- package/dist/validation-error.cjs +33 -166
- package/dist/validation-error.cjs.map +1 -1
- package/dist/validation-error.d.cts +12 -103
- package/dist/validation-error.d.ts +12 -103
- package/dist/validation-error.js +7 -134
- package/dist/validation-error.js.map +1 -1
- package/dist/value-object.cjs +12 -126
- package/dist/value-object.cjs.map +1 -1
- package/dist/value-object.d.cts +97 -0
- package/dist/value-object.d.ts +97 -0
- package/dist/value-object.js +13 -115
- package/dist/value-object.js.map +1 -1
- package/meta.json +20 -4
- package/package.json +27 -1
- package/src/abac/index.ts +1 -0
- package/src/core/abac/abac-request.ts +29 -0
- package/src/core/abac/attributes.ts +39 -0
- package/src/core/abac/authorizer.ts +108 -0
- package/src/core/abac/combining.ts +63 -0
- package/src/core/abac/composite-authorizer.ts +45 -0
- package/src/core/abac/domain/policy-set.ts +52 -0
- package/src/core/abac/domain/rule.ts +197 -0
- package/src/core/abac/index.ts +21 -0
- package/src/core/application/commands/requested-by.ts +3 -4
- package/src/core/application/ports/abac-authorizer.port.ts +20 -0
- package/src/core/application/ports/authorizer.port.ts +22 -0
- package/src/core/application/queries/query.ts +6 -1
- package/src/core/application/use-case.ts +1 -1
- package/src/core/domain/entity.ts +1 -1
- package/src/core/domain/uuid-identifier.ts +1 -8
- package/src/core/domain/value-object.ts +12 -3
- package/src/core/errors/authorization-error.ts +26 -0
- package/src/core/errors/error-codes.ts +1 -0
- package/src/core/errors/utils/json-safe.ts +20 -11
- package/src/core/index.ts +7 -0
- package/src/core/policies/engines/v1/condition-evaluator.ts +56 -1
- package/src/core/rbac/access-request.ts +32 -0
- package/src/core/rbac/authorizer.ts +91 -0
- package/src/core/rbac/domain/grant.ts +96 -0
- package/src/core/rbac/domain/permission-set.ts +67 -0
- package/src/core/rbac/domain/permission.ts +119 -0
- package/src/core/rbac/domain/role.ts +101 -0
- package/src/core/rbac/domain/scope.ts +84 -0
- package/src/core/rbac/index.ts +15 -0
- package/src/core/rbac/policy-bridge.ts +44 -0
- package/src/core/shared/hashing.ts +1 -55
- package/src/core/shared/stable-stringify.ts +57 -0
- package/src/core/shared/uuid.ts +11 -0
- package/src/examples/application/authorize-cancel-order-abac.example.ts +107 -0
- package/src/examples/application/authorize-cancel-order.example.ts +101 -0
- package/src/rbac/index.ts +1 -0
- 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.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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"}
|
|
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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"}
|