{"version":3,"sources":["../src/index.ts","../src/field.builder.ts","../src/validation/email.RFC5322.ts","../src/validation/phone.E.164.ts","../src/validation/url.WHATWG.ts","../src/validation/uuid.RFC4122.ts","../src/validation/dateTime.ISO8601.ts","../src/validation/countryCode.ISO3166.ts","../src/validation/currencyCode.ISO4217.ts","../src/validation/generalText.OWASP.ts","../src/validation/version.SEMVER2.0.0.ts","../src/validation/percentage.ISO80000-1.ts","../src/validation/richtext.OWASP.ts","../src/validation/name.OWASP.ts","../src/validation/user.MS-GOOGLE-APPLE.ts","../src/validation/languageCode.BCP47.ts","../src/field.ts","../src/pii.ts","../src/schema.ts","../src/components.ts"],"sourcesContent":["export type { Infer } from \"./infer.js\";\nexport { field } from \"./field.js\";\nexport { createSchema, getSchemaForType, getAllSchemas } from \"./schema.js\";\nexport type * from \"./types.js\";\nexport * from \"./components.js\";\nexport * from \"./validation/index.js\";\nexport * from \"./field.builder.js\";","type FieldType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"ref\";\n\nimport { type PII } from \"./pii.js\";\nimport { getSchemaForType } from \"./schema.js\";\n\nexport class FieldBuilder<TExternal = unknown, TInternal = TExternal> {\n  _type!: TExternal;\n  _storageType!: TInternal;\n  isSystem = false;\n  isImmutable = false;\n  isRequired = true;\n  _validator?: (value: any) => boolean;\n  _description: string = \"\";\n  _version: string = \"1.0.0\";\n  _default?: TInternal | (() => TInternal);\n  _upgrade?: (\n    value: any,\n    ctx: {\n      entityFrom: string;\n      entityTo: string;\n      fieldTo: string;\n      fieldName: string;\n    }\n  ) => { ok: boolean; value?: any; error?: string };\n  _shape?: Record<string, FieldBuilder<any>>;\n  itemType?: FieldBuilder<any>;\n  refType?: string;\n  _pii: PII = {\n    classification: \"none\",\n    action: \"none\",\n    logHandling: \"plain\",\n    purpose: \"an ordinary value\",\n  };\n  enumValues?: readonly TInternal[];\n\n  constructor(\n    public type: FieldType,\n    options: {\n      shape?: Record<string, FieldBuilder<any>>;\n      itemType?: FieldBuilder<any>;\n      refType?: string;\n    } = {}\n  ) {\n    this._shape = options.shape;\n    this.itemType = options.itemType;\n    this.refType = options.refType;\n  }\n\n  immutable(): FieldBuilder<TExternal, TInternal> {\n    this.isImmutable = true;\n    return this;\n  }\n\n  system(): FieldBuilder<TExternal, TInternal> {\n    this.isSystem = true;\n    return this;\n  }\n\n  required(): FieldBuilder<TExternal, TInternal> {\n    this.isRequired = true;\n    return this;\n  }\n\n  optional(): FieldBuilder<TExternal, TInternal> {\n    this.isRequired = false;\n    return this;\n  }\n\n  validator(\n    fn: (value: TInternal) => boolean\n  ): FieldBuilder<TExternal, TInternal> {\n    this._validator = fn;\n    return this;\n  }\n\n  description(desc: string): FieldBuilder<TExternal, TInternal> {\n    this._description = desc;\n    return this;\n  }\n\n  default(\n    value: TInternal | (() => TInternal)\n  ): FieldBuilder<TExternal, TInternal> {\n    this._default = value;\n    // Supplying a default implies the value may be omitted at input time.\n    // Do not couple defaulting with validation.\n    this.isRequired = false;\n    return this;\n  }\n\n  /**\n   * Configure an upgrader used when validating older entities against a newer schema.\n   * The upgrader receives the current field value and version context, and should\n   * return { ok: true, value } with the upgraded value, or { ok: false, error }.\n   */\n  upgrade(\n    fn: (\n      value: any,\n      ctx: {\n        entityFrom: string;\n        entityTo: string;\n        fieldTo: string;\n        fieldName: string;\n      }\n    ) => { ok: boolean; value?: any; error?: string }\n  ): FieldBuilder<TExternal, TInternal> {\n    this._upgrade = fn;\n    return this;\n  }\n\n  getDefault(): TInternal | undefined {\n    const v = this._default;\n    return typeof v === \"function\" ? (v as () => TInternal)() : v;\n  }\n\n  version(ver: string): FieldBuilder<TExternal, TInternal> {\n    this._version = ver;\n    return this;\n  }\n\n  /// PID informs the schema PII handling of the manner in\n  /// which to handle data relating to this field.\n  PID(pii: PII): FieldBuilder<TExternal, TInternal> {\n    this._pii = pii;\n    return this;\n  }\n\n  min(min: number): FieldBuilder<TExternal, TInternal> {\n    if (this.type === \"number\") {\n      const prevValidator = this._validator;\n      this._validator = (value: any) => {\n        const valid = typeof value === \"number\" && value >= min;\n        return prevValidator ? prevValidator(value) && valid : valid;\n      };\n    } else if (this.type === \"string\") {\n      const prevValidator = this._validator;\n      this._validator = (value: any) => {\n        const valid = typeof value === \"string\" && value.length >= min;\n        return prevValidator ? prevValidator(value) && valid : valid;\n      };\n    } else if (this.type === \"array\") {\n      const prevValidator = this._validator;\n      this._validator = (value: any) => {\n        const valid = Array.isArray(value) && value.length >= min;\n        return prevValidator ? prevValidator(value) && valid : valid;\n      };\n    } else {\n      throw new Error(\n        \"Min is only supported on number, string, or array fields.\"\n      );\n    }\n    return this;\n  }\n\n  max(max: number): FieldBuilder<TExternal, TInternal> {\n    if (this.type === \"number\") {\n      const prevValidator = this._validator;\n      this._validator = (value: any) => {\n        const valid = typeof value === \"number\" && value <= max;\n        return prevValidator ? prevValidator(value) && valid : valid;\n      };\n    } else if (this.type === \"string\") {\n      const prevValidator = this._validator;\n      this._validator = (value: any) => {\n        const valid = typeof value === \"string\" && value.length <= max;\n        return prevValidator ? prevValidator(value) && valid : valid;\n      };\n    } else if (this.type === \"array\") {\n      const prevValidator = this._validator;\n      this._validator = (value: any) => {\n        const valid = Array.isArray(value) && value.length <= max;\n        return prevValidator ? prevValidator(value) && valid : valid;\n      };\n    } else {\n      throw new Error(\n        \"Max is only supported on number, string, or array fields.\"\n      );\n    }\n    return this;\n  }\n\n  pattern(regex: RegExp): FieldBuilder<TExternal, TInternal> {\n    if (this.type !== \"string\") {\n      throw new Error(\"Pattern is only supported on string fields.\");\n    }\n    const prevValidator = this._validator;\n    this._validator = (value: any) => {\n      const valid = typeof value === \"string\" && regex.test(value);\n      return prevValidator ? prevValidator(value) && valid : valid;\n    };\n    return this;\n  }\n\n  enum<const U extends readonly TInternal[]>(\n    values: U\n  ): FieldBuilder<U[number]> {\n    if (\n      this.type !== \"string\" &&\n      this.type !== \"number\" &&\n      !(\n        this.type === \"array\" &&\n        (this.itemType?.type === \"string\" || this.itemType?.type === \"number\")\n      )\n    ) {\n      throw new Error(\n        \"Enums are only supported on string or number fields or arrays of strings or numbers.\"\n      );\n    }\n    this.enumValues = values;\n    return this as any;\n  }\n\n  /**\n   * Create a shallow clone with a different external type parameter.\n   * Note: shape and itemType are passed by reference (shallow). If you need\n   * deep isolation of nested FieldBuilders, clone them explicitly.\n   */\n  as<U>(): FieldBuilder<U, TInternal> {\n    const clone = new FieldBuilder<U, TInternal>(this.type, {\n      shape: this._shape,\n      itemType: this.itemType,\n      refType: this.refType,\n    });\n    clone.enumValues = this.enumValues;\n    clone.isImmutable = this.isImmutable;\n    clone.isSystem = this.isSystem;\n    clone.isRequired = this.isRequired;\n    clone._description = this._description;\n    clone._version = this._version;\n    clone._pii = this._pii;\n    clone._validator = this._validator as any;\n    clone._default = this._default as any;\n    clone._upgrade = this._upgrade;\n    // refType already provided in constructor options above\n    return clone;\n  }\n}\n\nexport default FieldBuilder;\n","/**\n * Validates an email string using a simplified RFC 5322-compliant regex.\n * Returns true if the input is a string in the format `name@domain.tld`.\n */\nexport const validateEmail = (value: unknown): boolean => {\n  if (typeof value !== \"string\") return false;\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(value);\n};\n","/**\n *  Validates a phone number string in strict E.164 format.\n *  Returns true for strings like \"+441632960960\" (max 15 digits, starting with a '+').\n */\nexport const validatePhone = (value: unknown): boolean => {\n  if (typeof value !== \"string\") return false;\n  const phoneRegex = /^\\+[1-9]\\d{1,14}$/; // E.164 format\n  return phoneRegex.test(value);\n};\n","/**\n * Validates a URL string using the WHATWG URL API.\n * Accepts only 'http' or 'https' protocols.\n * Returns true if the URL is syntactically valid.\n */\nexport const validateUrl = (value: unknown): boolean => {\n  if (typeof value !== \"string\") return false;\n  try {\n    const url = new URL(value);\n    // Enforce scheme:\n    if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return false;\n    return true;\n  } catch {\n    return false;\n  }\n};\n","/** \n * Validates a string against the RFC 4122 format for UUIDs. \n * Matches UUIDs of versions 1 to 5, e.g., \"123e4567-e89b-12d3-a456-426614174000\".\n */ \nexport const validateUUID = (value: unknown): boolean => {\n  if (typeof value !== \"string\") return false;\n  const uuidRegex =\n    /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n  return uuidRegex.test(value);\n};\n","/**\n * Validates whether a string is a properly formatted ISO 8601 datetime, date, or time.\n * \n * @param value - The value to validate.\n * @param options - Optional settings for validation mode.\n * @param options.mode - The mode of validation:\n *   - \"datetime\" (default): Checks full ISO 8601 datetime and equality with toISOString().\n *   - \"date\": Validates that the string is in YYYY-MM-DD format and represents a valid date.\n *   - \"time\": Validates that the string matches a valid HH:MM:SS(.sss)?Z? ISO 8601 time pattern.\n * @returns True if the value is valid according to the specified mode; otherwise, false.\n */\nexport const validateDateTimeISO = (\n  value: unknown,\n  options?: { mode?: \"datetime\" | \"date\" | \"time\" }\n): boolean => {\n  const mode = options?.mode ?? \"datetime\";\n\n  if (typeof value !== \"string\") return false;\n\n  if (mode === \"datetime\") {\n    // Strict ISO 8601 date-time: YYYY-MM-DDTHH:mm:ss(.fraction)?(Z|±HH:MM)\n    const isoDateTimeRegex =\n      /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\n    if (!isoDateTimeRegex.test(value)) return false;\n\n    const date = new Date(value);\n    if (Number.isNaN(date.getTime())) return false;\n\n    // We purposely do NOT require `value === date.toISOString()` because\n    // valid ISO8601 inputs may include offsets (e.g., \"+01:00\") or omit\n    // milliseconds, both of which produce a different canonical ISO string.\n    // The regex ensures strict shape; Date parsing ensures it is a real moment.\n    return true;\n  }\n\n  if (mode === \"date\") {\n    // YYYY-MM-DD format\n    const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n    if (!dateRegex.test(value)) return false;\n    const date = new Date(value);\n    if (isNaN(date.getTime())) return false;\n    // Ensure the date parts match exactly (to avoid 2023-02-30 being accepted)\n    const [year, month, day] = value.split(\"-\").map(Number);\n    return (\n      date.getUTCFullYear() === year &&\n      date.getUTCMonth() + 1 === month &&\n      date.getUTCDate() === day\n    );\n  }\n\n  if (mode === \"time\") {\n    // HH:MM:SS(.sss)?Z?\n    // Hours: 00-23, Minutes: 00-59, Seconds: 00-59, optional fractional seconds, optional Z\n    const timeRegex = /^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?Z?$/;\n    return timeRegex.test(value);\n  }\n\n  return false;\n};\n","export const isoCountryCodes = new Set([\n  \"AD\",\n  \"AE\",\n  \"AF\",\n  \"AG\",\n  \"AI\",\n  \"AL\",\n  \"AM\",\n  \"AO\",\n  \"AQ\",\n  \"AR\",\n  \"AS\",\n  \"AT\",\n  \"AU\",\n  \"AW\",\n  \"AX\",\n  \"AZ\",\n  \"BA\",\n  \"BB\",\n  \"BD\",\n  \"BE\",\n  \"BF\",\n  \"BG\",\n  \"BH\",\n  \"BI\",\n  \"BJ\",\n  \"BL\",\n  \"BM\",\n  \"BN\",\n  \"BO\",\n  \"BQ\",\n  \"BR\",\n  \"BS\",\n  \"BT\",\n  \"BV\",\n  \"BW\",\n  \"BY\",\n  \"BZ\",\n  \"CA\",\n  \"CC\",\n  \"CD\",\n  \"CF\",\n  \"CG\",\n  \"CH\",\n  \"CI\",\n  \"CK\",\n  \"CL\",\n  \"CM\",\n  \"CN\",\n  \"CO\",\n  \"CR\",\n  \"CU\",\n  \"CV\",\n  \"CW\",\n  \"CX\",\n  \"CY\",\n  \"CZ\",\n  \"DE\",\n  \"DJ\",\n  \"DK\",\n  \"DM\",\n  \"DO\",\n  \"DZ\",\n  \"EC\",\n  \"EE\",\n  \"EG\",\n  \"EH\",\n  \"ER\",\n  \"ES\",\n  \"ET\",\n  \"FI\",\n  \"FJ\",\n  \"FM\",\n  \"FO\",\n  \"FR\",\n  \"GA\",\n  \"GB\",\n  \"GD\",\n  \"GE\",\n  \"GF\",\n  \"GG\",\n  \"GH\",\n  \"GI\",\n  \"GL\",\n  \"GM\",\n  \"GN\",\n  \"GP\",\n  \"GQ\",\n  \"GR\",\n  \"GT\",\n  \"GU\",\n  \"GW\",\n  \"GY\",\n  \"HK\",\n  \"HM\",\n  \"HN\",\n  \"HR\",\n  \"HT\",\n  \"HU\",\n  \"ID\",\n  \"IE\",\n  \"IL\",\n  \"IM\",\n  \"IN\",\n  \"IO\",\n  \"IQ\",\n  \"IR\",\n  \"IS\",\n  \"IT\",\n  \"JE\",\n  \"JM\",\n  \"JO\",\n  \"JP\",\n  \"KE\",\n  \"KG\",\n  \"KH\",\n  \"KI\",\n  \"KM\",\n  \"KN\",\n  \"KP\",\n  \"KR\",\n  \"KW\",\n  \"KY\",\n  \"KZ\",\n  \"LA\",\n  \"LB\",\n  \"LC\",\n  \"LI\",\n  \"LK\",\n  \"LR\",\n  \"LS\",\n  \"LT\",\n  \"LU\",\n  \"LV\",\n  \"LY\",\n  \"MA\",\n  \"MC\",\n  \"MD\",\n  \"ME\",\n  \"MF\",\n  \"MG\",\n  \"MH\",\n  \"MK\",\n  \"ML\",\n  \"MM\",\n  \"MN\",\n  \"MO\",\n  \"MP\",\n  \"MQ\",\n  \"MR\",\n  \"MS\",\n  \"MT\",\n  \"MU\",\n  \"MV\",\n  \"MW\",\n  \"MX\",\n  \"MY\",\n  \"MZ\",\n  \"NA\",\n  \"NC\",\n  \"NE\",\n  \"NF\",\n  \"NG\",\n  \"NI\",\n  \"NL\",\n  \"NO\",\n  \"NP\",\n  \"NR\",\n  \"NU\",\n  \"NZ\",\n  \"OM\",\n  \"PA\",\n  \"PE\",\n  \"PF\",\n  \"PG\",\n  \"PH\",\n  \"PK\",\n  \"PL\",\n  \"PM\",\n  \"PN\",\n  \"PR\",\n  \"PT\",\n  \"PW\",\n  \"PY\",\n  \"QA\",\n  \"RE\",\n  \"RO\",\n  \"RS\",\n  \"RU\",\n  \"RW\",\n  \"SA\",\n  \"SB\",\n  \"SC\",\n  \"SD\",\n  \"SE\",\n  \"SG\",\n  \"SH\",\n  \"SI\",\n  \"SJ\",\n  \"SK\",\n  \"SL\",\n  \"SM\",\n  \"SN\",\n  \"SO\",\n  \"SR\",\n  \"SS\",\n  \"ST\",\n  \"SV\",\n  \"SX\",\n  \"SY\",\n  \"SZ\",\n  \"TC\",\n  \"TD\",\n  \"TF\",\n  \"TG\",\n  \"TH\",\n  \"TJ\",\n  \"TK\",\n  \"TL\",\n  \"TM\",\n  \"TN\",\n  \"TO\",\n  \"TR\",\n  \"TT\",\n  \"TV\",\n  \"TZ\",\n  \"UA\",\n  \"UG\",\n  \"UM\",\n  \"US\",\n  \"UY\",\n  \"UZ\",\n  \"VA\",\n  \"VC\",\n  \"VE\",\n  \"VG\",\n  \"VI\",\n  \"VN\",\n  \"VU\",\n  \"WF\",\n  \"WS\",\n  \"YE\",\n  \"YT\",\n  \"ZA\",\n  \"ZM\",\n  \"ZW\",\n]);\n\n/**\n * Validates whether a string is a valid ISO 3166-1 alpha-2 country code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCountryCode = (value: unknown): boolean => {\n  if (typeof value !== \"string\") return false;\n  return isoCountryCodes.has(value.toUpperCase());\n};\n","export const isoCurrencyCodes = new Set([\n  \"AED\",\n  \"AFN\",\n  \"ALL\",\n  \"AMD\",\n  \"ANG\",\n  \"AOA\",\n  \"ARS\",\n  \"AUD\",\n  \"AWG\",\n  \"AZN\",\n  \"BAM\",\n  \"BBD\",\n  \"BDT\",\n  \"BGN\",\n  \"BHD\",\n  \"BIF\",\n  \"BMD\",\n  \"BND\",\n  \"BOB\",\n  \"BOV\",\n  \"BRL\",\n  \"BSD\",\n  \"BTN\",\n  \"BWP\",\n  \"BYN\",\n  \"BZD\",\n  \"CAD\",\n  \"CDF\",\n  \"CHE\",\n  \"CHF\",\n  \"CHW\",\n  \"CLF\",\n  \"CLP\",\n  \"CNY\",\n  \"COP\",\n  \"COU\",\n  \"CRC\",\n  \"CUC\",\n  \"CUP\",\n  \"CVE\",\n  \"CZK\",\n  \"DJF\",\n  \"DKK\",\n  \"DOP\",\n  \"DZD\",\n  \"EGP\",\n  \"ERN\",\n  \"ETB\",\n  \"EUR\",\n  \"FJD\",\n  \"FKP\",\n  \"GBP\",\n  \"GEL\",\n  \"GHS\",\n  \"GIP\",\n  \"GMD\",\n  \"GNF\",\n  \"GTQ\",\n  \"GYD\",\n  \"HKD\",\n  \"HNL\",\n  \"HRK\",\n  \"HTG\",\n  \"HUF\",\n  \"IDR\",\n  \"ILS\",\n  \"INR\",\n  \"IQD\",\n  \"IRR\",\n  \"ISK\",\n  \"JMD\",\n  \"JOD\",\n  \"JPY\",\n  \"KES\",\n  \"KGS\",\n  \"KHR\",\n  \"KMF\",\n  \"KPW\",\n  \"KRW\",\n  \"KWD\",\n  \"KYD\",\n  \"KZT\",\n  \"LAK\",\n  \"LBP\",\n  \"LKR\",\n  \"LRD\",\n  \"LSL\",\n  \"LYD\",\n  \"MAD\",\n  \"MDL\",\n  \"MGA\",\n  \"MKD\",\n  \"MMK\",\n  \"MNT\",\n  \"MOP\",\n  \"MRU\",\n  \"MUR\",\n  \"MVR\",\n  \"MWK\",\n  \"MXN\",\n  \"MXV\",\n  \"MYR\",\n  \"MZN\",\n  \"NAD\",\n  \"NGN\",\n  \"NIO\",\n  \"NOK\",\n  \"NPR\",\n  \"NZD\",\n  \"OMR\",\n  \"PAB\",\n  \"PEN\",\n  \"PGK\",\n  \"PHP\",\n  \"PKR\",\n  \"PLN\",\n  \"PYG\",\n  \"QAR\",\n  \"RON\",\n  \"RSD\",\n  \"RUB\",\n  \"RWF\",\n  \"SAR\",\n  \"SBD\",\n  \"SCR\",\n  \"SDG\",\n  \"SEK\",\n  \"SGD\",\n  \"SHP\",\n  \"SLL\",\n  \"SOS\",\n  \"SRD\",\n  \"SSP\",\n  \"STN\",\n  \"SVC\",\n  \"SYP\",\n  \"SZL\",\n  \"THB\",\n  \"TJS\",\n  \"TMT\",\n  \"TND\",\n  \"TOP\",\n  \"TRY\",\n  \"TTD\",\n  \"TWD\",\n  \"TZS\",\n  \"UAH\",\n  \"UGX\",\n  \"USD\",\n  \"USN\",\n  \"UYI\",\n  \"UYU\",\n  \"UYW\",\n  \"UZS\",\n  \"VES\",\n  \"VND\",\n  \"VUV\",\n  \"WST\",\n  \"XAF\",\n  \"XAG\",\n  \"XAU\",\n  \"XBA\",\n  \"XBB\",\n  \"XBC\",\n  \"XBD\",\n  \"XCD\",\n  \"XDR\",\n  \"XOF\",\n  \"XPD\",\n  \"XPF\",\n  \"XPT\",\n  \"XSU\",\n  \"XTS\",\n  \"XUA\",\n  \"XXX\",\n  \"YER\",\n  \"ZAR\",\n  \"ZMW\",\n  \"ZWL\",\n]);\n\n\n/** \n * Validates whether a string is a valid ISO 4217 currency code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCurrencyCode = (value: unknown): boolean => {\n  if (typeof value !== \"string\") return false;\n  return isoCurrencyCodes.has(value.toUpperCase());\n};\n","/**\n * Validates that a text field is safe for storage (per OWASP guidelines).\n * Applies to general text fields: names, descriptions, titles, etc.\n * Global Standard: OWASP Input Validation Cheat Sheet (2024)\n */\nexport function validateSafeText(value: unknown): boolean {\n  if (typeof value !== \"string\") return false;\n\n  // Trimmed version should not be empty\n  const trimmed = value.trim();\n  if (trimmed.length === 0) return false;\n\n  // Reject control chars\n  for (let i = 0; i < trimmed.length; i++) {\n    const code = trimmed.codePointAt(i);\n    if (code !== undefined && (code >= 0x00 && code <= 0x1F || code === 0x7F)) {\n      return false;\n    }\n  }\n\n  // Reject dangerous characters\n  if (/['\"<>\\\\{}();]/.test(trimmed)) return false;\n\n  // Reject SQL-style injection patterns\n  if (\n    /(--|\\b(SELECT|UPDATE|DELETE|INSERT|DROP|ALTER|EXEC|UNION|GRANT|REVOKE)\\b|\\/\\*|\\*\\/|@@)/i.test(\n      trimmed\n    )\n  )\n    return false;\n\n  // Reject null char\n  if (trimmed.includes(\"\\u0000\")) return false;\n\n  // Optional: limit length\n  if (trimmed.length > 1024) return false;\n\n  return true;\n}\n","/**\n * Validates that a version string conforms to Semantic Versioning (SemVer 2.0.0).\n * Global Standard: https://semver.org/\n */\nexport function validateSemVer(value: unknown): boolean {\n  if (typeof value !== \"string\") return false;\n  return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/.test(\n    value\n  );\n}\n","/**\n * Validates that a number is a percentage value (0 to 100 inclusive).\n * Global Standard: ISO 80000-1 percentage definition.\n */\nexport function validatePercentage(value: unknown): boolean {\n  if (typeof value !== \"number\") return false;\n  return value >= 0 && value <= 100;\n}\n","/**\n * Validates rich text input to ensure it contains only safe HTML/Markdown.\n * Global Standard: OWASP HTML Sanitization Guidelines (2024).\n * This validator checks for dangerous patterns — does not sanitize — assumes text will be sanitized downstream.\n */\nexport function validateRichText(value: unknown): boolean {\n  if (typeof value !== \"string\") return false;\n  const trimmed = value.trim();\n  if (trimmed.length === 0) return true; // Allow empty rich text\n\n  // Reject known dangerous tags\n  if (\n    /<(script|iframe|object|embed|style|link|meta|base|form|input|button|textarea|select)\\b/i.test(\n      trimmed\n    )\n  ) {\n    return false;\n  }\n\n  // Reject javascript: links\n  if (/javascript:/i.test(trimmed)) {\n    return false;\n  }\n\n  // Reject event handlers (onload, onclick, etc)\n  if (/on\\w+=[\"']?/i.test(trimmed)) {\n    return false;\n  }\n\n  // Optionally: limit max length (e.g. 10,000 chars)\n  if (trimmed.length > 10000) return false;\n\n  return true;\n}\n","/**\n * Validates that a name is safe, culturally inclusive, and matches global best practice.\n * Global Standard: OWASP Input Validation Cheat Sheet + ICAO Doc 9303 + IETF PRECIS\n */\nexport function validateName(value: unknown): boolean {\n  if (typeof value !== \"string\") return false;\n\n  const trimmed = value.trim();\n  if (trimmed.length === 0) return false;\n\n  // Limit length (ISO guidance: max 256 is typical)\n  if (trimmed.length > 256) return false;\n\n  // Reject ASCII control chars (U+0000–U+001F and U+007F)\n  for (const ch of trimmed) {\n    const cp = ch.codePointAt(0)!;\n    if ((cp >= 0x00 && cp <= 0x1F) || cp === 0x7F) return false;\n  }\n\n  // Core pattern\n  const namePattern = /^[\\p{L}\\p{M}'\\- ]+$/u;\n  if (!namePattern.test(trimmed)) return false;\n\n  return true;\n}\n","/**\n * Validates that a user ID is a valid `sub` from one of the supported identity providers.\n * Global Standard: OpenID Connect Core 1.0 `sub` claim.\n */\nexport function validateUserId(value: unknown): boolean {\n  if (typeof value !== \"string\") return false;\n\n  const trimmed = value.trim();\n  if (trimmed.length === 0) return false;\n\n  // Google: all digits\n  const googlePattern = /^\\d{21,22}$/;\n\n  // Microsoft: UUID v4\n  const microsoftPattern =\n    /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n  // Apple: opaque, usually UUID but allow any printable string up to 255 chars\n  const applePattern = /^[\\w\\-.]{6,255}$/; // Alphanumeric + - . _ (common safe characters)\n\n  return (\n    googlePattern.test(trimmed) ||\n    microsoftPattern.test(trimmed) ||\n    applePattern.test(trimmed)\n  );\n}\n\nexport function validateUserIdArray(value: unknown): boolean {\n  if (!Array.isArray(value)) return false;\n  return value.every(validateUserId);\n}","/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\n/**\n * ISO 639-1 language codes (two-letter).\n * Tip: Keep this list as source of truth for supported languages in your app.\n */\nexport enum IsoLanguageCode {\n  Afar = \"aa\",\n  Abkhazian = \"ab\",\n  Afrikaans = \"af\",\n  Akan = \"ak\",\n  Albanian = \"sq\",\n  Amharic = \"am\",\n  Arabic = \"ar\",\n  Aragonese = \"an\",\n  Armenian = \"hy\",\n  Assamese = \"as\",\n  Avaric = \"av\",\n  Aymara = \"ay\",\n  Azerbaijani = \"az\",\n  Bashkir = \"ba\",\n  Bambara = \"bm\",\n  Basque = \"eu\",\n  Belarusian = \"be\",\n  Bengali = \"bn\",\n  Bislama = \"bi\",\n  Bosnian = \"bs\",\n  Breton = \"br\",\n  Bulgarian = \"bg\",\n  Burmese = \"my\",\n  Catalan = \"ca\",\n  Chamorro = \"ch\",\n  Chechen = \"ce\",\n  Chinese = \"zh\",\n  ChurchSlavic = \"cu\",\n  Chuvash = \"cv\",\n  Cornish = \"kw\",\n  Corsican = \"co\",\n  Cree = \"cr\",\n  Croatian = \"hr\",\n  Czech = \"cs\",\n  Danish = \"da\",\n  Divehi = \"dv\",\n  Dutch = \"nl\",\n  Dzongkha = \"dz\",\n  English = \"en\",\n  Esperanto = \"eo\",\n  Estonian = \"et\",\n  Ewe = \"ee\",\n  Faroese = \"fo\",\n  Fijian = \"fj\",\n  Finnish = \"fi\",\n  French = \"fr\",\n  WesternFrisian = \"fy\",\n  Fulah = \"ff\",\n  Gaelic = \"gd\",\n  Galician = \"gl\",\n  Ganda = \"lg\",\n  Georgian = \"ka\",\n  German = \"de\",\n  Greek = \"el\",\n  Kalaallisut = \"kl\",\n  Guarani = \"gn\",\n  Gujarati = \"gu\",\n  Haitian = \"ht\",\n  Hausa = \"ha\",\n  Hebrew = \"he\",\n  Herero = \"hz\",\n  Hindi = \"hi\",\n  HiriMotu = \"ho\",\n  Hungarian = \"hu\",\n  Icelandic = \"is\",\n  Ido = \"io\",\n  Igbo = \"ig\",\n  Indonesian = \"id\",\n  Interlingua = \"ia\",\n  Interlingue = \"ie\",\n  Inuktitut = \"iu\",\n  Inupiaq = \"ik\",\n  Irish = \"ga\",\n  Italian = \"it\",\n  Japanese = \"ja\",\n  Javanese = \"jv\",\n  Kannada = \"kn\",\n  Kanuri = \"kr\",\n  Kashmiri = \"ks\",\n  Kazakh = \"kk\",\n  CentralKhmer = \"km\",\n  Kikuyu = \"ki\",\n  Kinyarwanda = \"rw\",\n  Kyrgyz = \"ky\",\n  Komi = \"kv\",\n  Kongo = \"kg\",\n  Korean = \"ko\",\n  Kuanyama = \"kj\",\n  Kurdish = \"ku\",\n  Lao = \"lo\",\n  Latin = \"la\",\n  Latvian = \"lv\",\n  Limburgan = \"li\",\n  Lingala = \"ln\",\n  Lithuanian = \"lt\",\n  LubaKatanga = \"lu\",\n  Luxembourgish = \"lb\",\n  Macedonian = \"mk\",\n  Malagasy = \"mg\",\n  Malay = \"ms\",\n  Malayalam = \"ml\",\n  Maltese = \"mt\",\n  Manx = \"gv\",\n  Maori = \"mi\",\n  Marathi = \"mr\",\n  Marshallese = \"mh\",\n  Mongolian = \"mn\",\n  Nauru = \"na\",\n  Navajo = \"nv\",\n  NorthNdebele = \"nd\",\n  SouthNdebele = \"nr\",\n  Ndonga = \"ng\",\n  Nepali = \"ne\",\n  Norwegian = \"no\",\n  NorwegianBokmal = \"nb\",\n  NorwegianNynorsk = \"nn\",\n  SichuanYi = \"ii\",\n  Occitan = \"oc\",\n  Ojibwa = \"oj\",\n  Oriya = \"or\",\n  Oromo = \"om\",\n  Ossetian = \"os\",\n  Pali = \"pi\",\n  Pashto = \"ps\",\n  Persian = \"fa\",\n  Polish = \"pl\",\n  Portuguese = \"pt\",\n  Punjabi = \"pa\",\n  Quechua = \"qu\",\n  Romansh = \"rm\",\n  Romanian = \"ro\",\n  Rundi = \"rn\",\n  Russian = \"ru\",\n  Samoan = \"sm\",\n  Sango = \"sg\",\n  Sanskrit = \"sa\",\n  Sardinian = \"sc\",\n  Serbian = \"sr\",\n  Shona = \"sn\",\n  Sindhi = \"sd\",\n  Sinhala = \"si\",\n  Slovak = \"sk\",\n  Slovenian = \"sl\",\n  Somali = \"so\",\n  SouthernSotho = \"st\",\n  Spanish = \"es\",\n  Sundanese = \"su\",\n  Swahili = \"sw\",\n  Swati = \"ss\",\n  Swedish = \"sv\",\n  Tagalog = \"tl\",\n  Tahitian = \"ty\",\n  Tajik = \"tg\",\n  Tamil = \"ta\",\n  Tatar = \"tt\",\n  Telugu = \"te\",\n  Thai = \"th\",\n  Tibetan = \"bo\",\n  Tigrinya = \"ti\",\n  Tonga = \"to\",\n  Tsonga = \"ts\",\n  Tswana = \"tn\",\n  Turkish = \"tr\",\n  Turkmen = \"tk\",\n  Twi = \"tw\",\n  Uighur = \"ug\",\n  Ukrainian = \"uk\",\n  Urdu = \"ur\",\n  Uzbek = \"uz\",\n  Venda = \"ve\",\n  Vietnamese = \"vi\",\n  Volapuk = \"vo\",\n  Walloon = \"wa\",\n  Welsh = \"cy\",\n  Wolof = \"wo\",\n  Xhosa = \"xh\",\n  Yiddish = \"yi\",\n  Yoruba = \"yo\",\n  Zhuang = \"za\",\n  Zulu = \"zu\",\n}\n\n/** Fast lookup set for enum values (lowercase 2-letter codes). */\nconst ISO_LANGUAGE_SET: ReadonlySet<string> = new Set<string>(\n  Object.values(IsoLanguageCode)\n);\n\n/** Type guard: primary language must be one of the enum values. */\nexport function isIsoLanguageCode(value: unknown): value is IsoLanguageCode {\n  return typeof value === \"string\" && ISO_LANGUAGE_SET.has(value.toLowerCase());\n}\n\n/**\n * Region validator per BCP 47:\n * - ISO 3166-1 alpha-2: 2 uppercase letters (e.g., GB, US)\n * - UN M.49 numeric: 3 digits (e.g., 419 for Latin America)\n *\n * NOTE: This validates *shape* not membership against the 3166 list.\n * If you want hard membership, we can add a Set of all alpha-2 regions.\n */\nexport function isRegionSubtag(value: string): boolean {\n  return /^[A-Z]{2}$/.test(value) || /^\\d{3}$/.test(value);\n}\n\n/** Script subtag per ISO 15924: one capital + three lowercase (e.g., Latn, Cyrl, Hans). */\nexport function isScriptSubtag(value: string): boolean {\n  return /^[A-Z][a-z]{3}$/.test(value);\n}\n\n/** Variant subtag per BCP 47: 5–8 alnum, or 4 starting with a digit. */\nexport function isVariantSubtag(value: string): boolean {\n  return /^([0-9][A-Za-z0-9]{3}|[A-Za-z0-9]{5,8})$/.test(value);\n}\n\n/** Extension sequence: singleton (alnum except 'x') + one or more 2–8 alnum subtags. */\nexport function isExtensionSingleton(value: string): boolean {\n  return /^[0-9A-WY-Za-wy-z]$/.test(value); // any alnum except 'x' (private-use)\n}\nexport function isExtensionSubtag(value: string): boolean {\n  return /^[A-Za-z0-9]{2,8}$/.test(value);\n}\n\n/** Private-use subtag: 'x' then one or more 1–8 alnum subtags. */\nexport function isPrivateUseSingleton(value: string): boolean {\n  return value.toLowerCase() === \"x\";\n}\nexport function isPrivateUseSubtag(value: string): boolean {\n  return /^[A-Za-z0-9]{1,8}$/.test(value);\n}\n\n/**\n * Validates:\n *  - plain language: \"en\"\n *  - language + region: \"en-GB\"\n *  - language + script + region: \"sr-Cyrl-RS\"\n *  - language + variants: \"sl-rozaj-biske\", \"de-CH-1996\"\n *  - extensions: \"en-GB-u-ca-gregory\"\n *  - private-use: \"en-x-klingon\" or just \"x-piglatin\"\n *\n * Returns true only if the primary language is in IsoLanguageCode\n * and the rest of the tag conforms to BCP 47 structure.\n */\nexport function validateLanguage(value: unknown): boolean {\n  if (typeof value !== \"string\" || value.length === 0) return false;\n\n  const parts = value.split(\"-\");\n  let i = 0;\n\n  // 1) primary language (must be enum member; we use lowercase for comparison)\n  const lang = parts[i];\n  if (!lang || !isIsoLanguageCode(lang)) return false;\n  i += 1;\n\n  // 2) optional script\n  if (i < parts.length && isScriptSubtag(parts[i] as string)) {\n    i += 1;\n  }\n\n  // 3) optional region\n  if (i < parts.length && isRegionSubtag((parts[i] as string).toUpperCase())) {\n    // region must be uppercase if alpha; we normalize for check only\n    i += 1;\n  }\n\n  // 4) zero or more variants\n  while (i < parts.length && isVariantSubtag((parts[i] as string))) {\n    i += 1;\n  }\n\n  // 5) zero or more extensions\n  //    extension = singleton ; 2–8 ; ( ; 2–8 )*\n  while (i < parts.length && isExtensionSingleton((parts[i] as string))) {\n    i += 1;\n    // must have at least one following subtag of length 2–8\n    if (!(i < parts.length && isExtensionSubtag(parts[i]!))) return false;\n    while (i < parts.length && isExtensionSubtag(parts[i]!)) {\n      i += 1;\n    }\n  }\n\n  // 6) optional private-use: 'x' 1*('-' (1*8alnum))\n  if (i < parts.length && isPrivateUseSingleton(parts[i]!)) {\n    i += 1;\n    if (!(i < parts.length && isPrivateUseSubtag(parts[i]!))) return false;\n    while (i < parts.length && isPrivateUseSubtag(parts[i]!)) {\n      i += 1;\n    }\n  }\n\n  // no leftovers\n  return i === parts.length;\n}\n","import { version } from \"os\";\nimport { FieldBuilder } from \"./field.builder.js\";\nimport { Infer } from \"./infer.js\";\nimport { SchemaShape } from \"./types.js\";\nimport {\n  validateCountryCode,\n  validateDateTimeISO,\n  validateEmail,\n  validatePhone,\n  validateRichText,\n  validateSafeText,\n  validateSemVer,\n  validateUrl,\n  validateUUID,\n} from \"./validation/index.js\";\nimport { validateLanguage } from \"./validation/languageCode.BCP47.js\";\n\nexport const field = {\n  string: () => new FieldBuilder<string>(\"string\"),\n  number: () => new FieldBuilder<number>(\"number\"),\n  boolean: () => new FieldBuilder<boolean>(\"boolean\"),\n  object: <T extends Record<string, FieldBuilder>>(fields: T) =>\n    new FieldBuilder<T>(\"object\", { shape: fields }),\n  array: (itemType: FieldBuilder) => new FieldBuilder(\"array\", { itemType }),\n  ref: <S extends SchemaShape>(refType: string) =>\n    new FieldBuilder<Infer<S>>(\"ref\", { refType }),\n  email: () =>\n    new FieldBuilder<string>(\"string\")\n      .validator(validateEmail)\n      .PID({\n        classification: \"high\",\n        action: \"encrypt\",\n        logHandling: \"redact\",\n        purpose: \"an email address\",\n      })\n      .description(\"An email address\"),\n  phone: () =>\n    new FieldBuilder<string>(\"string\")\n      .validator(validatePhone)\n      .PID({\n        classification: \"high\",\n        action: \"encrypt\",\n        logHandling: \"redact\",\n        purpose: \"a phone number\",\n      })\n      .description(\"A phone number\"),\n  url: () =>\n    new FieldBuilder<string>(\"string\")\n      .validator(validateUrl)\n      .PID({\n        classification: \"low\",\n        action: \"hash\",\n        logHandling: \"pseudonym\",\n        purpose: \"a URL\",\n      })\n      .description(\"A URL\"),\n  uuid: () =>\n    new FieldBuilder<string>(\"string\")\n      .PID({\n        classification: \"low\",\n        action: \"hash\",\n        logHandling: \"pseudonym\",\n        purpose: \"a UUID\",\n      })\n      .validator(validateUUID)\n      .description(\"A UUID\"),\n  dateTimeISO: () =>\n    new FieldBuilder<string>(\"string\")\n      .PID({\n        classification: \"none\",\n        action: \"none\",\n        logHandling: \"plain\",\n        purpose: \"a date string\",\n      })\n      .validator(validateDateTimeISO)\n      .description(\"A date string in ISO 8601 format\"),\n  dateISO: () =>\n    new FieldBuilder<string>(\"string\")\n      .PID({\n        classification: \"none\",\n        action: \"none\",\n        logHandling: \"plain\",\n        purpose: \"a date string\",\n      })\n      .validator((s) => validateDateTimeISO(s, { mode: \"date\" }))\n      .description(\"A date string in ISO 8601 format (date only)\"),\n  timeISO: () =>\n    new FieldBuilder<string>(\"string\")\n      .PID({\n        classification: \"none\",\n        action: \"none\",\n        logHandling: \"plain\",\n        purpose: \"a time string\",\n      })\n      .validator((s) => validateDateTimeISO(s, { mode: \"time\" }))\n      .description(\"A time string in ISO 8601 format (time only)\"),\n  richText: () =>\n    new FieldBuilder<string>(\"string\")\n      .PID({\n        classification: \"low\",\n        action: \"clear\",\n        logHandling: \"omit\",\n        purpose: \"rich text content\",\n      })\n      .validator(validateRichText)\n      .description(\"Rich text content, may include basic HTML formatting\"),\n  generalText: () =>\n    new FieldBuilder<string>(\"string\")\n      .PID({\n        classification: \"none\",\n        action: \"none\",\n        logHandling: \"plain\",\n        purpose: \"Plain text content\",\n      })\n      .validator(validateSafeText)\n      .description(\"Standard text content, no HTML allowed\"),\n  latitude: () =>\n    new FieldBuilder<number>(\"number\")\n      .PID({\n        classification: \"low\",\n        action: \"clear\",\n        logHandling: \"omit\",\n        purpose: \"Latitude in decimal degrees, WGS 84 (ISO 6709)\",\n      })\n      .min(-90)\n      .max(90)\n      .description(\"Latitude in decimal degrees, WGS 84 (ISO 6709)\"),\n  longitude: () =>\n    new FieldBuilder<number>(\"number\")\n      .PID({\n        classification: \"low\",\n        action: \"clear\",\n        logHandling: \"omit\",\n        purpose: \"Longitude in decimal degrees, WGS 84 (ISO 6709)\",\n      })\n      .min(-180)\n      .max(180)\n      .description(\"Longitude in decimal degrees, WGS 84 (ISO 6709)\"),\n  version: () =>\n    new FieldBuilder<string>(\"string\")\n      .validator(validateSemVer)\n      .description(\"A semantic version string, e.g. '1.0.0'\"),\n  countryCode: () =>\n    new FieldBuilder<string>(\"string\")\n      .validator(validateCountryCode)\n      .description(\"An ISO 3166 country code, e.g. 'US', 'GB', 'FR'\"),\n  languageCode: () =>\n    new FieldBuilder<string>(\"string\")\n      .validator(validateLanguage)\n      .description(\n        \"An BCP 47 structured language code, primarily ISO 639-1 and optionally with ISO 3166-1 alpha-2 country code, e.g. 'en', 'en-US', 'fr', 'fr-FR'\"\n      ),\n};\n","export type PIIClassification = \"none\" | \"low\" | \"high\";\n\nexport type PIIAction = \"encrypt\" | \"hash\" | \"clear\" | \"none\";\n\nexport type PIILogHandling = \"redact\" | \"omit\" | \"pseudonym\" | \"plain\";\n\nexport type PiiEnforcement = \"strict\" | \"warn\" | \"none\";\n\nexport interface PII {\n  classification: PIIClassification;\n  action: PIIAction;\n  logHandling?: PIILogHandling; // How should this PII be handled in logs?\n  purpose?: string; // optional, for audit: e.g. \"user contact\", \"analytics\"\n}\n\n/**\n * Centralized PII enforcement for field-level validation.\n * Returns { shortCircuit: true } when in strict mode and value is missing for high PII.\n */\nexport function enforcePIIField(\n  parentKey: string,\n  key: string,\n  value: any,\n  def: any,\n  enforcement: PiiEnforcement = \"none\",\n  errors?: string[],\n  logger?: { warn: (msg: string) => void }\n): { shortCircuit: boolean } {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  if (def?._pii?.classification === \"high\" && (def?.isRequired ?? true)) {\n    const missing = value === undefined || value === null || value === \"\";\n    if (missing) {\n      const msg = `High PII field must not be empty: ${path}`;\n      if (enforcement === \"strict\") {\n        errors?.push(msg);\n        return { shortCircuit: true };\n      }\n      if (enforcement === \"warn\") {\n        logger?.warn?.(`WARN (PII Enforcement): ${msg}`);\n      }\n    }\n  }\n  return { shortCircuit: false };\n}\n\n/**\n * Apply storage-time PII transforms based on field definitions in shape.\n */\nexport function prepareForStorage(\n  shape: Record<string, any>,\n  input: Record<string, any>,\n  encryptFn: (value: any) => string,\n  hashFn: (value: any) => string\n): Record<string, any> {\n  const result: any = {};\n  for (const key in shape) {\n    const def = shape[key];\n    if (!def) continue;\n    const value = input[key];\n    if (def._pii?.action === \"encrypt\") {\n      result[key + \"Encrypted\"] = encryptFn(value);\n    } else if (def._pii?.action === \"hash\") {\n      result[key + \"Hash\"] = hashFn(value);\n    } else {\n      result[key] = value;\n    }\n  }\n  return result;\n}\n\n/**\n * Apply read-time PII transforms (e.g., decrypt) based on field definitions in shape.\n */\nexport function prepareForRead(\n  shape: Record<string, any>,\n  stored: Record<string, any>,\n  decryptFn: (value: string) => any\n): Record<string, any> {\n  const result: any = {};\n  for (const key in shape) {\n    const def = shape[key];\n    if (!def) continue;\n    if (def._pii?.action === \"encrypt\") {\n      result[key] = decryptFn(stored[key + \"Encrypted\"]);\n    } else {\n      result[key] = stored[key];\n    }\n  }\n  return result;\n}\n\n/**\n * Sanitize data for logging according to PII logHandling.\n */\nexport function sanitizeForLog(\n  shape: Record<string, any>,\n  data: Record<string, any>,\n  pseudonymFn: (value: any) => string\n): Record<string, any> {\n  const output: any = {};\n  for (const key in shape) {\n    const def = shape[key];\n    if (!def) continue;\n    const value = data[key];\n    const handling = def._pii?.logHandling as PIILogHandling | undefined;\n    if (handling === \"omit\") continue;\n    if (handling === \"redact\") {\n      output[key] = \"[REDACTED]\";\n    } else if (handling === \"pseudonym\") {\n      output[key] = pseudonymFn(value);\n    } else {\n      output[key] = value;\n    }\n  }\n  return output;\n}\n\n/**\n * Produce a PII audit list for the given shape.\n */\nexport function getPiiAudit(shape: Record<string, any>): Array<{\n  field: string;\n  classification: PIIClassification;\n  action: PIIAction;\n  logHandling?: PIILogHandling;\n  purpose?: string;\n}> {\n  const piiFields: Array<any> = [];\n  for (const key in shape) {\n    const def = shape[key];\n    if (!def) continue;\n    if (def._pii && def._pii.classification !== \"none\") {\n      piiFields.push({\n        field: key,\n        classification: def._pii.classification,\n        action: def._pii.action,\n        logHandling: def._pii.logHandling,\n        purpose: def._pii.purpose,\n      });\n    }\n  }\n  return piiFields;\n}\n\n/**\n * Scrub PII fields for delete/retention workflows.\n */\nexport function scrubPiiForDelete(\n  shape: Record<string, any>,\n  stored: Record<string, any>\n): Record<string, any> {\n  const result: any = { ...stored };\n  for (const key in shape) {\n    const def = shape[key];\n    if (!def) continue;\n    if (def._pii?.action === \"encrypt\") {\n      result[key + \"Encrypted\"] = null;\n    } else if (def._pii?.action === \"hash\") {\n      result[key + \"Hash\"] = null;\n    } else if (def._pii?.action === \"clear\") {\n      result[key] = null;\n    }\n  }\n  return result;\n}\n","import { Infer } from \"./infer.js\";\nimport {\n  FieldType,\n  Schema,\n  SchemaOptions,\n  SchemaShape,\n  SchemaUpgradeResult,\n  SchemaUpgradeSpec,\n} from \"./types.js\";\nimport { field } from \"./field.js\";\nimport { PIIAction, PIIClassification, PIILogHandling } from \"./pii.js\";\nimport {\n  enforcePIIField,\n  prepareForStorage as piiPrepareForStorage,\n  prepareForRead as piiPrepareForRead,\n  sanitizeForLog as piiSanitizeForLog,\n  getPiiAudit as piiGetPiiAudit,\n  scrubPiiForDelete as piiScrubPiiForDelete,\n} from \"./pii.js\";\nimport { FieldBuilder } from \"./field.builder.js\";\nimport { validateSemVer } from \"./validation/version.SEMVER2.0.0.js\";\n\nconst globalSchemaRegistry = new Map<string, Schema<any>>();\n\nfunction cmpSemver(a: string, b: string): number {\n  const pa = a.split(\".\").map((n) => parseInt(n, 10));\n  const pb = b.split(\".\").map((n) => parseInt(n, 10));\n  for (let i = 0; i < 3; i++) {\n    const ai = pa[i] ?? 0;\n    const bi = pb[i] ?? 0;\n    if (ai > bi) return 1;\n    if (ai < bi) return -1;\n  }\n  return 0;\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helper: apply schema upgrade using SchemaUpgradeSpec (function or cascading steps)\n// ──────────────────────────────────────────────────────────────────────────────\nfunction applySchemaUpgrade(\n  spec: SchemaUpgradeSpec,\n  input: Record<string, any>,\n  ctx: {\n    from: string;\n    to: string;\n    entityType: string;\n    describe: () => { entityType: string; version: string; shape: Record<string, any> };\n    log?: (msg: string) => void;\n  }\n): SchemaUpgradeResult {\n  // Single universal upgrader\n  if (typeof spec === \"function\") {\n    return spec(input, ctx);\n  }\n\n  // Cascading steps: sort by target version, then apply those between from..to\n  const steps = [...spec].sort((s1, s2) => cmpSemver(s1.to, s2.to));\n  let working: Record<string, any> = { ...input };\n  let fromVersion = ctx.from;\n\n  for (const step of steps) {\n    // Apply step if it advances beyond current `from` and does not exceed target `to`\n    if (cmpSemver(fromVersion, step.to) < 0 && cmpSemver(step.to, ctx.to) <= 0) {\n      ctx.log?.(`Upgrading entity from v${fromVersion} → v${step.to}`);\n      const res = step.run(working, { ...ctx, from: fromVersion, to: step.to });\n      if (!res || res.ok !== true || !res.value) {\n        return {\n          ok: false,\n          errors: res?.errors?.length\n            ? res.errors\n            : [`Failed to upgrade entity from v${fromVersion} to v${step.to}`],\n        };\n      }\n      working = res.value;\n      fromVersion = step.to;\n    }\n  }\n\n  // If no steps applied or we stopped before ctx.to, the caller will normalize type/version.\n  return { ok: true, value: working };\n}\n\nfunction validateEnum(\n  parentKey: string,\n  value: any,\n  enumValues?: Array<string | number>\n): string | undefined {\n  if (!enumValues) return;\n\n  const values = Array.isArray(enumValues)\n    ? enumValues\n    : Array.from(enumValues);\n\n  if (Array.isArray(value)) {\n    const invalid = value.filter((v) => !values.includes(v));\n    if (invalid.length > 0) {\n      return `Field ${parentKey} contains invalid enum values: ${invalid.join(\n        \", \"\n      )}`;\n    }\n  } else {\n    if (!values.includes(value)) {\n      return `Field ${parentKey} must be one of: ${values.join(\", \")}`;\n    }\n  }\n}\n\n// Helper: some builders may store enum/optional/validator under different keys\n// schema.ts\nfunction getEnumValues(def: any): Array<string | number> | undefined {\n  const src = Array.isArray(def?.enum)\n    ? def.enum\n    : Array.isArray(def?.enumValues)\n    ? def.enumValues\n    : Array.isArray(def?._enum)\n    ? def._enum\n    : Array.isArray(def?._enumValues)\n    ? def._enumValues\n    : def?._enumSet instanceof Set\n    ? Array.from(def._enumSet)\n    : undefined;\n\n  if (!src) return undefined;\n  const ok = src.every(\n    (v: unknown) => typeof v === \"string\" || typeof v === \"number\"\n  );\n  return ok ? (src as Array<string | number>) : undefined;\n}\n\nfunction isOptional(def: any): boolean {\n  return (def?.isRequired ?? false) === false;\n}\n\nfunction getValidator(def: any): ((v: any) => boolean) | undefined {\n  return def?._validator ?? undefined;\n}\n\nfunction getShape(def: any): Record<string, any> | undefined {\n  return def?._shape ?? def?.shape ?? undefined;\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Validation helpers (extracted from validate())\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction checkMissingRequired(\n  parentKey: string,\n  key: string,\n  value: any,\n  def: any,\n  errors: string[]\n): { missing: boolean } {\n  if (value === undefined || value === null) {\n    const path = parentKey ? `${parentKey}.${key}` : key;\n    if (!isOptional(def)) {\n      errors.push(`Missing required field: ${path}`);\n    }\n    return { missing: true };\n  }\n  return { missing: false };\n}\n\nfunction checkImmutable(\n  parentKey: string,\n  key: string,\n  value: any,\n  def: any,\n  existing: Record<string, any> | undefined,\n  errors: string[]\n): { immutableViolation: boolean } {\n  if (\n    def.isImmutable &&\n    existing &&\n    existing[key] !== undefined &&\n    value !== existing[key]\n  ) {\n    const path = parentKey ? `${parentKey}.${key}` : key;\n    errors.push(`Field is immutable: ${path}`);\n    return { immutableViolation: true };\n  }\n  return { immutableViolation: false };\n}\n\nfunction runCustomValidator(\n  parentKey: string,\n  key: string,\n  value: any,\n  def: any,\n  errors: string[]\n): { invalid: boolean } {\n  const validator = getValidator(def);\n  if (validator && value !== undefined && value !== null) {\n    const valid = validator(value);\n    if (!valid) {\n      const path = parentKey ? `${parentKey}.${key}` : key;\n      errors.push(`Invalid value for field: ${path}`);\n      return { invalid: true };\n    }\n  }\n  return { invalid: false };\n}\n\nfunction validateStringField(\n  parentKey: string,\n  key: string,\n  value: any,\n  def: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  if (typeof value !== \"string\") {\n    errors.push(`Field ${path} must be string`);\n    return;\n  }\n\n  const enumValues = getEnumValues(def);\n  if (Array.isArray(enumValues)) {\n    const enumError = validateEnum(path, value, enumValues);\n    if (enumError) {\n      errors.push(enumError);\n    }\n  }\n}\n\nfunction validateNumberField(\n  parentKey: string,\n  key: string,\n  value: any,\n  _def: any,\n  errors: string[]\n) {\n  const enumPath = parentKey ? `${parentKey}.${key}` : key;\n  if (typeof value !== \"number\") {\n    errors.push(`Field ${enumPath} must be number`);\n  }\n}\n\nfunction validateBooleanField(\n  parentKey: string,\n  key: string,\n  value: any,\n  _def: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  if (typeof value !== \"boolean\") {\n    errors.push(`Field ${path} must be boolean`);\n  }\n}\n\nfunction validateObjectChildren(\n  parentKey: string,\n  obj: any,\n  shape: Record<string, any>,\n  errors: string[]\n) {\n  for (const [childKey, childDef] of Object.entries(shape) as [\n    string,\n    FieldBuilder<any>\n  ][]) {\n    const childValue = obj[childKey];\n\n    // Required check\n    const { missing } = checkMissingRequired(\n      parentKey,\n      childKey,\n      childValue,\n      childDef,\n      errors\n    );\n    if (missing) continue;\n\n    // Custom validator (per-field)\n    const { invalid } = runCustomValidator(\n      parentKey,\n      childKey,\n      childValue,\n      childDef,\n      errors\n    );\n    if (invalid) continue;\n\n    // Type-specific validation (string/number/boolean/object/array/ref)\n    // This will recurse into nested objects via validateObjectField → validateObjectChildren\n    validateByType(parentKey, childKey, childValue, childDef, errors);\n  }\n}\n\nfunction validateObjectField(\n  parentKey: string,\n  key: string,\n  value: any,\n  def: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n    errors.push(`Field ${path} must be object`);\n    return;\n  }\n  const objShape = getShape(def);\n  if (objShape) validateObjectChildren(path, value, objShape, errors);\n}\n\nfunction validateArrayOfStrings(\n  parentKey: string,\n  key: string,\n  arr: any[],\n  itemDef: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  if (!arr.every((v) => typeof v === \"string\")) {\n    errors.push(`Field ${path} must be string[]`);\n    return;\n  }\n  const enumValues = getEnumValues(itemDef);\n  if (Array.isArray(enumValues)) {\n    const enumError = validateEnum(path, arr, enumValues);\n    if (enumError) {\n      errors.push(enumError);\n    }\n  }\n}\n\nfunction validateArrayOfNumbers(\n  parentKey: string,\n  key: string,\n  arr: any[],\n  itemDef: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  if (!arr.every((v) => typeof v === \"number\")) {\n    errors.push(`Field ${path} must be number[]`);\n  }\n\n  const enumValues = getEnumValues(itemDef);\n  if (Array.isArray(enumValues)) {\n    const enumError = validateEnum(path, arr, enumValues);\n    if (enumError) {\n      errors.push(enumError);\n    }\n  }\n}\n\nfunction validateArrayOfBooleans(\n  parentKey: string,\n  key: string,\n  arr: any[],\n  _itemDef: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  if (!arr.every((v) => typeof v === \"boolean\")) {\n    errors.push(`Field ${path} must be boolean[]`);\n  }\n}\n\nfunction validateArrayOfObjects(\n  parentKey: string,\n  key: string,\n  arr: any[],\n  itemDef: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n\n  if (\n    !Array.isArray(arr) ||\n    !arr.every((v) => typeof v === \"object\" && v !== null && !Array.isArray(v))\n  ) {\n    errors.push(`Field ${path} must be object[]`);\n    return;\n  }\n\n  const itemShape = getShape(itemDef);\n  if (!itemShape) return;\n\n  arr.forEach((item, idx) => {\n    const itemParent = `${path}[${idx}]`;\n    for (const [childKey, childDef] of Object.entries(itemShape) as [\n      string,\n      FieldBuilder<any>\n    ][]) {\n      const childValue = (item as any)[childKey];\n\n      // Required check (path-aware)\n      const { missing } = checkMissingRequired(\n        itemParent,\n        childKey,\n        childValue,\n        childDef,\n        errors\n      );\n      if (missing) continue;\n\n      // Custom validator (path-aware)\n      const { invalid } = runCustomValidator(\n        itemParent,\n        childKey,\n        childValue,\n        childDef,\n        errors\n      );\n      if (invalid) continue;\n\n      // Type-specific validation (recurses into nested object/array/ref)\n      validateByType(itemParent, childKey, childValue, childDef, errors);\n    }\n  });\n}\n\nfunction validateArrayField(\n  parentKey: string,\n  key: string,\n  value: any,\n  def: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  if (!Array.isArray(value)) {\n    errors.push(`Field ${key} must be an array`);\n    return;\n  }\n  const itemType = def.itemType?.type;\n  if (itemType === \"string\")\n    return validateArrayOfStrings(parentKey, key, value, def.itemType, errors);\n  if (itemType === \"number\")\n    return validateArrayOfNumbers(parentKey, key, value, def.itemType, errors);\n  if (itemType === \"boolean\")\n    return validateArrayOfBooleans(parentKey, key, value, def.itemType, errors);\n  if (itemType === \"object\")\n    return validateArrayOfObjects(parentKey, key, value, def.itemType, errors);\n  if (itemType === \"ref\") {\n    const expectedType = (def.itemType as any).refType;\n    value.forEach((ref: any, idx: number) => {\n      if (\n        !ref ||\n        typeof ref !== \"object\" ||\n        ref === null ||\n        typeof ref.type !== \"string\" ||\n        typeof ref.id !== \"string\" ||\n        (expectedType && ref.type !== expectedType)\n      ) {\n        errors.push(\n          `Field ${path}[${idx}] must be a reference object with type: ${expectedType}`\n        );\n      }\n    });\n    const refShape = getShape(def.itemType);\n    if (refShape) {\n      value.forEach((ref: any, idx: number) => {\n        if (ref && typeof ref === \"object\" && ref !== null) {\n          for (const [childKey, childDef] of Object.entries(refShape) as [\n            string,\n            FieldBuilder<any>\n          ][]) {\n            const childValue = ref[childKey];\n            if (\n              (childValue === undefined || childValue === null) &&\n              !isOptional(childDef)\n            ) {\n              errors.push(\n                `Missing required field: ${path}[${idx}].${childKey}`\n              );\n              continue;\n            }\n            const childValidator = getValidator(childDef);\n            if (\n              childValidator &&\n              childValue !== undefined &&\n              childValue !== null\n            ) {\n              const valid = childValidator(childValue);\n              if (!valid)\n                errors.push(\n                  `Invalid value for field: ${path}[${idx}].${childKey}`\n                );\n            }\n          }\n        }\n      });\n    }\n    return;\n  }\n  errors.push(`Field ${path} has unsupported array item type`);\n}\n\nfunction validateRefField(\n  parentKey: string,\n  key: string,\n  value: any,\n  _def: any,\n  errors: string[]\n) {\n  if (\n    typeof value !== \"object\" ||\n    value === null ||\n    typeof value.type !== \"string\" ||\n    typeof value.id !== \"string\"\n  ) {\n    const path = parentKey ? `${parentKey}.${key}` : key;\n    errors.push(`Field ${path} must be { type: string; id: string }`);\n  }\n}\n\nfunction validateByType(\n  parentKey: string,\n  key: string,\n  value: any,\n  def: any,\n  errors: string[]\n) {\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  switch (def.type) {\n    case \"string\":\n      return validateStringField(parentKey, key, value, def, errors);\n    case \"number\":\n      return validateNumberField(parentKey, key, value, def, errors);\n    case \"boolean\":\n      return validateBooleanField(parentKey, key, value, def, errors);\n    case \"object\":\n      return validateObjectField(parentKey, key, value, def, errors);\n    case \"array\":\n      return validateArrayField(parentKey, key, value, def, errors);\n    case \"ref\":\n      return validateRefField(parentKey, key, value, def, errors);\n    default:\n      errors.push(`Unknown type for field ${path}: ${def.type}`);\n  }\n}\n\nexport function createSchema<S extends SchemaShape>(\n  _shape: S,\n  entityType: string,\n  options: SchemaOptions = {\n    version: \"1.0.0\",\n    table: \"\",\n    schemaValidator: () => true,\n    piiEnforcement: \"none\",\n    schemaUpgrade: undefined,\n  }\n): Schema<S> {\n  const systemFields = {\n    type: field.string().immutable().system(),\n    version: field.string().immutable().system().validator(validateSemVer),\n  };\n\n  const version = options.version || \"1.0.0\";\n  const store = options.table || \"\";\n\n  // Optional schema-level upgrader supplied by the caller via options.schemaUpgrade\n  const schemaUpgrade: SchemaUpgradeSpec | undefined = (options as any)\n    .schemaUpgrade;\n\n  const schema: Schema<S> = {\n    // 🔗 Define the schema shape\n    _shape: {\n      ...systemFields,\n      ..._shape,\n    } as S,\n\n    // 🔗 Metadata about the schema\n    meta: { entityType, version },\n\n    // 🔗 Validate input against the schema\n    validate(input: unknown, existing?: Record<string, any>) {\n      const errors: string[] = [];\n      const result: any = {};\n\n      if (typeof input !== \"object\" || input === null) {\n        return { valid: false, errors: [\"Input must be an object\"] } as any;\n      }\n      // Work on a non-mutating copy that includes system defaults for first-time objects\n      const working: Record<string, any> = { ...(input as any) };\n      if (working.type == null) working.type = entityType;\n      if (working.version == null) working.version = version;\n\n      // ── Schema-level upgrade (runs once before any field checks) ─────────────\n      const fromVersion = String(working.version ?? \"0.0.0\");\n      const toVersion = String(version);\n      if (schemaUpgrade && cmpSemver(fromVersion, toVersion) < 0) {\n        const upgradeRes = applySchemaUpgrade(schemaUpgrade, { ...working }, {\n          from: fromVersion,\n          to: toVersion,\n          entityType,\n          describe: () => schema.describe(),\n        });\n        if (!upgradeRes || upgradeRes.ok !== true || !upgradeRes.value) {\n          const errs = upgradeRes?.errors?.length\n            ? upgradeRes.errors\n            : [`Failed to upgrade entity from v${fromVersion} to v${toVersion}`];\n          errors.push(...errs);\n          // Stop early if the schema-level migration itself failed\n          return { valid: false, errors } as any;\n        }\n        // Use the upgraded value as our new working copy\n        for (const k of Object.keys(working)) delete (working as any)[k];\n        Object.assign(working, upgradeRes.value);\n        // Ensure system defaults remain correct after user migration\n        working.type = entityType;\n        working.version = toVersion;\n      }\n\n      for (const key in schema._shape) {\n        const def = schema._shape[key];\n        const value = working[key];\n\n        if (!def) {\n          errors.push(`Field definition missing for: ${key}`);\n          continue;\n        }\n\n        // 1) Required\n        const { missing } = checkMissingRequired(\"\", key, value, def, errors);\n        if (missing) continue;\n\n        // 2) Immutable\n        const { immutableViolation } = checkImmutable(\n          \"\",\n          key,\n          value,\n          def,\n          existing,\n          errors\n        );\n        if (immutableViolation) continue;\n\n        // 3) PII enforcement (may short-circuit)\n        const { shortCircuit } = enforcePIIField(\n          \"\",\n          key,\n          value,\n          def,\n          options.piiEnforcement ?? \"none\",\n          errors,\n          console\n        );\n        if (shortCircuit) continue;\n\n        // A local validator for this field that returns errors instead of pushing into the outer array\n        const validateField = (val: any): string[] => {\n          const localErrors: string[] = [];\n          const { invalid } = runCustomValidator(\n            \"\",\n            key,\n            val,\n            def,\n            localErrors\n          );\n          if (!invalid) {\n            validateByType(\"\", key, val, def, localErrors);\n          }\n          return localErrors;\n        };\n\n        // First pass validation\n        let fieldValue = value;\n        let fieldErrors = validateField(fieldValue);\n\n        // Attempt upgrade if invalid and an upgrader exists and entity is older than schema\n        const entityFrom = String(working.version ?? \"0.0.0\");\n        const entityTo = String(version);\n        const fieldTo = String((def as any)._version ?? entityTo);\n        const hasUpgrader = typeof (def as any)._upgrade === \"function\";\n\n        if (\n          fieldErrors.length > 0 &&\n          hasUpgrader &&\n          cmpSemver(entityFrom, entityTo) < 0\n        ) {\n          const up = (def as any)._upgrade as (\n            value: any,\n            ctx: {\n              entityFrom: string;\n              entityTo: string;\n              fieldTo: string;\n              fieldName: string;\n            }\n          ) => { ok: boolean; value?: any; error?: string };\n\n          const res = up(fieldValue, {\n            entityFrom,\n            entityTo,\n            fieldTo,\n            fieldName: key,\n          });\n          if (res && res.ok) {\n            fieldValue = res.value;\n            fieldErrors = validateField(fieldValue);\n          } else {\n            fieldErrors.push(\n              res?.error ||\n                `Failed to upgrade field ${key} from v${entityFrom} to v${entityTo}`\n            );\n          }\n        }\n\n        result[key] = fieldValue;\n        // Apply or record errors\n        if (fieldErrors.length !== 0) {\n          errors.push(...fieldErrors);\n          continue;\n        }\n      }\n\n      if (errors.length === 0 && options.schemaValidator) {\n        const castValue = result as Infer<S>;\n        if (!options.schemaValidator(castValue)) {\n          errors.push(\"Schema-level validation failed.\");\n        }\n      }\n\n      return {\n        valid: errors.length === 0,\n        value: result as Infer<S>,\n        errors,\n      };\n    },\n\n    // specific validator for a schema to allow conditional validation\n    schemaValidator: options.schemaValidator!, // <== expose it here!\n\n    /**\n     * Runs the optional schema-level upgrade function once, without validating.\n     * Useful for offline migrations or testing migration logic.\n     */\n    upgrade(\n      input: Record<string, any>,\n      log?: (msg: string) => void\n    ): {\n      ok: boolean;\n      value?: Record<string, any>;\n      errors?: string[];\n    } {\n      const fromVersion = String((input as any)?.version ?? \"0.0.0\");\n      const toVersion = String(version);\n      if (!schemaUpgrade || cmpSemver(fromVersion, toVersion) >= 0) {\n        // Nothing to do – already current or no upgrader provided.\n        return {\n          ok: true,\n          value: { ...input, type: entityType, version: toVersion },\n        };\n      }\n      const res = applySchemaUpgrade(\n        schemaUpgrade,\n        { ...(input as any) },\n        {\n          from: fromVersion,\n          to: toVersion,\n          entityType,\n          describe: () => schema.describe(),\n          log,\n        }\n      );\n      if (res && res.ok && res.value) {\n        const out = { ...res.value, type: entityType, version: toVersion };\n        return { ok: true, value: out };\n      }\n      return {\n        ok: false,\n        errors: res?.errors?.length\n          ? res.errors\n          : [`Failed to upgrade entity from v${fromVersion} to v${toVersion}`],\n      };\n    },\n\n    /**\n     * Recursively validates entity references defined in this schema.\n     *\n     * Traverses fields of type `ref` and arrays of `ref` and resolves each target\n     * entity using the provided `resolveEntity` function. When `autoValidate` is\n     * enabled (default) and the field's `refPolicy` is `eager`, the referenced\n     * entity's schema is fetched and validated via `validateComposition` up to\n     * `maxDepth` levels.\n     *\n     * Skips fields not listed in `onlyFields` when provided. Prevents cycles via\n     * a `visited` set in `validatorContext`.\n     *\n     * @param entity The root entity to validate (must include `type` and `id`).\n     * @param options Options controlling traversal and resolution behavior.\n     * @param options.resolveEntity Function to resolve a referenced entity by type and id.\n     * @param options.validatorContext Internal context (visited set) to prevent cycles.\n     * @param options.maxDepth Maximum depth for recursive validation (default: 5).\n     * @param options.onlyFields Optional whitelist of field names to validate.\n     * @param options.log Optional logger for traversal/debug output.\n     *\n     * @throws Error if a broken reference is encountered (target cannot be resolved).\n     */\n    async validateComposition(entity, options) {\n      const {\n        resolveEntity,\n        validatorContext = { visited: new Set() },\n        maxDepth = 5,\n        log,\n      } = options;\n\n      const entityKey = `${(entity as any).type}:${(entity as any).id}`;\n      if (validatorContext.visited.has(entityKey)) {\n        log?.(`Skipping already visited entity ${entityKey}`);\n        return;\n      }\n      validatorContext.visited.add(entityKey);\n      log?.(`Validating composition for entity ${entityKey}`);\n\n      for (const [key, def] of Object.entries(schema._shape)) {\n        // NEW: skip if not in onlyFields\n        if (options.onlyFields && !options.onlyFields.includes(key)) {\n          log?.(`Skipping field ${key} (not in onlyFields)`);\n          continue;\n        }\n\n        const refType = (def as any).refType as string;\n        const autoValidate = (def as any).autoValidate !== false;\n        const refPolicy = (def as any).refPolicy ?? \"eager\";\n        const value = (entity as any)[key];\n        if (!value) continue;\n\n        if (def.type === \"ref\") {\n          const ref = value as { type: string; id: string };\n          const target = await options.resolveEntity(refType, ref.id);\n          if (!target)\n            throw new Error(\n              `Broken reference: ${refType} ${ref.id} in field ${key}`\n            );\n          log?.(`Resolved ${refType} ${ref.id} from field ${key}`);\n\n          if (autoValidate && refPolicy === \"eager\") {\n            const targetSchema = getSchemaForType(refType);\n            if (options.maxDepth! > 0 && targetSchema) {\n              await targetSchema.validateComposition(target, {\n                ...options,\n                maxDepth: options.maxDepth! - 1,\n              });\n            }\n          }\n          // Handle array of refs: type === \"array\" and itemType?.type === \"ref\"\n        } else if (def.type === \"array\" && def.itemType?.type === \"ref\") {\n          const refs = value as Array<{ type: string; id: string }>;\n          for (const ref of refs) {\n            const target = await options.resolveEntity(refType, ref.id);\n            if (!target)\n              throw new Error(\n                `Broken reference: ${refType} ${ref.id} in field ${key}`\n              );\n            log?.(`Resolved ${refType} ${ref.id} from field ${key}`);\n\n            if (autoValidate && refPolicy === \"eager\") {\n              const targetSchema = getSchemaForType(refType);\n              if (options.maxDepth! > 0 && targetSchema) {\n                await targetSchema.validateComposition(target, {\n                  ...options,\n                  maxDepth: options.maxDepth! - 1,\n                });\n              }\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Returns the configured table name for this schema.\n     *\n     * @throws Error if no store/table name has been defined for this schema.\n     */\n    tableName(): string {\n      if (!store || store === \"\") {\n        throw new Error(\"Store is not defined for this schema\");\n      }\n      return store;\n    },\n\n    /**\n     * Transforms an input object for persistence by applying PII protection\n     * according to field annotations (e.g., encryption and hashing).\n     *\n     * @param input The raw entity data.\n     * @param encryptFn Function used to encrypt sensitive values.\n     * @param hashFn Function used to hash sensitive values.\n     * @returns A new object safe to store.\n     */\n    prepareForStorage(\n      input: Record<string, any>,\n      encryptFn: (value: any) => string,\n      hashFn: (value: any) => string\n    ): Record<string, any> {\n      return piiPrepareForStorage(_shape, input, encryptFn, hashFn);\n    },\n\n    /**\n     * Reverses storage transformations for read paths (e.g., decrypts values)\n     * according to PII annotations, returning a consumer-friendly object.\n     *\n     * @param stored Data retrieved from storage.\n     * @param decryptFn Function used to decrypt values that were encrypted on write.\n     * @returns A new object suitable for application consumption.\n     */\n    prepareForRead(\n      stored: Record<string, any>,\n      decryptFn: (value: string) => any\n    ): Record<string, any> {\n      return piiPrepareForRead(_shape, stored, decryptFn);\n    },\n\n    /**\n     * Produces a log-safe copy of the provided data by redacting or pseudonymizing\n     * PII fields in accordance with field annotations.\n     *\n     * @param data Arbitrary data to sanitize for logging.\n     * @param pseudonymFn Function producing stable pseudonyms for sensitive values.\n     * @returns A copy safe to emit to logs.\n     */\n    sanitizeForLog(\n      data: Record<string, any>,\n      pseudonymFn: (value: any) => string\n    ): Record<string, any> {\n      return piiSanitizeForLog(_shape, data, pseudonymFn);\n    },\n\n    /**\n     * Returns a list of fields annotated with PII metadata for auditing purposes.\n     * Each entry includes classification, required action, and optional log policy.\n     */\n    getPiiAudit(): Array<{\n      field: string;\n      classification: PIIClassification;\n      action: PIIAction;\n      logHandling?: PIILogHandling;\n      purpose?: string;\n    }> {\n      return piiGetPiiAudit(_shape);\n    },\n\n    /**\n     * Produces a copy of stored data suitable for data deletion flows by scrubbing\n     * or blanking PII per field annotations.\n     *\n     * @param stored Data as persisted.\n     * @returns A copy with PII removed or neutralized for deletion.\n     */\n    scrubPiiForDelete(stored: Record<string, any>): Record<string, any> {\n      return piiScrubPiiForDelete(_shape, stored);\n    },\n\n    /**\n     * Returns a normalized description of the schema suitable for documentation\n     * or UI rendering (type, optionality, enum values, PII flags, etc.).\n     */\n    describe() {\n      const description: Record<string, any> = {};\n      for (const [key, def] of Object.entries(schema._shape)) {\n        description[key] = {\n          type: def.type,\n          optional: !!def.optional,\n          description: def._description ?? \"\",\n          version: def._version ?? \"\",\n          enum: getEnumValues(def as any),\n          refType: (def as any).refType ?? undefined,\n          pii: def._pii ?? undefined,\n        };\n      }\n\n      return {\n        entityType,\n        version,\n        hasSchemaUpgrade: !!schemaUpgrade,\n        shape: description,\n      };\n    },\n  };\n\n  // Register the schema globally\n  globalSchemaRegistry.set(entityType, schema);\n  return schema;\n}\n\n/**\n * Retrieves a previously registered schema by its `entityType` from the\n * in-process global schema registry.\n */\nexport function getSchemaForType(type: string): Schema<any> | undefined {\n  return globalSchemaRegistry.get(type);\n}\n\n/**\n * Returns all schemas registered in the in-process global registry.\n */\nexport function getAllSchemas(): Schema<any>[] {\n  return Array.from(globalSchemaRegistry.values());\n}\n\n/**\n * Renders a schema into a simplified descriptor for front-end consumption.\n * Intended for documentation and admin tooling rather than validation.\n */\nexport function renderSchemaDescription(\n  schema: Schema<any>\n): {\n  title: string;\n  fields: Array<{\n    name: string;\n    type: FieldType;\n    optional: boolean;\n    description: string;\n    deprecated: boolean;\n    pii?: string;\n  }>;\n} {\n  const meta = schema.describe();\n  return {\n    title: `${meta.entityType} (v${meta.version})`,\n    fields: Object.entries(meta.shape).map(([name, def]) => ({\n      name,\n      type: def.type,\n      optional: def.optional,\n      description: def.description,\n      deprecated: def.deprecated,\n      pii: def.pii ? def.pii.classification : undefined,\n    })),\n  };\n}","import { Infer } from \"./infer.js\";\nimport { createSchema } from \"./schema.js\";\nimport { Schema, SchemaShape } from \"./types.js\";\n// This module provides a registry for component schemas, allowing components to be registered and retrieved by type.\nconst componentSchemaRegistry = new Map<string, Schema<SchemaShape>>();\n\nexport function createComponentSchema<T extends SchemaShape>(\n  shape: SchemaShape,\n  name: string,\n  version: string,\n  tableName: string = \"\",\n  schemaValidator: (entity: Infer<T>) => boolean = () => true\n): Schema<SchemaShape> {\n  const schema = createSchema<T>(shape as T, name, {\n    version: version,\n    piiEnforcement: \"strict\",\n    table: tableName,\n    schemaValidator,\n  });\n  registerComponentSchema(name, schema as Schema<SchemaShape>);\n  return schema as Schema<SchemaShape>;\n}\n\nexport function registerComponentSchema(\n  type: string,\n  schema: Schema<SchemaShape>\n) {\n  componentSchemaRegistry.set(type, schema);\n}\n\nexport function getComponentSchema(\n  type: string\n): Schema<SchemaShape> | undefined {\n  return componentSchemaRegistry.get(type);\n}\n\nexport function getAllComponentSchemas(): [string, Schema<SchemaShape>][] {\n  return Array.from(componentSchemaRegistry.entries());\n}\n"],"mappings":"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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,sBAAsB,CAAC,UAA4B;AAC9D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,gBAAgB,IAAI,MAAM,YAAY,CAAC;AAChD;;;AC/PO,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA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","names":["IsoLanguageCode","options"]}