{"version":3,"file":"serialize-55EnT30e.mjs","names":[],"sources":["../src/schema/core.ts","../src/schema/serialize.ts"],"sourcesContent":["// Schema layer types — pure data, zero classes.\n//\n// A Schema<T> describes how a plain `T` is mapped to and from an XmlNode. The\n// runtime serialiser (src/schema/serialize.ts) is a single switch-on-kind walk\n// that needs nothing beyond these tables; bundlers can drop schemas a build\n// path never imports because each lives in its own const.\n//\n// Lazy element schemas (`schema: () => SideSchema`) are how circular references\n// — Border has Sides, Side has its own Color, etc. — stay expressible without\n// hoisting hazards at module load.\n\n/** Primitive coercion kinds attribute values may declare. */\nexport type Primitive = 'string' | 'int' | 'float' | 'bool';\n\nexport interface AttrDef {\n  kind: Primitive | 'enum';\n  /** Allowed values when kind === 'enum'. */\n  values?: readonly string[];\n  /** Treat the attribute as optional; missing → undefined. */\n  optional?: boolean;\n  /**\n   * Default applied during fromTree when the attribute is absent. Never\n   * auto-stripped during toTree — round-trip equivalence is the primary\n   * concern; explicit emitters decide when to omit.\n   */\n  default?: unknown;\n  /** Numeric range bounds for kind in {'int', 'float'}. */\n  min?: number;\n  max?: number;\n  /** XML attribute name when it differs from the property key on T. */\n  xmlName?: string;\n  /** Namespace URI for the XML attribute. Empty / undefined = no namespace. */\n  xmlNs?: string;\n}\n\n/**\n * Discriminated union of element shapes a schema can declare. Names are\n * unprefixed (`xmlNs` carries the namespace); the serialiser pairs them into\n * Clark names internally.\n */\nexport type ElementDef =\n  | {\n      kind: 'text';\n      /** Property key on T — the value lands at `T[key]`. */\n      key: string;\n      /** XML element local name. Defaults to `key` when omitted. */\n      name?: string;\n      xmlNs?: string;\n      primitive: Primitive;\n      optional?: boolean;\n      default?: unknown;\n      /**\n       * Fixed attributes always emitted on this element. Keys in Clark\n       * notation. On parse, attributes other than these are ignored; keep the\n       * schema strict only for the value (text content).\n       *\n       * Used for the `xsi:type=\"dcterms:W3CDTF\"` marker that docProps/core.xml\n       * emits on its <dcterms:created> / <dcterms:modified> children, and\n       * similar fixed-marker patterns.\n       */\n      attrs?: Record<string, string>;\n    }\n  | {\n      kind: 'object';\n      key: string;\n      name?: string;\n      xmlNs?: string;\n      // Schema is contravariant in T at the element boundary; named types\n      // come back via T anyway. The `any` is intentional — `unknown` would\n      // force a cast in every concrete schema definition with no extra safety.\n      // oxlint-disable-next-line typescript/no-explicit-any\n      schema: () => Schema<any>;\n      optional?: boolean;\n    }\n  | {\n      kind: 'sequence';\n      key: string;\n      /** Local name of the repeated child element. */\n      itemName: string;\n      itemNs?: string;\n      // See ElementDef.kind === 'object' for why `any` survives here.\n      // oxlint-disable-next-line typescript/no-explicit-any\n      itemSchema: () => Schema<any>;\n      /** Optional wrapper element holding the items. */\n      container?: { name: string; xmlNs?: string; count?: boolean };\n    }\n  | {\n      /**\n       * Empty marker element — `<key/>` whose presence sets `T[key] = true`,\n       * absence leaves it `undefined`. Used by Font's `<b/>`, `<i/>`, etc.\n       */\n      kind: 'empty';\n      key: string;\n      name?: string;\n      xmlNs?: string;\n    }\n  | {\n      /**\n       * `<key val=\"value\"/>` style child carrying a single primitive value via\n       * an attribute (default `val`). This is openpyxl's NestedString /\n       * NestedFloat / NestedInteger / NestedBool / NestedNoneSet pattern; it\n       * shows up across Font, NumberFormat children and several chart\n       * sub-elements.\n       */\n      kind: 'nested';\n      key: string;\n      name?: string;\n      xmlNs?: string;\n      primitive: Primitive | 'enum';\n      /** Allowed values when primitive === 'enum'. */\n      values?: readonly string[];\n      /** Attribute name carrying the value. Defaults to \"val\". */\n      valAttr?: string;\n      /** Numeric range bounds (int / float). */\n      min?: number;\n      max?: number;\n      optional?: boolean;\n      default?: unknown;\n    }\n  | {\n      /**\n       * Opaque round-trip slot — fromTree stores the matched child as a raw\n       * `XmlNode`, toTree splices it back verbatim. Used for subtrees we don't\n       * want to model in detail (e.g. the vt:vector content under app.xml's\n       * HeadingPairs / TitlesOfParts) but still need to preserve byte-for-byte\n       * through edits.\n       */\n      kind: 'raw';\n      key: string;\n      name?: string;\n      xmlNs?: string;\n      optional?: boolean;\n    };\n\nexport interface Schema<T> {\n  /** Local element name. */\n  tagname: string;\n  /** Namespace URI of this element. */\n  xmlNs?: string;\n  /** Attribute table keyed by property name on T. */\n  attrs: { readonly [K in keyof T & string]?: AttrDef };\n  /** Child elements in declaration / emission order. */\n  elements: ReadonlyArray<ElementDef>;\n  /** Hook to normalise the parsed object (e.g., infer derived fields). */\n  postParse?: (value: T, node: import('../xml/tree').XmlNode) => T;\n  /** Hook to normalise the value before serialisation. */\n  preSerialize?: (value: T) => T;\n}\n\n/**\n * Identity helper that pins inference to the supplied `T`. The runtime is just\n * `s => s`; the value matters only for the call-site type.\n */\nexport function defineSchema<T>(s: Schema<T>): Schema<T> {\n  return s;\n}\n","// Schema-driven (de)serialisation. One switch-on-kind walk in each direction;\n// the schema does the work, no class-based descriptors.\n//\n// `toTree` and `fromTree` are pure functions over plain data. They run the same\n// on the schema layer's own types and on user types in the styles / chart /\n// drawing modules.\n\nimport { OpenXmlSchemaError } from '../utils/exceptions';\nimport { qname } from '../xml/namespaces';\nimport { el, type XmlNode } from '../xml/tree';\nimport type { AttrDef, ElementDef, Primitive, Schema } from './core';\n\n// ---- coercion helpers -------------------------------------------------------\n\nconst coerceFromString = (raw: string, kind: Primitive | 'enum', def: AttrDef): unknown => {\n  switch (kind) {\n    case 'string':\n      return raw;\n    case 'int': {\n      const n = Number.parseInt(raw, 10);\n      if (!Number.isFinite(n)) throw new OpenXmlSchemaError(`expected an integer, got \"${raw}\"`);\n      if (def.min !== undefined && n < def.min) throw new OpenXmlSchemaError(`int \"${n}\" is below min ${def.min}`);\n      if (def.max !== undefined && n > def.max) throw new OpenXmlSchemaError(`int \"${n}\" is above max ${def.max}`);\n      return n;\n    }\n    case 'float': {\n      const n = Number.parseFloat(raw);\n      if (!Number.isFinite(n)) throw new OpenXmlSchemaError(`expected a number, got \"${raw}\"`);\n      if (def.min !== undefined && n < def.min) throw new OpenXmlSchemaError(`float \"${n}\" is below min ${def.min}`);\n      if (def.max !== undefined && n > def.max) throw new OpenXmlSchemaError(`float \"${n}\" is above max ${def.max}`);\n      return n;\n    }\n    case 'bool': {\n      // openpyxl accepts 'true'/'t'/'1' or 'false'/'f'/'0' (case-insensitive).\n      const v = raw.toLowerCase();\n      if (v === 'true' || v === 't' || v === '1') return true;\n      if (v === 'false' || v === 'f' || v === '0') return false;\n      throw new OpenXmlSchemaError(`expected a boolean, got \"${raw}\"`);\n    }\n    case 'enum': {\n      if (!def.values?.includes(raw)) {\n        throw new OpenXmlSchemaError(`expected one of [${def.values?.join(', ') ?? ''}], got \"${raw}\"`);\n      }\n      return raw;\n    }\n  }\n};\n\nconst coerceToString = (value: unknown, kind: Primitive | 'enum', def: AttrDef): string => {\n  switch (kind) {\n    case 'string':\n      if (typeof value !== 'string') throw new OpenXmlSchemaError(`expected a string, got ${typeof value}`);\n      return value;\n    case 'int': {\n      if (typeof value !== 'number' || !Number.isFinite(value) || !Number.isInteger(value)) {\n        throw new OpenXmlSchemaError(`expected an integer, got ${String(value)}`);\n      }\n      return String(value);\n    }\n    case 'float': {\n      if (typeof value !== 'number' || !Number.isFinite(value)) {\n        throw new OpenXmlSchemaError(`expected a number, got ${String(value)}`);\n      }\n      return String(value);\n    }\n    case 'bool': {\n      if (typeof value !== 'boolean') throw new OpenXmlSchemaError(`expected a boolean, got ${typeof value}`);\n      // OOXML convention: '1' / '0'.\n      return value ? '1' : '0';\n    }\n    case 'enum': {\n      if (typeof value !== 'string' || !def.values || !def.values.includes(value)) {\n        throw new OpenXmlSchemaError(`enum value out of range: ${String(value)}`);\n      }\n      return value;\n    }\n  }\n};\n\nconst attrXmlKey = (key: string, def: AttrDef): string => qname(def.xmlNs ?? '', def.xmlName ?? key);\nconst elementXmlName = (def: ElementDef, fallbackNs: string | undefined): string => {\n  const local = def.kind === 'sequence' ? (def.container?.name ?? def.itemName) : (def.name ?? def.key);\n  const ns = def.kind === 'sequence' ? (def.container?.xmlNs ?? def.itemNs ?? fallbackNs) : (def.xmlNs ?? fallbackNs);\n  return qname(ns ?? '', local);\n};\n\n// ---- toTree -----------------------------------------------------------------\n\n/** Serialise a value of `T` into an {@link XmlNode} per the supplied schema. */\nexport function toTree<T>(value: T, schema: Schema<T>): XmlNode {\n  const v = (schema.preSerialize ? schema.preSerialize(value) : value) as Record<string, unknown>;\n  const node = el(qname(schema.xmlNs ?? '', schema.tagname));\n\n  for (const [key, def] of Object.entries(schema.attrs) as Array<[string, AttrDef | undefined]>) {\n    if (def === undefined) continue;\n    const raw = v[key];\n    if (raw === undefined) {\n      if (def.optional) continue;\n      throw new OpenXmlSchemaError(`<${schema.tagname}>: required attribute \"${key}\" is missing`);\n    }\n    node.attrs[attrXmlKey(key, def)] = coerceToString(raw, def.kind, def);\n  }\n\n  for (const def of schema.elements) {\n    const raw = v[def.key];\n    if (raw === undefined) {\n      // 'empty' has no `optional`; presence is binary on the value itself.\n      // 'sequence' is implicitly optional (undefined / [] = no items). 'raw'\n      // uses the same optional flag as text/object.\n      if ((def.kind === 'text' || def.kind === 'object' || def.kind === 'raw') && !def.optional) {\n        throw new OpenXmlSchemaError(`<${schema.tagname}>: required element \"${def.key}\" is missing`);\n      }\n      continue;\n    }\n    switch (def.kind) {\n      case 'text': {\n        const text = coerceToString(raw, def.primitive, { kind: def.primitive });\n        node.children.push(el(elementXmlName(def, schema.xmlNs), def.attrs ?? {}, [], text));\n        break;\n      }\n      case 'empty': {\n        if (raw === true) node.children.push(el(elementXmlName(def, schema.xmlNs), {}, []));\n        break;\n      }\n      case 'nested': {\n        const valAttr = def.valAttr ?? 'val';\n        const fakeAttrDef: AttrDef = {\n          kind: def.primitive,\n          ...(def.values !== undefined ? { values: def.values } : {}),\n          ...(def.min !== undefined ? { min: def.min } : {}),\n          ...(def.max !== undefined ? { max: def.max } : {}),\n        };\n        const text = coerceToString(raw, def.primitive, fakeAttrDef);\n        node.children.push(el(elementXmlName(def, schema.xmlNs), { [valAttr]: text }, []));\n        break;\n      }\n      case 'object': {\n        const sub = toTree(raw as Record<string, unknown>, def.schema());\n        // Allow the schema to declare its own tagname OR be addressed by the\n        // parent under a different element name. We honour the schema's tagname\n        // (it's the canonical identity for that type).\n        if (def.name !== undefined && sub.name !== qname(def.xmlNs ?? schema.xmlNs ?? '', def.name)) {\n          // Re-tag the produced element to the parent-defined name.\n          sub.name = qname(def.xmlNs ?? schema.xmlNs ?? '', def.name);\n        } else if (def.name === undefined && def.key !== sub.name.replace(/^\\{[^}]*\\}/, '')) {\n          // No explicit `name` — use the property key as the local name.\n          sub.name = qname(def.xmlNs ?? schema.xmlNs ?? '', def.key);\n        }\n        node.children.push(sub);\n        break;\n      }\n      case 'raw': {\n        // Splice the stored XmlNode back verbatim, but realign its name to the\n        // schema-declared position so the output is well-formed even when the\n        // caller mutates `name`.\n        const sub = raw as XmlNode;\n        const expected = elementXmlName(def, schema.xmlNs);\n        if (sub.name !== expected) {\n          node.children.push({ ...sub, name: expected });\n        } else {\n          node.children.push(sub);\n        }\n        break;\n      }\n      case 'sequence': {\n        const items = raw as ReadonlyArray<Record<string, unknown>>;\n        const itemSchema = def.itemSchema();\n        const built = items.map((item) => {\n          const sub = toTree(item, itemSchema);\n          // Re-tag to the declared itemName / itemNs.\n          sub.name = qname(def.itemNs ?? itemSchema.xmlNs ?? '', def.itemName);\n          return sub;\n        });\n        if (def.container !== undefined) {\n          const containerAttrs: Record<string, string> = {};\n          if (def.container.count) containerAttrs['count'] = String(items.length);\n          node.children.push(el(elementXmlName(def, schema.xmlNs), containerAttrs, built));\n        } else {\n          for (const c of built) node.children.push(c);\n        }\n        break;\n      }\n    }\n  }\n\n  return node;\n}\n\n// ---- fromTree ---------------------------------------------------------------\n\nconst childByName = (node: XmlNode, fullName: string): XmlNode | undefined => {\n  for (const c of node.children) if (c.name === fullName) return c;\n  return undefined;\n};\n\nconst childrenByName = (node: XmlNode, fullName: string): XmlNode[] => {\n  const out: XmlNode[] = [];\n  for (const c of node.children) if (c.name === fullName) out.push(c);\n  return out;\n};\n\n/** Materialise a value of `T` from an {@link XmlNode} per the supplied schema. */\nexport function fromTree<T>(node: XmlNode, schema: Schema<T>): T {\n  const out: Record<string, unknown> = {};\n  const expectedTag = qname(schema.xmlNs ?? '', schema.tagname);\n  if (node.name !== expectedTag) {\n    throw new OpenXmlSchemaError(`fromTree: expected <${schema.tagname}> (Clark \"${expectedTag}\"), got \"${node.name}\"`);\n  }\n\n  for (const [key, def] of Object.entries(schema.attrs) as Array<[string, AttrDef | undefined]>) {\n    if (def === undefined) continue;\n    const xmlKey = attrXmlKey(key, def);\n    const raw = node.attrs[xmlKey];\n    if (raw === undefined) {\n      if (def.default !== undefined) out[key] = def.default;\n      else if (!def.optional) {\n        throw new OpenXmlSchemaError(`<${schema.tagname}>: required attribute \"${key}\" is missing`);\n      }\n      continue;\n    }\n    out[key] = coerceFromString(raw, def.kind, def);\n  }\n\n  for (const def of schema.elements) {\n    const fullName = elementXmlName(def, schema.xmlNs);\n    switch (def.kind) {\n      case 'text': {\n        const child = childByName(node, fullName);\n        if (child === undefined) {\n          if (def.default !== undefined) out[def.key] = def.default;\n          else if (!def.optional) {\n            throw new OpenXmlSchemaError(`<${schema.tagname}>: required text element \"${def.key}\" is missing`);\n          }\n          break;\n        }\n        out[def.key] = coerceFromString(child.text ?? '', def.primitive, { kind: def.primitive });\n        break;\n      }\n      case 'empty': {\n        const child = childByName(node, fullName);\n        if (child !== undefined) out[def.key] = true;\n        // Absent → leave key unset so the value compares equal to the\n        // round-trip-emitting input that omitted it.\n        break;\n      }\n      case 'nested': {\n        const child = childByName(node, fullName);\n        if (child === undefined) {\n          // The element itself was omitted: leave the field unset for optional\n          // nested elements, regardless of `default`. `default` here governs\n          // the \"child present but @val omitted\" case (e.g. <u/> meaning\n          // underline=single per ECMA-376 §18.4.13), not \"child entirely\n          // absent\".\n          if (!def.optional) {\n            throw new OpenXmlSchemaError(`<${schema.tagname}>: required nested element \"${def.key}\" is missing`);\n          }\n          break;\n        }\n        const valAttr = def.valAttr ?? 'val';\n        const raw = child.attrs[valAttr];\n        if (raw === undefined) {\n          if (def.default !== undefined) {\n            out[def.key] = def.default;\n            break;\n          }\n          throw new OpenXmlSchemaError(\n            `<${schema.tagname}>: nested element \"${def.key}\" missing attribute \"${valAttr}\"`,\n          );\n        }\n        out[def.key] = coerceFromString(raw, def.primitive, {\n          kind: def.primitive,\n          ...(def.values !== undefined ? { values: def.values } : {}),\n          ...(def.min !== undefined ? { min: def.min } : {}),\n          ...(def.max !== undefined ? { max: def.max } : {}),\n        });\n        break;\n      }\n      case 'raw': {\n        const child = childByName(node, fullName);\n        if (child === undefined) {\n          if (!def.optional) {\n            throw new OpenXmlSchemaError(`<${schema.tagname}>: required raw element \"${def.key}\" is missing`);\n          }\n          break;\n        }\n        out[def.key] = child;\n        break;\n      }\n      case 'object': {\n        const child = childByName(node, fullName);\n        if (child === undefined) {\n          if (!def.optional) {\n            throw new OpenXmlSchemaError(`<${schema.tagname}>: required element \"${def.key}\" is missing`);\n          }\n          break;\n        }\n        const itemSchema = def.schema();\n        // Address the child by the parent-declared name even if the child\n        // schema names itself differently.\n        const renamed: XmlNode =\n          child.name === qname(itemSchema.xmlNs ?? '', itemSchema.tagname)\n            ? child\n            : { ...child, name: qname(itemSchema.xmlNs ?? '', itemSchema.tagname) };\n        out[def.key] = fromTree(renamed, itemSchema);\n        break;\n      }\n      case 'sequence': {\n        const itemSchema = def.itemSchema();\n        const itemFullName = qname(def.itemNs ?? itemSchema.xmlNs ?? '', def.itemName);\n        const itemSchemaName = qname(itemSchema.xmlNs ?? '', itemSchema.tagname);\n        const containerNode = def.container !== undefined ? childByName(node, fullName) : node;\n        const items: unknown[] = [];\n        if (containerNode !== undefined) {\n          const matches = childrenByName(containerNode, itemFullName);\n          for (const m of matches) {\n            const renamed: XmlNode = m.name === itemSchemaName ? m : { ...m, name: itemSchemaName };\n            items.push(fromTree(renamed, itemSchema));\n          }\n        }\n        out[def.key] = items;\n        break;\n      }\n    }\n  }\n\n  const built = out as unknown as T;\n  return schema.postParse ? schema.postParse(built, node) : built;\n}\n"],"mappings":"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"}