{"version":3,"file":"date-B7-oyTGE.mjs","names":[],"sources":["../src/runtime/temporal.ts","../src/runtime/date.ts"],"sourcesContent":["import type { Temporal as TemporalTypes } from \"temporal-spec\";\n\n/**\n * Get the host Temporal implementation when a value is needed.\n * @returns Host Temporal implementation\n * @internal\n */\nexport function getTemporal(): typeof TemporalTypes {\n  const temporal = (globalThis as unknown as { Temporal?: typeof TemporalTypes }).Temporal;\n  if (!temporal) {\n    throw new ReferenceError(\n      \"Temporal is unavailable. Use the Tailor Platform runtime or the SDK tailor-runtime Vitest environment.\",\n    );\n  }\n  return temporal;\n}\n\n/**\n * Typed access to the runtime's Temporal API, without installing a polyfill.\n * Constructors are resolved on access so configuration files can load in Node.js.\n * @example\n * import { Temporal } from \"@tailor-platform/sdk/runtime\";\n * const tomorrow: Temporal.PlainDate = Temporal.Now.plainDateISO().add({ days: 1 });\n */\nexport const Temporal: typeof TemporalTypes = {\n  get PlainDate() {\n    return getTemporal().PlainDate;\n  },\n  get PlainTime() {\n    return getTemporal().PlainTime;\n  },\n  get PlainDateTime() {\n    return getTemporal().PlainDateTime;\n  },\n  get PlainYearMonth() {\n    return getTemporal().PlainYearMonth;\n  },\n  get PlainMonthDay() {\n    return getTemporal().PlainMonthDay;\n  },\n  get ZonedDateTime() {\n    return getTemporal().ZonedDateTime;\n  },\n  get Duration() {\n    return getTemporal().Duration;\n  },\n  get Instant() {\n    return getTemporal().Instant;\n  },\n  get Now() {\n    return getTemporal().Now;\n  },\n};\n\n/** Temporal instance types supplied by the SDK, independent of TypeScript's lib settings. */\n// Type-only merging supports Temporal.PlainDate annotations on the value import.\n// oxlint-disable-next-line typescript/no-namespace\nexport declare namespace Temporal {\n  /** The runtime Temporal.PlainDate instance. */\n  type PlainDate = TemporalTypes.PlainDate;\n  /** The runtime Temporal.PlainTime instance. */\n  type PlainTime = TemporalTypes.PlainTime;\n  /** The runtime Temporal.PlainDateTime instance. */\n  type PlainDateTime = TemporalTypes.PlainDateTime;\n  /** The runtime Temporal.PlainYearMonth instance. */\n  type PlainYearMonth = TemporalTypes.PlainYearMonth;\n  /** The runtime Temporal.PlainMonthDay instance. */\n  type PlainMonthDay = TemporalTypes.PlainMonthDay;\n  /** The runtime Temporal.ZonedDateTime instance. */\n  type ZonedDateTime = TemporalTypes.ZonedDateTime;\n  /** The runtime Temporal.Duration instance. */\n  type Duration = TemporalTypes.Duration;\n  /** The runtime Temporal.Instant instance. */\n  type Instant = TemporalTypes.Instant;\n}\n","import { getTemporal } from \"./temporal\";\nimport type { FieldMetadata, TailorFieldType } from \"#/configure/types/field.types\";\nimport type { Temporal } from \"temporal-spec\";\n\n/**\n * Format a Date using its UTC calendar date.\n * @param date - Date to format\n * @returns Date string in YYYY-MM-DD format\n */\nexport function formatDate(date: Date): string {\n  return formatDateTime(date).slice(0, 10);\n}\n\nfunction formatDateTime(date: Date): string {\n  const year = date.getUTCFullYear();\n  if (!Number.isFinite(year) || year < 0 || year > 9999) {\n    const received = Number.isNaN(date.getTime()) ? \"an invalid Date\" : `year ${year}`;\n    throw new RangeError(\n      `Expected a Date with a 4-digit year (0000-9999), but received ${received}`,\n    );\n  }\n  return date.toISOString();\n}\n\nfunction formatHoursMinutes(hour: number, minute: number): string {\n  return `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n}\n\nfunction formatTime(date: Date): string {\n  if (!Number.isFinite(date.getTime())) {\n    throw new RangeError(\"Expected a valid Date, but received an invalid Date\");\n  }\n  return formatHoursMinutes(date.getUTCHours(), date.getUTCMinutes());\n}\n\nfunction formatTemporal(value: Temporal.PlainDate | Temporal.Instant | Temporal.PlainTime): string {\n  const Temporal = getTemporal();\n  if (value instanceof Temporal.PlainTime) return formatHoursMinutes(value.hour, value.minute);\n  const iso = value.toString({ calendarName: \"never\" });\n  if (!/^\\d{4}-/.test(iso)) {\n    const isInstant = value instanceof Temporal.Instant;\n    throw new RangeError(\n      `Expected a Temporal.${isInstant ? \"Instant\" : \"PlainDate\"} with a 4-digit ${isInstant ? \"UTC \" : \"\"}year (0000-9999), but received ${iso}`,\n    );\n  }\n  return iso;\n}\n\ntype DateField = {\n  readonly type: TailorFieldType;\n  readonly metadata: FieldMetadata;\n  readonly fields: Record<string, DateField>;\n};\n\nfunction serialize(field: DateField, value: unknown, path: string): unknown {\n  if (field.metadata.array) {\n    if (!Array.isArray(value)) return value;\n    const converted = value.map((item, index) => serializeValue(field, item, `${path}[${index}]`));\n    return converted.every((item, index) => item === value[index]) ? value : converted;\n  }\n  return serializeValue(field, value, path);\n}\n\nfunction describePathTarget(path: string): string {\n  return path || \"the top-level value\";\n}\n\nconst MAX_DESCRIBED_VALUE_LENGTH = 100;\nconst MAX_DESCRIBED_ARRAY_SAMPLE = 100;\n\nfunction truncateForDescription(text: string): string {\n  return text.length > MAX_DESCRIBED_VALUE_LENGTH\n    ? `${text.slice(0, MAX_DESCRIBED_VALUE_LENGTH)}...`\n    : text;\n}\n\nfunction describeReceivedValue(value: unknown): string {\n  if (Array.isArray(value)) {\n    const sample = value.slice(0, MAX_DESCRIBED_ARRAY_SAMPLE);\n    const elementTypes = [...new Set(Array.from(sample, (item) => typeof item))];\n    return elementTypes.length > 0 ? `an array of ${elementTypes.join(\"/\")}` : \"an empty array\";\n  }\n  if (typeof value === \"string\")\n    return `a string (${JSON.stringify(truncateForDescription(value))})`;\n  const type = typeof value;\n  if (type === \"object\") return \"an object\";\n  if (type === \"function\") return \"a function\";\n  return `a ${type} (${truncateForDescription(String(value))})`;\n}\n\nfunction serializeValue(field: DateField, value: unknown, path: string): unknown {\n  if (value === null || value === undefined) return value;\n  const { type } = field;\n  const isDateTimeField = type === \"date\" || type === \"datetime\" || type === \"time\";\n  const as = field.metadata.as;\n  if (isDateTimeField && (as === \"date\" || as === \"temporal\")) {\n    const expected =\n      as === \"date\"\n        ? Date\n        : type === \"date\"\n          ? getTemporal().PlainDate\n          : type === \"datetime\"\n            ? getTemporal().Instant\n            : getTemporal().PlainTime;\n    if (!(value instanceof expected)) {\n      const name = as === \"date\" ? \"Date\" : `Temporal.${expected.name}`;\n      throw new TypeError(\n        `Expected a ${name} instance at ${describePathTarget(path)}, but received ${describeReceivedValue(value)}`,\n      );\n    }\n    try {\n      if (value instanceof Date) {\n        if (type === \"datetime\") return formatDateTime(value);\n        if (type === \"time\") return formatTime(value);\n        return formatDate(value);\n      }\n      return formatTemporal(value);\n    } catch (error) {\n      const reason = error instanceof Error ? error.message : String(error);\n      throw new RangeError(`Invalid date at ${describePathTarget(path)}: ${reason}`, {\n        cause: error,\n      });\n    }\n  }\n  if (type !== \"nested\" || typeof value !== \"object\" || Array.isArray(value)) return value;\n  const record = value as Record<string, unknown>;\n  let result = record;\n  for (const [key, child] of Object.entries(field.fields)) {\n    const converted = serialize(child, record[key], path ? `${path}.${key}` : key);\n    if (converted !== record[key]) {\n      if (result === record) result = { ...record };\n      Object.defineProperty(result, key, {\n        value: converted,\n        enumerable: true,\n        configurable: true,\n        writable: true,\n      });\n    }\n  }\n  return result;\n}\n\n/**\n * Convert fields using Date or Temporal representations to date, datetime, or time strings.\n * @param field - Field defining the value's shape\n * @param value - Value to serialize\n * @returns Value with Date and Temporal fields converted to strings\n * @internal\n */\nexport function serializeDateFields(field: DateField, value: unknown): unknown {\n  return serialize(field, value, \"\");\n}\n"],"mappings":"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"}