@cullet/erp-core 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +24 -24
  2. package/dist/gate-engine-registry.js.map +1 -1
  3. package/dist/gate-v1-payload.schema.js.map +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/outcome.js.map +1 -1
  8. package/dist/policies/engines/v1/gate/index.js.map +1 -1
  9. package/dist/policy-service.js.map +1 -1
  10. package/dist/validation-code.js.map +1 -1
  11. package/dist/validation-error.js.map +1 -1
  12. package/dist/validation-field.js.map +1 -1
  13. package/meta.json +67 -62
  14. package/package.json +56 -56
  15. package/src/core/application/commands/command.ts +3 -3
  16. package/src/core/application/commands/requested-by.ts +60 -60
  17. package/src/core/application/index.ts +21 -21
  18. package/src/core/application/policy-error-mapper.ts +54 -54
  19. package/src/core/application/ports/index.ts +6 -6
  20. package/src/core/application/ports/logger.port.ts +4 -4
  21. package/src/core/application/ports/metrics.port.ts +3 -3
  22. package/src/core/application/ports/policy-port.ts +7 -7
  23. package/src/core/application/ports/repository.port.ts +3 -3
  24. package/src/core/application/ports/temporal-repository.port.ts +4 -4
  25. package/src/core/application/ports/tracer.port.ts +7 -7
  26. package/src/core/application/queries/query.ts +13 -13
  27. package/src/core/application/temporal/index.ts +7 -7
  28. package/src/core/application/temporal/temporal-context.ts +20 -20
  29. package/src/core/application/temporal/temporal-use-case.ts +22 -22
  30. package/src/core/application/use-case.ts +10 -10
  31. package/src/core/config/core-config.instance.ts +1 -1
  32. package/src/core/config/core-config.ts +59 -59
  33. package/src/core/config/index.ts +6 -6
  34. package/src/core/config/policy-reporter.ts +31 -31
  35. package/src/core/config/silent-policy-reporter.ts +1 -1
  36. package/src/core/domain/entity.ts +44 -44
  37. package/src/core/domain/rulesets/entity-ruleset.contracts.ts +6 -6
  38. package/src/core/domain/rulesets/ruleset-registry.ts +49 -49
  39. package/src/core/domain/rulesets/ruleset.contracts.ts +6 -6
  40. package/src/core/domain/rulesets/value-object-ruleset.contracts.ts +5 -5
  41. package/src/core/domain/temporal/index.ts +11 -11
  42. package/src/core/domain/temporal/temporal-range.ts +16 -16
  43. package/src/core/domain/temporal/temporal-snapshot.ts +24 -24
  44. package/src/core/domain/temporal/transaction-time.ts +30 -30
  45. package/src/core/domain/temporal/valid-time.ts +29 -29
  46. package/src/core/domain/value-object.ts +16 -16
  47. package/src/core/errors/app-error.ts +64 -64
  48. package/src/core/errors/authentication-error.ts +134 -134
  49. package/src/core/errors/authorization-error.ts +154 -154
  50. package/src/core/errors/business-rule-violation-error.ts +15 -15
  51. package/src/core/errors/conflict-error.ts +202 -201
  52. package/src/core/errors/error-codes.ts +48 -48
  53. package/src/core/errors/idempotency-error.ts +324 -320
  54. package/src/core/errors/index.ts +50 -50
  55. package/src/core/errors/integration-error.ts +120 -120
  56. package/src/core/errors/legacy-incompatible-error.ts +13 -13
  57. package/src/core/errors/not-found-error.ts +14 -14
  58. package/src/core/errors/serialization-error.ts +167 -167
  59. package/src/core/errors/temporal-error.ts +109 -107
  60. package/src/core/errors/types.ts +35 -35
  61. package/src/core/errors/unexpected-error.ts +10 -10
  62. package/src/core/errors/utils/index.ts +2 -2
  63. package/src/core/errors/utils/json-safe.ts +53 -53
  64. package/src/core/errors/validation-error.ts +18 -18
  65. package/src/core/exceptions/business-rule-violation-exception.ts +6 -6
  66. package/src/core/exceptions/domain-exception.ts +5 -5
  67. package/src/core/exceptions/entity-not-found-exception.ts +6 -6
  68. package/src/core/exceptions/invalid-state-transition-exception.ts +8 -8
  69. package/src/core/exceptions/invariant-violation-exception.ts +3 -3
  70. package/src/core/exceptions/validation-code.ts +35 -29
  71. package/src/core/exceptions/validation-exception.ts +19 -19
  72. package/src/core/exceptions/validation-field.ts +20 -19
  73. package/src/core/index.ts +7 -7
  74. package/src/core/policies/asof/asof.ts +47 -47
  75. package/src/core/policies/catalog/catalog.instance.ts +8 -6
  76. package/src/core/policies/catalog/index.ts +4 -4
  77. package/src/core/policies/catalog/policy-catalog-entry.ts +199 -197
  78. package/src/core/policies/catalog/policy-catalog.ts +101 -101
  79. package/src/core/policies/catalog/policy-key.ts +51 -51
  80. package/src/core/policies/context/context-builder.ts +335 -313
  81. package/src/core/policies/context/context-registry.instance.ts +9 -9
  82. package/src/core/policies/context/context-registry.ts +61 -61
  83. package/src/core/policies/context/context-resolver.ts +12 -12
  84. package/src/core/policies/context/context-seed.ts +19 -15
  85. package/src/core/policies/context/index.ts +9 -9
  86. package/src/core/policies/context/path.ts +135 -128
  87. package/src/core/policies/defs/in-memory-policy-definition-repo.ts +56 -55
  88. package/src/core/policies/defs/index.ts +10 -10
  89. package/src/core/policies/defs/policy-definition-repository.ts +3 -3
  90. package/src/core/policies/defs/policy-definition.ts +143 -142
  91. package/src/core/policies/defs/policy-scope.ts +21 -19
  92. package/src/core/policies/defs/policy-semver.ts +51 -51
  93. package/src/core/policies/engines/compute-engine-registry.ts +43 -43
  94. package/src/core/policies/engines/compute-evaluator-registry.ts +20 -20
  95. package/src/core/policies/engines/compute-registry.ts +45 -45
  96. package/src/core/policies/engines/compute-types.ts +15 -15
  97. package/src/core/policies/engines/condition-evaluator-reporter.ts +17 -17
  98. package/src/core/policies/engines/gate-engine-registry.ts +27 -25
  99. package/src/core/policies/engines/gate-types.ts +28 -28
  100. package/src/core/policies/engines/index.ts +28 -28
  101. package/src/core/policies/engines/parse-compute-payload.ts +51 -45
  102. package/src/core/policies/engines/parse-gate-payload.ts +42 -42
  103. package/src/core/policies/engines/v1/compute/compute-engine-v1.ts +39 -37
  104. package/src/core/policies/engines/v1/compute/compute-payload.schema.ts +43 -41
  105. package/src/core/policies/engines/v1/compute/index.ts +6 -6
  106. package/src/core/policies/engines/v1/compute/resolve-decision-table-v1.ts +41 -39
  107. package/src/core/policies/engines/v1/condition-evaluator.ts +547 -505
  108. package/src/core/policies/engines/v1/condition-schema.ts +35 -35
  109. package/src/core/policies/engines/v1/condition-types.ts +21 -21
  110. package/src/core/policies/engines/v1/gate/gate-engine-v1.ts +134 -130
  111. package/src/core/policies/engines/v1/gate/gate-types-v1.ts +5 -5
  112. package/src/core/policies/engines/v1/gate/gate-v1-payload.schema.ts +32 -30
  113. package/src/core/policies/engines/v1/gate/index.ts +4 -4
  114. package/src/core/policies/engines/v1/index.ts +8 -8
  115. package/src/core/policies/index.ts +72 -72
  116. package/src/core/policies/package/policy-package.ts +3 -3
  117. package/src/core/policies/policy-ids.ts +25 -25
  118. package/src/core/policies/resolver/policy-resolver.ts +34 -34
  119. package/src/core/policies/service/index.ts +6 -6
  120. package/src/core/policies/service/policy-evaluation-error.ts +141 -133
  121. package/src/core/policies/service/policy-service.ts +432 -419
  122. package/src/core/policies/utils/date.ts +3 -3
  123. package/src/core/policies/utils/hash.ts +61 -61
  124. package/src/core/result/outcome.ts +131 -126
  125. package/src/core/result/result.ts +130 -127
  126. package/src/core/shared/aggregate-version.ts +5 -5
  127. package/src/core/shared/hashing.ts +18 -18
  128. package/src/core/shared/immutable.ts +29 -29
  129. package/src/core/shared/temporal-guards.ts +9 -9
  130. package/src/core/versioning/domain-event-contracts.ts +40 -40
  131. package/src/core/versioning/version.ts +19 -19
  132. package/src/examples/rulesets/entity/order-creation-rules-v1.ts +18 -18
  133. package/src/examples/rulesets/entity/order-invariants-v1.ts +31 -29
  134. package/src/examples/rulesets/entity/order-invariants-v2.ts +12 -12
  135. package/src/examples/rulesets/entity/order.ts +127 -127
  136. package/src/examples/rulesets/value-object/cpf-rules-v1.ts +41 -39
  137. package/src/examples/rulesets/value-object/cpf-rules-v2.ts +14 -12
  138. package/src/examples/rulesets/value-object/cpf.ts +24 -24
  139. package/src/examples/rulesets/value-object/customer.ts +42 -39
  140. package/src/examples/rulesets/value-object/person-name-rules-v1.ts +27 -27
  141. package/src/examples/rulesets/value-object/person-name-rules-v2.ts +13 -13
  142. package/src/examples/rulesets/value-object/person-name.ts +29 -26
  143. package/src/index.ts +2 -2
  144. package/src/version.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"validation-code.js","names":[],"sources":["../src/core/errors/error-codes.ts","../src/core/errors/utils/json-safe.ts","../src/core/errors/app-error.ts","../src/core/shared/hashing.ts","../src/core/errors/unexpected-error.ts","../src/core/exceptions/validation-code.ts"],"sourcesContent":["const ErrorCodes = {\n authentication: {\n missingToken: \"sec.authn.missing_token\",\n invalidToken: \"sec.authn.invalid_token\",\n expiredToken: \"sec.authn.expired_token\",\n invalidCredentials: \"sec.authn.invalid_credentials\",\n },\n authorization: {\n forbidden: \"sec.authz.forbidden\",\n policyDenied: \"sec.authz.policy_denied\",\n missingCapability: \"sec.authz.missing_capability\",\n outOfScope: \"sec.authz.out_of_scope\",\n },\n businessRuleViolation: \"business_rule_violation\",\n conflict: {\n alreadyExists: \"conf.already_exists\",\n duplicate: \"conf.duplicate\",\n uniqueViolation: \"conf.unique_violation\",\n },\n idempotency: {\n keyMissing: \"idemp.key_missing\",\n inProgress: \"idemp.in_progress\",\n payloadMismatch: \"idemp.payload_mismatch\",\n replayNotSupported: \"idemp.replay_not_supported\",\n },\n integration: {\n timeout: \"int.timeout\",\n unreachable: \"int.unreachable\",\n badResponse: \"int.bad_response\",\n },\n legacyIncompatible: \"legacy_incompatible\",\n notFound: \"not_found\",\n serialization: {\n deserializePrefix: \"ser.des\",\n serializePrefix: \"ser.ser\",\n },\n temporal: {\n expired: \"tmp.expired\",\n notYetValid: \"tmp.not_yet_valid\",\n },\n unexpected: \"unexpected\",\n validation: \"validation_error\",\n} as const;\n\ntype SerializationCodeDirection = \"deserialize\" | \"serialize\";\n\nfunction serializationErrorCode(\n direction: SerializationCodeDirection,\n category: string,\n): string {\n const prefix =\n direction === \"deserialize\"\n ? ErrorCodes.serialization.deserializePrefix\n : ErrorCodes.serialization.serializePrefix;\n\n return `${prefix}.${category}`;\n}\n\nexport { ErrorCodes, serializationErrorCode };\nexport type { SerializationCodeDirection };\n","// Utilities for ensuring metadata is JSON-serializable.\n\nimport type { JsonSafeRecord, JsonSafeValue } from \"../types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NON_SERIALIZABLE_PLACEHOLDER = \"[NonSerializable]\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction sanitizeValue(value: unknown): JsonSafeValue {\n // Null passthrough\n if (value === null) return null;\n\n const type = typeof value;\n\n // Primitives\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\n return value as JsonSafeValue;\n }\n\n // Non-serializable primitives\n if (\n type === \"bigint\" ||\n type === \"function\" ||\n type === \"symbol\" ||\n value === undefined\n ) {\n return NON_SERIALIZABLE_PLACEHOLDER;\n }\n\n // Arrays (recursive)\n if (Array.isArray(value)) {\n return value.map(sanitizeValue);\n }\n\n // Date → placeholder (could also use .toISOString() if preferred)\n if (value instanceof Date) {\n return NON_SERIALIZABLE_PLACEHOLDER;\n }\n\n // Class instances and non-plain objects → placeholder\n if (!isPlainObject(value)) {\n return NON_SERIALIZABLE_PLACEHOLDER;\n }\n\n // Plain object (recursive)\n const result: Record<string, JsonSafeValue> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = sanitizeValue(val);\n }\n return result;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Ensures metadata is JSON-serializable.\n *\n * **Allowed:** string, number, boolean, null, arrays, and plain objects.\n *\n * **Converted to placeholder:** Date, BigInt, class instances, functions,\n * symbols, undefined.\n *\n * @throws {TypeError} If `input` is not a plain object at the root level.\n */\nfunction assertJsonSafeMetadata(input: unknown): JsonSafeRecord {\n if (input === undefined) {\n return {};\n }\n\n if (!isPlainObject(input)) {\n throw new TypeError(\n \"metadata must be a plain object (Record<string, unknown>).\",\n );\n }\n\n return sanitizeValue(input) as JsonSafeRecord;\n}\n\nexport { assertJsonSafeMetadata, NON_SERIALIZABLE_PLACEHOLDER };\n","// Base application error for the domain/application layer.\n// Encapsulates a code, optional cause, and JSON-safe metadata.\n\nimport type { AppErrorOptions, ErrorSeverity, JsonSafeRecord } from \"./types\";\nimport { assertJsonSafeMetadata } from \"./utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// AppError (abstract base class)\n// ─────────────────────────────────────────────────────────────────────────────\n\nabstract class AppError extends Error {\n public readonly code: string;\n public readonly cause?: unknown;\n public readonly metadata?: JsonSafeRecord;\n public readonly type?: string;\n public readonly severity?: ErrorSeverity;\n public readonly createdAtIso: string;\n public readonly publicMessage?: string;\n /**\n * Identifies a single execution \"story\" in the system. All operations\n * related to the same logical flow must share the same correlationId.\n */\n public readonly correlationId?: string;\n /**\n * Identifies a specific technical request attempt (each retry may produce\n * a new requestId), even when the correlationId stays the same.\n */\n public readonly requestId?: string;\n /**\n * Marks the business intent / idempotency key; stays the same across\n * technical retries and multiple requests that represent the same intent.\n */\n public readonly commandId?: string;\n\n protected constructor(\n message: string,\n code: string,\n options?: AppErrorOptions,\n ) {\n super(message);\n\n this.name = new.target.name;\n this.code = code;\n this.cause = options?.cause;\n this.type = options?.type;\n this.severity = options?.severity;\n this.correlationId = options?.correlationId;\n this.requestId = options?.requestId;\n this.commandId = options?.commandId;\n this.createdAtIso = options?.createdAtIso ?? new Date().toISOString();\n this.publicMessage = options?.publicMessage;\n\n this.metadata = options?.metadata\n ? assertJsonSafeMetadata(options.metadata)\n : undefined;\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * Returns a JSON-safe representation of the error.\n * Does NOT include `cause` by default (to avoid leaking internal details).\n */\n public toJSON(): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n name: this.name,\n code: this.code,\n type: this.type,\n severity: this.severity,\n message: this.message,\n publicMessage: this.publicMessage,\n createdAtIso: this.createdAtIso,\n metadata: this.metadata,\n };\n\n if (this.correlationId !== undefined)\n payload.correlationId = this.correlationId;\n if (this.requestId !== undefined) payload.requestId = this.requestId;\n if (this.commandId !== undefined) payload.commandId = this.commandId;\n\n return payload;\n }\n}\n\nexport { AppError };\n","import { createHash } from \"node:crypto\";\n\nfunction sha256Hex(value: string): string {\n return createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n}\n\nfunction sortKeysDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => sortKeysDeep(item));\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const ordered = Object.create(null) as Record<string, unknown>;\n\n for (const key of Object.keys(record).sort()) {\n ordered[key] = sortKeysDeep(record[key]);\n }\n\n return ordered;\n }\n\n return value;\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortKeysDeep(value));\n}\n\nfunction payloadHash(value: unknown): string {\n return sha256Hex(stableStringify(value));\n}\n\nexport { payloadHash, sha256Hex, stableStringify };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// UnexpectedError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass UnexpectedError extends AppError {\n constructor(\n message = \"Unexpected error\",\n cause?: unknown,\n options?: Omit<AppErrorOptions, \"cause\">,\n ) {\n super(message, ErrorCodes.unexpected, {\n cause,\n ...options,\n });\n }\n}\n\nexport { UnexpectedError };\n","// Object-oriented representation of validation codes (similar to Kotlin inline class).\n// Provides common reusable codes while allowing custom codes via `of`.\n\nclass ValidationCode {\n public readonly value: string;\n\n private constructor(value: string) {\n this.value = value;\n }\n\n // Factory for custom codes\n public static of(value: string): ValidationCode {\n return new ValidationCode(value);\n }\n\n // Common, domain-friendly codes\n public static readonly BLANK = new ValidationCode(\"blank\");\n public static readonly REQUIRED = new ValidationCode(\"required\");\n public static readonly INVALID_FORMAT = new ValidationCode(\"invalid_format\");\n public static readonly INVALID_CHARACTERS = new ValidationCode(\n \"invalid_characters\",\n );\n public static readonly INVALID_LENGTH = new ValidationCode(\"invalid_length\");\n public static readonly TOO_SHORT = new ValidationCode(\"too_short\");\n public static readonly TOO_LONG = new ValidationCode(\"too_long\");\n public static readonly OUT_OF_RANGE = new ValidationCode(\"out_of_range\");\n public static readonly INVALID_CHECKSUM = new ValidationCode(\n \"invalid_checksum\",\n );\n public static readonly INVALID_CHECKING_DIGIT = new ValidationCode(\n \"invalid_checking_digit\",\n );\n public static readonly ALREADY_EXISTS = new ValidationCode(\"already_exists\");\n public static readonly NOT_FOUND = new ValidationCode(\"not_found\");\n public static readonly NOT_ALLOWED = new ValidationCode(\"not_allowed\");\n public static readonly UNEXPECTED = new ValidationCode(\"unexpected\");\n}\n\nexport { ValidationCode };\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation-code.js","names":[],"sources":["../src/core/errors/error-codes.ts","../src/core/errors/utils/json-safe.ts","../src/core/errors/app-error.ts","../src/core/shared/hashing.ts","../src/core/errors/unexpected-error.ts","../src/core/exceptions/validation-code.ts"],"sourcesContent":["const ErrorCodes = {\n authentication: {\n missingToken: \"sec.authn.missing_token\",\n invalidToken: \"sec.authn.invalid_token\",\n expiredToken: \"sec.authn.expired_token\",\n invalidCredentials: \"sec.authn.invalid_credentials\",\n },\n authorization: {\n forbidden: \"sec.authz.forbidden\",\n policyDenied: \"sec.authz.policy_denied\",\n missingCapability: \"sec.authz.missing_capability\",\n outOfScope: \"sec.authz.out_of_scope\",\n },\n businessRuleViolation: \"business_rule_violation\",\n conflict: {\n alreadyExists: \"conf.already_exists\",\n duplicate: \"conf.duplicate\",\n uniqueViolation: \"conf.unique_violation\",\n },\n idempotency: {\n keyMissing: \"idemp.key_missing\",\n inProgress: \"idemp.in_progress\",\n payloadMismatch: \"idemp.payload_mismatch\",\n replayNotSupported: \"idemp.replay_not_supported\",\n },\n integration: {\n timeout: \"int.timeout\",\n unreachable: \"int.unreachable\",\n badResponse: \"int.bad_response\",\n },\n legacyIncompatible: \"legacy_incompatible\",\n notFound: \"not_found\",\n serialization: {\n deserializePrefix: \"ser.des\",\n serializePrefix: \"ser.ser\",\n },\n temporal: {\n expired: \"tmp.expired\",\n notYetValid: \"tmp.not_yet_valid\",\n },\n unexpected: \"unexpected\",\n validation: \"validation_error\",\n} as const;\n\ntype SerializationCodeDirection = \"deserialize\" | \"serialize\";\n\nfunction serializationErrorCode(\n direction: SerializationCodeDirection,\n category: string,\n): string {\n const prefix =\n direction === \"deserialize\"\n ? ErrorCodes.serialization.deserializePrefix\n : ErrorCodes.serialization.serializePrefix;\n\n return `${prefix}.${category}`;\n}\n\nexport { ErrorCodes, serializationErrorCode };\nexport type { SerializationCodeDirection };\n","// Utilities for ensuring metadata is JSON-serializable.\n\nimport type { JsonSafeRecord, JsonSafeValue } from \"../types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NON_SERIALIZABLE_PLACEHOLDER = \"[NonSerializable]\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction sanitizeValue(value: unknown): JsonSafeValue {\n // Null passthrough\n if (value === null) return null;\n\n const type = typeof value;\n\n // Primitives\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\n return value as JsonSafeValue;\n }\n\n // Non-serializable primitives\n if (\n type === \"bigint\" ||\n type === \"function\" ||\n type === \"symbol\" ||\n value === undefined\n ) {\n return NON_SERIALIZABLE_PLACEHOLDER;\n }\n\n // Arrays (recursive)\n if (Array.isArray(value)) {\n return value.map(sanitizeValue);\n }\n\n // Date → placeholder (could also use .toISOString() if preferred)\n if (value instanceof Date) {\n return NON_SERIALIZABLE_PLACEHOLDER;\n }\n\n // Class instances and non-plain objects → placeholder\n if (!isPlainObject(value)) {\n return NON_SERIALIZABLE_PLACEHOLDER;\n }\n\n // Plain object (recursive)\n const result: Record<string, JsonSafeValue> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = sanitizeValue(val);\n }\n return result;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Ensures metadata is JSON-serializable.\n *\n * **Allowed:** string, number, boolean, null, arrays, and plain objects.\n *\n * **Converted to placeholder:** Date, BigInt, class instances, functions,\n * symbols, undefined.\n *\n * @throws {TypeError} If `input` is not a plain object at the root level.\n */\nfunction assertJsonSafeMetadata(input: unknown): JsonSafeRecord {\n if (input === undefined) {\n return {};\n }\n\n if (!isPlainObject(input)) {\n throw new TypeError(\n \"metadata must be a plain object (Record<string, unknown>).\",\n );\n }\n\n return sanitizeValue(input) as JsonSafeRecord;\n}\n\nexport { assertJsonSafeMetadata, NON_SERIALIZABLE_PLACEHOLDER };\n","// Base application error for the domain/application layer.\n// Encapsulates a code, optional cause, and JSON-safe metadata.\n\nimport type { AppErrorOptions, ErrorSeverity, JsonSafeRecord } from \"./types\";\nimport { assertJsonSafeMetadata } from \"./utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// AppError (abstract base class)\n// ─────────────────────────────────────────────────────────────────────────────\n\nabstract class AppError extends Error {\n public readonly code: string;\n public readonly cause?: unknown;\n public readonly metadata?: JsonSafeRecord;\n public readonly type?: string;\n public readonly severity?: ErrorSeverity;\n public readonly createdAtIso: string;\n public readonly publicMessage?: string;\n /**\n * Identifies a single execution \"story\" in the system. All operations\n * related to the same logical flow must share the same correlationId.\n */\n public readonly correlationId?: string;\n /**\n * Identifies a specific technical request attempt (each retry may produce\n * a new requestId), even when the correlationId stays the same.\n */\n public readonly requestId?: string;\n /**\n * Marks the business intent / idempotency key; stays the same across\n * technical retries and multiple requests that represent the same intent.\n */\n public readonly commandId?: string;\n\n protected constructor(\n message: string,\n code: string,\n options?: AppErrorOptions,\n ) {\n super(message);\n\n this.name = new.target.name;\n this.code = code;\n this.cause = options?.cause;\n this.type = options?.type;\n this.severity = options?.severity;\n this.correlationId = options?.correlationId;\n this.requestId = options?.requestId;\n this.commandId = options?.commandId;\n this.createdAtIso = options?.createdAtIso ?? new Date().toISOString();\n this.publicMessage = options?.publicMessage;\n\n this.metadata = options?.metadata\n ? assertJsonSafeMetadata(options.metadata)\n : undefined;\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * Returns a JSON-safe representation of the error.\n * Does NOT include `cause` by default (to avoid leaking internal details).\n */\n public toJSON(): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n name: this.name,\n code: this.code,\n type: this.type,\n severity: this.severity,\n message: this.message,\n publicMessage: this.publicMessage,\n createdAtIso: this.createdAtIso,\n metadata: this.metadata,\n };\n\n if (this.correlationId !== undefined)\n payload.correlationId = this.correlationId;\n if (this.requestId !== undefined) payload.requestId = this.requestId;\n if (this.commandId !== undefined) payload.commandId = this.commandId;\n\n return payload;\n }\n}\n\nexport { AppError };\n","import { createHash } from \"node:crypto\";\n\nfunction sha256Hex(value: string): string {\n return createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n}\n\nfunction sortKeysDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => sortKeysDeep(item));\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const ordered = Object.create(null) as Record<string, unknown>;\n\n for (const key of Object.keys(record).sort()) {\n ordered[key] = sortKeysDeep(record[key]);\n }\n\n return ordered;\n }\n\n return value;\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortKeysDeep(value));\n}\n\nfunction payloadHash(value: unknown): string {\n return sha256Hex(stableStringify(value));\n}\n\nexport { payloadHash, sha256Hex, stableStringify };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// UnexpectedError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass UnexpectedError extends AppError {\n constructor(\n message = \"Unexpected error\",\n cause?: unknown,\n options?: Omit<AppErrorOptions, \"cause\">,\n ) {\n super(message, ErrorCodes.unexpected, {\n cause,\n ...options,\n });\n }\n}\n\nexport { UnexpectedError };\n","// Object-oriented representation of validation codes (similar to Kotlin inline class).\n// Provides common reusable codes while allowing custom codes via `of`.\n\nclass ValidationCode {\n public readonly value: string;\n\n private constructor(value: string) {\n this.value = value;\n }\n\n // Factory for custom codes\n public static of(value: string): ValidationCode {\n return new ValidationCode(value);\n }\n\n // Common, domain-friendly codes\n public static readonly BLANK = new ValidationCode(\"blank\");\n public static readonly REQUIRED = new ValidationCode(\"required\");\n public static readonly INVALID_FORMAT = new ValidationCode(\n \"invalid_format\",\n );\n public static readonly INVALID_CHARACTERS = new ValidationCode(\n \"invalid_characters\",\n );\n public static readonly INVALID_LENGTH = new ValidationCode(\n \"invalid_length\",\n );\n public static readonly TOO_SHORT = new ValidationCode(\"too_short\");\n public static readonly TOO_LONG = new ValidationCode(\"too_long\");\n public static readonly OUT_OF_RANGE = new ValidationCode(\"out_of_range\");\n public static readonly INVALID_CHECKSUM = new ValidationCode(\n \"invalid_checksum\",\n );\n public static readonly INVALID_CHECKING_DIGIT = new ValidationCode(\n \"invalid_checking_digit\",\n );\n public static readonly ALREADY_EXISTS = new ValidationCode(\n \"already_exists\",\n );\n public static readonly NOT_FOUND = new ValidationCode(\"not_found\");\n public static readonly NOT_ALLOWED = new ValidationCode(\"not_allowed\");\n public static readonly UNEXPECTED = new ValidationCode(\"unexpected\");\n}\n\nexport { ValidationCode };\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation-error.js","names":["compactMetadata","extractAppErrorOptions"],"sources":["../src/core/errors/authentication-error.ts","../src/core/errors/authorization-error.ts","../src/core/errors/business-rule-violation-error.ts","../src/core/errors/conflict-error.ts","../src/core/errors/idempotency-error.ts","../src/core/errors/integration-error.ts","../src/core/errors/legacy-incompatible-error.ts","../src/core/errors/not-found-error.ts","../src/core/errors/serialization-error.ts","../src/core/errors/temporal-error.ts","../src/core/errors/validation-error.ts"],"sourcesContent":["import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions, ErrorSeverity } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype AuthenticationErrorReason =\n | \"missing_token\"\n | \"malformed_token\"\n | \"invalid_token\"\n | \"expired_token\"\n | \"revoked_token\"\n | \"invalid_credentials\"\n | \"session_not_found\"\n | \"session_expired\"\n | \"unknown\";\n\ntype AuthenticationErrorMetadata = {\n reason: AuthenticationErrorReason;\n authScheme?: \"bearer\" | \"cookie\" | \"basic\" | \"unknown\";\n tokenLocation?: \"header\" | \"cookie\" | \"query\" | \"unknown\";\n expiresAtIso?: string;\n correlationId?: string;\n requestId?: string;\n details?: string;\n};\n\ntype AuthenticationErrorFactoryOptions = Omit<\n AuthenticationErrorMetadata,\n \"reason\"\n> &\n Omit<AppErrorOptions, \"metadata\">;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// AuthenticationError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass AuthenticationError extends AppError {\n public readonly reason: AuthenticationErrorReason;\n\n private constructor(params: {\n message: string;\n code: string;\n reason: AuthenticationErrorReason;\n metadata?: Omit<AuthenticationErrorMetadata, \"reason\">;\n cause?: unknown;\n type?: string;\n severity?: ErrorSeverity;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n createdAtIso?: string;\n publicMessage?: string;\n }) {\n super(params.message, params.code, {\n cause: params.cause,\n metadata: {\n reason: params.reason,\n ...(params.metadata ?? {}),\n },\n type: params.type,\n severity: params.severity,\n correlationId: params.correlationId,\n requestId: params.requestId,\n commandId: params.commandId,\n createdAtIso: params.createdAtIso,\n publicMessage: params.publicMessage,\n });\n\n this.reason = params.reason;\n Object.freeze(this);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Factory methods\n // ─────────────────────────────────────────────────────────────────────────\n\n static missingToken(\n options?: AuthenticationErrorFactoryOptions,\n ): AuthenticationError {\n return new AuthenticationError({\n message: \"Missing credentials\",\n code: ErrorCodes.authentication.missingToken,\n reason: \"missing_token\",\n metadata: compactMetadata(options),\n ...extractAppErrorOptions(options),\n });\n }\n\n static invalidToken(\n options?: AuthenticationErrorFactoryOptions & { cause?: unknown },\n ): AuthenticationError {\n return new AuthenticationError({\n message: \"Invalid credentials\",\n code: ErrorCodes.authentication.invalidToken,\n reason: \"invalid_token\",\n metadata: compactMetadata({\n authScheme: options?.authScheme,\n tokenLocation: options?.tokenLocation,\n details: options?.details,\n correlationId: options?.correlationId,\n requestId: options?.requestId,\n }),\n ...extractAppErrorOptions(options),\n });\n }\n\n static expiredToken(\n options?: AuthenticationErrorFactoryOptions & { sessionId?: string },\n ): AuthenticationError {\n return new AuthenticationError({\n message: \"Expired credentials\",\n code: ErrorCodes.authentication.expiredToken,\n reason: \"expired_token\",\n metadata: compactMetadata(options),\n ...extractAppErrorOptions(options),\n });\n }\n\n static invalidCredentials(\n options?: Pick<\n AuthenticationErrorFactoryOptions,\n | \"correlationId\"\n | \"requestId\"\n | \"type\"\n | \"severity\"\n | \"createdAtIso\"\n | \"publicMessage\"\n >,\n ): AuthenticationError {\n return new AuthenticationError({\n message: \"Invalid username or password\",\n code: ErrorCodes.authentication.invalidCredentials,\n reason: \"invalid_credentials\",\n metadata: compactMetadata(options),\n ...extractAppErrorOptions(options),\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction extractAppErrorOptions(options?: Partial<AppErrorOptions>) {\n return {\n cause: options?.cause,\n type: options?.type,\n severity: options?.severity,\n correlationId: options?.correlationId,\n requestId: options?.requestId,\n commandId: options?.commandId,\n createdAtIso: options?.createdAtIso,\n publicMessage: options?.publicMessage,\n };\n}\n\nfunction compactMetadata<T extends Record<string, unknown>>(\n input?: T,\n): T | undefined {\n if (!input) return undefined;\n\n return Object.fromEntries(\n Object.entries(input).filter(([, value]) => value !== undefined),\n ) as T;\n}\n\nexport { AuthenticationError };\nexport type { AuthenticationErrorMetadata, AuthenticationErrorReason };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions, ErrorSeverity } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype AuthorizationErrorReason =\n | \"forbidden\"\n | \"missing_role\"\n | \"missing_capability\"\n | \"out_of_scope\"\n | \"outside_time_window\"\n | \"policy_denied\"\n | \"unknown\";\n\ntype AuthorizationRequirement = {\n role?: string;\n capability?: string;\n scope?: string; // e.g.: \"school:{id}\" or \"class:{id}\"\n};\n\ntype AuthorizationErrorMetadata = {\n reason: AuthorizationErrorReason;\n\n /** Stable action you evaluated (not an HTTP route — a \"business action\") */\n action: string;\n\n /** Resource identification (without leaking the full payload) */\n resource?: { type: string; id?: string };\n\n /** Optional: actor (do not include sensitive data) */\n actor?: { userId: string; role?: string };\n\n /** Optional: expected requirement */\n required?: AuthorizationRequirement;\n\n /** Optional: policy (when you already have PolicyEvaluation or similar) */\n policyId?: string;\n policyVersion?: number;\n evaluatedAtIso?: string;\n decision?: \"allow\" | \"deny\";\n reasonCode?: string;\n\n /** Optional: additional non-sensitive info */\n details?: string;\n};\n\n/**\n * Options for AuthorizationError factory methods.\n * Combines metadata fields (except 'reason') with common AppError options.\n */\ntype AuthorizationErrorFactoryOptions = Omit<\n AuthorizationErrorMetadata,\n \"reason\"\n> &\n Omit<AppErrorOptions, \"metadata\">;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// AuthorizationError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass AuthorizationError extends AppError {\n public readonly reason: AuthorizationErrorReason;\n\n private constructor(params: {\n message: string;\n code: string;\n reason: AuthorizationErrorReason;\n metadata: AuthorizationErrorMetadata;\n cause?: unknown;\n type?: string;\n severity?: ErrorSeverity;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n createdAtIso?: string;\n publicMessage?: string;\n }) {\n super(params.message, params.code, {\n cause: params.cause,\n metadata: params.metadata,\n type: params.type,\n severity: params.severity,\n correlationId: params.correlationId,\n requestId: params.requestId,\n commandId: params.commandId,\n createdAtIso: params.createdAtIso,\n publicMessage: params.publicMessage,\n });\n\n this.reason = params.reason;\n Object.freeze(this);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Factories\n // ─────────────────────────────────────────────────────────────────────────\n\n static forbidden(\n input: AuthorizationErrorFactoryOptions,\n ): AuthorizationError {\n return new AuthorizationError({\n message: \"Action not allowed\",\n code: ErrorCodes.authorization.forbidden,\n reason: \"forbidden\",\n metadata: { reason: \"forbidden\", ...extractMetadataOnly(input) },\n ...extractAppErrorOptions(input),\n });\n }\n\n static policyDenied(\n input: AuthorizationErrorFactoryOptions & {\n policyId: string;\n policyVersion: number;\n evaluatedAtIso: string;\n },\n ): AuthorizationError {\n return new AuthorizationError({\n message: \"Action denied by policy\",\n code: ErrorCodes.authorization.policyDenied,\n reason: \"policy_denied\",\n metadata: {\n reason: \"policy_denied\",\n ...extractMetadataOnly(input),\n decision: \"deny\",\n },\n ...extractAppErrorOptions(input),\n });\n }\n\n static missingCapability(\n input: AuthorizationErrorFactoryOptions & {\n required: AuthorizationRequirement;\n },\n ): AuthorizationError {\n return new AuthorizationError({\n message: \"Insufficient capability to perform the action\",\n code: ErrorCodes.authorization.missingCapability,\n reason: \"missing_capability\",\n metadata: {\n reason: \"missing_capability\",\n ...extractMetadataOnly(input),\n },\n ...extractAppErrorOptions(input),\n });\n }\n\n static outOfScope(\n input: AuthorizationErrorFactoryOptions & {\n required?: AuthorizationRequirement;\n },\n ): AuthorizationError {\n return new AuthorizationError({\n message: \"Action outside the allowed scope\",\n code: ErrorCodes.authorization.outOfScope,\n reason: \"out_of_scope\",\n metadata: { reason: \"out_of_scope\", ...extractMetadataOnly(input) },\n ...extractAppErrorOptions(input),\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction extractAppErrorOptions(options?: Partial<AppErrorOptions>) {\n return {\n cause: options?.cause,\n type: options?.type,\n severity: options?.severity,\n correlationId: options?.correlationId,\n requestId: options?.requestId,\n commandId: options?.commandId,\n createdAtIso: options?.createdAtIso,\n publicMessage: options?.publicMessage,\n };\n}\n\nfunction extractMetadataOnly(\n input: AuthorizationErrorFactoryOptions,\n): Omit<AuthorizationErrorMetadata, \"reason\"> {\n const {\n cause,\n type,\n severity,\n correlationId,\n requestId,\n commandId,\n createdAtIso,\n publicMessage,\n ...metadata\n } = input;\n return metadata;\n}\n\nexport { AuthorizationError };\nexport type {\n AuthorizationErrorMetadata,\n AuthorizationErrorReason,\n AuthorizationRequirement,\n};\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BusinessRuleViolationError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass BusinessRuleViolationError extends AppError {\n constructor(\n rule: string,\n message: string,\n detail?: Record<string, unknown>,\n options?: AppErrorOptions,\n ) {\n const baseMetadata = detail ? { rule, detail } : { rule };\n const mergedMetadata = options?.metadata\n ? { ...baseMetadata, ...options.metadata }\n : baseMetadata;\n\n super(message, ErrorCodes.businessRuleViolation, {\n ...options,\n metadata: mergedMetadata,\n });\n }\n}\n\nexport { BusinessRuleViolationError };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n/**\n * Conflict kinds we want to distinguish semantically.\n */\ntype ConflictKind = \"already_exists\" | \"duplicate\" | \"unique_violation\";\n\n/**\n * Metadata attached to conflicts without exposing sensitive values.\n */\ntype ConflictErrorMetadata = {\n kind: ConflictKind;\n entity: string;\n operation?: string;\n field?: string;\n constraintName?: string;\n existingId?: string;\n valueHash?: string;\n valuePreview?: string;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n hint?: string;\n};\n\ntype UniqueConstraintViolation = {\n kind: \"unique_violation\";\n constraintName?: string;\n table?: string;\n columns?: string[];\n};\n\nabstract class ConflictError extends AppError {\n public readonly kind: ConflictKind;\n\n protected constructor(\n params: {\n message: string;\n code: string;\n kind: ConflictKind;\n metadata: Omit<ConflictErrorMetadata, \"kind\">;\n cause?: unknown;\n } & AppErrorOptions,\n ) {\n super(params.message, params.code, {\n ...params,\n metadata: {\n kind: params.kind,\n ...params.metadata,\n },\n });\n\n this.kind = params.kind;\n Object.freeze(this);\n }\n}\n\nclass AlreadyExistsError extends ConflictError {\n private constructor(\n input: {\n metadata: Omit<ConflictErrorMetadata, \"kind\">;\n cause?: unknown;\n } & AppErrorOptions,\n ) {\n super({\n message: \"A matching record already exists for the requested operation\",\n code: ErrorCodes.conflict.alreadyExists,\n kind: \"already_exists\",\n ...input,\n });\n }\n\n static detected(input: {\n entity: string;\n operation?: string;\n field?: string;\n existingId?: string;\n valueHash?: string;\n valuePreview?: string;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n hint?: string;\n cause?: unknown;\n }): AlreadyExistsError {\n return new AlreadyExistsError({\n metadata: {\n entity: input.entity,\n operation: input.operation ?? \"create\",\n field: input.field,\n existingId: input.existingId,\n valueHash: input.valueHash,\n valuePreview: input.valuePreview,\n detectedAtIso: input.detectedAtIso,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n hint: input.hint ?? \"Verify existing records before retrying.\",\n },\n cause: input.cause,\n });\n }\n}\n\nclass DuplicateError extends ConflictError {\n private constructor(\n input: {\n metadata: Omit<ConflictErrorMetadata, \"kind\">;\n cause?: unknown;\n } & AppErrorOptions,\n ) {\n super({\n message: \"Conflict: an existing record violates uniqueness\",\n code: ErrorCodes.conflict.duplicate,\n kind: \"duplicate\",\n ...input,\n });\n }\n\n static detected(input: {\n entity: string;\n operation?: string;\n field?: string;\n constraintName?: string;\n existingId?: string;\n valueHash?: string;\n valuePreview?: string;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n hint?: string;\n cause?: unknown;\n }): DuplicateError {\n return new DuplicateError({\n metadata: {\n entity: input.entity,\n operation: input.operation,\n field: input.field,\n constraintName: input.constraintName,\n existingId: input.existingId,\n valueHash: input.valueHash,\n valuePreview: input.valuePreview,\n detectedAtIso: input.detectedAtIso,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n hint:\n input.hint ??\n \"Adjust the data so it does not duplicate existing records.\",\n },\n cause: input.cause,\n });\n }\n}\n\nclass UniqueConstraintViolationError extends ConflictError {\n private constructor(\n input: {\n metadata: Omit<ConflictErrorMetadata, \"kind\"> & {\n violation: UniqueConstraintViolation;\n };\n cause?: unknown;\n } & AppErrorOptions,\n ) {\n super({\n message: \"Uniqueness violation in storage\",\n code: ErrorCodes.conflict.uniqueViolation,\n kind: \"unique_violation\",\n ...input,\n });\n }\n\n static detected(input: {\n entity: string;\n operation?: string;\n constraintName?: string;\n table?: string;\n columns?: string[];\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n cause?: unknown;\n }): UniqueConstraintViolationError {\n return new UniqueConstraintViolationError({\n metadata: {\n entity: input.entity,\n operation: input.operation,\n constraintName: input.constraintName,\n detectedAtIso: input.detectedAtIso,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n violation: {\n kind: \"unique_violation\",\n constraintName: input.constraintName,\n table: input.table,\n columns: input.columns,\n },\n hint: \"Uniqueness conflict detected in the database.\",\n },\n cause: input.cause,\n });\n }\n}\n\nfunction translateUniqueViolationToDuplicate(input: {\n entity: string;\n operation?: string;\n violation: UniqueConstraintViolation;\n field?: string;\n ctx?: {\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n nowIso?: string;\n };\n cause?: unknown;\n}): DuplicateError {\n return DuplicateError.detected({\n entity: input.entity,\n operation: input.operation,\n field: input.field,\n constraintName: input.violation.constraintName,\n detectedAtIso: input.ctx?.nowIso,\n correlationId: input.ctx?.correlationId,\n requestId: input.ctx?.requestId,\n commandId: input.ctx?.commandId,\n cause: input.cause,\n });\n}\n\nexport {\n AlreadyExistsError,\n ConflictError,\n DuplicateError,\n translateUniqueViolationToDuplicate,\n UniqueConstraintViolationError,\n};\n\nexport type { ConflictErrorMetadata, ConflictKind, UniqueConstraintViolation };\n","import { payloadHash, sha256Hex, stableStringify } from \"../shared/hashing\";\n\nimport { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\n\nexport type IdempotencyFailureKind =\n | \"key_missing\"\n | \"in_progress\"\n | \"payload_mismatch\"\n | \"replay_not_supported\"\n | \"unknown\";\n\nexport type IdempotencyErrorMetadata = {\n kind: IdempotencyFailureKind;\n operation: string;\n scope?: string;\n entity?: string;\n keyHash?: string;\n keyPreview?: string;\n incomingPayloadHash?: string;\n existingPayloadHash?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n};\n\ntype IdempotencyErrorConstructorInput = {\n message: string;\n code: string;\n kind: IdempotencyFailureKind;\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n};\n\nabstract class IdempotencyError extends AppError {\n public readonly kind: IdempotencyFailureKind;\n\n protected constructor(input: IdempotencyErrorConstructorInput) {\n super(input.message, input.code, {\n cause: input.cause,\n metadata: { kind: input.kind, ...input.metadata },\n });\n\n this.kind = input.kind;\n Object.freeze(this);\n }\n\n static keyMissing(input: {\n operation: string;\n scope?: string;\n entity?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyKeyMissingError {\n return IdempotencyKeyMissingError.detected(input);\n }\n\n static inProgress(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyInProgressError {\n return IdempotencyInProgressError.detected(input);\n }\n\n static payloadMismatch(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n incomingPayloadHash?: string;\n existingPayloadHash?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyPayloadMismatchError {\n return IdempotencyPayloadMismatchError.detected(input);\n }\n\n static replayNotSupported(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyReplayNotSupportedError {\n return IdempotencyReplayNotSupportedError.detected(input);\n }\n}\n\nclass IdempotencyKeyMissingError extends IdempotencyError {\n private constructor(input: {\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n }) {\n super({\n message: \"Idempotency key/commandId missing for the requested operation\",\n code: ErrorCodes.idempotency.keyMissing,\n kind: \"key_missing\",\n metadata: input.metadata,\n cause: input.cause,\n });\n }\n\n static detected(input: {\n operation: string;\n scope?: string;\n entity?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyKeyMissingError {\n return new IdempotencyKeyMissingError({\n cause: input.cause,\n metadata: {\n operation: input.operation,\n scope: input.scope,\n entity: input.entity,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n detectedAtIso: input.detectedAtIso,\n hint:\n input.hint ??\n \"Send a commandId/idempotency key to prevent duplicate processing.\",\n details: input.details,\n },\n });\n }\n}\n\nclass IdempotencyInProgressError extends IdempotencyError {\n private constructor(input: {\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n }) {\n super({\n message: \"The same business intent is already being processed\",\n code: ErrorCodes.idempotency.inProgress,\n kind: \"in_progress\",\n metadata: input.metadata,\n cause: input.cause,\n });\n }\n\n static detected(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyInProgressError {\n const resolved = resolveKeyIdentity(\n input.key,\n input.keyHash,\n input.keyPreview,\n );\n\n return new IdempotencyInProgressError({\n cause: input.cause,\n metadata: {\n operation: input.operation,\n scope: input.scope,\n entity: input.entity,\n keyHash: resolved.keyHash,\n keyPreview: resolved.keyPreview,\n idempotencyRecordId: input.idempotencyRecordId,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n detectedAtIso: input.detectedAtIso,\n hint: input.hint ?? \"Wait for completion and retry using the same key.\",\n details: input.details,\n },\n });\n }\n}\n\nclass IdempotencyPayloadMismatchError extends IdempotencyError {\n private constructor(input: {\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n }) {\n super({\n message: \"The idempotency key was reused with a different payload\",\n code: ErrorCodes.idempotency.payloadMismatch,\n kind: \"payload_mismatch\",\n metadata: input.metadata,\n cause: input.cause,\n });\n }\n\n static detected(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n incomingPayloadHash?: string;\n existingPayloadHash?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyPayloadMismatchError {\n const resolved = resolveKeyIdentity(\n input.key,\n input.keyHash,\n input.keyPreview,\n );\n\n return new IdempotencyPayloadMismatchError({\n cause: input.cause,\n metadata: {\n operation: input.operation,\n scope: input.scope,\n entity: input.entity,\n keyHash: resolved.keyHash,\n keyPreview: resolved.keyPreview,\n incomingPayloadHash: input.incomingPayloadHash,\n existingPayloadHash: input.existingPayloadHash,\n idempotencyRecordId: input.idempotencyRecordId,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n detectedAtIso: input.detectedAtIso,\n hint:\n input.hint ??\n \"Use a new idempotency key for a new intent. The same key should only be reused for retries of the same payload.\",\n details: input.details,\n },\n });\n }\n}\n\nclass IdempotencyReplayNotSupportedError extends IdempotencyError {\n private constructor(input: {\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n }) {\n super({\n message:\n \"Re-execution detected, but replay of the previous result is not implemented\",\n code: ErrorCodes.idempotency.replayNotSupported,\n kind: \"replay_not_supported\",\n metadata: input.metadata,\n cause: input.cause,\n });\n }\n\n static detected(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyReplayNotSupportedError {\n const resolved = resolveKeyIdentity(\n input.key,\n input.keyHash,\n input.keyPreview,\n );\n\n return new IdempotencyReplayNotSupportedError({\n cause: input.cause,\n metadata: {\n operation: input.operation,\n scope: input.scope,\n entity: input.entity,\n keyHash: resolved.keyHash,\n keyPreview: resolved.keyPreview,\n idempotencyRecordId: input.idempotencyRecordId,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n detectedAtIso: input.detectedAtIso,\n hint:\n input.hint ??\n \"Try again later, or enable result replay for full idempotency.\",\n details: input.details,\n },\n });\n }\n}\n\nfunction resolveKeyIdentity(\n key?: string,\n keyHash?: string,\n keyPreview?: string,\n): { keyHash?: string; keyPreview?: string } {\n const preview =\n keyPreview ?? (key ? (key.length <= 8 ? key : key.slice(0, 8)) : undefined);\n\n return {\n keyHash: keyHash,\n keyPreview: preview,\n };\n}\n\nexport {\n IdempotencyError,\n IdempotencyKeyMissingError,\n IdempotencyInProgressError,\n IdempotencyPayloadMismatchError,\n IdempotencyReplayNotSupportedError,\n sha256Hex,\n stableStringify,\n payloadHash,\n};\n","import type { AppErrorOptions, ErrorSeverity } from \"./types\";\nimport { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\n\ntype IntegrationErrorReason =\n | \"timeout\"\n | \"unreachable\"\n | \"bad_response\"\n | \"unknown\";\n\ntype IntegrationErrorMetadata = {\n reason: IntegrationErrorReason;\n provider: string;\n operation: string;\n startedAtIso: string;\n durationMs: number;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n details?: string;\n statusCode?: number;\n responseCode?: string;\n};\n\ntype IntegrationErrorAppOptions = Pick<\n AppErrorOptions,\n | \"cause\"\n | \"type\"\n | \"severity\"\n | \"correlationId\"\n | \"requestId\"\n | \"commandId\"\n | \"createdAtIso\"\n | \"publicMessage\"\n>;\n\ntype IntegrationErrorConstructorParams = {\n message: string;\n code: string;\n reason: IntegrationErrorReason;\n metadata: IntegrationErrorMetadata;\n} & IntegrationErrorAppOptions;\n\nclass IntegrationError extends AppError {\n public readonly reason: IntegrationErrorReason;\n\n private constructor(params: IntegrationErrorConstructorParams) {\n const { message, code, metadata, ...rest } = params;\n super(message, code, {\n ...rest,\n metadata,\n });\n\n this.reason = params.reason;\n Object.freeze(this);\n }\n\n static timeout(options: IntegrationErrorTimeoutOptions): IntegrationError {\n return new IntegrationError({\n message: \"Timeout while integrating with external provider\",\n code: ErrorCodes.integration.timeout,\n reason: \"timeout\",\n metadata: buildMetadata({ reason: \"timeout\", ...options }),\n ...pickAppErrorFields(options),\n });\n }\n\n static unreachable(\n options: IntegrationErrorEndpointOptions,\n ): IntegrationError {\n return new IntegrationError({\n message: \"Provider unavailable\",\n code: ErrorCodes.integration.unreachable,\n reason: \"unreachable\",\n metadata: buildMetadata({ reason: \"unreachable\", ...options }),\n ...pickAppErrorFields(options),\n });\n }\n\n static badResponse(\n options: IntegrationErrorEndpointOptions,\n ): IntegrationError {\n return new IntegrationError({\n message: \"Unexpected response from provider\",\n code: ErrorCodes.integration.badResponse,\n reason: \"bad_response\",\n metadata: buildMetadata({ reason: \"bad_response\", ...options }),\n ...pickAppErrorFields(options),\n });\n }\n}\n\ntype IntegrationErrorBaseOptions = {\n provider: string;\n operation: string;\n startedAtIso: string;\n durationMs: number;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n details?: string;\n statusCode?: number;\n responseCode?: string;\n cause?: unknown;\n type?: string;\n severity?: ErrorSeverity;\n createdAtIso?: string;\n publicMessage?: string;\n};\n\ntype IntegrationErrorTimeoutOptions = IntegrationErrorBaseOptions;\ntype IntegrationErrorEndpointOptions = IntegrationErrorBaseOptions;\n\nfunction buildMetadata(\n input: IntegrationErrorBaseOptions & { reason: IntegrationErrorReason },\n): IntegrationErrorMetadata {\n return compactMetadata({\n reason: input.reason,\n provider: input.provider,\n operation: input.operation,\n startedAtIso: input.startedAtIso,\n durationMs: input.durationMs,\n detectedAtIso: input.detectedAtIso,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n details: input.details,\n statusCode: input.statusCode,\n responseCode: input.responseCode,\n }) as IntegrationErrorMetadata;\n}\n\nfunction pickAppErrorFields(\n options: IntegrationErrorBaseOptions,\n): IntegrationErrorAppOptions {\n return {\n cause: options.cause,\n type: options.type,\n severity: options.severity,\n correlationId: options.correlationId,\n requestId: options.requestId,\n commandId: options.commandId,\n createdAtIso: options.createdAtIso,\n publicMessage: options.publicMessage,\n };\n}\n\nfunction compactMetadata<T extends Record<string, unknown>>(input: T): T {\n return Object.fromEntries(\n Object.entries(input).filter(([, value]) => value !== undefined),\n ) as T;\n}\n\nexport { IntegrationError };\nexport type { IntegrationErrorReason, IntegrationErrorMetadata };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// LegacyIncompatibleError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass LegacyIncompatibleError extends AppError {\n constructor(\n message: string,\n context?: Record<string, unknown>,\n options?: AppErrorOptions,\n ) {\n const mergedMetadata = options?.metadata\n ? { ...(context ?? {}), ...options.metadata }\n : context;\n\n super(message, ErrorCodes.legacyIncompatible, {\n ...options,\n metadata: mergedMetadata,\n });\n }\n}\n\nexport { LegacyIncompatibleError };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NotFoundError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass NotFoundError extends AppError {\n constructor(\n resource: string,\n criteria?: Record<string, unknown>,\n options?: AppErrorOptions,\n ) {\n const baseMetadata = criteria ? { resource, criteria } : { resource };\n const mergedMetadata = options?.metadata\n ? { ...baseMetadata, ...options.metadata }\n : baseMetadata;\n\n super(`${resource} not found`, ErrorCodes.notFound, {\n ...options,\n metadata: mergedMetadata,\n });\n }\n}\n\nexport { NotFoundError };\n","import { AppError } from \"./app-error\";\nimport { serializationErrorCode } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype SerializationDirection = \"serialize\" | \"deserialize\";\n\ntype SerializationFailureCategory =\n | \"invalid_json\"\n | \"invalid_shape\"\n | \"missing_field\"\n | \"unexpected_field\"\n | \"invalid_type\"\n | \"schema_version_missing\"\n | \"schema_version_unsupported\"\n | \"mapping_not_implemented\"\n | \"contract_mismatch\"\n | \"parse_failed\"\n | \"stringify_failed\"\n | \"unknown\";\n\ntype SerializationBoundary =\n | \"http_in\"\n | \"http_out\"\n | \"graphql_in\"\n | \"graphql_out\"\n | \"dto_to_domain\"\n | \"domain_to_dto\"\n | \"persistence_to_domain\"\n | \"domain_to_persistence\"\n | \"event_in\"\n | \"event_out\"\n | \"projection\"\n | \"unknown\";\n\n/**\n * Metadata shared by serialization/deserialization failures. Payload previews must be sanitized.\n */\ntype SerializationErrorMetadata = {\n direction: SerializationDirection;\n category: SerializationFailureCategory;\n boundary: SerializationBoundary;\n contract: string;\n schemaVersion?: number | string;\n path?: string;\n payloadPreview?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n hint?: string;\n details?: string;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Base error\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype SerializationErrorOptions = Omit<AppErrorOptions, \"metadata\"> & {\n message: string;\n code: string;\n metadata: Omit<SerializationErrorMetadata, \"direction\" | \"category\">;\n direction: SerializationDirection;\n category: SerializationFailureCategory;\n};\n\nabstract class SerializationError extends AppError {\n public readonly direction: SerializationDirection;\n public readonly category: SerializationFailureCategory;\n public readonly boundary: SerializationBoundary;\n public readonly contract: string;\n\n protected constructor(input: SerializationErrorOptions) {\n super(input.message ?? \"Serialization failure\", input.code, {\n cause: input.cause,\n metadata: {\n direction: input.direction,\n category: input.category,\n ...input.metadata,\n },\n type: input.type,\n severity: input.severity,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n createdAtIso: input.createdAtIso,\n publicMessage: input.publicMessage,\n });\n\n this.direction = input.direction;\n this.category = input.category;\n this.boundary = input.metadata.boundary;\n this.contract = input.metadata.contract;\n\n Object.freeze(this);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Serialization In\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass SerializationInError extends SerializationError {\n private constructor(input: SerializationErrorOptions) {\n super(input);\n }\n\n static failure(\n category: SerializationFailureCategory,\n metadata: Omit<SerializationErrorMetadata, \"direction\" | \"category\"> & {\n cause?: unknown;\n },\n ): SerializationInError {\n return new SerializationInError({\n message: SerializationMessages.message(\"deserialize\", category),\n code: SerializationCodes.code(\"deserialize\", category),\n category,\n direction: \"deserialize\",\n metadata,\n cause: metadata.cause,\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Serialization\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass SerializationOutError extends SerializationError {\n private constructor(input: SerializationErrorOptions) {\n super(input);\n }\n\n static failure(\n category: SerializationFailureCategory,\n metadata: Omit<SerializationErrorMetadata, \"direction\" | \"category\"> & {\n cause?: unknown;\n },\n ): SerializationOutError {\n return new SerializationOutError({\n message: SerializationMessages.message(\"serialize\", category),\n code: SerializationCodes.code(\"serialize\", category),\n category,\n direction: \"serialize\",\n metadata,\n cause: metadata.cause,\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Codes + Messages helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass SerializationCodes {\n static code(\n direction: SerializationDirection,\n category: SerializationFailureCategory,\n ): string {\n return serializationErrorCode(direction, category);\n }\n}\n\nclass SerializationMessages {\n static message(\n direction: SerializationDirection,\n category: SerializationFailureCategory,\n ): string {\n if (direction === \"deserialize\") {\n if (category === \"invalid_json\") {\n return \"Invalid payload: malformed JSON\";\n }\n if (category === \"schema_version_missing\") {\n return \"Invalid payload: schemaVersion is missing\";\n }\n if (category === \"schema_version_unsupported\") {\n return \"Invalid payload: schemaVersion is not supported\";\n }\n if (category === \"invalid_shape\") {\n return \"Invalid payload: incompatible shape\";\n }\n if (category === \"mapping_not_implemented\") {\n return \"Unsupported payload: mapping not implemented\";\n }\n if (category === \"contract_mismatch\") {\n return \"Payload does not match the expected contract\";\n }\n return \"Failed to parse incoming payload\";\n }\n\n if (category === \"stringify_failed\") {\n return \"Failed to serialize the response\";\n }\n if (category === \"contract_mismatch\") {\n return \"Response does not match the expected contract\";\n }\n return \"Failed to build the response\";\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction safePreview(value: unknown, limit = 240): string | undefined {\n try {\n const serialized =\n typeof value === \"string\" ? value : JSON.stringify(value);\n return serialized.length > limit\n ? `${serialized.slice(0, limit)}…`\n : serialized;\n } catch {\n return undefined;\n }\n}\n\nexport {\n safePreview,\n SerializationCodes,\n SerializationError,\n SerializationInError as DeserializationError,\n SerializationInError,\n SerializationMessages,\n SerializationOutError,\n};\nexport type {\n SerializationBoundary,\n SerializationDirection,\n SerializationErrorMetadata,\n SerializationFailureCategory,\n};\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\ntype TemporalKind = \"expired\" | \"not_yet_valid\";\n\ntype TemporalPrecision = \"EXACT\" | \"ESTIMATED\" | \"UNKNOWN\" | \"APPROXIMATE\";\n\ntype TemporalErrorMetadata = {\n resourceType: string;\n resourceId?: string;\n operation?: string;\n validFromIso?: string | null;\n validUntilIso?: string | null;\n evaluatedAtIso: string;\n policyId?: string;\n precision?: TemporalPrecision;\n hint?: string;\n details?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n};\n\ntype TemporalErrorOptions = {\n message: string;\n code: string;\n kind: TemporalKind;\n metadata: TemporalErrorMetadata;\n} & AppErrorOptions;\n\nabstract class TemporalError extends AppError {\n public readonly kind: TemporalKind;\n public readonly resourceType: string;\n public readonly evaluatedAtIso: string;\n\n protected constructor(input: TemporalErrorOptions) {\n super(input.message, input.code, {\n ...input,\n metadata: {\n kind: input.kind,\n ...input.metadata,\n },\n });\n\n this.kind = input.kind;\n this.resourceType = input.metadata.resourceType;\n this.evaluatedAtIso = input.metadata.evaluatedAtIso;\n Object.freeze(this);\n }\n}\n\ntype TemporalCreationInput = TemporalErrorMetadata &\n Partial<Omit<AppErrorOptions, \"metadata\">> & {\n cause?: unknown;\n };\n\nclass ExpiredError extends TemporalError {\n private constructor(input: TemporalErrorOptions) {\n super(input);\n }\n\n static detected(input: TemporalCreationInput): ExpiredError {\n return new ExpiredError({\n message: \"The validity of the resource/action has expired\",\n code: ErrorCodes.temporal.expired,\n kind: \"expired\",\n metadata: {\n ...input,\n hint:\n input.hint ??\n \"The window has expired. Request a new link or try again within the valid period.\",\n },\n cause: input.cause,\n type: input.type,\n severity: input.severity,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n createdAtIso: input.createdAtIso,\n publicMessage: input.publicMessage,\n });\n }\n}\n\nclass NotYetValidError extends TemporalError {\n private constructor(input: TemporalErrorOptions) {\n super(input);\n }\n\n static detected(input: TemporalCreationInput): NotYetValidError {\n return new NotYetValidError({\n message: \"The resource/action is not yet valid\",\n code: ErrorCodes.temporal.notYetValid,\n kind: \"not_yet_valid\",\n metadata: {\n ...input,\n hint: input.hint ?? \"Not yet within the valid period. Try again later.\",\n },\n cause: input.cause,\n type: input.type,\n severity: input.severity,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n createdAtIso: input.createdAtIso,\n publicMessage: input.publicMessage,\n });\n }\n}\n\nfunction evaluateTemporalWindow(input: {\n validFromIso?: string | null;\n validUntilIso?: string | null;\n evaluatedAtIso: string;\n}): { expired: boolean; notYetValid: boolean } | null {\n const evaluatedMs = Date.parse(input.evaluatedAtIso);\n if (Number.isNaN(evaluatedMs)) return null;\n\n let notYetValid = false;\n\n if (input.validFromIso) {\n const fromMs = Date.parse(input.validFromIso);\n if (!Number.isNaN(fromMs) && evaluatedMs < fromMs) {\n notYetValid = true;\n }\n }\n\n if (input.validUntilIso) {\n const untilMs = Date.parse(input.validUntilIso);\n if (!Number.isNaN(untilMs) && evaluatedMs > untilMs) {\n return { expired: true, notYetValid: false };\n }\n }\n\n return { expired: false, notYetValid };\n}\n\nexport {\n evaluateTemporalWindow,\n ExpiredError,\n NotYetValidError,\n TemporalError,\n};\nexport type { TemporalErrorMetadata, TemporalKind, TemporalPrecision };\n","import { ValidationCode } from \"../exceptions/validation-code\";\nimport { ValidationField } from \"../exceptions/validation-field\";\n\nimport { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ValidationError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass ValidationError extends AppError {\n constructor(\n field: ValidationField,\n code: ValidationCode,\n message: string,\n options?: AppErrorOptions,\n ) {\n const baseMetadata = {\n field: field.value,\n validationCode: code.value,\n };\n const mergedMetadata = options?.metadata\n ? { ...baseMetadata, ...options.metadata }\n : baseMetadata;\n\n super(message, ErrorCodes.validation, {\n ...options,\n metadata: mergedMetadata,\n });\n }\n}\n\nexport { ValidationError };\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation-error.js","names":["compactMetadata","extractAppErrorOptions"],"sources":["../src/core/errors/authentication-error.ts","../src/core/errors/authorization-error.ts","../src/core/errors/business-rule-violation-error.ts","../src/core/errors/conflict-error.ts","../src/core/errors/idempotency-error.ts","../src/core/errors/integration-error.ts","../src/core/errors/legacy-incompatible-error.ts","../src/core/errors/not-found-error.ts","../src/core/errors/serialization-error.ts","../src/core/errors/temporal-error.ts","../src/core/errors/validation-error.ts"],"sourcesContent":["import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions, ErrorSeverity } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype AuthenticationErrorReason =\n | \"missing_token\"\n | \"malformed_token\"\n | \"invalid_token\"\n | \"expired_token\"\n | \"revoked_token\"\n | \"invalid_credentials\"\n | \"session_not_found\"\n | \"session_expired\"\n | \"unknown\";\n\ntype AuthenticationErrorMetadata = {\n reason: AuthenticationErrorReason;\n authScheme?: \"bearer\" | \"cookie\" | \"basic\" | \"unknown\";\n tokenLocation?: \"header\" | \"cookie\" | \"query\" | \"unknown\";\n expiresAtIso?: string;\n correlationId?: string;\n requestId?: string;\n details?: string;\n};\n\ntype AuthenticationErrorFactoryOptions = Omit<\n AuthenticationErrorMetadata,\n \"reason\"\n> &\n Omit<AppErrorOptions, \"metadata\">;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// AuthenticationError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass AuthenticationError extends AppError {\n public readonly reason: AuthenticationErrorReason;\n\n private constructor(params: {\n message: string;\n code: string;\n reason: AuthenticationErrorReason;\n metadata?: Omit<AuthenticationErrorMetadata, \"reason\">;\n cause?: unknown;\n type?: string;\n severity?: ErrorSeverity;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n createdAtIso?: string;\n publicMessage?: string;\n }) {\n super(params.message, params.code, {\n cause: params.cause,\n metadata: {\n reason: params.reason,\n ...(params.metadata ?? {}),\n },\n type: params.type,\n severity: params.severity,\n correlationId: params.correlationId,\n requestId: params.requestId,\n commandId: params.commandId,\n createdAtIso: params.createdAtIso,\n publicMessage: params.publicMessage,\n });\n\n this.reason = params.reason;\n Object.freeze(this);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Factory methods\n // ─────────────────────────────────────────────────────────────────────────\n\n static missingToken(\n options?: AuthenticationErrorFactoryOptions,\n ): AuthenticationError {\n return new AuthenticationError({\n message: \"Missing credentials\",\n code: ErrorCodes.authentication.missingToken,\n reason: \"missing_token\",\n metadata: compactMetadata(options),\n ...extractAppErrorOptions(options),\n });\n }\n\n static invalidToken(\n options?: AuthenticationErrorFactoryOptions & { cause?: unknown },\n ): AuthenticationError {\n return new AuthenticationError({\n message: \"Invalid credentials\",\n code: ErrorCodes.authentication.invalidToken,\n reason: \"invalid_token\",\n metadata: compactMetadata({\n authScheme: options?.authScheme,\n tokenLocation: options?.tokenLocation,\n details: options?.details,\n correlationId: options?.correlationId,\n requestId: options?.requestId,\n }),\n ...extractAppErrorOptions(options),\n });\n }\n\n static expiredToken(\n options?: AuthenticationErrorFactoryOptions & { sessionId?: string },\n ): AuthenticationError {\n return new AuthenticationError({\n message: \"Expired credentials\",\n code: ErrorCodes.authentication.expiredToken,\n reason: \"expired_token\",\n metadata: compactMetadata(options),\n ...extractAppErrorOptions(options),\n });\n }\n\n static invalidCredentials(\n options?: Pick<\n AuthenticationErrorFactoryOptions,\n | \"correlationId\"\n | \"requestId\"\n | \"type\"\n | \"severity\"\n | \"createdAtIso\"\n | \"publicMessage\"\n >,\n ): AuthenticationError {\n return new AuthenticationError({\n message: \"Invalid username or password\",\n code: ErrorCodes.authentication.invalidCredentials,\n reason: \"invalid_credentials\",\n metadata: compactMetadata(options),\n ...extractAppErrorOptions(options),\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction extractAppErrorOptions(options?: Partial<AppErrorOptions>) {\n return {\n cause: options?.cause,\n type: options?.type,\n severity: options?.severity,\n correlationId: options?.correlationId,\n requestId: options?.requestId,\n commandId: options?.commandId,\n createdAtIso: options?.createdAtIso,\n publicMessage: options?.publicMessage,\n };\n}\n\nfunction compactMetadata<T extends Record<string, unknown>>(\n input?: T,\n): T | undefined {\n if (!input) return undefined;\n\n return Object.fromEntries(\n Object.entries(input).filter(([, value]) => value !== undefined),\n ) as T;\n}\n\nexport { AuthenticationError };\nexport type { AuthenticationErrorMetadata, AuthenticationErrorReason };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions, ErrorSeverity } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype AuthorizationErrorReason =\n | \"forbidden\"\n | \"missing_role\"\n | \"missing_capability\"\n | \"out_of_scope\"\n | \"outside_time_window\"\n | \"policy_denied\"\n | \"unknown\";\n\ntype AuthorizationRequirement = {\n role?: string;\n capability?: string;\n scope?: string; // e.g.: \"school:{id}\" or \"class:{id}\"\n};\n\ntype AuthorizationErrorMetadata = {\n reason: AuthorizationErrorReason;\n\n /** Stable action you evaluated (not an HTTP route — a \"business action\") */\n action: string;\n\n /** Resource identification (without leaking the full payload) */\n resource?: { type: string; id?: string };\n\n /** Optional: actor (do not include sensitive data) */\n actor?: { userId: string; role?: string };\n\n /** Optional: expected requirement */\n required?: AuthorizationRequirement;\n\n /** Optional: policy (when you already have PolicyEvaluation or similar) */\n policyId?: string;\n policyVersion?: number;\n evaluatedAtIso?: string;\n decision?: \"allow\" | \"deny\";\n reasonCode?: string;\n\n /** Optional: additional non-sensitive info */\n details?: string;\n};\n\n/**\n * Options for AuthorizationError factory methods.\n * Combines metadata fields (except 'reason') with common AppError options.\n */\ntype AuthorizationErrorFactoryOptions = Omit<\n AuthorizationErrorMetadata,\n \"reason\"\n> &\n Omit<AppErrorOptions, \"metadata\">;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// AuthorizationError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass AuthorizationError extends AppError {\n public readonly reason: AuthorizationErrorReason;\n\n private constructor(params: {\n message: string;\n code: string;\n reason: AuthorizationErrorReason;\n metadata: AuthorizationErrorMetadata;\n cause?: unknown;\n type?: string;\n severity?: ErrorSeverity;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n createdAtIso?: string;\n publicMessage?: string;\n }) {\n super(params.message, params.code, {\n cause: params.cause,\n metadata: params.metadata,\n type: params.type,\n severity: params.severity,\n correlationId: params.correlationId,\n requestId: params.requestId,\n commandId: params.commandId,\n createdAtIso: params.createdAtIso,\n publicMessage: params.publicMessage,\n });\n\n this.reason = params.reason;\n Object.freeze(this);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Factories\n // ─────────────────────────────────────────────────────────────────────────\n\n static forbidden(\n input: AuthorizationErrorFactoryOptions,\n ): AuthorizationError {\n return new AuthorizationError({\n message: \"Action not allowed\",\n code: ErrorCodes.authorization.forbidden,\n reason: \"forbidden\",\n metadata: { reason: \"forbidden\", ...extractMetadataOnly(input) },\n ...extractAppErrorOptions(input),\n });\n }\n\n static policyDenied(\n input: AuthorizationErrorFactoryOptions & {\n policyId: string;\n policyVersion: number;\n evaluatedAtIso: string;\n },\n ): AuthorizationError {\n return new AuthorizationError({\n message: \"Action denied by policy\",\n code: ErrorCodes.authorization.policyDenied,\n reason: \"policy_denied\",\n metadata: {\n reason: \"policy_denied\",\n ...extractMetadataOnly(input),\n decision: \"deny\",\n },\n ...extractAppErrorOptions(input),\n });\n }\n\n static missingCapability(\n input: AuthorizationErrorFactoryOptions & {\n required: AuthorizationRequirement;\n },\n ): AuthorizationError {\n return new AuthorizationError({\n message: \"Insufficient capability to perform the action\",\n code: ErrorCodes.authorization.missingCapability,\n reason: \"missing_capability\",\n metadata: {\n reason: \"missing_capability\",\n ...extractMetadataOnly(input),\n },\n ...extractAppErrorOptions(input),\n });\n }\n\n static outOfScope(\n input: AuthorizationErrorFactoryOptions & {\n required?: AuthorizationRequirement;\n },\n ): AuthorizationError {\n return new AuthorizationError({\n message: \"Action outside the allowed scope\",\n code: ErrorCodes.authorization.outOfScope,\n reason: \"out_of_scope\",\n metadata: { reason: \"out_of_scope\", ...extractMetadataOnly(input) },\n ...extractAppErrorOptions(input),\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction extractAppErrorOptions(options?: Partial<AppErrorOptions>) {\n return {\n cause: options?.cause,\n type: options?.type,\n severity: options?.severity,\n correlationId: options?.correlationId,\n requestId: options?.requestId,\n commandId: options?.commandId,\n createdAtIso: options?.createdAtIso,\n publicMessage: options?.publicMessage,\n };\n}\n\nfunction extractMetadataOnly(\n input: AuthorizationErrorFactoryOptions,\n): Omit<AuthorizationErrorMetadata, \"reason\"> {\n const {\n cause,\n type,\n severity,\n correlationId,\n requestId,\n commandId,\n createdAtIso,\n publicMessage,\n ...metadata\n } = input;\n return metadata;\n}\n\nexport { AuthorizationError };\nexport type {\n AuthorizationErrorMetadata,\n AuthorizationErrorReason,\n AuthorizationRequirement,\n};\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BusinessRuleViolationError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass BusinessRuleViolationError extends AppError {\n constructor(\n rule: string,\n message: string,\n detail?: Record<string, unknown>,\n options?: AppErrorOptions,\n ) {\n const baseMetadata = detail ? { rule, detail } : { rule };\n const mergedMetadata = options?.metadata\n ? { ...baseMetadata, ...options.metadata }\n : baseMetadata;\n\n super(message, ErrorCodes.businessRuleViolation, {\n ...options,\n metadata: mergedMetadata,\n });\n }\n}\n\nexport { BusinessRuleViolationError };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n/**\n * Conflict kinds we want to distinguish semantically.\n */\ntype ConflictKind = \"already_exists\" | \"duplicate\" | \"unique_violation\";\n\n/**\n * Metadata attached to conflicts without exposing sensitive values.\n */\ntype ConflictErrorMetadata = {\n kind: ConflictKind;\n entity: string;\n operation?: string;\n field?: string;\n constraintName?: string;\n existingId?: string;\n valueHash?: string;\n valuePreview?: string;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n hint?: string;\n};\n\ntype UniqueConstraintViolation = {\n kind: \"unique_violation\";\n constraintName?: string;\n table?: string;\n columns?: string[];\n};\n\nabstract class ConflictError extends AppError {\n public readonly kind: ConflictKind;\n\n protected constructor(\n params: {\n message: string;\n code: string;\n kind: ConflictKind;\n metadata: Omit<ConflictErrorMetadata, \"kind\">;\n cause?: unknown;\n } & AppErrorOptions,\n ) {\n super(params.message, params.code, {\n ...params,\n metadata: {\n kind: params.kind,\n ...params.metadata,\n },\n });\n\n this.kind = params.kind;\n Object.freeze(this);\n }\n}\n\nclass AlreadyExistsError extends ConflictError {\n private constructor(\n input: {\n metadata: Omit<ConflictErrorMetadata, \"kind\">;\n cause?: unknown;\n } & AppErrorOptions,\n ) {\n super({\n message:\n \"A matching record already exists for the requested operation\",\n code: ErrorCodes.conflict.alreadyExists,\n kind: \"already_exists\",\n ...input,\n });\n }\n\n static detected(input: {\n entity: string;\n operation?: string;\n field?: string;\n existingId?: string;\n valueHash?: string;\n valuePreview?: string;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n hint?: string;\n cause?: unknown;\n }): AlreadyExistsError {\n return new AlreadyExistsError({\n metadata: {\n entity: input.entity,\n operation: input.operation ?? \"create\",\n field: input.field,\n existingId: input.existingId,\n valueHash: input.valueHash,\n valuePreview: input.valuePreview,\n detectedAtIso: input.detectedAtIso,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n hint: input.hint ?? \"Verify existing records before retrying.\",\n },\n cause: input.cause,\n });\n }\n}\n\nclass DuplicateError extends ConflictError {\n private constructor(\n input: {\n metadata: Omit<ConflictErrorMetadata, \"kind\">;\n cause?: unknown;\n } & AppErrorOptions,\n ) {\n super({\n message: \"Conflict: an existing record violates uniqueness\",\n code: ErrorCodes.conflict.duplicate,\n kind: \"duplicate\",\n ...input,\n });\n }\n\n static detected(input: {\n entity: string;\n operation?: string;\n field?: string;\n constraintName?: string;\n existingId?: string;\n valueHash?: string;\n valuePreview?: string;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n hint?: string;\n cause?: unknown;\n }): DuplicateError {\n return new DuplicateError({\n metadata: {\n entity: input.entity,\n operation: input.operation,\n field: input.field,\n constraintName: input.constraintName,\n existingId: input.existingId,\n valueHash: input.valueHash,\n valuePreview: input.valuePreview,\n detectedAtIso: input.detectedAtIso,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n hint:\n input.hint ??\n \"Adjust the data so it does not duplicate existing records.\",\n },\n cause: input.cause,\n });\n }\n}\n\nclass UniqueConstraintViolationError extends ConflictError {\n private constructor(\n input: {\n metadata: Omit<ConflictErrorMetadata, \"kind\"> & {\n violation: UniqueConstraintViolation;\n };\n cause?: unknown;\n } & AppErrorOptions,\n ) {\n super({\n message: \"Uniqueness violation in storage\",\n code: ErrorCodes.conflict.uniqueViolation,\n kind: \"unique_violation\",\n ...input,\n });\n }\n\n static detected(input: {\n entity: string;\n operation?: string;\n constraintName?: string;\n table?: string;\n columns?: string[];\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n cause?: unknown;\n }): UniqueConstraintViolationError {\n return new UniqueConstraintViolationError({\n metadata: {\n entity: input.entity,\n operation: input.operation,\n constraintName: input.constraintName,\n detectedAtIso: input.detectedAtIso,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n violation: {\n kind: \"unique_violation\",\n constraintName: input.constraintName,\n table: input.table,\n columns: input.columns,\n },\n hint: \"Uniqueness conflict detected in the database.\",\n },\n cause: input.cause,\n });\n }\n}\n\nfunction translateUniqueViolationToDuplicate(input: {\n entity: string;\n operation?: string;\n violation: UniqueConstraintViolation;\n field?: string;\n ctx?: {\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n nowIso?: string;\n };\n cause?: unknown;\n}): DuplicateError {\n return DuplicateError.detected({\n entity: input.entity,\n operation: input.operation,\n field: input.field,\n constraintName: input.violation.constraintName,\n detectedAtIso: input.ctx?.nowIso,\n correlationId: input.ctx?.correlationId,\n requestId: input.ctx?.requestId,\n commandId: input.ctx?.commandId,\n cause: input.cause,\n });\n}\n\nexport {\n AlreadyExistsError,\n ConflictError,\n DuplicateError,\n translateUniqueViolationToDuplicate,\n UniqueConstraintViolationError,\n};\n\nexport type { ConflictErrorMetadata, ConflictKind, UniqueConstraintViolation };\n","import { payloadHash, sha256Hex, stableStringify } from \"../shared/hashing\";\n\nimport { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\n\nexport type IdempotencyFailureKind =\n | \"key_missing\"\n | \"in_progress\"\n | \"payload_mismatch\"\n | \"replay_not_supported\"\n | \"unknown\";\n\nexport type IdempotencyErrorMetadata = {\n kind: IdempotencyFailureKind;\n operation: string;\n scope?: string;\n entity?: string;\n keyHash?: string;\n keyPreview?: string;\n incomingPayloadHash?: string;\n existingPayloadHash?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n};\n\ntype IdempotencyErrorConstructorInput = {\n message: string;\n code: string;\n kind: IdempotencyFailureKind;\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n};\n\nabstract class IdempotencyError extends AppError {\n public readonly kind: IdempotencyFailureKind;\n\n protected constructor(input: IdempotencyErrorConstructorInput) {\n super(input.message, input.code, {\n cause: input.cause,\n metadata: { kind: input.kind, ...input.metadata },\n });\n\n this.kind = input.kind;\n Object.freeze(this);\n }\n\n static keyMissing(input: {\n operation: string;\n scope?: string;\n entity?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyKeyMissingError {\n return IdempotencyKeyMissingError.detected(input);\n }\n\n static inProgress(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyInProgressError {\n return IdempotencyInProgressError.detected(input);\n }\n\n static payloadMismatch(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n incomingPayloadHash?: string;\n existingPayloadHash?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyPayloadMismatchError {\n return IdempotencyPayloadMismatchError.detected(input);\n }\n\n static replayNotSupported(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyReplayNotSupportedError {\n return IdempotencyReplayNotSupportedError.detected(input);\n }\n}\n\nclass IdempotencyKeyMissingError extends IdempotencyError {\n private constructor(input: {\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n }) {\n super({\n message:\n \"Idempotency key/commandId missing for the requested operation\",\n code: ErrorCodes.idempotency.keyMissing,\n kind: \"key_missing\",\n metadata: input.metadata,\n cause: input.cause,\n });\n }\n\n static detected(input: {\n operation: string;\n scope?: string;\n entity?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyKeyMissingError {\n return new IdempotencyKeyMissingError({\n cause: input.cause,\n metadata: {\n operation: input.operation,\n scope: input.scope,\n entity: input.entity,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n detectedAtIso: input.detectedAtIso,\n hint:\n input.hint ??\n \"Send a commandId/idempotency key to prevent duplicate processing.\",\n details: input.details,\n },\n });\n }\n}\n\nclass IdempotencyInProgressError extends IdempotencyError {\n private constructor(input: {\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n }) {\n super({\n message: \"The same business intent is already being processed\",\n code: ErrorCodes.idempotency.inProgress,\n kind: \"in_progress\",\n metadata: input.metadata,\n cause: input.cause,\n });\n }\n\n static detected(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyInProgressError {\n const resolved = resolveKeyIdentity(\n input.key,\n input.keyHash,\n input.keyPreview,\n );\n\n return new IdempotencyInProgressError({\n cause: input.cause,\n metadata: {\n operation: input.operation,\n scope: input.scope,\n entity: input.entity,\n keyHash: resolved.keyHash,\n keyPreview: resolved.keyPreview,\n idempotencyRecordId: input.idempotencyRecordId,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n detectedAtIso: input.detectedAtIso,\n hint:\n input.hint ??\n \"Wait for completion and retry using the same key.\",\n details: input.details,\n },\n });\n }\n}\n\nclass IdempotencyPayloadMismatchError extends IdempotencyError {\n private constructor(input: {\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n }) {\n super({\n message: \"The idempotency key was reused with a different payload\",\n code: ErrorCodes.idempotency.payloadMismatch,\n kind: \"payload_mismatch\",\n metadata: input.metadata,\n cause: input.cause,\n });\n }\n\n static detected(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n incomingPayloadHash?: string;\n existingPayloadHash?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyPayloadMismatchError {\n const resolved = resolveKeyIdentity(\n input.key,\n input.keyHash,\n input.keyPreview,\n );\n\n return new IdempotencyPayloadMismatchError({\n cause: input.cause,\n metadata: {\n operation: input.operation,\n scope: input.scope,\n entity: input.entity,\n keyHash: resolved.keyHash,\n keyPreview: resolved.keyPreview,\n incomingPayloadHash: input.incomingPayloadHash,\n existingPayloadHash: input.existingPayloadHash,\n idempotencyRecordId: input.idempotencyRecordId,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n detectedAtIso: input.detectedAtIso,\n hint:\n input.hint ??\n \"Use a new idempotency key for a new intent. The same key should only be reused for retries of the same payload.\",\n details: input.details,\n },\n });\n }\n}\n\nclass IdempotencyReplayNotSupportedError extends IdempotencyError {\n private constructor(input: {\n metadata: Omit<IdempotencyErrorMetadata, \"kind\">;\n cause?: unknown;\n }) {\n super({\n message:\n \"Re-execution detected, but replay of the previous result is not implemented\",\n code: ErrorCodes.idempotency.replayNotSupported,\n kind: \"replay_not_supported\",\n metadata: input.metadata,\n cause: input.cause,\n });\n }\n\n static detected(input: {\n operation: string;\n scope?: string;\n entity?: string;\n key?: string;\n keyHash?: string;\n keyPreview?: string;\n idempotencyRecordId?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n detectedAtIso?: string;\n hint?: string;\n details?: string;\n cause?: unknown;\n }): IdempotencyReplayNotSupportedError {\n const resolved = resolveKeyIdentity(\n input.key,\n input.keyHash,\n input.keyPreview,\n );\n\n return new IdempotencyReplayNotSupportedError({\n cause: input.cause,\n metadata: {\n operation: input.operation,\n scope: input.scope,\n entity: input.entity,\n keyHash: resolved.keyHash,\n keyPreview: resolved.keyPreview,\n idempotencyRecordId: input.idempotencyRecordId,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n detectedAtIso: input.detectedAtIso,\n hint:\n input.hint ??\n \"Try again later, or enable result replay for full idempotency.\",\n details: input.details,\n },\n });\n }\n}\n\nfunction resolveKeyIdentity(\n key?: string,\n keyHash?: string,\n keyPreview?: string,\n): { keyHash?: string; keyPreview?: string } {\n const preview =\n keyPreview ??\n (key ? (key.length <= 8 ? key : key.slice(0, 8)) : undefined);\n\n return {\n keyHash: keyHash,\n keyPreview: preview,\n };\n}\n\nexport {\n IdempotencyError,\n IdempotencyKeyMissingError,\n IdempotencyInProgressError,\n IdempotencyPayloadMismatchError,\n IdempotencyReplayNotSupportedError,\n sha256Hex,\n stableStringify,\n payloadHash,\n};\n","import type { AppErrorOptions, ErrorSeverity } from \"./types\";\nimport { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\n\ntype IntegrationErrorReason =\n | \"timeout\"\n | \"unreachable\"\n | \"bad_response\"\n | \"unknown\";\n\ntype IntegrationErrorMetadata = {\n reason: IntegrationErrorReason;\n provider: string;\n operation: string;\n startedAtIso: string;\n durationMs: number;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n details?: string;\n statusCode?: number;\n responseCode?: string;\n};\n\ntype IntegrationErrorAppOptions = Pick<\n AppErrorOptions,\n | \"cause\"\n | \"type\"\n | \"severity\"\n | \"correlationId\"\n | \"requestId\"\n | \"commandId\"\n | \"createdAtIso\"\n | \"publicMessage\"\n>;\n\ntype IntegrationErrorConstructorParams = {\n message: string;\n code: string;\n reason: IntegrationErrorReason;\n metadata: IntegrationErrorMetadata;\n} & IntegrationErrorAppOptions;\n\nclass IntegrationError extends AppError {\n public readonly reason: IntegrationErrorReason;\n\n private constructor(params: IntegrationErrorConstructorParams) {\n const { message, code, metadata, ...rest } = params;\n super(message, code, {\n ...rest,\n metadata,\n });\n\n this.reason = params.reason;\n Object.freeze(this);\n }\n\n static timeout(options: IntegrationErrorTimeoutOptions): IntegrationError {\n return new IntegrationError({\n message: \"Timeout while integrating with external provider\",\n code: ErrorCodes.integration.timeout,\n reason: \"timeout\",\n metadata: buildMetadata({ reason: \"timeout\", ...options }),\n ...pickAppErrorFields(options),\n });\n }\n\n static unreachable(\n options: IntegrationErrorEndpointOptions,\n ): IntegrationError {\n return new IntegrationError({\n message: \"Provider unavailable\",\n code: ErrorCodes.integration.unreachable,\n reason: \"unreachable\",\n metadata: buildMetadata({ reason: \"unreachable\", ...options }),\n ...pickAppErrorFields(options),\n });\n }\n\n static badResponse(\n options: IntegrationErrorEndpointOptions,\n ): IntegrationError {\n return new IntegrationError({\n message: \"Unexpected response from provider\",\n code: ErrorCodes.integration.badResponse,\n reason: \"bad_response\",\n metadata: buildMetadata({ reason: \"bad_response\", ...options }),\n ...pickAppErrorFields(options),\n });\n }\n}\n\ntype IntegrationErrorBaseOptions = {\n provider: string;\n operation: string;\n startedAtIso: string;\n durationMs: number;\n detectedAtIso?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n details?: string;\n statusCode?: number;\n responseCode?: string;\n cause?: unknown;\n type?: string;\n severity?: ErrorSeverity;\n createdAtIso?: string;\n publicMessage?: string;\n};\n\ntype IntegrationErrorTimeoutOptions = IntegrationErrorBaseOptions;\ntype IntegrationErrorEndpointOptions = IntegrationErrorBaseOptions;\n\nfunction buildMetadata(\n input: IntegrationErrorBaseOptions & { reason: IntegrationErrorReason },\n): IntegrationErrorMetadata {\n return compactMetadata({\n reason: input.reason,\n provider: input.provider,\n operation: input.operation,\n startedAtIso: input.startedAtIso,\n durationMs: input.durationMs,\n detectedAtIso: input.detectedAtIso,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n details: input.details,\n statusCode: input.statusCode,\n responseCode: input.responseCode,\n }) as IntegrationErrorMetadata;\n}\n\nfunction pickAppErrorFields(\n options: IntegrationErrorBaseOptions,\n): IntegrationErrorAppOptions {\n return {\n cause: options.cause,\n type: options.type,\n severity: options.severity,\n correlationId: options.correlationId,\n requestId: options.requestId,\n commandId: options.commandId,\n createdAtIso: options.createdAtIso,\n publicMessage: options.publicMessage,\n };\n}\n\nfunction compactMetadata<T extends Record<string, unknown>>(input: T): T {\n return Object.fromEntries(\n Object.entries(input).filter(([, value]) => value !== undefined),\n ) as T;\n}\n\nexport { IntegrationError };\nexport type { IntegrationErrorReason, IntegrationErrorMetadata };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// LegacyIncompatibleError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass LegacyIncompatibleError extends AppError {\n constructor(\n message: string,\n context?: Record<string, unknown>,\n options?: AppErrorOptions,\n ) {\n const mergedMetadata = options?.metadata\n ? { ...(context ?? {}), ...options.metadata }\n : context;\n\n super(message, ErrorCodes.legacyIncompatible, {\n ...options,\n metadata: mergedMetadata,\n });\n }\n}\n\nexport { LegacyIncompatibleError };\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NotFoundError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass NotFoundError extends AppError {\n constructor(\n resource: string,\n criteria?: Record<string, unknown>,\n options?: AppErrorOptions,\n ) {\n const baseMetadata = criteria ? { resource, criteria } : { resource };\n const mergedMetadata = options?.metadata\n ? { ...baseMetadata, ...options.metadata }\n : baseMetadata;\n\n super(`${resource} not found`, ErrorCodes.notFound, {\n ...options,\n metadata: mergedMetadata,\n });\n }\n}\n\nexport { NotFoundError };\n","import { AppError } from \"./app-error\";\nimport { serializationErrorCode } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype SerializationDirection = \"serialize\" | \"deserialize\";\n\ntype SerializationFailureCategory =\n | \"invalid_json\"\n | \"invalid_shape\"\n | \"missing_field\"\n | \"unexpected_field\"\n | \"invalid_type\"\n | \"schema_version_missing\"\n | \"schema_version_unsupported\"\n | \"mapping_not_implemented\"\n | \"contract_mismatch\"\n | \"parse_failed\"\n | \"stringify_failed\"\n | \"unknown\";\n\ntype SerializationBoundary =\n | \"http_in\"\n | \"http_out\"\n | \"graphql_in\"\n | \"graphql_out\"\n | \"dto_to_domain\"\n | \"domain_to_dto\"\n | \"persistence_to_domain\"\n | \"domain_to_persistence\"\n | \"event_in\"\n | \"event_out\"\n | \"projection\"\n | \"unknown\";\n\n/**\n * Metadata shared by serialization/deserialization failures. Payload previews must be sanitized.\n */\ntype SerializationErrorMetadata = {\n direction: SerializationDirection;\n category: SerializationFailureCategory;\n boundary: SerializationBoundary;\n contract: string;\n schemaVersion?: number | string;\n path?: string;\n payloadPreview?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n hint?: string;\n details?: string;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Base error\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype SerializationErrorOptions = Omit<AppErrorOptions, \"metadata\"> & {\n message: string;\n code: string;\n metadata: Omit<SerializationErrorMetadata, \"direction\" | \"category\">;\n direction: SerializationDirection;\n category: SerializationFailureCategory;\n};\n\nabstract class SerializationError extends AppError {\n public readonly direction: SerializationDirection;\n public readonly category: SerializationFailureCategory;\n public readonly boundary: SerializationBoundary;\n public readonly contract: string;\n\n protected constructor(input: SerializationErrorOptions) {\n super(input.message ?? \"Serialization failure\", input.code, {\n cause: input.cause,\n metadata: {\n direction: input.direction,\n category: input.category,\n ...input.metadata,\n },\n type: input.type,\n severity: input.severity,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n createdAtIso: input.createdAtIso,\n publicMessage: input.publicMessage,\n });\n\n this.direction = input.direction;\n this.category = input.category;\n this.boundary = input.metadata.boundary;\n this.contract = input.metadata.contract;\n\n Object.freeze(this);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Serialization In\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass SerializationInError extends SerializationError {\n private constructor(input: SerializationErrorOptions) {\n super(input);\n }\n\n static failure(\n category: SerializationFailureCategory,\n metadata: Omit<SerializationErrorMetadata, \"direction\" | \"category\"> & {\n cause?: unknown;\n },\n ): SerializationInError {\n return new SerializationInError({\n message: SerializationMessages.message(\"deserialize\", category),\n code: SerializationCodes.code(\"deserialize\", category),\n category,\n direction: \"deserialize\",\n metadata,\n cause: metadata.cause,\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Serialization\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass SerializationOutError extends SerializationError {\n private constructor(input: SerializationErrorOptions) {\n super(input);\n }\n\n static failure(\n category: SerializationFailureCategory,\n metadata: Omit<SerializationErrorMetadata, \"direction\" | \"category\"> & {\n cause?: unknown;\n },\n ): SerializationOutError {\n return new SerializationOutError({\n message: SerializationMessages.message(\"serialize\", category),\n code: SerializationCodes.code(\"serialize\", category),\n category,\n direction: \"serialize\",\n metadata,\n cause: metadata.cause,\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Codes + Messages helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass SerializationCodes {\n static code(\n direction: SerializationDirection,\n category: SerializationFailureCategory,\n ): string {\n return serializationErrorCode(direction, category);\n }\n}\n\nclass SerializationMessages {\n static message(\n direction: SerializationDirection,\n category: SerializationFailureCategory,\n ): string {\n if (direction === \"deserialize\") {\n if (category === \"invalid_json\") {\n return \"Invalid payload: malformed JSON\";\n }\n if (category === \"schema_version_missing\") {\n return \"Invalid payload: schemaVersion is missing\";\n }\n if (category === \"schema_version_unsupported\") {\n return \"Invalid payload: schemaVersion is not supported\";\n }\n if (category === \"invalid_shape\") {\n return \"Invalid payload: incompatible shape\";\n }\n if (category === \"mapping_not_implemented\") {\n return \"Unsupported payload: mapping not implemented\";\n }\n if (category === \"contract_mismatch\") {\n return \"Payload does not match the expected contract\";\n }\n return \"Failed to parse incoming payload\";\n }\n\n if (category === \"stringify_failed\") {\n return \"Failed to serialize the response\";\n }\n if (category === \"contract_mismatch\") {\n return \"Response does not match the expected contract\";\n }\n return \"Failed to build the response\";\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction safePreview(value: unknown, limit = 240): string | undefined {\n try {\n const serialized =\n typeof value === \"string\" ? value : JSON.stringify(value);\n return serialized.length > limit\n ? `${serialized.slice(0, limit)}…`\n : serialized;\n } catch {\n return undefined;\n }\n}\n\nexport {\n safePreview,\n SerializationCodes,\n SerializationError,\n SerializationInError as DeserializationError,\n SerializationInError,\n SerializationMessages,\n SerializationOutError,\n};\nexport type {\n SerializationBoundary,\n SerializationDirection,\n SerializationErrorMetadata,\n SerializationFailureCategory,\n};\n","import { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\ntype TemporalKind = \"expired\" | \"not_yet_valid\";\n\ntype TemporalPrecision = \"EXACT\" | \"ESTIMATED\" | \"UNKNOWN\" | \"APPROXIMATE\";\n\ntype TemporalErrorMetadata = {\n resourceType: string;\n resourceId?: string;\n operation?: string;\n validFromIso?: string | null;\n validUntilIso?: string | null;\n evaluatedAtIso: string;\n policyId?: string;\n precision?: TemporalPrecision;\n hint?: string;\n details?: string;\n correlationId?: string;\n requestId?: string;\n commandId?: string;\n};\n\ntype TemporalErrorOptions = {\n message: string;\n code: string;\n kind: TemporalKind;\n metadata: TemporalErrorMetadata;\n} & AppErrorOptions;\n\nabstract class TemporalError extends AppError {\n public readonly kind: TemporalKind;\n public readonly resourceType: string;\n public readonly evaluatedAtIso: string;\n\n protected constructor(input: TemporalErrorOptions) {\n super(input.message, input.code, {\n ...input,\n metadata: {\n kind: input.kind,\n ...input.metadata,\n },\n });\n\n this.kind = input.kind;\n this.resourceType = input.metadata.resourceType;\n this.evaluatedAtIso = input.metadata.evaluatedAtIso;\n Object.freeze(this);\n }\n}\n\ntype TemporalCreationInput = TemporalErrorMetadata &\n Partial<Omit<AppErrorOptions, \"metadata\">> & {\n cause?: unknown;\n };\n\nclass ExpiredError extends TemporalError {\n private constructor(input: TemporalErrorOptions) {\n super(input);\n }\n\n static detected(input: TemporalCreationInput): ExpiredError {\n return new ExpiredError({\n message: \"The validity of the resource/action has expired\",\n code: ErrorCodes.temporal.expired,\n kind: \"expired\",\n metadata: {\n ...input,\n hint:\n input.hint ??\n \"The window has expired. Request a new link or try again within the valid period.\",\n },\n cause: input.cause,\n type: input.type,\n severity: input.severity,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n createdAtIso: input.createdAtIso,\n publicMessage: input.publicMessage,\n });\n }\n}\n\nclass NotYetValidError extends TemporalError {\n private constructor(input: TemporalErrorOptions) {\n super(input);\n }\n\n static detected(input: TemporalCreationInput): NotYetValidError {\n return new NotYetValidError({\n message: \"The resource/action is not yet valid\",\n code: ErrorCodes.temporal.notYetValid,\n kind: \"not_yet_valid\",\n metadata: {\n ...input,\n hint:\n input.hint ??\n \"Not yet within the valid period. Try again later.\",\n },\n cause: input.cause,\n type: input.type,\n severity: input.severity,\n correlationId: input.correlationId,\n requestId: input.requestId,\n commandId: input.commandId,\n createdAtIso: input.createdAtIso,\n publicMessage: input.publicMessage,\n });\n }\n}\n\nfunction evaluateTemporalWindow(input: {\n validFromIso?: string | null;\n validUntilIso?: string | null;\n evaluatedAtIso: string;\n}): { expired: boolean; notYetValid: boolean } | null {\n const evaluatedMs = Date.parse(input.evaluatedAtIso);\n if (Number.isNaN(evaluatedMs)) return null;\n\n let notYetValid = false;\n\n if (input.validFromIso) {\n const fromMs = Date.parse(input.validFromIso);\n if (!Number.isNaN(fromMs) && evaluatedMs < fromMs) {\n notYetValid = true;\n }\n }\n\n if (input.validUntilIso) {\n const untilMs = Date.parse(input.validUntilIso);\n if (!Number.isNaN(untilMs) && evaluatedMs > untilMs) {\n return { expired: true, notYetValid: false };\n }\n }\n\n return { expired: false, notYetValid };\n}\n\nexport {\n evaluateTemporalWindow,\n ExpiredError,\n NotYetValidError,\n TemporalError,\n};\nexport type { TemporalErrorMetadata, TemporalKind, TemporalPrecision };\n","import { ValidationCode } from \"../exceptions/validation-code\";\nimport { ValidationField } from \"../exceptions/validation-field\";\n\nimport { AppError } from \"./app-error\";\nimport { ErrorCodes } from \"./error-codes\";\nimport type { AppErrorOptions } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ValidationError\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass ValidationError extends AppError {\n constructor(\n field: ValidationField,\n code: ValidationCode,\n message: string,\n options?: AppErrorOptions,\n ) {\n const baseMetadata = {\n field: field.value,\n validationCode: code.value,\n };\n const mergedMetadata = options?.metadata\n ? { ...baseMetadata, ...options.metadata }\n : baseMetadata;\n\n super(message, ErrorCodes.validation, {\n ...options,\n metadata: mergedMetadata,\n });\n }\n}\n\nexport { ValidationError };\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation-field.js","names":[],"sources":["../src/core/exceptions/validation-field.ts"],"sourcesContent":["// Object-oriented representation of validation fields.\n// Indicates WHERE a validation error occurred.\n// This is a minimal base class — field catalogs are defined per domain/module.\n\nclass ValidationField {\n public readonly value: string;\n\n private constructor(value: string) {\n this.value = value;\n }\n\n // Factory for custom or domain-specific fields\n public static of(value: string): ValidationField {\n return new ValidationField(value);\n }\n\n // Creates a nested field path: parent.nested('child') -> 'parent.child'\n public nested(child: string | ValidationField): ValidationField {\n const childValue = child instanceof ValidationField ? child.value : child;\n return new ValidationField(`${this.value}.${childValue}`);\n }\n\n public toString(): string {\n return this.value;\n }\n\n public equals(other: ValidationField): boolean {\n return this.value === other.value;\n }\n}\n\nexport { ValidationField };\n"],"mappings":";AAIA,IAAM,kBAAN,MAAM,gBAAgB;CAGpB,YAAoB,OAAe;EACjC,KAAK,QAAQ;CACf;CAGA,OAAc,GAAG,OAAgC;EAC/C,OAAO,IAAI,gBAAgB,KAAK;CAClC;CAGA,OAAc,OAAkD;EAC9D,MAAM,aAAa,iBAAiB,kBAAkB,MAAM,QAAQ;EACpE,OAAO,IAAI,gBAAgB,GAAG,KAAK,MAAM,GAAG,YAAY;CAC1D;CAEA,WAA0B;EACxB,OAAO,KAAK;CACd;CAEA,OAAc,OAAiC;EAC7C,OAAO,KAAK,UAAU,MAAM;CAC9B;AACF"}
1
+ {"version":3,"file":"validation-field.js","names":[],"sources":["../src/core/exceptions/validation-field.ts"],"sourcesContent":["// Object-oriented representation of validation fields.\n// Indicates WHERE a validation error occurred.\n// This is a minimal base class — field catalogs are defined per domain/module.\n\nclass ValidationField {\n public readonly value: string;\n\n private constructor(value: string) {\n this.value = value;\n }\n\n // Factory for custom or domain-specific fields\n public static of(value: string): ValidationField {\n return new ValidationField(value);\n }\n\n // Creates a nested field path: parent.nested('child') -> 'parent.child'\n public nested(child: string | ValidationField): ValidationField {\n const childValue =\n child instanceof ValidationField ? child.value : child;\n return new ValidationField(`${this.value}.${childValue}`);\n }\n\n public toString(): string {\n return this.value;\n }\n\n public equals(other: ValidationField): boolean {\n return this.value === other.value;\n }\n}\n\nexport { ValidationField };\n"],"mappings":";AAIA,IAAM,kBAAN,MAAM,gBAAgB;CAGlB,YAAoB,OAAe;EAC/B,KAAK,QAAQ;CACjB;CAGA,OAAc,GAAG,OAAgC;EAC7C,OAAO,IAAI,gBAAgB,KAAK;CACpC;CAGA,OAAc,OAAkD;EAC5D,MAAM,aACF,iBAAiB,kBAAkB,MAAM,QAAQ;EACrD,OAAO,IAAI,gBAAgB,GAAG,KAAK,MAAM,GAAG,YAAY;CAC5D;CAEA,WAA0B;EACtB,OAAO,KAAK;CAChB;CAEA,OAAc,OAAiC;EAC3C,OAAO,KAAK,UAAU,MAAM;CAChC;AACJ"}
package/meta.json CHANGED
@@ -1,66 +1,71 @@
1
1
  {
2
- "schemaVersion": "2",
3
- "name": "erp-core",
4
- "version": "1.0.1",
5
- "description": "Core ERP com clean architecture, policies, erros e services de aplicação.",
6
- "compatibility": {
7
- "engines": {
8
- "node": ">=18",
9
- "typescript": ">=5.0.0"
10
- },
11
- "directImport": {
12
- "peerDependencies": [
13
- {
14
- "name": "zod",
15
- "range": ">=3.22.0 <5"
2
+ "schemaVersion": "2",
3
+ "name": "erp-core",
4
+ "version": "1.0.3",
5
+ "description": "Core ERP com clean architecture, policies, erros e services de aplicação.",
6
+ "compatibility": {
7
+ "engines": {
8
+ "node": ">=18",
9
+ "typescript": ">=5.0.0"
10
+ },
11
+ "directImport": {
12
+ "peerDependencies": [
13
+ {
14
+ "name": "zod",
15
+ "range": ">=3.22.0 <5"
16
+ }
17
+ ]
18
+ },
19
+ "fullControl": {
20
+ "dependencies": [
21
+ {
22
+ "name": "zod",
23
+ "range": ">=3.22.0 <5"
24
+ }
25
+ ]
16
26
  }
17
- ]
18
27
  },
19
- "fullControl": {
20
- "dependencies": [
21
- {
22
- "name": "zod",
23
- "range": ">=3.22.0 <5"
24
- }
25
- ]
26
- }
27
- },
28
- "entryPoint": "index.ts",
29
- "philosophy": {
30
- "errorModel": "mixed",
31
- "observability": ["log-port", "metric-port", "trace-port"],
32
- "testStyle": "vitest-no-mocks-in-core",
33
- "externalDeps": ["zod"],
34
- "testDeps": ["vitest"]
35
- },
36
- "docs": {
37
- "context": "KIT_CONTEXT.md",
38
- "readme": "README.md"
39
- },
40
- "lint": {
41
- "nodenextImports": "off",
42
- "noBareAny": "warn",
43
- "noExternalImports": "error",
44
- "noUpwardImports": "error"
45
- },
46
- "exports": [
47
- "Entity",
48
- "ValueObject",
49
- "AppError",
50
- "ValidationError",
51
- "NotFoundError",
52
- "ConflictError",
53
- "AuthorizationError",
54
- "IntegrationError",
55
- "PolicyCatalog",
56
- "PolicyDefinition",
57
- "PolicyDecision",
58
- "PolicyResolver",
59
- "PolicyService",
60
- "mapPolicyEvaluationError"
61
- ],
62
- "changelog": [
63
- "1.0.0 - Registro inicial do boilerplate com primitives tipadas para import direto, CLI e fluxo full-control."
64
- ],
65
- "deprecated": false
28
+ "entryPoint": "index.ts",
29
+ "philosophy": {
30
+ "errorModel": "mixed",
31
+ "observability": ["log-port", "metric-port", "trace-port"],
32
+ "testStyle": "vitest-no-mocks-in-core",
33
+ "externalDeps": ["zod"],
34
+ "testDeps": ["vitest"]
35
+ },
36
+ "docs": {
37
+ "context": "KIT_CONTEXT.md",
38
+ "readme": "README.md"
39
+ },
40
+ "lint": {
41
+ "nodenextImports": "off",
42
+ "noBareAny": "warn",
43
+ "noExternalImports": "error",
44
+ "noUpwardImports": "error",
45
+ "architectureLayers": "error",
46
+ "portsArePure": "error",
47
+ "applicationReturnsResult": "error",
48
+ "requiredCoreTests": "error",
49
+ "noMocksInCoreTests": "error"
50
+ },
51
+ "exports": [
52
+ "Entity",
53
+ "ValueObject",
54
+ "AppError",
55
+ "ValidationError",
56
+ "NotFoundError",
57
+ "ConflictError",
58
+ "AuthorizationError",
59
+ "IntegrationError",
60
+ "PolicyCatalog",
61
+ "PolicyDefinition",
62
+ "PolicyDecision",
63
+ "PolicyResolver",
64
+ "PolicyService",
65
+ "mapPolicyEvaluationError"
66
+ ],
67
+ "changelog": [
68
+ "1.0.0 - Registro inicial do boilerplate com primitives tipadas para import direto, CLI e fluxo full-control."
69
+ ],
70
+ "deprecated": false
66
71
  }