@json-to-office/shared-docx 0.37.0 → 0.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/{chunk-K367M7TI.js → chunk-E5EWXZWO.js} +2 -2
  2. package/dist/{chunk-OUSJFBMX.js → chunk-HPZPUB6J.js} +2 -2
  3. package/dist/{chunk-WDRYTKHA.js → chunk-IU2F2FYO.js} +2 -2
  4. package/dist/{chunk-WOFU72HH.js → chunk-JF5ZJQNR.js} +41 -2
  5. package/dist/chunk-JF5ZJQNR.js.map +1 -0
  6. package/dist/{chunk-GGAJWGDI.js → chunk-LATN6QG6.js} +2 -2
  7. package/dist/{chunk-K2LA6WCD.js → chunk-PMZEVOBL.js} +2 -2
  8. package/dist/{chunk-HMNKQ7BT.js → chunk-W523ZTYH.js} +4 -4
  9. package/dist/chunk-W523ZTYH.js.map +1 -0
  10. package/dist/{chunk-HYY4ZOYL.js → chunk-XR7ZEDXZ.js} +78 -29
  11. package/dist/chunk-XR7ZEDXZ.js.map +1 -0
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.js +10 -8
  14. package/dist/index.js.map +1 -1
  15. package/dist/schemas/api.js +3 -3
  16. package/dist/schemas/component-registry.js +1 -1
  17. package/dist/schemas/components.js +2 -2
  18. package/dist/schemas/document.js +4 -4
  19. package/dist/schemas/export.js +2 -2
  20. package/dist/schemas/generator.js +2 -2
  21. package/dist/validation/unified/index.d.ts +2 -1
  22. package/dist/validation/unified/index.js +6 -4
  23. package/package.json +1 -1
  24. package/dist/chunk-HMNKQ7BT.js.map +0 -1
  25. package/dist/chunk-HYY4ZOYL.js.map +0 -1
  26. package/dist/chunk-WOFU72HH.js.map +0 -1
  27. /package/dist/{chunk-K367M7TI.js.map → chunk-E5EWXZWO.js.map} +0 -0
  28. /package/dist/{chunk-OUSJFBMX.js.map → chunk-HPZPUB6J.js.map} +0 -0
  29. /package/dist/{chunk-WDRYTKHA.js.map → chunk-IU2F2FYO.js.map} +0 -0
  30. /package/dist/{chunk-GGAJWGDI.js.map → chunk-LATN6QG6.js.map} +0 -0
  31. /package/dist/{chunk-K2LA6WCD.js.map → chunk-PMZEVOBL.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ComponentDefinitionSchema
3
- } from "./chunk-K2LA6WCD.js";
3
+ } from "./chunk-PMZEVOBL.js";
4
4
 
5
5
  // src/schemas/document.ts
6
6
  var JsonComponentDefinitionSchema = ComponentDefinitionSchema;
@@ -31,4 +31,4 @@ export {
31
31
  JsonComponentDefinitionSchema,
32
32
  JSON_SCHEMA_URLS
33
33
  };
34
- //# sourceMappingURL=chunk-K367M7TI.js.map
34
+ //# sourceMappingURL=chunk-E5EWXZWO.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ComponentDefinitionSchema
3
- } from "./chunk-K2LA6WCD.js";
3
+ } from "./chunk-PMZEVOBL.js";
4
4
 
5
5
  // src/schemas/api.ts
6
6
  import { Type } from "@sinclair/typebox";
@@ -105,4 +105,4 @@ export {
105
105
  GenerateDocumentResponseSchema,
106
106
  ValidateDocumentResponseSchema
107
107
  };
108
- //# sourceMappingURL=chunk-OUSJFBMX.js.map
108
+ //# sourceMappingURL=chunk-HPZPUB6J.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getContainerComponents
3
- } from "./chunk-WOFU72HH.js";
3
+ } from "./chunk-JF5ZJQNR.js";
4
4
 
5
5
  // src/schemas/export.ts
6
6
  import { restructureNameDiscriminatedUnions } from "@json-to-office/shared";
@@ -274,4 +274,4 @@ export {
274
274
  BASE_SCHEMA_METADATA,
275
275
  THEME_SCHEMA_METADATA
276
276
  };
277
- //# sourceMappingURL=chunk-WDRYTKHA.js.map
277
+ //# sourceMappingURL=chunk-IU2F2FYO.js.map
@@ -255,7 +255,46 @@ var TextBoxPropsSchema = Type2.Object(
255
255
  )
256
256
  )
257
257
  },
258
- { additionalProperties: false }
258
+ {
259
+ additionalProperties: false,
260
+ /**
261
+ * The same two shape limits `collectTextBoxShapeConflicts` enforces, said
262
+ * in JSON Schema so an editor can say it too.
263
+ *
264
+ * The deep validator only runs when a document is generated, so until now
265
+ * an author learned that a shape needs a height by pressing Run. These are
266
+ * plain cross-field rules, and `if`/`then` expresses them — which is what
267
+ * Monaco checks the buffer against, so the editor underlines the mistake
268
+ * while it is being made. The deep validator stays as the backstop: it
269
+ * carries the remediation text, and it is what the API enforces for
270
+ * callers who never see an editor.
271
+ */
272
+ allOf: [
273
+ {
274
+ if: {
275
+ properties: { renderAs: { const: "shape" } },
276
+ required: ["renderAs"]
277
+ },
278
+ then: {
279
+ required: ["width", "height"],
280
+ properties: {
281
+ style: {
282
+ properties: {
283
+ border: {
284
+ properties: Object.fromEntries(
285
+ ["top", "right", "bottom", "left"].map((side) => [
286
+ side,
287
+ { properties: { style: { enum: ["solid", "none"] } } }
288
+ ])
289
+ )
290
+ }
291
+ }
292
+ }
293
+ }
294
+ }
295
+ }
296
+ ]
297
+ }
259
298
  );
260
299
 
261
300
  // src/schemas/components/toc.ts
@@ -853,4 +892,4 @@ export {
853
892
  createAllComponentSchemas,
854
893
  createAllComponentSchemasNarrowed
855
894
  };
856
- //# sourceMappingURL=chunk-WOFU72HH.js.map
895
+ //# sourceMappingURL=chunk-JF5ZJQNR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/component-registry.ts","../src/schemas/components/report.ts","../src/schemas/components/text-box.ts","../src/schemas/components/toc.ts","../src/schemas/components/highcharts.ts","../src/schemas/components/visual.ts"],"sourcesContent":["/**\n * Component Registry - SINGLE SOURCE OF TRUTH\n *\n * This is the ONLY place where standard components are defined.\n * All schema generators MUST use this registry.\n *\n * Adding a new component: Add it to STANDARD_COMPONENTS_REGISTRY below.\n * It will automatically be included in:\n * - StandardComponentDefinitionSchema (components.ts)\n * - ComponentDefinitionSchema (components.ts)\n * - generateUnifiedDocumentSchema (generator.ts)\n * - Monaco editor autocomplete\n * - Build-time JSON schemas\n */\n\nimport { Type, TSchema } from '@sinclair/typebox';\n// Import directly from individual component files to avoid circular dependency\n// (components.ts imports from this file, so we can't import from components.ts)\nimport { ReportPropsSchema } from './components/report';\nimport {\n SectionPropsSchema,\n createSectionPropsSchema,\n} from './components/section';\nimport { ColumnsPropsSchema } from './components/columns';\nimport { HeadingPropsSchema } from './components/heading';\nimport { ParagraphPropsSchema } from './components/paragraph';\nimport { TextBoxPropsSchema } from './components/text-box';\nimport { ImagePropsSchema } from './components/image';\nimport { StatisticPropsSchema } from './components/statistic';\nimport { TablePropsSchema, createTablePropsSchema } from './components/table';\nimport { ListPropsSchema } from './components/list';\nimport { TocPropsSchema } from './components/toc';\nimport { HighchartsPropsSchema } from './components/highcharts';\nimport { VisualPropsSchema } from './components/visual';\n\n/**\n * Component definition with metadata\n */\nexport interface StandardComponentDefinition {\n /** Component name identifier (e.g., 'heading', 'text', 'toc') */\n name: string;\n /** TypeBox schema for the component's props */\n propsSchema: TSchema;\n /** Whether this component can contain children */\n hasChildren: boolean;\n /**\n * Names of standard components allowed as direct children.\n * Only meaningful when hasChildren is true.\n * Plugin components are always allowed in addition to these.\n * Omit to allow the full recursive union (backward-compat).\n */\n allowedChildren?: readonly string[];\n /**\n * Factory that builds props with a live recursive ref (e.g., for section\n * header/footer, table cell content). When present and a recursive ref is\n * available, used instead of the static `propsSchema`.\n */\n createPropsSchema?: (recursiveRef: TSchema) => TSchema;\n /** Component category for organization */\n category: 'container' | 'content' | 'layout';\n /** Human-readable description */\n description: string;\n /** Special flags for this component */\n special?: {\n /** Has $schema field (only 'docx') */\n hasSchemaField?: boolean;\n };\n}\n\n/**\n * SINGLE SOURCE OF TRUTH for all standard components\n *\n * This is the ONLY place where standard components are defined.\n * All schema generators MUST use this registry.\n *\n * IMPORTANT: When adding a new component:\n * 1. Add the component definition to this array\n * 2. Import its props schema at the top of this file\n * 3. That's it! The component will automatically appear everywhere.\n */\nexport const STANDARD_COMPONENTS_REGISTRY: readonly StandardComponentDefinition[] =\n [\n // ========================================================================\n // Container Components (can contain children)\n // ========================================================================\n {\n name: 'docx',\n propsSchema: ReportPropsSchema,\n hasChildren: true,\n allowedChildren: ['section'],\n category: 'container',\n description:\n 'Main document container - defines the overall document structure. Required as the root component.',\n special: {\n hasSchemaField: true, // Only docx root has $schema field\n },\n },\n {\n name: 'section',\n propsSchema: SectionPropsSchema,\n createPropsSchema: createSectionPropsSchema,\n hasChildren: true,\n allowedChildren: [\n 'heading',\n 'paragraph',\n 'image',\n 'statistic',\n 'table',\n 'list',\n 'toc',\n 'highcharts',\n 'visual',\n 'columns',\n 'text-box',\n ],\n category: 'container',\n description:\n 'Section container - groups related content with optional title. Use for organizing document structure.',\n },\n {\n name: 'columns',\n propsSchema: ColumnsPropsSchema,\n hasChildren: true,\n allowedChildren: [\n 'heading',\n 'paragraph',\n 'image',\n 'statistic',\n 'table',\n 'list',\n 'toc',\n 'highcharts',\n 'visual',\n 'text-box',\n ],\n category: 'layout',\n description:\n 'Multi-column layout - arranges content in 2-4 columns. Great for side-by-side content.',\n },\n {\n name: 'text-box',\n propsSchema: TextBoxPropsSchema,\n hasChildren: true,\n allowedChildren: ['heading', 'paragraph', 'image'],\n category: 'layout',\n description:\n 'Floating text container - allows positioning text anywhere on the page with absolute or relative positioning.',\n },\n\n // ========================================================================\n // Content Components (leaf nodes, no children)\n // ========================================================================\n {\n name: 'heading',\n propsSchema: HeadingPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Heading text - supports levels 1-6 for document hierarchy. Level 1 is largest.',\n },\n {\n name: 'paragraph',\n propsSchema: ParagraphPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Paragraph text - supports formatting like bold, italic, and color. Main content element.',\n },\n {\n name: 'image',\n propsSchema: ImagePropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Image element - displays images with optional caption. Supports various formats.',\n },\n {\n name: 'statistic',\n propsSchema: StatisticPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Statistic display - shows a number with description. Perfect for KPIs and metrics.',\n },\n {\n name: 'table',\n propsSchema: TablePropsSchema,\n createPropsSchema: createTablePropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Data table - displays tabular data with headers. Supports formatting and alignment.',\n },\n {\n name: 'list',\n propsSchema: ListPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'List element - bulleted or numbered list items. Supports nested lists.',\n },\n {\n name: 'toc',\n propsSchema: TocPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Table of contents - automatically generates TOC from document headings. Supports depth ranges and custom styles.',\n },\n {\n name: 'highcharts',\n propsSchema: HighchartsPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Chart component powered by Highcharts - render line, bar, pie, heatmap, and more with rich options.',\n },\n {\n name: 'visual',\n propsSchema: VisualPropsSchema,\n hasChildren: false,\n category: 'content',\n description:\n 'Free-canvas graphic authored as a single pptx slide and embedded as a rasterized PNG. Use for infographics, diagrams and layered compositions that the document flow cannot express.',\n },\n ] as const;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get a component definition by name\n */\nexport function getStandardComponent(\n name: string\n): StandardComponentDefinition | undefined {\n return STANDARD_COMPONENTS_REGISTRY.find((c) => c.name === name);\n}\n\n/**\n * Get all standard component names\n */\nexport function getAllStandardComponentNames(): readonly string[] {\n return STANDARD_COMPONENTS_REGISTRY.map((c) => c.name);\n}\n\n/**\n * Get components by category\n */\nexport function getComponentsByCategory(\n category: StandardComponentDefinition['category']\n): readonly StandardComponentDefinition[] {\n return STANDARD_COMPONENTS_REGISTRY.filter((c) => c.category === category);\n}\n\n/**\n * Get container components (components that can have children)\n */\nexport function getContainerComponents(): readonly StandardComponentDefinition[] {\n return STANDARD_COMPONENTS_REGISTRY.filter((c) => c.hasChildren);\n}\n\n/**\n * Get content components (components that cannot have children)\n */\nexport function getContentComponents(): readonly StandardComponentDefinition[] {\n return STANDARD_COMPONENTS_REGISTRY.filter((c) => !c.hasChildren);\n}\n\n/**\n * Check if a component name is a standard component\n */\nexport function isStandardComponent(name: string): boolean {\n return STANDARD_COMPONENTS_REGISTRY.some((c) => c.name === name);\n}\n\n// ============================================================================\n// Schema Generation Helpers\n// ============================================================================\n\n/**\n * True when a props schema rejects `{}`, i.e. the `props` key cannot be omitted.\n *\n * Only object schemas are inspected. Anything else (a union, a bare ref) is\n * treated as demanding props, preserving the previous stricter behavior for\n * shapes this cannot reason about.\n */\nfunction demandsProps(propsSchema: TSchema): boolean {\n const schema = propsSchema as { type?: string; required?: readonly string[] };\n return schema.type !== 'object' || (schema.required?.length ?? 0) > 0;\n}\n\n/**\n * Generate TypeBox schema object for a component.\n *\n * @param component - Component definition from the registry\n * @param childrenType - Schema for children items. For containers this should be\n * a narrowed union of allowed children; for leaves omit it.\n * @returns TypeBox schema object for the component\n */\nexport function createComponentSchemaObject(\n component: StandardComponentDefinition,\n childrenType?: TSchema,\n selfRef?: TSchema\n): TSchema {\n const schema: Record<string, TSchema> = {\n name: Type.Literal(component.name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'When false, this component is filtered out and not rendered. Defaults to true. Useful for conditional component inclusion.',\n })\n ),\n };\n\n // Special handling for report component (has $schema field)\n if (component.special?.hasSchemaField) {\n schema.$schema = Type.Optional(Type.String({ format: 'uri' }));\n }\n\n // selfRef (full union) is intentionally passed to createPropsSchema so that\n // header/footer sub-schemas and table cell content can reference any component.\n const propsSchema =\n component.createPropsSchema && selfRef\n ? component.createPropsSchema(selfRef)\n : component.propsSchema;\n\n // `props` is required only when the props schema itself demands a field.\n // The runtime validator treats an omitted `props` as `{}` and lets the props\n // schema decide (see deep-validator.ts), so `section`, `toc`, `image` and\n // `text-box` are legal without the key. Exporting `props` as unconditionally\n // required reddened documents that build: the playground flagged all 23\n // propless sections in the shipped tech-report template while every runtime\n // gate stayed green. The root `docx` node already carried this fix locally in\n // generator.ts; this generalizes it to every component.\n schema.props = demandsProps(propsSchema)\n ? propsSchema\n : Type.Optional(propsSchema);\n\n // Add children support if applicable. The root component requires its\n // `children` array — deep-validator.ts enforces the same rule, but only on\n // the fallback path it takes when the TypeBox check already failed. That\n // made the rule fire only as a side effect of `props` being required, so\n // relaxing `props` above would silently retire it. Nested containers may\n // legitimately be empty.\n if (component.hasChildren && childrenType) {\n schema.children = component.special?.hasSchemaField\n ? Type.Array(childrenType)\n : Type.Optional(Type.Array(childrenType));\n }\n\n return Type.Object(schema, {\n additionalProperties: false,\n description: component.description,\n });\n}\n\n/**\n * Generate an array of TypeBox schemas for all standard components.\n * Uses a flat recursive ref for all containers (legacy behavior).\n *\n * @param recursiveRef - Optional recursive reference for children\n * @returns Array of TypeBox schemas for all components in the registry\n */\nexport function createAllComponentSchemas(\n recursiveRef?: TSchema\n): readonly TSchema[] {\n return STANDARD_COMPONENTS_REGISTRY.map((component) =>\n createComponentSchemaObject(component, recursiveRef)\n );\n}\n\n/**\n * Build all standard component schemas with per-container narrowed children.\n *\n * Resolves containers in dependency order so each container's children union\n * only references its allowedChildren. Plugin schemas are always included in\n * every container's children.\n *\n * @param selfRef - The Type.Recursive self-reference (used as fallback and for plugin children)\n * @param pluginSchemas - Plugin component schemas (always allowed in all containers)\n * @returns schemas array and a byName map for direct lookups\n */\nexport function createAllComponentSchemasNarrowed(\n selfRef: TSchema,\n pluginSchemas: TSchema[] = []\n): { schemas: TSchema[]; byName: Map<string, TSchema> } {\n // Phase 1: Build leaf (non-container) component schemas — no children\n // selfRef is passed so factories (e.g. table) can wire up recursive refs.\n const leafSchemas = new Map<string, TSchema>();\n for (const comp of STANDARD_COMPONENTS_REGISTRY) {\n if (!comp.hasChildren) {\n leafSchemas.set(\n comp.name,\n createComponentSchemaObject(comp, undefined, selfRef)\n );\n }\n }\n\n // Phase 2: Resolve containers in dependency order\n const containers = STANDARD_COMPONENTS_REGISTRY.filter((c) => c.hasChildren);\n const resolved = new Map<string, TSchema>();\n const pending = [...containers];\n\n while (pending.length > 0) {\n const before = pending.length;\n for (let i = pending.length - 1; i >= 0; i--) {\n const comp = pending[i];\n\n if (!comp.allowedChildren) {\n // No allowedChildren declared — fallback to full recursive ref\n resolved.set(\n comp.name,\n createComponentSchemaObject(comp, selfRef, selfRef)\n );\n pending.splice(i, 1);\n continue;\n }\n\n // Check if all container dependencies are resolved\n const containerDeps = comp.allowedChildren.filter((name) =>\n containers.some((c) => c.name === name)\n );\n if (!containerDeps.every((d) => resolved.has(d))) continue;\n\n // Build narrowed children union\n const childSchemas = comp.allowedChildren\n .map((name) => resolved.get(name) ?? leafSchemas.get(name))\n .filter((s): s is TSchema => s !== undefined);\n\n const allChildSchemas = [...childSchemas, ...pluginSchemas];\n const childrenType =\n allChildSchemas.length === 1\n ? allChildSchemas[0]\n : Type.Union(allChildSchemas);\n\n resolved.set(\n comp.name,\n createComponentSchemaObject(comp, childrenType, selfRef)\n );\n pending.splice(i, 1);\n }\n\n if (pending.length === before) {\n throw new Error(\n `Circular allowedChildren among: ${pending.map((c) => c.name).join(', ')}`\n );\n }\n }\n\n // Combine: containers (resolved) + leaves\n const byName = new Map([...resolved, ...leafSchemas]);\n return { schemas: [...byName.values()], byName };\n}\n","/**\n * Report Component Schema\n */\n\nimport { Type, Static, TSchema } from '@sinclair/typebox';\nimport { FontRegistrySchema } from '@json-to-office/shared';\nimport { ComponentDefaultsSchema } from '../component-defaults';\nimport { NoProofWordsSchema } from '../font';\nimport { ThemeOverridesSchema } from '../theme';\n\n// Create a function to generate ReportPropsSchema with recursive component reference\nexport const createReportPropsSchema = (_componentRef?: TSchema) =>\n Type.Object(\n {\n theme: Type.Optional(\n Type.String({\n description: 'Theme name to apply (default: \"minimal\")',\n examples: ['minimal', 'corporate', 'modern'],\n default: 'minimal',\n })\n ),\n themeOverrides: Type.Optional(ThemeOverridesSchema),\n fontRegistry: Type.Optional(FontRegistrySchema),\n componentDefaults: Type.Optional(ComponentDefaultsSchema),\n language: Type.Optional(\n Type.String({\n pattern: '^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$',\n description:\n 'Default document language (BCP-47 tag, e.g. \"en-US\"). Sets Word\\'s default proofing/spell-check language; individual components can override it locally.',\n examples: ['en-US', 'fr-FR', 'de-DE', 'it-IT', 'es-ES'],\n })\n ),\n noProofWords: Type.Optional(NoProofWordsSchema),\n trackRevisions: Type.Optional(\n Type.Boolean({\n description:\n 'Open the document in track-changes mode: Word marks any further edits as revisions. Set automatically on redline documents produced by the diff engine',\n })\n ),\n metadata: Type.Optional(\n Type.Object(\n {\n title: Type.Optional(\n Type.String({\n description: 'Document title',\n examples: ['Annual Report 2024', 'Technical Documentation'],\n })\n ),\n subtitle: Type.Optional(\n Type.String({\n description: 'Document subtitle',\n })\n ),\n description: Type.Optional(Type.String()),\n author: Type.Optional(Type.String()),\n company: Type.Optional(\n Type.String({\n description:\n 'Company name, written to docProps/custom.xml (Word has no core-property slot for it)',\n })\n ),\n date: Type.Optional(\n Type.String({\n description:\n 'Document date used by {DATE}/{DATETIME} placeholders (defaults to the generation timestamp)',\n })\n ),\n version: Type.Optional(\n Type.String({\n description: 'Document version, written to docProps/custom.xml',\n examples: ['1.0', '2024.3'],\n })\n ),\n tags: Type.Optional(Type.Array(Type.String())),\n },\n {\n description:\n 'Document metadata (title, author, company, version, etc.). Package timestamps (dcterms:created/modified) are not part of this object: they come from the `generatedAt` generation option so repeated builds stay byte-identical.',\n additionalProperties: false,\n }\n )\n ),\n },\n {\n description: 'Report component props',\n additionalProperties: false,\n }\n );\n\nexport const ReportPropsSchema = createReportPropsSchema();\n\nexport type ReportProps = Static<typeof ReportPropsSchema>;\n","/**\n * Text Box Component Schema\n * A floating container that can hold child components (e.g., text, image, columns)\n *\n * Positioning API mirrors existing floating options from text/image for consistency.\n *\n * **Nested Columns Support:**\n * When a `columns` component is nested inside a `text-box`, it automatically renders\n * as a multi-column table instead of a section-level column layout. This allows\n * for columnar content within floating or inline containers.\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport { FloatingPropertiesSchema } from './common';\nimport { HexColorSchema } from '../font';\n\nexport const TextBoxPropsSchema = Type.Object(\n {\n width: Type.Optional(\n Type.Union(\n [\n Type.Number({\n minimum: 1,\n description: 'Text box width in pixels',\n }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description:\n 'Text box width as percentage (e.g., \"50%\") relative to content width',\n }),\n ],\n {\n description:\n 'Text box width in pixels (number) or as percentage string (e.g., \"50%\")',\n }\n )\n ),\n height: Type.Optional(\n Type.Union(\n [\n Type.Number({\n minimum: 1,\n description: 'Text box height in pixels',\n }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description:\n 'Text box height as percentage (e.g., \"50%\") relative to content height',\n }),\n ],\n {\n description:\n 'Text box height in pixels (number) or as percentage string (e.g., \"50%\")',\n }\n )\n ),\n renderAs: Type.Optional(\n Type.Union([Type.Literal('table'), Type.Literal('shape')], {\n description:\n \"Rendering strategy. 'table' (default): borderless one-cell table — height auto-fits content, per-side borders and percentage widths resolve in Word. 'shape': native Word text box (WPS shape) — real wrap modes and z-order, but requires explicit width and height (no autofit), a single uniform border, and eagerly-resolved percentage sizes.\",\n })\n ),\n floating: Type.Optional(FloatingPropertiesSchema),\n style: Type.Optional(\n Type.Object(\n {\n padding: Type.Optional(\n Type.Object(\n {\n top: Type.Optional(Type.Number({ minimum: 0 })),\n right: Type.Optional(Type.Number({ minimum: 0 })),\n bottom: Type.Optional(Type.Number({ minimum: 0 })),\n left: Type.Optional(Type.Number({ minimum: 0 })),\n },\n { additionalProperties: false }\n )\n ),\n border: Type.Optional(\n Type.Object(\n {\n top: Type.Optional(\n // Reuse border schema semantics: style/width/color\n Type.Object(\n {\n style: Type.Optional(\n Type.Union([\n Type.Literal('solid'),\n Type.Literal('dashed'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('none'),\n ])\n ),\n width: Type.Optional(Type.Number({ minimum: 0 })),\n color: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n right: Type.Optional(\n Type.Object(\n {\n style: Type.Optional(\n Type.Union([\n Type.Literal('solid'),\n Type.Literal('dashed'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('none'),\n ])\n ),\n width: Type.Optional(Type.Number({ minimum: 0 })),\n color: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n bottom: Type.Optional(\n Type.Object(\n {\n style: Type.Optional(\n Type.Union([\n Type.Literal('solid'),\n Type.Literal('dashed'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('none'),\n ])\n ),\n width: Type.Optional(Type.Number({ minimum: 0 })),\n color: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n left: Type.Optional(\n Type.Object(\n {\n style: Type.Optional(\n Type.Union([\n Type.Literal('solid'),\n Type.Literal('dashed'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('none'),\n ])\n ),\n width: Type.Optional(Type.Number({ minimum: 0 })),\n color: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n },\n { additionalProperties: false }\n )\n ),\n shading: Type.Optional(\n Type.Object(\n {\n // Same domain as every other colour prop and as the border\n // colours above: resolveColor() accepts \"#RRGGBB\" or a theme\n // colour name, and throws on anything else at render time.\n fill: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n )\n ),\n },\n { additionalProperties: false }\n )\n ),\n },\n {\n additionalProperties: false,\n /**\n * The same two shape limits `collectTextBoxShapeConflicts` enforces, said\n * in JSON Schema so an editor can say it too.\n *\n * The deep validator only runs when a document is generated, so until now\n * an author learned that a shape needs a height by pressing Run. These are\n * plain cross-field rules, and `if`/`then` expresses them — which is what\n * Monaco checks the buffer against, so the editor underlines the mistake\n * while it is being made. The deep validator stays as the backstop: it\n * carries the remediation text, and it is what the API enforces for\n * callers who never see an editor.\n */\n allOf: [\n {\n if: {\n properties: { renderAs: { const: 'shape' } },\n required: ['renderAs'],\n },\n then: {\n required: ['width', 'height'],\n properties: {\n style: {\n properties: {\n border: {\n properties: Object.fromEntries(\n ['top', 'right', 'bottom', 'left'].map((side) => [\n side,\n { properties: { style: { enum: ['solid', 'none'] } } },\n ])\n ),\n },\n },\n },\n },\n },\n },\n ],\n }\n);\n\nexport type TextBoxProps = Static<typeof TextBoxPropsSchema>;\n","/**\n * Table of Contents Component Schema\n */\n\nimport { Type, Static } from '@sinclair/typebox';\n\n/**\n * Kept for back-compat only. Word's TOC field has no numbering switch, so the\n * renderer cannot apply this and logs a warning when it is set; entries inherit\n * the numbering of the heading styles they reference.\n */\nexport const TocStyleSchema = Type.Union(\n [Type.Literal('numeric'), Type.Literal('bullet'), Type.Literal('none')],\n {\n description:\n 'TOC numbering style — accepted but not applied (Word TOC fields carry no numbering switch); setting it logs a warning during generation',\n }\n);\n\nexport const TocScopeSchema = Type.Union(\n [Type.Literal('document'), Type.Literal('section')],\n { description: 'TOC scope: document-wide or section-only' }\n);\n\nexport const TocStyleMappingSchema = Type.Object(\n {\n styleId: Type.String({\n description: 'Custom style ID matching a key in theme.styles',\n }),\n level: Type.Number({\n minimum: 1,\n maximum: 6,\n description: 'TOC level (1-6) to assign to this style',\n }),\n },\n {\n description: 'Mapping of custom style to TOC level',\n additionalProperties: false,\n }\n);\n\nexport const TocDepthRangeSchema = Type.Object(\n {\n from: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 1,\n description:\n 'Starting heading level (1-6). Defaults to 1 if not specified.',\n })\n ),\n to: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 3,\n description:\n 'Ending heading level (1-6). Defaults to 3 if not specified.',\n })\n ),\n },\n {\n description:\n 'Range of heading levels to include in TOC. Specify at least one of \"from\" or \"to\".',\n additionalProperties: false,\n }\n);\n\nexport const TocPropsSchema = Type.Object(\n {\n pageBreak: Type.Optional(\n Type.Boolean({\n description: 'Insert page break before TOC block',\n })\n ),\n depth: Type.Optional(\n Type.Object(\n {\n from: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 1,\n description:\n 'Starting heading level (1-6). Defaults to 1 if not specified.',\n })\n ),\n to: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 3,\n description:\n 'Ending heading level (1-6). Defaults to 3 if not specified.',\n })\n ),\n },\n {\n description:\n 'Range of heading levels to include in TOC. Specify \"from\", \"to\", or both. Defaults: from=1, to=3',\n additionalProperties: false,\n default: { to: 3 },\n }\n )\n ),\n pageNumbersDepth: Type.Optional(\n Type.Object(\n {\n from: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 1,\n description:\n 'Starting heading level (1-6). Defaults to 1 if not specified.',\n })\n ),\n to: Type.Optional(\n Type.Number({\n minimum: 1,\n maximum: 6,\n default: 3,\n description:\n 'Ending heading level (1-6). Defaults to 3 if not specified.',\n })\n ),\n },\n {\n description:\n 'Range of heading levels to show page numbers. Specify \"from\", \"to\", or both. When specified, page numbers are hidden for entries outside this range.',\n additionalProperties: false,\n }\n )\n ),\n numberingStyle: Type.Optional(TocStyleSchema),\n title: Type.Optional(\n Type.String({\n description: 'TOC heading title',\n })\n ),\n includePageNumbers: Type.Optional(\n Type.Boolean({\n default: true,\n description: 'Show page numbers next to entries',\n })\n ),\n numberSeparator: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'Use tab separator between entry and page number. True applies \"\\\\t\" (default), false applies \" \"',\n })\n ),\n scope: Type.Optional(\n Type.Union([TocScopeSchema, Type.Literal('auto')], {\n default: 'auto',\n description:\n 'TOC scope: \"document\" for entire document, \"section\" for parent section only, \"auto\" for automatic detection (section if inside section, otherwise document)',\n })\n ),\n styles: Type.Optional(\n Type.Array(TocStyleMappingSchema, {\n description:\n 'Custom style mappings for TOC entries. Maps custom theme styles to TOC levels.',\n })\n ),\n },\n {\n description: 'Table of Contents component props',\n additionalProperties: false,\n }\n);\n\nexport type TocProps = Static<typeof TocPropsSchema>;\n","/**\n * Highcharts Component Schema\n *\n * Standard component for rendering charts using Highcharts export server.\n */\n\nimport { Type, Static } from '@sinclair/typebox';\n\n/**\n * Highcharts component props schema\n * Accepts options that will be passed to Highcharts export server\n */\nexport const HighchartsPropsSchema = Type.Object({\n // Highcharts chart options - can be anything but must at least have chart.width and chart.height\n options: Type.Intersect([\n Type.Record(Type.String(), Type.Unknown()),\n Type.Object({\n chart: Type.Object({\n width: Type.Number(),\n height: Type.Number(),\n }),\n }),\n ]),\n // Optional scale factor for export\n scale: Type.Optional(Type.Number()),\n // Optional resources forwarded verbatim to the export server (CSS/JS/files).\n // Notably enables @font-face rules so charts render in custom fonts.\n resources: Type.Optional(\n Type.Object({\n css: Type.Optional(Type.String()),\n js: Type.Optional(Type.String()),\n files: Type.Optional(Type.Array(Type.String())),\n })\n ),\n // Optional Highcharts Export Server URL override\n serverUrl: Type.Optional(\n Type.String({\n description:\n 'Highcharts Export Server URL (default: http://localhost:7801)',\n })\n ),\n // Optional width for rendering (overrides chart width)\n width: Type.Optional(\n Type.Union(\n [\n Type.Number({\n minimum: 1,\n description: 'Image width in pixels',\n }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description:\n 'Image width as percentage (e.g., \"90%\") relative to content width',\n }),\n ],\n {\n description:\n 'Rendered image width in pixels (number) or as percentage string (e.g., \"90%\")',\n }\n )\n ),\n // Optional height for rendering (overrides chart height)\n height: Type.Optional(\n Type.Union(\n [\n Type.Number({\n minimum: 1,\n description: 'Image height in pixels',\n }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description:\n 'Image height as percentage (e.g., \"90%\") relative to content height',\n }),\n ],\n {\n description:\n 'Rendered image height in pixels (number) or as percentage string (e.g., \"90%\")',\n }\n )\n ),\n});\n\nexport type HighchartsProps = Static<typeof HighchartsPropsSchema>;\n","/**\n * Visual Component Schema\n *\n * A `visual` is a free-canvas graphic authored as a single pptx slide and\n * embedded into the document as a rasterized PNG. It unlocks absolute\n * positioning, overlapping shapes and layered art that the docx flow layout\n * cannot express — think infographics, diagrams and hero compositions.\n *\n * The pptx slide is rendered to an image by an injected rasterization service\n * (see `PptxServiceConfig` in @json-to-office/shared), exactly the way the\n * `highcharts` component offloads chart rendering to an export server. At\n * render time the component desugars to a plain `image`.\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport {\n MIN_VISUAL_DPI,\n MAX_VISUAL_DPI,\n DEFAULT_VISUAL_DPI,\n} from '@json-to-office/shared';\nimport { PptxSlideContentSchema } from '@json-to-office/shared/schemas/slide-content';\nimport {\n AlignmentSchema,\n SpacingSchema,\n FloatingPropertiesSchema,\n} from './common';\n\n/**\n * Canvas background — a solid color and/or a background image.\n * Mirrors the pptx slide background shape (kept local to avoid coupling\n * shared-docx to shared-pptx; the rasterizer forwards it verbatim).\n */\nexport const VisualCanvasBackgroundSchema = Type.Object(\n {\n color: Type.Optional(\n Type.String({\n description:\n 'Background color (hex like \"#FFFFFF\" or a theme color name)',\n })\n ),\n image: Type.Optional(\n Type.Object(\n {\n path: Type.Optional(Type.String()),\n base64: Type.Optional(Type.String()),\n },\n { additionalProperties: false }\n )\n ),\n },\n { additionalProperties: false }\n);\n\n/**\n * The pptx canvas the visual is drawn on. Width/height are in inches and set\n * both the aspect ratio and the physical print size of the embedded image.\n */\nexport const VisualCanvasSchema = Type.Object(\n {\n width: Type.Number({\n minimum: 0.1,\n description: 'Canvas width in inches (pptx slideWidth)',\n }),\n height: Type.Number({\n minimum: 0.1,\n description: 'Canvas height in inches (pptx slideHeight)',\n }),\n theme: Type.Optional(\n Type.String({ description: 'pptx theme name applied to the slide' })\n ),\n background: Type.Optional(VisualCanvasBackgroundSchema),\n },\n {\n description: 'pptx canvas definition for the visual',\n additionalProperties: false,\n }\n);\n\n// A single pptx slide content element (text, image, shape, table, highcharts,\n// chart) is validated against the real PPTX slide-content union\n// (`PptxSlideContentSchema` from @json-to-office/shared/schemas/slide-content)\n// — same authoring\n// fidelity as a standalone `.pptx.json`. Used directly as the `elements` item\n// schema below.\n\nexport const VisualPropsSchema = Type.Object(\n {\n // ── canvas (drives aspect ratio + physical size) ──\n canvas: VisualCanvasSchema,\n // pptx slide content elements, absolutely positioned on the canvas\n elements: Type.Optional(\n Type.Array(PptxSlideContentSchema, {\n description:\n 'pptx slide content elements (text, image, shape, table, highcharts, chart), positioned with x/y/w/h in inches',\n })\n ),\n\n // ── rasterization ──\n dpi: Type.Optional(\n Type.Number({\n minimum: MIN_VISUAL_DPI,\n maximum: MAX_VISUAL_DPI,\n default: DEFAULT_VISUAL_DPI,\n description: `Raster resolution in DPI (default ${DEFAULT_VISUAL_DPI}, range ${MIN_VISUAL_DPI}-${MAX_VISUAL_DPI}). Higher = sharper + larger.`,\n })\n ),\n serverUrl: Type.Optional(\n Type.String({\n description:\n 'Rasterization service URL override (default from services.pptx)',\n })\n ),\n\n // ── placement in the document (mirrors `image`) ──\n width: Type.Optional(\n Type.Union(\n [\n Type.Number({ minimum: 1, description: 'Rendered width in pixels' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Rendered width as percentage (e.g. \"90%\")',\n }),\n ],\n {\n description:\n 'Rendered width in the document, in pixels (number) or percentage string. Defaults to the canvas physical size.',\n }\n )\n ),\n height: Type.Optional(\n Type.Union([\n Type.Number({ minimum: 1, description: 'Rendered height in pixels' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Rendered height as percentage (e.g. \"90%\")',\n }),\n ])\n ),\n alignment: Type.Optional(AlignmentSchema),\n caption: Type.Optional(\n Type.String({\n description:\n 'Caption (supports rich text with **bold**, *italic*, ***both***)',\n })\n ),\n alt: Type.Optional(\n Type.String({ description: 'Alternative text for accessibility' })\n ),\n spacing: Type.Optional(SpacingSchema),\n floating: Type.Optional(FloatingPropertiesSchema),\n keepNext: Type.Optional(\n Type.Boolean({\n description: 'Keep paragraph with next paragraph on same page',\n })\n ),\n keepLines: Type.Optional(\n Type.Boolean({\n description: 'Keep all lines of paragraph together on same page',\n })\n ),\n },\n {\n description: 'Visual component props (pptx-rendered graphic)',\n additionalProperties: false,\n }\n);\n\nexport type VisualProps = Static<typeof VisualPropsSchema>;\nexport type VisualCanvas = Static<typeof VisualCanvasSchema>;\n"],"mappings":"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","names":["Type","Type","Type","Type","Type","Type","Type","Type"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createAllComponentSchemasNarrowed,
3
3
  getStandardComponent
4
- } from "./chunk-WOFU72HH.js";
4
+ } from "./chunk-JF5ZJQNR.js";
5
5
 
6
6
  // src/schemas/generator.ts
7
7
  import { Type } from "@sinclair/typebox";
@@ -139,4 +139,4 @@ function generateUnifiedDocumentSchema(options = {}) {
139
139
  export {
140
140
  generateUnifiedDocumentSchema
141
141
  };
142
- //# sourceMappingURL=chunk-GGAJWGDI.js.map
142
+ //# sourceMappingURL=chunk-LATN6QG6.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createAllComponentSchemas,
3
3
  createAllComponentSchemasNarrowed
4
- } from "./chunk-WOFU72HH.js";
4
+ } from "./chunk-JF5ZJQNR.js";
5
5
 
6
6
  // src/schemas/components.ts
7
7
  import { Type } from "@sinclair/typebox";
@@ -31,4 +31,4 @@ export {
31
31
  StandardComponentDefinitionSchema,
32
32
  ComponentDefinitionSchema
33
33
  };
34
- //# sourceMappingURL=chunk-K2LA6WCD.js.map
34
+ //# sourceMappingURL=chunk-PMZEVOBL.js.map
@@ -3,16 +3,16 @@ import {
3
3
  strictDocumentValidator,
4
4
  validateAgainstSchema,
5
5
  validateJson
6
- } from "./chunk-HYY4ZOYL.js";
6
+ } from "./chunk-XR7ZEDXZ.js";
7
7
  import {
8
8
  ComponentDefinitionSchema
9
- } from "./chunk-K2LA6WCD.js";
9
+ } from "./chunk-PMZEVOBL.js";
10
10
  import {
11
11
  CustomComponentDefinitionSchema
12
12
  } from "./chunk-7GGTZ4TA.js";
13
13
  import {
14
14
  ReportPropsSchema
15
- } from "./chunk-WOFU72HH.js";
15
+ } from "./chunk-JF5ZJQNR.js";
16
16
  import {
17
17
  ThemeConfigSchema
18
18
  } from "./chunk-ZC2I7CTZ.js";
@@ -410,4 +410,4 @@ export {
410
410
  createErrorConfig,
411
411
  formatErrorMessage
412
412
  };
413
- //# sourceMappingURL=chunk-HMNKQ7BT.js.map
413
+ //# sourceMappingURL=chunk-W523ZTYH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/validation/unified/index.ts","../src/validation/unified/error-formatter-config.ts","../src/validation/unified/theme-validator.ts","../src/validation/unified/component-validator.ts"],"sourcesContent":["/**\n * Unified validation facade\n * Simple, clean API for all validation needs\n */\n\n// Format-agnostic types re-exported from @json-to-office/shared\nexport type { ValidationError, ValidationResult } from '@json-to-office/shared';\n\n// Docx-specific extended types (local)\nexport type {\n ValidationOptions,\n JsonValidationResult,\n ThemeValidationResult,\n DocumentValidationResult,\n ComponentValidationResult,\n EnhancedValueError,\n} from './types';\n\n// Format-agnostic error utilities re-exported from @json-to-office/shared\nexport {\n transformValueError,\n transformValueErrors,\n calculatePosition,\n formatErrorSummary,\n groupErrorsByPath,\n createJsonParseError,\n} from '@json-to-office/shared';\n\n// Docx-specific error transformer (local, extends shared with docx-specific messages)\nexport {\n transformValueError as transformDocxValueError,\n transformValueErrors as transformDocxValueErrors,\n} from './error-transformer';\n\n// Export deep validation utilities (docx-specific)\nexport {\n deepValidateDocument,\n comprehensiveValidateDocument,\n collectIndentConflicts,\n collectNoteRevisionConflicts,\n collectTextBoxShapeConflicts,\n} from './deep-validator';\n\n// Format-agnostic schema utilities re-exported from @json-to-office/shared\nexport {\n isUnionSchema,\n isObjectSchema,\n isLiteralSchema,\n getObjectSchemaPropertyNames,\n getLiteralValue,\n extractStandardComponentNames,\n clearComponentNamesCache,\n getSchemaMetadata,\n} from '@json-to-office/shared';\n\n// Format-agnostic error formatter config re-exported from @json-to-office/shared\nexport {\n type ErrorFormatterConfig,\n DEFAULT_ERROR_CONFIG,\n ERROR_EMOJIS,\n createErrorConfig,\n formatErrorMessage,\n} from '@json-to-office/shared';\n\n// Docx-specific error formatter extras (local)\nexport { ERROR_TEMPLATES } from './error-formatter-config';\n\n// Export base validator utilities\nexport {\n validateAgainstSchema,\n validateJson,\n validateBatch,\n validateWithEnhancement,\n createValidator,\n createJsonValidator,\n isValidationSuccess,\n getValidationSummary,\n} from './base-validator';\n\n// Export document validation\nexport {\n validateDocument,\n validateJsonDocument,\n isValidDocument,\n createDocumentValidator,\n documentValidator,\n strictDocumentValidator,\n // Legacy compatibility\n validateJsonComponent,\n validateDocumentWithSchema,\n} from './document-validator';\n\n// Export theme validation\nexport {\n validateTheme,\n validateThemeJson,\n validateThemeWithEnhancement,\n isValidTheme,\n createThemeValidator,\n themeValidator,\n strictThemeValidator,\n getThemeName,\n isThemeConfig,\n} from './theme-validator';\n\n// Export component validation\nexport {\n validateComponent,\n validateComponentDefinition,\n validateCustomComponentProps,\n validateComponents,\n isStandardComponentName,\n createComponentValidator,\n componentValidator,\n strictComponentValidator,\n // Type guards\n isReportProps,\n isSectionProps,\n isHeadingProps,\n isParagraphProps,\n isColumnsProps,\n isImageProps,\n isStatisticProps,\n isTableProps,\n isListProps,\n isCustomComponentProps,\n // Types\n type StandardComponentName,\n} from './component-validator';\n\n// Import the validators we need\nimport {\n documentValidator,\n strictDocumentValidator,\n} from './document-validator';\nimport { themeValidator, strictThemeValidator } from './theme-validator';\nimport {\n componentValidator,\n strictComponentValidator,\n} from './component-validator';\n\n/**\n * Simple validation API\n * The main entry point for most validation needs\n */\nexport const validate = {\n // Document validation\n document: (data: unknown) => documentValidator.validate(data),\n jsonDocument: (jsonInput: string | object) =>\n documentValidator.validateJson(jsonInput),\n\n // Theme validation\n theme: (data: unknown) => themeValidator.validate(data),\n jsonTheme: (jsonInput: string | object) =>\n themeValidator.validateJson(jsonInput),\n\n // Component validation\n component: (name: string, props: unknown) =>\n componentValidator.validate(name, props),\n componentDefinition: (component: unknown) =>\n componentValidator.validateDefinition(component),\n\n // Batch operations\n components: (components: Array<{ name: string; props: unknown }>) =>\n components.map((c) => componentValidator.validate(c.name, c.props)),\n\n // Type checking (non-throwing)\n isDocument: (data: unknown) => {\n const result = documentValidator.validate(data);\n return result.valid;\n },\n isTheme: (data: unknown) => {\n const result = themeValidator.validate(data);\n return result.valid;\n },\n isComponent: (name: string, props: unknown) => {\n const result = componentValidator.validate(name, props);\n return result.valid;\n },\n};\n\n/**\n * Strict validation API\n * For cases where you want no cleaning or defaults\n */\nexport const validateStrict = {\n document: (data: unknown) => strictDocumentValidator.validate(data),\n jsonDocument: (jsonInput: string | object) =>\n strictDocumentValidator.validateJson(jsonInput),\n theme: (data: unknown) => strictThemeValidator.validate(data),\n jsonTheme: (jsonInput: string | object) =>\n strictThemeValidator.validateJson(jsonInput),\n component: (name: string, props: unknown) =>\n strictComponentValidator.validate(name, props),\n componentDefinition: (component: unknown) =>\n strictComponentValidator.validateDefinition(component),\n};\n","/**\n * Error Formatter Configuration\n * Configurable error message formatting options\n */\n\n/**\n * Error formatter configuration options\n */\nexport interface ErrorFormatterConfig {\n /**\n * Include emoji indicators in error messages\n * Default: true (false in CI environments)\n */\n includeEmojis?: boolean;\n\n /**\n * Verbosity level for error messages\n * - minimal: Just the error message\n * - normal: Error message with path\n * - detailed: Full error with suggestions and context\n * Default: 'normal'\n */\n verbosity?: 'minimal' | 'normal' | 'detailed';\n\n /**\n * Include suggestions for fixing errors\n * Default: true\n */\n includeSuggestions?: boolean;\n\n /**\n * Include stack trace or error path\n * Default: true\n */\n includePath?: boolean;\n\n /**\n * Maximum error message length (0 = unlimited)\n * Default: 0\n */\n maxMessageLength?: number;\n\n /**\n * Include links to documentation\n * Default: false\n */\n includeDocLinks?: boolean;\n\n /**\n * Terminal color support\n * Default: auto-detected\n */\n colorSupport?: boolean;\n}\n\n/**\n * Get default configuration\n * Evaluates environment variables at call time, not module load time\n */\nfunction getDefaultConfig(): Required<ErrorFormatterConfig> {\n return {\n includeEmojis: !isCI(),\n verbosity: 'normal',\n includeSuggestions: true,\n includePath: true,\n maxMessageLength: 0,\n includeDocLinks: false,\n colorSupport: hasColorSupport(),\n };\n}\n\n/**\n * Default configuration (for backward compatibility)\n */\nexport const DEFAULT_ERROR_CONFIG: Required<ErrorFormatterConfig> =\n getDefaultConfig();\n\n/**\n * Error message templates\n */\nexport const ERROR_TEMPLATES = {\n UNION_NO_MATCH: \"Value doesn't match any of the expected formats\",\n TYPE_MISMATCH: 'Expected {expected} but got {actual}',\n MISSING_REQUIRED: \"Missing required field '{field}'\",\n UNKNOWN_PROPERTY: \"Unknown property '{property}'\",\n INVALID_FORMAT: 'Invalid {type} format',\n PATTERN_MISMATCH: \"Value doesn't match the required pattern\",\n} as const;\n\n/**\n * Emoji indicators for different error types\n */\nexport const ERROR_EMOJIS = {\n ERROR: '❌',\n WARNING: '⚠️',\n INFO: 'ℹ️',\n SUGGESTION: '💡',\n FIX: '🔧',\n LINK: '🔗',\n} as const;\n\n/**\n * Detect if running in CI environment\n */\nfunction isCI(): boolean {\n // Check if we're in a Node environment\n if (typeof process === 'undefined' || !process.env) {\n return false;\n }\n\n return !!(\n process.env.CI ||\n process.env.CONTINUOUS_INTEGRATION ||\n process.env.GITHUB_ACTIONS ||\n process.env.GITLAB_CI ||\n process.env.CIRCLECI ||\n process.env.TRAVIS ||\n process.env.JENKINS_URL\n );\n}\n\n/**\n * Detect terminal color support\n */\nfunction hasColorSupport(): boolean {\n // Check if we're in a Node environment\n if (typeof process === 'undefined') {\n return false;\n }\n\n // Check for explicit NO_COLOR env var\n if (process.env?.NO_COLOR) {\n return false;\n }\n\n // Check for explicit FORCE_COLOR env var\n if (process.env?.FORCE_COLOR) {\n return true;\n }\n\n // Check if stdout is a TTY\n if (process.stdout?.isTTY) {\n return true;\n }\n\n // Default to no color in CI environments\n return !isCI();\n}\n\n/**\n * Create a configuration with defaults\n */\nexport function createErrorConfig(\n config?: ErrorFormatterConfig\n): Required<ErrorFormatterConfig> {\n // Get fresh defaults that evaluate environment at call time\n const defaults = getDefaultConfig();\n return {\n ...defaults,\n ...config,\n };\n}\n\n/**\n * Format an error message based on configuration\n */\nexport function formatErrorMessage(\n message: string,\n config: ErrorFormatterConfig = {}\n): string {\n const finalConfig = createErrorConfig(config);\n\n let formatted = message;\n\n // Remove emojis if not wanted\n if (!finalConfig.includeEmojis) {\n Object.values(ERROR_EMOJIS).forEach((emoji) => {\n formatted = formatted.replace(new RegExp(emoji, 'g'), '');\n });\n // Clean up extra spaces\n formatted = formatted.replace(/\\s+/g, ' ').trim();\n }\n\n // Truncate if needed\n if (\n finalConfig.maxMessageLength > 0 &&\n formatted.length > finalConfig.maxMessageLength\n ) {\n formatted =\n formatted.substring(0, finalConfig.maxMessageLength - 3) + '...';\n }\n\n return formatted;\n}\n","/**\n * Theme validation implementation\n * Single source of truth for all theme validation\n */\n\nimport type { Static } from '@sinclair/typebox';\nimport { ThemeConfigSchema } from '../../schemas/theme';\nimport type { ValidationOptions } from './types';\nimport { validateAgainstSchema, validateJson } from './base-validator';\n\n// Re-export ThemeValidationResult type\nexport type { ThemeValidationResult } from './types';\nimport type { ThemeValidationResult } from './types';\n\n/**\n * Validate a theme configuration object\n */\nexport function validateTheme(\n data: unknown,\n options?: ValidationOptions\n): ThemeValidationResult {\n // Handle string input (theme name)\n if (typeof data === 'string') {\n // This is just a theme name, not a theme config\n // It will be resolved later by the theme resolver\n return {\n valid: true,\n themeName: data,\n };\n }\n\n const result = validateAgainstSchema(ThemeConfigSchema, data, options);\n\n // Add theme-specific metadata\n const themeResult: ThemeValidationResult = {\n ...result,\n };\n\n // Extract theme name if present\n if (result.valid && result.data) {\n const theme = result.data as any;\n if (theme.name) {\n themeResult.themeName = theme.name;\n }\n }\n\n return themeResult;\n}\n\n/**\n * Validate a theme JSON string or object\n * This replaces all three validateThemeJson implementations\n */\nexport function validateThemeJson(\n jsonInput: string | object,\n options?: ValidationOptions\n): ThemeValidationResult {\n const result = validateJson(ThemeConfigSchema, jsonInput, options);\n\n // Add theme-specific metadata\n const themeResult: ThemeValidationResult = {\n ...result,\n };\n\n // Extract theme name if present\n if (result.valid && result.data) {\n const theme = result.data as any;\n\n // Inject default $schema if missing and it's an object\n if (typeof theme === 'object' && !theme.$schema) {\n theme.$schema = './json-schemas/theme.schema.json';\n }\n\n if (theme.name) {\n themeResult.themeName = theme.name;\n }\n }\n\n return themeResult;\n}\n\n/**\n * Validate theme with enhanced error messages\n */\nexport function validateThemeWithEnhancement(\n data: unknown,\n options?: ValidationOptions\n): ThemeValidationResult {\n const result = validateTheme(data, options);\n\n // Enhance errors with theme-specific suggestions\n if (!result.valid && result.errors) {\n result.errors = result.errors.map((error) => {\n // Add specific suggestions for common theme errors\n if (error.path.includes('colors') && !error.suggestion) {\n error.suggestion = 'Colors must be valid hex, rgb, or named colors';\n }\n if (error.path.includes('fonts') && !error.suggestion) {\n error.suggestion = 'Fonts must include size and family properties';\n }\n if (error.path.includes('headings') && !error.suggestion) {\n error.suggestion = 'Headings must be an array of 6 style definitions';\n }\n return error;\n });\n }\n\n return result;\n}\n\n/**\n * Type guard for valid theme result\n */\nexport function isValidTheme(\n result: ThemeValidationResult\n): result is ThemeValidationResult & {\n valid: true;\n data: Static<typeof ThemeConfigSchema>;\n} {\n return result.valid === true && result.data !== undefined;\n}\n\n/**\n * Create a theme validator with default options\n */\nexport function createThemeValidator(defaultOptions?: ValidationOptions) {\n return {\n validate: (data: unknown, options?: ValidationOptions) =>\n validateTheme(data, { ...defaultOptions, ...options }),\n validateJson: (jsonInput: string | object, options?: ValidationOptions) =>\n validateThemeJson(jsonInput, { ...defaultOptions, ...options }),\n validateWithEnhancement: (data: unknown, options?: ValidationOptions) =>\n validateThemeWithEnhancement(data, { ...defaultOptions, ...options }),\n };\n}\n\n// Export convenient validators with common configurations\nexport const themeValidator = createThemeValidator({\n clean: true,\n applyDefaults: true,\n});\n\nexport const strictThemeValidator = createThemeValidator({\n clean: false,\n applyDefaults: false,\n maxErrors: 10,\n});\n\n/**\n * Get theme name from data\n */\nexport function getThemeName(data: unknown): string | undefined {\n if (typeof data === 'string') {\n return data;\n }\n\n if (typeof data === 'object' && data !== null && 'name' in data) {\n const theme = data as any;\n if (typeof theme.name === 'string') {\n return theme.name;\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if theme config is valid (basic check without full validation)\n */\nexport function isThemeConfig(data: unknown): boolean {\n if (!data || typeof data !== 'object') {\n return false;\n }\n\n const theme = data as any;\n return !!(theme.colors && theme.fonts);\n}\n","/**\n * Component validation implementation\n * Single source of truth for all component validation\n */\n\nimport { Value } from '@sinclair/typebox/value';\nimport type { Static, TSchema } from '@sinclair/typebox';\nimport { validateCustomComponentProps as sharedValidateCustomComponentProps } from '@json-to-office/shared/plugin';\nimport {\n ReportPropsSchema,\n SectionPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ColumnsPropsSchema,\n ImagePropsSchema,\n StatisticPropsSchema,\n TablePropsSchema,\n ListPropsSchema,\n ComponentDefinitionSchema,\n} from '../../schemas/components';\nimport { CustomComponentDefinitionSchema } from '../../schemas/custom-components';\nimport type { ComponentValidationResult, ValidationOptions } from './types';\nimport { validateAgainstSchema } from './base-validator';\n\n// Map of standard component names to their schemas\nconst COMPONENT_SCHEMA_MAP = {\n report: ReportPropsSchema,\n section: SectionPropsSchema,\n heading: HeadingPropsSchema,\n paragraph: ParagraphPropsSchema,\n columns: ColumnsPropsSchema,\n image: ImagePropsSchema,\n statistic: StatisticPropsSchema,\n table: TablePropsSchema,\n list: ListPropsSchema,\n custom: CustomComponentDefinitionSchema,\n} as const;\n\nexport type StandardComponentName = keyof typeof COMPONENT_SCHEMA_MAP;\n\n/**\n * Validate a component configuration by type\n */\nexport function validateComponent<T extends StandardComponentName>(\n name: T,\n props: unknown,\n options?: ValidationOptions\n): ComponentValidationResult<any> {\n const schema = COMPONENT_SCHEMA_MAP[name];\n\n if (!schema) {\n // Unknown component type, try custom component schema\n const customResult = validateAgainstSchema(\n CustomComponentDefinitionSchema,\n props,\n options\n );\n\n return {\n ...customResult,\n success: customResult.valid, // Add success for backward compatibility\n componentName: name,\n isCustomComponent: true,\n };\n }\n\n const result = validateAgainstSchema(schema, props, options);\n\n return {\n ...result,\n success: result.valid, // Add success for backward compatibility\n componentName: name,\n isCustomComponent: name === 'custom',\n };\n}\n\n/**\n * Validate a complete component definition (including nested children)\n */\nexport function validateComponentDefinition(\n component: unknown,\n options?: ValidationOptions\n): ComponentValidationResult {\n const result = validateAgainstSchema(\n ComponentDefinitionSchema,\n component,\n options\n );\n\n // Add component-specific metadata\n const componentResult: ComponentValidationResult = {\n ...result,\n };\n\n if (result.valid && result.data) {\n const comp = result.data as any;\n componentResult.componentName = comp.name;\n componentResult.isCustomComponent = !isStandardComponentName(comp.name);\n }\n\n return componentResult;\n}\n\n/**\n * Validate a custom component configuration with a custom schema.\n * Delegates to @json-to-office/shared/plugin to avoid duplication.\n */\nexport function validateCustomComponentProps<T>(\n componentSchema: TSchema,\n config: unknown,\n options?: ValidationOptions\n): ComponentValidationResult<T> {\n return sharedValidateCustomComponentProps<T>(\n componentSchema,\n config,\n options\n );\n}\n\n/**\n * Batch validate multiple components\n */\nexport function validateComponents(\n components: Array<{ name: string; props: unknown }>,\n options?: ValidationOptions\n): ComponentValidationResult[] {\n return components.map(({ name, props }) => {\n if (isStandardComponentName(name)) {\n return validateComponent(name, props, options);\n }\n return validateComponent('custom', props, options);\n });\n}\n\n/**\n * Type guards for component names\n */\nexport function isStandardComponentName(\n name: string\n): name is StandardComponentName {\n return name in COMPONENT_SCHEMA_MAP;\n}\n\nexport function isReportProps(\n config: unknown\n): config is Static<typeof ReportPropsSchema> {\n return Value.Check(ReportPropsSchema, config);\n}\n\nexport function isSectionProps(\n config: unknown\n): config is Static<typeof SectionPropsSchema> {\n return Value.Check(SectionPropsSchema, config);\n}\n\nexport function isHeadingProps(\n config: unknown\n): config is Static<typeof HeadingPropsSchema> {\n return Value.Check(HeadingPropsSchema, config);\n}\n\nexport function isParagraphProps(\n config: unknown\n): config is Static<typeof ParagraphPropsSchema> {\n return Value.Check(ParagraphPropsSchema, config);\n}\n\nexport function isColumnsProps(\n config: unknown\n): config is Static<typeof ColumnsPropsSchema> {\n return Value.Check(ColumnsPropsSchema, config);\n}\n\nexport function isImageProps(\n config: unknown\n): config is Static<typeof ImagePropsSchema> {\n return Value.Check(ImagePropsSchema, config);\n}\n\nexport function isStatisticProps(\n config: unknown\n): config is Static<typeof StatisticPropsSchema> {\n return Value.Check(StatisticPropsSchema, config);\n}\n\nexport function isTableProps(\n config: unknown\n): config is Static<typeof TablePropsSchema> {\n return Value.Check(TablePropsSchema, config);\n}\n\nexport function isListProps(\n config: unknown\n): config is Static<typeof ListPropsSchema> {\n return Value.Check(ListPropsSchema, config);\n}\n\nexport function isCustomComponentProps(\n config: unknown\n): config is Static<typeof CustomComponentDefinitionSchema> {\n return Value.Check(CustomComponentDefinitionSchema, config);\n}\n\n/**\n * Create a component validator with default options\n */\nexport function createComponentValidator(defaultOptions?: ValidationOptions) {\n return {\n validate: (name: string, props: unknown, options?: ValidationOptions) => {\n if (isStandardComponentName(name)) {\n return validateComponent(name, props, {\n ...defaultOptions,\n ...options,\n });\n }\n return validateComponent('custom', props, {\n ...defaultOptions,\n ...options,\n });\n },\n validateDefinition: (component: unknown, options?: ValidationOptions) =>\n validateComponentDefinition(component, { ...defaultOptions, ...options }),\n validateCustom: <T>(\n schema: TSchema,\n config: unknown,\n options?: ValidationOptions\n ) =>\n validateCustomComponentProps<T>(schema, config, {\n ...defaultOptions,\n ...options,\n }),\n };\n}\n\n// Export convenient validators with common configurations\nexport const componentValidator = createComponentValidator({\n clean: true,\n applyDefaults: true,\n});\n\nexport const strictComponentValidator = createComponentValidator({\n clean: false,\n applyDefaults: false,\n maxErrors: 10,\n});\n"],"mappings":"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","names":["DEFAULT_ERROR_CONFIG"]}
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  ComponentDefinitionSchema,
3
3
  StandardComponentDefinitionSchema
4
- } from "./chunk-K2LA6WCD.js";
4
+ } from "./chunk-PMZEVOBL.js";
5
5
  import {
6
6
  CustomComponentDefinitionSchema
7
7
  } from "./chunk-7GGTZ4TA.js";
8
8
  import {
9
9
  ReportPropsSchema,
10
10
  STANDARD_COMPONENTS_REGISTRY
11
- } from "./chunk-WOFU72HH.js";
11
+ } from "./chunk-JF5ZJQNR.js";
12
12
 
13
13
  // src/validation/unified/error-transformer.ts
14
14
  import {
@@ -393,6 +393,47 @@ function collectNoteRevisionConflicts(data) {
393
393
  visit(data, "");
394
394
  return errors;
395
395
  }
396
+ var UNDASHABLE_BORDER_STYLES = /* @__PURE__ */ new Set(["dashed", "dotted", "double"]);
397
+ function collectTextBoxShapeConflicts(data) {
398
+ const errors = [];
399
+ const visit = (node, path) => {
400
+ if (Array.isArray(node)) {
401
+ node.forEach((item, i) => visit(item, `${path}/${i}`));
402
+ return;
403
+ }
404
+ if (!node || typeof node !== "object") return;
405
+ if (node.name === "text-box" && node.props?.renderAs === "shape") {
406
+ const missing = ["width", "height"].filter(
407
+ (axis) => node.props[axis] === void 0
408
+ );
409
+ if (missing.length > 0) {
410
+ errors.push({
411
+ path: `${path}/props/${missing[0]}`,
412
+ message: `A text-box with renderAs "shape" requires ${missing.join(" and ")}: a shape has no autofit, so its size cannot be derived from its content. Give it an explicit size, or use renderAs "table", which grows to fit.`,
413
+ code: "required"
414
+ });
415
+ }
416
+ const border = node.props.style?.border;
417
+ if (border && typeof border === "object") {
418
+ for (const side of ["top", "right", "bottom", "left"]) {
419
+ const style = border[side]?.style;
420
+ if (typeof style === "string" && UNDASHABLE_BORDER_STYLES.has(style)) {
421
+ errors.push({
422
+ path: `${path}/props/style/border/${side}/style`,
423
+ message: `A text-box with renderAs "shape" cannot draw a "${style}" border: a shape outline carries no dash pattern. Use "solid", or use renderAs "table", which draws every border style.`,
424
+ code: "unsupported_value"
425
+ });
426
+ }
427
+ }
428
+ }
429
+ }
430
+ for (const key of Object.keys(node)) {
431
+ visit(node[key], `${path}/${key}`);
432
+ }
433
+ };
434
+ visit(data, "");
435
+ return errors;
436
+ }
396
437
  function deepValidateDocument(data, opts = {}) {
397
438
  const allErrors = [];
398
439
  if (!data || typeof data !== "object") {
@@ -746,6 +787,33 @@ function getValidationSummary(result) {
746
787
  // src/validation/unified/document-validator.ts
747
788
  import { extractStandardComponentNames } from "@json-to-office/shared";
748
789
  var JsonComponentDefinitionSchema = ComponentDefinitionSchema;
790
+ var SEMANTIC_COLLECTORS = [
791
+ {
792
+ // A multi-source image passes the structural check: each source is its own
793
+ // optional field.
794
+ why: "image source mutual-exclusivity",
795
+ collect: collectImageSourceConflicts
796
+ },
797
+ {
798
+ why: "indent hanging/firstLine mutual-exclusivity",
799
+ collect: collectIndentConflicts
800
+ },
801
+ {
802
+ // Tracked-change text renders literally, so a note marker inside it never
803
+ // resolves and docx cannot express the pair anyway.
804
+ why: "notes on a revised paragraph",
805
+ collect: collectNoteRevisionConflicts
806
+ },
807
+ {
808
+ // A shape has no autofit and its outline carries no dash pattern, so the
809
+ // request could only ever come back as a table.
810
+ why: "a text box asking for a shape rendering a shape cannot give it",
811
+ collect: collectTextBoxShapeConflicts
812
+ }
813
+ ];
814
+ function collectSemanticConflicts(document) {
815
+ return SEMANTIC_COLLECTORS.flatMap(({ collect }) => collect(document));
816
+ }
749
817
  function validateDocument(data, options) {
750
818
  const result = validateAgainstSchema(
751
819
  ComponentDefinitionSchema,
@@ -763,19 +831,9 @@ function validateDocument(data, options) {
763
831
  finalValid = true;
764
832
  }
765
833
  }
766
- const sourceConflicts = collectImageSourceConflicts(data);
767
- if (sourceConflicts.length > 0) {
768
- finalErrors = [...finalErrors, ...sourceConflicts];
769
- finalValid = false;
770
- }
771
- const indentConflicts = collectIndentConflicts(data);
772
- if (indentConflicts.length > 0) {
773
- finalErrors = [...finalErrors, ...indentConflicts];
774
- finalValid = false;
775
- }
776
- const noteRevisionConflicts = collectNoteRevisionConflicts(data);
777
- if (noteRevisionConflicts.length > 0) {
778
- finalErrors = [...finalErrors, ...noteRevisionConflicts];
834
+ const semanticConflicts = collectSemanticConflicts(data);
835
+ if (semanticConflicts.length > 0) {
836
+ finalErrors = [...finalErrors, ...semanticConflicts];
779
837
  finalValid = false;
780
838
  }
781
839
  const resolvedData = result.data ?? (finalValid ? data : void 0);
@@ -814,19 +872,9 @@ function validateJsonDocument(jsonInput, options) {
814
872
  finalValid = true;
815
873
  }
816
874
  }
817
- const sourceConflicts = collectImageSourceConflicts(result.parsed);
818
- if (sourceConflicts.length > 0) {
819
- finalErrors = [...finalErrors, ...sourceConflicts];
820
- finalValid = false;
821
- }
822
- const indentConflicts = collectIndentConflicts(result.parsed);
823
- if (indentConflicts.length > 0) {
824
- finalErrors = [...finalErrors, ...indentConflicts];
825
- finalValid = false;
826
- }
827
- const noteRevisionConflicts = collectNoteRevisionConflicts(result.parsed);
828
- if (noteRevisionConflicts.length > 0) {
829
- finalErrors = [...finalErrors, ...noteRevisionConflicts];
875
+ const semanticConflicts = collectSemanticConflicts(result.parsed);
876
+ if (semanticConflicts.length > 0) {
877
+ finalErrors = [...finalErrors, ...semanticConflicts];
830
878
  finalValid = false;
831
879
  }
832
880
  const resolvedData = result.data ?? (finalValid ? result.parsed : void 0);
@@ -884,6 +932,7 @@ export {
884
932
  transformValueErrors,
885
933
  collectIndentConflicts,
886
934
  collectNoteRevisionConflicts,
935
+ collectTextBoxShapeConflicts,
887
936
  deepValidateDocument,
888
937
  comprehensiveValidateDocument,
889
938
  validateAgainstSchema,
@@ -903,4 +952,4 @@ export {
903
952
  validateJsonComponent,
904
953
  validateDocumentWithSchema
905
954
  };
906
- //# sourceMappingURL=chunk-HYY4ZOYL.js.map
955
+ //# sourceMappingURL=chunk-XR7ZEDXZ.js.map