@json-to-office/shared-docx 0.22.0 → 0.23.0
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.
- package/dist/{chunk-KQFMDKI7.js → chunk-3JOBFRYR.js} +54 -2
- package/dist/{chunk-KQFMDKI7.js.map → chunk-3JOBFRYR.js.map} +1 -1
- package/dist/{chunk-4HT2OQJO.js → chunk-GJBRYTGZ.js} +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/schemas/theme.d.ts +16 -1
- package/dist/schemas/theme.js +3 -1
- package/dist/validation/unified/index.js +2 -2
- package/package.json +1 -1
- /package/dist/{chunk-4HT2OQJO.js.map → chunk-GJBRYTGZ.js.map} +0 -0
|
@@ -332,6 +332,57 @@ var ThemeConfigSchema = Type.Object(
|
|
|
332
332
|
function isValidThemeConfig(data) {
|
|
333
333
|
return Value.Check(ThemeConfigSchema, data);
|
|
334
334
|
}
|
|
335
|
+
function createMinimalTheme(name = "minimal-theme") {
|
|
336
|
+
return {
|
|
337
|
+
name,
|
|
338
|
+
displayName: name.split(/[-_\s]+/).filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") || name,
|
|
339
|
+
description: "A minimal theme with basic styling",
|
|
340
|
+
version: "1.0.0",
|
|
341
|
+
colors: {
|
|
342
|
+
primary: "#2563EB",
|
|
343
|
+
secondary: "#64748B",
|
|
344
|
+
accent: "#F8FAFC",
|
|
345
|
+
text: "#334155",
|
|
346
|
+
background: "#FFFFFF",
|
|
347
|
+
border: "#E2E8F0",
|
|
348
|
+
textPrimary: "#334155",
|
|
349
|
+
textSecondary: "#64748B",
|
|
350
|
+
textMuted: "#94A3B8",
|
|
351
|
+
borderPrimary: "#CBD5E1",
|
|
352
|
+
borderSecondary: "#E2E8F0",
|
|
353
|
+
backgroundPrimary: "#FFFFFF",
|
|
354
|
+
backgroundSecondary: "#F8FAFC"
|
|
355
|
+
},
|
|
356
|
+
fonts: {
|
|
357
|
+
heading: { family: "Arial", size: 14 },
|
|
358
|
+
body: { family: "Arial", size: 11 },
|
|
359
|
+
mono: { family: "Courier New", size: 10 },
|
|
360
|
+
light: { family: "Arial", size: 10 }
|
|
361
|
+
},
|
|
362
|
+
page: {
|
|
363
|
+
size: "A4",
|
|
364
|
+
margins: {
|
|
365
|
+
top: 1440,
|
|
366
|
+
bottom: 1440,
|
|
367
|
+
left: 1440,
|
|
368
|
+
right: 1440,
|
|
369
|
+
header: 720,
|
|
370
|
+
footer: 720,
|
|
371
|
+
gutter: 0
|
|
372
|
+
}
|
|
373
|
+
},
|
|
374
|
+
styles: {
|
|
375
|
+
normal: {
|
|
376
|
+
font: "body",
|
|
377
|
+
size: 11,
|
|
378
|
+
color: "#334155",
|
|
379
|
+
alignment: "left",
|
|
380
|
+
lineSpacing: { type: "multiple", value: 1.15 },
|
|
381
|
+
spacing: { after: 8 }
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
}
|
|
335
386
|
|
|
336
387
|
export {
|
|
337
388
|
DocumentMarginsSchema,
|
|
@@ -341,6 +392,7 @@ export {
|
|
|
341
392
|
StyleDefinitionsSchema,
|
|
342
393
|
HeadingDefinitionSchema,
|
|
343
394
|
ThemeConfigSchema,
|
|
344
|
-
isValidThemeConfig
|
|
395
|
+
isValidThemeConfig,
|
|
396
|
+
createMinimalTheme
|
|
345
397
|
};
|
|
346
|
-
//# sourceMappingURL=chunk-
|
|
398
|
+
//# sourceMappingURL=chunk-3JOBFRYR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/theme.ts"],"sourcesContent":["/**\n * Theme Schema Definitions using TypeBox\n * This file provides TypeBox schemas for theme configuration validation\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport {\n FontDefinitionSchema,\n TextFormattingPropertiesSchema,\n HexColorSchema,\n} from './font';\nimport { IndentSchema } from './components/common';\n\n// ============================================================================\n// Document Margins Schema\n// ============================================================================\n\nexport const DocumentMarginsSchema = Type.Object(\n {\n top: Type.Number({ minimum: 0 }),\n bottom: Type.Number({ minimum: 0 }),\n left: Type.Number({ minimum: 0 }),\n right: Type.Number({ minimum: 0 }),\n header: Type.Number({ minimum: 0 }),\n footer: Type.Number({ minimum: 0 }),\n gutter: Type.Number({ minimum: 0 }),\n },\n { additionalProperties: false, description: 'Document margin configuration' }\n);\n\n// ============================================================================\n// Page Dimensions Schema\n// ============================================================================\n\nexport const PageDimensionsSchema = Type.Object(\n {\n width: Type.Number({ minimum: 0 }),\n height: Type.Number({ minimum: 0 }),\n },\n { additionalProperties: false, description: 'Page dimensions in twips' }\n);\n\n// ============================================================================\n// Page Schema (replaces PageSetupSchema)\n// ============================================================================\n\nexport const PageSchema = Type.Object(\n {\n size: Type.Union(\n [\n Type.Literal('A4'),\n Type.Literal('A3'),\n Type.Literal('LETTER'),\n Type.Literal('LEGAL'),\n Type.Object(\n {\n width: Type.Number({ minimum: 0 }),\n height: Type.Number({ minimum: 0 }),\n },\n { additionalProperties: false }\n ),\n ],\n { description: 'Standard page size or custom dimensions' }\n ),\n margins: DocumentMarginsSchema,\n },\n {\n description: 'Page configuration including dimensions and margins',\n additionalProperties: false,\n }\n);\n\n// ============================================================================\n// Text formatting and font schemas now imported from './font' to avoid cycles\n\n// ============================================================================\n// Fonts Schema\n// ============================================================================\n\nexport const FontsSchema = Type.Object(\n {\n heading: FontDefinitionSchema,\n body: FontDefinitionSchema,\n mono: FontDefinitionSchema,\n light: FontDefinitionSchema,\n },\n {\n additionalProperties: false,\n description: 'Font definitions for different text types',\n }\n);\n\n// ============================================================================\n// Style Definitions Schema\n// ============================================================================\n\n// Paragraph border style support (matches docx BorderStyle)\nconst BorderStyleSchema = Type.Union(\n [\n Type.Literal('single'),\n Type.Literal('dashDotStroked'),\n Type.Literal('dashed'),\n Type.Literal('dashSmallGap'),\n Type.Literal('dotDash'),\n Type.Literal('dotDotDash'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('doubleWave'),\n Type.Literal('inset'),\n Type.Literal('nil'),\n Type.Literal('none'),\n Type.Literal('outset'),\n Type.Literal('thick'),\n Type.Literal('thickThinLargeGap'),\n Type.Literal('thickThinMediumGap'),\n Type.Literal('thickThinSmallGap'),\n Type.Literal('thinThickLargeGap'),\n Type.Literal('thinThickMediumGap'),\n Type.Literal('thinThickSmallGap'),\n Type.Literal('thinThickThinLargeGap'),\n Type.Literal('thinThickThinMediumGap'),\n Type.Literal('thinThickThinSmallGap'),\n Type.Literal('threeDEmboss'),\n Type.Literal('threeDEngrave'),\n Type.Literal('triple'),\n Type.Literal('wave'),\n ],\n { description: 'Paragraph border style' }\n);\n\nconst BorderDefinitionSchema = Type.Object(\n {\n style: BorderStyleSchema,\n size: Type.Number({\n minimum: 0,\n description: 'Width in eighths of a point (docx sz)',\n }),\n color: HexColorSchema,\n space: Type.Optional(\n Type.Number({\n minimum: 0,\n description: 'Space between text and border in points',\n })\n ),\n },\n {\n additionalProperties: false,\n description: 'Paragraph border side definition',\n }\n);\n\nconst BordersSchema = Type.Object(\n {\n top: Type.Optional(BorderDefinitionSchema),\n bottom: Type.Optional(BorderDefinitionSchema),\n left: Type.Optional(BorderDefinitionSchema),\n right: Type.Optional(BorderDefinitionSchema),\n },\n { additionalProperties: false, description: 'Paragraph borders (per side)' }\n);\n\n// Alignment schema for paragraph-level alignment (used in styles)\nconst AlignmentSchema = Type.Optional(\n Type.Union([\n Type.Literal('left'),\n Type.Literal('center'),\n Type.Literal('right'),\n Type.Literal('justify'),\n ])\n);\n\n/**\n * Style properties schema that extends text formatting properties\n * with additional style-specific properties (priority, baseStyle, etc.)\n */\nconst StylePropertiesSchema = Type.Object(\n {\n font: Type.Optional(\n Type.Union([\n Type.Literal('heading'),\n Type.Literal('body'),\n Type.Literal('mono'),\n Type.Literal('light'),\n ])\n ),\n ...TextFormattingPropertiesSchema.properties,\n // Paragraph-level alignment (not a font property)\n alignment: AlignmentSchema,\n // Additional properties specific to styles\n priority: Type.Optional(Type.Number()),\n baseStyle: Type.Optional(Type.String()),\n followingStyle: Type.Optional(Type.String()),\n widowControl: Type.Optional(Type.Boolean()),\n keepNext: Type.Optional(Type.Boolean()),\n keepLinesTogether: Type.Optional(Type.Boolean()),\n outlineLevel: Type.Optional(Type.Number()),\n borders: Type.Optional(BordersSchema),\n indent: Type.Optional(IndentSchema),\n },\n { additionalProperties: false }\n);\n\n// ============================================================================\n// Tab Stop Schema\n// ============================================================================\n\n/**\n * Tab stop leader types matching docx.js LeaderType\n */\nconst TabStopLeaderSchema = Type.Union(\n [\n Type.Literal('dot'),\n Type.Literal('hyphen'),\n Type.Literal('middleDot'),\n Type.Literal('none'),\n Type.Literal('underscore'),\n ],\n {\n description:\n 'Tab leader style: dot (dotted), hyphen (dashed), middleDot, none (blank), or underscore',\n }\n);\n\n/**\n * Tab stop type matching docx.js TabStopType\n */\nconst TabStopTypeSchema = Type.Union(\n [\n Type.Literal('left'),\n Type.Literal('right'),\n Type.Literal('center'),\n Type.Literal('bar'),\n Type.Literal('clear'),\n Type.Literal('decimal'),\n Type.Literal('end'),\n Type.Literal('num'),\n Type.Literal('start'),\n ],\n {\n description: 'Tab stop alignment type',\n }\n);\n\n/**\n * Tab stop definition schema\n */\nconst TabStopDefinitionSchema = Type.Object(\n {\n type: TabStopTypeSchema,\n position: Type.Union([\n Type.Number({\n description:\n 'Tab stop position in twips (1/1440 inch). Common: 9026 for right-aligned at page margin',\n }),\n Type.Literal('max', {\n description: 'Use maximum position (TabStopPosition.MAX = 9026 twips)',\n }),\n ]),\n leader: Type.Optional(TabStopLeaderSchema),\n },\n {\n description:\n 'Tab stop configuration with position, alignment, and optional leader',\n additionalProperties: false,\n }\n);\n\n/**\n * TOC style properties schema that extends text formatting properties\n * but EXCLUDES baseStyle to prevent unwanted coupling with Heading styles\n */\nconst TocStylePropertiesSchema = Type.Object(\n {\n font: Type.Optional(\n Type.Union([\n Type.Literal('heading'),\n Type.Literal('body'),\n Type.Literal('mono'),\n Type.Literal('light'),\n ])\n ),\n ...TextFormattingPropertiesSchema.properties,\n // Paragraph-level alignment (not a font property)\n alignment: AlignmentSchema,\n // Tab stops for controlling TOC entry formatting (leader dots, alignment, etc.)\n tabStops: Type.Optional(\n Type.Array(TabStopDefinitionSchema, {\n description:\n 'Tab stops for TOC entries. Use right-aligned tab with leader to create dotted lines to page numbers.',\n default: [{ type: 'right', position: 'max', leader: 'none' }],\n })\n ),\n // Additional properties specific to styles (baseStyle intentionally excluded)\n priority: Type.Optional(Type.Number()),\n followingStyle: Type.Optional(Type.String()),\n widowControl: Type.Optional(Type.Boolean()),\n keepNext: Type.Optional(Type.Boolean()),\n keepLinesTogether: Type.Optional(Type.Boolean()),\n outlineLevel: Type.Optional(Type.Number()),\n borders: Type.Optional(BordersSchema),\n indent: Type.Optional(IndentSchema),\n },\n { additionalProperties: false }\n);\n\nexport const StyleDefinitionsSchema = Type.Object(\n {\n normal: Type.Optional(StylePropertiesSchema),\n heading1: Type.Optional(StylePropertiesSchema),\n heading2: Type.Optional(StylePropertiesSchema),\n heading3: Type.Optional(StylePropertiesSchema),\n heading4: Type.Optional(StylePropertiesSchema),\n heading5: Type.Optional(StylePropertiesSchema),\n heading6: Type.Optional(StylePropertiesSchema),\n title: Type.Optional(StylePropertiesSchema),\n subtitle: Type.Optional(StylePropertiesSchema),\n // TOC entry styles (used by Word to format TOC entries)\n // Note: TOC styles use TocStylePropertiesSchema which excludes baseStyle to prevent coupling with Headings\n TOC1: Type.Optional(TocStylePropertiesSchema),\n TOC2: Type.Optional(TocStylePropertiesSchema),\n TOC3: Type.Optional(TocStylePropertiesSchema),\n TOC4: Type.Optional(TocStylePropertiesSchema),\n TOC5: Type.Optional(TocStylePropertiesSchema),\n TOC6: Type.Optional(TocStylePropertiesSchema),\n },\n {\n additionalProperties: StylePropertiesSchema,\n description:\n 'Style definitions supporting predefined styles (normal, heading1..6, title, subtitle), TOC entry styles (TOC1..TOC6), and arbitrary custom styles.',\n }\n);\n\n// ============================================================================\n// Heading Definition Schema\n// ============================================================================\n\n/**\n * Heading definition schema that uses the same properties as StylePropertiesSchema\n * but adds a required 'level' field.\n */\nexport const HeadingDefinitionSchema = Type.Object(\n {\n level: Type.Union([\n Type.Literal(1),\n Type.Literal(2),\n Type.Literal(3),\n Type.Literal(4),\n Type.Literal(5),\n Type.Literal(6),\n ]),\n ...StylePropertiesSchema.properties,\n },\n { additionalProperties: false }\n);\n\n// ============================================================================\n// Component Defaults Schemas (imported from component-defaults.ts to avoid\n// circular deps: report.ts needs ComponentDefaultsSchema, but the old location\n// here imported from the components barrel which re-exports report.ts)\n// ============================================================================\n\nimport { ComponentDefaultsSchema } from './component-defaults';\n\nexport {\n HeadingComponentDefaultsSchema,\n ParagraphComponentDefaultsSchema,\n ImageComponentDefaultsSchema,\n StatisticComponentDefaultsSchema,\n TableComponentDefaultsSchema,\n SectionComponentDefaultsSchema,\n ColumnsComponentDefaultsSchema,\n ListComponentDefaultsSchema,\n ComponentDefaultsSchema,\n} from './component-defaults';\n\n// ============================================================================\n// Theme Config Schema\n// ============================================================================\n\nexport const ThemeConfigSchema = Type.Object(\n {\n $schema: Type.Optional(Type.String()),\n name: Type.String(),\n displayName: Type.String(),\n description: Type.String(),\n version: Type.String(),\n colors: Type.Object(\n {\n primary: HexColorSchema,\n secondary: HexColorSchema,\n accent: HexColorSchema,\n text: HexColorSchema,\n background: HexColorSchema,\n border: HexColorSchema,\n // Additional semantic color names\n textPrimary: HexColorSchema,\n textSecondary: HexColorSchema,\n textMuted: HexColorSchema,\n borderPrimary: HexColorSchema,\n borderSecondary: HexColorSchema,\n backgroundPrimary: HexColorSchema,\n backgroundSecondary: HexColorSchema,\n // Extra chart-series slots, named to match the PPTX theme so both\n // formats share one palette vocabulary. Optional: the bundled DOCX\n // themes leave them unset and charts skip the empty slots.\n accent4: Type.Optional(HexColorSchema),\n accent5: Type.Optional(HexColorSchema),\n accent6: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n ),\n fonts: FontsSchema,\n page: PageSchema,\n styles: Type.Optional(StyleDefinitionsSchema),\n componentDefaults: Type.Optional(ComponentDefaultsSchema),\n // House-style \"known words\" allowlist (whole-word, case-insensitive) that\n // should never be flagged as misspelled. The document's `noProofWords` is\n // merged on top of this at render time.\n noProofWords: Type.Optional(\n Type.Array(Type.String({ minLength: 1 }), {\n description:\n 'Words that should never be flagged as misspelled (whole-word, case-insensitive).',\n })\n ),\n },\n {\n additionalProperties: false,\n description: 'Theme configuration',\n }\n);\n\n// ============================================================================\n// TypeScript Types\n// ============================================================================\n\nexport type ThemeConfigJson = Static<typeof ThemeConfigSchema>;\nexport type DocumentMargins = Static<typeof DocumentMarginsSchema>;\nexport type PageDimensions = Static<typeof PageDimensionsSchema>;\nexport type Page = Static<typeof PageSchema>;\nexport type FontDefinition = Static<typeof FontDefinitionSchema>;\nexport type Fonts = Static<typeof FontsSchema>;\nexport type StyleDefinitions = Static<typeof StyleDefinitionsSchema>;\nexport type HeadingDefinition = Static<typeof HeadingDefinitionSchema>;\nexport type {\n HeadingComponentDefaults,\n ParagraphComponentDefaults,\n ImageComponentDefaults,\n StatisticComponentDefaults,\n TableComponentDefaults,\n SectionComponentDefaults,\n ColumnsComponentDefaults,\n ListComponentDefaults,\n ComponentDefaults,\n} from './component-defaults';\n\n// ============================================================================\n// Validation Function\n// ============================================================================\n\nimport { Value } from '@sinclair/typebox/value';\n\nexport function isValidThemeConfig(data: unknown): data is ThemeConfigJson {\n return Value.Check(ThemeConfigSchema, data);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/schemas/theme.ts"],"sourcesContent":["/**\n * Theme Schema Definitions using TypeBox\n * This file provides TypeBox schemas for theme configuration validation\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport {\n FontDefinitionSchema,\n TextFormattingPropertiesSchema,\n HexColorSchema,\n} from './font';\nimport { IndentSchema } from './components/common';\n\n// ============================================================================\n// Document Margins Schema\n// ============================================================================\n\nexport const DocumentMarginsSchema = Type.Object(\n {\n top: Type.Number({ minimum: 0 }),\n bottom: Type.Number({ minimum: 0 }),\n left: Type.Number({ minimum: 0 }),\n right: Type.Number({ minimum: 0 }),\n header: Type.Number({ minimum: 0 }),\n footer: Type.Number({ minimum: 0 }),\n gutter: Type.Number({ minimum: 0 }),\n },\n { additionalProperties: false, description: 'Document margin configuration' }\n);\n\n// ============================================================================\n// Page Dimensions Schema\n// ============================================================================\n\nexport const PageDimensionsSchema = Type.Object(\n {\n width: Type.Number({ minimum: 0 }),\n height: Type.Number({ minimum: 0 }),\n },\n { additionalProperties: false, description: 'Page dimensions in twips' }\n);\n\n// ============================================================================\n// Page Schema (replaces PageSetupSchema)\n// ============================================================================\n\nexport const PageSchema = Type.Object(\n {\n size: Type.Union(\n [\n Type.Literal('A4'),\n Type.Literal('A3'),\n Type.Literal('LETTER'),\n Type.Literal('LEGAL'),\n Type.Object(\n {\n width: Type.Number({ minimum: 0 }),\n height: Type.Number({ minimum: 0 }),\n },\n { additionalProperties: false }\n ),\n ],\n { description: 'Standard page size or custom dimensions' }\n ),\n margins: DocumentMarginsSchema,\n },\n {\n description: 'Page configuration including dimensions and margins',\n additionalProperties: false,\n }\n);\n\n// ============================================================================\n// Text formatting and font schemas now imported from './font' to avoid cycles\n\n// ============================================================================\n// Fonts Schema\n// ============================================================================\n\nexport const FontsSchema = Type.Object(\n {\n heading: FontDefinitionSchema,\n body: FontDefinitionSchema,\n mono: FontDefinitionSchema,\n light: FontDefinitionSchema,\n },\n {\n additionalProperties: false,\n description: 'Font definitions for different text types',\n }\n);\n\n// ============================================================================\n// Style Definitions Schema\n// ============================================================================\n\n// Paragraph border style support (matches docx BorderStyle)\nconst BorderStyleSchema = Type.Union(\n [\n Type.Literal('single'),\n Type.Literal('dashDotStroked'),\n Type.Literal('dashed'),\n Type.Literal('dashSmallGap'),\n Type.Literal('dotDash'),\n Type.Literal('dotDotDash'),\n Type.Literal('dotted'),\n Type.Literal('double'),\n Type.Literal('doubleWave'),\n Type.Literal('inset'),\n Type.Literal('nil'),\n Type.Literal('none'),\n Type.Literal('outset'),\n Type.Literal('thick'),\n Type.Literal('thickThinLargeGap'),\n Type.Literal('thickThinMediumGap'),\n Type.Literal('thickThinSmallGap'),\n Type.Literal('thinThickLargeGap'),\n Type.Literal('thinThickMediumGap'),\n Type.Literal('thinThickSmallGap'),\n Type.Literal('thinThickThinLargeGap'),\n Type.Literal('thinThickThinMediumGap'),\n Type.Literal('thinThickThinSmallGap'),\n Type.Literal('threeDEmboss'),\n Type.Literal('threeDEngrave'),\n Type.Literal('triple'),\n Type.Literal('wave'),\n ],\n { description: 'Paragraph border style' }\n);\n\nconst BorderDefinitionSchema = Type.Object(\n {\n style: BorderStyleSchema,\n size: Type.Number({\n minimum: 0,\n description: 'Width in eighths of a point (docx sz)',\n }),\n color: HexColorSchema,\n space: Type.Optional(\n Type.Number({\n minimum: 0,\n description: 'Space between text and border in points',\n })\n ),\n },\n {\n additionalProperties: false,\n description: 'Paragraph border side definition',\n }\n);\n\nconst BordersSchema = Type.Object(\n {\n top: Type.Optional(BorderDefinitionSchema),\n bottom: Type.Optional(BorderDefinitionSchema),\n left: Type.Optional(BorderDefinitionSchema),\n right: Type.Optional(BorderDefinitionSchema),\n },\n { additionalProperties: false, description: 'Paragraph borders (per side)' }\n);\n\n// Alignment schema for paragraph-level alignment (used in styles)\nconst AlignmentSchema = Type.Optional(\n Type.Union([\n Type.Literal('left'),\n Type.Literal('center'),\n Type.Literal('right'),\n Type.Literal('justify'),\n ])\n);\n\n/**\n * Style properties schema that extends text formatting properties\n * with additional style-specific properties (priority, baseStyle, etc.)\n */\nconst StylePropertiesSchema = Type.Object(\n {\n font: Type.Optional(\n Type.Union([\n Type.Literal('heading'),\n Type.Literal('body'),\n Type.Literal('mono'),\n Type.Literal('light'),\n ])\n ),\n ...TextFormattingPropertiesSchema.properties,\n // Paragraph-level alignment (not a font property)\n alignment: AlignmentSchema,\n // Additional properties specific to styles\n priority: Type.Optional(Type.Number()),\n baseStyle: Type.Optional(Type.String()),\n followingStyle: Type.Optional(Type.String()),\n widowControl: Type.Optional(Type.Boolean()),\n keepNext: Type.Optional(Type.Boolean()),\n keepLinesTogether: Type.Optional(Type.Boolean()),\n outlineLevel: Type.Optional(Type.Number()),\n borders: Type.Optional(BordersSchema),\n indent: Type.Optional(IndentSchema),\n },\n { additionalProperties: false }\n);\n\n// ============================================================================\n// Tab Stop Schema\n// ============================================================================\n\n/**\n * Tab stop leader types matching docx.js LeaderType\n */\nconst TabStopLeaderSchema = Type.Union(\n [\n Type.Literal('dot'),\n Type.Literal('hyphen'),\n Type.Literal('middleDot'),\n Type.Literal('none'),\n Type.Literal('underscore'),\n ],\n {\n description:\n 'Tab leader style: dot (dotted), hyphen (dashed), middleDot, none (blank), or underscore',\n }\n);\n\n/**\n * Tab stop type matching docx.js TabStopType\n */\nconst TabStopTypeSchema = Type.Union(\n [\n Type.Literal('left'),\n Type.Literal('right'),\n Type.Literal('center'),\n Type.Literal('bar'),\n Type.Literal('clear'),\n Type.Literal('decimal'),\n Type.Literal('end'),\n Type.Literal('num'),\n Type.Literal('start'),\n ],\n {\n description: 'Tab stop alignment type',\n }\n);\n\n/**\n * Tab stop definition schema\n */\nconst TabStopDefinitionSchema = Type.Object(\n {\n type: TabStopTypeSchema,\n position: Type.Union([\n Type.Number({\n description:\n 'Tab stop position in twips (1/1440 inch). Common: 9026 for right-aligned at page margin',\n }),\n Type.Literal('max', {\n description: 'Use maximum position (TabStopPosition.MAX = 9026 twips)',\n }),\n ]),\n leader: Type.Optional(TabStopLeaderSchema),\n },\n {\n description:\n 'Tab stop configuration with position, alignment, and optional leader',\n additionalProperties: false,\n }\n);\n\n/**\n * TOC style properties schema that extends text formatting properties\n * but EXCLUDES baseStyle to prevent unwanted coupling with Heading styles\n */\nconst TocStylePropertiesSchema = Type.Object(\n {\n font: Type.Optional(\n Type.Union([\n Type.Literal('heading'),\n Type.Literal('body'),\n Type.Literal('mono'),\n Type.Literal('light'),\n ])\n ),\n ...TextFormattingPropertiesSchema.properties,\n // Paragraph-level alignment (not a font property)\n alignment: AlignmentSchema,\n // Tab stops for controlling TOC entry formatting (leader dots, alignment, etc.)\n tabStops: Type.Optional(\n Type.Array(TabStopDefinitionSchema, {\n description:\n 'Tab stops for TOC entries. Use right-aligned tab with leader to create dotted lines to page numbers.',\n default: [{ type: 'right', position: 'max', leader: 'none' }],\n })\n ),\n // Additional properties specific to styles (baseStyle intentionally excluded)\n priority: Type.Optional(Type.Number()),\n followingStyle: Type.Optional(Type.String()),\n widowControl: Type.Optional(Type.Boolean()),\n keepNext: Type.Optional(Type.Boolean()),\n keepLinesTogether: Type.Optional(Type.Boolean()),\n outlineLevel: Type.Optional(Type.Number()),\n borders: Type.Optional(BordersSchema),\n indent: Type.Optional(IndentSchema),\n },\n { additionalProperties: false }\n);\n\nexport const StyleDefinitionsSchema = Type.Object(\n {\n normal: Type.Optional(StylePropertiesSchema),\n heading1: Type.Optional(StylePropertiesSchema),\n heading2: Type.Optional(StylePropertiesSchema),\n heading3: Type.Optional(StylePropertiesSchema),\n heading4: Type.Optional(StylePropertiesSchema),\n heading5: Type.Optional(StylePropertiesSchema),\n heading6: Type.Optional(StylePropertiesSchema),\n title: Type.Optional(StylePropertiesSchema),\n subtitle: Type.Optional(StylePropertiesSchema),\n // TOC entry styles (used by Word to format TOC entries)\n // Note: TOC styles use TocStylePropertiesSchema which excludes baseStyle to prevent coupling with Headings\n TOC1: Type.Optional(TocStylePropertiesSchema),\n TOC2: Type.Optional(TocStylePropertiesSchema),\n TOC3: Type.Optional(TocStylePropertiesSchema),\n TOC4: Type.Optional(TocStylePropertiesSchema),\n TOC5: Type.Optional(TocStylePropertiesSchema),\n TOC6: Type.Optional(TocStylePropertiesSchema),\n },\n {\n additionalProperties: StylePropertiesSchema,\n description:\n 'Style definitions supporting predefined styles (normal, heading1..6, title, subtitle), TOC entry styles (TOC1..TOC6), and arbitrary custom styles.',\n }\n);\n\n// ============================================================================\n// Heading Definition Schema\n// ============================================================================\n\n/**\n * Heading definition schema that uses the same properties as StylePropertiesSchema\n * but adds a required 'level' field.\n */\nexport const HeadingDefinitionSchema = Type.Object(\n {\n level: Type.Union([\n Type.Literal(1),\n Type.Literal(2),\n Type.Literal(3),\n Type.Literal(4),\n Type.Literal(5),\n Type.Literal(6),\n ]),\n ...StylePropertiesSchema.properties,\n },\n { additionalProperties: false }\n);\n\n// ============================================================================\n// Component Defaults Schemas (imported from component-defaults.ts to avoid\n// circular deps: report.ts needs ComponentDefaultsSchema, but the old location\n// here imported from the components barrel which re-exports report.ts)\n// ============================================================================\n\nimport { ComponentDefaultsSchema } from './component-defaults';\n\nexport {\n HeadingComponentDefaultsSchema,\n ParagraphComponentDefaultsSchema,\n ImageComponentDefaultsSchema,\n StatisticComponentDefaultsSchema,\n TableComponentDefaultsSchema,\n SectionComponentDefaultsSchema,\n ColumnsComponentDefaultsSchema,\n ListComponentDefaultsSchema,\n ComponentDefaultsSchema,\n} from './component-defaults';\n\n// ============================================================================\n// Theme Config Schema\n// ============================================================================\n\nexport const ThemeConfigSchema = Type.Object(\n {\n $schema: Type.Optional(Type.String()),\n name: Type.String(),\n displayName: Type.String(),\n description: Type.String(),\n version: Type.String(),\n colors: Type.Object(\n {\n primary: HexColorSchema,\n secondary: HexColorSchema,\n accent: HexColorSchema,\n text: HexColorSchema,\n background: HexColorSchema,\n border: HexColorSchema,\n // Additional semantic color names\n textPrimary: HexColorSchema,\n textSecondary: HexColorSchema,\n textMuted: HexColorSchema,\n borderPrimary: HexColorSchema,\n borderSecondary: HexColorSchema,\n backgroundPrimary: HexColorSchema,\n backgroundSecondary: HexColorSchema,\n // Extra chart-series slots, named to match the PPTX theme so both\n // formats share one palette vocabulary. Optional: the bundled DOCX\n // themes leave them unset and charts skip the empty slots.\n accent4: Type.Optional(HexColorSchema),\n accent5: Type.Optional(HexColorSchema),\n accent6: Type.Optional(HexColorSchema),\n },\n { additionalProperties: false }\n ),\n fonts: FontsSchema,\n page: PageSchema,\n styles: Type.Optional(StyleDefinitionsSchema),\n componentDefaults: Type.Optional(ComponentDefaultsSchema),\n // House-style \"known words\" allowlist (whole-word, case-insensitive) that\n // should never be flagged as misspelled. The document's `noProofWords` is\n // merged on top of this at render time.\n noProofWords: Type.Optional(\n Type.Array(Type.String({ minLength: 1 }), {\n description:\n 'Words that should never be flagged as misspelled (whole-word, case-insensitive).',\n })\n ),\n },\n {\n additionalProperties: false,\n description: 'Theme configuration',\n }\n);\n\n// ============================================================================\n// TypeScript Types\n// ============================================================================\n\nexport type ThemeConfigJson = Static<typeof ThemeConfigSchema>;\nexport type DocumentMargins = Static<typeof DocumentMarginsSchema>;\nexport type PageDimensions = Static<typeof PageDimensionsSchema>;\nexport type Page = Static<typeof PageSchema>;\nexport type FontDefinition = Static<typeof FontDefinitionSchema>;\nexport type Fonts = Static<typeof FontsSchema>;\nexport type StyleDefinitions = Static<typeof StyleDefinitionsSchema>;\nexport type HeadingDefinition = Static<typeof HeadingDefinitionSchema>;\nexport type {\n HeadingComponentDefaults,\n ParagraphComponentDefaults,\n ImageComponentDefaults,\n StatisticComponentDefaults,\n TableComponentDefaults,\n SectionComponentDefaults,\n ColumnsComponentDefaults,\n ListComponentDefaults,\n ComponentDefaults,\n} from './component-defaults';\n\n// ============================================================================\n// Validation Function\n// ============================================================================\n\nimport { Value } from '@sinclair/typebox/value';\n\nexport function isValidThemeConfig(data: unknown): data is ThemeConfigJson {\n return Value.Check(ThemeConfigSchema, data);\n}\n\n// ============================================================================\n// Minimal Theme Scaffold\n// ============================================================================\n\n/**\n * Build a schema-complete theme to start from.\n *\n * Lives next to `ThemeConfigSchema` on purpose: the return type is the schema's\n * `Static` type, so a required property added to the schema breaks the build\n * here instead of shipping a scaffold that only fails at validation time.\n * Colour patterns are runtime-only, so `theme-scaffold.test.ts` validates the\n * result against the schema as well.\n *\n * Browser-safe (no Node built-ins), so the playground can scaffold new themes\n * from the same source as the CLI.\n *\n * @param name - Theme identifier; defaults to `minimal-theme`\n */\nexport function createMinimalTheme(\n name: string = 'minimal-theme'\n): ThemeConfigJson {\n return {\n name,\n displayName:\n name\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ') || name,\n description: 'A minimal theme with basic styling',\n version: '1.0.0',\n colors: {\n primary: '#2563EB',\n secondary: '#64748B',\n accent: '#F8FAFC',\n text: '#334155',\n background: '#FFFFFF',\n border: '#E2E8F0',\n textPrimary: '#334155',\n textSecondary: '#64748B',\n textMuted: '#94A3B8',\n borderPrimary: '#CBD5E1',\n borderSecondary: '#E2E8F0',\n backgroundPrimary: '#FFFFFF',\n backgroundSecondary: '#F8FAFC',\n },\n fonts: {\n heading: { family: 'Arial', size: 14 },\n body: { family: 'Arial', size: 11 },\n mono: { family: 'Courier New', size: 10 },\n light: { family: 'Arial', size: 10 },\n },\n page: {\n size: 'A4',\n margins: {\n top: 1440,\n bottom: 1440,\n left: 1440,\n right: 1440,\n header: 720,\n footer: 720,\n gutter: 0,\n },\n },\n styles: {\n normal: {\n font: 'body',\n size: 11,\n color: '#334155',\n alignment: 'left',\n lineSpacing: { type: 'multiple', value: 1.15 },\n spacing: { after: 8 },\n },\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ThemeConfigSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-3JOBFRYR.js";
|
|
4
4
|
import {
|
|
5
5
|
documentValidator,
|
|
6
6
|
strictDocumentValidator,
|
|
@@ -416,4 +416,4 @@ export {
|
|
|
416
416
|
createErrorConfig,
|
|
417
417
|
formatErrorMessage
|
|
418
418
|
};
|
|
419
|
-
//# sourceMappingURL=chunk-
|
|
419
|
+
//# sourceMappingURL=chunk-GJBRYTGZ.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { Alignment, AlignmentSchema, BaseComponentProps, BaseComponentPropsSchem
|
|
|
3
3
|
export { AddWarningFunction, ComponentSchemaConfig, DEFAULT_ERROR_CONFIG, ERROR_EMOJIS, ErrorFormatterConfig, GenerationWarning, ParsedSemver, ComponentDefinition as SharedComponentDefinition, ValidationError, ValidationResult, calculatePosition, clearComponentNamesCache, compareSemver, convertToJsonSchema, createComponentSchema, createErrorConfig, createJsonParseError, exportSchemaToFile, extractStandardComponentNames, fixSchemaReferences, formatErrorMessage, formatErrorSummary, getLiteralValue, getObjectSchemaPropertyNames, getSchemaMetadata, groupErrorsByPath, isLiteralSchema, isObjectSchema, isUnionSchema, isValidSemver, latestVersion, parseSemver, createComponentSchemaObject as sharedCreateComponentSchemaObject, transformValueError, transformValueErrors } from '@json-to-office/shared';
|
|
4
4
|
import { DocumentValidationResult, ValidationError } from './schemas/document.js';
|
|
5
5
|
export { JSON_SCHEMA_URLS, JsonComponentDefinitionSchema } from './schemas/document.js';
|
|
6
|
-
export { DocumentMargins, FontDefinition, Fonts, HeadingDefinition, Page, PageDimensions, StyleDefinitions, ThemeConfigJson, ThemeConfigSchema, isValidThemeConfig } from './schemas/theme.js';
|
|
6
|
+
export { DocumentMargins, FontDefinition, Fonts, HeadingDefinition, Page, PageDimensions, StyleDefinitions, ThemeConfigJson, ThemeConfigSchema, createMinimalTheme, isValidThemeConfig } from './schemas/theme.js';
|
|
7
7
|
export { GenerateDocumentRequest, GenerateDocumentRequestSchema, GenerateDocumentResponse, GenerateDocumentResponseSchema, ValidateDocumentRequest, ValidateDocumentRequestSchema, ValidateDocumentResponse, ValidateDocumentResponseSchema } from './schemas/api.js';
|
|
8
8
|
import * as _sinclair_typebox from '@sinclair/typebox';
|
|
9
9
|
import { Static } from '@sinclair/typebox';
|
package/dist/index.js
CHANGED
|
@@ -32,11 +32,12 @@ import {
|
|
|
32
32
|
validateTheme,
|
|
33
33
|
validateThemeJson,
|
|
34
34
|
validateThemeWithEnhancement
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-GJBRYTGZ.js";
|
|
36
36
|
import {
|
|
37
37
|
ThemeConfigSchema,
|
|
38
|
+
createMinimalTheme,
|
|
38
39
|
isValidThemeConfig
|
|
39
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-3JOBFRYR.js";
|
|
40
41
|
import {
|
|
41
42
|
GenerateDocumentRequestSchema,
|
|
42
43
|
GenerateDocumentResponseSchema,
|
|
@@ -1695,6 +1696,7 @@ export {
|
|
|
1695
1696
|
createErrorConfig,
|
|
1696
1697
|
createJsonParseError,
|
|
1697
1698
|
createJsonValidator,
|
|
1699
|
+
createMinimalTheme,
|
|
1698
1700
|
createThemeValidator,
|
|
1699
1701
|
createValidatedComponent,
|
|
1700
1702
|
createValidator,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diff/word-diff.ts","../src/diff/document-diff.ts","../src/index.ts","../src/validation/parsers/json.ts","../src/validation/validators/theme.ts","../src/validation/validators/component.ts","../src/validation/core/validator.ts","../src/validation/core/errors.ts","../src/types/components.ts"],"sourcesContent":["/**\n * Word-level text diff\n *\n * Tokenizes text into words and whitespace, runs an LCS diff over the\n * tokens, and emits revision segments. Pure, dependency-free.\n */\n\nimport type { RevisionSegment } from '../schemas/components/revision';\n\n/**\n * Anchored to the schema type so the diff engine can never emit segments\n * the RevisionSchema would reject.\n */\nexport type DiffSegment = RevisionSegment;\n\n/**\n * Above this many DP cells the LCS table is not worth building: fall back\n * to a whole-text replace. ~1000x1000 tokens covers any realistic paragraph.\n */\nconst MAX_LCS_CELLS = 1_000_000;\n\n/** Split into alternating word / whitespace tokens (both preserved). */\nexport function tokenizeWords(text: string): string[] {\n if (!text) return [];\n return text.split(/(\\s+)/).filter((t) => t.length > 0);\n}\n\nfunction mergeSegments(segments: DiffSegment[]): DiffSegment[] {\n const merged: DiffSegment[] = [];\n for (const seg of segments) {\n if (!seg.text) continue;\n const last = merged[merged.length - 1];\n if (last && last.type === seg.type) {\n last.text += seg.text;\n } else {\n merged.push({ ...seg });\n }\n }\n return merged;\n}\n\n/**\n * Readability pass over the raw LCS output:\n * 1. A whitespace-only equal segment flanked by changes joins the change\n * (the space is both deleted and re-inserted), so \"x y\" -> \"a b\" reads\n * as one replacement instead of three fragments.\n * 2. Within each change run, deletions are emitted before insertions.\n * The old/new reconstruction invariant is preserved.\n */\nfunction normalizeSegments(segments: DiffSegment[]): DiffSegment[] {\n const folded: DiffSegment[] = [];\n for (let k = 0; k < segments.length; k++) {\n const seg = segments[k];\n if (seg.type === 'equal' && /^\\s+$/.test(seg.text)) {\n const prev = folded[folded.length - 1];\n const next = segments[k + 1];\n if (prev && prev.type !== 'equal' && next && next.type !== 'equal') {\n folded.push(\n { type: 'delete', text: seg.text },\n { type: 'insert', text: seg.text }\n );\n continue;\n }\n }\n folded.push({ ...seg });\n }\n\n const out: DiffSegment[] = [];\n let k = 0;\n while (k < folded.length) {\n if (folded[k].type === 'equal') {\n out.push(folded[k]);\n k++;\n continue;\n }\n let deleted = '';\n let inserted = '';\n while (k < folded.length && folded[k].type !== 'equal') {\n if (folded[k].type === 'delete') deleted += folded[k].text;\n else inserted += folded[k].text;\n k++;\n }\n if (deleted) out.push({ type: 'delete', text: deleted });\n if (inserted) out.push({ type: 'insert', text: inserted });\n }\n return mergeSegments(out);\n}\n\n/**\n * Word-level diff between two strings.\n *\n * Returns merged segments in document order. Deleting everything and\n * inserting everything (whole replace) is the degenerate output for\n * completely different texts or oversized inputs.\n */\nexport function diffWords(oldText: string, newText: string): DiffSegment[] {\n if (oldText === newText) {\n return oldText ? [{ type: 'equal', text: oldText }] : [];\n }\n\n const oldTokens = tokenizeWords(oldText);\n const newTokens = tokenizeWords(newText);\n\n if (oldTokens.length === 0) {\n return mergeSegments([{ type: 'insert', text: newText }]);\n }\n if (newTokens.length === 0) {\n return mergeSegments([{ type: 'delete', text: oldText }]);\n }\n\n if (oldTokens.length * newTokens.length > MAX_LCS_CELLS) {\n return mergeSegments([\n { type: 'delete', text: oldText },\n { type: 'insert', text: newText },\n ]);\n }\n\n // Standard LCS dynamic programming table\n const n = oldTokens.length;\n const m = newTokens.length;\n // lcs[i][j] = LCS length of oldTokens[i..] and newTokens[j..]\n const lcs: Int32Array[] = Array.from(\n { length: n + 1 },\n () => new Int32Array(m + 1)\n );\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i][j] =\n oldTokens[i] === newTokens[j]\n ? lcs[i + 1][j + 1] + 1\n : Math.max(lcs[i + 1][j], lcs[i][j + 1]);\n }\n }\n\n // Backtrack\n const segments: DiffSegment[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (oldTokens[i] === newTokens[j]) {\n segments.push({ type: 'equal', text: oldTokens[i] });\n i++;\n j++;\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) {\n segments.push({ type: 'delete', text: oldTokens[i] });\n i++;\n } else {\n segments.push({ type: 'insert', text: newTokens[j] });\n j++;\n }\n }\n while (i < n) {\n segments.push({ type: 'delete', text: oldTokens[i] });\n i++;\n }\n while (j < m) {\n segments.push({ type: 'insert', text: newTokens[j] });\n j++;\n }\n\n return normalizeSegments(segments);\n}\n\n/**\n * Strip the inline markdown the renderer understands (bold/italic markers,\n * hyperlinks) so revision segments — which render literally — never expose\n * raw markers. Uses the exact decorator regex of textParser.ts (lazy\n * [\\s\\S]*? content), so what the parser would style, this strips — including\n * content containing '*' or '_' (e.g. **snake_case**).\n */\nexport function stripMarkdown(text: string): string {\n return text\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '$1') // [text](url) -> text\n .replace(\n /(\\*\\*\\*|___)([\\s\\S]*?)\\1|(\\*\\*|__)([\\s\\S]*?)\\3|(\\*|_)([\\s\\S]*?)\\5/g,\n (_match, _d1, bi, _d2, b, _d3, i) => bi ?? b ?? i ?? ''\n );\n}\n","/**\n * Document diff engine\n *\n * Compares two json-to-office DOCX definitions and produces a redline\n * document: a third definition (based on the new one) where text changes\n * are expressed as `revision` segments that the renderer turns into native\n * Word tracked changes (w:ins / w:del).\n *\n * Scope (v1):\n * - paragraph / heading: word-level tracked changes\n * - list: item-level alignment, word-level tracked changes per item\n * - containers (section, columns, text-box, ...): recursed into\n * - everything else (table, image, chart, ...): block replace, reported\n * as an *untracked* change in the summary — Word has no native revision\n * for these at the fidelity docx.js supports.\n */\n\nimport { diffWords, stripMarkdown, type DiffSegment } from './word-diff';\n\n/** Structural view of any component node — schemas validate elsewhere. */\nexport interface JsonNode {\n name: string;\n props?: Record<string, unknown>;\n children?: JsonNode[];\n [key: string]: unknown;\n}\n\nexport interface DiffDocumentsOptions {\n /** Revision author shown in Word (default: \"json-to-office\") */\n author?: string;\n /** Revision timestamp, ISO 8601 (default: deterministic epoch) */\n date?: string;\n}\n\nexport interface UntrackedChange {\n /** JSON-pointer-ish location in the NEW document */\n path: string;\n kind: 'modified' | 'inserted' | 'deleted';\n component: string;\n detail: string;\n}\n\nexport interface DiffSummary {\n /** Blocks rendered with native tracked changes */\n tracked: {\n modified: number;\n inserted: number;\n deleted: number;\n };\n /** Changes the redline cannot express as native revisions */\n untracked: UntrackedChange[];\n unchangedBlocks: number;\n /** Aggregate fidelity caveats about the redline */\n notes: string[];\n}\n\nexport interface DiffDocumentsResult {\n /** Redline document definition (renderable as-is) */\n document: JsonNode;\n summary: DiffSummary;\n}\n\nconst TEXT_COMPONENTS = new Set(['paragraph', 'heading']);\n\ntype ListItem = string | { text: string; level?: number };\n\ninterface NormalizedListItem {\n /** Original item text (markdown intact) — emitted for unchanged items */\n raw: string;\n /** NFC-normalized, markdown-stripped text — used for alignment and diffing */\n text: string;\n level: number;\n}\n\ninterface DiffContext {\n author?: string;\n date?: string;\n summary: DiffSummary;\n}\n\n// Key-order sensitive: props objects with the same entries in a different\n// order compare unequal. Acceptable — inputs are machine-generated and a\n// false \"changed\" only adds a spurious untracked summary entry.\nfunction deepEqual(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction makeRevision(ctx: DiffContext, segments: DiffSegment[]) {\n return {\n ...(ctx.author && { author: ctx.author }),\n ...(ctx.date && { date: ctx.date }),\n segments,\n };\n}\n\n/** Raw text prop, NFC-normalized (matching the renderer's normalization). */\nfunction rawText(node: JsonNode): string {\n const text = node.props?.text;\n return typeof text === 'string' ? text.normalize('NFC') : '';\n}\n\n/** Text of a text component as it renders: NFC-normalized, markdown stripped. */\nfunction plainText(node: JsonNode): string {\n return stripMarkdown(rawText(node));\n}\n\nconst PLACEHOLDER_PATTERN = /\\{[^}]+\\}/;\n\n/** A node is rendered unless it explicitly opts out with enabled: false. */\nfunction isEnabled(node: JsonNode): boolean {\n return node.enabled !== false;\n}\n\nfunction notePlaceholdersInChanges(\n segments: DiffSegment[],\n path: string,\n component: string,\n ctx: DiffContext\n): void {\n if (\n segments.some((s) => s.type !== 'equal' && PLACEHOLDER_PATTERN.test(s.text))\n ) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component,\n detail:\n 'placeholder (e.g. {DATE}) inside inserted/deleted text renders literally in the redline',\n });\n }\n}\n\nfunction propsWithout(\n props: Record<string, unknown> | undefined,\n ...keys: string[]\n): Record<string, unknown> {\n const copy = { ...(props || {}) };\n for (const key of keys) delete copy[key];\n return copy;\n}\n\n// ---------------------------------------------------------------------------\n// Generic LCS alignment over arrays\n// ---------------------------------------------------------------------------\n\ntype AlignOp<T> =\n | { op: 'equal'; oldItem: T; newItem: T }\n | { op: 'delete'; oldItem: T }\n | { op: 'insert'; newItem: T };\n\n/**\n * Above this many DP cells the LCS table is not worth its memory (an\n * Int32Array table lives off the V8 heap). Typical edits touch few blocks,\n * so the prefix/suffix trim below makes the table tiny in practice.\n */\nconst MAX_ALIGN_CELLS = 4_000_000;\n\n/** LCS alignment of two arrays under a stable key function. */\nfunction alignByLcs<T>(\n oldItems: T[],\n newItems: T[],\n key: (item: T) => string\n): AlignOp<T>[] {\n const oldKeys = oldItems.map(key);\n const newKeys = newItems.map(key);\n\n // Trim the common prefix and suffix — emitted as equal ops directly\n let start = 0;\n while (\n start < oldItems.length &&\n start < newItems.length &&\n oldKeys[start] === newKeys[start]\n ) {\n start++;\n }\n let oldEnd = oldItems.length;\n let newEnd = newItems.length;\n while (\n oldEnd > start &&\n newEnd > start &&\n oldKeys[oldEnd - 1] === newKeys[newEnd - 1]\n ) {\n oldEnd--;\n newEnd--;\n }\n\n const prefix: AlignOp<T>[] = [];\n for (let k = 0; k < start; k++) {\n prefix.push({ op: 'equal', oldItem: oldItems[k], newItem: newItems[k] });\n }\n const suffix: AlignOp<T>[] = [];\n for (let k = 0; k < oldItems.length - oldEnd; k++) {\n suffix.push({\n op: 'equal',\n oldItem: oldItems[oldEnd + k],\n newItem: newItems[newEnd + k],\n });\n }\n\n const n = oldEnd - start;\n const m = newEnd - start;\n const middle: AlignOp<T>[] = [];\n\n if (n * m > MAX_ALIGN_CELLS) {\n // Degenerate fallback: replace the whole middle\n for (let k = 0; k < n; k++) {\n middle.push({ op: 'delete', oldItem: oldItems[start + k] });\n }\n for (let k = 0; k < m; k++) {\n middle.push({ op: 'insert', newItem: newItems[start + k] });\n }\n return [...prefix, ...middle, ...suffix];\n }\n\n const lcs: Int32Array[] = Array.from(\n { length: n + 1 },\n () => new Int32Array(m + 1)\n );\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i][j] =\n oldKeys[start + i] === newKeys[start + j]\n ? lcs[i + 1][j + 1] + 1\n : Math.max(lcs[i + 1][j], lcs[i][j + 1]);\n }\n }\n\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (oldKeys[start + i] === newKeys[start + j]) {\n middle.push({\n op: 'equal',\n oldItem: oldItems[start + i],\n newItem: newItems[start + j],\n });\n i++;\n j++;\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) {\n middle.push({ op: 'delete', oldItem: oldItems[start + i] });\n i++;\n } else {\n middle.push({ op: 'insert', newItem: newItems[start + j] });\n j++;\n }\n }\n while (i < n) middle.push({ op: 'delete', oldItem: oldItems[start + i++] });\n while (j < m) middle.push({ op: 'insert', newItem: newItems[start + j++] });\n\n return [...prefix, ...middle, ...suffix];\n}\n\n/**\n * Within a run of deletes+inserts between two equal anchors, pair removed\n * and added nodes that share the same component name (\"modified\" instead of\n * \"deleted + inserted\"). Pairing is greedy and order-preserving.\n */\ninterface GapPairing<T> {\n pairs: { oldItem: T; newItem: T }[];\n /** Emission plan preserving relative order */\n plan: (\n | { kind: 'deleted'; oldItem: T }\n | { kind: 'inserted'; newItem: T }\n | { kind: 'paired'; oldItem: T; newItem: T }\n )[];\n}\n\nfunction pairGap<T>(\n deleted: T[],\n inserted: T[],\n pairable: (oldItem: T, newItem: T) => boolean\n): GapPairing<T> {\n const usedOld = new Array<boolean>(deleted.length).fill(false);\n const pairing = new Array<number>(inserted.length).fill(-1);\n\n let searchFrom = 0;\n for (let j = 0; j < inserted.length; j++) {\n for (let i = searchFrom; i < deleted.length; i++) {\n if (!usedOld[i] && pairable(deleted[i], inserted[j])) {\n usedOld[i] = true;\n pairing[j] = i;\n searchFrom = i + 1; // keep pairs order-preserving\n break;\n }\n }\n }\n\n const plan: GapPairing<T>['plan'] = [];\n const pairs: GapPairing<T>['pairs'] = [];\n let emittedOld = 0;\n for (let j = 0; j < inserted.length; j++) {\n const i = pairing[j];\n if (i >= 0) {\n // Old nodes before this pair that were never matched: emit as deleted\n while (emittedOld < i) {\n if (!usedOld[emittedOld]) {\n plan.push({ kind: 'deleted', oldItem: deleted[emittedOld] });\n }\n emittedOld++;\n }\n emittedOld = i + 1;\n plan.push({ kind: 'paired', oldItem: deleted[i], newItem: inserted[j] });\n pairs.push({ oldItem: deleted[i], newItem: inserted[j] });\n } else {\n plan.push({ kind: 'inserted', newItem: inserted[j] });\n }\n }\n for (let i = emittedOld; i < deleted.length; i++) {\n if (!usedOld[i]) plan.push({ kind: 'deleted', oldItem: deleted[i] });\n }\n return { pairs, plan };\n}\n\n// ---------------------------------------------------------------------------\n// Component-level diff\n// ---------------------------------------------------------------------------\n\n/** Modified text component → new node carrying revision segments. */\nfunction diffTextComponent(\n oldNode: JsonNode,\n newNode: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n const oldText = plainText(oldNode);\n const newText = plainText(newNode);\n\n const propsChanged = !deepEqual(\n propsWithout(oldNode.props, 'text', 'revision'),\n propsWithout(newNode.props, 'text', 'revision')\n );\n if (propsChanged) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail:\n 'formatting/props changed (not expressible as a tracked change); new version rendered',\n });\n }\n\n if (oldText === newText) {\n // Same rendered text, but markdown-only differences (bold markers,\n // hyperlink targets) are invisible after stripping — surface them.\n if (rawText(oldNode) !== rawText(newNode)) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail:\n 'inline formatting or link target changed (markdown-only); new version rendered without a tracked change',\n });\n } else if (!propsChanged) {\n ctx.summary.unchangedBlocks++;\n }\n return newNode;\n }\n\n ctx.summary.tracked.modified++;\n const segments = diffWords(oldText, newText);\n notePlaceholdersInChanges(segments, path, newNode.name, ctx);\n // Revision segments render literally, so markdown anywhere in a modified\n // block — including its unchanged portions — is flattened to plain text\n if (rawText(oldNode) !== oldText || rawText(newNode) !== newText) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail:\n 'inline formatting or links flattened to plain text in the redline (revision segments render literally)',\n });\n }\n return {\n ...newNode,\n props: {\n ...newNode.props,\n text: newText,\n revision: makeRevision(ctx, segments),\n },\n };\n}\n\n/** Whole text component inserted/deleted → fully tracked block. */\nfunction insertedTextComponent(\n node: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n ctx.summary.tracked.inserted++;\n const text = plainText(node);\n const segments: DiffSegment[] = [{ type: 'insert', text }];\n notePlaceholdersInChanges(segments, path, node.name, ctx);\n return {\n ...node,\n props: {\n ...node.props,\n text,\n revision: makeRevision(ctx, segments),\n },\n };\n}\n\nfunction deletedTextComponent(\n node: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n ctx.summary.tracked.deleted++;\n const text = plainText(node);\n const segments: DiffSegment[] = [{ type: 'delete', text }];\n notePlaceholdersInChanges(segments, path, node.name, ctx);\n return {\n ...node,\n props: {\n ...node.props,\n text: '',\n revision: makeRevision(ctx, segments),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// List diff\n// ---------------------------------------------------------------------------\n\nfunction normalizeListItems(node: JsonNode): NormalizedListItem[] {\n const items = (node.props?.items as ListItem[] | undefined) || [];\n return items.map((item) => {\n const raw = typeof item === 'string' ? item : item.text;\n const level = typeof item === 'string' ? 0 : item.level || 0;\n return { raw, text: stripMarkdown(raw.normalize('NFC')), level };\n });\n}\n\nfunction diffListComponent(\n oldNode: JsonNode,\n newNode: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n const propsChanged = !deepEqual(\n propsWithout(oldNode.props, 'items'),\n propsWithout(newNode.props, 'items')\n );\n if (propsChanged) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: 'list',\n detail:\n 'list configuration changed (format/levels/spacing); new version rendered',\n });\n }\n\n const oldItems = normalizeListItems(oldNode);\n const newItems = normalizeListItems(newNode);\n\n const stripped = (items: NormalizedListItem[]) =>\n items.map((i) => ({ text: i.text, level: i.level }));\n if (deepEqual(stripped(oldItems), stripped(newItems))) {\n if (\n !deepEqual(\n oldItems.map((i) => i.raw),\n newItems.map((i) => i.raw)\n )\n ) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: 'list',\n detail:\n 'inline formatting or link target changed in list items (markdown-only); new version rendered without a tracked change',\n });\n } else if (!propsChanged) {\n ctx.summary.unchangedBlocks++;\n }\n return newNode;\n }\n\n const ops = alignByLcs(\n oldItems,\n newItems,\n (item) => `${item.level}:${item.text}`\n );\n\n // Collapse delete/insert runs into modified pairs (same level)\n const outItems: Array<{\n text: string;\n level?: number;\n revision?: ReturnType<typeof makeRevision>;\n }> = [];\n let changed = false;\n\n let k = 0;\n while (k < ops.length) {\n const op = ops[k];\n if (op.op === 'equal') {\n // Unchanged item: keep the raw text so markdown/hyperlinks survive\n outItems.push({ text: op.newItem.raw, level: op.newItem.level });\n k++;\n continue;\n }\n // Collect the full delete/insert run\n const deleted: NormalizedListItem[] = [];\n const inserted: NormalizedListItem[] = [];\n while (k < ops.length && ops[k].op !== 'equal') {\n const gapOp = ops[k];\n if (gapOp.op === 'delete') deleted.push(gapOp.oldItem);\n else if (gapOp.op === 'insert') inserted.push(gapOp.newItem);\n k++;\n }\n const { plan } = pairGap(\n deleted,\n inserted,\n (oldItem, newItem) => oldItem.level === newItem.level\n );\n for (const step of plan) {\n changed = true;\n if (step.kind === 'paired') {\n const segments = diffWords(step.oldItem.text, step.newItem.text);\n notePlaceholdersInChanges(segments, path, 'list', ctx);\n outItems.push({\n text: step.newItem.text,\n level: step.newItem.level,\n revision: makeRevision(ctx, segments),\n });\n } else if (step.kind === 'inserted') {\n outItems.push({\n text: step.newItem.text,\n level: step.newItem.level,\n revision: makeRevision(ctx, [\n { type: 'insert', text: step.newItem.text },\n ]),\n });\n } else {\n outItems.push({\n text: '',\n level: step.oldItem.level,\n revision: makeRevision(ctx, [\n { type: 'delete', text: step.oldItem.text },\n ]),\n });\n }\n }\n }\n\n if (changed) ctx.summary.tracked.modified++;\n return {\n ...newNode,\n props: { ...newNode.props, items: outItems },\n };\n}\n\nfunction listWithAllItems(\n node: JsonNode,\n type: 'insert' | 'delete',\n ctx: DiffContext\n): JsonNode {\n if (type === 'insert') ctx.summary.tracked.inserted++;\n else ctx.summary.tracked.deleted++;\n const items = normalizeListItems(node).map((item) => ({\n text: type === 'insert' ? item.text : '',\n level: item.level,\n revision: makeRevision(ctx, [{ type, text: item.text }]),\n }));\n return { ...node, props: { ...node.props, items } };\n}\n\n// ---------------------------------------------------------------------------\n// Tree diff\n// ---------------------------------------------------------------------------\n\nfunction isContainer(node: JsonNode): boolean {\n return Array.isArray(node.children);\n}\n\nfunction nodesPairable(oldNode: JsonNode, newNode: JsonNode): boolean {\n return oldNode.name === newNode.name;\n}\n\nfunction diffPairedNode(\n oldNode: JsonNode,\n newNode: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n // `enabled` flips change what renders without touching props: treat them\n // as content appearing (insertion) or disappearing (deletion).\n const oldEnabled = isEnabled(oldNode);\n const newEnabled = isEnabled(newNode);\n if (!oldEnabled && !newEnabled) {\n ctx.summary.unchangedBlocks++;\n return newNode;\n }\n if (!oldEnabled && newEnabled) {\n return emitInserted(newNode, path, ctx);\n }\n if (oldEnabled && !newEnabled) {\n // The disabled new node would be filtered at render; emit the old\n // content as a tracked deletion instead (where supported).\n const deletedNode = emitDeleted(oldNode, path, ctx);\n return deletedNode ?? newNode;\n }\n\n if (TEXT_COMPONENTS.has(newNode.name)) {\n return diffTextComponent(oldNode, newNode, path, ctx);\n }\n if (newNode.name === 'list') {\n return diffListComponent(oldNode, newNode, path, ctx);\n }\n if (isContainer(newNode) || isContainer(oldNode)) {\n const propsChanged = !deepEqual(oldNode.props, newNode.props);\n if (propsChanged) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail: 'container props changed; new version rendered',\n });\n }\n return {\n ...newNode,\n children: diffChildren(\n oldNode.children || [],\n newNode.children || [],\n `${path}/children`,\n ctx\n ),\n };\n }\n // Opaque component (table, image, chart, ...): block replace\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail: `\"${newNode.name}\" changed (no native tracked-change support); new version rendered`,\n });\n return newNode;\n}\n\nfunction emitInserted(\n node: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n // A disabled node renders nothing — keep it, but track nothing\n if (!isEnabled(node)) {\n return node;\n }\n if (TEXT_COMPONENTS.has(node.name)) {\n return insertedTextComponent(node, path, ctx);\n }\n if (node.name === 'list') {\n return listWithAllItems(node, 'insert', ctx);\n }\n if (isContainer(node)) {\n if (typeof node.props?.title === 'string') {\n ctx.summary.untracked.push({\n path,\n kind: 'inserted',\n component: node.name,\n detail: `\"${node.name}\" title rendered without insertion mark (titles are props, not text blocks)`,\n });\n }\n return {\n ...node,\n children: diffChildren([], node.children || [], `${path}/children`, ctx),\n };\n }\n ctx.summary.untracked.push({\n path,\n kind: 'inserted',\n component: node.name,\n detail: `\"${node.name}\" added (rendered, but not marked as a tracked insertion)`,\n });\n return node;\n}\n\n/** Returns the redline node for a deleted block, or null if it must be dropped. */\nfunction emitDeleted(\n node: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode | null {\n // A disabled node never rendered — drop it silently\n if (!isEnabled(node)) {\n return null;\n }\n if (TEXT_COMPONENTS.has(node.name)) {\n return deletedTextComponent(node, path, ctx);\n }\n if (node.name === 'list') {\n return listWithAllItems(node, 'delete', ctx);\n }\n if (isContainer(node)) {\n if (typeof node.props?.title === 'string') {\n ctx.summary.untracked.push({\n path,\n kind: 'deleted',\n component: node.name,\n detail: `\"${node.name}\" title still rendered without deletion mark (titles are props, not text blocks)`,\n });\n }\n const children = diffChildren(\n node.children || [],\n [],\n `${path}/children`,\n ctx\n );\n return { ...node, children };\n }\n ctx.summary.untracked.push({\n path,\n kind: 'deleted',\n component: node.name,\n detail: `\"${node.name}\" removed (dropped from the redline; Word cannot mark it as a tracked deletion)`,\n });\n return null;\n}\n\nexport function diffChildren(\n oldChildren: JsonNode[],\n newChildren: JsonNode[],\n path: string,\n ctx: DiffContext\n): JsonNode[] {\n const ops = alignByLcs(oldChildren, newChildren, (node) =>\n JSON.stringify(node)\n );\n\n const out: JsonNode[] = [];\n let k = 0;\n let newIndex = 0;\n while (k < ops.length) {\n const op = ops[k];\n if (op.op === 'equal') {\n ctx.summary.unchangedBlocks++;\n out.push(op.newItem);\n k++;\n newIndex++;\n continue;\n }\n\n // Collect the full delete/insert run between equal anchors\n const deleted: JsonNode[] = [];\n const inserted: JsonNode[] = [];\n while (k < ops.length && ops[k].op !== 'equal') {\n const gapOp = ops[k];\n if (gapOp.op === 'delete') deleted.push(gapOp.oldItem);\n else if (gapOp.op === 'insert') inserted.push(gapOp.newItem);\n k++;\n }\n\n const { plan } = pairGap(deleted, inserted, nodesPairable);\n for (const step of plan) {\n if (step.kind === 'paired') {\n out.push(\n diffPairedNode(step.oldItem, step.newItem, `${path}/${newIndex}`, ctx)\n );\n newIndex++;\n } else if (step.kind === 'inserted') {\n out.push(emitInserted(step.newItem, `${path}/${newIndex}`, ctx));\n newIndex++;\n } else {\n const deletedNode = emitDeleted(\n step.oldItem,\n `${path}/${newIndex}`,\n ctx\n );\n if (deletedNode) out.push(deletedNode);\n }\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Diff two DOCX definitions into a renderable redline document.\n *\n * Both inputs must be json-to-office DOCX definitions (root `name: \"docx\"`).\n * The result is based on the NEW document; the root gains\n * `trackRevisions: true` so Word opens it in review mode.\n */\nexport function diffDocuments(\n oldDoc: JsonNode,\n newDoc: JsonNode,\n options: DiffDocumentsOptions = {}\n): DiffDocumentsResult {\n if (!oldDoc || oldDoc.name !== 'docx') {\n throw new Error('Old document: top-level component must be \"docx\"');\n }\n if (!newDoc || newDoc.name !== 'docx') {\n throw new Error('New document: top-level component must be \"docx\"');\n }\n\n const summary: DiffSummary = {\n tracked: { modified: 0, inserted: 0, deleted: 0 },\n untracked: [],\n unchangedBlocks: 0,\n notes: [],\n };\n const ctx: DiffContext = {\n author: options.author,\n date: options.date,\n summary,\n };\n\n const rootPropsChanged = !deepEqual(\n propsWithout(oldDoc.props, 'trackRevisions'),\n propsWithout(newDoc.props, 'trackRevisions')\n );\n if (rootPropsChanged) {\n summary.untracked.push({\n path: '/props',\n kind: 'modified',\n component: 'docx',\n detail:\n 'document props changed (theme/metadata/defaults); new version used',\n });\n }\n\n const children = diffChildren(\n oldDoc.children || [],\n newDoc.children || [],\n '/children',\n ctx\n );\n\n if (summary.tracked.deleted > 0) {\n summary.notes.push(\n `${summary.tracked.deleted} fully deleted block(s): accepting all changes leaves an empty paragraph behind (OOXML paragraph-mark deletion is not supported by the renderer)`\n );\n }\n\n const document: JsonNode = {\n ...newDoc,\n props: { ...newDoc.props, trackRevisions: true },\n children,\n };\n\n return { document, summary };\n}\n","// Version information\nexport const SHARED_DOCX_VERSION = '1.0.0';\n\n// ============================================================================\n// Document diff (tracked-change redlines)\n// ============================================================================\n\nexport { diffDocuments, diffWords, stripMarkdown } from './diff';\nexport type {\n DiffDocumentsOptions,\n DiffDocumentsResult,\n DiffSummary,\n UntrackedChange,\n DiffSegment,\n JsonNode,\n} from './diff';\n\n// ============================================================================\n// Format-agnostic re-exports from @json-to-office/shared\n// ============================================================================\n\n// Types\nexport type { ComponentDefinition as SharedComponentDefinition } from '@json-to-office/shared';\nexport type {\n GenerationWarning,\n AddWarningFunction,\n} from '@json-to-office/shared';\n\n// Schema utilities\nexport {\n fixSchemaReferences,\n convertToJsonSchema,\n createComponentSchema,\n createComponentSchemaObject as sharedCreateComponentSchemaObject,\n exportSchemaToFile,\n} from '@json-to-office/shared';\nexport type { ComponentSchemaConfig } from '@json-to-office/shared';\n\n// Validation - format-agnostic from shared\nexport {\n transformValueError,\n transformValueErrors,\n formatErrorSummary,\n groupErrorsByPath,\n createJsonParseError,\n calculatePosition,\n} from '@json-to-office/shared';\nexport type { ValidationError, ValidationResult } from '@json-to-office/shared';\nexport {\n type ErrorFormatterConfig,\n DEFAULT_ERROR_CONFIG,\n createErrorConfig,\n ERROR_EMOJIS,\n formatErrorMessage,\n} 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// Semver utilities\nexport {\n isValidSemver,\n parseSemver,\n compareSemver,\n latestVersion,\n type ParsedSemver,\n} from '@json-to-office/shared';\n\n// ============================================================================\n// Docx-specific: Document schemas\n// ============================================================================\n\nexport {\n JsonComponentDefinitionSchema,\n JSON_SCHEMA_URLS,\n validateDocumentWithSchema,\n validateJsonComponent as validateJsonComponentDoc,\n} from './schemas/document';\n\nexport type {\n DocumentValidationResult,\n ValidationError as DocumentValidationError,\n} from './schemas/document';\n\n// ============================================================================\n// Docx-specific: Theme schemas\n// ============================================================================\n\nexport { ThemeConfigSchema, isValidThemeConfig } from './schemas/theme';\n\nexport type {\n ThemeConfigJson,\n StyleDefinitions,\n DocumentMargins,\n PageDimensions,\n Page,\n FontDefinition,\n Fonts,\n ComponentDefaults,\n HeadingComponentDefaults,\n ParagraphComponentDefaults,\n ImageComponentDefaults,\n StatisticComponentDefaults,\n TableComponentDefaults,\n SectionComponentDefaults,\n ColumnsComponentDefaults,\n ListComponentDefaults,\n HeadingDefinition,\n} from './schemas/theme';\n\n// ============================================================================\n// Docx-specific: API schemas\n// ============================================================================\n\nexport * from './schemas/api';\n\n// ============================================================================\n// Docx-specific: Validation utilities\n// ============================================================================\n\n// Parser utilities\nexport {\n JsonDocumentParser,\n JsonParsingError,\n JsonValidationError,\n parseJsonComponent,\n validateJsonComponent,\n parseJsonWithLineNumbers,\n} from './validation/parsers/json';\n\n// Theme validators\nexport {\n validateThemeJson,\n isValidThemeJson,\n getValidationSummary,\n} from './validation/validators/theme';\n\n// Component validators\nexport {\n validateComponentProps,\n safeValidateComponentProps,\n safeValidateComponentDefinition,\n isReportProps,\n isSectionProps,\n isHeadingProps,\n isParagraphProps,\n isColumnsProps,\n isImageProps,\n isStatisticProps,\n isTableProps,\n isListProps,\n isCustomComponentProps,\n getValidationErrors,\n} from './validation/validators/component';\n\n// Export formatValidationErrors from theme validator (works for both)\nexport { formatValidationErrors } from './validation/validators/theme';\n\n// New comprehensive validation exports\nexport {\n // Core validators\n validateComponent,\n validateComponentDefinition,\n validateComponents,\n transformAndValidate,\n createValidatedComponent,\n isValidComponent,\n // Error formatting\n formatValidationError,\n formatValidationErrorStrings,\n formatErrorReport,\n getErrorSummary,\n hasCriticalErrors,\n getValidationContext,\n} from './validation';\n\n// Export types from validation\nexport type { ThemeValidationResult } from './validation/validators/theme';\n\nexport type {\n CoreValidationResult,\n StandardComponentName,\n FormattedError,\n} from './validation';\n\n// ============================================================================\n// Docx-specific: Unified Validation System\n// ============================================================================\n\nexport * from './validation/unified';\n\n// Re-export the simple validation API as the main validation interface\nexport { validate, validateStrict } from './validation/unified';\n\n// ============================================================================\n// Docx-specific: Component schemas (JavaScript values)\n// ============================================================================\n\nexport {\n AlignmentSchema,\n JustifiedAlignmentSchema,\n HeadingLevelSchema,\n SpacingSchema,\n LineSpacingSchema,\n IndentSchema,\n NumberingSchema,\n BorderSchema,\n MarginsSchema,\n BaseComponentPropsSchema,\n ReportPropsSchema,\n SectionPropsSchema,\n ColumnsPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ImagePropsSchema,\n TextBoxPropsSchema,\n StatisticPropsSchema,\n TablePropsSchema,\n ListPropsSchema,\n TocPropsSchema,\n RevisionSchema,\n RevisionSegmentSchema,\n StandardComponentDefinitionSchema,\n ComponentDefinitionSchema,\n} from './schemas/components';\n\n// Component types - export as types only\nexport type {\n BaseComponentProps,\n ReportProps,\n SectionProps,\n ColumnsProps,\n HeadingProps,\n ParagraphProps,\n ImageProps,\n TextBoxProps,\n StatisticProps,\n TableProps,\n ListProps,\n TocProps,\n Revision,\n RevisionSegment,\n Alignment,\n JustifiedAlignment,\n HeadingLevel,\n Spacing,\n LineSpacing,\n Indent,\n Numbering,\n} from './schemas/components';\n\n// Export ComponentDefinition from types/components.ts (better type inference)\nexport type {\n ComponentDefinition,\n StandardComponentDefinition,\n} from './types/components';\n\nexport {\n STANDARD_COMPONENTS,\n STANDARD_COMPONENTS_SET,\n} from './types/components';\n\n// Highcharts component schema (standard component)\nexport { HighchartsPropsSchema } from './schemas/components/highcharts';\nexport type { HighchartsProps } from './schemas/components/highcharts';\n\n// Visual component schema (standard component — pptx-rendered graphic)\nexport {\n VisualPropsSchema,\n VisualCanvasSchema,\n VisualCanvasBackgroundSchema,\n} from './schemas/components/visual';\nexport type { VisualProps, VisualCanvas } from './schemas/components/visual';\n\n// Custom component schemas\nexport {\n TextSpaceAfterPropsSchema,\n TextSpaceAfterComponentSchema,\n CustomComponentDefinitionSchema,\n} from './schemas/custom-components';\n\nexport type { TextSpaceAfterProps } from './schemas/custom-components';\n\n// Legacy support - re-export common types from schemas\nexport type { ThemeName } from './types/common';\n\n// ============================================================================\n// Docx-specific: Schema Export Utilities\n// ============================================================================\n\nexport {\n fixSchemaReferences as fixDocxSchemaReferences,\n convertToJsonSchema as convertDocxToJsonSchema,\n createComponentSchema as createDocxComponentSchema,\n exportSchemaToFile as exportDocxSchemaToFile,\n COMPONENT_METADATA,\n BASE_SCHEMA_METADATA,\n THEME_SCHEMA_METADATA,\n} from './schemas/export';\n\nexport type { ComponentSchemaConfig as DocxComponentSchemaConfig } from './schemas/export';\n\n// ============================================================================\n// Docx-specific: Unified Schema Generation\n// ============================================================================\n\nexport { generateUnifiedDocumentSchema } from './schemas/generator';\n\nexport type {\n CustomComponentInfo,\n GenerateDocumentSchemaOptions,\n} from './schemas/generator';\n\n// ============================================================================\n// Docx-specific: Plugin System Type Support\n// ============================================================================\n\nexport {\n type ReportComponent,\n type SectionComponent,\n type ColumnsComponent,\n type HeadingComponent,\n type ParagraphComponent,\n type TextBoxComponent,\n type ImageComponent,\n type HighchartsComponent,\n type VisualComponent,\n type StatisticComponent,\n type TableComponent,\n type ListComponent,\n type TocComponent,\n type TextSpaceAfterComponent,\n isReportComponent,\n isSectionComponent,\n isColumnsComponent,\n isHeadingComponent,\n isParagraphComponent,\n isTextBoxComponent,\n isImageComponent,\n isHighchartsComponent,\n isVisualComponent,\n isStatisticComponent,\n isTableComponent,\n isListComponent,\n isTocComponent,\n isTextSpaceAfterComponent,\n} from './types/components';\n","import { Value, ValueError } from '@sinclair/typebox/value';\nimport { FormatRegistry } from '@sinclair/typebox';\nimport {\n DocumentValidationResult,\n ValidationError,\n} from '../../schemas/document';\nimport {\n ComponentDefinitionSchema,\n ComponentDefinition,\n} from '../../schemas/components';\n\n// Register format validators with TypeBox\nFormatRegistry.Set('uri', (value: string) => {\n // Accept URLs, relative paths, and file paths\n try {\n new URL(value);\n return true;\n } catch {\n // Check if it's a relative path (common for JSON schemas)\n if (\n value.includes('.json') ||\n value.includes('/') ||\n value.includes('\\\\')\n ) {\n return true;\n }\n // Check if it's an HTTP/HTTPS URL\n return /^https?:\\/\\/.+/.test(value);\n }\n});\n\nFormatRegistry.Set('date-time', (value: string) => {\n // ISO 8601 date-time format validation\n const dateTimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?$/;\n return dateTimeRegex.test(value) && !isNaN(Date.parse(value));\n});\n\n/**\n * JSON parser\n * @module validation/parsers/json\n * @description\n * Advanced JSON parsing with line number tracking and detailed error reporting.\n * Provides enhanced error messages for JSON syntax and validation errors.\n */\n\n/**\n * JSON Document Parser - Handles parsing and validation of JSON report definitions\n */\nexport class JsonDocumentParser {\n private schema = ComponentDefinitionSchema;\n\n constructor() {\n // Schema is assigned above\n }\n\n /**\n * Parse JSON input (string or object) and validate against schema\n * Only supports unified ComponentDefinition structure where document IS a report component\n */\n public parse(jsonInput: string | object): ComponentDefinition {\n let parsedObject: unknown;\n\n // Step 1: Parse JSON if it's a string\n if (typeof jsonInput === 'string') {\n try {\n parsedObject = JSON.parse(jsonInput);\n } catch (error) {\n throw new JsonParsingError(\n 'Invalid JSON syntax',\n this.extractJSONSyntaxError(error as Error, jsonInput)\n );\n }\n } else {\n parsedObject = jsonInput;\n }\n\n // Step 2: Validate it's a report component\n if (\n typeof parsedObject !== 'object' ||\n parsedObject === null ||\n !('name' in parsedObject) ||\n (parsedObject as any).name !== 'docx'\n ) {\n throw new JsonValidationError(\n 'Invalid document structure: Document must be a docx component with name=\"docx\"',\n [\n {\n path: 'name',\n message: 'Document must be a docx component with name=\"docx\"',\n code: 'INVALID_STRUCTURE',\n },\n ]\n );\n }\n\n // Step 3: Validate against schema\n if (!Value.Check(this.schema, parsedObject)) {\n const errors = [...Value.Errors(this.schema, parsedObject)];\n\n throw new JsonValidationError(\n 'JSON validation failed',\n this.formatTypeBoxErrors(\n errors,\n typeof jsonInput === 'string'\n ? jsonInput\n : JSON.stringify(jsonInput, null, 2)\n )\n );\n }\n\n return parsedObject as ComponentDefinition;\n }\n\n /**\n * Validate JSON without throwing errors - returns ValidationResult\n */\n public validate(jsonInput: string | object): DocumentValidationResult {\n try {\n this.parse(jsonInput);\n return {\n valid: true,\n errors: [],\n warnings: [],\n };\n } catch (error) {\n if (\n error instanceof JsonParsingError ||\n error instanceof JsonValidationError\n ) {\n return {\n valid: false,\n errors: error.validationErrors,\n warnings: [],\n };\n }\n\n // Unexpected error\n return {\n valid: false,\n errors: [\n {\n path: '',\n message:\n error instanceof Error\n ? error.message\n : 'Unknown validation error',\n code: 'UNEXPECTED_ERROR',\n },\n ],\n warnings: [],\n };\n }\n }\n\n /**\n * Parse JSON file content with line number tracking\n */\n public parseWithLineNumbers(jsonString: string): ComponentDefinition {\n const lines = jsonString.split('\\n');\n\n try {\n return this.parse(jsonString);\n } catch (error) {\n if (\n error instanceof JsonParsingError ||\n error instanceof JsonValidationError\n ) {\n // Enhance errors with line numbers\n const enhancedErrors = error.validationErrors.map((err) => ({\n ...err,\n ...this.findLineNumber(err.path, jsonString, lines),\n }));\n\n if (error instanceof JsonParsingError) {\n throw new JsonParsingError(error.message, enhancedErrors);\n } else {\n throw new JsonValidationError(error.message, enhancedErrors);\n }\n }\n throw error;\n }\n }\n\n /**\n * Extract JSON syntax error information\n */\n private extractJSONSyntaxError(\n error: Error,\n jsonString: string\n ): ValidationError[] {\n const message = error.message;\n\n // Try to extract position from error message\n const positionMatch =\n message.match(/position\\s+(\\d+)/i) ||\n message.match(/at\\s+(\\d+)/i) ||\n message.match(/character\\s+(\\d+)/i);\n\n let line = 0;\n let column = 0;\n\n if (positionMatch) {\n const position = parseInt(positionMatch[1], 10);\n const lines = jsonString.substring(0, position).split('\\n');\n line = lines.length;\n column = lines[lines.length - 1].length + 1;\n }\n\n return [\n {\n path: '',\n message: `JSON syntax error: ${message}`,\n code: 'JSON_SYNTAX_ERROR',\n line: line || undefined,\n column: column || undefined,\n suggestions: [\n 'Check for missing commas, brackets, or quotes',\n 'Validate JSON syntax using a JSON validator',\n 'Ensure all strings are properly quoted',\n ],\n },\n ];\n }\n\n /**\n * Format TypeBox validation errors into ValidationError format\n */\n private formatTypeBoxErrors(\n errors: ValueError[],\n originalJson: string\n ): ValidationError[] {\n return errors.map((error) => {\n const path = error.path || '';\n const lineInfo = this.findLineNumber(path, originalJson);\n\n return {\n path,\n message: this.formatTypeBoxErrorMessage(error),\n code: this.getErrorCode(error),\n line: lineInfo.line,\n column: lineInfo.column,\n suggestions: this.generateSuggestions(error),\n };\n });\n }\n\n /**\n * Format individual TypeBox error message\n */\n private formatTypeBoxErrorMessage(error: ValueError): string {\n const path = error.path ? `at \"${error.path}\"` : '';\n const message = error.message;\n\n // TypeBox provides descriptive messages, so we can use them directly\n // but enhance common patterns\n if (message.includes('Expected')) {\n return `${message} ${path}`;\n } else if (message.includes('Required property')) {\n return `${message} ${path}`;\n } else if (message.includes('Unexpected property')) {\n return `${message} ${path}`;\n } else if (message.includes('minimum')) {\n return `Value is too small ${path}. ${message}`;\n } else if (message.includes('maximum')) {\n return `Value is too big ${path}. ${message}`;\n } else {\n return `${message} ${path}`;\n }\n }\n\n /**\n * Get error code from TypeBox error\n */\n private getErrorCode(error: ValueError): string {\n const baseCode = String(error.type || 'VALIDATION_ERROR').toUpperCase();\n const path = error.path ? error.path.replace(/\\//g, '_').toUpperCase() : '';\n return path ? `${baseCode}_${path}` : baseCode;\n }\n\n /**\n * Generate helpful suggestions based on error type\n */\n private generateSuggestions(error: ValueError): string[] {\n const suggestions: string[] = [];\n const message = error.message;\n\n // Parse TypeBox error messages to provide suggestions\n if (message.includes('Expected string')) {\n suggestions.push('Ensure the value is wrapped in quotes');\n } else if (message.includes('Expected number')) {\n suggestions.push('Remove quotes around numeric values');\n } else if (message.includes('Expected array')) {\n suggestions.push('Use square brackets [] for arrays');\n } else if (message.includes('Expected object')) {\n suggestions.push('Use curly braces {} for objects');\n } else if (message.includes('Expected literal')) {\n const match = message.match(/Expected literal (.+)/);\n if (match) {\n suggestions.push(`Use the exact value: ${match[1]}`);\n }\n } else if (message.includes('Unexpected property')) {\n suggestions.push('Remove unknown properties or check spelling');\n suggestions.push(\n 'Refer to the JSON schema documentation for valid properties'\n );\n } else if (message.includes('Expected union')) {\n suggestions.push(\n 'Check that the value matches one of the allowed formats'\n );\n suggestions.push('Verify the module type is spelled correctly');\n } else if (message.includes('minimum')) {\n const match = message.match(/minimum.*?(\\d+)/);\n if (match) {\n if (message.includes('Array')) {\n suggestions.push(`Array must have at least ${match[1]} items`);\n } else {\n suggestions.push(`Value must be at least ${match[1]}`);\n }\n }\n } else if (message.includes('format') && message.includes('uri')) {\n suggestions.push(\n 'Ensure the URL is valid and starts with http:// or https://'\n );\n }\n\n // Generic suggestions\n if (suggestions.length === 0) {\n suggestions.push('Check the JSON schema documentation for valid values');\n suggestions.push('Verify the property name and value format');\n }\n\n return suggestions;\n }\n\n /**\n * Find line and column number for a given JSON path\n */\n private findLineNumber(\n path: string,\n jsonString: string,\n lines?: string[]\n ): { line?: number; column?: number } {\n if (!path) {\n return {};\n }\n\n const jsonLines = lines || jsonString.split('\\n');\n const pathParts = path.split('.');\n\n // Simple heuristic: find the line containing the property name\n for (let i = 0; i < jsonLines.length; i++) {\n const line = jsonLines[i];\n const lastPathPart = pathParts[pathParts.length - 1];\n\n // Look for property name in quotes\n if (line.includes(`\"${lastPathPart}\"`)) {\n const column = line.indexOf(`\"${lastPathPart}\"`) + 1;\n return {\n line: i + 1,\n column,\n };\n }\n }\n\n return {};\n }\n}\n\n/**\n * Custom error classes for better error handling\n */\nexport class JsonParsingError extends Error {\n public readonly validationErrors: ValidationError[];\n\n constructor(message: string, errors: ValidationError[]) {\n super(message);\n this.name = 'JsonParsingError';\n this.validationErrors = errors;\n }\n}\n\nexport class JsonValidationError extends Error {\n public readonly validationErrors: ValidationError[];\n\n constructor(message: string, errors: ValidationError[]) {\n super(message);\n this.name = 'JsonValidationError';\n this.validationErrors = errors;\n }\n}\n\n/**\n * Utility functions for external use\n */\n\n/**\n * Parse and validate JSON component definition\n * Only supports report components (documents)\n */\nexport function parseJsonComponent(\n jsonInput: string | object\n): ComponentDefinition {\n const parser = new JsonDocumentParser();\n return parser.parse(jsonInput);\n}\n\n/**\n * Validate JSON component definition without throwing\n * Now uses unified validation\n */\nexport { validateJsonDocument as validateJsonComponent } from '../unified/document-validator';\n\n/**\n * Parse JSON with enhanced line number error reporting\n * Only supports unified ComponentDefinition structure where document IS a report component\n */\nexport function parseJsonWithLineNumbers(\n jsonString: string\n): ComponentDefinition {\n const parser = new JsonDocumentParser();\n return parser.parseWithLineNumbers(jsonString);\n}\n","/**\n * Theme validators\n * @module validation/validators/theme\n * @description\n * Now uses unified validation system\n */\n\n// Re-export everything from unified theme validator\nexport {\n validateThemeJson,\n isValidTheme as isValidThemeJson,\n getThemeName,\n isThemeConfig,\n type ThemeValidationResult,\n} from '../unified/theme-validator';\n\n// Re-export utility for getting validation summary\nexport { getValidationSummary } from '../unified/base-validator';\n\n// For backward compatibility, provide formatValidationErrors\nexport function formatValidationErrors(errors: any[]): string[] {\n if (!Array.isArray(errors)) return [];\n\n return errors.map((error) => {\n if (typeof error === 'string') return error;\n\n const path = error.path ? `${error.path}: ` : '';\n const message = error.message || 'Validation error';\n return `${path}${message}`;\n });\n}\n","/**\n * Component validators\n * @module validation/validators/component\n * @description\n * Now uses unified validation system\n */\n\nimport {\n validateComponent as unifiedValidateComponent,\n validateComponentDefinition as unifiedValidateComponentDefinition,\n isStandardComponentName,\n} from '../unified/component-validator';\n\n// Re-export everything from unified component validator\nexport {\n validateComponent as validateComponentProps,\n validateComponentDefinition,\n validateComponents,\n validateCustomComponentProps,\n isStandardComponentName,\n // Type guards\n isReportProps,\n isSectionProps,\n isHeadingProps,\n isParagraphProps,\n isColumnsProps,\n isImageProps,\n isStatisticProps,\n isTableProps,\n isListProps,\n isCustomComponentProps,\n type StandardComponentName,\n} from '../unified/component-validator';\n\n// For backward compatibility, provide safeValidateComponentProps\nexport function safeValidateComponentProps<T>(\n name: string,\n props: unknown\n): { success: true; data: T } | { success: false; error: any[] } {\n // For non-standard types, use 'custom'\n const componentName = isStandardComponentName(name) ? name : 'custom';\n const result = unifiedValidateComponent(componentName, props);\n\n if (result.valid) {\n return { success: true, data: result.data as T };\n }\n\n return { success: false, error: result.errors || [] };\n}\n\n// For backward compatibility, provide safeValidateComponentDefinition\nexport function safeValidateComponentDefinition(\n component: unknown\n): { success: true; data: any } | { success: false; error: any[] } {\n const result = unifiedValidateComponentDefinition(component);\n\n if (result.valid) {\n return { success: true, data: result.data };\n }\n\n return { success: false, error: result.errors || [] };\n}\n\n// For backward compatibility, provide error formatting\nexport function getValidationErrors(props: unknown, name?: string): string[] {\n // For non-standard types, use 'custom'\n const componentName = name && isStandardComponentName(name) ? name : 'custom';\n const result = unifiedValidateComponent(componentName, props);\n\n if (result.valid) return [];\n\n return (result.errors || []).map((e: any) =>\n e.path ? `${e.path}: ${e.message}` : e.message\n );\n}\n","import { Value } from '@sinclair/typebox/value';\nimport { Static } from '@sinclair/typebox';\nimport {\n ComponentDefinitionSchema,\n ReportPropsSchema,\n SectionPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ColumnsPropsSchema,\n ImagePropsSchema,\n StatisticPropsSchema,\n TablePropsSchema,\n ListPropsSchema,\n} from '../../schemas/components';\nimport { CustomComponentDefinitionSchema } from '../../schemas/custom-components';\nimport {\n formatTypeBoxError,\n formatTypeBoxErrorStrings,\n formatErrorReport,\n hasCriticalErrors,\n} from './errors';\nimport type {\n CoreValidationResult,\n ValidationOptions,\n BatchValidationResult,\n ComponentValidationConfig,\n DataTransformer,\n} from './types';\n\n/**\n * Core validation engine\n * @module validation/core/validator\n * @description\n * Main validation utilities using TypeBox for runtime validation.\n * Provides comprehensive validation with error handling and data transformation.\n */\n\n/**\n * Component name to schema mapping\n */\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} as const;\n\nexport type StandardComponentName = keyof typeof COMPONENT_SCHEMA_MAP;\n\n/**\n * Validate any component configuration with comprehensive error handling\n */\nexport function validateComponent<T extends StandardComponentName>(\n name: T,\n props: unknown,\n options?: ValidationOptions\n): CoreValidationResult<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>> {\n const schema = COMPONENT_SCHEMA_MAP[name];\n\n if (!schema) {\n // Handle custom components\n if (Value.Check(CustomComponentDefinitionSchema, props)) {\n return {\n success: true,\n data: props as Static<(typeof COMPONENT_SCHEMA_MAP)[T]>,\n };\n }\n\n const errors = [...Value.Errors(CustomComponentDefinitionSchema, props)];\n const formattedErrors = formatTypeBoxError(errors);\n return {\n success: false,\n errors: formattedErrors,\n errorStrings: formatTypeBoxErrorStrings(errors),\n report: options?.includeReport ? formatErrorReport(errors) : undefined,\n hasCriticalErrors: options?.checkCritical\n ? hasCriticalErrors(errors)\n : undefined,\n };\n }\n\n // Validate with the schema\n if (Value.Check(schema, props)) {\n return {\n success: true,\n data: props as Static<(typeof COMPONENT_SCHEMA_MAP)[T]>,\n };\n }\n\n const errors = [...Value.Errors(schema, props)];\n const formattedErrors = formatTypeBoxError(errors);\n return {\n success: false,\n errors: formattedErrors,\n errorStrings: formatTypeBoxErrorStrings(errors),\n report: options?.includeReport ? formatErrorReport(errors) : undefined,\n hasCriticalErrors: options?.checkCritical\n ? hasCriticalErrors(errors)\n : undefined,\n };\n}\n\n/**\n * Validate a complete component definition (with nested children)\n */\nexport function validateComponentDefinition(\n component: unknown,\n options?: ValidationOptions\n): CoreValidationResult<Static<typeof ComponentDefinitionSchema>> {\n // Check for circular references or excessive nesting\n const maxDepth = options?.maxDepth ?? 10;\n const currentDepth = options?.currentDepth ?? 0;\n\n if (currentDepth > maxDepth) {\n return {\n success: false,\n errors: [\n {\n path: 'children',\n message: `Maximum nesting depth (${maxDepth}) exceeded`,\n code: 'custom',\n suggestion: 'Reduce the nesting level of components',\n },\n ],\n errorStrings: [`Maximum nesting depth (${maxDepth}) exceeded`],\n hasCriticalErrors: true,\n };\n }\n\n if (Value.Check(ComponentDefinitionSchema, component)) {\n // Validate nested children recursively\n const data = component as any;\n const warnings: string[] = [];\n\n if (data.children && Array.isArray(data.children)) {\n for (let i = 0; i < data.children.length; i++) {\n const nestedResult = validateComponentDefinition(data.children[i], {\n ...options,\n currentDepth: currentDepth + 1,\n });\n\n if (!nestedResult.success) {\n // Add context to nested errors\n const nestedErrors = nestedResult.errors?.map((err) => ({\n ...err,\n path: `children[${i}].${err.path}`,\n }));\n\n return {\n success: false,\n errors: nestedErrors,\n errorStrings: nestedErrors?.map(\n (err) => `${err.path}: ${err.message}`\n ),\n report: options?.includeReport\n ? `Validation failed in nested component at index ${i}:\\n${nestedResult.report}`\n : undefined,\n hasCriticalErrors: nestedResult.hasCriticalErrors,\n };\n }\n\n if (nestedResult.warnings) {\n warnings.push(\n ...nestedResult.warnings.map((w) => `children[${i}]: ${w}`)\n );\n }\n }\n }\n\n return {\n success: true,\n data: component as Static<typeof ComponentDefinitionSchema>,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n const errors = [...Value.Errors(ComponentDefinitionSchema, component)];\n const formattedErrors = formatTypeBoxError(errors);\n return {\n success: false,\n errors: formattedErrors,\n errorStrings: formatTypeBoxErrorStrings(errors),\n report: options?.includeReport ? formatErrorReport(errors) : undefined,\n hasCriticalErrors: options?.checkCritical\n ? hasCriticalErrors(errors)\n : undefined,\n };\n}\n\n/**\n * Batch validate multiple components\n */\nexport function validateComponents(\n components: ComponentValidationConfig[],\n options?: ValidationOptions\n): BatchValidationResult {\n const results: CoreValidationResult<any>[] = [];\n let criticalCount = 0;\n\n for (const { name, props } of components) {\n const result =\n name in COMPONENT_SCHEMA_MAP\n ? validateComponent(name as StandardComponentName, props, options)\n : validateComponentDefinition(props, options);\n\n results.push(result);\n\n if (result.hasCriticalErrors) {\n criticalCount++;\n }\n\n if (!result.success && options?.stopOnFirst) {\n break;\n }\n }\n\n const valid = results.filter((r) => r.success).length;\n const invalid = results.length - valid;\n\n return {\n success: invalid === 0,\n results,\n summary: {\n total: results.length,\n valid,\n invalid,\n criticalErrors: criticalCount,\n },\n };\n}\n\n/**\n * Transform and validate data (for migration scenarios)\n */\nexport function transformAndValidate<T extends StandardComponentName>(\n name: T,\n data: unknown,\n transformer?: DataTransformer\n): CoreValidationResult<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>> {\n try {\n // Apply custom transformation if provided\n const transformed = transformer ? transformer(data) : data;\n\n // Validate the transformed data\n return validateComponent(name, transformed, {\n includeReport: true,\n checkCritical: true,\n });\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: 'root',\n message: `Transformation failed: ${error instanceof Error ? error.message : String(error)}`,\n code: 'custom',\n },\n ],\n errorStrings: [\n `Transformation failed: ${error instanceof Error ? error.message : String(error)}`,\n ],\n hasCriticalErrors: true,\n };\n }\n}\n\n/**\n * Create a validated component with defaults\n */\nexport function createValidatedComponent<T extends StandardComponentName>(\n name: T,\n partialConfig: Partial<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>>\n): CoreValidationResult<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>> {\n const schema = COMPONENT_SCHEMA_MAP[name];\n\n if (!schema) {\n return {\n success: false,\n errors: [\n {\n path: 'name',\n message: `Unknown component name: ${name}`,\n code: 'custom',\n suggestion: `Use one of: ${Object.keys(COMPONENT_SCHEMA_MAP).join(', ')}`,\n },\n ],\n errorStrings: [`Unknown component name: ${name}`],\n hasCriticalErrors: true,\n };\n }\n\n // Validate with TypeBox\n if (Value.Check(schema, partialConfig)) {\n return {\n success: true,\n data: partialConfig as Static<(typeof COMPONENT_SCHEMA_MAP)[T]>,\n };\n }\n\n const errors = [...Value.Errors(schema, partialConfig)];\n const formattedErrors = formatTypeBoxError(errors);\n return {\n success: false,\n errors: formattedErrors,\n errorStrings: formatTypeBoxErrorStrings(errors),\n report: formatErrorReport(errors),\n hasCriticalErrors: hasCriticalErrors(errors),\n };\n}\n\n/**\n * Type guard functions with proper error context\n */\nexport function isValidComponent<T extends StandardComponentName>(\n name: T,\n props: unknown\n): props is Static<(typeof COMPONENT_SCHEMA_MAP)[T]> {\n const result = validateComponent(name, props);\n return result.success;\n}\n\n/**\n * Validate JSON string input\n */\nexport function validateJsonComponent<T extends StandardComponentName>(\n name: T,\n jsonString: string\n): CoreValidationResult<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>> {\n try {\n const parsed = JSON.parse(jsonString);\n return validateComponent(name, parsed, {\n includeReport: true,\n checkCritical: true,\n });\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: 'root',\n message: `Invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n code: 'custom',\n suggestion: 'Check for syntax errors in your JSON',\n },\n ],\n errorStrings: [\n `Invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n ],\n hasCriticalErrors: true,\n };\n }\n}\n","import { ValueError } from '@sinclair/typebox/value';\nimport type { FormattedError } from './types';\n\n/**\n * Error formatting utilities\n * @module validation/core/errors\n * @description\n * Enhanced error formatting for TypeBox validation errors.\n * Provides detailed, user-friendly error messages with context and suggestions.\n */\n\n/**\n * Format a single TypeBox error into a user-friendly error message\n */\nfunction formatSingleIssue(issue: ValueError): FormattedError {\n const path = issue.path || 'root';\n let message = issue.message;\n let suggestion: string | undefined;\n let expected: string | undefined;\n let received: string | undefined;\n let options: string[] | undefined;\n\n // Enhance error messages based on error type\n if (message.includes('Expected')) {\n const match = message.match(/Expected (.+) but received (.+)/);\n if (match) {\n expected = match[1];\n received = match[2];\n suggestion = getSuggestionForType(expected, received);\n }\n }\n\n // Handle required property errors\n if (message.includes('Required property')) {\n const match = message.match(/Required property '(.+)'/);\n if (match) {\n message = `Missing required field: ${match[1]}`;\n suggestion = `Add the required field: ${match[1]}`;\n }\n }\n\n // Handle unexpected property errors\n if (message.includes('Unexpected property')) {\n const match = message.match(/Unexpected property '(.+)'/);\n if (match) {\n message = `Unknown property: ${match[1]}`;\n suggestion = `Remove the unknown property: ${match[1]}`;\n }\n }\n\n // Handle union type errors\n if (message.includes('Expected union')) {\n message = 'Value does not match any of the expected types';\n suggestion = 'Check the documentation for valid format options';\n }\n\n // Handle literal value errors\n if (message.includes('Expected literal')) {\n const match = message.match(/Expected literal (.+)/);\n if (match) {\n expected = match[1];\n message = `Expected value: ${expected}`;\n suggestion = `Use the exact value: ${expected}`;\n }\n }\n\n // Handle string length errors\n if (message.includes('String length')) {\n const minMatch = message.match(/minimum length of (\\d+)/);\n const maxMatch = message.match(/maximum length of (\\d+)/);\n if (minMatch) {\n message = `String must be at least ${minMatch[1]} characters long`;\n suggestion = `Add more characters to meet the minimum length of ${minMatch[1]}`;\n } else if (maxMatch) {\n message = `String must be at most ${maxMatch[1]} characters long`;\n suggestion = `Reduce to ${maxMatch[1]} characters or less`;\n }\n }\n\n // Handle number range errors\n if (message.includes('Expected number')) {\n const minMatch = message.match(/minimum value of ([\\d.]+)/);\n const maxMatch = message.match(/maximum value of ([\\d.]+)/);\n if (minMatch) {\n message = `Number must be greater than or equal to ${minMatch[1]}`;\n suggestion = `Use a value of ${minMatch[1]} or higher`;\n } else if (maxMatch) {\n message = `Number must be less than or equal to ${maxMatch[1]}`;\n suggestion = `Use a value of ${maxMatch[1]} or lower`;\n }\n }\n\n // Handle array length errors\n if (message.includes('Array length')) {\n const minMatch = message.match(/minimum length of (\\d+)/);\n const maxMatch = message.match(/maximum length of (\\d+)/);\n if (minMatch) {\n message = `Array must have at least ${minMatch[1]} items`;\n suggestion = `Add more items to meet the minimum of ${minMatch[1]}`;\n } else if (maxMatch) {\n message = `Array must have at most ${maxMatch[1]} items`;\n suggestion = `Remove items to meet the maximum of ${maxMatch[1]}`;\n }\n }\n\n // Handle format errors\n if (message.includes('format')) {\n if (message.includes('email')) {\n message = 'Invalid email address format';\n suggestion = 'Use a valid email format like user@example.com';\n } else if (message.includes('uri') || message.includes('url')) {\n message = 'Invalid URL format';\n suggestion = 'Use a valid URL format like https://example.com';\n } else if (message.includes('date-time')) {\n message = 'Invalid date-time format';\n suggestion = 'Use ISO 8601 format like 2024-01-01T00:00:00Z';\n }\n }\n\n // Handle pattern errors\n if (message.includes('pattern')) {\n message = 'String does not match the required pattern';\n suggestion = 'Check the format requirements for this field';\n }\n\n return {\n path,\n message,\n code: String(issue.type || 'validation_error'),\n suggestion,\n expected,\n received,\n options,\n };\n}\n\n/**\n * Get type-specific suggestions for common type mismatches\n */\nfunction getSuggestionForType(\n expected: string,\n received: string\n): string | undefined {\n // Number/String confusion\n if (expected === 'number' && received === 'string') {\n return 'Remove quotes or convert the string to a number';\n }\n if (expected === 'string' && received === 'number') {\n return 'Add quotes or convert the number to a string';\n }\n\n // Boolean confusion\n if (expected === 'boolean') {\n return 'Use true or false (without quotes)';\n }\n\n // Array/Object confusion\n if (expected === 'array' && received === 'object') {\n return 'Use square brackets [] for arrays instead of curly braces {}';\n }\n if (expected === 'object' && received === 'array') {\n return 'Use curly braces {} for objects instead of square brackets []';\n }\n\n // Null/undefined handling\n if (received === 'null' || received === 'undefined') {\n return `Provide a valid ${expected} value or mark the field as optional`;\n }\n\n return undefined;\n}\n\n/**\n * Format TypeBox validation errors into detailed, user-friendly messages\n */\nexport function formatTypeBoxError(errors: ValueError[]): FormattedError[] {\n return errors.map(formatSingleIssue);\n}\n\n/**\n * Format errors as simple string array (backward compatible)\n */\nexport function formatTypeBoxErrorStrings(errors: ValueError[]): string[] {\n return formatTypeBoxError(errors).map((err) => {\n let msg = `${err.path}: ${err.message}`;\n if (err.suggestion) {\n msg += ` (Suggestion: ${err.suggestion})`;\n }\n return msg;\n });\n}\n\n/**\n * Get a summary of validation errors grouped by path\n */\nexport function getErrorSummary(\n errors: ValueError[]\n): Map<string, FormattedError[]> {\n const summary = new Map<string, FormattedError[]>();\n\n for (const formattedError of formatTypeBoxError(errors)) {\n const existing = summary.get(formattedError.path) || [];\n existing.push(formattedError);\n summary.set(formattedError.path, existing);\n }\n\n return summary;\n}\n\n/**\n * Format validation errors as a detailed report\n */\nexport function formatErrorReport(errors: ValueError[]): string {\n const formattedErrors = formatTypeBoxError(errors);\n const summary = getErrorSummary(errors);\n\n let report = `Validation failed with ${formattedErrors.length} error${formattedErrors.length > 1 ? 's' : ''}:\\n\\n`;\n\n for (const [path, pathErrors] of summary) {\n report += `📍 ${path}:\\n`;\n for (const err of pathErrors) {\n report += ` ❌ ${err.message}\\n`;\n if (err.suggestion) {\n report += ` 💡 ${err.suggestion}\\n`;\n }\n if (err.expected && err.received) {\n report += ` 📋 Expected: ${err.expected}, Received: ${err.received}\\n`;\n }\n if (err.options) {\n report += ` 📋 Valid options: ${err.options.join(', ')}\\n`;\n }\n }\n report += '\\n';\n }\n\n return report;\n}\n\n/**\n * Check if an error is critical (affects core functionality)\n */\nexport function hasCriticalErrors(errors: ValueError[]): boolean {\n return errors.some((issue) => {\n // Missing required fields are critical\n if (issue.message.includes('Required property')) {\n return true;\n }\n\n // Invalid component names are critical\n if (\n issue.path.includes('name') &&\n issue.message.includes('Expected literal')\n ) {\n return true;\n }\n\n // Schema structure errors are critical\n if (\n issue.message.includes('Expected union') ||\n issue.message.includes('Never')\n ) {\n return true;\n }\n\n return false;\n });\n}\n\n/**\n * Get validation context for better error messages\n */\nexport function getValidationContext(path: string): string {\n if (!path || path === 'root') return 'document root';\n\n const pathParts = path.split('.');\n\n // Identify component context\n if (pathParts.includes('children')) {\n const childIndex = pathParts.indexOf('children');\n if (pathParts.length > childIndex + 1) {\n const index = pathParts[childIndex + 1];\n return `component at index ${index}`;\n }\n }\n\n // Identify props context\n if (pathParts.includes('props')) {\n return 'props section';\n }\n\n // Identify theme context\n if (pathParts.includes('theme')) {\n return 'theme configuration';\n }\n\n return pathParts.join(' > ');\n}\n\n// ============================================================================\n// Legacy Compatibility Exports (for API backward compatibility)\n// ============================================================================\n\n// Primary exports - use formatTypeBoxError and formatTypeBoxErrorStrings directly\nexport const formatValidationError = formatTypeBoxError;\nexport const formatValidationErrorStrings = formatTypeBoxErrorStrings;\n","/**\n * Component Type Definitions for Plugin System\n *\n * This file provides properly typed discriminated union interfaces for all component types.\n * These types enable TypeScript to automatically infer component props based on\n * the 'name' field when building component arrays in render functions.\n */\n\nimport type { Static } from '@sinclair/typebox';\nimport type {\n ReportPropsSchema,\n SectionPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ColumnsPropsSchema,\n ImagePropsSchema,\n HighchartsPropsSchema,\n VisualPropsSchema,\n StatisticPropsSchema,\n TablePropsSchema,\n ListPropsSchema,\n TocPropsSchema,\n} from '../schemas/components';\n\nimport type { TextSpaceAfterPropsSchema } from '../schemas/custom-components';\nimport type { TextBoxPropsSchema } from '../schemas/components/text-box';\n\n// ============================================================================\n// Standard Component Types with Discriminated Union Support\n// ============================================================================\n\n/**\n * Report component with literal name discriminator\n */\nexport interface ReportComponent {\n name: 'docx';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ReportPropsSchema>;\n children?: ComponentDefinition[];\n}\n\n/**\n * Section component with literal name discriminator\n */\nexport interface SectionComponent {\n name: 'section';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof SectionPropsSchema>;\n children?: ComponentDefinition[];\n}\n\n/**\n * Columns component with literal name discriminator\n */\nexport interface ColumnsComponent {\n name: 'columns';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ColumnsPropsSchema>;\n children?: ComponentDefinition[];\n}\n\n/**\n * Heading component with literal name discriminator\n */\nexport interface HeadingComponent {\n name: 'heading';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof HeadingPropsSchema>;\n}\n\n/**\n * Paragraph component with literal name discriminator\n */\nexport interface ParagraphComponent {\n name: 'paragraph';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ParagraphPropsSchema>;\n}\n\n/**\n * Image component with literal name discriminator\n */\nexport interface ImageComponent {\n name: 'image';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ImagePropsSchema>;\n}\n\n/**\n * Statistic component with literal name discriminator\n */\nexport interface StatisticComponent {\n name: 'statistic';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof StatisticPropsSchema>;\n}\n\n/**\n * Table component with literal name discriminator\n */\nexport interface TableComponent {\n name: 'table';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof TablePropsSchema>;\n}\n\n/**\n * Highcharts component with literal name discriminator\n */\nexport interface HighchartsComponent {\n name: 'highcharts';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof HighchartsPropsSchema>;\n}\n\n/**\n * Visual component with literal name discriminator.\n * A pptx-rendered free-canvas graphic embedded as a rasterized image.\n */\nexport interface VisualComponent {\n name: 'visual';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof VisualPropsSchema>;\n}\n\n/**\n * Text Box component with literal name discriminator\n * Container for child components with floating positioning\n */\nexport interface TextBoxComponent {\n name: 'text-box';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof TextBoxPropsSchema>;\n children?: ComponentDefinition[];\n}\n\n/**\n * List component with literal name discriminator\n */\nexport interface ListComponent {\n name: 'list';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ListPropsSchema>;\n}\n\n/**\n * Table of Contents component with literal name discriminator\n */\nexport interface TocComponent {\n name: 'toc';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof TocPropsSchema>;\n}\n\n// ============================================================================\n// Specific Custom Component Types\n// ============================================================================\n\n/**\n * Text Space After component with literal name discriminator\n */\nexport interface TextSpaceAfterComponent {\n name: 'text-space-after';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof TextSpaceAfterPropsSchema>;\n}\n\n// ============================================================================\n// Discriminated Union Types\n// ============================================================================\n\n/**\n * Union of all standard component types\n */\nexport type StandardComponentDefinition =\n | ReportComponent\n | SectionComponent\n | ColumnsComponent\n | HeadingComponent\n | ParagraphComponent\n | TextBoxComponent\n | ImageComponent\n | HighchartsComponent\n | VisualComponent\n | StatisticComponent\n | TableComponent\n | ListComponent\n | TocComponent;\n\n/**\n * Array of all standard component names.\n * Useful for iterating, validation, or displaying available components to users.\n */\nexport const STANDARD_COMPONENTS = [\n 'columns',\n 'heading',\n 'highcharts',\n 'image',\n 'list',\n 'paragraph',\n 'docx',\n 'section',\n 'statistic',\n 'table',\n 'text-box',\n 'toc',\n 'visual',\n] as const satisfies readonly StandardComponentDefinition['name'][];\n\n/**\n * Set of all standard component names for O(1) lookup.\n */\nexport const STANDARD_COMPONENTS_SET: ReadonlySet<\n (typeof STANDARD_COMPONENTS)[number]\n> = new Set(STANDARD_COMPONENTS);\n\n// Compile-time completeness check: produces TS2344 listing the missing name(s)\n// if a standard component is added to the union but not to the array above.\ntype AssertNever<T extends never> = T;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype _AssertAllIncluded = AssertNever<\n Exclude<\n StandardComponentDefinition['name'],\n (typeof STANDARD_COMPONENTS)[number]\n >\n>;\n\n/**\n * Complete discriminated union of all component types.\n * TypeScript will automatically narrow the type based on the 'name' field.\n *\n * @example\n * ```typescript\n * const components: ComponentDefinition[] = [\n * {\n * name: 'heading', // TypeScript knows this is HeadingComponent\n * props: {\n * level: 2, // Autocomplete works!\n * text: 'Title'\n * }\n * },\n * {\n * name: 'paragraph', // TypeScript knows this is ParagraphComponent\n * props: {\n * content: 'Hello World',\n * bold: true // Autocomplete works!\n * }\n * }\n * ];\n * ```\n */\nexport type ComponentDefinition =\n | StandardComponentDefinition\n | TextSpaceAfterComponent;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isReportComponent(\n component: ComponentDefinition\n): component is ReportComponent {\n return component.name === 'docx';\n}\n\nexport function isSectionComponent(\n component: ComponentDefinition\n): component is SectionComponent {\n return component.name === 'section';\n}\n\nexport function isColumnsComponent(\n component: ComponentDefinition\n): component is ColumnsComponent {\n return component.name === 'columns';\n}\n\nexport function isHeadingComponent(\n component: ComponentDefinition\n): component is HeadingComponent {\n return component.name === 'heading';\n}\n\nexport function isParagraphComponent(\n component: ComponentDefinition\n): component is ParagraphComponent {\n return component.name === 'paragraph';\n}\n\nexport function isImageComponent(\n component: ComponentDefinition\n): component is ImageComponent {\n return component.name === 'image';\n}\n\nexport function isTextBoxComponent(\n component: ComponentDefinition\n): component is TextBoxComponent {\n return component.name === 'text-box';\n}\n\nexport function isStatisticComponent(\n component: ComponentDefinition\n): component is StatisticComponent {\n return component.name === 'statistic';\n}\n\nexport function isTableComponent(\n component: ComponentDefinition\n): component is TableComponent {\n return component.name === 'table';\n}\n\nexport function isListComponent(\n component: ComponentDefinition\n): component is ListComponent {\n return component.name === 'list';\n}\n\nexport function isTocComponent(\n component: ComponentDefinition\n): component is TocComponent {\n return component.name === 'toc';\n}\n\nexport function isHighchartsComponent(\n component: ComponentDefinition\n): component is HighchartsComponent {\n return component.name === 'highcharts';\n}\n\nexport function isVisualComponent(\n component: ComponentDefinition\n): component is VisualComponent {\n return component.name === 'visual';\n}\n\nexport function isTextSpaceAfterComponent(\n component: ComponentDefinition\n): component is TextSpaceAfterComponent {\n return component.name === 'text-space-after';\n}\n"],"mappings":"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","names":["k","i","j","i","j","fixSchemaReferences","convertToJsonSchema","createComponentSchema","exportSchemaToFile","transformValueError","transformValueErrors","Value","validateComponent","Value","errors","formattedErrors","validateComponentDefinition","validateComponents"]}
|
|
1
|
+
{"version":3,"sources":["../src/diff/word-diff.ts","../src/diff/document-diff.ts","../src/index.ts","../src/validation/parsers/json.ts","../src/validation/validators/theme.ts","../src/validation/validators/component.ts","../src/validation/core/validator.ts","../src/validation/core/errors.ts","../src/types/components.ts"],"sourcesContent":["/**\n * Word-level text diff\n *\n * Tokenizes text into words and whitespace, runs an LCS diff over the\n * tokens, and emits revision segments. Pure, dependency-free.\n */\n\nimport type { RevisionSegment } from '../schemas/components/revision';\n\n/**\n * Anchored to the schema type so the diff engine can never emit segments\n * the RevisionSchema would reject.\n */\nexport type DiffSegment = RevisionSegment;\n\n/**\n * Above this many DP cells the LCS table is not worth building: fall back\n * to a whole-text replace. ~1000x1000 tokens covers any realistic paragraph.\n */\nconst MAX_LCS_CELLS = 1_000_000;\n\n/** Split into alternating word / whitespace tokens (both preserved). */\nexport function tokenizeWords(text: string): string[] {\n if (!text) return [];\n return text.split(/(\\s+)/).filter((t) => t.length > 0);\n}\n\nfunction mergeSegments(segments: DiffSegment[]): DiffSegment[] {\n const merged: DiffSegment[] = [];\n for (const seg of segments) {\n if (!seg.text) continue;\n const last = merged[merged.length - 1];\n if (last && last.type === seg.type) {\n last.text += seg.text;\n } else {\n merged.push({ ...seg });\n }\n }\n return merged;\n}\n\n/**\n * Readability pass over the raw LCS output:\n * 1. A whitespace-only equal segment flanked by changes joins the change\n * (the space is both deleted and re-inserted), so \"x y\" -> \"a b\" reads\n * as one replacement instead of three fragments.\n * 2. Within each change run, deletions are emitted before insertions.\n * The old/new reconstruction invariant is preserved.\n */\nfunction normalizeSegments(segments: DiffSegment[]): DiffSegment[] {\n const folded: DiffSegment[] = [];\n for (let k = 0; k < segments.length; k++) {\n const seg = segments[k];\n if (seg.type === 'equal' && /^\\s+$/.test(seg.text)) {\n const prev = folded[folded.length - 1];\n const next = segments[k + 1];\n if (prev && prev.type !== 'equal' && next && next.type !== 'equal') {\n folded.push(\n { type: 'delete', text: seg.text },\n { type: 'insert', text: seg.text }\n );\n continue;\n }\n }\n folded.push({ ...seg });\n }\n\n const out: DiffSegment[] = [];\n let k = 0;\n while (k < folded.length) {\n if (folded[k].type === 'equal') {\n out.push(folded[k]);\n k++;\n continue;\n }\n let deleted = '';\n let inserted = '';\n while (k < folded.length && folded[k].type !== 'equal') {\n if (folded[k].type === 'delete') deleted += folded[k].text;\n else inserted += folded[k].text;\n k++;\n }\n if (deleted) out.push({ type: 'delete', text: deleted });\n if (inserted) out.push({ type: 'insert', text: inserted });\n }\n return mergeSegments(out);\n}\n\n/**\n * Word-level diff between two strings.\n *\n * Returns merged segments in document order. Deleting everything and\n * inserting everything (whole replace) is the degenerate output for\n * completely different texts or oversized inputs.\n */\nexport function diffWords(oldText: string, newText: string): DiffSegment[] {\n if (oldText === newText) {\n return oldText ? [{ type: 'equal', text: oldText }] : [];\n }\n\n const oldTokens = tokenizeWords(oldText);\n const newTokens = tokenizeWords(newText);\n\n if (oldTokens.length === 0) {\n return mergeSegments([{ type: 'insert', text: newText }]);\n }\n if (newTokens.length === 0) {\n return mergeSegments([{ type: 'delete', text: oldText }]);\n }\n\n if (oldTokens.length * newTokens.length > MAX_LCS_CELLS) {\n return mergeSegments([\n { type: 'delete', text: oldText },\n { type: 'insert', text: newText },\n ]);\n }\n\n // Standard LCS dynamic programming table\n const n = oldTokens.length;\n const m = newTokens.length;\n // lcs[i][j] = LCS length of oldTokens[i..] and newTokens[j..]\n const lcs: Int32Array[] = Array.from(\n { length: n + 1 },\n () => new Int32Array(m + 1)\n );\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i][j] =\n oldTokens[i] === newTokens[j]\n ? lcs[i + 1][j + 1] + 1\n : Math.max(lcs[i + 1][j], lcs[i][j + 1]);\n }\n }\n\n // Backtrack\n const segments: DiffSegment[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (oldTokens[i] === newTokens[j]) {\n segments.push({ type: 'equal', text: oldTokens[i] });\n i++;\n j++;\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) {\n segments.push({ type: 'delete', text: oldTokens[i] });\n i++;\n } else {\n segments.push({ type: 'insert', text: newTokens[j] });\n j++;\n }\n }\n while (i < n) {\n segments.push({ type: 'delete', text: oldTokens[i] });\n i++;\n }\n while (j < m) {\n segments.push({ type: 'insert', text: newTokens[j] });\n j++;\n }\n\n return normalizeSegments(segments);\n}\n\n/**\n * Strip the inline markdown the renderer understands (bold/italic markers,\n * hyperlinks) so revision segments — which render literally — never expose\n * raw markers. Uses the exact decorator regex of textParser.ts (lazy\n * [\\s\\S]*? content), so what the parser would style, this strips — including\n * content containing '*' or '_' (e.g. **snake_case**).\n */\nexport function stripMarkdown(text: string): string {\n return text\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '$1') // [text](url) -> text\n .replace(\n /(\\*\\*\\*|___)([\\s\\S]*?)\\1|(\\*\\*|__)([\\s\\S]*?)\\3|(\\*|_)([\\s\\S]*?)\\5/g,\n (_match, _d1, bi, _d2, b, _d3, i) => bi ?? b ?? i ?? ''\n );\n}\n","/**\n * Document diff engine\n *\n * Compares two json-to-office DOCX definitions and produces a redline\n * document: a third definition (based on the new one) where text changes\n * are expressed as `revision` segments that the renderer turns into native\n * Word tracked changes (w:ins / w:del).\n *\n * Scope (v1):\n * - paragraph / heading: word-level tracked changes\n * - list: item-level alignment, word-level tracked changes per item\n * - containers (section, columns, text-box, ...): recursed into\n * - everything else (table, image, chart, ...): block replace, reported\n * as an *untracked* change in the summary — Word has no native revision\n * for these at the fidelity docx.js supports.\n */\n\nimport { diffWords, stripMarkdown, type DiffSegment } from './word-diff';\n\n/** Structural view of any component node — schemas validate elsewhere. */\nexport interface JsonNode {\n name: string;\n props?: Record<string, unknown>;\n children?: JsonNode[];\n [key: string]: unknown;\n}\n\nexport interface DiffDocumentsOptions {\n /** Revision author shown in Word (default: \"json-to-office\") */\n author?: string;\n /** Revision timestamp, ISO 8601 (default: deterministic epoch) */\n date?: string;\n}\n\nexport interface UntrackedChange {\n /** JSON-pointer-ish location in the NEW document */\n path: string;\n kind: 'modified' | 'inserted' | 'deleted';\n component: string;\n detail: string;\n}\n\nexport interface DiffSummary {\n /** Blocks rendered with native tracked changes */\n tracked: {\n modified: number;\n inserted: number;\n deleted: number;\n };\n /** Changes the redline cannot express as native revisions */\n untracked: UntrackedChange[];\n unchangedBlocks: number;\n /** Aggregate fidelity caveats about the redline */\n notes: string[];\n}\n\nexport interface DiffDocumentsResult {\n /** Redline document definition (renderable as-is) */\n document: JsonNode;\n summary: DiffSummary;\n}\n\nconst TEXT_COMPONENTS = new Set(['paragraph', 'heading']);\n\ntype ListItem = string | { text: string; level?: number };\n\ninterface NormalizedListItem {\n /** Original item text (markdown intact) — emitted for unchanged items */\n raw: string;\n /** NFC-normalized, markdown-stripped text — used for alignment and diffing */\n text: string;\n level: number;\n}\n\ninterface DiffContext {\n author?: string;\n date?: string;\n summary: DiffSummary;\n}\n\n// Key-order sensitive: props objects with the same entries in a different\n// order compare unequal. Acceptable — inputs are machine-generated and a\n// false \"changed\" only adds a spurious untracked summary entry.\nfunction deepEqual(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction makeRevision(ctx: DiffContext, segments: DiffSegment[]) {\n return {\n ...(ctx.author && { author: ctx.author }),\n ...(ctx.date && { date: ctx.date }),\n segments,\n };\n}\n\n/** Raw text prop, NFC-normalized (matching the renderer's normalization). */\nfunction rawText(node: JsonNode): string {\n const text = node.props?.text;\n return typeof text === 'string' ? text.normalize('NFC') : '';\n}\n\n/** Text of a text component as it renders: NFC-normalized, markdown stripped. */\nfunction plainText(node: JsonNode): string {\n return stripMarkdown(rawText(node));\n}\n\nconst PLACEHOLDER_PATTERN = /\\{[^}]+\\}/;\n\n/** A node is rendered unless it explicitly opts out with enabled: false. */\nfunction isEnabled(node: JsonNode): boolean {\n return node.enabled !== false;\n}\n\nfunction notePlaceholdersInChanges(\n segments: DiffSegment[],\n path: string,\n component: string,\n ctx: DiffContext\n): void {\n if (\n segments.some((s) => s.type !== 'equal' && PLACEHOLDER_PATTERN.test(s.text))\n ) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component,\n detail:\n 'placeholder (e.g. {DATE}) inside inserted/deleted text renders literally in the redline',\n });\n }\n}\n\nfunction propsWithout(\n props: Record<string, unknown> | undefined,\n ...keys: string[]\n): Record<string, unknown> {\n const copy = { ...(props || {}) };\n for (const key of keys) delete copy[key];\n return copy;\n}\n\n// ---------------------------------------------------------------------------\n// Generic LCS alignment over arrays\n// ---------------------------------------------------------------------------\n\ntype AlignOp<T> =\n | { op: 'equal'; oldItem: T; newItem: T }\n | { op: 'delete'; oldItem: T }\n | { op: 'insert'; newItem: T };\n\n/**\n * Above this many DP cells the LCS table is not worth its memory (an\n * Int32Array table lives off the V8 heap). Typical edits touch few blocks,\n * so the prefix/suffix trim below makes the table tiny in practice.\n */\nconst MAX_ALIGN_CELLS = 4_000_000;\n\n/** LCS alignment of two arrays under a stable key function. */\nfunction alignByLcs<T>(\n oldItems: T[],\n newItems: T[],\n key: (item: T) => string\n): AlignOp<T>[] {\n const oldKeys = oldItems.map(key);\n const newKeys = newItems.map(key);\n\n // Trim the common prefix and suffix — emitted as equal ops directly\n let start = 0;\n while (\n start < oldItems.length &&\n start < newItems.length &&\n oldKeys[start] === newKeys[start]\n ) {\n start++;\n }\n let oldEnd = oldItems.length;\n let newEnd = newItems.length;\n while (\n oldEnd > start &&\n newEnd > start &&\n oldKeys[oldEnd - 1] === newKeys[newEnd - 1]\n ) {\n oldEnd--;\n newEnd--;\n }\n\n const prefix: AlignOp<T>[] = [];\n for (let k = 0; k < start; k++) {\n prefix.push({ op: 'equal', oldItem: oldItems[k], newItem: newItems[k] });\n }\n const suffix: AlignOp<T>[] = [];\n for (let k = 0; k < oldItems.length - oldEnd; k++) {\n suffix.push({\n op: 'equal',\n oldItem: oldItems[oldEnd + k],\n newItem: newItems[newEnd + k],\n });\n }\n\n const n = oldEnd - start;\n const m = newEnd - start;\n const middle: AlignOp<T>[] = [];\n\n if (n * m > MAX_ALIGN_CELLS) {\n // Degenerate fallback: replace the whole middle\n for (let k = 0; k < n; k++) {\n middle.push({ op: 'delete', oldItem: oldItems[start + k] });\n }\n for (let k = 0; k < m; k++) {\n middle.push({ op: 'insert', newItem: newItems[start + k] });\n }\n return [...prefix, ...middle, ...suffix];\n }\n\n const lcs: Int32Array[] = Array.from(\n { length: n + 1 },\n () => new Int32Array(m + 1)\n );\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i][j] =\n oldKeys[start + i] === newKeys[start + j]\n ? lcs[i + 1][j + 1] + 1\n : Math.max(lcs[i + 1][j], lcs[i][j + 1]);\n }\n }\n\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (oldKeys[start + i] === newKeys[start + j]) {\n middle.push({\n op: 'equal',\n oldItem: oldItems[start + i],\n newItem: newItems[start + j],\n });\n i++;\n j++;\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) {\n middle.push({ op: 'delete', oldItem: oldItems[start + i] });\n i++;\n } else {\n middle.push({ op: 'insert', newItem: newItems[start + j] });\n j++;\n }\n }\n while (i < n) middle.push({ op: 'delete', oldItem: oldItems[start + i++] });\n while (j < m) middle.push({ op: 'insert', newItem: newItems[start + j++] });\n\n return [...prefix, ...middle, ...suffix];\n}\n\n/**\n * Within a run of deletes+inserts between two equal anchors, pair removed\n * and added nodes that share the same component name (\"modified\" instead of\n * \"deleted + inserted\"). Pairing is greedy and order-preserving.\n */\ninterface GapPairing<T> {\n pairs: { oldItem: T; newItem: T }[];\n /** Emission plan preserving relative order */\n plan: (\n | { kind: 'deleted'; oldItem: T }\n | { kind: 'inserted'; newItem: T }\n | { kind: 'paired'; oldItem: T; newItem: T }\n )[];\n}\n\nfunction pairGap<T>(\n deleted: T[],\n inserted: T[],\n pairable: (oldItem: T, newItem: T) => boolean\n): GapPairing<T> {\n const usedOld = new Array<boolean>(deleted.length).fill(false);\n const pairing = new Array<number>(inserted.length).fill(-1);\n\n let searchFrom = 0;\n for (let j = 0; j < inserted.length; j++) {\n for (let i = searchFrom; i < deleted.length; i++) {\n if (!usedOld[i] && pairable(deleted[i], inserted[j])) {\n usedOld[i] = true;\n pairing[j] = i;\n searchFrom = i + 1; // keep pairs order-preserving\n break;\n }\n }\n }\n\n const plan: GapPairing<T>['plan'] = [];\n const pairs: GapPairing<T>['pairs'] = [];\n let emittedOld = 0;\n for (let j = 0; j < inserted.length; j++) {\n const i = pairing[j];\n if (i >= 0) {\n // Old nodes before this pair that were never matched: emit as deleted\n while (emittedOld < i) {\n if (!usedOld[emittedOld]) {\n plan.push({ kind: 'deleted', oldItem: deleted[emittedOld] });\n }\n emittedOld++;\n }\n emittedOld = i + 1;\n plan.push({ kind: 'paired', oldItem: deleted[i], newItem: inserted[j] });\n pairs.push({ oldItem: deleted[i], newItem: inserted[j] });\n } else {\n plan.push({ kind: 'inserted', newItem: inserted[j] });\n }\n }\n for (let i = emittedOld; i < deleted.length; i++) {\n if (!usedOld[i]) plan.push({ kind: 'deleted', oldItem: deleted[i] });\n }\n return { pairs, plan };\n}\n\n// ---------------------------------------------------------------------------\n// Component-level diff\n// ---------------------------------------------------------------------------\n\n/** Modified text component → new node carrying revision segments. */\nfunction diffTextComponent(\n oldNode: JsonNode,\n newNode: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n const oldText = plainText(oldNode);\n const newText = plainText(newNode);\n\n const propsChanged = !deepEqual(\n propsWithout(oldNode.props, 'text', 'revision'),\n propsWithout(newNode.props, 'text', 'revision')\n );\n if (propsChanged) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail:\n 'formatting/props changed (not expressible as a tracked change); new version rendered',\n });\n }\n\n if (oldText === newText) {\n // Same rendered text, but markdown-only differences (bold markers,\n // hyperlink targets) are invisible after stripping — surface them.\n if (rawText(oldNode) !== rawText(newNode)) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail:\n 'inline formatting or link target changed (markdown-only); new version rendered without a tracked change',\n });\n } else if (!propsChanged) {\n ctx.summary.unchangedBlocks++;\n }\n return newNode;\n }\n\n ctx.summary.tracked.modified++;\n const segments = diffWords(oldText, newText);\n notePlaceholdersInChanges(segments, path, newNode.name, ctx);\n // Revision segments render literally, so markdown anywhere in a modified\n // block — including its unchanged portions — is flattened to plain text\n if (rawText(oldNode) !== oldText || rawText(newNode) !== newText) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail:\n 'inline formatting or links flattened to plain text in the redline (revision segments render literally)',\n });\n }\n return {\n ...newNode,\n props: {\n ...newNode.props,\n text: newText,\n revision: makeRevision(ctx, segments),\n },\n };\n}\n\n/** Whole text component inserted/deleted → fully tracked block. */\nfunction insertedTextComponent(\n node: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n ctx.summary.tracked.inserted++;\n const text = plainText(node);\n const segments: DiffSegment[] = [{ type: 'insert', text }];\n notePlaceholdersInChanges(segments, path, node.name, ctx);\n return {\n ...node,\n props: {\n ...node.props,\n text,\n revision: makeRevision(ctx, segments),\n },\n };\n}\n\nfunction deletedTextComponent(\n node: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n ctx.summary.tracked.deleted++;\n const text = plainText(node);\n const segments: DiffSegment[] = [{ type: 'delete', text }];\n notePlaceholdersInChanges(segments, path, node.name, ctx);\n return {\n ...node,\n props: {\n ...node.props,\n text: '',\n revision: makeRevision(ctx, segments),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// List diff\n// ---------------------------------------------------------------------------\n\nfunction normalizeListItems(node: JsonNode): NormalizedListItem[] {\n const items = (node.props?.items as ListItem[] | undefined) || [];\n return items.map((item) => {\n const raw = typeof item === 'string' ? item : item.text;\n const level = typeof item === 'string' ? 0 : item.level || 0;\n return { raw, text: stripMarkdown(raw.normalize('NFC')), level };\n });\n}\n\nfunction diffListComponent(\n oldNode: JsonNode,\n newNode: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n const propsChanged = !deepEqual(\n propsWithout(oldNode.props, 'items'),\n propsWithout(newNode.props, 'items')\n );\n if (propsChanged) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: 'list',\n detail:\n 'list configuration changed (format/levels/spacing); new version rendered',\n });\n }\n\n const oldItems = normalizeListItems(oldNode);\n const newItems = normalizeListItems(newNode);\n\n const stripped = (items: NormalizedListItem[]) =>\n items.map((i) => ({ text: i.text, level: i.level }));\n if (deepEqual(stripped(oldItems), stripped(newItems))) {\n if (\n !deepEqual(\n oldItems.map((i) => i.raw),\n newItems.map((i) => i.raw)\n )\n ) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: 'list',\n detail:\n 'inline formatting or link target changed in list items (markdown-only); new version rendered without a tracked change',\n });\n } else if (!propsChanged) {\n ctx.summary.unchangedBlocks++;\n }\n return newNode;\n }\n\n const ops = alignByLcs(\n oldItems,\n newItems,\n (item) => `${item.level}:${item.text}`\n );\n\n // Collapse delete/insert runs into modified pairs (same level)\n const outItems: Array<{\n text: string;\n level?: number;\n revision?: ReturnType<typeof makeRevision>;\n }> = [];\n let changed = false;\n\n let k = 0;\n while (k < ops.length) {\n const op = ops[k];\n if (op.op === 'equal') {\n // Unchanged item: keep the raw text so markdown/hyperlinks survive\n outItems.push({ text: op.newItem.raw, level: op.newItem.level });\n k++;\n continue;\n }\n // Collect the full delete/insert run\n const deleted: NormalizedListItem[] = [];\n const inserted: NormalizedListItem[] = [];\n while (k < ops.length && ops[k].op !== 'equal') {\n const gapOp = ops[k];\n if (gapOp.op === 'delete') deleted.push(gapOp.oldItem);\n else if (gapOp.op === 'insert') inserted.push(gapOp.newItem);\n k++;\n }\n const { plan } = pairGap(\n deleted,\n inserted,\n (oldItem, newItem) => oldItem.level === newItem.level\n );\n for (const step of plan) {\n changed = true;\n if (step.kind === 'paired') {\n const segments = diffWords(step.oldItem.text, step.newItem.text);\n notePlaceholdersInChanges(segments, path, 'list', ctx);\n outItems.push({\n text: step.newItem.text,\n level: step.newItem.level,\n revision: makeRevision(ctx, segments),\n });\n } else if (step.kind === 'inserted') {\n outItems.push({\n text: step.newItem.text,\n level: step.newItem.level,\n revision: makeRevision(ctx, [\n { type: 'insert', text: step.newItem.text },\n ]),\n });\n } else {\n outItems.push({\n text: '',\n level: step.oldItem.level,\n revision: makeRevision(ctx, [\n { type: 'delete', text: step.oldItem.text },\n ]),\n });\n }\n }\n }\n\n if (changed) ctx.summary.tracked.modified++;\n return {\n ...newNode,\n props: { ...newNode.props, items: outItems },\n };\n}\n\nfunction listWithAllItems(\n node: JsonNode,\n type: 'insert' | 'delete',\n ctx: DiffContext\n): JsonNode {\n if (type === 'insert') ctx.summary.tracked.inserted++;\n else ctx.summary.tracked.deleted++;\n const items = normalizeListItems(node).map((item) => ({\n text: type === 'insert' ? item.text : '',\n level: item.level,\n revision: makeRevision(ctx, [{ type, text: item.text }]),\n }));\n return { ...node, props: { ...node.props, items } };\n}\n\n// ---------------------------------------------------------------------------\n// Tree diff\n// ---------------------------------------------------------------------------\n\nfunction isContainer(node: JsonNode): boolean {\n return Array.isArray(node.children);\n}\n\nfunction nodesPairable(oldNode: JsonNode, newNode: JsonNode): boolean {\n return oldNode.name === newNode.name;\n}\n\nfunction diffPairedNode(\n oldNode: JsonNode,\n newNode: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n // `enabled` flips change what renders without touching props: treat them\n // as content appearing (insertion) or disappearing (deletion).\n const oldEnabled = isEnabled(oldNode);\n const newEnabled = isEnabled(newNode);\n if (!oldEnabled && !newEnabled) {\n ctx.summary.unchangedBlocks++;\n return newNode;\n }\n if (!oldEnabled && newEnabled) {\n return emitInserted(newNode, path, ctx);\n }\n if (oldEnabled && !newEnabled) {\n // The disabled new node would be filtered at render; emit the old\n // content as a tracked deletion instead (where supported).\n const deletedNode = emitDeleted(oldNode, path, ctx);\n return deletedNode ?? newNode;\n }\n\n if (TEXT_COMPONENTS.has(newNode.name)) {\n return diffTextComponent(oldNode, newNode, path, ctx);\n }\n if (newNode.name === 'list') {\n return diffListComponent(oldNode, newNode, path, ctx);\n }\n if (isContainer(newNode) || isContainer(oldNode)) {\n const propsChanged = !deepEqual(oldNode.props, newNode.props);\n if (propsChanged) {\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail: 'container props changed; new version rendered',\n });\n }\n return {\n ...newNode,\n children: diffChildren(\n oldNode.children || [],\n newNode.children || [],\n `${path}/children`,\n ctx\n ),\n };\n }\n // Opaque component (table, image, chart, ...): block replace\n ctx.summary.untracked.push({\n path,\n kind: 'modified',\n component: newNode.name,\n detail: `\"${newNode.name}\" changed (no native tracked-change support); new version rendered`,\n });\n return newNode;\n}\n\nfunction emitInserted(\n node: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode {\n // A disabled node renders nothing — keep it, but track nothing\n if (!isEnabled(node)) {\n return node;\n }\n if (TEXT_COMPONENTS.has(node.name)) {\n return insertedTextComponent(node, path, ctx);\n }\n if (node.name === 'list') {\n return listWithAllItems(node, 'insert', ctx);\n }\n if (isContainer(node)) {\n if (typeof node.props?.title === 'string') {\n ctx.summary.untracked.push({\n path,\n kind: 'inserted',\n component: node.name,\n detail: `\"${node.name}\" title rendered without insertion mark (titles are props, not text blocks)`,\n });\n }\n return {\n ...node,\n children: diffChildren([], node.children || [], `${path}/children`, ctx),\n };\n }\n ctx.summary.untracked.push({\n path,\n kind: 'inserted',\n component: node.name,\n detail: `\"${node.name}\" added (rendered, but not marked as a tracked insertion)`,\n });\n return node;\n}\n\n/** Returns the redline node for a deleted block, or null if it must be dropped. */\nfunction emitDeleted(\n node: JsonNode,\n path: string,\n ctx: DiffContext\n): JsonNode | null {\n // A disabled node never rendered — drop it silently\n if (!isEnabled(node)) {\n return null;\n }\n if (TEXT_COMPONENTS.has(node.name)) {\n return deletedTextComponent(node, path, ctx);\n }\n if (node.name === 'list') {\n return listWithAllItems(node, 'delete', ctx);\n }\n if (isContainer(node)) {\n if (typeof node.props?.title === 'string') {\n ctx.summary.untracked.push({\n path,\n kind: 'deleted',\n component: node.name,\n detail: `\"${node.name}\" title still rendered without deletion mark (titles are props, not text blocks)`,\n });\n }\n const children = diffChildren(\n node.children || [],\n [],\n `${path}/children`,\n ctx\n );\n return { ...node, children };\n }\n ctx.summary.untracked.push({\n path,\n kind: 'deleted',\n component: node.name,\n detail: `\"${node.name}\" removed (dropped from the redline; Word cannot mark it as a tracked deletion)`,\n });\n return null;\n}\n\nexport function diffChildren(\n oldChildren: JsonNode[],\n newChildren: JsonNode[],\n path: string,\n ctx: DiffContext\n): JsonNode[] {\n const ops = alignByLcs(oldChildren, newChildren, (node) =>\n JSON.stringify(node)\n );\n\n const out: JsonNode[] = [];\n let k = 0;\n let newIndex = 0;\n while (k < ops.length) {\n const op = ops[k];\n if (op.op === 'equal') {\n ctx.summary.unchangedBlocks++;\n out.push(op.newItem);\n k++;\n newIndex++;\n continue;\n }\n\n // Collect the full delete/insert run between equal anchors\n const deleted: JsonNode[] = [];\n const inserted: JsonNode[] = [];\n while (k < ops.length && ops[k].op !== 'equal') {\n const gapOp = ops[k];\n if (gapOp.op === 'delete') deleted.push(gapOp.oldItem);\n else if (gapOp.op === 'insert') inserted.push(gapOp.newItem);\n k++;\n }\n\n const { plan } = pairGap(deleted, inserted, nodesPairable);\n for (const step of plan) {\n if (step.kind === 'paired') {\n out.push(\n diffPairedNode(step.oldItem, step.newItem, `${path}/${newIndex}`, ctx)\n );\n newIndex++;\n } else if (step.kind === 'inserted') {\n out.push(emitInserted(step.newItem, `${path}/${newIndex}`, ctx));\n newIndex++;\n } else {\n const deletedNode = emitDeleted(\n step.oldItem,\n `${path}/${newIndex}`,\n ctx\n );\n if (deletedNode) out.push(deletedNode);\n }\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Diff two DOCX definitions into a renderable redline document.\n *\n * Both inputs must be json-to-office DOCX definitions (root `name: \"docx\"`).\n * The result is based on the NEW document; the root gains\n * `trackRevisions: true` so Word opens it in review mode.\n */\nexport function diffDocuments(\n oldDoc: JsonNode,\n newDoc: JsonNode,\n options: DiffDocumentsOptions = {}\n): DiffDocumentsResult {\n if (!oldDoc || oldDoc.name !== 'docx') {\n throw new Error('Old document: top-level component must be \"docx\"');\n }\n if (!newDoc || newDoc.name !== 'docx') {\n throw new Error('New document: top-level component must be \"docx\"');\n }\n\n const summary: DiffSummary = {\n tracked: { modified: 0, inserted: 0, deleted: 0 },\n untracked: [],\n unchangedBlocks: 0,\n notes: [],\n };\n const ctx: DiffContext = {\n author: options.author,\n date: options.date,\n summary,\n };\n\n const rootPropsChanged = !deepEqual(\n propsWithout(oldDoc.props, 'trackRevisions'),\n propsWithout(newDoc.props, 'trackRevisions')\n );\n if (rootPropsChanged) {\n summary.untracked.push({\n path: '/props',\n kind: 'modified',\n component: 'docx',\n detail:\n 'document props changed (theme/metadata/defaults); new version used',\n });\n }\n\n const children = diffChildren(\n oldDoc.children || [],\n newDoc.children || [],\n '/children',\n ctx\n );\n\n if (summary.tracked.deleted > 0) {\n summary.notes.push(\n `${summary.tracked.deleted} fully deleted block(s): accepting all changes leaves an empty paragraph behind (OOXML paragraph-mark deletion is not supported by the renderer)`\n );\n }\n\n const document: JsonNode = {\n ...newDoc,\n props: { ...newDoc.props, trackRevisions: true },\n children,\n };\n\n return { document, summary };\n}\n","// Version information\nexport const SHARED_DOCX_VERSION = '1.0.0';\n\n// ============================================================================\n// Document diff (tracked-change redlines)\n// ============================================================================\n\nexport { diffDocuments, diffWords, stripMarkdown } from './diff';\nexport type {\n DiffDocumentsOptions,\n DiffDocumentsResult,\n DiffSummary,\n UntrackedChange,\n DiffSegment,\n JsonNode,\n} from './diff';\n\n// ============================================================================\n// Format-agnostic re-exports from @json-to-office/shared\n// ============================================================================\n\n// Types\nexport type { ComponentDefinition as SharedComponentDefinition } from '@json-to-office/shared';\nexport type {\n GenerationWarning,\n AddWarningFunction,\n} from '@json-to-office/shared';\n\n// Schema utilities\nexport {\n fixSchemaReferences,\n convertToJsonSchema,\n createComponentSchema,\n createComponentSchemaObject as sharedCreateComponentSchemaObject,\n exportSchemaToFile,\n} from '@json-to-office/shared';\nexport type { ComponentSchemaConfig } from '@json-to-office/shared';\n\n// Validation - format-agnostic from shared\nexport {\n transformValueError,\n transformValueErrors,\n formatErrorSummary,\n groupErrorsByPath,\n createJsonParseError,\n calculatePosition,\n} from '@json-to-office/shared';\nexport type { ValidationError, ValidationResult } from '@json-to-office/shared';\nexport {\n type ErrorFormatterConfig,\n DEFAULT_ERROR_CONFIG,\n createErrorConfig,\n ERROR_EMOJIS,\n formatErrorMessage,\n} 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// Semver utilities\nexport {\n isValidSemver,\n parseSemver,\n compareSemver,\n latestVersion,\n type ParsedSemver,\n} from '@json-to-office/shared';\n\n// ============================================================================\n// Docx-specific: Document schemas\n// ============================================================================\n\nexport {\n JsonComponentDefinitionSchema,\n JSON_SCHEMA_URLS,\n validateDocumentWithSchema,\n validateJsonComponent as validateJsonComponentDoc,\n} from './schemas/document';\n\nexport type {\n DocumentValidationResult,\n ValidationError as DocumentValidationError,\n} from './schemas/document';\n\n// ============================================================================\n// Docx-specific: Theme schemas\n// ============================================================================\n\nexport {\n ThemeConfigSchema,\n isValidThemeConfig,\n createMinimalTheme,\n} from './schemas/theme';\n\nexport type {\n ThemeConfigJson,\n StyleDefinitions,\n DocumentMargins,\n PageDimensions,\n Page,\n FontDefinition,\n Fonts,\n ComponentDefaults,\n HeadingComponentDefaults,\n ParagraphComponentDefaults,\n ImageComponentDefaults,\n StatisticComponentDefaults,\n TableComponentDefaults,\n SectionComponentDefaults,\n ColumnsComponentDefaults,\n ListComponentDefaults,\n HeadingDefinition,\n} from './schemas/theme';\n\n// ============================================================================\n// Docx-specific: API schemas\n// ============================================================================\n\nexport * from './schemas/api';\n\n// ============================================================================\n// Docx-specific: Validation utilities\n// ============================================================================\n\n// Parser utilities\nexport {\n JsonDocumentParser,\n JsonParsingError,\n JsonValidationError,\n parseJsonComponent,\n validateJsonComponent,\n parseJsonWithLineNumbers,\n} from './validation/parsers/json';\n\n// Theme validators\nexport {\n validateThemeJson,\n isValidThemeJson,\n getValidationSummary,\n} from './validation/validators/theme';\n\n// Component validators\nexport {\n validateComponentProps,\n safeValidateComponentProps,\n safeValidateComponentDefinition,\n isReportProps,\n isSectionProps,\n isHeadingProps,\n isParagraphProps,\n isColumnsProps,\n isImageProps,\n isStatisticProps,\n isTableProps,\n isListProps,\n isCustomComponentProps,\n getValidationErrors,\n} from './validation/validators/component';\n\n// Export formatValidationErrors from theme validator (works for both)\nexport { formatValidationErrors } from './validation/validators/theme';\n\n// New comprehensive validation exports\nexport {\n // Core validators\n validateComponent,\n validateComponentDefinition,\n validateComponents,\n transformAndValidate,\n createValidatedComponent,\n isValidComponent,\n // Error formatting\n formatValidationError,\n formatValidationErrorStrings,\n formatErrorReport,\n getErrorSummary,\n hasCriticalErrors,\n getValidationContext,\n} from './validation';\n\n// Export types from validation\nexport type { ThemeValidationResult } from './validation/validators/theme';\n\nexport type {\n CoreValidationResult,\n StandardComponentName,\n FormattedError,\n} from './validation';\n\n// ============================================================================\n// Docx-specific: Unified Validation System\n// ============================================================================\n\nexport * from './validation/unified';\n\n// Re-export the simple validation API as the main validation interface\nexport { validate, validateStrict } from './validation/unified';\n\n// ============================================================================\n// Docx-specific: Component schemas (JavaScript values)\n// ============================================================================\n\nexport {\n AlignmentSchema,\n JustifiedAlignmentSchema,\n HeadingLevelSchema,\n SpacingSchema,\n LineSpacingSchema,\n IndentSchema,\n NumberingSchema,\n BorderSchema,\n MarginsSchema,\n BaseComponentPropsSchema,\n ReportPropsSchema,\n SectionPropsSchema,\n ColumnsPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ImagePropsSchema,\n TextBoxPropsSchema,\n StatisticPropsSchema,\n TablePropsSchema,\n ListPropsSchema,\n TocPropsSchema,\n RevisionSchema,\n RevisionSegmentSchema,\n StandardComponentDefinitionSchema,\n ComponentDefinitionSchema,\n} from './schemas/components';\n\n// Component types - export as types only\nexport type {\n BaseComponentProps,\n ReportProps,\n SectionProps,\n ColumnsProps,\n HeadingProps,\n ParagraphProps,\n ImageProps,\n TextBoxProps,\n StatisticProps,\n TableProps,\n ListProps,\n TocProps,\n Revision,\n RevisionSegment,\n Alignment,\n JustifiedAlignment,\n HeadingLevel,\n Spacing,\n LineSpacing,\n Indent,\n Numbering,\n} from './schemas/components';\n\n// Export ComponentDefinition from types/components.ts (better type inference)\nexport type {\n ComponentDefinition,\n StandardComponentDefinition,\n} from './types/components';\n\nexport {\n STANDARD_COMPONENTS,\n STANDARD_COMPONENTS_SET,\n} from './types/components';\n\n// Highcharts component schema (standard component)\nexport { HighchartsPropsSchema } from './schemas/components/highcharts';\nexport type { HighchartsProps } from './schemas/components/highcharts';\n\n// Visual component schema (standard component — pptx-rendered graphic)\nexport {\n VisualPropsSchema,\n VisualCanvasSchema,\n VisualCanvasBackgroundSchema,\n} from './schemas/components/visual';\nexport type { VisualProps, VisualCanvas } from './schemas/components/visual';\n\n// Custom component schemas\nexport {\n TextSpaceAfterPropsSchema,\n TextSpaceAfterComponentSchema,\n CustomComponentDefinitionSchema,\n} from './schemas/custom-components';\n\nexport type { TextSpaceAfterProps } from './schemas/custom-components';\n\n// Legacy support - re-export common types from schemas\nexport type { ThemeName } from './types/common';\n\n// ============================================================================\n// Docx-specific: Schema Export Utilities\n// ============================================================================\n\nexport {\n fixSchemaReferences as fixDocxSchemaReferences,\n convertToJsonSchema as convertDocxToJsonSchema,\n createComponentSchema as createDocxComponentSchema,\n exportSchemaToFile as exportDocxSchemaToFile,\n COMPONENT_METADATA,\n BASE_SCHEMA_METADATA,\n THEME_SCHEMA_METADATA,\n} from './schemas/export';\n\nexport type { ComponentSchemaConfig as DocxComponentSchemaConfig } from './schemas/export';\n\n// ============================================================================\n// Docx-specific: Unified Schema Generation\n// ============================================================================\n\nexport { generateUnifiedDocumentSchema } from './schemas/generator';\n\nexport type {\n CustomComponentInfo,\n GenerateDocumentSchemaOptions,\n} from './schemas/generator';\n\n// ============================================================================\n// Docx-specific: Plugin System Type Support\n// ============================================================================\n\nexport {\n type ReportComponent,\n type SectionComponent,\n type ColumnsComponent,\n type HeadingComponent,\n type ParagraphComponent,\n type TextBoxComponent,\n type ImageComponent,\n type HighchartsComponent,\n type VisualComponent,\n type StatisticComponent,\n type TableComponent,\n type ListComponent,\n type TocComponent,\n type TextSpaceAfterComponent,\n isReportComponent,\n isSectionComponent,\n isColumnsComponent,\n isHeadingComponent,\n isParagraphComponent,\n isTextBoxComponent,\n isImageComponent,\n isHighchartsComponent,\n isVisualComponent,\n isStatisticComponent,\n isTableComponent,\n isListComponent,\n isTocComponent,\n isTextSpaceAfterComponent,\n} from './types/components';\n","import { Value, ValueError } from '@sinclair/typebox/value';\nimport { FormatRegistry } from '@sinclair/typebox';\nimport {\n DocumentValidationResult,\n ValidationError,\n} from '../../schemas/document';\nimport {\n ComponentDefinitionSchema,\n ComponentDefinition,\n} from '../../schemas/components';\n\n// Register format validators with TypeBox\nFormatRegistry.Set('uri', (value: string) => {\n // Accept URLs, relative paths, and file paths\n try {\n new URL(value);\n return true;\n } catch {\n // Check if it's a relative path (common for JSON schemas)\n if (\n value.includes('.json') ||\n value.includes('/') ||\n value.includes('\\\\')\n ) {\n return true;\n }\n // Check if it's an HTTP/HTTPS URL\n return /^https?:\\/\\/.+/.test(value);\n }\n});\n\nFormatRegistry.Set('date-time', (value: string) => {\n // ISO 8601 date-time format validation\n const dateTimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?$/;\n return dateTimeRegex.test(value) && !isNaN(Date.parse(value));\n});\n\n/**\n * JSON parser\n * @module validation/parsers/json\n * @description\n * Advanced JSON parsing with line number tracking and detailed error reporting.\n * Provides enhanced error messages for JSON syntax and validation errors.\n */\n\n/**\n * JSON Document Parser - Handles parsing and validation of JSON report definitions\n */\nexport class JsonDocumentParser {\n private schema = ComponentDefinitionSchema;\n\n constructor() {\n // Schema is assigned above\n }\n\n /**\n * Parse JSON input (string or object) and validate against schema\n * Only supports unified ComponentDefinition structure where document IS a report component\n */\n public parse(jsonInput: string | object): ComponentDefinition {\n let parsedObject: unknown;\n\n // Step 1: Parse JSON if it's a string\n if (typeof jsonInput === 'string') {\n try {\n parsedObject = JSON.parse(jsonInput);\n } catch (error) {\n throw new JsonParsingError(\n 'Invalid JSON syntax',\n this.extractJSONSyntaxError(error as Error, jsonInput)\n );\n }\n } else {\n parsedObject = jsonInput;\n }\n\n // Step 2: Validate it's a report component\n if (\n typeof parsedObject !== 'object' ||\n parsedObject === null ||\n !('name' in parsedObject) ||\n (parsedObject as any).name !== 'docx'\n ) {\n throw new JsonValidationError(\n 'Invalid document structure: Document must be a docx component with name=\"docx\"',\n [\n {\n path: 'name',\n message: 'Document must be a docx component with name=\"docx\"',\n code: 'INVALID_STRUCTURE',\n },\n ]\n );\n }\n\n // Step 3: Validate against schema\n if (!Value.Check(this.schema, parsedObject)) {\n const errors = [...Value.Errors(this.schema, parsedObject)];\n\n throw new JsonValidationError(\n 'JSON validation failed',\n this.formatTypeBoxErrors(\n errors,\n typeof jsonInput === 'string'\n ? jsonInput\n : JSON.stringify(jsonInput, null, 2)\n )\n );\n }\n\n return parsedObject as ComponentDefinition;\n }\n\n /**\n * Validate JSON without throwing errors - returns ValidationResult\n */\n public validate(jsonInput: string | object): DocumentValidationResult {\n try {\n this.parse(jsonInput);\n return {\n valid: true,\n errors: [],\n warnings: [],\n };\n } catch (error) {\n if (\n error instanceof JsonParsingError ||\n error instanceof JsonValidationError\n ) {\n return {\n valid: false,\n errors: error.validationErrors,\n warnings: [],\n };\n }\n\n // Unexpected error\n return {\n valid: false,\n errors: [\n {\n path: '',\n message:\n error instanceof Error\n ? error.message\n : 'Unknown validation error',\n code: 'UNEXPECTED_ERROR',\n },\n ],\n warnings: [],\n };\n }\n }\n\n /**\n * Parse JSON file content with line number tracking\n */\n public parseWithLineNumbers(jsonString: string): ComponentDefinition {\n const lines = jsonString.split('\\n');\n\n try {\n return this.parse(jsonString);\n } catch (error) {\n if (\n error instanceof JsonParsingError ||\n error instanceof JsonValidationError\n ) {\n // Enhance errors with line numbers\n const enhancedErrors = error.validationErrors.map((err) => ({\n ...err,\n ...this.findLineNumber(err.path, jsonString, lines),\n }));\n\n if (error instanceof JsonParsingError) {\n throw new JsonParsingError(error.message, enhancedErrors);\n } else {\n throw new JsonValidationError(error.message, enhancedErrors);\n }\n }\n throw error;\n }\n }\n\n /**\n * Extract JSON syntax error information\n */\n private extractJSONSyntaxError(\n error: Error,\n jsonString: string\n ): ValidationError[] {\n const message = error.message;\n\n // Try to extract position from error message\n const positionMatch =\n message.match(/position\\s+(\\d+)/i) ||\n message.match(/at\\s+(\\d+)/i) ||\n message.match(/character\\s+(\\d+)/i);\n\n let line = 0;\n let column = 0;\n\n if (positionMatch) {\n const position = parseInt(positionMatch[1], 10);\n const lines = jsonString.substring(0, position).split('\\n');\n line = lines.length;\n column = lines[lines.length - 1].length + 1;\n }\n\n return [\n {\n path: '',\n message: `JSON syntax error: ${message}`,\n code: 'JSON_SYNTAX_ERROR',\n line: line || undefined,\n column: column || undefined,\n suggestions: [\n 'Check for missing commas, brackets, or quotes',\n 'Validate JSON syntax using a JSON validator',\n 'Ensure all strings are properly quoted',\n ],\n },\n ];\n }\n\n /**\n * Format TypeBox validation errors into ValidationError format\n */\n private formatTypeBoxErrors(\n errors: ValueError[],\n originalJson: string\n ): ValidationError[] {\n return errors.map((error) => {\n const path = error.path || '';\n const lineInfo = this.findLineNumber(path, originalJson);\n\n return {\n path,\n message: this.formatTypeBoxErrorMessage(error),\n code: this.getErrorCode(error),\n line: lineInfo.line,\n column: lineInfo.column,\n suggestions: this.generateSuggestions(error),\n };\n });\n }\n\n /**\n * Format individual TypeBox error message\n */\n private formatTypeBoxErrorMessage(error: ValueError): string {\n const path = error.path ? `at \"${error.path}\"` : '';\n const message = error.message;\n\n // TypeBox provides descriptive messages, so we can use them directly\n // but enhance common patterns\n if (message.includes('Expected')) {\n return `${message} ${path}`;\n } else if (message.includes('Required property')) {\n return `${message} ${path}`;\n } else if (message.includes('Unexpected property')) {\n return `${message} ${path}`;\n } else if (message.includes('minimum')) {\n return `Value is too small ${path}. ${message}`;\n } else if (message.includes('maximum')) {\n return `Value is too big ${path}. ${message}`;\n } else {\n return `${message} ${path}`;\n }\n }\n\n /**\n * Get error code from TypeBox error\n */\n private getErrorCode(error: ValueError): string {\n const baseCode = String(error.type || 'VALIDATION_ERROR').toUpperCase();\n const path = error.path ? error.path.replace(/\\//g, '_').toUpperCase() : '';\n return path ? `${baseCode}_${path}` : baseCode;\n }\n\n /**\n * Generate helpful suggestions based on error type\n */\n private generateSuggestions(error: ValueError): string[] {\n const suggestions: string[] = [];\n const message = error.message;\n\n // Parse TypeBox error messages to provide suggestions\n if (message.includes('Expected string')) {\n suggestions.push('Ensure the value is wrapped in quotes');\n } else if (message.includes('Expected number')) {\n suggestions.push('Remove quotes around numeric values');\n } else if (message.includes('Expected array')) {\n suggestions.push('Use square brackets [] for arrays');\n } else if (message.includes('Expected object')) {\n suggestions.push('Use curly braces {} for objects');\n } else if (message.includes('Expected literal')) {\n const match = message.match(/Expected literal (.+)/);\n if (match) {\n suggestions.push(`Use the exact value: ${match[1]}`);\n }\n } else if (message.includes('Unexpected property')) {\n suggestions.push('Remove unknown properties or check spelling');\n suggestions.push(\n 'Refer to the JSON schema documentation for valid properties'\n );\n } else if (message.includes('Expected union')) {\n suggestions.push(\n 'Check that the value matches one of the allowed formats'\n );\n suggestions.push('Verify the module type is spelled correctly');\n } else if (message.includes('minimum')) {\n const match = message.match(/minimum.*?(\\d+)/);\n if (match) {\n if (message.includes('Array')) {\n suggestions.push(`Array must have at least ${match[1]} items`);\n } else {\n suggestions.push(`Value must be at least ${match[1]}`);\n }\n }\n } else if (message.includes('format') && message.includes('uri')) {\n suggestions.push(\n 'Ensure the URL is valid and starts with http:// or https://'\n );\n }\n\n // Generic suggestions\n if (suggestions.length === 0) {\n suggestions.push('Check the JSON schema documentation for valid values');\n suggestions.push('Verify the property name and value format');\n }\n\n return suggestions;\n }\n\n /**\n * Find line and column number for a given JSON path\n */\n private findLineNumber(\n path: string,\n jsonString: string,\n lines?: string[]\n ): { line?: number; column?: number } {\n if (!path) {\n return {};\n }\n\n const jsonLines = lines || jsonString.split('\\n');\n const pathParts = path.split('.');\n\n // Simple heuristic: find the line containing the property name\n for (let i = 0; i < jsonLines.length; i++) {\n const line = jsonLines[i];\n const lastPathPart = pathParts[pathParts.length - 1];\n\n // Look for property name in quotes\n if (line.includes(`\"${lastPathPart}\"`)) {\n const column = line.indexOf(`\"${lastPathPart}\"`) + 1;\n return {\n line: i + 1,\n column,\n };\n }\n }\n\n return {};\n }\n}\n\n/**\n * Custom error classes for better error handling\n */\nexport class JsonParsingError extends Error {\n public readonly validationErrors: ValidationError[];\n\n constructor(message: string, errors: ValidationError[]) {\n super(message);\n this.name = 'JsonParsingError';\n this.validationErrors = errors;\n }\n}\n\nexport class JsonValidationError extends Error {\n public readonly validationErrors: ValidationError[];\n\n constructor(message: string, errors: ValidationError[]) {\n super(message);\n this.name = 'JsonValidationError';\n this.validationErrors = errors;\n }\n}\n\n/**\n * Utility functions for external use\n */\n\n/**\n * Parse and validate JSON component definition\n * Only supports report components (documents)\n */\nexport function parseJsonComponent(\n jsonInput: string | object\n): ComponentDefinition {\n const parser = new JsonDocumentParser();\n return parser.parse(jsonInput);\n}\n\n/**\n * Validate JSON component definition without throwing\n * Now uses unified validation\n */\nexport { validateJsonDocument as validateJsonComponent } from '../unified/document-validator';\n\n/**\n * Parse JSON with enhanced line number error reporting\n * Only supports unified ComponentDefinition structure where document IS a report component\n */\nexport function parseJsonWithLineNumbers(\n jsonString: string\n): ComponentDefinition {\n const parser = new JsonDocumentParser();\n return parser.parseWithLineNumbers(jsonString);\n}\n","/**\n * Theme validators\n * @module validation/validators/theme\n * @description\n * Now uses unified validation system\n */\n\n// Re-export everything from unified theme validator\nexport {\n validateThemeJson,\n isValidTheme as isValidThemeJson,\n getThemeName,\n isThemeConfig,\n type ThemeValidationResult,\n} from '../unified/theme-validator';\n\n// Re-export utility for getting validation summary\nexport { getValidationSummary } from '../unified/base-validator';\n\n// For backward compatibility, provide formatValidationErrors\nexport function formatValidationErrors(errors: any[]): string[] {\n if (!Array.isArray(errors)) return [];\n\n return errors.map((error) => {\n if (typeof error === 'string') return error;\n\n const path = error.path ? `${error.path}: ` : '';\n const message = error.message || 'Validation error';\n return `${path}${message}`;\n });\n}\n","/**\n * Component validators\n * @module validation/validators/component\n * @description\n * Now uses unified validation system\n */\n\nimport {\n validateComponent as unifiedValidateComponent,\n validateComponentDefinition as unifiedValidateComponentDefinition,\n isStandardComponentName,\n} from '../unified/component-validator';\n\n// Re-export everything from unified component validator\nexport {\n validateComponent as validateComponentProps,\n validateComponentDefinition,\n validateComponents,\n validateCustomComponentProps,\n isStandardComponentName,\n // Type guards\n isReportProps,\n isSectionProps,\n isHeadingProps,\n isParagraphProps,\n isColumnsProps,\n isImageProps,\n isStatisticProps,\n isTableProps,\n isListProps,\n isCustomComponentProps,\n type StandardComponentName,\n} from '../unified/component-validator';\n\n// For backward compatibility, provide safeValidateComponentProps\nexport function safeValidateComponentProps<T>(\n name: string,\n props: unknown\n): { success: true; data: T } | { success: false; error: any[] } {\n // For non-standard types, use 'custom'\n const componentName = isStandardComponentName(name) ? name : 'custom';\n const result = unifiedValidateComponent(componentName, props);\n\n if (result.valid) {\n return { success: true, data: result.data as T };\n }\n\n return { success: false, error: result.errors || [] };\n}\n\n// For backward compatibility, provide safeValidateComponentDefinition\nexport function safeValidateComponentDefinition(\n component: unknown\n): { success: true; data: any } | { success: false; error: any[] } {\n const result = unifiedValidateComponentDefinition(component);\n\n if (result.valid) {\n return { success: true, data: result.data };\n }\n\n return { success: false, error: result.errors || [] };\n}\n\n// For backward compatibility, provide error formatting\nexport function getValidationErrors(props: unknown, name?: string): string[] {\n // For non-standard types, use 'custom'\n const componentName = name && isStandardComponentName(name) ? name : 'custom';\n const result = unifiedValidateComponent(componentName, props);\n\n if (result.valid) return [];\n\n return (result.errors || []).map((e: any) =>\n e.path ? `${e.path}: ${e.message}` : e.message\n );\n}\n","import { Value } from '@sinclair/typebox/value';\nimport { Static } from '@sinclair/typebox';\nimport {\n ComponentDefinitionSchema,\n ReportPropsSchema,\n SectionPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ColumnsPropsSchema,\n ImagePropsSchema,\n StatisticPropsSchema,\n TablePropsSchema,\n ListPropsSchema,\n} from '../../schemas/components';\nimport { CustomComponentDefinitionSchema } from '../../schemas/custom-components';\nimport {\n formatTypeBoxError,\n formatTypeBoxErrorStrings,\n formatErrorReport,\n hasCriticalErrors,\n} from './errors';\nimport type {\n CoreValidationResult,\n ValidationOptions,\n BatchValidationResult,\n ComponentValidationConfig,\n DataTransformer,\n} from './types';\n\n/**\n * Core validation engine\n * @module validation/core/validator\n * @description\n * Main validation utilities using TypeBox for runtime validation.\n * Provides comprehensive validation with error handling and data transformation.\n */\n\n/**\n * Component name to schema mapping\n */\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} as const;\n\nexport type StandardComponentName = keyof typeof COMPONENT_SCHEMA_MAP;\n\n/**\n * Validate any component configuration with comprehensive error handling\n */\nexport function validateComponent<T extends StandardComponentName>(\n name: T,\n props: unknown,\n options?: ValidationOptions\n): CoreValidationResult<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>> {\n const schema = COMPONENT_SCHEMA_MAP[name];\n\n if (!schema) {\n // Handle custom components\n if (Value.Check(CustomComponentDefinitionSchema, props)) {\n return {\n success: true,\n data: props as Static<(typeof COMPONENT_SCHEMA_MAP)[T]>,\n };\n }\n\n const errors = [...Value.Errors(CustomComponentDefinitionSchema, props)];\n const formattedErrors = formatTypeBoxError(errors);\n return {\n success: false,\n errors: formattedErrors,\n errorStrings: formatTypeBoxErrorStrings(errors),\n report: options?.includeReport ? formatErrorReport(errors) : undefined,\n hasCriticalErrors: options?.checkCritical\n ? hasCriticalErrors(errors)\n : undefined,\n };\n }\n\n // Validate with the schema\n if (Value.Check(schema, props)) {\n return {\n success: true,\n data: props as Static<(typeof COMPONENT_SCHEMA_MAP)[T]>,\n };\n }\n\n const errors = [...Value.Errors(schema, props)];\n const formattedErrors = formatTypeBoxError(errors);\n return {\n success: false,\n errors: formattedErrors,\n errorStrings: formatTypeBoxErrorStrings(errors),\n report: options?.includeReport ? formatErrorReport(errors) : undefined,\n hasCriticalErrors: options?.checkCritical\n ? hasCriticalErrors(errors)\n : undefined,\n };\n}\n\n/**\n * Validate a complete component definition (with nested children)\n */\nexport function validateComponentDefinition(\n component: unknown,\n options?: ValidationOptions\n): CoreValidationResult<Static<typeof ComponentDefinitionSchema>> {\n // Check for circular references or excessive nesting\n const maxDepth = options?.maxDepth ?? 10;\n const currentDepth = options?.currentDepth ?? 0;\n\n if (currentDepth > maxDepth) {\n return {\n success: false,\n errors: [\n {\n path: 'children',\n message: `Maximum nesting depth (${maxDepth}) exceeded`,\n code: 'custom',\n suggestion: 'Reduce the nesting level of components',\n },\n ],\n errorStrings: [`Maximum nesting depth (${maxDepth}) exceeded`],\n hasCriticalErrors: true,\n };\n }\n\n if (Value.Check(ComponentDefinitionSchema, component)) {\n // Validate nested children recursively\n const data = component as any;\n const warnings: string[] = [];\n\n if (data.children && Array.isArray(data.children)) {\n for (let i = 0; i < data.children.length; i++) {\n const nestedResult = validateComponentDefinition(data.children[i], {\n ...options,\n currentDepth: currentDepth + 1,\n });\n\n if (!nestedResult.success) {\n // Add context to nested errors\n const nestedErrors = nestedResult.errors?.map((err) => ({\n ...err,\n path: `children[${i}].${err.path}`,\n }));\n\n return {\n success: false,\n errors: nestedErrors,\n errorStrings: nestedErrors?.map(\n (err) => `${err.path}: ${err.message}`\n ),\n report: options?.includeReport\n ? `Validation failed in nested component at index ${i}:\\n${nestedResult.report}`\n : undefined,\n hasCriticalErrors: nestedResult.hasCriticalErrors,\n };\n }\n\n if (nestedResult.warnings) {\n warnings.push(\n ...nestedResult.warnings.map((w) => `children[${i}]: ${w}`)\n );\n }\n }\n }\n\n return {\n success: true,\n data: component as Static<typeof ComponentDefinitionSchema>,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n const errors = [...Value.Errors(ComponentDefinitionSchema, component)];\n const formattedErrors = formatTypeBoxError(errors);\n return {\n success: false,\n errors: formattedErrors,\n errorStrings: formatTypeBoxErrorStrings(errors),\n report: options?.includeReport ? formatErrorReport(errors) : undefined,\n hasCriticalErrors: options?.checkCritical\n ? hasCriticalErrors(errors)\n : undefined,\n };\n}\n\n/**\n * Batch validate multiple components\n */\nexport function validateComponents(\n components: ComponentValidationConfig[],\n options?: ValidationOptions\n): BatchValidationResult {\n const results: CoreValidationResult<any>[] = [];\n let criticalCount = 0;\n\n for (const { name, props } of components) {\n const result =\n name in COMPONENT_SCHEMA_MAP\n ? validateComponent(name as StandardComponentName, props, options)\n : validateComponentDefinition(props, options);\n\n results.push(result);\n\n if (result.hasCriticalErrors) {\n criticalCount++;\n }\n\n if (!result.success && options?.stopOnFirst) {\n break;\n }\n }\n\n const valid = results.filter((r) => r.success).length;\n const invalid = results.length - valid;\n\n return {\n success: invalid === 0,\n results,\n summary: {\n total: results.length,\n valid,\n invalid,\n criticalErrors: criticalCount,\n },\n };\n}\n\n/**\n * Transform and validate data (for migration scenarios)\n */\nexport function transformAndValidate<T extends StandardComponentName>(\n name: T,\n data: unknown,\n transformer?: DataTransformer\n): CoreValidationResult<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>> {\n try {\n // Apply custom transformation if provided\n const transformed = transformer ? transformer(data) : data;\n\n // Validate the transformed data\n return validateComponent(name, transformed, {\n includeReport: true,\n checkCritical: true,\n });\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: 'root',\n message: `Transformation failed: ${error instanceof Error ? error.message : String(error)}`,\n code: 'custom',\n },\n ],\n errorStrings: [\n `Transformation failed: ${error instanceof Error ? error.message : String(error)}`,\n ],\n hasCriticalErrors: true,\n };\n }\n}\n\n/**\n * Create a validated component with defaults\n */\nexport function createValidatedComponent<T extends StandardComponentName>(\n name: T,\n partialConfig: Partial<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>>\n): CoreValidationResult<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>> {\n const schema = COMPONENT_SCHEMA_MAP[name];\n\n if (!schema) {\n return {\n success: false,\n errors: [\n {\n path: 'name',\n message: `Unknown component name: ${name}`,\n code: 'custom',\n suggestion: `Use one of: ${Object.keys(COMPONENT_SCHEMA_MAP).join(', ')}`,\n },\n ],\n errorStrings: [`Unknown component name: ${name}`],\n hasCriticalErrors: true,\n };\n }\n\n // Validate with TypeBox\n if (Value.Check(schema, partialConfig)) {\n return {\n success: true,\n data: partialConfig as Static<(typeof COMPONENT_SCHEMA_MAP)[T]>,\n };\n }\n\n const errors = [...Value.Errors(schema, partialConfig)];\n const formattedErrors = formatTypeBoxError(errors);\n return {\n success: false,\n errors: formattedErrors,\n errorStrings: formatTypeBoxErrorStrings(errors),\n report: formatErrorReport(errors),\n hasCriticalErrors: hasCriticalErrors(errors),\n };\n}\n\n/**\n * Type guard functions with proper error context\n */\nexport function isValidComponent<T extends StandardComponentName>(\n name: T,\n props: unknown\n): props is Static<(typeof COMPONENT_SCHEMA_MAP)[T]> {\n const result = validateComponent(name, props);\n return result.success;\n}\n\n/**\n * Validate JSON string input\n */\nexport function validateJsonComponent<T extends StandardComponentName>(\n name: T,\n jsonString: string\n): CoreValidationResult<Static<(typeof COMPONENT_SCHEMA_MAP)[T]>> {\n try {\n const parsed = JSON.parse(jsonString);\n return validateComponent(name, parsed, {\n includeReport: true,\n checkCritical: true,\n });\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: 'root',\n message: `Invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n code: 'custom',\n suggestion: 'Check for syntax errors in your JSON',\n },\n ],\n errorStrings: [\n `Invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n ],\n hasCriticalErrors: true,\n };\n }\n}\n","import { ValueError } from '@sinclair/typebox/value';\nimport type { FormattedError } from './types';\n\n/**\n * Error formatting utilities\n * @module validation/core/errors\n * @description\n * Enhanced error formatting for TypeBox validation errors.\n * Provides detailed, user-friendly error messages with context and suggestions.\n */\n\n/**\n * Format a single TypeBox error into a user-friendly error message\n */\nfunction formatSingleIssue(issue: ValueError): FormattedError {\n const path = issue.path || 'root';\n let message = issue.message;\n let suggestion: string | undefined;\n let expected: string | undefined;\n let received: string | undefined;\n let options: string[] | undefined;\n\n // Enhance error messages based on error type\n if (message.includes('Expected')) {\n const match = message.match(/Expected (.+) but received (.+)/);\n if (match) {\n expected = match[1];\n received = match[2];\n suggestion = getSuggestionForType(expected, received);\n }\n }\n\n // Handle required property errors\n if (message.includes('Required property')) {\n const match = message.match(/Required property '(.+)'/);\n if (match) {\n message = `Missing required field: ${match[1]}`;\n suggestion = `Add the required field: ${match[1]}`;\n }\n }\n\n // Handle unexpected property errors\n if (message.includes('Unexpected property')) {\n const match = message.match(/Unexpected property '(.+)'/);\n if (match) {\n message = `Unknown property: ${match[1]}`;\n suggestion = `Remove the unknown property: ${match[1]}`;\n }\n }\n\n // Handle union type errors\n if (message.includes('Expected union')) {\n message = 'Value does not match any of the expected types';\n suggestion = 'Check the documentation for valid format options';\n }\n\n // Handle literal value errors\n if (message.includes('Expected literal')) {\n const match = message.match(/Expected literal (.+)/);\n if (match) {\n expected = match[1];\n message = `Expected value: ${expected}`;\n suggestion = `Use the exact value: ${expected}`;\n }\n }\n\n // Handle string length errors\n if (message.includes('String length')) {\n const minMatch = message.match(/minimum length of (\\d+)/);\n const maxMatch = message.match(/maximum length of (\\d+)/);\n if (minMatch) {\n message = `String must be at least ${minMatch[1]} characters long`;\n suggestion = `Add more characters to meet the minimum length of ${minMatch[1]}`;\n } else if (maxMatch) {\n message = `String must be at most ${maxMatch[1]} characters long`;\n suggestion = `Reduce to ${maxMatch[1]} characters or less`;\n }\n }\n\n // Handle number range errors\n if (message.includes('Expected number')) {\n const minMatch = message.match(/minimum value of ([\\d.]+)/);\n const maxMatch = message.match(/maximum value of ([\\d.]+)/);\n if (minMatch) {\n message = `Number must be greater than or equal to ${minMatch[1]}`;\n suggestion = `Use a value of ${minMatch[1]} or higher`;\n } else if (maxMatch) {\n message = `Number must be less than or equal to ${maxMatch[1]}`;\n suggestion = `Use a value of ${maxMatch[1]} or lower`;\n }\n }\n\n // Handle array length errors\n if (message.includes('Array length')) {\n const minMatch = message.match(/minimum length of (\\d+)/);\n const maxMatch = message.match(/maximum length of (\\d+)/);\n if (minMatch) {\n message = `Array must have at least ${minMatch[1]} items`;\n suggestion = `Add more items to meet the minimum of ${minMatch[1]}`;\n } else if (maxMatch) {\n message = `Array must have at most ${maxMatch[1]} items`;\n suggestion = `Remove items to meet the maximum of ${maxMatch[1]}`;\n }\n }\n\n // Handle format errors\n if (message.includes('format')) {\n if (message.includes('email')) {\n message = 'Invalid email address format';\n suggestion = 'Use a valid email format like user@example.com';\n } else if (message.includes('uri') || message.includes('url')) {\n message = 'Invalid URL format';\n suggestion = 'Use a valid URL format like https://example.com';\n } else if (message.includes('date-time')) {\n message = 'Invalid date-time format';\n suggestion = 'Use ISO 8601 format like 2024-01-01T00:00:00Z';\n }\n }\n\n // Handle pattern errors\n if (message.includes('pattern')) {\n message = 'String does not match the required pattern';\n suggestion = 'Check the format requirements for this field';\n }\n\n return {\n path,\n message,\n code: String(issue.type || 'validation_error'),\n suggestion,\n expected,\n received,\n options,\n };\n}\n\n/**\n * Get type-specific suggestions for common type mismatches\n */\nfunction getSuggestionForType(\n expected: string,\n received: string\n): string | undefined {\n // Number/String confusion\n if (expected === 'number' && received === 'string') {\n return 'Remove quotes or convert the string to a number';\n }\n if (expected === 'string' && received === 'number') {\n return 'Add quotes or convert the number to a string';\n }\n\n // Boolean confusion\n if (expected === 'boolean') {\n return 'Use true or false (without quotes)';\n }\n\n // Array/Object confusion\n if (expected === 'array' && received === 'object') {\n return 'Use square brackets [] for arrays instead of curly braces {}';\n }\n if (expected === 'object' && received === 'array') {\n return 'Use curly braces {} for objects instead of square brackets []';\n }\n\n // Null/undefined handling\n if (received === 'null' || received === 'undefined') {\n return `Provide a valid ${expected} value or mark the field as optional`;\n }\n\n return undefined;\n}\n\n/**\n * Format TypeBox validation errors into detailed, user-friendly messages\n */\nexport function formatTypeBoxError(errors: ValueError[]): FormattedError[] {\n return errors.map(formatSingleIssue);\n}\n\n/**\n * Format errors as simple string array (backward compatible)\n */\nexport function formatTypeBoxErrorStrings(errors: ValueError[]): string[] {\n return formatTypeBoxError(errors).map((err) => {\n let msg = `${err.path}: ${err.message}`;\n if (err.suggestion) {\n msg += ` (Suggestion: ${err.suggestion})`;\n }\n return msg;\n });\n}\n\n/**\n * Get a summary of validation errors grouped by path\n */\nexport function getErrorSummary(\n errors: ValueError[]\n): Map<string, FormattedError[]> {\n const summary = new Map<string, FormattedError[]>();\n\n for (const formattedError of formatTypeBoxError(errors)) {\n const existing = summary.get(formattedError.path) || [];\n existing.push(formattedError);\n summary.set(formattedError.path, existing);\n }\n\n return summary;\n}\n\n/**\n * Format validation errors as a detailed report\n */\nexport function formatErrorReport(errors: ValueError[]): string {\n const formattedErrors = formatTypeBoxError(errors);\n const summary = getErrorSummary(errors);\n\n let report = `Validation failed with ${formattedErrors.length} error${formattedErrors.length > 1 ? 's' : ''}:\\n\\n`;\n\n for (const [path, pathErrors] of summary) {\n report += `📍 ${path}:\\n`;\n for (const err of pathErrors) {\n report += ` ❌ ${err.message}\\n`;\n if (err.suggestion) {\n report += ` 💡 ${err.suggestion}\\n`;\n }\n if (err.expected && err.received) {\n report += ` 📋 Expected: ${err.expected}, Received: ${err.received}\\n`;\n }\n if (err.options) {\n report += ` 📋 Valid options: ${err.options.join(', ')}\\n`;\n }\n }\n report += '\\n';\n }\n\n return report;\n}\n\n/**\n * Check if an error is critical (affects core functionality)\n */\nexport function hasCriticalErrors(errors: ValueError[]): boolean {\n return errors.some((issue) => {\n // Missing required fields are critical\n if (issue.message.includes('Required property')) {\n return true;\n }\n\n // Invalid component names are critical\n if (\n issue.path.includes('name') &&\n issue.message.includes('Expected literal')\n ) {\n return true;\n }\n\n // Schema structure errors are critical\n if (\n issue.message.includes('Expected union') ||\n issue.message.includes('Never')\n ) {\n return true;\n }\n\n return false;\n });\n}\n\n/**\n * Get validation context for better error messages\n */\nexport function getValidationContext(path: string): string {\n if (!path || path === 'root') return 'document root';\n\n const pathParts = path.split('.');\n\n // Identify component context\n if (pathParts.includes('children')) {\n const childIndex = pathParts.indexOf('children');\n if (pathParts.length > childIndex + 1) {\n const index = pathParts[childIndex + 1];\n return `component at index ${index}`;\n }\n }\n\n // Identify props context\n if (pathParts.includes('props')) {\n return 'props section';\n }\n\n // Identify theme context\n if (pathParts.includes('theme')) {\n return 'theme configuration';\n }\n\n return pathParts.join(' > ');\n}\n\n// ============================================================================\n// Legacy Compatibility Exports (for API backward compatibility)\n// ============================================================================\n\n// Primary exports - use formatTypeBoxError and formatTypeBoxErrorStrings directly\nexport const formatValidationError = formatTypeBoxError;\nexport const formatValidationErrorStrings = formatTypeBoxErrorStrings;\n","/**\n * Component Type Definitions for Plugin System\n *\n * This file provides properly typed discriminated union interfaces for all component types.\n * These types enable TypeScript to automatically infer component props based on\n * the 'name' field when building component arrays in render functions.\n */\n\nimport type { Static } from '@sinclair/typebox';\nimport type {\n ReportPropsSchema,\n SectionPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ColumnsPropsSchema,\n ImagePropsSchema,\n HighchartsPropsSchema,\n VisualPropsSchema,\n StatisticPropsSchema,\n TablePropsSchema,\n ListPropsSchema,\n TocPropsSchema,\n} from '../schemas/components';\n\nimport type { TextSpaceAfterPropsSchema } from '../schemas/custom-components';\nimport type { TextBoxPropsSchema } from '../schemas/components/text-box';\n\n// ============================================================================\n// Standard Component Types with Discriminated Union Support\n// ============================================================================\n\n/**\n * Report component with literal name discriminator\n */\nexport interface ReportComponent {\n name: 'docx';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ReportPropsSchema>;\n children?: ComponentDefinition[];\n}\n\n/**\n * Section component with literal name discriminator\n */\nexport interface SectionComponent {\n name: 'section';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof SectionPropsSchema>;\n children?: ComponentDefinition[];\n}\n\n/**\n * Columns component with literal name discriminator\n */\nexport interface ColumnsComponent {\n name: 'columns';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ColumnsPropsSchema>;\n children?: ComponentDefinition[];\n}\n\n/**\n * Heading component with literal name discriminator\n */\nexport interface HeadingComponent {\n name: 'heading';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof HeadingPropsSchema>;\n}\n\n/**\n * Paragraph component with literal name discriminator\n */\nexport interface ParagraphComponent {\n name: 'paragraph';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ParagraphPropsSchema>;\n}\n\n/**\n * Image component with literal name discriminator\n */\nexport interface ImageComponent {\n name: 'image';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ImagePropsSchema>;\n}\n\n/**\n * Statistic component with literal name discriminator\n */\nexport interface StatisticComponent {\n name: 'statistic';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof StatisticPropsSchema>;\n}\n\n/**\n * Table component with literal name discriminator\n */\nexport interface TableComponent {\n name: 'table';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof TablePropsSchema>;\n}\n\n/**\n * Highcharts component with literal name discriminator\n */\nexport interface HighchartsComponent {\n name: 'highcharts';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof HighchartsPropsSchema>;\n}\n\n/**\n * Visual component with literal name discriminator.\n * A pptx-rendered free-canvas graphic embedded as a rasterized image.\n */\nexport interface VisualComponent {\n name: 'visual';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof VisualPropsSchema>;\n}\n\n/**\n * Text Box component with literal name discriminator\n * Container for child components with floating positioning\n */\nexport interface TextBoxComponent {\n name: 'text-box';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof TextBoxPropsSchema>;\n children?: ComponentDefinition[];\n}\n\n/**\n * List component with literal name discriminator\n */\nexport interface ListComponent {\n name: 'list';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof ListPropsSchema>;\n}\n\n/**\n * Table of Contents component with literal name discriminator\n */\nexport interface TocComponent {\n name: 'toc';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof TocPropsSchema>;\n}\n\n// ============================================================================\n// Specific Custom Component Types\n// ============================================================================\n\n/**\n * Text Space After component with literal name discriminator\n */\nexport interface TextSpaceAfterComponent {\n name: 'text-space-after';\n id?: string;\n /** When false, this component is filtered out and not rendered. Defaults to true */\n enabled?: boolean;\n props: Static<typeof TextSpaceAfterPropsSchema>;\n}\n\n// ============================================================================\n// Discriminated Union Types\n// ============================================================================\n\n/**\n * Union of all standard component types\n */\nexport type StandardComponentDefinition =\n | ReportComponent\n | SectionComponent\n | ColumnsComponent\n | HeadingComponent\n | ParagraphComponent\n | TextBoxComponent\n | ImageComponent\n | HighchartsComponent\n | VisualComponent\n | StatisticComponent\n | TableComponent\n | ListComponent\n | TocComponent;\n\n/**\n * Array of all standard component names.\n * Useful for iterating, validation, or displaying available components to users.\n */\nexport const STANDARD_COMPONENTS = [\n 'columns',\n 'heading',\n 'highcharts',\n 'image',\n 'list',\n 'paragraph',\n 'docx',\n 'section',\n 'statistic',\n 'table',\n 'text-box',\n 'toc',\n 'visual',\n] as const satisfies readonly StandardComponentDefinition['name'][];\n\n/**\n * Set of all standard component names for O(1) lookup.\n */\nexport const STANDARD_COMPONENTS_SET: ReadonlySet<\n (typeof STANDARD_COMPONENTS)[number]\n> = new Set(STANDARD_COMPONENTS);\n\n// Compile-time completeness check: produces TS2344 listing the missing name(s)\n// if a standard component is added to the union but not to the array above.\ntype AssertNever<T extends never> = T;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype _AssertAllIncluded = AssertNever<\n Exclude<\n StandardComponentDefinition['name'],\n (typeof STANDARD_COMPONENTS)[number]\n >\n>;\n\n/**\n * Complete discriminated union of all component types.\n * TypeScript will automatically narrow the type based on the 'name' field.\n *\n * @example\n * ```typescript\n * const components: ComponentDefinition[] = [\n * {\n * name: 'heading', // TypeScript knows this is HeadingComponent\n * props: {\n * level: 2, // Autocomplete works!\n * text: 'Title'\n * }\n * },\n * {\n * name: 'paragraph', // TypeScript knows this is ParagraphComponent\n * props: {\n * content: 'Hello World',\n * bold: true // Autocomplete works!\n * }\n * }\n * ];\n * ```\n */\nexport type ComponentDefinition =\n | StandardComponentDefinition\n | TextSpaceAfterComponent;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isReportComponent(\n component: ComponentDefinition\n): component is ReportComponent {\n return component.name === 'docx';\n}\n\nexport function isSectionComponent(\n component: ComponentDefinition\n): component is SectionComponent {\n return component.name === 'section';\n}\n\nexport function isColumnsComponent(\n component: ComponentDefinition\n): component is ColumnsComponent {\n return component.name === 'columns';\n}\n\nexport function isHeadingComponent(\n component: ComponentDefinition\n): component is HeadingComponent {\n return component.name === 'heading';\n}\n\nexport function isParagraphComponent(\n component: ComponentDefinition\n): component is ParagraphComponent {\n return component.name === 'paragraph';\n}\n\nexport function isImageComponent(\n component: ComponentDefinition\n): component is ImageComponent {\n return component.name === 'image';\n}\n\nexport function isTextBoxComponent(\n component: ComponentDefinition\n): component is TextBoxComponent {\n return component.name === 'text-box';\n}\n\nexport function isStatisticComponent(\n component: ComponentDefinition\n): component is StatisticComponent {\n return component.name === 'statistic';\n}\n\nexport function isTableComponent(\n component: ComponentDefinition\n): component is TableComponent {\n return component.name === 'table';\n}\n\nexport function isListComponent(\n component: ComponentDefinition\n): component is ListComponent {\n return component.name === 'list';\n}\n\nexport function isTocComponent(\n component: ComponentDefinition\n): component is TocComponent {\n return component.name === 'toc';\n}\n\nexport function isHighchartsComponent(\n component: ComponentDefinition\n): component is HighchartsComponent {\n return component.name === 'highcharts';\n}\n\nexport function isVisualComponent(\n component: ComponentDefinition\n): component is VisualComponent {\n return component.name === 'visual';\n}\n\nexport function isTextSpaceAfterComponent(\n component: ComponentDefinition\n): component is TextSpaceAfterComponent {\n return component.name === 'text-space-after';\n}\n"],"mappings":"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","names":["k","i","j","i","j","fixSchemaReferences","convertToJsonSchema","createComponentSchema","exportSchemaToFile","transformValueError","transformValueErrors","Value","validateComponent","Value","errors","formattedErrors","validateComponentDefinition","validateComponents"]}
|
package/dist/schemas/theme.d.ts
CHANGED
|
@@ -2376,5 +2376,20 @@ type StyleDefinitions = Static<typeof StyleDefinitionsSchema>;
|
|
|
2376
2376
|
type HeadingDefinition = Static<typeof HeadingDefinitionSchema>;
|
|
2377
2377
|
|
|
2378
2378
|
declare function isValidThemeConfig(data: unknown): data is ThemeConfigJson;
|
|
2379
|
+
/**
|
|
2380
|
+
* Build a schema-complete theme to start from.
|
|
2381
|
+
*
|
|
2382
|
+
* Lives next to `ThemeConfigSchema` on purpose: the return type is the schema's
|
|
2383
|
+
* `Static` type, so a required property added to the schema breaks the build
|
|
2384
|
+
* here instead of shipping a scaffold that only fails at validation time.
|
|
2385
|
+
* Colour patterns are runtime-only, so `theme-scaffold.test.ts` validates the
|
|
2386
|
+
* result against the schema as well.
|
|
2387
|
+
*
|
|
2388
|
+
* Browser-safe (no Node built-ins), so the playground can scaffold new themes
|
|
2389
|
+
* from the same source as the CLI.
|
|
2390
|
+
*
|
|
2391
|
+
* @param name - Theme identifier; defaults to `minimal-theme`
|
|
2392
|
+
*/
|
|
2393
|
+
declare function createMinimalTheme(name?: string): ThemeConfigJson;
|
|
2379
2394
|
|
|
2380
|
-
export { type DocumentMargins, DocumentMarginsSchema, type FontDefinition, type Fonts, FontsSchema, type HeadingDefinition, HeadingDefinitionSchema, type Page, type PageDimensions, PageDimensionsSchema, PageSchema, type StyleDefinitions, StyleDefinitionsSchema, type ThemeConfigJson, ThemeConfigSchema, isValidThemeConfig };
|
|
2395
|
+
export { type DocumentMargins, DocumentMarginsSchema, type FontDefinition, type Fonts, FontsSchema, type HeadingDefinition, HeadingDefinitionSchema, type Page, type PageDimensions, PageDimensionsSchema, PageSchema, type StyleDefinitions, StyleDefinitionsSchema, type ThemeConfigJson, ThemeConfigSchema, createMinimalTheme, isValidThemeConfig };
|
package/dist/schemas/theme.js
CHANGED
|
@@ -6,8 +6,9 @@ import {
|
|
|
6
6
|
PageSchema,
|
|
7
7
|
StyleDefinitionsSchema,
|
|
8
8
|
ThemeConfigSchema,
|
|
9
|
+
createMinimalTheme,
|
|
9
10
|
isValidThemeConfig
|
|
10
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-3JOBFRYR.js";
|
|
11
12
|
import {
|
|
12
13
|
ColumnsComponentDefaultsSchema,
|
|
13
14
|
ComponentDefaultsSchema,
|
|
@@ -37,6 +38,7 @@ export {
|
|
|
37
38
|
StyleDefinitionsSchema,
|
|
38
39
|
TableComponentDefaultsSchema,
|
|
39
40
|
ThemeConfigSchema,
|
|
41
|
+
createMinimalTheme,
|
|
40
42
|
isValidThemeConfig
|
|
41
43
|
};
|
|
42
44
|
//# sourceMappingURL=theme.js.map
|
|
@@ -48,8 +48,8 @@ import {
|
|
|
48
48
|
validateTheme,
|
|
49
49
|
validateThemeJson,
|
|
50
50
|
validateThemeWithEnhancement
|
|
51
|
-
} from "../../chunk-
|
|
52
|
-
import "../../chunk-
|
|
51
|
+
} from "../../chunk-GJBRYTGZ.js";
|
|
52
|
+
import "../../chunk-3JOBFRYR.js";
|
|
53
53
|
import {
|
|
54
54
|
comprehensiveValidateDocument,
|
|
55
55
|
createDocumentValidator,
|
package/package.json
CHANGED
|
File without changes
|