@json-to-office/shared-pptx 0.35.0 → 1.0.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-P3YA33LS.js → chunk-2MZVIHSQ.js} +33 -10
- package/dist/chunk-2MZVIHSQ.js.map +1 -0
- package/dist/chunk-2YEV3CJF.js +192 -0
- package/dist/chunk-2YEV3CJF.js.map +1 -0
- package/dist/{chunk-L7BCW5HU.js → chunk-5WT7G2OG.js} +20 -3
- package/dist/chunk-5WT7G2OG.js.map +1 -0
- package/dist/{chunk-AKSSIK5V.js → chunk-F3FQ7ADB.js} +2 -2
- package/dist/{chunk-C6UX273H.js → chunk-YSJMKGLM.js} +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/dist/schemas/component-registry.d.ts +10 -2
- package/dist/schemas/component-registry.js +2 -1
- package/dist/schemas/component-union.js +3 -2
- package/dist/schemas/components.js +3 -2
- package/dist/schemas/document.js +4 -3
- package/dist/schemas/generator.js +3 -2
- package/dist/schemas/renderer.d.ts +19 -0
- package/dist/schemas/renderer.js +15 -0
- package/dist/schemas/renderer.js.map +1 -0
- package/package.json +2 -2
- package/dist/chunk-L7BCW5HU.js.map +0 -1
- package/dist/chunk-P3YA33LS.js.map +0 -1
- /package/dist/{chunk-AKSSIK5V.js.map → chunk-F3FQ7ADB.js.map} +0 -0
- /package/dist/{chunk-C6UX273H.js.map → chunk-YSJMKGLM.js.map} +0 -0
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PPTX_RENDERER_IDS,
|
|
3
|
+
isPptxComponentSupported,
|
|
4
|
+
pptxPropsSchemaForRenderer
|
|
5
|
+
} from "./chunk-2YEV3CJF.js";
|
|
1
6
|
import {
|
|
2
7
|
ColorValueSchema,
|
|
3
8
|
GridConfigSchema,
|
|
@@ -371,7 +376,7 @@ function getPptxContentComponents() {
|
|
|
371
376
|
function isPptxStandardComponent(name) {
|
|
372
377
|
return PPTX_STANDARD_COMPONENTS_REGISTRY.some((c) => c.name === name);
|
|
373
378
|
}
|
|
374
|
-
function createPptxComponentSchemaObject(component, recursiveRef, placeholderRef) {
|
|
379
|
+
function createPptxComponentSchemaObject(component, recursiveRef, placeholderRef, profile) {
|
|
375
380
|
const schema = {
|
|
376
381
|
name: Type5.Literal(component.name),
|
|
377
382
|
id: Type5.Optional(Type5.String()),
|
|
@@ -384,13 +389,31 @@ function createPptxComponentSchemaObject(component, recursiveRef, placeholderRef
|
|
|
384
389
|
};
|
|
385
390
|
if (component.special?.hasSchemaField) {
|
|
386
391
|
schema.$schema = Type5.Optional(Type5.String({ format: "uri" }));
|
|
392
|
+
schema.renderer = profile ? profile.requireDiscriminator ? Type5.Literal(profile.renderer, {
|
|
393
|
+
description: "Renderer backend for this presentation"
|
|
394
|
+
}) : Type5.Optional(
|
|
395
|
+
Type5.Literal(profile.renderer, {
|
|
396
|
+
description: 'Renderer backend. Omitted defaults to "pptxgenjs".'
|
|
397
|
+
})
|
|
398
|
+
) : Type5.Optional(
|
|
399
|
+
Type5.Union(
|
|
400
|
+
PPTX_RENDERER_IDS.map((renderer) => Type5.Literal(renderer)),
|
|
401
|
+
{
|
|
402
|
+
description: 'Renderer backend. Omitted defaults to "pptxgenjs".'
|
|
403
|
+
}
|
|
404
|
+
)
|
|
405
|
+
);
|
|
387
406
|
}
|
|
388
|
-
schema.props =
|
|
407
|
+
schema.props = profile ? pptxPropsSchemaForRenderer(
|
|
408
|
+
component.name,
|
|
409
|
+
component.propsSchema,
|
|
410
|
+
profile.renderer
|
|
411
|
+
) : component.propsSchema;
|
|
389
412
|
if (component.hasChildren && recursiveRef) {
|
|
390
413
|
schema.children = Type5.Optional(Type5.Array(recursiveRef));
|
|
391
414
|
}
|
|
392
|
-
if (component.hasPlaceholders && (placeholderRef ?? recursiveRef)) {
|
|
393
|
-
const baseProperties =
|
|
415
|
+
if (component.hasPlaceholders && (placeholderRef ?? recursiveRef) && profile?.renderer !== "office-open") {
|
|
416
|
+
const baseProperties = schema.props.properties ?? {};
|
|
394
417
|
const phRef = placeholderRef ?? recursiveRef;
|
|
395
418
|
schema.props = Type5.Object(
|
|
396
419
|
{
|
|
@@ -417,13 +440,13 @@ function createAllPptxComponentSchemas(recursiveRef) {
|
|
|
417
440
|
(component) => createPptxComponentSchemaObject(component, recursiveRef)
|
|
418
441
|
);
|
|
419
442
|
}
|
|
420
|
-
function createAllPptxComponentSchemasNarrowed(selfRef, pluginSchemas = []) {
|
|
443
|
+
function createAllPptxComponentSchemasNarrowed(selfRef, pluginSchemas = [], profile) {
|
|
421
444
|
const leafSchemas = /* @__PURE__ */ new Map();
|
|
422
445
|
for (const comp of PPTX_STANDARD_COMPONENTS_REGISTRY) {
|
|
423
|
-
if (!comp.hasChildren) {
|
|
446
|
+
if (!comp.hasChildren && (!profile || isPptxComponentSupported(comp.name, profile.renderer))) {
|
|
424
447
|
leafSchemas.set(
|
|
425
448
|
comp.name,
|
|
426
|
-
createPptxComponentSchemaObject(comp, void 0, selfRef)
|
|
449
|
+
createPptxComponentSchemaObject(comp, void 0, selfRef, profile)
|
|
427
450
|
);
|
|
428
451
|
}
|
|
429
452
|
}
|
|
@@ -439,7 +462,7 @@ function createAllPptxComponentSchemasNarrowed(selfRef, pluginSchemas = []) {
|
|
|
439
462
|
if (!comp.allowedChildren) {
|
|
440
463
|
resolved.set(
|
|
441
464
|
comp.name,
|
|
442
|
-
createPptxComponentSchemaObject(comp, selfRef, selfRef)
|
|
465
|
+
createPptxComponentSchemaObject(comp, selfRef, selfRef, profile)
|
|
443
466
|
);
|
|
444
467
|
pending.splice(i, 1);
|
|
445
468
|
continue;
|
|
@@ -453,7 +476,7 @@ function createAllPptxComponentSchemasNarrowed(selfRef, pluginSchemas = []) {
|
|
|
453
476
|
const childrenType = allChildSchemas.length === 1 ? allChildSchemas[0] : Type5.Union(allChildSchemas);
|
|
454
477
|
resolved.set(
|
|
455
478
|
comp.name,
|
|
456
|
-
createPptxComponentSchemaObject(comp, childrenType, selfRef)
|
|
479
|
+
createPptxComponentSchemaObject(comp, childrenType, selfRef, profile)
|
|
457
480
|
);
|
|
458
481
|
pending.splice(i, 1);
|
|
459
482
|
}
|
|
@@ -487,4 +510,4 @@ export {
|
|
|
487
510
|
createAllPptxComponentSchemas,
|
|
488
511
|
createAllPptxComponentSchemasNarrowed
|
|
489
512
|
};
|
|
490
|
-
//# sourceMappingURL=chunk-
|
|
513
|
+
//# sourceMappingURL=chunk-2MZVIHSQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/component-registry.ts","../src/schemas/components/presentation.ts","../src/schemas/components/template.ts","../src/schemas/components/common.ts","../src/schemas/components/slide.ts"],"sourcesContent":["/**\n * PPTX Component Registry - SINGLE SOURCE OF TRUTH\n *\n * This is the ONLY place where standard PPTX components are defined.\n * All schema generators MUST use this registry.\n */\n\nimport { Type, TSchema } from '@sinclair/typebox';\nimport { PPTX_SLIDE_CONTENT_COMPONENTS } from '@json-to-office/shared/schemas/slide-content';\nimport {\n PPTX_RENDERER_IDS,\n isPptxComponentSupported,\n pptxPropsSchemaForRenderer,\n type PptxRendererId,\n} from './renderer';\n\n/**\n * Component definition with metadata\n */\nexport interface PptxStandardComponentDefinition {\n name: string;\n propsSchema: TSchema;\n hasChildren: boolean;\n /**\n * Names of standard components allowed as direct children.\n * Only meaningful when hasChildren is true.\n * Plugin components are always allowed in addition to these.\n * Omit to allow the full recursive union (backward-compat).\n */\n allowedChildren?: readonly string[];\n hasPlaceholders?: boolean;\n category: 'container' | 'content' | 'layout';\n description: string;\n special?: {\n hasSchemaField?: boolean;\n };\n}\nimport { PresentationPropsSchema } from './components/presentation';\nimport { SlidePropsSchema } from './components/slide';\n\n/**\n * SINGLE SOURCE OF TRUTH for all standard PPTX components\n */\nexport const PPTX_STANDARD_COMPONENTS_REGISTRY: readonly PptxStandardComponentDefinition[] =\n [\n // ========================================================================\n // Container Components (can contain children)\n // ========================================================================\n {\n name: 'pptx',\n propsSchema: PresentationPropsSchema,\n hasChildren: true,\n allowedChildren: ['slide'],\n category: 'container',\n description:\n 'Main presentation container - defines the overall presentation structure. Required as the root component.',\n special: {\n hasSchemaField: true,\n },\n },\n {\n name: 'slide',\n propsSchema: SlidePropsSchema,\n hasChildren: true,\n allowedChildren: PPTX_SLIDE_CONTENT_COMPONENTS.map(({ name }) => name),\n hasPlaceholders: true,\n category: 'container',\n description:\n 'Slide container - groups content elements on a single slide.',\n },\n\n // Content components are canonical in @json-to-office/shared so DOCX\n // visuals can reuse the exact schemas without depending on shared-pptx.\n ...PPTX_SLIDE_CONTENT_COMPONENTS,\n ] as const;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nexport function getPptxStandardComponent(\n name: string\n): PptxStandardComponentDefinition | undefined {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.find((c) => c.name === name);\n}\n\nexport function getAllPptxComponentNames(): readonly string[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.map((c) => c.name);\n}\n\nexport function getPptxComponentsByCategory(\n category: PptxStandardComponentDefinition['category']\n): readonly PptxStandardComponentDefinition[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.filter(\n (c) => c.category === category\n );\n}\n\nexport function getPptxContainerComponents(): readonly PptxStandardComponentDefinition[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.filter((c) => c.hasChildren);\n}\n\nexport function getPptxContentComponents(): readonly PptxStandardComponentDefinition[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.filter((c) => !c.hasChildren);\n}\n\nexport function isPptxStandardComponent(name: string): boolean {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.some((c) => c.name === name);\n}\n\n// ============================================================================\n// Schema Generation Helpers\n// ============================================================================\n\nexport function createPptxComponentSchemaObject(\n component: PptxStandardComponentDefinition,\n recursiveRef?: TSchema,\n placeholderRef?: TSchema,\n profile?: { renderer: PptxRendererId; requireDiscriminator: boolean }\n): TSchema {\n const schema: Record<string, TSchema> = {\n name: Type.Literal(component.name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'When false, this component is filtered out and not rendered. Defaults to true.',\n })\n ),\n };\n\n if (component.special?.hasSchemaField) {\n schema.$schema = Type.Optional(Type.String({ format: 'uri' }));\n schema.renderer = profile\n ? profile.requireDiscriminator\n ? Type.Literal(profile.renderer, {\n description: 'Renderer backend for this presentation',\n })\n : Type.Optional(\n Type.Literal(profile.renderer, {\n description: 'Renderer backend. Omitted defaults to \"pptxgenjs\".',\n })\n )\n : Type.Optional(\n Type.Union(\n PPTX_RENDERER_IDS.map((renderer) => Type.Literal(renderer)),\n {\n description: 'Renderer backend. Omitted defaults to \"pptxgenjs\".',\n }\n )\n );\n }\n\n schema.props = profile\n ? pptxPropsSchemaForRenderer(\n component.name,\n component.propsSchema,\n profile.renderer\n )\n : component.propsSchema;\n\n if (component.hasChildren && recursiveRef) {\n schema.children = Type.Optional(Type.Array(recursiveRef));\n }\n\n if (\n component.hasPlaceholders &&\n (placeholderRef ?? recursiveRef) &&\n profile?.renderer !== 'office-open'\n ) {\n const baseProperties = (schema.props as any).properties ?? {};\n const phRef = placeholderRef ?? recursiveRef!;\n schema.props = Type.Object(\n {\n ...baseProperties,\n placeholders: Type.Optional(\n Type.Record(Type.String(), phRef, {\n description:\n 'Content for named placeholders: { \"title\": { \"name\": \"text\", ... } }',\n })\n ),\n },\n {\n additionalProperties: false,\n description: (component.propsSchema as any).description,\n }\n );\n }\n\n return Type.Object(schema, {\n additionalProperties: false,\n description: component.description,\n });\n}\n\nexport function createAllPptxComponentSchemas(\n recursiveRef?: TSchema\n): readonly TSchema[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.map((component) =>\n createPptxComponentSchemaObject(component, recursiveRef)\n );\n}\n\n/**\n * Build all standard PPTX component schemas with per-container narrowed children.\n *\n * Resolves containers in dependency order so each container's children union\n * only references its allowedChildren. Plugin schemas are always included in\n * every container's children.\n *\n * @param selfRef - The Type.Recursive self-reference (fallback and for plugin children)\n * @param pluginSchemas - Plugin component schemas (always allowed in all containers)\n * @returns Array of TypeBox schemas with narrowed children per container\n */\nexport function createAllPptxComponentSchemasNarrowed(\n selfRef: TSchema,\n pluginSchemas: TSchema[] = [],\n profile?: { renderer: PptxRendererId; requireDiscriminator: boolean }\n): TSchema[] {\n // Phase 1: Build leaf (non-container) component schemas — no children\n const leafSchemas = new Map<string, TSchema>();\n for (const comp of PPTX_STANDARD_COMPONENTS_REGISTRY) {\n if (\n !comp.hasChildren &&\n (!profile || isPptxComponentSupported(comp.name, profile.renderer))\n ) {\n leafSchemas.set(\n comp.name,\n createPptxComponentSchemaObject(comp, undefined, selfRef, profile)\n );\n }\n }\n\n // Phase 2: Resolve containers in dependency order\n const containers = PPTX_STANDARD_COMPONENTS_REGISTRY.filter(\n (c) => c.hasChildren\n );\n const resolved = new Map<string, TSchema>();\n const pending = [...containers];\n\n while (pending.length > 0) {\n const before = pending.length;\n for (let i = pending.length - 1; i >= 0; i--) {\n const comp = pending[i];\n\n if (!comp.allowedChildren) {\n // No allowedChildren declared — fallback to full recursive ref\n resolved.set(\n comp.name,\n createPptxComponentSchemaObject(comp, selfRef, selfRef, profile)\n );\n pending.splice(i, 1);\n continue;\n }\n\n // Check if all container dependencies are resolved\n const containerDeps = comp.allowedChildren.filter((name) =>\n containers.some((c) => c.name === name)\n );\n if (!containerDeps.every((d) => resolved.has(d))) continue;\n\n // Build narrowed children union\n const childSchemas = comp.allowedChildren\n .map((name) => resolved.get(name) ?? leafSchemas.get(name))\n .filter((s): s is TSchema => s !== undefined);\n\n const allChildSchemas = [...childSchemas, ...pluginSchemas];\n const childrenType =\n allChildSchemas.length === 1\n ? allChildSchemas[0]\n : Type.Union(allChildSchemas);\n\n resolved.set(\n comp.name,\n createPptxComponentSchemaObject(comp, childrenType, selfRef, profile)\n );\n pending.splice(i, 1);\n }\n\n if (pending.length === before) {\n throw new Error(\n `Circular allowedChildren among: ${pending.map((c) => c.name).join(', ')}`\n );\n }\n }\n\n // Combine: containers (resolved) + leaves\n return [...resolved.values(), ...leafSchemas.values()];\n}\n","/**\n * Presentation Component Schema\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport { FontRegistrySchema } from '@json-to-office/shared';\nimport { TemplateSlideDefinitionSchema } from './template';\nimport { GridConfigSchema, ThemeConfigSchema } from '../theme';\nimport { PptxComponentDefaultsSchema } from '../component-defaults';\n\nexport const PresentationPropsSchema = Type.Object(\n {\n title: Type.Optional(\n Type.String({ description: 'Presentation title metadata' })\n ),\n author: Type.Optional(\n Type.String({ description: 'Presentation author metadata' })\n ),\n subject: Type.Optional(\n Type.String({ description: 'Presentation subject metadata' })\n ),\n company: Type.Optional(\n Type.String({ description: 'Company name metadata' })\n ),\n theme: Type.Optional(\n Type.Union(\n [\n Type.String({\n description: 'Theme name to apply (default: \"default\")',\n default: 'default',\n }),\n ThemeConfigSchema,\n ],\n {\n description:\n 'Theme to apply: a built-in/custom theme name (default: ' +\n '\"default\"), or an inline theme config object so the document ' +\n 'stays self-contained',\n }\n )\n ),\n fontRegistry: Type.Optional(FontRegistrySchema),\n slideWidth: Type.Optional(\n Type.Number({\n description: 'Slide width in inches (default: 10)',\n default: 10,\n })\n ),\n slideHeight: Type.Optional(\n Type.Number({\n description: 'Slide height in inches (default: 7.5)',\n default: 7.5,\n })\n ),\n rtlMode: Type.Optional(\n Type.Boolean({ description: 'Right-to-left text direction' })\n ),\n language: Type.Optional(\n Type.String({\n pattern: '^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$',\n description:\n 'Default presentation language (BCP-47 tag, e.g. \"en-US\"). Sets the spell-check language for all text; individual text components can override it.',\n examples: ['en-US', 'fr-FR', 'de-DE', 'it-IT', 'es-ES'],\n })\n ),\n pageNumberFormat: Type.Optional(\n Type.Union([Type.Literal('9'), Type.Literal('09')], {\n description:\n 'Format for {PAGE_NUMBER} placeholders: \"9\" = bare number (default), \"09\" = zero-padded',\n default: '9',\n })\n ),\n componentDefaults: Type.Optional(PptxComponentDefaultsSchema),\n grid: Type.Optional(GridConfigSchema),\n templates: Type.Optional(\n Type.Array(TemplateSlideDefinitionSchema, {\n description: 'Template slide definitions (reusable slide templates)',\n })\n ),\n },\n {\n description: 'Presentation container props',\n additionalProperties: false,\n }\n);\n\nexport type PresentationProps = Static<typeof PresentationPropsSchema>;\n","/**\n * Template Slide Definition Schemas\n */\n\nimport { Type, Static, TSchema } from '@sinclair/typebox';\nimport { SlideBackgroundSchema, GridPositionSchema } from './common';\nimport { ColorValueSchema, GridConfigSchema } from '../theme';\nimport { TextPropsSchema } from './text';\nimport { PptxImagePropsSchema } from './image';\nimport { ShapePropsSchema } from './shape';\nimport { PptxTablePropsSchema } from './table';\nimport { PptxChartPropsSchema } from './chart';\nimport { PptxHighchartsPropsSchema } from './highcharts';\n\n// Position helpers (number in inches OR percentage string e.g. \"50%\")\nconst Coord = Type.Union([\n Type.Number({ description: 'Position/size in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Position/size as percentage of slide dimension (e.g., \"50%\")',\n }),\n]);\n\n// Helper: wrap a props schema into { name, props } component format\nfunction contentComponent(name: string, propsSchema: TSchema) {\n return Type.Object({\n name: Type.Literal(name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(Type.Boolean({\n default: true,\n description: 'When false, this component is filtered out and not rendered. Defaults to true.',\n })),\n props: propsSchema,\n }, { additionalProperties: false });\n}\n\n// Content component union — same { name, props } format as slide children\nconst TemplateObjectComponentSchema = Type.Union([\n contentComponent('text', TextPropsSchema),\n contentComponent('image', PptxImagePropsSchema),\n contentComponent('shape', ShapePropsSchema),\n contentComponent('table', PptxTablePropsSchema),\n contentComponent('chart', PptxChartPropsSchema),\n contentComponent('highcharts', PptxHighchartsPropsSchema),\n], {\n discriminator: { propertyName: 'name' },\n description: 'Fixed component on a template slide (same format as slide children)',\n});\n\n// Defaults schema — partial component stub (carries styling props, not content)\n// Discriminated union so Monaco can autocomplete prop names per component type\nfunction defaultsComponent(name: string, propsSchema: TSchema) {\n return Type.Object({\n name: Type.Literal(name),\n props: Type.Partial(propsSchema, { description: 'Default props inherited by the component placed in this placeholder' }),\n }, { additionalProperties: false });\n}\n\nconst PlaceholderDefaultsSchema = Type.Union([\n defaultsComponent('text', TextPropsSchema),\n defaultsComponent('image', PptxImagePropsSchema),\n defaultsComponent('shape', ShapePropsSchema),\n defaultsComponent('table', PptxTablePropsSchema),\n defaultsComponent('chart', PptxChartPropsSchema),\n defaultsComponent('highcharts', PptxHighchartsPropsSchema),\n], {\n discriminator: { propertyName: 'name' },\n description: 'Partial component stub — styling defaults only',\n});\n\n// Placeholder definition\nexport const PlaceholderDefinitionSchema = Type.Object({\n name: Type.String({ description: 'Unique placeholder name' }),\n x: Type.Optional(Coord),\n y: Type.Optional(Coord),\n w: Type.Optional(Coord),\n h: Type.Optional(Coord),\n grid: Type.Optional(GridPositionSchema),\n defaults: Type.Optional(PlaceholderDefaultsSchema),\n}, { additionalProperties: false, description: 'Placeholder on a template slide — defaults is a component stub whose props are inherited by the actual component' });\n\n// Template slide definition\nexport const TemplateSlideDefinitionSchema = Type.Object({\n name: Type.String({ description: 'Unique template slide name' }),\n background: Type.Optional(SlideBackgroundSchema),\n margin: Type.Optional(Type.Union([\n Type.Number({ description: 'Margin in inches (all sides)' }),\n Type.Array(Type.Number(), { minItems: 4, maxItems: 4, description: 'Margin [top, right, bottom, left] in inches' }),\n ])),\n slideNumber: Type.Optional(Type.Object({\n x: Coord, y: Coord,\n w: Type.Optional(Coord),\n h: Type.Optional(Coord),\n color: Type.Optional(ColorValueSchema),\n fontSize: Type.Optional(Type.Number({ description: 'Slide number font size in points' })),\n }, { additionalProperties: false, description: 'Slide number position and styling' })),\n objects: Type.Optional(Type.Array(TemplateObjectComponentSchema, { description: 'Fixed components (logos, footers, decorations) — same { name, props } format as slide children' })),\n placeholders: Type.Optional(Type.Array(PlaceholderDefinitionSchema, { description: 'Placeholder regions for slide content' })),\n grid: Type.Optional(GridConfigSchema),\n}, { additionalProperties: false, description: 'Template slide definition (reusable slide template)' });\n\nexport type PlaceholderDefinition = Static<typeof PlaceholderDefinitionSchema>;\nexport type TemplateSlideDefinition = Static<typeof TemplateSlideDefinitionSchema>;\n","/**\n * Common Types and Schemas for PPTX Components\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport {\n ColorValueSchema,\n GradientFillSchema,\n} from '@json-to-office/shared/schemas/slide-content';\n\nexport {\n PptxAlignmentSchema,\n VerticalAlignmentSchema,\n ShadowSchema,\n GridPositionSchema,\n} from '@json-to-office/shared/schemas/slide-content';\n\nexport type {\n PptxAlignment,\n VerticalAlignment,\n Shadow,\n GridPosition,\n} from '@json-to-office/shared/schemas/slide-content';\n\nexport const PositionSchema = Type.Object(\n {\n x: Type.Optional(\n Type.Union([\n Type.Number({ description: 'X position in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'X position as percentage (e.g., \"10%\")',\n }),\n ])\n ),\n y: Type.Optional(\n Type.Union([\n Type.Number({ description: 'Y position in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Y position as percentage (e.g., \"10%\")',\n }),\n ])\n ),\n w: Type.Optional(\n Type.Union([\n Type.Number({ description: 'Width in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Width as percentage (e.g., \"80%\")',\n }),\n ])\n ),\n h: Type.Optional(\n Type.Union([\n Type.Number({ description: 'Height in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Height as percentage (e.g., \"20%\")',\n }),\n ])\n ),\n },\n {\n description: 'Position and size in inches or percentages',\n additionalProperties: false,\n }\n);\n\nexport const SlideBackgroundSchema = Type.Object(\n {\n color: Type.Optional(ColorValueSchema),\n gradient: Type.Optional(GradientFillSchema),\n image: Type.Optional(\n Type.Object(\n {\n path: Type.Optional(\n Type.String({ description: 'Image file path or URL' })\n ),\n base64: Type.Optional(\n Type.String({ description: 'Base64-encoded image data' })\n ),\n },\n { description: 'Background image', additionalProperties: false }\n )\n ),\n },\n {\n description: 'Slide background configuration',\n additionalProperties: false,\n }\n);\n\nexport const TransitionSchema = Type.Object(\n {\n type: Type.Optional(\n Type.Union(\n [\n Type.Literal('fade'),\n Type.Literal('push'),\n Type.Literal('wipe'),\n Type.Literal('zoom'),\n Type.Literal('none'),\n ],\n { description: 'Transition effect type' }\n )\n ),\n speed: Type.Optional(\n Type.Union(\n [Type.Literal('slow'), Type.Literal('medium'), Type.Literal('fast')],\n { description: 'Transition speed' }\n )\n ),\n },\n {\n description: 'Slide transition configuration',\n additionalProperties: false,\n }\n);\n\nexport type Position = Static<typeof PositionSchema>;\nexport type SlideBackground = Static<typeof SlideBackgroundSchema>;\nexport type Transition = Static<typeof TransitionSchema>;\n","/**\n * Slide Component Schema\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport { SlideBackgroundSchema, TransitionSchema } from './common';\n\nexport const SlidePropsSchema = Type.Object(\n {\n meta: Type.Optional(\n Type.Object(\n {\n title: Type.Optional(\n Type.String({\n description:\n 'Authoring label for this slide, shown in editors and outlines. Never rendered — slide content is unaffected.',\n })\n ),\n },\n {\n additionalProperties: false,\n description: 'Authoring metadata; has no effect on the presentation.',\n }\n )\n ),\n background: Type.Optional(SlideBackgroundSchema),\n transition: Type.Optional(TransitionSchema),\n notes: Type.Optional(\n Type.String({ description: 'Speaker notes for this slide' })\n ),\n layout: Type.Optional(\n Type.String({\n description: 'Slide layout name (e.g., \"Title Slide\", \"Blank\")',\n })\n ),\n hidden: Type.Optional(\n Type.Boolean({ description: 'Hide this slide from presentation' })\n ),\n template: Type.Optional(\n Type.String({ description: 'Template slide name to apply' })\n ),\n // Note: `placeholders` is added dynamically by the component registry\n // with the recursive component ref, to avoid circular imports.\n },\n {\n description: 'Slide container props',\n additionalProperties: false,\n }\n);\n\nexport type SlideProps = Static<typeof SlidePropsSchema>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,QAAAA,aAAqB;AAC9B,SAAS,qCAAqC;;;ACJ9C,SAAS,QAAAC,aAAoB;AAC7B,SAAS,0BAA0B;;;ACDnC,SAAS,QAAAC,aAA6B;;;ACAtC,SAAS,YAAoB;AAC7B;AAAA,EACE,oBAAAC;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASA,IAAM,iBAAiB,KAAK;AAAA,EACjC;AAAA,IACE,GAAG,KAAK;AAAA,MACN,KAAK,MAAM;AAAA,QACT,KAAK,OAAO,EAAE,aAAa,uBAAuB,CAAC;AAAA,QACnD,KAAK,OAAO;AAAA,UACV,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,GAAG,KAAK;AAAA,MACN,KAAK,MAAM;AAAA,QACT,KAAK,OAAO,EAAE,aAAa,uBAAuB,CAAC;AAAA,QACnD,KAAK,OAAO;AAAA,UACV,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,GAAG,KAAK;AAAA,MACN,KAAK,MAAM;AAAA,QACT,KAAK,OAAO,EAAE,aAAa,kBAAkB,CAAC;AAAA,QAC9C,KAAK,OAAO;AAAA,UACV,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,GAAG,KAAK;AAAA,MACN,KAAK,MAAM;AAAA,QACT,KAAK,OAAO,EAAE,aAAa,mBAAmB,CAAC;AAAA,QAC/C,KAAK,OAAO;AAAA,UACV,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,sBAAsB;AAAA,EACxB;AACF;AAEO,IAAM,wBAAwB,KAAK;AAAA,EACxC;AAAA,IACE,OAAO,KAAK,SAASA,iBAAgB;AAAA,IACrC,UAAU,KAAK,SAAS,kBAAkB;AAAA,IAC1C,OAAO,KAAK;AAAA,MACV,KAAK;AAAA,QACH;AAAA,UACE,MAAM,KAAK;AAAA,YACT,KAAK,OAAO,EAAE,aAAa,yBAAyB,CAAC;AAAA,UACvD;AAAA,UACA,QAAQ,KAAK;AAAA,YACX,KAAK,OAAO,EAAE,aAAa,4BAA4B,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,QACA,EAAE,aAAa,oBAAoB,sBAAsB,MAAM;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,sBAAsB;AAAA,EACxB;AACF;AAEO,IAAM,mBAAmB,KAAK;AAAA,EACnC;AAAA,IACE,MAAM,KAAK;AAAA,MACT,KAAK;AAAA,QACH;AAAA,UACE,KAAK,QAAQ,MAAM;AAAA,UACnB,KAAK,QAAQ,MAAM;AAAA,UACnB,KAAK,QAAQ,MAAM;AAAA,UACnB,KAAK,QAAQ,MAAM;AAAA,UACnB,KAAK,QAAQ,MAAM;AAAA,QACrB;AAAA,QACA,EAAE,aAAa,yBAAyB;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,OAAO,KAAK;AAAA,MACV,KAAK;AAAA,QACH,CAAC,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,QAAQ,GAAG,KAAK,QAAQ,MAAM,CAAC;AAAA,QACnE,EAAE,aAAa,mBAAmB;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,sBAAsB;AAAA,EACxB;AACF;;;ADvGA,IAAM,QAAQC,MAAK,MAAM;AAAA,EACvBA,MAAK,OAAO,EAAE,aAAa,0BAA0B,CAAC;AAAA,EACtDA,MAAK,OAAO;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,EACf,CAAC;AACH,CAAC;AAGD,SAAS,iBAAiB,MAAc,aAAsB;AAC5D,SAAOA,MAAK,OAAO;AAAA,IACjB,MAAMA,MAAK,QAAQ,IAAI;AAAA,IACvB,IAAIA,MAAK,SAASA,MAAK,OAAO,CAAC;AAAA,IAC/B,SAASA,MAAK,SAASA,MAAK,QAAQ;AAAA,MAClC,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,OAAO;AAAA,EACT,GAAG,EAAE,sBAAsB,MAAM,CAAC;AACpC;AAGA,IAAM,gCAAgCA,MAAK,MAAM;AAAA,EAC/C,iBAAiB,QAAQ,eAAe;AAAA,EACxC,iBAAiB,SAAS,oBAAoB;AAAA,EAC9C,iBAAiB,SAAS,gBAAgB;AAAA,EAC1C,iBAAiB,SAAS,oBAAoB;AAAA,EAC9C,iBAAiB,SAAS,oBAAoB;AAAA,EAC9C,iBAAiB,cAAc,yBAAyB;AAC1D,GAAG;AAAA,EACD,eAAe,EAAE,cAAc,OAAO;AAAA,EACtC,aAAa;AACf,CAAC;AAID,SAAS,kBAAkB,MAAc,aAAsB;AAC7D,SAAOA,MAAK,OAAO;AAAA,IACjB,MAAMA,MAAK,QAAQ,IAAI;AAAA,IACvB,OAAOA,MAAK,QAAQ,aAAa,EAAE,aAAa,sEAAsE,CAAC;AAAA,EACzH,GAAG,EAAE,sBAAsB,MAAM,CAAC;AACpC;AAEA,IAAM,4BAA4BA,MAAK,MAAM;AAAA,EAC3C,kBAAkB,QAAQ,eAAe;AAAA,EACzC,kBAAkB,SAAS,oBAAoB;AAAA,EAC/C,kBAAkB,SAAS,gBAAgB;AAAA,EAC3C,kBAAkB,SAAS,oBAAoB;AAAA,EAC/C,kBAAkB,SAAS,oBAAoB;AAAA,EAC/C,kBAAkB,cAAc,yBAAyB;AAC3D,GAAG;AAAA,EACD,eAAe,EAAE,cAAc,OAAO;AAAA,EACtC,aAAa;AACf,CAAC;AAGM,IAAM,8BAA8BA,MAAK,OAAO;AAAA,EACrD,MAAMA,MAAK,OAAO,EAAE,aAAa,0BAA0B,CAAC;AAAA,EAC5D,GAAGA,MAAK,SAAS,KAAK;AAAA,EACtB,GAAGA,MAAK,SAAS,KAAK;AAAA,EACtB,GAAGA,MAAK,SAAS,KAAK;AAAA,EACtB,GAAGA,MAAK,SAAS,KAAK;AAAA,EACtB,MAAMA,MAAK,SAAS,kBAAkB;AAAA,EACtC,UAAUA,MAAK,SAAS,yBAAyB;AACnD,GAAG,EAAE,sBAAsB,OAAO,aAAa,wHAAmH,CAAC;AAG5J,IAAM,gCAAgCA,MAAK,OAAO;AAAA,EACvD,MAAMA,MAAK,OAAO,EAAE,aAAa,6BAA6B,CAAC;AAAA,EAC/D,YAAYA,MAAK,SAAS,qBAAqB;AAAA,EAC/C,QAAQA,MAAK,SAASA,MAAK,MAAM;AAAA,IAC/BA,MAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;AAAA,IAC3DA,MAAK,MAAMA,MAAK,OAAO,GAAG,EAAE,UAAU,GAAG,UAAU,GAAG,aAAa,8CAA8C,CAAC;AAAA,EACpH,CAAC,CAAC;AAAA,EACF,aAAaA,MAAK,SAASA,MAAK,OAAO;AAAA,IACrC,GAAG;AAAA,IAAO,GAAG;AAAA,IACb,GAAGA,MAAK,SAAS,KAAK;AAAA,IACtB,GAAGA,MAAK,SAAS,KAAK;AAAA,IACtB,OAAOA,MAAK,SAAS,gBAAgB;AAAA,IACrC,UAAUA,MAAK,SAASA,MAAK,OAAO,EAAE,aAAa,mCAAmC,CAAC,CAAC;AAAA,EAC1F,GAAG,EAAE,sBAAsB,OAAO,aAAa,oCAAoC,CAAC,CAAC;AAAA,EACrF,SAASA,MAAK,SAASA,MAAK,MAAM,+BAA+B,EAAE,aAAa,sGAAiG,CAAC,CAAC;AAAA,EACnL,cAAcA,MAAK,SAASA,MAAK,MAAM,6BAA6B,EAAE,aAAa,wCAAwC,CAAC,CAAC;AAAA,EAC7H,MAAMA,MAAK,SAAS,gBAAgB;AACtC,GAAG,EAAE,sBAAsB,OAAO,aAAa,sDAAsD,CAAC;;;ADzF/F,IAAM,0BAA0BC,MAAK;AAAA,EAC1C;AAAA,IACE,OAAOA,MAAK;AAAA,MACVA,MAAK,OAAO,EAAE,aAAa,8BAA8B,CAAC;AAAA,IAC5D;AAAA,IACA,QAAQA,MAAK;AAAA,MACXA,MAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;AAAA,IAC7D;AAAA,IACA,SAASA,MAAK;AAAA,MACZA,MAAK,OAAO,EAAE,aAAa,gCAAgC,CAAC;AAAA,IAC9D;AAAA,IACA,SAASA,MAAK;AAAA,MACZA,MAAK,OAAO,EAAE,aAAa,wBAAwB,CAAC;AAAA,IACtD;AAAA,IACA,OAAOA,MAAK;AAAA,MACVA,MAAK;AAAA,QACH;AAAA,UACEA,MAAK,OAAO;AAAA,YACV,aAAa;AAAA,YACb,SAAS;AAAA,UACX,CAAC;AAAA,UACD;AAAA,QACF;AAAA,QACA;AAAA,UACE,aACE;AAAA,QAGJ;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAcA,MAAK,SAAS,kBAAkB;AAAA,IAC9C,YAAYA,MAAK;AAAA,MACfA,MAAK,OAAO;AAAA,QACV,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,aAAaA,MAAK;AAAA,MAChBA,MAAK,OAAO;AAAA,QACV,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,SAASA,MAAK;AAAA,MACZA,MAAK,QAAQ,EAAE,aAAa,+BAA+B,CAAC;AAAA,IAC9D;AAAA,IACA,UAAUA,MAAK;AAAA,MACbA,MAAK,OAAO;AAAA,QACV,SAAS;AAAA,QACT,aACE;AAAA,QACF,UAAU,CAAC,SAAS,SAAS,SAAS,SAAS,OAAO;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,IACA,kBAAkBA,MAAK;AAAA,MACrBA,MAAK,MAAM,CAACA,MAAK,QAAQ,GAAG,GAAGA,MAAK,QAAQ,IAAI,CAAC,GAAG;AAAA,QAClD,aACE;AAAA,QACF,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,mBAAmBA,MAAK,SAAS,2BAA2B;AAAA,IAC5D,MAAMA,MAAK,SAAS,gBAAgB;AAAA,IACpC,WAAWA,MAAK;AAAA,MACdA,MAAK,MAAM,+BAA+B;AAAA,QACxC,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,sBAAsB;AAAA,EACxB;AACF;;;AGhFA,SAAS,QAAAC,aAAoB;AAGtB,IAAM,mBAAmBC,MAAK;AAAA,EACnC;AAAA,IACE,MAAMA,MAAK;AAAA,MACTA,MAAK;AAAA,QACH;AAAA,UACE,OAAOA,MAAK;AAAA,YACVA,MAAK,OAAO;AAAA,cACV,aACE;AAAA,YACJ,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QACA;AAAA,UACE,sBAAsB;AAAA,UACtB,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAYA,MAAK,SAAS,qBAAqB;AAAA,IAC/C,YAAYA,MAAK,SAAS,gBAAgB;AAAA,IAC1C,OAAOA,MAAK;AAAA,MACVA,MAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;AAAA,IAC7D;AAAA,IACA,QAAQA,MAAK;AAAA,MACXA,MAAK,OAAO;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACA,QAAQA,MAAK;AAAA,MACXA,MAAK,QAAQ,EAAE,aAAa,oCAAoC,CAAC;AAAA,IACnE;AAAA,IACA,UAAUA,MAAK;AAAA,MACbA,MAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;AAAA,IAC7D;AAAA;AAAA;AAAA,EAGF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,sBAAsB;AAAA,EACxB;AACF;;;AJLO,IAAM,oCACX;AAAA;AAAA;AAAA;AAAA,EAIE;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB,CAAC,OAAO;AAAA,IACzB,UAAU;AAAA,IACV,aACE;AAAA,IACF,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB,8BAA8B,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI;AAAA,IACrE,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,aACE;AAAA,EACJ;AAAA;AAAA;AAAA,EAIA,GAAG;AACL;AAMK,SAAS,yBACd,MAC6C;AAC7C,SAAO,kCAAkC,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACtE;AAEO,SAAS,2BAA8C;AAC5D,SAAO,kCAAkC,IAAI,CAAC,MAAM,EAAE,IAAI;AAC5D;AAEO,SAAS,4BACd,UAC4C;AAC5C,SAAO,kCAAkC;AAAA,IACvC,CAAC,MAAM,EAAE,aAAa;AAAA,EACxB;AACF;AAEO,SAAS,6BAAyE;AACvF,SAAO,kCAAkC,OAAO,CAAC,MAAM,EAAE,WAAW;AACtE;AAEO,SAAS,2BAAuE;AACrF,SAAO,kCAAkC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW;AACvE;AAEO,SAAS,wBAAwB,MAAuB;AAC7D,SAAO,kCAAkC,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACtE;AAMO,SAAS,gCACd,WACA,cACA,gBACA,SACS;AACT,QAAM,SAAkC;AAAA,IACtC,MAAMC,MAAK,QAAQ,UAAU,IAAI;AAAA,IACjC,IAAIA,MAAK,SAASA,MAAK,OAAO,CAAC;AAAA,IAC/B,SAASA,MAAK;AAAA,MACZA,MAAK,QAAQ;AAAA,QACX,SAAS;AAAA,QACT,aACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,gBAAgB;AACrC,WAAO,UAAUA,MAAK,SAASA,MAAK,OAAO,EAAE,QAAQ,MAAM,CAAC,CAAC;AAC7D,WAAO,WAAW,UACd,QAAQ,uBACNA,MAAK,QAAQ,QAAQ,UAAU;AAAA,MAC7B,aAAa;AAAA,IACf,CAAC,IACDA,MAAK;AAAA,MACHA,MAAK,QAAQ,QAAQ,UAAU;AAAA,QAC7B,aAAa;AAAA,MACf,CAAC;AAAA,IACH,IACFA,MAAK;AAAA,MACHA,MAAK;AAAA,QACH,kBAAkB,IAAI,CAAC,aAAaA,MAAK,QAAQ,QAAQ,CAAC;AAAA,QAC1D;AAAA,UACE,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACN;AAEA,SAAO,QAAQ,UACX;AAAA,IACE,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,IACA,UAAU;AAEd,MAAI,UAAU,eAAe,cAAc;AACzC,WAAO,WAAWA,MAAK,SAASA,MAAK,MAAM,YAAY,CAAC;AAAA,EAC1D;AAEA,MACE,UAAU,oBACT,kBAAkB,iBACnB,SAAS,aAAa,eACtB;AACA,UAAM,iBAAkB,OAAO,MAAc,cAAc,CAAC;AAC5D,UAAM,QAAQ,kBAAkB;AAChC,WAAO,QAAQA,MAAK;AAAA,MAClB;AAAA,QACE,GAAG;AAAA,QACH,cAAcA,MAAK;AAAA,UACjBA,MAAK,OAAOA,MAAK,OAAO,GAAG,OAAO;AAAA,YAChC,aACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA;AAAA,QACE,sBAAsB;AAAA,QACtB,aAAc,UAAU,YAAoB;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,SAAOA,MAAK,OAAO,QAAQ;AAAA,IACzB,sBAAsB;AAAA,IACtB,aAAa,UAAU;AAAA,EACzB,CAAC;AACH;AAEO,SAAS,8BACd,cACoB;AACpB,SAAO,kCAAkC;AAAA,IAAI,CAAC,cAC5C,gCAAgC,WAAW,YAAY;AAAA,EACzD;AACF;AAaO,SAAS,sCACd,SACA,gBAA2B,CAAC,GAC5B,SACW;AAEX,QAAM,cAAc,oBAAI,IAAqB;AAC7C,aAAW,QAAQ,mCAAmC;AACpD,QACE,CAAC,KAAK,gBACL,CAAC,WAAW,yBAAyB,KAAK,MAAM,QAAQ,QAAQ,IACjE;AACA,kBAAY;AAAA,QACV,KAAK;AAAA,QACL,gCAAgC,MAAM,QAAW,SAAS,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,kCAAkC;AAAA,IACnD,CAAC,MAAM,EAAE;AAAA,EACX;AACA,QAAM,WAAW,oBAAI,IAAqB;AAC1C,QAAM,UAAU,CAAC,GAAG,UAAU;AAE9B,SAAO,QAAQ,SAAS,GAAG;AACzB,UAAM,SAAS,QAAQ;AACvB,aAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAC5C,YAAM,OAAO,QAAQ,CAAC;AAEtB,UAAI,CAAC,KAAK,iBAAiB;AAEzB,iBAAS;AAAA,UACP,KAAK;AAAA,UACL,gCAAgC,MAAM,SAAS,SAAS,OAAO;AAAA,QACjE;AACA,gBAAQ,OAAO,GAAG,CAAC;AACnB;AAAA,MACF;AAGA,YAAM,gBAAgB,KAAK,gBAAgB;AAAA,QAAO,CAAC,SACjD,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,MACxC;AACA,UAAI,CAAC,cAAc,MAAM,CAAC,MAAM,SAAS,IAAI,CAAC,CAAC,EAAG;AAGlD,YAAM,eAAe,KAAK,gBACvB,IAAI,CAAC,SAAS,SAAS,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,EACzD,OAAO,CAAC,MAAoB,MAAM,MAAS;AAE9C,YAAM,kBAAkB,CAAC,GAAG,cAAc,GAAG,aAAa;AAC1D,YAAM,eACJ,gBAAgB,WAAW,IACvB,gBAAgB,CAAC,IACjBA,MAAK,MAAM,eAAe;AAEhC,eAAS;AAAA,QACP,KAAK;AAAA,QACL,gCAAgC,MAAM,cAAc,SAAS,OAAO;AAAA,MACtE;AACA,cAAQ,OAAO,GAAG,CAAC;AAAA,IACrB;AAEA,QAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAM,IAAI;AAAA,QACR,mCAAmC,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAGA,SAAO,CAAC,GAAG,SAAS,OAAO,GAAG,GAAG,YAAY,OAAO,CAAC;AACvD;","names":["Type","Type","Type","ColorValueSchema","Type","Type","Type","Type","Type"]}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// src/schemas/renderer.ts
|
|
2
|
+
var PPTX_RENDERER_IDS = ["pptxgenjs", "office-open"];
|
|
3
|
+
var DEFAULT_PPTX_RENDERER_ID = "pptxgenjs";
|
|
4
|
+
function pptxPropsSchemaForRenderer(componentName, schema, renderer) {
|
|
5
|
+
const copy = cloneSchema(schema);
|
|
6
|
+
const properties = objectProperties(copy);
|
|
7
|
+
if (renderer === "pptxgenjs") {
|
|
8
|
+
if (componentName === "slide") delete properties?.transition;
|
|
9
|
+
return copy;
|
|
10
|
+
}
|
|
11
|
+
switch (componentName) {
|
|
12
|
+
case "pptx":
|
|
13
|
+
delete properties?.templates;
|
|
14
|
+
break;
|
|
15
|
+
case "slide":
|
|
16
|
+
delete properties?.template;
|
|
17
|
+
break;
|
|
18
|
+
case "image":
|
|
19
|
+
for (const key of ["svg", "sizing", "rotate", "rounding", "hyperlink"]) {
|
|
20
|
+
delete properties?.[key];
|
|
21
|
+
}
|
|
22
|
+
break;
|
|
23
|
+
case "shape":
|
|
24
|
+
delete properties?.flipV;
|
|
25
|
+
break;
|
|
26
|
+
case "table":
|
|
27
|
+
for (const key of [
|
|
28
|
+
"autoPage",
|
|
29
|
+
"autoPageRepeatHeader",
|
|
30
|
+
"margin",
|
|
31
|
+
"borderRadius"
|
|
32
|
+
]) {
|
|
33
|
+
delete properties?.[key];
|
|
34
|
+
}
|
|
35
|
+
pruneOfficeOpenTableCells(copy);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
syncRequired(copy);
|
|
39
|
+
return copy;
|
|
40
|
+
}
|
|
41
|
+
function isPptxComponentSupported(componentName, renderer) {
|
|
42
|
+
return renderer !== "office-open" || componentName !== "chart";
|
|
43
|
+
}
|
|
44
|
+
function collectPptxRendererErrors(data) {
|
|
45
|
+
if (!data || typeof data !== "object" || Array.isArray(data)) return [];
|
|
46
|
+
const root = data;
|
|
47
|
+
const renderer = root.renderer ?? DEFAULT_PPTX_RENDERER_ID;
|
|
48
|
+
if (!PPTX_RENDERER_IDS.includes(renderer)) {
|
|
49
|
+
return [
|
|
50
|
+
{
|
|
51
|
+
path: "/renderer",
|
|
52
|
+
message: `Invalid renderer "${String(renderer)}". Expected "pptxgenjs" or "office-open".`,
|
|
53
|
+
code: "invalid_value"
|
|
54
|
+
}
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
const errors = [];
|
|
58
|
+
const unsupported = (path, feature) => {
|
|
59
|
+
errors.push({
|
|
60
|
+
path,
|
|
61
|
+
message: `The "${renderer}" renderer does not support ${feature}.`,
|
|
62
|
+
code: "unsupported_renderer_feature"
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const visit = (node, path) => {
|
|
66
|
+
if (Array.isArray(node)) {
|
|
67
|
+
node.forEach((entry, index) => visit(entry, `${path}/${index}`));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (!node || typeof node !== "object") return;
|
|
71
|
+
const props = node.props;
|
|
72
|
+
if (renderer === "pptxgenjs") {
|
|
73
|
+
if (node.name === "slide" && props?.transition !== void 0) {
|
|
74
|
+
unsupported(`${path}/props/transition`, "slide transitions");
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
if (node.name === "pptx" && props?.templates !== void 0) {
|
|
78
|
+
unsupported(`${path}/props/templates`, "masters/templates");
|
|
79
|
+
}
|
|
80
|
+
if (node.name === "slide") {
|
|
81
|
+
if (props?.template !== void 0) {
|
|
82
|
+
unsupported(`${path}/props/template`, "masters/templates");
|
|
83
|
+
}
|
|
84
|
+
if (props?.placeholders !== void 0) {
|
|
85
|
+
unsupported(`${path}/props/placeholders`, "placeholders");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (node.name === "chart") {
|
|
89
|
+
unsupported(path || "/", "native editable charts");
|
|
90
|
+
}
|
|
91
|
+
if (node.name === "image") {
|
|
92
|
+
const fields = {
|
|
93
|
+
svg: "SVG images",
|
|
94
|
+
sizing: "image cropping",
|
|
95
|
+
rotate: "image transforms",
|
|
96
|
+
rounding: "image rounding",
|
|
97
|
+
hyperlink: "element hyperlinks"
|
|
98
|
+
};
|
|
99
|
+
for (const [field, feature] of Object.entries(fields)) {
|
|
100
|
+
if (props?.[field] !== void 0) {
|
|
101
|
+
unsupported(`${path}/props/${field}`, feature);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (node.name === "shape" && props?.flipV !== void 0) {
|
|
106
|
+
unsupported(`${path}/props/flipV`, "vertical flipping");
|
|
107
|
+
}
|
|
108
|
+
if (node.name === "table") {
|
|
109
|
+
const fields = {
|
|
110
|
+
autoPage: "table auto-pagination",
|
|
111
|
+
autoPageRepeatHeader: "table auto-pagination",
|
|
112
|
+
margin: "table insets",
|
|
113
|
+
borderRadius: "rounded table corners"
|
|
114
|
+
};
|
|
115
|
+
for (const [field, feature] of Object.entries(fields)) {
|
|
116
|
+
if (props?.[field] !== void 0) {
|
|
117
|
+
unsupported(`${path}/props/${field}`, feature);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (Array.isArray(props?.rows)) {
|
|
121
|
+
props.rows.forEach((row, rowIndex) => {
|
|
122
|
+
if (!Array.isArray(row)) return;
|
|
123
|
+
row.forEach((cell, cellIndex) => {
|
|
124
|
+
if (!cell || typeof cell !== "object") return;
|
|
125
|
+
for (const [field, feature] of [
|
|
126
|
+
["colspan", "merged table cells"],
|
|
127
|
+
["rowspan", "merged table cells"],
|
|
128
|
+
["margin", "table insets"]
|
|
129
|
+
]) {
|
|
130
|
+
if (cell[field] !== void 0) {
|
|
131
|
+
unsupported(
|
|
132
|
+
`${path}/props/rows/${rowIndex}/${cellIndex}/${field}`,
|
|
133
|
+
feature
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
for (const [key, value] of Object.entries(node)) {
|
|
143
|
+
if (key !== "renderer") visit(value, `${path}/${key}`);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
visit(root, "");
|
|
147
|
+
return errors;
|
|
148
|
+
}
|
|
149
|
+
function pruneOfficeOpenTableCells(schema) {
|
|
150
|
+
const rows = objectProperties(schema)?.rows;
|
|
151
|
+
const cellUnion = rows?.items?.items;
|
|
152
|
+
const branches = cellUnion?.anyOf;
|
|
153
|
+
if (!Array.isArray(branches)) return;
|
|
154
|
+
for (const branch of branches) {
|
|
155
|
+
const properties = objectProperties(branch);
|
|
156
|
+
if (!properties?.text) continue;
|
|
157
|
+
delete properties.colspan;
|
|
158
|
+
delete properties.rowspan;
|
|
159
|
+
delete properties.margin;
|
|
160
|
+
syncRequired(branch);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function objectProperties(schema) {
|
|
164
|
+
if (!schema || typeof schema !== "object") return void 0;
|
|
165
|
+
return schema.properties;
|
|
166
|
+
}
|
|
167
|
+
function syncRequired(schema) {
|
|
168
|
+
const properties = objectProperties(schema);
|
|
169
|
+
const required = schema.required;
|
|
170
|
+
if (!properties || !required) return;
|
|
171
|
+
const next = required.filter((key) => key in properties);
|
|
172
|
+
if (next.length > 0) schema.required = next;
|
|
173
|
+
else delete schema.required;
|
|
174
|
+
}
|
|
175
|
+
function cloneSchema(value) {
|
|
176
|
+
if (Array.isArray(value)) return value.map(cloneSchema);
|
|
177
|
+
if (!value || typeof value !== "object") return value;
|
|
178
|
+
const copy = Object.create(Object.getPrototypeOf(value));
|
|
179
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
180
|
+
copy[key] = cloneSchema(value[key]);
|
|
181
|
+
}
|
|
182
|
+
return copy;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export {
|
|
186
|
+
PPTX_RENDERER_IDS,
|
|
187
|
+
DEFAULT_PPTX_RENDERER_ID,
|
|
188
|
+
pptxPropsSchemaForRenderer,
|
|
189
|
+
isPptxComponentSupported,
|
|
190
|
+
collectPptxRendererErrors
|
|
191
|
+
};
|
|
192
|
+
//# sourceMappingURL=chunk-2YEV3CJF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/renderer.ts"],"sourcesContent":["import type { TSchema } from '@sinclair/typebox';\nimport type { ValidationError } from '@json-to-office/shared';\n\nexport const PPTX_RENDERER_IDS = ['pptxgenjs', 'office-open'] as const;\nexport type PptxRendererId = (typeof PPTX_RENDERER_IDS)[number];\nexport const DEFAULT_PPTX_RENDERER_ID: PptxRendererId = 'pptxgenjs';\n\n/**\n * Renderer-specific view of one canonical component props schema.\n *\n * This is intentionally a pruning pass rather than a second schema tree. The\n * compiler capability gate remains authoritative for requirements that depend\n * on resolved assets or expanded custom components.\n */\nexport function pptxPropsSchemaForRenderer(\n componentName: string,\n schema: TSchema,\n renderer: PptxRendererId\n): TSchema {\n const copy = cloneSchema(schema);\n const properties = objectProperties(copy);\n\n if (renderer === 'pptxgenjs') {\n if (componentName === 'slide') delete properties?.transition;\n return copy;\n }\n\n switch (componentName) {\n case 'pptx':\n delete properties?.templates;\n break;\n case 'slide':\n delete properties?.template;\n break;\n case 'image':\n for (const key of ['svg', 'sizing', 'rotate', 'rounding', 'hyperlink']) {\n delete properties?.[key];\n }\n break;\n case 'shape':\n delete properties?.flipV;\n break;\n case 'table':\n for (const key of [\n 'autoPage',\n 'autoPageRepeatHeader',\n 'margin',\n 'borderRadius',\n ]) {\n delete properties?.[key];\n }\n pruneOfficeOpenTableCells(copy);\n break;\n }\n\n syncRequired(copy);\n return copy;\n}\n\nexport function isPptxComponentSupported(\n componentName: string,\n renderer: PptxRendererId\n): boolean {\n return renderer !== 'office-open' || componentName !== 'chart';\n}\n\n/** Static renderer-profile diagnostics used by CLI/library validation. */\nexport function collectPptxRendererErrors(data: unknown): ValidationError[] {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return [];\n const root = data as Record<string, any>;\n const renderer = root.renderer ?? DEFAULT_PPTX_RENDERER_ID;\n\n if (!PPTX_RENDERER_IDS.includes(renderer)) {\n return [\n {\n path: '/renderer',\n message: `Invalid renderer \"${String(renderer)}\". Expected \"pptxgenjs\" or \"office-open\".`,\n code: 'invalid_value',\n },\n ];\n }\n\n const errors: ValidationError[] = [];\n const unsupported = (path: string, feature: string): void => {\n errors.push({\n path,\n message: `The \"${renderer}\" renderer does not support ${feature}.`,\n code: 'unsupported_renderer_feature',\n });\n };\n\n const visit = (node: any, path: string): void => {\n if (Array.isArray(node)) {\n node.forEach((entry, index) => visit(entry, `${path}/${index}`));\n return;\n }\n if (!node || typeof node !== 'object') return;\n\n const props = node.props;\n if (renderer === 'pptxgenjs') {\n if (node.name === 'slide' && props?.transition !== undefined) {\n unsupported(`${path}/props/transition`, 'slide transitions');\n }\n } else {\n if (node.name === 'pptx' && props?.templates !== undefined) {\n unsupported(`${path}/props/templates`, 'masters/templates');\n }\n if (node.name === 'slide') {\n if (props?.template !== undefined) {\n unsupported(`${path}/props/template`, 'masters/templates');\n }\n if (props?.placeholders !== undefined) {\n unsupported(`${path}/props/placeholders`, 'placeholders');\n }\n }\n if (node.name === 'chart') {\n unsupported(path || '/', 'native editable charts');\n }\n if (node.name === 'image') {\n const fields: Record<string, string> = {\n svg: 'SVG images',\n sizing: 'image cropping',\n rotate: 'image transforms',\n rounding: 'image rounding',\n hyperlink: 'element hyperlinks',\n };\n for (const [field, feature] of Object.entries(fields)) {\n if (props?.[field] !== undefined) {\n unsupported(`${path}/props/${field}`, feature);\n }\n }\n }\n if (node.name === 'shape' && props?.flipV !== undefined) {\n unsupported(`${path}/props/flipV`, 'vertical flipping');\n }\n if (node.name === 'table') {\n const fields: Record<string, string> = {\n autoPage: 'table auto-pagination',\n autoPageRepeatHeader: 'table auto-pagination',\n margin: 'table insets',\n borderRadius: 'rounded table corners',\n };\n for (const [field, feature] of Object.entries(fields)) {\n if (props?.[field] !== undefined) {\n unsupported(`${path}/props/${field}`, feature);\n }\n }\n if (Array.isArray(props?.rows)) {\n props.rows.forEach((row: unknown[], rowIndex: number) => {\n if (!Array.isArray(row)) return;\n row.forEach((cell, cellIndex) => {\n if (!cell || typeof cell !== 'object') return;\n for (const [field, feature] of [\n ['colspan', 'merged table cells'],\n ['rowspan', 'merged table cells'],\n ['margin', 'table insets'],\n ] as const) {\n if ((cell as Record<string, unknown>)[field] !== undefined) {\n unsupported(\n `${path}/props/rows/${rowIndex}/${cellIndex}/${field}`,\n feature\n );\n }\n }\n });\n });\n }\n }\n }\n\n for (const [key, value] of Object.entries(node)) {\n if (key !== 'renderer') visit(value, `${path}/${key}`);\n }\n };\n\n visit(root, '');\n return errors;\n}\n\nfunction pruneOfficeOpenTableCells(schema: TSchema): void {\n const rows = objectProperties(schema)?.rows as any;\n const cellUnion = rows?.items?.items;\n const branches = cellUnion?.anyOf;\n if (!Array.isArray(branches)) return;\n for (const branch of branches) {\n const properties = objectProperties(branch);\n if (!properties?.text) continue;\n delete properties.colspan;\n delete properties.rowspan;\n delete properties.margin;\n syncRequired(branch);\n }\n}\n\nfunction objectProperties(\n schema: unknown\n): Record<string, TSchema> | undefined {\n if (!schema || typeof schema !== 'object') return undefined;\n return (schema as { properties?: Record<string, TSchema> }).properties;\n}\n\nfunction syncRequired(schema: TSchema): void {\n const properties = objectProperties(schema);\n const required = (schema as { required?: string[] }).required;\n if (!properties || !required) return;\n const next = required.filter((key) => key in properties);\n if (next.length > 0) (schema as { required?: string[] }).required = next;\n else delete (schema as { required?: string[] }).required;\n}\n\nfunction cloneSchema<T>(value: T): T {\n if (Array.isArray(value)) return value.map(cloneSchema) as T;\n if (!value || typeof value !== 'object') return value;\n const copy = Object.create(Object.getPrototypeOf(value));\n for (const key of Reflect.ownKeys(value as object)) {\n copy[key] = cloneSchema((value as any)[key]);\n }\n return copy;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createAllPptxComponentSchemasNarrowed
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2MZVIHSQ.js";
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_PPTX_RENDERER_ID,
|
|
6
|
+
PPTX_RENDERER_IDS
|
|
7
|
+
} from "./chunk-2YEV3CJF.js";
|
|
4
8
|
|
|
5
9
|
// src/schemas/generator.ts
|
|
6
10
|
import { Type } from "@sinclair/typebox";
|
|
@@ -30,6 +34,18 @@ function createPluginVersionSchema(custom, entry, recursiveRef, isLatest) {
|
|
|
30
34
|
}
|
|
31
35
|
function generateUnifiedDocumentSchema(options = {}) {
|
|
32
36
|
const { customComponents = [] } = options;
|
|
37
|
+
const branches = PPTX_RENDERER_IDS.map(
|
|
38
|
+
(renderer) => generateRendererSchema(
|
|
39
|
+
customComponents,
|
|
40
|
+
renderer,
|
|
41
|
+
renderer !== DEFAULT_PPTX_RENDERER_ID
|
|
42
|
+
)
|
|
43
|
+
);
|
|
44
|
+
return Type.Union(branches, {
|
|
45
|
+
description: "Presentation definition, discriminated by the optional renderer field. Omitted renderer means pptxgenjs."
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function generateRendererSchema(customComponents, renderer, requireDiscriminator) {
|
|
33
49
|
return Type.Recursive((Self) => {
|
|
34
50
|
const pluginSchemas = [];
|
|
35
51
|
for (const custom of customComponents) {
|
|
@@ -52,7 +68,8 @@ function generateUnifiedDocumentSchema(options = {}) {
|
|
|
52
68
|
}
|
|
53
69
|
const standardSchemas = createAllPptxComponentSchemasNarrowed(
|
|
54
70
|
Self,
|
|
55
|
-
pluginSchemas
|
|
71
|
+
pluginSchemas,
|
|
72
|
+
{ renderer, requireDiscriminator }
|
|
56
73
|
);
|
|
57
74
|
const componentSchemas = [...standardSchemas, ...pluginSchemas];
|
|
58
75
|
if (componentSchemas.length === 0) {
|
|
@@ -65,4 +82,4 @@ function generateUnifiedDocumentSchema(options = {}) {
|
|
|
65
82
|
export {
|
|
66
83
|
generateUnifiedDocumentSchema
|
|
67
84
|
};
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
85
|
+
//# sourceMappingURL=chunk-5WT7G2OG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/generator.ts"],"sourcesContent":["/**\n * Unified Presentation Schema Generator\n *\n * Generates JSON schemas that include both standard and custom plugin components.\n * Used at build-time for static schema files and at runtime for plugin-aware validation.\n */\nimport { Type, TSchema } from '@sinclair/typebox';\nimport { latestVersion } from '@json-to-office/shared';\nimport { createAllPptxComponentSchemasNarrowed } from './component-registry';\nimport {\n DEFAULT_PPTX_RENDERER_ID,\n PPTX_RENDERER_IDS,\n type PptxRendererId,\n} from './renderer';\n\nexport interface VersionedPropsEntry {\n version: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n description?: string;\n}\n\nexport interface CustomComponentInfo {\n name: string;\n versions: VersionedPropsEntry[];\n}\n\nexport interface GenerateSchemaOptions {\n customComponents?: CustomComponentInfo[];\n includeMetadata?: boolean;\n}\n\nfunction createPluginVersionSchema(\n custom: CustomComponentInfo,\n entry: VersionedPropsEntry,\n recursiveRef: TSchema,\n isLatest: boolean\n): TSchema {\n const fields: Record<string, TSchema> = {\n name: Type.Literal(custom.name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'When false, this component is filtered out and not rendered. Defaults to true.',\n })\n ),\n // Omitting version selects the latest release at runtime. Explicit older\n // versions remain discriminated so their own props schema is enforced.\n version: isLatest\n ? Type.Optional(Type.Literal(entry.version))\n : Type.Literal(entry.version),\n props: entry.propsSchema,\n };\n\n if (entry.hasChildren) {\n fields.children = Type.Optional(Type.Array(recursiveRef));\n }\n\n return Type.Object(fields, {\n additionalProperties: false,\n description: entry.description ?? custom.name,\n });\n}\n\n/**\n * Generate a unified presentation schema that includes standard + custom components.\n * Uses Type.Recursive so container components (presentation, slide) can have children.\n */\nexport function generateUnifiedDocumentSchema(\n options: GenerateSchemaOptions = {}\n): TSchema {\n const { customComponents = [] } = options;\n\n const branches = PPTX_RENDERER_IDS.map((renderer) =>\n generateRendererSchema(\n customComponents,\n renderer,\n renderer !== DEFAULT_PPTX_RENDERER_ID\n )\n );\n\n return Type.Union(branches, {\n description:\n 'Presentation definition, discriminated by the optional renderer field. Omitted renderer means pptxgenjs.',\n });\n}\n\nfunction generateRendererSchema(\n customComponents: CustomComponentInfo[],\n renderer: PptxRendererId,\n requireDiscriminator: boolean\n): TSchema {\n return Type.Recursive((Self) => {\n // ── Phase 1: Build plugin schemas (plugins get Self for arbitrary nesting) ──\n const pluginSchemas: TSchema[] = [];\n\n for (const custom of customComponents) {\n if (custom.versions.length > 0) {\n const latest = latestVersion(\n custom.versions.map((entry) => entry.version)\n );\n const versions = custom.versions.map((entry) =>\n createPluginVersionSchema(\n custom,\n entry,\n Self,\n entry.version === latest\n )\n );\n pluginSchemas.push(\n versions.length === 1 ? versions[0] : Type.Union(versions)\n );\n }\n }\n\n // ── Phase 2: Build standard components with narrowed children ──\n const standardSchemas = createAllPptxComponentSchemasNarrowed(\n Self,\n pluginSchemas,\n { renderer, requireDiscriminator }\n );\n\n const componentSchemas = [...standardSchemas, ...pluginSchemas];\n\n if (componentSchemas.length === 0) {\n return Type.Object({});\n }\n\n return Type.Union(componentSchemas);\n });\n}\n"],"mappings":";;;;;;;;;AAMA,SAAS,YAAqB;AAC9B,SAAS,qBAAqB;AAyB9B,SAAS,0BACP,QACA,OACA,cACA,UACS;AACT,QAAM,SAAkC;AAAA,IACtC,MAAM,KAAK,QAAQ,OAAO,IAAI;AAAA,IAC9B,IAAI,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,IAC/B,SAAS,KAAK;AAAA,MACZ,KAAK,QAAQ;AAAA,QACX,SAAS;AAAA,QACT,aACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA;AAAA;AAAA,IAGA,SAAS,WACL,KAAK,SAAS,KAAK,QAAQ,MAAM,OAAO,CAAC,IACzC,KAAK,QAAQ,MAAM,OAAO;AAAA,IAC9B,OAAO,MAAM;AAAA,EACf;AAEA,MAAI,MAAM,aAAa;AACrB,WAAO,WAAW,KAAK,SAAS,KAAK,MAAM,YAAY,CAAC;AAAA,EAC1D;AAEA,SAAO,KAAK,OAAO,QAAQ;AAAA,IACzB,sBAAsB;AAAA,IACtB,aAAa,MAAM,eAAe,OAAO;AAAA,EAC3C,CAAC;AACH;AAMO,SAAS,8BACd,UAAiC,CAAC,GACzB;AACT,QAAM,EAAE,mBAAmB,CAAC,EAAE,IAAI;AAElC,QAAM,WAAW,kBAAkB;AAAA,IAAI,CAAC,aACtC;AAAA,MACE;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO,KAAK,MAAM,UAAU;AAAA,IAC1B,aACE;AAAA,EACJ,CAAC;AACH;AAEA,SAAS,uBACP,kBACA,UACA,sBACS;AACT,SAAO,KAAK,UAAU,CAAC,SAAS;AAE9B,UAAM,gBAA2B,CAAC;AAElC,eAAW,UAAU,kBAAkB;AACrC,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,cAAM,SAAS;AAAA,UACb,OAAO,SAAS,IAAI,CAAC,UAAU,MAAM,OAAO;AAAA,QAC9C;AACA,cAAM,WAAW,OAAO,SAAS;AAAA,UAAI,CAAC,UACpC;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,MAAM,YAAY;AAAA,UACpB;AAAA,QACF;AACA,sBAAc;AAAA,UACZ,SAAS,WAAW,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,QAAQ;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAGA,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA,EAAE,UAAU,qBAAqB;AAAA,IACnC;AAEA,UAAM,mBAAmB,CAAC,GAAG,iBAAiB,GAAG,aAAa;AAE9D,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO,KAAK,OAAO,CAAC,CAAC;AAAA,IACvB;AAEA,WAAO,KAAK,MAAM,gBAAgB;AAAA,EACpC,CAAC;AACH;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PptxComponentDefinitionSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YSJMKGLM.js";
|
|
4
4
|
|
|
5
5
|
// src/schemas/document.ts
|
|
6
6
|
var PptxJsonComponentDefinitionSchema = PptxComponentDefinitionSchema;
|
|
@@ -18,4 +18,4 @@ export {
|
|
|
18
18
|
PptxJsonComponentDefinitionSchema,
|
|
19
19
|
PPTX_JSON_SCHEMA_URLS
|
|
20
20
|
};
|
|
21
|
-
//# sourceMappingURL=chunk-
|
|
21
|
+
//# sourceMappingURL=chunk-F3FQ7ADB.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createAllPptxComponentSchemas,
|
|
3
3
|
createAllPptxComponentSchemasNarrowed
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-2MZVIHSQ.js";
|
|
5
5
|
|
|
6
6
|
// src/schemas/component-union.ts
|
|
7
7
|
import { Type } from "@sinclair/typebox";
|
|
@@ -25,4 +25,4 @@ export {
|
|
|
25
25
|
PptxComponentDefinitionSchema,
|
|
26
26
|
PptxSlideContentSchema
|
|
27
27
|
};
|
|
28
|
-
//# sourceMappingURL=chunk-
|
|
28
|
+
//# sourceMappingURL=chunk-YSJMKGLM.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { PPTX_BASE_SCHEMA_METADATA, PPTX_COMPONENT_METADATA } from './schemas/ex
|
|
|
8
8
|
export { ChartComponentDefaults, ChartComponentDefaultsSchema, HighchartsComponentDefaults, HighchartsComponentDefaultsSchema, ImageComponentDefaults, ImageComponentDefaultsSchema, PptxComponentDefaults, PptxComponentDefaultsSchema, ShapeComponentDefaults, ShapeComponentDefaultsSchema, TableComponentDefaults, TableComponentDefaultsSchema, TextComponentDefaults, TextComponentDefaultsSchema } from './schemas/component-defaults.js';
|
|
9
9
|
export { TextStyle, TextStyleSchema, ThemeConfigJson, ThemeConfigSchema, isValidThemeConfig } from './schemas/theme.js';
|
|
10
10
|
export { CustomComponentInfo, GenerateSchemaOptions, VersionedPropsEntry, generateUnifiedDocumentSchema } from './schemas/generator.js';
|
|
11
|
+
export { DEFAULT_PPTX_RENDERER_ID, PPTX_RENDERER_IDS, PptxRendererId, collectPptxRendererErrors } from './schemas/renderer.js';
|
|
11
12
|
import { ValidationError } from '@json-to-office/shared';
|
|
12
13
|
export { ComponentSchemaConfig, DEFAULT_ERROR_CONFIG, ErrorFormatterConfig, ParsedSemver, ValidationError, compareSemver, convertToJsonSchema, createComponentSchema, createErrorConfig, exportSchemaToFile, fixSchemaReferences, isValidSemver, latestVersion, parseSemver, transformValueError, transformValueErrors } from '@json-to-office/shared';
|
|
13
14
|
import '@sinclair/typebox';
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PPTX_JSON_SCHEMA_URLS,
|
|
3
3
|
PptxJsonComponentDefinitionSchema
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-F3FQ7ADB.js";
|
|
5
5
|
import "./chunk-J4OT5Y5B.js";
|
|
6
6
|
import {
|
|
7
7
|
PptxComponentDefinitionSchema,
|
|
8
8
|
PptxSlideContentSchema,
|
|
9
9
|
PptxStandardComponentDefinitionSchema
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-YSJMKGLM.js";
|
|
11
11
|
import {
|
|
12
12
|
PPTX_BASE_SCHEMA_METADATA,
|
|
13
13
|
PPTX_COMPONENT_METADATA
|
|
14
14
|
} from "./chunk-RV7W3UXU.js";
|
|
15
15
|
import {
|
|
16
16
|
generateUnifiedDocumentSchema
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-5WT7G2OG.js";
|
|
18
18
|
import {
|
|
19
19
|
PPTX_STANDARD_COMPONENTS_REGISTRY,
|
|
20
20
|
PositionSchema,
|
|
@@ -32,7 +32,12 @@ import {
|
|
|
32
32
|
getPptxContentComponents,
|
|
33
33
|
getPptxStandardComponent,
|
|
34
34
|
isPptxStandardComponent
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-2MZVIHSQ.js";
|
|
36
|
+
import {
|
|
37
|
+
DEFAULT_PPTX_RENDERER_ID,
|
|
38
|
+
PPTX_RENDERER_IDS,
|
|
39
|
+
collectPptxRendererErrors
|
|
40
|
+
} from "./chunk-2YEV3CJF.js";
|
|
36
41
|
import {
|
|
37
42
|
ColorValueSchema,
|
|
38
43
|
SEMANTIC_COLOR_ALIASES,
|
|
@@ -162,6 +167,7 @@ var CUSTOM_COMPONENT_OBJECT_KEYS = /* @__PURE__ */ new Set([
|
|
|
162
167
|
"version"
|
|
163
168
|
]);
|
|
164
169
|
var ROOT_OBJECT_KEYS = /* @__PURE__ */ new Set([...COMPONENT_OBJECT_KEYS, "$schema"]);
|
|
170
|
+
ROOT_OBJECT_KEYS.add("renderer");
|
|
165
171
|
function deepValidatePresentation(data, opts = {}) {
|
|
166
172
|
const allErrors = [];
|
|
167
173
|
if (!data || typeof data !== "object") {
|
|
@@ -391,6 +397,7 @@ function validatePresentationDocument(data, opts = {}) {
|
|
|
391
397
|
const errors = comprehensiveValidatePresentation(data, [], opts);
|
|
392
398
|
errors.push(...collectImageSourceConflicts(data));
|
|
393
399
|
errors.push(...collectTextContentConflicts(data));
|
|
400
|
+
errors.push(...collectPptxRendererErrors(data));
|
|
394
401
|
const valid = errors.length === 0;
|
|
395
402
|
return {
|
|
396
403
|
valid,
|
|
@@ -456,6 +463,7 @@ export {
|
|
|
456
463
|
ChartComponentDefaultsSchema,
|
|
457
464
|
ColorValueSchema,
|
|
458
465
|
DEFAULT_ERROR_CONFIG,
|
|
466
|
+
DEFAULT_PPTX_RENDERER_ID,
|
|
459
467
|
GradientFillSchema,
|
|
460
468
|
GradientStopSchema,
|
|
461
469
|
HighchartsComponentDefaultsSchema,
|
|
@@ -464,6 +472,7 @@ export {
|
|
|
464
472
|
PPTX_BASE_SCHEMA_METADATA,
|
|
465
473
|
PPTX_COMPONENT_METADATA,
|
|
466
474
|
PPTX_JSON_SCHEMA_URLS,
|
|
475
|
+
PPTX_RENDERER_IDS,
|
|
467
476
|
PPTX_SHARED_VERSION,
|
|
468
477
|
PPTX_STANDARD_COMPONENTS_REGISTRY,
|
|
469
478
|
PatternFillSchema,
|
|
@@ -497,6 +506,7 @@ export {
|
|
|
497
506
|
TransitionSchema,
|
|
498
507
|
VerticalAlignmentSchema,
|
|
499
508
|
collectImageSourceConflicts,
|
|
509
|
+
collectPptxRendererErrors,
|
|
500
510
|
collectTextContentConflicts,
|
|
501
511
|
compareSemver,
|
|
502
512
|
comprehensiveValidatePresentation,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/validation/image-source-conflicts.ts","../src/validation/text-content-conflicts.ts","../src/validation/unified/index.ts","../src/validation/unified/deep-validator.ts","../src/index.ts"],"sourcesContent":["/**\n * Image source conflict detection (PPTX)\n *\n * Mirrors core-docx: `path`, `base64`, and `svg` are mutually exclusive on the\n * image component, but all three are optional fields on a single object schema —\n * so a multi-source payload passes the structural check and would otherwise be\n * silently resolved by runtime precedence (svg > base64 > path). This walk runs\n * unconditionally during validation and rejects such payloads. It traverses every\n * nested value, so images inside slides, grids, containers, and table cells are\n * all covered regardless of container shape.\n */\n\nimport type { ValidationError } from '@json-to-office/shared';\n\n// Image source fields that are mutually exclusive: exactly one may be set.\nconst IMAGE_SOURCE_FIELDS = ['path', 'base64', 'svg'] as const;\n\n/**\n * Names of the image source fields that carry a non-empty value on a props object.\n */\nexport function presentImageSources(props: unknown): string[] {\n if (!props || typeof props !== 'object') return [];\n const p = props as Record<string, unknown>;\n return IMAGE_SOURCE_FIELDS.filter((f) => {\n const v = p[f];\n return typeof v === 'string' && v.trim().length > 0;\n });\n}\n\n/**\n * Collect \"more than one image source\" conflicts anywhere in a presentation.\n */\nexport function collectImageSourceConflicts(data: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n const visit = (node: any, path: string): void => {\n if (Array.isArray(node)) {\n node.forEach((item, i) => visit(item, `${path}/${i}`));\n return;\n }\n if (!node || typeof node !== 'object') return;\n\n if (node.name === 'image') {\n const present = presentImageSources(node.props);\n if (present.length > 1) {\n errors.push({\n path: `${path}/props`,\n message: `Image component accepts only one source, but found ${present\n .map((f) => `\"${f}\"`)\n .join(', ')}. Use exactly one of \"path\", \"base64\", or \"svg\".`,\n code: 'mutually_exclusive',\n });\n }\n }\n\n for (const key of Object.keys(node)) {\n visit(node[key], `${path}/${key}`);\n }\n };\n\n visit(data, '');\n return errors;\n}\n","/**\n * Text content conflict detection (PPTX)\n *\n * `text` and `runs` are mutually exclusive on the text component, but both are\n * optional fields on a single object schema — so a payload carrying both (or\n * neither) passes the structural check and would otherwise be silently resolved\n * by runtime precedence. This walk runs unconditionally during validation and\n * rejects such payloads. It traverses every nested value, so text components\n * inside slides, placeholders, and template objects are all covered.\n *\n * Placeholder `defaults` stubs are exempt from the \"neither\" rule: they carry\n * styling defaults only, and the actual content arrives with the component\n * placed in the placeholder.\n */\n\nimport type { ValidationError } from '@json-to-office/shared';\n\n/**\n * Collect `text`/`runs` mutual-exclusivity conflicts anywhere in a presentation.\n */\nexport function collectTextContentConflicts(data: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n const visit = (node: any, path: string, parentKey: string): void => {\n if (Array.isArray(node)) {\n node.forEach((item, i) => visit(item, `${path}/${i}`, parentKey));\n return;\n }\n if (!node || typeof node !== 'object') return;\n\n if (node.name === 'text' && node.props && typeof node.props === 'object') {\n const hasText = typeof node.props.text === 'string';\n const hasRuns = Array.isArray(node.props.runs);\n if (hasText && hasRuns) {\n errors.push({\n path: `${path}/props`,\n message:\n 'Text component accepts either \"text\" or \"runs\", not both. Use exactly one of the two.',\n code: 'mutually_exclusive',\n });\n } else if (!hasText && !hasRuns && parentKey !== 'defaults') {\n errors.push({\n path: `${path}/props`,\n message:\n 'Text component requires content: set either \"text\" or \"runs\".',\n code: 'required_property',\n });\n }\n }\n\n for (const key of Object.keys(node)) {\n visit(node[key], `${path}/${key}`, key);\n }\n };\n\n visit(data, '', '');\n return errors;\n}\n","/**\n * Unified validation facade for PPTX.\n *\n * Mirrors the shared-docx `validate` / `validateStrict` API surface the CLI\n * consumes, so `jto pptx validate` gets real schema validation instead of the\n * historical unconditional pass.\n */\n\nimport { Value } from '@sinclair/typebox/value';\nimport type { ValidationError } from '@json-to-office/shared';\nimport { transformValueErrors } from '@json-to-office/shared';\nimport { ThemeConfigSchema } from '../../schemas/theme';\nimport { collectImageSourceConflicts } from '../image-source-conflicts';\nimport { collectTextContentConflicts } from '../text-content-conflicts';\nimport {\n comprehensiveValidatePresentation,\n type DeepValidateOptions,\n} from './deep-validator';\n\nexport {\n deepValidatePresentation,\n comprehensiveValidatePresentation,\n} from './deep-validator';\nexport type { DeepValidateOptions } from './deep-validator';\n\nexport interface PptxValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings?: ValidationError[];\n documentType?: 'pptx';\n data?: unknown;\n}\n\nfunction parseJsonInput(jsonInput: string | object): {\n parsed?: unknown;\n error?: ValidationError;\n} {\n if (typeof jsonInput !== 'string') return { parsed: jsonInput };\n try {\n return { parsed: JSON.parse(jsonInput) };\n } catch (err: any) {\n return {\n error: {\n path: 'root',\n message: `Invalid JSON: ${err?.message ?? String(err)}`,\n code: 'json_parse_error',\n },\n };\n }\n}\n\n/**\n * Validate a presentation component tree.\n *\n * The deep walk is the source of truth: it re-implements everything the\n * recursive discriminated union checks (component names, per-component props\n * schemas, container narrowing) with precise paths, so we run it directly\n * instead of the union check whose failures collapse into a generic root\n * error. Image-source mutual exclusivity is a semantic rule the structural\n * schema cannot express, so it runs unconditionally on top.\n */\nexport function validatePresentationDocument(\n data: unknown,\n opts: DeepValidateOptions = {}\n): PptxValidationResult {\n const errors = comprehensiveValidatePresentation(data, [], opts);\n errors.push(...collectImageSourceConflicts(data));\n errors.push(...collectTextContentConflicts(data));\n const valid = errors.length === 0;\n return {\n valid,\n errors,\n documentType: 'pptx',\n data: valid ? data : undefined,\n };\n}\n\n/**\n * Validate a presentation from a JSON string or object.\n */\nexport function validateJsonPresentationDocument(\n jsonInput: string | object,\n opts: DeepValidateOptions = {}\n): PptxValidationResult {\n const { parsed, error } = parseJsonInput(jsonInput);\n if (error) return { valid: false, errors: [error], documentType: 'pptx' };\n return validatePresentationDocument(parsed, opts);\n}\n\n/**\n * Validate a PPTX theme config.\n */\nexport function validatePptxTheme(data: unknown): PptxValidationResult {\n if (Value.Check(ThemeConfigSchema, data)) {\n return { valid: true, errors: [], data };\n }\n const valueErrors = [...Value.Errors(ThemeConfigSchema, data)];\n const errors = transformValueErrors(valueErrors, { maxErrors: 100 });\n return { valid: false, errors };\n}\n\n/**\n * Validate a PPTX theme from a JSON string or object.\n */\nexport function validateJsonPptxTheme(\n jsonInput: string | object\n): PptxValidationResult {\n const { parsed, error } = parseJsonInput(jsonInput);\n if (error) return { valid: false, errors: [error] };\n return validatePptxTheme(parsed);\n}\n\n/**\n * Simple validation API — the entry point the CLI consumes.\n */\nexport const validate = {\n document: (data: unknown) => validatePresentationDocument(data),\n jsonDocument: (jsonInput: string | object) =>\n validateJsonPresentationDocument(jsonInput),\n theme: (data: unknown) => validatePptxTheme(data),\n jsonTheme: (jsonInput: string | object) => validateJsonPptxTheme(jsonInput),\n isDocument: (data: unknown) => validatePresentationDocument(data).valid,\n isTheme: (data: unknown) => validatePptxTheme(data).valid,\n};\n\n/**\n * Strict validation API. PPTX deep validation never cleans or applies\n * defaults, so this is currently an alias kept for docx API parity — the CLI\n * picks one of the two based on its --strict flag.\n */\nexport const validateStrict = {\n document: (data: unknown) => validatePresentationDocument(data),\n jsonDocument: (jsonInput: string | object) =>\n validateJsonPresentationDocument(jsonInput),\n theme: (data: unknown) => validatePptxTheme(data),\n jsonTheme: (jsonInput: string | object) => validateJsonPptxTheme(jsonInput),\n};\n","/**\n * Deep validation utilities for collecting ALL errors in nested structures.\n *\n * Mirrors the docx deep validator: the recursive discriminated union\n * (PptxComponentDefinitionSchema) short-circuits on the first mismatch and\n * collapses failures into a generic root error, so this walk visits every\n * component in the tree and validates its props against the real per-component\n * schema, producing precise, path-aware errors.\n */\n\nimport { Value } from '@sinclair/typebox/value';\nimport type { TSchema } from '@sinclair/typebox';\nimport type { ValidationError } from '@json-to-office/shared';\nimport { transformValueErrors } from '@json-to-office/shared';\nimport {\n PPTX_STANDARD_COMPONENTS_REGISTRY,\n getPptxStandardComponent,\n} from '../../schemas/component-registry';\n\n// Map of component names to their props schemas, sourced from the registry.\n// This stays in sync as new standard components are added, so the presentation\n// root ('pptx') and every standard child component are recognized here.\nconst COMPONENT_SCHEMAS: Record<string, TSchema> = Object.fromEntries(\n PPTX_STANDARD_COMPONENTS_REGISTRY.map((c) => [c.name, c.propsSchema])\n);\n\n// Root component names that may appear at the top of a presentation.\nconst ROOT_COMPONENT_NAMES = new Set(\n PPTX_STANDARD_COMPONENTS_REGISTRY.filter((c) =>\n Boolean(c.special?.hasSchemaField)\n ).map((c) => c.name)\n);\n\n// Top-level keys allowed on a component object. The recursive union enforces\n// this via additionalProperties:false; the walk re-checks it so a typo like\n// \"porps\" is reported at a precise path instead of a generic union failure.\nconst COMPONENT_OBJECT_KEYS = new Set([\n 'name',\n 'id',\n 'enabled',\n 'props',\n 'children',\n]);\nconst CUSTOM_COMPONENT_OBJECT_KEYS = new Set([\n ...COMPONENT_OBJECT_KEYS,\n 'version',\n]);\nconst ROOT_OBJECT_KEYS = new Set([...COMPONENT_OBJECT_KEYS, '$schema']);\n\n/**\n * Options that tune deep validation.\n *\n * `knownCustomNames` — names of registered plugin components. The deep\n * validator neither flags these as \"unknown component\" nor validates their\n * props here; the plugin layer validates custom props separately.\n *\n * `allowUnknownFields` — when true, unknown properties are stripped before the\n * per-component check instead of being rejected. The escape hatch for callers\n * migrating onto strict schemas.\n */\nexport interface DeepValidateOptions {\n knownCustomNames?: Set<string>;\n allowUnknownFields?: boolean;\n}\n\n/**\n * Deep validate a presentation to collect ALL errors, not just union-level errors.\n */\nexport function deepValidatePresentation(\n data: any,\n opts: DeepValidateOptions = {}\n): ValidationError[] {\n const allErrors: ValidationError[] = [];\n\n if (!data || typeof data !== 'object') {\n allErrors.push({\n path: 'root',\n message: 'Presentation must be an object',\n code: 'invalid_type',\n });\n return allErrors;\n }\n\n if (!data.name) {\n allErrors.push({\n path: '/name',\n message: 'Missing required field \"name\"',\n code: 'required_property',\n });\n } else if (!ROOT_COMPONENT_NAMES.has(data.name)) {\n const expected = [...ROOT_COMPONENT_NAMES].map((n) => `\"${n}\"`).join(', ');\n allErrors.push({\n path: '/name',\n message: `Invalid name \"${data.name}\". Expected ${expected}`,\n code: 'invalid_value',\n });\n }\n\n for (const key of Object.keys(data)) {\n if (!ROOT_OBJECT_KEYS.has(key)) {\n allErrors.push({\n path: `/${key}`,\n message: `Unknown field \"${key}\" on the root component`,\n code: 'unknown_field',\n });\n }\n }\n\n // Validate props when the key is present so explicit `null` (or any falsy\n // non-object) is checked against the component's schema instead of silently\n // passing.\n if (!('props' in data)) {\n allErrors.push({\n path: '/props',\n message: 'Missing required field \"props\"',\n code: 'required_property',\n });\n } else if (ROOT_COMPONENT_NAMES.has(data.name)) {\n allErrors.push(\n ...validateComponentProps(data.name, data.props, '/props', opts)\n );\n }\n\n // The root requires a children array (the slides); nested containers may\n // legitimately omit theirs.\n if (!data.children) {\n allErrors.push({\n path: '/children',\n message: 'Missing required field \"children\"',\n code: 'required_property',\n });\n } else if (!Array.isArray(data.children)) {\n allErrors.push({\n path: '/children',\n message: 'Field \"children\" must be an array',\n code: 'invalid_type',\n });\n }\n\n walkComponentTree(data, '', opts, allErrors);\n\n return allErrors;\n}\n\n/**\n * Recursively validate every component nested under `node`.\n *\n * Walks two kinds of child position to any depth:\n * - the `children` array — `pptx` holds slides, `slide` holds content\n * components. The registry's `allowedChildren` narrows what each container\n * accepts, and leaf components must not carry children at all; and\n * - a slide's `props.placeholders` record — added dynamically by the\n * component registry on top of the static SlidePropsSchema, so its values\n * are not covered by the slide's own props validation and this walk is\n * their only checker.\n *\n * The node's own props are NOT validated here — the caller validates the root\n * props, and every entry is validated as it is visited.\n */\nfunction walkComponentTree(\n node: any,\n path: string,\n opts: DeepValidateOptions,\n errors: ValidationError[]\n): void {\n if (!node || typeof node !== 'object') return;\n\n const validateEntry = (child: any, childPath: string): void => {\n if (!child || typeof child !== 'object' || Array.isArray(child)) {\n errors.push({\n path: childPath,\n message: 'Component must be an object',\n code: 'invalid_type',\n });\n return;\n }\n if (typeof child.name !== 'string' || child.name.length === 0) {\n errors.push({\n path: `${childPath}/name`,\n message: 'Component missing required field \"name\"',\n code: 'required_property',\n });\n return;\n }\n\n // Registered plugin props are validated version-aware by the plugin layer.\n // Their children still need walking: custom containers may hold authored\n // standard components, and those must obey the same prop/tree contract as\n // standard components elsewhere in the presentation.\n const isCustomComponent = opts.knownCustomNames?.has(child.name) ?? false;\n const allowedObjectKeys = isCustomComponent\n ? CUSTOM_COMPONENT_OBJECT_KEYS\n : COMPONENT_OBJECT_KEYS;\n\n for (const key of Object.keys(child)) {\n if (!allowedObjectKeys.has(key)) {\n errors.push({\n path: `${childPath}/${key}`,\n message: `Unknown field \"${key}\" on component \"${child.name}\"`,\n code: 'unknown_field',\n });\n }\n }\n\n if (isCustomComponent) {\n walkComponentTree(child, childPath, opts, errors);\n return;\n }\n\n // Validate props against the component's schema. When props is omitted,\n // validate an empty object so the schema decides whether props are\n // required (e.g. `slide` needs none; `text` requires text).\n const propsPath = `${childPath}/props`;\n if (child.props != null) {\n errors.push(\n ...validateComponentProps(child.name, child.props, propsPath, opts)\n );\n } else {\n errors.push(...validateComponentProps(child.name, {}, propsPath, opts));\n }\n\n const def = getPptxStandardComponent(child.name);\n if (def && !def.hasChildren && child.children != null) {\n errors.push({\n path: `${childPath}/children`,\n message: `Component \"${child.name}\" does not accept children`,\n code: 'invalid_value',\n });\n return;\n }\n\n // Recurse so arbitrarily nested containers are covered.\n walkComponentTree(child, childPath, opts, errors);\n };\n\n const parentDef = getPptxStandardComponent(node.name);\n\n // A slide's `placeholders` record maps placeholder names to full components\n // ({ \"title\": { \"name\": \"text\", ... } }). The static SlidePropsSchema does\n // not include the field (it is injected with the recursive ref at schema\n // generation time), so validateComponentProps strips it before checking the\n // slide's own props — each value is validated here instead.\n if (node.name === 'slide' && node.props && typeof node.props === 'object') {\n const placeholders = node.props.placeholders;\n if (\n placeholders &&\n typeof placeholders === 'object' &&\n !Array.isArray(placeholders)\n ) {\n for (const [key, child] of Object.entries(placeholders)) {\n validateEntry(child, `${path}/props/placeholders/${key}`);\n }\n } else if (placeholders != null) {\n errors.push({\n path: `${path}/props/placeholders`,\n message:\n 'Field \"placeholders\" must be an object mapping placeholder names to components',\n code: 'invalid_type',\n });\n }\n }\n\n if (Array.isArray(node.children)) {\n node.children.forEach((child: any, i: number) => {\n const childPath = `${path}/children/${i}`;\n // Enforce the registry's container narrowing (pptx → slide,\n // slide → content) for known components; unknown names are already\n // reported by validateComponentProps inside validateEntry.\n if (\n parentDef?.allowedChildren &&\n child &&\n typeof child === 'object' &&\n typeof child.name === 'string' &&\n getPptxStandardComponent(child.name) &&\n !parentDef.allowedChildren.includes(child.name)\n ) {\n const expected = parentDef.allowedChildren\n .map((n) => `\"${n}\"`)\n .join(', ');\n errors.push({\n path: `${childPath}/name`,\n message: `Component \"${child.name}\" is not allowed inside \"${node.name}\". Expected ${expected}`,\n code: 'invalid_value',\n });\n }\n validateEntry(child, childPath);\n });\n } else if (node.children != null && path !== '') {\n // `children` is present but not an array on a nested container. The root's\n // `children` is already checked by deepValidatePresentation (skipped here\n // via `path !== ''` so it is not reported twice).\n errors.push({\n path: `${path}/children`,\n message: 'Field \"children\" must be an array',\n code: 'invalid_type',\n });\n }\n}\n\n/**\n * Validate a component's props against its schema.\n */\nfunction validateComponentProps(\n componentName: string,\n props: any,\n basePath: string,\n opts: DeepValidateOptions = {}\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n const schema = COMPONENT_SCHEMAS[componentName];\n if (!schema) {\n // Unknown component type. `basePath` always ends in `/props`; anchor the\n // swap to the end so a nested path like `…/props/placeholders/title/props`\n // becomes `…/props/placeholders/title/name` rather than mangling an\n // earlier `/props`.\n errors.push({\n path: basePath.replace(/\\/props$/, '/name'),\n message: `Unknown component \"${componentName}\"`,\n code: 'unknown_component',\n });\n return errors;\n }\n\n // A slide's `placeholders` field is injected at schema-generation time and\n // absent from the static props schema; its values are walked separately, so\n // strip it here to avoid a false additionalProperties rejection.\n let toCheck = props;\n if (\n componentName === 'slide' &&\n props &&\n typeof props === 'object' &&\n 'placeholders' in props\n ) {\n const rest = { ...props };\n delete rest.placeholders;\n toCheck = rest;\n }\n\n // When unknown fields are explicitly allowed, strip them before checking so\n // additionalProperties:false no longer rejects — required/typed fields are\n // still enforced.\n if (opts.allowUnknownFields) {\n toCheck = Value.Clean(schema, Value.Clone(toCheck));\n }\n\n if (!Value.Check(schema, toCheck)) {\n const valueErrors = [...Value.Errors(schema, toCheck)];\n const transformedErrors = transformValueErrors(valueErrors, {\n maxErrors: 100,\n });\n\n // Adjust paths to be relative to the document root\n transformedErrors.forEach((error) => {\n const fullPath =\n error.path === 'root'\n ? basePath\n : `${basePath}${error.path.startsWith('/') ? error.path : '/' + error.path}`;\n\n errors.push({\n ...error,\n path: fullPath,\n });\n });\n }\n\n return errors;\n}\n\n/**\n * Combine deep validation with standard validation.\n *\n * Deep validation produces precise, path-aware errors. TypeBox's discriminated-\n * union check, by contrast, often collapses any failure under the root into a\n * single generic \"Invalid component configuration for 'pptx'\" message at\n * `root` — useful as a signal that something is wrong, but actionable only via\n * the deep-validator's output. We always strip that catch-all so it doesn't\n * appear alongside (or, worse, instead of) the real diagnostics.\n */\nexport function comprehensiveValidatePresentation(\n data: any,\n existingErrors: ValidationError[] = [],\n opts: DeepValidateOptions = {}\n): ValidationError[] {\n const deepErrors = deepValidatePresentation(data, opts);\n\n const filteredExisting = existingErrors.filter(\n (e) => !isGenericUnionCatchAll(e)\n );\n\n return deduplicateErrors([...filteredExisting, ...deepErrors]);\n}\n\n/**\n * Detect TypeBox's generic union/discriminator catch-all error at the document\n * root. These messages name the component type ('pptx') but give no actionable\n * detail — the deep validator emits the actual path-level errors instead.\n */\nfunction isGenericUnionCatchAll(error: ValidationError): boolean {\n const atRoot = !error.path || error.path === 'root' || error.path === '/';\n if (!atRoot) return false;\n const msg = error.message || '';\n return (\n /invalid component configurations?/i.test(msg) ||\n /invalid document structure/i.test(msg)\n );\n}\n\n/**\n * Deduplicate errors by path and message.\n */\nfunction deduplicateErrors(errors: ValidationError[]): ValidationError[] {\n const seen = new Set<string>();\n const unique: ValidationError[] = [];\n\n for (const error of errors) {\n const key = `${error.path}:${error.message}`;\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(error);\n }\n }\n\n return unique;\n}\n","export const PPTX_SHARED_VERSION = '1.0.0';\n\n// Component Schemas\nexport {\n PositionSchema,\n SlideBackgroundSchema,\n TransitionSchema,\n VerticalAlignmentSchema,\n ShadowSchema,\n PresentationPropsSchema,\n SlidePropsSchema,\n TextPropsSchema,\n TextRunSchema,\n PptxImagePropsSchema,\n ShapePropsSchema,\n ShapeTypeSchema,\n GradientStopSchema,\n GradientFillSchema,\n PatternFillSchema,\n PATTERN_FILL_PRESETS,\n PptxTablePropsSchema,\n PptxHighchartsPropsSchema,\n PptxStandardComponentDefinitionSchema,\n PptxComponentDefinitionSchema,\n PptxSlideContentSchema,\n} from './schemas/components';\n\nexport type {\n Position,\n SlideBackground,\n Transition,\n VerticalAlignment,\n Shadow,\n PresentationProps,\n SlideProps,\n TextProps,\n TextRun,\n PptxImageProps,\n ShapeType,\n ShapeProps,\n TextSegment,\n GradientStop,\n GradientFill,\n PatternFill,\n PptxTableProps,\n PptxHighchartsProps,\n PptxComponentDefinition,\n PptxSlideContent,\n} from './schemas/components';\n\n// Chart (not re-exported from components barrel)\nexport { PptxChartPropsSchema } from './schemas/components/chart';\nexport type { PptxChartProps } from './schemas/components/chart';\n\n// Component Registry\nexport {\n PPTX_STANDARD_COMPONENTS_REGISTRY,\n getPptxStandardComponent,\n getAllPptxComponentNames,\n getPptxComponentsByCategory,\n getPptxContainerComponents,\n getPptxContentComponents,\n isPptxStandardComponent,\n createPptxComponentSchemaObject,\n createAllPptxComponentSchemas,\n} from './schemas/component-registry';\n\nexport type { PptxStandardComponentDefinition } from './schemas/component-registry';\n\n// Document Schema\nexport {\n PptxJsonComponentDefinitionSchema,\n PPTX_JSON_SCHEMA_URLS,\n} from './schemas/document';\n\nexport type { PptxJsonComponentDefinition } from './schemas/document';\n\n// Schema Export Metadata\nexport {\n PPTX_COMPONENT_METADATA,\n PPTX_BASE_SCHEMA_METADATA,\n} from './schemas/export';\n\n// Component Defaults\nexport {\n PptxComponentDefaultsSchema,\n TextComponentDefaultsSchema,\n ImageComponentDefaultsSchema,\n ShapeComponentDefaultsSchema,\n TableComponentDefaultsSchema,\n HighchartsComponentDefaultsSchema,\n ChartComponentDefaultsSchema,\n} from './schemas/component-defaults';\nexport type {\n PptxComponentDefaults,\n TextComponentDefaults,\n ImageComponentDefaults,\n ShapeComponentDefaults,\n TableComponentDefaults,\n HighchartsComponentDefaults,\n ChartComponentDefaults,\n} from './schemas/component-defaults';\n\n// Theme\nexport {\n ThemeConfigSchema,\n ColorValueSchema,\n SEMANTIC_COLOR_NAMES,\n SEMANTIC_COLOR_ALIASES,\n STYLE_NAMES,\n StyleNameSchema,\n TextStyleSchema,\n isValidThemeConfig,\n} from './schemas/theme';\nexport type { ThemeConfigJson, StyleName, TextStyle } from './schemas/theme';\n\n// Schema Generator\nexport { generateUnifiedDocumentSchema } from './schemas/generator';\nexport type {\n VersionedPropsEntry,\n CustomComponentInfo,\n GenerateSchemaOptions,\n} from './schemas/generator';\n\n// Types\nexport type { ReportComponent } from './types/components';\n\n// Image source conflict detection (path/base64/svg mutual exclusivity)\nexport {\n collectImageSourceConflicts,\n presentImageSources,\n} from './validation/image-source-conflicts';\n\n// Text content conflict detection (text/runs mutual exclusivity)\nexport { collectTextContentConflicts } from './validation/text-content-conflicts';\n\n// Unified validation facade (deep, path-aware validation of whole presentations\n// and themes) — the API the CLI's `pptx validate` consumes.\nexport {\n validate,\n validateStrict,\n validatePresentationDocument,\n validateJsonPresentationDocument,\n validatePptxTheme,\n validateJsonPptxTheme,\n deepValidatePresentation,\n comprehensiveValidatePresentation,\n} from './validation/unified';\nexport type {\n PptxValidationResult,\n DeepValidateOptions,\n} from './validation/unified';\n\n// Re-export shared validation utilities for convenience\nexport {\n transformValueError,\n transformValueErrors,\n DEFAULT_ERROR_CONFIG,\n createErrorConfig,\n} from '@json-to-office/shared';\n\nexport type {\n ErrorFormatterConfig,\n ValidationError,\n} from '@json-to-office/shared';\n\n// Re-export shared utilities\nexport {\n latestVersion,\n isValidSemver,\n parseSemver,\n compareSemver,\n} from '@json-to-office/shared';\nexport type { ParsedSemver } from '@json-to-office/shared';\n\n// Re-export schema utils\nexport {\n fixSchemaReferences,\n convertToJsonSchema,\n createComponentSchema,\n exportSchemaToFile,\n} from '@json-to-office/shared';\nexport type { ComponentSchemaConfig } from '@json-to-office/shared';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,IAAM,sBAAsB,CAAC,QAAQ,UAAU,KAAK;AAK7C,SAAS,oBAAoB,OAA0B;AAC5D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AACjD,QAAM,IAAI;AACV,SAAO,oBAAoB,OAAO,CAAC,MAAM;AACvC,UAAM,IAAI,EAAE,CAAC;AACb,WAAO,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE,SAAS;AAAA,EACpD,CAAC;AACH;AAKO,SAAS,4BAA4B,MAAkC;AAC5E,QAAM,SAA4B,CAAC;AAEnC,QAAM,QAAQ,CAAC,MAAW,SAAuB;AAC/C,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAK,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AACrD;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AAEvC,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,UAAU,oBAAoB,KAAK,KAAK;AAC9C,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS,sDAAsD,QAC5D,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EACnB,KAAK,IAAI,CAAC;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,YAAM,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,MAAM,EAAE;AACd,SAAO;AACT;;;AC1CO,SAAS,4BAA4B,MAAkC;AAC5E,QAAM,SAA4B,CAAC;AAEnC,QAAM,QAAQ,CAAC,MAAW,MAAc,cAA4B;AAClE,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAK,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,SAAS,CAAC;AAChE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AAEvC,QAAI,KAAK,SAAS,UAAU,KAAK,SAAS,OAAO,KAAK,UAAU,UAAU;AACxE,YAAM,UAAU,OAAO,KAAK,MAAM,SAAS;AAC3C,YAAM,UAAU,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7C,UAAI,WAAW,SAAS;AACtB,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SACE;AAAA,UACF,MAAM;AAAA,QACR,CAAC;AAAA,MACH,WAAW,CAAC,WAAW,CAAC,WAAW,cAAc,YAAY;AAC3D,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SACE;AAAA,UACF,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,YAAM,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,MAAM,IAAI,EAAE;AAClB,SAAO;AACT;;;ACjDA,SAAS,SAAAA,cAAa;AAEtB,SAAS,wBAAAC,6BAA4B;;;ACArC,SAAS,aAAa;AAGtB,SAAS,4BAA4B;AASrC,IAAM,oBAA6C,OAAO;AAAA,EACxD,kCAAkC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC;AACtE;AAGA,IAAM,uBAAuB,IAAI;AAAA,EAC/B,kCAAkC;AAAA,IAAO,CAAC,MACxC,QAAQ,EAAE,SAAS,cAAc;AAAA,EACnC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACrB;AAKA,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,+BAA+B,oBAAI,IAAI;AAAA,EAC3C,GAAG;AAAA,EACH;AACF,CAAC;AACD,IAAM,mBAAmB,oBAAI,IAAI,CAAC,GAAG,uBAAuB,SAAS,CAAC;AAqB/D,SAAS,yBACd,MACA,OAA4B,CAAC,GACV;AACnB,QAAM,YAA+B,CAAC;AAEtC,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,MAAM;AACd,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH,WAAW,CAAC,qBAAqB,IAAI,KAAK,IAAI,GAAG;AAC/C,UAAM,WAAW,CAAC,GAAG,oBAAoB,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACzE,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS,iBAAiB,KAAK,IAAI,eAAe,QAAQ;AAAA,MAC1D,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,aAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,QAAI,CAAC,iBAAiB,IAAI,GAAG,GAAG;AAC9B,gBAAU,KAAK;AAAA,QACb,MAAM,IAAI,GAAG;AAAA,QACb,SAAS,kBAAkB,GAAG;AAAA,QAC9B,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAKA,MAAI,EAAE,WAAW,OAAO;AACtB,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH,WAAW,qBAAqB,IAAI,KAAK,IAAI,GAAG;AAC9C,cAAU;AAAA,MACR,GAAG,uBAAuB,KAAK,MAAM,KAAK,OAAO,UAAU,IAAI;AAAA,IACjE;AAAA,EACF;AAIA,MAAI,CAAC,KAAK,UAAU;AAClB,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH,WAAW,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACxC,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,oBAAkB,MAAM,IAAI,MAAM,SAAS;AAE3C,SAAO;AACT;AAiBA,SAAS,kBACP,MACA,MACA,MACA,QACM;AACN,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AAEvC,QAAM,gBAAgB,CAAC,OAAY,cAA4B;AAC7D,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD;AAAA,IACF;AACA,QAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,GAAG;AAC7D,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,SAAS;AAAA,QAClB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD;AAAA,IACF;AAMA,UAAM,oBAAoB,KAAK,kBAAkB,IAAI,MAAM,IAAI,KAAK;AACpE,UAAM,oBAAoB,oBACtB,+BACA;AAEJ,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,UAAI,CAAC,kBAAkB,IAAI,GAAG,GAAG;AAC/B,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,SAAS,IAAI,GAAG;AAAA,UACzB,SAAS,kBAAkB,GAAG,mBAAmB,MAAM,IAAI;AAAA,UAC3D,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,mBAAmB;AACrB,wBAAkB,OAAO,WAAW,MAAM,MAAM;AAChD;AAAA,IACF;AAKA,UAAM,YAAY,GAAG,SAAS;AAC9B,QAAI,MAAM,SAAS,MAAM;AACvB,aAAO;AAAA,QACL,GAAG,uBAAuB,MAAM,MAAM,MAAM,OAAO,WAAW,IAAI;AAAA,MACpE;AAAA,IACF,OAAO;AACL,aAAO,KAAK,GAAG,uBAAuB,MAAM,MAAM,CAAC,GAAG,WAAW,IAAI,CAAC;AAAA,IACxE;AAEA,UAAM,MAAM,yBAAyB,MAAM,IAAI;AAC/C,QAAI,OAAO,CAAC,IAAI,eAAe,MAAM,YAAY,MAAM;AACrD,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,SAAS;AAAA,QAClB,SAAS,cAAc,MAAM,IAAI;AAAA,QACjC,MAAM;AAAA,MACR,CAAC;AACD;AAAA,IACF;AAGA,sBAAkB,OAAO,WAAW,MAAM,MAAM;AAAA,EAClD;AAEA,QAAM,YAAY,yBAAyB,KAAK,IAAI;AAOpD,MAAI,KAAK,SAAS,WAAW,KAAK,SAAS,OAAO,KAAK,UAAU,UAAU;AACzE,UAAM,eAAe,KAAK,MAAM;AAChC,QACE,gBACA,OAAO,iBAAiB,YACxB,CAAC,MAAM,QAAQ,YAAY,GAC3B;AACA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,sBAAc,OAAO,GAAG,IAAI,uBAAuB,GAAG,EAAE;AAAA,MAC1D;AAAA,IACF,WAAW,gBAAgB,MAAM;AAC/B,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SACE;AAAA,QACF,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAChC,SAAK,SAAS,QAAQ,CAAC,OAAY,MAAc;AAC/C,YAAM,YAAY,GAAG,IAAI,aAAa,CAAC;AAIvC,UACE,WAAW,mBACX,SACA,OAAO,UAAU,YACjB,OAAO,MAAM,SAAS,YACtB,yBAAyB,MAAM,IAAI,KACnC,CAAC,UAAU,gBAAgB,SAAS,MAAM,IAAI,GAC9C;AACA,cAAM,WAAW,UAAU,gBACxB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EACnB,KAAK,IAAI;AACZ,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,SAAS;AAAA,UAClB,SAAS,cAAc,MAAM,IAAI,4BAA4B,KAAK,IAAI,eAAe,QAAQ;AAAA,UAC7F,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,oBAAc,OAAO,SAAS;AAAA,IAChC,CAAC;AAAA,EACH,WAAW,KAAK,YAAY,QAAQ,SAAS,IAAI;AAI/C,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAKA,SAAS,uBACP,eACA,OACA,UACA,OAA4B,CAAC,GACV;AACnB,QAAM,SAA4B,CAAC;AAEnC,QAAM,SAAS,kBAAkB,aAAa;AAC9C,MAAI,CAAC,QAAQ;AAKX,WAAO,KAAK;AAAA,MACV,MAAM,SAAS,QAAQ,YAAY,OAAO;AAAA,MAC1C,SAAS,sBAAsB,aAAa;AAAA,MAC5C,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,EACT;AAKA,MAAI,UAAU;AACd,MACE,kBAAkB,WAClB,SACA,OAAO,UAAU,YACjB,kBAAkB,OAClB;AACA,UAAM,OAAO,EAAE,GAAG,MAAM;AACxB,WAAO,KAAK;AACZ,cAAU;AAAA,EACZ;AAKA,MAAI,KAAK,oBAAoB;AAC3B,cAAU,MAAM,MAAM,QAAQ,MAAM,MAAM,OAAO,CAAC;AAAA,EACpD;AAEA,MAAI,CAAC,MAAM,MAAM,QAAQ,OAAO,GAAG;AACjC,UAAM,cAAc,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,CAAC;AACrD,UAAM,oBAAoB,qBAAqB,aAAa;AAAA,MAC1D,WAAW;AAAA,IACb,CAAC;AAGD,sBAAkB,QAAQ,CAAC,UAAU;AACnC,YAAM,WACJ,MAAM,SAAS,SACX,WACA,GAAG,QAAQ,GAAG,MAAM,KAAK,WAAW,GAAG,IAAI,MAAM,OAAO,MAAM,MAAM,IAAI;AAE9E,aAAO,KAAK;AAAA,QACV,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAYO,SAAS,kCACd,MACA,iBAAoC,CAAC,GACrC,OAA4B,CAAC,GACV;AACnB,QAAM,aAAa,yBAAyB,MAAM,IAAI;AAEtD,QAAM,mBAAmB,eAAe;AAAA,IACtC,CAAC,MAAM,CAAC,uBAAuB,CAAC;AAAA,EAClC;AAEA,SAAO,kBAAkB,CAAC,GAAG,kBAAkB,GAAG,UAAU,CAAC;AAC/D;AAOA,SAAS,uBAAuB,OAAiC;AAC/D,QAAM,SAAS,CAAC,MAAM,QAAQ,MAAM,SAAS,UAAU,MAAM,SAAS;AACtE,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,MAAM,MAAM,WAAW;AAC7B,SACE,qCAAqC,KAAK,GAAG,KAC7C,8BAA8B,KAAK,GAAG;AAE1C;AAKA,SAAS,kBAAkB,QAA8C;AACvE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAA4B,CAAC;AAEnC,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO;AAC1C,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,GAAG;AACZ,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;;;ADvYA,SAAS,eAAe,WAGtB;AACA,MAAI,OAAO,cAAc,SAAU,QAAO,EAAE,QAAQ,UAAU;AAC9D,MAAI;AACF,WAAO,EAAE,QAAQ,KAAK,MAAM,SAAS,EAAE;AAAA,EACzC,SAAS,KAAU;AACjB,WAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,iBAAiB,KAAK,WAAW,OAAO,GAAG,CAAC;AAAA,QACrD,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,6BACd,MACA,OAA4B,CAAC,GACP;AACtB,QAAM,SAAS,kCAAkC,MAAM,CAAC,GAAG,IAAI;AAC/D,SAAO,KAAK,GAAG,4BAA4B,IAAI,CAAC;AAChD,SAAO,KAAK,GAAG,4BAA4B,IAAI,CAAC;AAChD,QAAM,QAAQ,OAAO,WAAW;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,MAAM,QAAQ,OAAO;AAAA,EACvB;AACF;AAKO,SAAS,iCACd,WACA,OAA4B,CAAC,GACP;AACtB,QAAM,EAAE,QAAQ,MAAM,IAAI,eAAe,SAAS;AAClD,MAAI,MAAO,QAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,KAAK,GAAG,cAAc,OAAO;AACxE,SAAO,6BAA6B,QAAQ,IAAI;AAClD;AAKO,SAAS,kBAAkB,MAAqC;AACrE,MAAIC,OAAM,MAAM,mBAAmB,IAAI,GAAG;AACxC,WAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,KAAK;AAAA,EACzC;AACA,QAAM,cAAc,CAAC,GAAGA,OAAM,OAAO,mBAAmB,IAAI,CAAC;AAC7D,QAAM,SAASC,sBAAqB,aAAa,EAAE,WAAW,IAAI,CAAC;AACnE,SAAO,EAAE,OAAO,OAAO,OAAO;AAChC;AAKO,SAAS,sBACd,WACsB;AACtB,QAAM,EAAE,QAAQ,MAAM,IAAI,eAAe,SAAS;AAClD,MAAI,MAAO,QAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,KAAK,EAAE;AAClD,SAAO,kBAAkB,MAAM;AACjC;AAKO,IAAM,WAAW;AAAA,EACtB,UAAU,CAAC,SAAkB,6BAA6B,IAAI;AAAA,EAC9D,cAAc,CAAC,cACb,iCAAiC,SAAS;AAAA,EAC5C,OAAO,CAAC,SAAkB,kBAAkB,IAAI;AAAA,EAChD,WAAW,CAAC,cAA+B,sBAAsB,SAAS;AAAA,EAC1E,YAAY,CAAC,SAAkB,6BAA6B,IAAI,EAAE;AAAA,EAClE,SAAS,CAAC,SAAkB,kBAAkB,IAAI,EAAE;AACtD;AAOO,IAAM,iBAAiB;AAAA,EAC5B,UAAU,CAAC,SAAkB,6BAA6B,IAAI;AAAA,EAC9D,cAAc,CAAC,cACb,iCAAiC,SAAS;AAAA,EAC5C,OAAO,CAAC,SAAkB,kBAAkB,IAAI;AAAA,EAChD,WAAW,CAAC,cAA+B,sBAAsB,SAAS;AAC5E;;;AEkBA;AAAA,EACE;AAAA,EACA,wBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AArLA,IAAM,sBAAsB;","names":["Value","transformValueErrors","Value","transformValueErrors","transformValueErrors"]}
|
|
1
|
+
{"version":3,"sources":["../src/validation/image-source-conflicts.ts","../src/validation/text-content-conflicts.ts","../src/validation/unified/index.ts","../src/validation/unified/deep-validator.ts","../src/index.ts"],"sourcesContent":["/**\n * Image source conflict detection (PPTX)\n *\n * Mirrors core-docx: `path`, `base64`, and `svg` are mutually exclusive on the\n * image component, but all three are optional fields on a single object schema —\n * so a multi-source payload passes the structural check and would otherwise be\n * silently resolved by runtime precedence (svg > base64 > path). This walk runs\n * unconditionally during validation and rejects such payloads. It traverses every\n * nested value, so images inside slides, grids, containers, and table cells are\n * all covered regardless of container shape.\n */\n\nimport type { ValidationError } from '@json-to-office/shared';\n\n// Image source fields that are mutually exclusive: exactly one may be set.\nconst IMAGE_SOURCE_FIELDS = ['path', 'base64', 'svg'] as const;\n\n/**\n * Names of the image source fields that carry a non-empty value on a props object.\n */\nexport function presentImageSources(props: unknown): string[] {\n if (!props || typeof props !== 'object') return [];\n const p = props as Record<string, unknown>;\n return IMAGE_SOURCE_FIELDS.filter((f) => {\n const v = p[f];\n return typeof v === 'string' && v.trim().length > 0;\n });\n}\n\n/**\n * Collect \"more than one image source\" conflicts anywhere in a presentation.\n */\nexport function collectImageSourceConflicts(data: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n const visit = (node: any, path: string): void => {\n if (Array.isArray(node)) {\n node.forEach((item, i) => visit(item, `${path}/${i}`));\n return;\n }\n if (!node || typeof node !== 'object') return;\n\n if (node.name === 'image') {\n const present = presentImageSources(node.props);\n if (present.length > 1) {\n errors.push({\n path: `${path}/props`,\n message: `Image component accepts only one source, but found ${present\n .map((f) => `\"${f}\"`)\n .join(', ')}. Use exactly one of \"path\", \"base64\", or \"svg\".`,\n code: 'mutually_exclusive',\n });\n }\n }\n\n for (const key of Object.keys(node)) {\n visit(node[key], `${path}/${key}`);\n }\n };\n\n visit(data, '');\n return errors;\n}\n","/**\n * Text content conflict detection (PPTX)\n *\n * `text` and `runs` are mutually exclusive on the text component, but both are\n * optional fields on a single object schema — so a payload carrying both (or\n * neither) passes the structural check and would otherwise be silently resolved\n * by runtime precedence. This walk runs unconditionally during validation and\n * rejects such payloads. It traverses every nested value, so text components\n * inside slides, placeholders, and template objects are all covered.\n *\n * Placeholder `defaults` stubs are exempt from the \"neither\" rule: they carry\n * styling defaults only, and the actual content arrives with the component\n * placed in the placeholder.\n */\n\nimport type { ValidationError } from '@json-to-office/shared';\n\n/**\n * Collect `text`/`runs` mutual-exclusivity conflicts anywhere in a presentation.\n */\nexport function collectTextContentConflicts(data: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n const visit = (node: any, path: string, parentKey: string): void => {\n if (Array.isArray(node)) {\n node.forEach((item, i) => visit(item, `${path}/${i}`, parentKey));\n return;\n }\n if (!node || typeof node !== 'object') return;\n\n if (node.name === 'text' && node.props && typeof node.props === 'object') {\n const hasText = typeof node.props.text === 'string';\n const hasRuns = Array.isArray(node.props.runs);\n if (hasText && hasRuns) {\n errors.push({\n path: `${path}/props`,\n message:\n 'Text component accepts either \"text\" or \"runs\", not both. Use exactly one of the two.',\n code: 'mutually_exclusive',\n });\n } else if (!hasText && !hasRuns && parentKey !== 'defaults') {\n errors.push({\n path: `${path}/props`,\n message:\n 'Text component requires content: set either \"text\" or \"runs\".',\n code: 'required_property',\n });\n }\n }\n\n for (const key of Object.keys(node)) {\n visit(node[key], `${path}/${key}`, key);\n }\n };\n\n visit(data, '', '');\n return errors;\n}\n","/**\n * Unified validation facade for PPTX.\n *\n * Mirrors the shared-docx `validate` / `validateStrict` API surface the CLI\n * consumes, so `jto pptx validate` gets real schema validation instead of the\n * historical unconditional pass.\n */\n\nimport { Value } from '@sinclair/typebox/value';\nimport type { ValidationError } from '@json-to-office/shared';\nimport { transformValueErrors } from '@json-to-office/shared';\nimport { ThemeConfigSchema } from '../../schemas/theme';\nimport { collectImageSourceConflicts } from '../image-source-conflicts';\nimport { collectTextContentConflicts } from '../text-content-conflicts';\nimport { collectPptxRendererErrors } from '../../schemas/renderer';\nimport {\n comprehensiveValidatePresentation,\n type DeepValidateOptions,\n} from './deep-validator';\n\nexport {\n deepValidatePresentation,\n comprehensiveValidatePresentation,\n} from './deep-validator';\nexport type { DeepValidateOptions } from './deep-validator';\n\nexport interface PptxValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings?: ValidationError[];\n documentType?: 'pptx';\n data?: unknown;\n}\n\nfunction parseJsonInput(jsonInput: string | object): {\n parsed?: unknown;\n error?: ValidationError;\n} {\n if (typeof jsonInput !== 'string') return { parsed: jsonInput };\n try {\n return { parsed: JSON.parse(jsonInput) };\n } catch (err: any) {\n return {\n error: {\n path: 'root',\n message: `Invalid JSON: ${err?.message ?? String(err)}`,\n code: 'json_parse_error',\n },\n };\n }\n}\n\n/**\n * Validate a presentation component tree.\n *\n * The deep walk is the source of truth: it re-implements everything the\n * recursive discriminated union checks (component names, per-component props\n * schemas, container narrowing) with precise paths, so we run it directly\n * instead of the union check whose failures collapse into a generic root\n * error. Image-source mutual exclusivity is a semantic rule the structural\n * schema cannot express, so it runs unconditionally on top.\n */\nexport function validatePresentationDocument(\n data: unknown,\n opts: DeepValidateOptions = {}\n): PptxValidationResult {\n const errors = comprehensiveValidatePresentation(data, [], opts);\n errors.push(...collectImageSourceConflicts(data));\n errors.push(...collectTextContentConflicts(data));\n errors.push(...collectPptxRendererErrors(data));\n const valid = errors.length === 0;\n return {\n valid,\n errors,\n documentType: 'pptx',\n data: valid ? data : undefined,\n };\n}\n\n/**\n * Validate a presentation from a JSON string or object.\n */\nexport function validateJsonPresentationDocument(\n jsonInput: string | object,\n opts: DeepValidateOptions = {}\n): PptxValidationResult {\n const { parsed, error } = parseJsonInput(jsonInput);\n if (error) return { valid: false, errors: [error], documentType: 'pptx' };\n return validatePresentationDocument(parsed, opts);\n}\n\n/**\n * Validate a PPTX theme config.\n */\nexport function validatePptxTheme(data: unknown): PptxValidationResult {\n if (Value.Check(ThemeConfigSchema, data)) {\n return { valid: true, errors: [], data };\n }\n const valueErrors = [...Value.Errors(ThemeConfigSchema, data)];\n const errors = transformValueErrors(valueErrors, { maxErrors: 100 });\n return { valid: false, errors };\n}\n\n/**\n * Validate a PPTX theme from a JSON string or object.\n */\nexport function validateJsonPptxTheme(\n jsonInput: string | object\n): PptxValidationResult {\n const { parsed, error } = parseJsonInput(jsonInput);\n if (error) return { valid: false, errors: [error] };\n return validatePptxTheme(parsed);\n}\n\n/**\n * Simple validation API — the entry point the CLI consumes.\n */\nexport const validate = {\n document: (data: unknown) => validatePresentationDocument(data),\n jsonDocument: (jsonInput: string | object) =>\n validateJsonPresentationDocument(jsonInput),\n theme: (data: unknown) => validatePptxTheme(data),\n jsonTheme: (jsonInput: string | object) => validateJsonPptxTheme(jsonInput),\n isDocument: (data: unknown) => validatePresentationDocument(data).valid,\n isTheme: (data: unknown) => validatePptxTheme(data).valid,\n};\n\n/**\n * Strict validation API. PPTX deep validation never cleans or applies\n * defaults, so this is currently an alias kept for docx API parity — the CLI\n * picks one of the two based on its --strict flag.\n */\nexport const validateStrict = {\n document: (data: unknown) => validatePresentationDocument(data),\n jsonDocument: (jsonInput: string | object) =>\n validateJsonPresentationDocument(jsonInput),\n theme: (data: unknown) => validatePptxTheme(data),\n jsonTheme: (jsonInput: string | object) => validateJsonPptxTheme(jsonInput),\n};\n","/**\n * Deep validation utilities for collecting ALL errors in nested structures.\n *\n * Mirrors the docx deep validator: the recursive discriminated union\n * (PptxComponentDefinitionSchema) short-circuits on the first mismatch and\n * collapses failures into a generic root error, so this walk visits every\n * component in the tree and validates its props against the real per-component\n * schema, producing precise, path-aware errors.\n */\n\nimport { Value } from '@sinclair/typebox/value';\nimport type { TSchema } from '@sinclair/typebox';\nimport type { ValidationError } from '@json-to-office/shared';\nimport { transformValueErrors } from '@json-to-office/shared';\nimport {\n PPTX_STANDARD_COMPONENTS_REGISTRY,\n getPptxStandardComponent,\n} from '../../schemas/component-registry';\n\n// Map of component names to their props schemas, sourced from the registry.\n// This stays in sync as new standard components are added, so the presentation\n// root ('pptx') and every standard child component are recognized here.\nconst COMPONENT_SCHEMAS: Record<string, TSchema> = Object.fromEntries(\n PPTX_STANDARD_COMPONENTS_REGISTRY.map((c) => [c.name, c.propsSchema])\n);\n\n// Root component names that may appear at the top of a presentation.\nconst ROOT_COMPONENT_NAMES = new Set(\n PPTX_STANDARD_COMPONENTS_REGISTRY.filter((c) =>\n Boolean(c.special?.hasSchemaField)\n ).map((c) => c.name)\n);\n\n// Top-level keys allowed on a component object. The recursive union enforces\n// this via additionalProperties:false; the walk re-checks it so a typo like\n// \"porps\" is reported at a precise path instead of a generic union failure.\nconst COMPONENT_OBJECT_KEYS = new Set([\n 'name',\n 'id',\n 'enabled',\n 'props',\n 'children',\n]);\nconst CUSTOM_COMPONENT_OBJECT_KEYS = new Set([\n ...COMPONENT_OBJECT_KEYS,\n 'version',\n]);\nconst ROOT_OBJECT_KEYS = new Set([...COMPONENT_OBJECT_KEYS, '$schema']);\nROOT_OBJECT_KEYS.add('renderer');\n\n/**\n * Options that tune deep validation.\n *\n * `knownCustomNames` — names of registered plugin components. The deep\n * validator neither flags these as \"unknown component\" nor validates their\n * props here; the plugin layer validates custom props separately.\n *\n * `allowUnknownFields` — when true, unknown properties are stripped before the\n * per-component check instead of being rejected. The escape hatch for callers\n * migrating onto strict schemas.\n */\nexport interface DeepValidateOptions {\n knownCustomNames?: Set<string>;\n allowUnknownFields?: boolean;\n}\n\n/**\n * Deep validate a presentation to collect ALL errors, not just union-level errors.\n */\nexport function deepValidatePresentation(\n data: any,\n opts: DeepValidateOptions = {}\n): ValidationError[] {\n const allErrors: ValidationError[] = [];\n\n if (!data || typeof data !== 'object') {\n allErrors.push({\n path: 'root',\n message: 'Presentation must be an object',\n code: 'invalid_type',\n });\n return allErrors;\n }\n\n if (!data.name) {\n allErrors.push({\n path: '/name',\n message: 'Missing required field \"name\"',\n code: 'required_property',\n });\n } else if (!ROOT_COMPONENT_NAMES.has(data.name)) {\n const expected = [...ROOT_COMPONENT_NAMES].map((n) => `\"${n}\"`).join(', ');\n allErrors.push({\n path: '/name',\n message: `Invalid name \"${data.name}\". Expected ${expected}`,\n code: 'invalid_value',\n });\n }\n\n for (const key of Object.keys(data)) {\n if (!ROOT_OBJECT_KEYS.has(key)) {\n allErrors.push({\n path: `/${key}`,\n message: `Unknown field \"${key}\" on the root component`,\n code: 'unknown_field',\n });\n }\n }\n\n // Validate props when the key is present so explicit `null` (or any falsy\n // non-object) is checked against the component's schema instead of silently\n // passing.\n if (!('props' in data)) {\n allErrors.push({\n path: '/props',\n message: 'Missing required field \"props\"',\n code: 'required_property',\n });\n } else if (ROOT_COMPONENT_NAMES.has(data.name)) {\n allErrors.push(\n ...validateComponentProps(data.name, data.props, '/props', opts)\n );\n }\n\n // The root requires a children array (the slides); nested containers may\n // legitimately omit theirs.\n if (!data.children) {\n allErrors.push({\n path: '/children',\n message: 'Missing required field \"children\"',\n code: 'required_property',\n });\n } else if (!Array.isArray(data.children)) {\n allErrors.push({\n path: '/children',\n message: 'Field \"children\" must be an array',\n code: 'invalid_type',\n });\n }\n\n walkComponentTree(data, '', opts, allErrors);\n\n return allErrors;\n}\n\n/**\n * Recursively validate every component nested under `node`.\n *\n * Walks two kinds of child position to any depth:\n * - the `children` array — `pptx` holds slides, `slide` holds content\n * components. The registry's `allowedChildren` narrows what each container\n * accepts, and leaf components must not carry children at all; and\n * - a slide's `props.placeholders` record — added dynamically by the\n * component registry on top of the static SlidePropsSchema, so its values\n * are not covered by the slide's own props validation and this walk is\n * their only checker.\n *\n * The node's own props are NOT validated here — the caller validates the root\n * props, and every entry is validated as it is visited.\n */\nfunction walkComponentTree(\n node: any,\n path: string,\n opts: DeepValidateOptions,\n errors: ValidationError[]\n): void {\n if (!node || typeof node !== 'object') return;\n\n const validateEntry = (child: any, childPath: string): void => {\n if (!child || typeof child !== 'object' || Array.isArray(child)) {\n errors.push({\n path: childPath,\n message: 'Component must be an object',\n code: 'invalid_type',\n });\n return;\n }\n if (typeof child.name !== 'string' || child.name.length === 0) {\n errors.push({\n path: `${childPath}/name`,\n message: 'Component missing required field \"name\"',\n code: 'required_property',\n });\n return;\n }\n\n // Registered plugin props are validated version-aware by the plugin layer.\n // Their children still need walking: custom containers may hold authored\n // standard components, and those must obey the same prop/tree contract as\n // standard components elsewhere in the presentation.\n const isCustomComponent = opts.knownCustomNames?.has(child.name) ?? false;\n const allowedObjectKeys = isCustomComponent\n ? CUSTOM_COMPONENT_OBJECT_KEYS\n : COMPONENT_OBJECT_KEYS;\n\n for (const key of Object.keys(child)) {\n if (!allowedObjectKeys.has(key)) {\n errors.push({\n path: `${childPath}/${key}`,\n message: `Unknown field \"${key}\" on component \"${child.name}\"`,\n code: 'unknown_field',\n });\n }\n }\n\n if (isCustomComponent) {\n walkComponentTree(child, childPath, opts, errors);\n return;\n }\n\n // Validate props against the component's schema. When props is omitted,\n // validate an empty object so the schema decides whether props are\n // required (e.g. `slide` needs none; `text` requires text).\n const propsPath = `${childPath}/props`;\n if (child.props != null) {\n errors.push(\n ...validateComponentProps(child.name, child.props, propsPath, opts)\n );\n } else {\n errors.push(...validateComponentProps(child.name, {}, propsPath, opts));\n }\n\n const def = getPptxStandardComponent(child.name);\n if (def && !def.hasChildren && child.children != null) {\n errors.push({\n path: `${childPath}/children`,\n message: `Component \"${child.name}\" does not accept children`,\n code: 'invalid_value',\n });\n return;\n }\n\n // Recurse so arbitrarily nested containers are covered.\n walkComponentTree(child, childPath, opts, errors);\n };\n\n const parentDef = getPptxStandardComponent(node.name);\n\n // A slide's `placeholders` record maps placeholder names to full components\n // ({ \"title\": { \"name\": \"text\", ... } }). The static SlidePropsSchema does\n // not include the field (it is injected with the recursive ref at schema\n // generation time), so validateComponentProps strips it before checking the\n // slide's own props — each value is validated here instead.\n if (node.name === 'slide' && node.props && typeof node.props === 'object') {\n const placeholders = node.props.placeholders;\n if (\n placeholders &&\n typeof placeholders === 'object' &&\n !Array.isArray(placeholders)\n ) {\n for (const [key, child] of Object.entries(placeholders)) {\n validateEntry(child, `${path}/props/placeholders/${key}`);\n }\n } else if (placeholders != null) {\n errors.push({\n path: `${path}/props/placeholders`,\n message:\n 'Field \"placeholders\" must be an object mapping placeholder names to components',\n code: 'invalid_type',\n });\n }\n }\n\n if (Array.isArray(node.children)) {\n node.children.forEach((child: any, i: number) => {\n const childPath = `${path}/children/${i}`;\n // Enforce the registry's container narrowing (pptx → slide,\n // slide → content) for known components; unknown names are already\n // reported by validateComponentProps inside validateEntry.\n if (\n parentDef?.allowedChildren &&\n child &&\n typeof child === 'object' &&\n typeof child.name === 'string' &&\n getPptxStandardComponent(child.name) &&\n !parentDef.allowedChildren.includes(child.name)\n ) {\n const expected = parentDef.allowedChildren\n .map((n) => `\"${n}\"`)\n .join(', ');\n errors.push({\n path: `${childPath}/name`,\n message: `Component \"${child.name}\" is not allowed inside \"${node.name}\". Expected ${expected}`,\n code: 'invalid_value',\n });\n }\n validateEntry(child, childPath);\n });\n } else if (node.children != null && path !== '') {\n // `children` is present but not an array on a nested container. The root's\n // `children` is already checked by deepValidatePresentation (skipped here\n // via `path !== ''` so it is not reported twice).\n errors.push({\n path: `${path}/children`,\n message: 'Field \"children\" must be an array',\n code: 'invalid_type',\n });\n }\n}\n\n/**\n * Validate a component's props against its schema.\n */\nfunction validateComponentProps(\n componentName: string,\n props: any,\n basePath: string,\n opts: DeepValidateOptions = {}\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n const schema = COMPONENT_SCHEMAS[componentName];\n if (!schema) {\n // Unknown component type. `basePath` always ends in `/props`; anchor the\n // swap to the end so a nested path like `…/props/placeholders/title/props`\n // becomes `…/props/placeholders/title/name` rather than mangling an\n // earlier `/props`.\n errors.push({\n path: basePath.replace(/\\/props$/, '/name'),\n message: `Unknown component \"${componentName}\"`,\n code: 'unknown_component',\n });\n return errors;\n }\n\n // A slide's `placeholders` field is injected at schema-generation time and\n // absent from the static props schema; its values are walked separately, so\n // strip it here to avoid a false additionalProperties rejection.\n let toCheck = props;\n if (\n componentName === 'slide' &&\n props &&\n typeof props === 'object' &&\n 'placeholders' in props\n ) {\n const rest = { ...props };\n delete rest.placeholders;\n toCheck = rest;\n }\n\n // When unknown fields are explicitly allowed, strip them before checking so\n // additionalProperties:false no longer rejects — required/typed fields are\n // still enforced.\n if (opts.allowUnknownFields) {\n toCheck = Value.Clean(schema, Value.Clone(toCheck));\n }\n\n if (!Value.Check(schema, toCheck)) {\n const valueErrors = [...Value.Errors(schema, toCheck)];\n const transformedErrors = transformValueErrors(valueErrors, {\n maxErrors: 100,\n });\n\n // Adjust paths to be relative to the document root\n transformedErrors.forEach((error) => {\n const fullPath =\n error.path === 'root'\n ? basePath\n : `${basePath}${error.path.startsWith('/') ? error.path : '/' + error.path}`;\n\n errors.push({\n ...error,\n path: fullPath,\n });\n });\n }\n\n return errors;\n}\n\n/**\n * Combine deep validation with standard validation.\n *\n * Deep validation produces precise, path-aware errors. TypeBox's discriminated-\n * union check, by contrast, often collapses any failure under the root into a\n * single generic \"Invalid component configuration for 'pptx'\" message at\n * `root` — useful as a signal that something is wrong, but actionable only via\n * the deep-validator's output. We always strip that catch-all so it doesn't\n * appear alongside (or, worse, instead of) the real diagnostics.\n */\nexport function comprehensiveValidatePresentation(\n data: any,\n existingErrors: ValidationError[] = [],\n opts: DeepValidateOptions = {}\n): ValidationError[] {\n const deepErrors = deepValidatePresentation(data, opts);\n\n const filteredExisting = existingErrors.filter(\n (e) => !isGenericUnionCatchAll(e)\n );\n\n return deduplicateErrors([...filteredExisting, ...deepErrors]);\n}\n\n/**\n * Detect TypeBox's generic union/discriminator catch-all error at the document\n * root. These messages name the component type ('pptx') but give no actionable\n * detail — the deep validator emits the actual path-level errors instead.\n */\nfunction isGenericUnionCatchAll(error: ValidationError): boolean {\n const atRoot = !error.path || error.path === 'root' || error.path === '/';\n if (!atRoot) return false;\n const msg = error.message || '';\n return (\n /invalid component configurations?/i.test(msg) ||\n /invalid document structure/i.test(msg)\n );\n}\n\n/**\n * Deduplicate errors by path and message.\n */\nfunction deduplicateErrors(errors: ValidationError[]): ValidationError[] {\n const seen = new Set<string>();\n const unique: ValidationError[] = [];\n\n for (const error of errors) {\n const key = `${error.path}:${error.message}`;\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(error);\n }\n }\n\n return unique;\n}\n","export const PPTX_SHARED_VERSION = '1.0.0';\n\n// Component Schemas\nexport {\n PositionSchema,\n SlideBackgroundSchema,\n TransitionSchema,\n VerticalAlignmentSchema,\n ShadowSchema,\n PresentationPropsSchema,\n SlidePropsSchema,\n TextPropsSchema,\n TextRunSchema,\n PptxImagePropsSchema,\n ShapePropsSchema,\n ShapeTypeSchema,\n GradientStopSchema,\n GradientFillSchema,\n PatternFillSchema,\n PATTERN_FILL_PRESETS,\n PptxTablePropsSchema,\n PptxHighchartsPropsSchema,\n PptxStandardComponentDefinitionSchema,\n PptxComponentDefinitionSchema,\n PptxSlideContentSchema,\n} from './schemas/components';\n\nexport type {\n Position,\n SlideBackground,\n Transition,\n VerticalAlignment,\n Shadow,\n PresentationProps,\n SlideProps,\n TextProps,\n TextRun,\n PptxImageProps,\n ShapeType,\n ShapeProps,\n TextSegment,\n GradientStop,\n GradientFill,\n PatternFill,\n PptxTableProps,\n PptxHighchartsProps,\n PptxComponentDefinition,\n PptxSlideContent,\n} from './schemas/components';\n\n// Chart (not re-exported from components barrel)\nexport { PptxChartPropsSchema } from './schemas/components/chart';\nexport type { PptxChartProps } from './schemas/components/chart';\n\n// Component Registry\nexport {\n PPTX_STANDARD_COMPONENTS_REGISTRY,\n getPptxStandardComponent,\n getAllPptxComponentNames,\n getPptxComponentsByCategory,\n getPptxContainerComponents,\n getPptxContentComponents,\n isPptxStandardComponent,\n createPptxComponentSchemaObject,\n createAllPptxComponentSchemas,\n} from './schemas/component-registry';\n\nexport type { PptxStandardComponentDefinition } from './schemas/component-registry';\n\n// Document Schema\nexport {\n PptxJsonComponentDefinitionSchema,\n PPTX_JSON_SCHEMA_URLS,\n} from './schemas/document';\n\nexport type { PptxJsonComponentDefinition } from './schemas/document';\n\n// Schema Export Metadata\nexport {\n PPTX_COMPONENT_METADATA,\n PPTX_BASE_SCHEMA_METADATA,\n} from './schemas/export';\n\n// Component Defaults\nexport {\n PptxComponentDefaultsSchema,\n TextComponentDefaultsSchema,\n ImageComponentDefaultsSchema,\n ShapeComponentDefaultsSchema,\n TableComponentDefaultsSchema,\n HighchartsComponentDefaultsSchema,\n ChartComponentDefaultsSchema,\n} from './schemas/component-defaults';\nexport type {\n PptxComponentDefaults,\n TextComponentDefaults,\n ImageComponentDefaults,\n ShapeComponentDefaults,\n TableComponentDefaults,\n HighchartsComponentDefaults,\n ChartComponentDefaults,\n} from './schemas/component-defaults';\n\n// Theme\nexport {\n ThemeConfigSchema,\n ColorValueSchema,\n SEMANTIC_COLOR_NAMES,\n SEMANTIC_COLOR_ALIASES,\n STYLE_NAMES,\n StyleNameSchema,\n TextStyleSchema,\n isValidThemeConfig,\n} from './schemas/theme';\nexport type { ThemeConfigJson, StyleName, TextStyle } from './schemas/theme';\n\n// Schema Generator\nexport { generateUnifiedDocumentSchema } from './schemas/generator';\nexport type {\n VersionedPropsEntry,\n CustomComponentInfo,\n GenerateSchemaOptions,\n} from './schemas/generator';\n\n// Renderer-discriminated schema profiles\nexport {\n PPTX_RENDERER_IDS,\n DEFAULT_PPTX_RENDERER_ID,\n collectPptxRendererErrors,\n} from './schemas/renderer';\nexport type { PptxRendererId } from './schemas/renderer';\n\n// Types\nexport type { ReportComponent } from './types/components';\n\n// Image source conflict detection (path/base64/svg mutual exclusivity)\nexport {\n collectImageSourceConflicts,\n presentImageSources,\n} from './validation/image-source-conflicts';\n\n// Text content conflict detection (text/runs mutual exclusivity)\nexport { collectTextContentConflicts } from './validation/text-content-conflicts';\n\n// Unified validation facade (deep, path-aware validation of whole presentations\n// and themes) — the API the CLI's `pptx validate` consumes.\nexport {\n validate,\n validateStrict,\n validatePresentationDocument,\n validateJsonPresentationDocument,\n validatePptxTheme,\n validateJsonPptxTheme,\n deepValidatePresentation,\n comprehensiveValidatePresentation,\n} from './validation/unified';\nexport type {\n PptxValidationResult,\n DeepValidateOptions,\n} from './validation/unified';\n\n// Re-export shared validation utilities for convenience\nexport {\n transformValueError,\n transformValueErrors,\n DEFAULT_ERROR_CONFIG,\n createErrorConfig,\n} from '@json-to-office/shared';\n\nexport type {\n ErrorFormatterConfig,\n ValidationError,\n} from '@json-to-office/shared';\n\n// Re-export shared utilities\nexport {\n latestVersion,\n isValidSemver,\n parseSemver,\n compareSemver,\n} from '@json-to-office/shared';\nexport type { ParsedSemver } from '@json-to-office/shared';\n\n// Re-export schema utils\nexport {\n fixSchemaReferences,\n convertToJsonSchema,\n createComponentSchema,\n exportSchemaToFile,\n} from '@json-to-office/shared';\nexport type { ComponentSchemaConfig } from '@json-to-office/shared';\n"],"mappings":"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","names":["Value","transformValueErrors","Value","transformValueErrors","transformValueErrors"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { TSchema } from '@sinclair/typebox';
|
|
2
|
+
import { PptxRendererId } from './renderer.js';
|
|
3
|
+
import '@json-to-office/shared';
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* PPTX Component Registry - SINGLE SOURCE OF TRUTH
|
|
@@ -38,7 +40,10 @@ declare function getPptxComponentsByCategory(category: PptxStandardComponentDefi
|
|
|
38
40
|
declare function getPptxContainerComponents(): readonly PptxStandardComponentDefinition[];
|
|
39
41
|
declare function getPptxContentComponents(): readonly PptxStandardComponentDefinition[];
|
|
40
42
|
declare function isPptxStandardComponent(name: string): boolean;
|
|
41
|
-
declare function createPptxComponentSchemaObject(component: PptxStandardComponentDefinition, recursiveRef?: TSchema, placeholderRef?: TSchema
|
|
43
|
+
declare function createPptxComponentSchemaObject(component: PptxStandardComponentDefinition, recursiveRef?: TSchema, placeholderRef?: TSchema, profile?: {
|
|
44
|
+
renderer: PptxRendererId;
|
|
45
|
+
requireDiscriminator: boolean;
|
|
46
|
+
}): TSchema;
|
|
42
47
|
declare function createAllPptxComponentSchemas(recursiveRef?: TSchema): readonly TSchema[];
|
|
43
48
|
/**
|
|
44
49
|
* Build all standard PPTX component schemas with per-container narrowed children.
|
|
@@ -51,6 +56,9 @@ declare function createAllPptxComponentSchemas(recursiveRef?: TSchema): readonly
|
|
|
51
56
|
* @param pluginSchemas - Plugin component schemas (always allowed in all containers)
|
|
52
57
|
* @returns Array of TypeBox schemas with narrowed children per container
|
|
53
58
|
*/
|
|
54
|
-
declare function createAllPptxComponentSchemasNarrowed(selfRef: TSchema, pluginSchemas?: TSchema[]
|
|
59
|
+
declare function createAllPptxComponentSchemasNarrowed(selfRef: TSchema, pluginSchemas?: TSchema[], profile?: {
|
|
60
|
+
renderer: PptxRendererId;
|
|
61
|
+
requireDiscriminator: boolean;
|
|
62
|
+
}): TSchema[];
|
|
55
63
|
|
|
56
64
|
export { PPTX_STANDARD_COMPONENTS_REGISTRY, type PptxStandardComponentDefinition, createAllPptxComponentSchemas, createAllPptxComponentSchemasNarrowed, createPptxComponentSchemaObject, getAllPptxComponentNames, getPptxComponentsByCategory, getPptxContainerComponents, getPptxContentComponents, getPptxStandardComponent, isPptxStandardComponent };
|
|
@@ -9,7 +9,8 @@ import {
|
|
|
9
9
|
getPptxContentComponents,
|
|
10
10
|
getPptxStandardComponent,
|
|
11
11
|
isPptxStandardComponent
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-2MZVIHSQ.js";
|
|
13
|
+
import "../chunk-2YEV3CJF.js";
|
|
13
14
|
import "../chunk-N6CABSXM.js";
|
|
14
15
|
import "../chunk-7CKCXKN7.js";
|
|
15
16
|
export {
|
|
@@ -2,8 +2,9 @@ import {
|
|
|
2
2
|
PptxComponentDefinitionSchema,
|
|
3
3
|
PptxSlideContentSchema,
|
|
4
4
|
PptxStandardComponentDefinitionSchema
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-YSJMKGLM.js";
|
|
6
|
+
import "../chunk-2MZVIHSQ.js";
|
|
7
|
+
import "../chunk-2YEV3CJF.js";
|
|
7
8
|
import "../chunk-N6CABSXM.js";
|
|
8
9
|
import "../chunk-7CKCXKN7.js";
|
|
9
10
|
export {
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
PptxComponentDefinitionSchema,
|
|
4
4
|
PptxSlideContentSchema,
|
|
5
5
|
PptxStandardComponentDefinitionSchema
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-YSJMKGLM.js";
|
|
7
7
|
import {
|
|
8
8
|
GridPositionSchema,
|
|
9
9
|
PositionSchema,
|
|
@@ -14,7 +14,8 @@ import {
|
|
|
14
14
|
SlidePropsSchema,
|
|
15
15
|
TransitionSchema,
|
|
16
16
|
VerticalAlignmentSchema
|
|
17
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-2MZVIHSQ.js";
|
|
18
|
+
import "../chunk-2YEV3CJF.js";
|
|
18
19
|
import "../chunk-N6CABSXM.js";
|
|
19
20
|
import {
|
|
20
21
|
GradientFillSchema,
|
package/dist/schemas/document.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PPTX_JSON_SCHEMA_URLS,
|
|
3
3
|
PptxJsonComponentDefinitionSchema
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-F3FQ7ADB.js";
|
|
5
5
|
import "../chunk-J4OT5Y5B.js";
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-YSJMKGLM.js";
|
|
7
|
+
import "../chunk-2MZVIHSQ.js";
|
|
8
|
+
import "../chunk-2YEV3CJF.js";
|
|
8
9
|
import "../chunk-N6CABSXM.js";
|
|
9
10
|
import "../chunk-7CKCXKN7.js";
|
|
10
11
|
export {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
generateUnifiedDocumentSchema
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-5WT7G2OG.js";
|
|
4
|
+
import "../chunk-2MZVIHSQ.js";
|
|
5
|
+
import "../chunk-2YEV3CJF.js";
|
|
5
6
|
import "../chunk-N6CABSXM.js";
|
|
6
7
|
import "../chunk-7CKCXKN7.js";
|
|
7
8
|
export {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TSchema } from '@sinclair/typebox';
|
|
2
|
+
import { ValidationError } from '@json-to-office/shared';
|
|
3
|
+
|
|
4
|
+
declare const PPTX_RENDERER_IDS: readonly ["pptxgenjs", "office-open"];
|
|
5
|
+
type PptxRendererId = (typeof PPTX_RENDERER_IDS)[number];
|
|
6
|
+
declare const DEFAULT_PPTX_RENDERER_ID: PptxRendererId;
|
|
7
|
+
/**
|
|
8
|
+
* Renderer-specific view of one canonical component props schema.
|
|
9
|
+
*
|
|
10
|
+
* This is intentionally a pruning pass rather than a second schema tree. The
|
|
11
|
+
* compiler capability gate remains authoritative for requirements that depend
|
|
12
|
+
* on resolved assets or expanded custom components.
|
|
13
|
+
*/
|
|
14
|
+
declare function pptxPropsSchemaForRenderer(componentName: string, schema: TSchema, renderer: PptxRendererId): TSchema;
|
|
15
|
+
declare function isPptxComponentSupported(componentName: string, renderer: PptxRendererId): boolean;
|
|
16
|
+
/** Static renderer-profile diagnostics used by CLI/library validation. */
|
|
17
|
+
declare function collectPptxRendererErrors(data: unknown): ValidationError[];
|
|
18
|
+
|
|
19
|
+
export { DEFAULT_PPTX_RENDERER_ID, PPTX_RENDERER_IDS, type PptxRendererId, collectPptxRendererErrors, isPptxComponentSupported, pptxPropsSchemaForRenderer };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_PPTX_RENDERER_ID,
|
|
3
|
+
PPTX_RENDERER_IDS,
|
|
4
|
+
collectPptxRendererErrors,
|
|
5
|
+
isPptxComponentSupported,
|
|
6
|
+
pptxPropsSchemaForRenderer
|
|
7
|
+
} from "../chunk-2YEV3CJF.js";
|
|
8
|
+
export {
|
|
9
|
+
DEFAULT_PPTX_RENDERER_ID,
|
|
10
|
+
PPTX_RENDERER_IDS,
|
|
11
|
+
collectPptxRendererErrors,
|
|
12
|
+
isPptxComponentSupported,
|
|
13
|
+
pptxPropsSchemaForRenderer
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@json-to-office/shared-pptx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "PPTX-specific schemas, component registry and validation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@sinclair/typebox": "0.34.38",
|
|
27
|
-
"@json-to-office/shared": "^0.
|
|
27
|
+
"@json-to-office/shared": "^1.0.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "20.11.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/generator.ts"],"sourcesContent":["/**\n * Unified Presentation Schema Generator\n *\n * Generates JSON schemas that include both standard and custom plugin components.\n * Used at build-time for static schema files and at runtime for plugin-aware validation.\n */\nimport { Type, TSchema } from '@sinclair/typebox';\nimport { latestVersion } from '@json-to-office/shared';\nimport { createAllPptxComponentSchemasNarrowed } from './component-registry';\n\nexport interface VersionedPropsEntry {\n version: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n description?: string;\n}\n\nexport interface CustomComponentInfo {\n name: string;\n versions: VersionedPropsEntry[];\n}\n\nexport interface GenerateSchemaOptions {\n customComponents?: CustomComponentInfo[];\n includeMetadata?: boolean;\n}\n\nfunction createPluginVersionSchema(\n custom: CustomComponentInfo,\n entry: VersionedPropsEntry,\n recursiveRef: TSchema,\n isLatest: boolean\n): TSchema {\n const fields: Record<string, TSchema> = {\n name: Type.Literal(custom.name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'When false, this component is filtered out and not rendered. Defaults to true.',\n })\n ),\n // Omitting version selects the latest release at runtime. Explicit older\n // versions remain discriminated so their own props schema is enforced.\n version: isLatest\n ? Type.Optional(Type.Literal(entry.version))\n : Type.Literal(entry.version),\n props: entry.propsSchema,\n };\n\n if (entry.hasChildren) {\n fields.children = Type.Optional(Type.Array(recursiveRef));\n }\n\n return Type.Object(fields, {\n additionalProperties: false,\n description: entry.description ?? custom.name,\n });\n}\n\n/**\n * Generate a unified presentation schema that includes standard + custom components.\n * Uses Type.Recursive so container components (presentation, slide) can have children.\n */\nexport function generateUnifiedDocumentSchema(\n options: GenerateSchemaOptions = {}\n): TSchema {\n const { customComponents = [] } = options;\n\n return Type.Recursive((Self) => {\n // ── Phase 1: Build plugin schemas (plugins get Self for arbitrary nesting) ──\n const pluginSchemas: TSchema[] = [];\n\n for (const custom of customComponents) {\n if (custom.versions.length > 0) {\n const latest = latestVersion(\n custom.versions.map((entry) => entry.version)\n );\n const versions = custom.versions.map((entry) =>\n createPluginVersionSchema(\n custom,\n entry,\n Self,\n entry.version === latest\n )\n );\n pluginSchemas.push(\n versions.length === 1 ? versions[0] : Type.Union(versions)\n );\n }\n }\n\n // ── Phase 2: Build standard components with narrowed children ──\n const standardSchemas = createAllPptxComponentSchemasNarrowed(\n Self,\n pluginSchemas\n );\n\n const componentSchemas = [...standardSchemas, ...pluginSchemas];\n\n if (componentSchemas.length === 0) {\n return Type.Object({});\n }\n\n return Type.Union(componentSchemas);\n });\n}\n"],"mappings":";;;;;AAMA,SAAS,YAAqB;AAC9B,SAAS,qBAAqB;AAoB9B,SAAS,0BACP,QACA,OACA,cACA,UACS;AACT,QAAM,SAAkC;AAAA,IACtC,MAAM,KAAK,QAAQ,OAAO,IAAI;AAAA,IAC9B,IAAI,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,IAC/B,SAAS,KAAK;AAAA,MACZ,KAAK,QAAQ;AAAA,QACX,SAAS;AAAA,QACT,aACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA;AAAA;AAAA,IAGA,SAAS,WACL,KAAK,SAAS,KAAK,QAAQ,MAAM,OAAO,CAAC,IACzC,KAAK,QAAQ,MAAM,OAAO;AAAA,IAC9B,OAAO,MAAM;AAAA,EACf;AAEA,MAAI,MAAM,aAAa;AACrB,WAAO,WAAW,KAAK,SAAS,KAAK,MAAM,YAAY,CAAC;AAAA,EAC1D;AAEA,SAAO,KAAK,OAAO,QAAQ;AAAA,IACzB,sBAAsB;AAAA,IACtB,aAAa,MAAM,eAAe,OAAO;AAAA,EAC3C,CAAC;AACH;AAMO,SAAS,8BACd,UAAiC,CAAC,GACzB;AACT,QAAM,EAAE,mBAAmB,CAAC,EAAE,IAAI;AAElC,SAAO,KAAK,UAAU,CAAC,SAAS;AAE9B,UAAM,gBAA2B,CAAC;AAElC,eAAW,UAAU,kBAAkB;AACrC,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,cAAM,SAAS;AAAA,UACb,OAAO,SAAS,IAAI,CAAC,UAAU,MAAM,OAAO;AAAA,QAC9C;AACA,cAAM,WAAW,OAAO,SAAS;AAAA,UAAI,CAAC,UACpC;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,MAAM,YAAY;AAAA,UACpB;AAAA,QACF;AACA,sBAAc;AAAA,UACZ,SAAS,WAAW,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,QAAQ;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAGA,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAEA,UAAM,mBAAmB,CAAC,GAAG,iBAAiB,GAAG,aAAa;AAE9D,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO,KAAK,OAAO,CAAC,CAAC;AAAA,IACvB;AAEA,WAAO,KAAK,MAAM,gBAAgB;AAAA,EACpC,CAAC;AACH;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/component-registry.ts","../src/schemas/components/presentation.ts","../src/schemas/components/template.ts","../src/schemas/components/common.ts","../src/schemas/components/slide.ts"],"sourcesContent":["/**\n * PPTX Component Registry - SINGLE SOURCE OF TRUTH\n *\n * This is the ONLY place where standard PPTX components are defined.\n * All schema generators MUST use this registry.\n */\n\nimport { Type, TSchema } from '@sinclair/typebox';\nimport { PPTX_SLIDE_CONTENT_COMPONENTS } from '@json-to-office/shared/schemas/slide-content';\n\n/**\n * Component definition with metadata\n */\nexport interface PptxStandardComponentDefinition {\n name: string;\n propsSchema: TSchema;\n hasChildren: boolean;\n /**\n * Names of standard components allowed as direct children.\n * Only meaningful when hasChildren is true.\n * Plugin components are always allowed in addition to these.\n * Omit to allow the full recursive union (backward-compat).\n */\n allowedChildren?: readonly string[];\n hasPlaceholders?: boolean;\n category: 'container' | 'content' | 'layout';\n description: string;\n special?: {\n hasSchemaField?: boolean;\n };\n}\nimport { PresentationPropsSchema } from './components/presentation';\nimport { SlidePropsSchema } from './components/slide';\n\n/**\n * SINGLE SOURCE OF TRUTH for all standard PPTX components\n */\nexport const PPTX_STANDARD_COMPONENTS_REGISTRY: readonly PptxStandardComponentDefinition[] =\n [\n // ========================================================================\n // Container Components (can contain children)\n // ========================================================================\n {\n name: 'pptx',\n propsSchema: PresentationPropsSchema,\n hasChildren: true,\n allowedChildren: ['slide'],\n category: 'container',\n description:\n 'Main presentation container - defines the overall presentation structure. Required as the root component.',\n special: {\n hasSchemaField: true,\n },\n },\n {\n name: 'slide',\n propsSchema: SlidePropsSchema,\n hasChildren: true,\n allowedChildren: PPTX_SLIDE_CONTENT_COMPONENTS.map(({ name }) => name),\n hasPlaceholders: true,\n category: 'container',\n description:\n 'Slide container - groups content elements on a single slide.',\n },\n\n // Content components are canonical in @json-to-office/shared so DOCX\n // visuals can reuse the exact schemas without depending on shared-pptx.\n ...PPTX_SLIDE_CONTENT_COMPONENTS,\n ] as const;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nexport function getPptxStandardComponent(\n name: string\n): PptxStandardComponentDefinition | undefined {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.find((c) => c.name === name);\n}\n\nexport function getAllPptxComponentNames(): readonly string[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.map((c) => c.name);\n}\n\nexport function getPptxComponentsByCategory(\n category: PptxStandardComponentDefinition['category']\n): readonly PptxStandardComponentDefinition[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.filter(\n (c) => c.category === category\n );\n}\n\nexport function getPptxContainerComponents(): readonly PptxStandardComponentDefinition[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.filter((c) => c.hasChildren);\n}\n\nexport function getPptxContentComponents(): readonly PptxStandardComponentDefinition[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.filter((c) => !c.hasChildren);\n}\n\nexport function isPptxStandardComponent(name: string): boolean {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.some((c) => c.name === name);\n}\n\n// ============================================================================\n// Schema Generation Helpers\n// ============================================================================\n\nexport function createPptxComponentSchemaObject(\n component: PptxStandardComponentDefinition,\n recursiveRef?: TSchema,\n placeholderRef?: TSchema\n): TSchema {\n const schema: Record<string, TSchema> = {\n name: Type.Literal(component.name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(\n Type.Boolean({\n default: true,\n description:\n 'When false, this component is filtered out and not rendered. Defaults to true.',\n })\n ),\n };\n\n if (component.special?.hasSchemaField) {\n schema.$schema = Type.Optional(Type.String({ format: 'uri' }));\n }\n\n schema.props = component.propsSchema;\n\n if (component.hasChildren && recursiveRef) {\n schema.children = Type.Optional(Type.Array(recursiveRef));\n }\n\n if (component.hasPlaceholders && (placeholderRef ?? recursiveRef)) {\n const baseProperties = (component.propsSchema as any).properties ?? {};\n const phRef = placeholderRef ?? recursiveRef!;\n schema.props = Type.Object(\n {\n ...baseProperties,\n placeholders: Type.Optional(\n Type.Record(Type.String(), phRef, {\n description:\n 'Content for named placeholders: { \"title\": { \"name\": \"text\", ... } }',\n })\n ),\n },\n {\n additionalProperties: false,\n description: (component.propsSchema as any).description,\n }\n );\n }\n\n return Type.Object(schema, {\n additionalProperties: false,\n description: component.description,\n });\n}\n\nexport function createAllPptxComponentSchemas(\n recursiveRef?: TSchema\n): readonly TSchema[] {\n return PPTX_STANDARD_COMPONENTS_REGISTRY.map((component) =>\n createPptxComponentSchemaObject(component, recursiveRef)\n );\n}\n\n/**\n * Build all standard PPTX component schemas with per-container narrowed children.\n *\n * Resolves containers in dependency order so each container's children union\n * only references its allowedChildren. Plugin schemas are always included in\n * every container's children.\n *\n * @param selfRef - The Type.Recursive self-reference (fallback and for plugin children)\n * @param pluginSchemas - Plugin component schemas (always allowed in all containers)\n * @returns Array of TypeBox schemas with narrowed children per container\n */\nexport function createAllPptxComponentSchemasNarrowed(\n selfRef: TSchema,\n pluginSchemas: TSchema[] = []\n): TSchema[] {\n // Phase 1: Build leaf (non-container) component schemas — no children\n const leafSchemas = new Map<string, TSchema>();\n for (const comp of PPTX_STANDARD_COMPONENTS_REGISTRY) {\n if (!comp.hasChildren) {\n leafSchemas.set(\n comp.name,\n createPptxComponentSchemaObject(comp, undefined, selfRef)\n );\n }\n }\n\n // Phase 2: Resolve containers in dependency order\n const containers = PPTX_STANDARD_COMPONENTS_REGISTRY.filter(\n (c) => c.hasChildren\n );\n const resolved = new Map<string, TSchema>();\n const pending = [...containers];\n\n while (pending.length > 0) {\n const before = pending.length;\n for (let i = pending.length - 1; i >= 0; i--) {\n const comp = pending[i];\n\n if (!comp.allowedChildren) {\n // No allowedChildren declared — fallback to full recursive ref\n resolved.set(\n comp.name,\n createPptxComponentSchemaObject(comp, selfRef, selfRef)\n );\n pending.splice(i, 1);\n continue;\n }\n\n // Check if all container dependencies are resolved\n const containerDeps = comp.allowedChildren.filter((name) =>\n containers.some((c) => c.name === name)\n );\n if (!containerDeps.every((d) => resolved.has(d))) continue;\n\n // Build narrowed children union\n const childSchemas = comp.allowedChildren\n .map((name) => resolved.get(name) ?? leafSchemas.get(name))\n .filter((s): s is TSchema => s !== undefined);\n\n const allChildSchemas = [...childSchemas, ...pluginSchemas];\n const childrenType =\n allChildSchemas.length === 1\n ? allChildSchemas[0]\n : Type.Union(allChildSchemas);\n\n resolved.set(\n comp.name,\n createPptxComponentSchemaObject(comp, childrenType, selfRef)\n );\n pending.splice(i, 1);\n }\n\n if (pending.length === before) {\n throw new Error(\n `Circular allowedChildren among: ${pending.map((c) => c.name).join(', ')}`\n );\n }\n }\n\n // Combine: containers (resolved) + leaves\n return [...resolved.values(), ...leafSchemas.values()];\n}\n","/**\n * Presentation Component Schema\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport { FontRegistrySchema } from '@json-to-office/shared';\nimport { TemplateSlideDefinitionSchema } from './template';\nimport { GridConfigSchema, ThemeConfigSchema } from '../theme';\nimport { PptxComponentDefaultsSchema } from '../component-defaults';\n\nexport const PresentationPropsSchema = Type.Object(\n {\n title: Type.Optional(\n Type.String({ description: 'Presentation title metadata' })\n ),\n author: Type.Optional(\n Type.String({ description: 'Presentation author metadata' })\n ),\n subject: Type.Optional(\n Type.String({ description: 'Presentation subject metadata' })\n ),\n company: Type.Optional(\n Type.String({ description: 'Company name metadata' })\n ),\n theme: Type.Optional(\n Type.Union(\n [\n Type.String({\n description: 'Theme name to apply (default: \"default\")',\n default: 'default',\n }),\n ThemeConfigSchema,\n ],\n {\n description:\n 'Theme to apply: a built-in/custom theme name (default: ' +\n '\"default\"), or an inline theme config object so the document ' +\n 'stays self-contained',\n }\n )\n ),\n fontRegistry: Type.Optional(FontRegistrySchema),\n slideWidth: Type.Optional(\n Type.Number({\n description: 'Slide width in inches (default: 10)',\n default: 10,\n })\n ),\n slideHeight: Type.Optional(\n Type.Number({\n description: 'Slide height in inches (default: 7.5)',\n default: 7.5,\n })\n ),\n rtlMode: Type.Optional(\n Type.Boolean({ description: 'Right-to-left text direction' })\n ),\n language: Type.Optional(\n Type.String({\n pattern: '^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$',\n description:\n 'Default presentation language (BCP-47 tag, e.g. \"en-US\"). Sets the spell-check language for all text; individual text components can override it.',\n examples: ['en-US', 'fr-FR', 'de-DE', 'it-IT', 'es-ES'],\n })\n ),\n pageNumberFormat: Type.Optional(\n Type.Union([Type.Literal('9'), Type.Literal('09')], {\n description:\n 'Format for {PAGE_NUMBER} placeholders: \"9\" = bare number (default), \"09\" = zero-padded',\n default: '9',\n })\n ),\n componentDefaults: Type.Optional(PptxComponentDefaultsSchema),\n grid: Type.Optional(GridConfigSchema),\n templates: Type.Optional(\n Type.Array(TemplateSlideDefinitionSchema, {\n description: 'Template slide definitions (reusable slide templates)',\n })\n ),\n },\n {\n description: 'Presentation container props',\n additionalProperties: false,\n }\n);\n\nexport type PresentationProps = Static<typeof PresentationPropsSchema>;\n","/**\n * Template Slide Definition Schemas\n */\n\nimport { Type, Static, TSchema } from '@sinclair/typebox';\nimport { SlideBackgroundSchema, GridPositionSchema } from './common';\nimport { ColorValueSchema, GridConfigSchema } from '../theme';\nimport { TextPropsSchema } from './text';\nimport { PptxImagePropsSchema } from './image';\nimport { ShapePropsSchema } from './shape';\nimport { PptxTablePropsSchema } from './table';\nimport { PptxChartPropsSchema } from './chart';\nimport { PptxHighchartsPropsSchema } from './highcharts';\n\n// Position helpers (number in inches OR percentage string e.g. \"50%\")\nconst Coord = Type.Union([\n Type.Number({ description: 'Position/size in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Position/size as percentage of slide dimension (e.g., \"50%\")',\n }),\n]);\n\n// Helper: wrap a props schema into { name, props } component format\nfunction contentComponent(name: string, propsSchema: TSchema) {\n return Type.Object({\n name: Type.Literal(name),\n id: Type.Optional(Type.String()),\n enabled: Type.Optional(Type.Boolean({\n default: true,\n description: 'When false, this component is filtered out and not rendered. Defaults to true.',\n })),\n props: propsSchema,\n }, { additionalProperties: false });\n}\n\n// Content component union — same { name, props } format as slide children\nconst TemplateObjectComponentSchema = Type.Union([\n contentComponent('text', TextPropsSchema),\n contentComponent('image', PptxImagePropsSchema),\n contentComponent('shape', ShapePropsSchema),\n contentComponent('table', PptxTablePropsSchema),\n contentComponent('chart', PptxChartPropsSchema),\n contentComponent('highcharts', PptxHighchartsPropsSchema),\n], {\n discriminator: { propertyName: 'name' },\n description: 'Fixed component on a template slide (same format as slide children)',\n});\n\n// Defaults schema — partial component stub (carries styling props, not content)\n// Discriminated union so Monaco can autocomplete prop names per component type\nfunction defaultsComponent(name: string, propsSchema: TSchema) {\n return Type.Object({\n name: Type.Literal(name),\n props: Type.Partial(propsSchema, { description: 'Default props inherited by the component placed in this placeholder' }),\n }, { additionalProperties: false });\n}\n\nconst PlaceholderDefaultsSchema = Type.Union([\n defaultsComponent('text', TextPropsSchema),\n defaultsComponent('image', PptxImagePropsSchema),\n defaultsComponent('shape', ShapePropsSchema),\n defaultsComponent('table', PptxTablePropsSchema),\n defaultsComponent('chart', PptxChartPropsSchema),\n defaultsComponent('highcharts', PptxHighchartsPropsSchema),\n], {\n discriminator: { propertyName: 'name' },\n description: 'Partial component stub — styling defaults only',\n});\n\n// Placeholder definition\nexport const PlaceholderDefinitionSchema = Type.Object({\n name: Type.String({ description: 'Unique placeholder name' }),\n x: Type.Optional(Coord),\n y: Type.Optional(Coord),\n w: Type.Optional(Coord),\n h: Type.Optional(Coord),\n grid: Type.Optional(GridPositionSchema),\n defaults: Type.Optional(PlaceholderDefaultsSchema),\n}, { additionalProperties: false, description: 'Placeholder on a template slide — defaults is a component stub whose props are inherited by the actual component' });\n\n// Template slide definition\nexport const TemplateSlideDefinitionSchema = Type.Object({\n name: Type.String({ description: 'Unique template slide name' }),\n background: Type.Optional(SlideBackgroundSchema),\n margin: Type.Optional(Type.Union([\n Type.Number({ description: 'Margin in inches (all sides)' }),\n Type.Array(Type.Number(), { minItems: 4, maxItems: 4, description: 'Margin [top, right, bottom, left] in inches' }),\n ])),\n slideNumber: Type.Optional(Type.Object({\n x: Coord, y: Coord,\n w: Type.Optional(Coord),\n h: Type.Optional(Coord),\n color: Type.Optional(ColorValueSchema),\n fontSize: Type.Optional(Type.Number({ description: 'Slide number font size in points' })),\n }, { additionalProperties: false, description: 'Slide number position and styling' })),\n objects: Type.Optional(Type.Array(TemplateObjectComponentSchema, { description: 'Fixed components (logos, footers, decorations) — same { name, props } format as slide children' })),\n placeholders: Type.Optional(Type.Array(PlaceholderDefinitionSchema, { description: 'Placeholder regions for slide content' })),\n grid: Type.Optional(GridConfigSchema),\n}, { additionalProperties: false, description: 'Template slide definition (reusable slide template)' });\n\nexport type PlaceholderDefinition = Static<typeof PlaceholderDefinitionSchema>;\nexport type TemplateSlideDefinition = Static<typeof TemplateSlideDefinitionSchema>;\n","/**\n * Common Types and Schemas for PPTX Components\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport {\n ColorValueSchema,\n GradientFillSchema,\n} from '@json-to-office/shared/schemas/slide-content';\n\nexport {\n PptxAlignmentSchema,\n VerticalAlignmentSchema,\n ShadowSchema,\n GridPositionSchema,\n} from '@json-to-office/shared/schemas/slide-content';\n\nexport type {\n PptxAlignment,\n VerticalAlignment,\n Shadow,\n GridPosition,\n} from '@json-to-office/shared/schemas/slide-content';\n\nexport const PositionSchema = Type.Object(\n {\n x: Type.Optional(\n Type.Union([\n Type.Number({ description: 'X position in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'X position as percentage (e.g., \"10%\")',\n }),\n ])\n ),\n y: Type.Optional(\n Type.Union([\n Type.Number({ description: 'Y position in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Y position as percentage (e.g., \"10%\")',\n }),\n ])\n ),\n w: Type.Optional(\n Type.Union([\n Type.Number({ description: 'Width in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Width as percentage (e.g., \"80%\")',\n }),\n ])\n ),\n h: Type.Optional(\n Type.Union([\n Type.Number({ description: 'Height in inches' }),\n Type.String({\n pattern: '^\\\\d+(\\\\.\\\\d+)?%$',\n description: 'Height as percentage (e.g., \"20%\")',\n }),\n ])\n ),\n },\n {\n description: 'Position and size in inches or percentages',\n additionalProperties: false,\n }\n);\n\nexport const SlideBackgroundSchema = Type.Object(\n {\n color: Type.Optional(ColorValueSchema),\n gradient: Type.Optional(GradientFillSchema),\n image: Type.Optional(\n Type.Object(\n {\n path: Type.Optional(\n Type.String({ description: 'Image file path or URL' })\n ),\n base64: Type.Optional(\n Type.String({ description: 'Base64-encoded image data' })\n ),\n },\n { description: 'Background image', additionalProperties: false }\n )\n ),\n },\n {\n description: 'Slide background configuration',\n additionalProperties: false,\n }\n);\n\nexport const TransitionSchema = Type.Object(\n {\n type: Type.Optional(\n Type.Union(\n [\n Type.Literal('fade'),\n Type.Literal('push'),\n Type.Literal('wipe'),\n Type.Literal('zoom'),\n Type.Literal('none'),\n ],\n { description: 'Transition effect type' }\n )\n ),\n speed: Type.Optional(\n Type.Union(\n [Type.Literal('slow'), Type.Literal('medium'), Type.Literal('fast')],\n { description: 'Transition speed' }\n )\n ),\n },\n {\n description: 'Slide transition configuration',\n additionalProperties: false,\n }\n);\n\nexport type Position = Static<typeof PositionSchema>;\nexport type SlideBackground = Static<typeof SlideBackgroundSchema>;\nexport type Transition = Static<typeof TransitionSchema>;\n","/**\n * Slide Component Schema\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport { SlideBackgroundSchema, TransitionSchema } from './common';\n\nexport const SlidePropsSchema = Type.Object(\n {\n meta: Type.Optional(\n Type.Object(\n {\n title: Type.Optional(\n Type.String({\n description:\n 'Authoring label for this slide, shown in editors and outlines. Never rendered — slide content is unaffected.',\n })\n ),\n },\n {\n additionalProperties: false,\n description: 'Authoring metadata; has no effect on the presentation.',\n }\n )\n ),\n background: Type.Optional(SlideBackgroundSchema),\n transition: Type.Optional(TransitionSchema),\n notes: Type.Optional(\n Type.String({ description: 'Speaker notes for this slide' })\n ),\n layout: Type.Optional(\n Type.String({\n description: 'Slide layout name (e.g., \"Title Slide\", \"Blank\")',\n })\n ),\n hidden: Type.Optional(\n Type.Boolean({ description: 'Hide this slide from presentation' })\n ),\n template: Type.Optional(\n Type.String({ description: 'Template slide name to apply' })\n ),\n // Note: `placeholders` is added dynamically by the component registry\n // with the recursive component ref, to avoid circular imports.\n },\n {\n description: 'Slide container props',\n additionalProperties: false,\n }\n);\n\nexport type SlideProps = Static<typeof SlidePropsSchema>;\n"],"mappings":"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","names":["Type","Type","Type","ColorValueSchema","Type","Type","Type","Type","Type"]}
|
|
File without changes
|
|
File without changes
|