@json-to-office/shared-pptx 0.33.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-T5NRY622.js → chunk-2MZVIHSQ.js} +36 -11
- 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-5WPJY4C7.js → chunk-5WT7G2OG.js} +20 -3
- package/dist/chunk-5WT7G2OG.js.map +1 -0
- package/dist/{chunk-DVNOCBTM.js → chunk-F3FQ7ADB.js} +2 -2
- package/dist/{chunk-M5PJJLWM.js → chunk-N6CABSXM.js} +6 -2
- package/dist/chunk-N6CABSXM.js.map +1 -0
- package/dist/{chunk-BW2YGLUL.js → chunk-YSJMKGLM.js} +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -5
- package/dist/index.js.map +1 -1
- package/dist/schemas/component-defaults.d.ts +12 -0
- package/dist/schemas/component-registry.d.ts +10 -2
- package/dist/schemas/component-registry.js +3 -2
- package/dist/schemas/component-union.js +4 -3
- package/dist/schemas/components.d.ts +82 -0
- package/dist/schemas/components.js +4 -3
- package/dist/schemas/document.js +5 -4
- package/dist/schemas/generator.js +4 -3
- package/dist/schemas/renderer.d.ts +19 -0
- package/dist/schemas/renderer.js +15 -0
- package/dist/schemas/renderer.js.map +1 -0
- package/dist/schemas/theme.d.ts +41 -0
- package/dist/schemas/theme.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-5WPJY4C7.js.map +0 -1
- package/dist/chunk-M5PJJLWM.js.map +0 -1
- package/dist/chunk-T5NRY622.js.map +0 -1
- /package/dist/{chunk-DVNOCBTM.js.map → chunk-F3FQ7ADB.js.map} +0 -0
- /package/dist/{chunk-BW2YGLUL.js.map → chunk-YSJMKGLM.js.map} +0 -0
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PPTX_RENDERER_IDS,
|
|
3
|
+
isPptxComponentSupported,
|
|
4
|
+
pptxPropsSchemaForRenderer
|
|
5
|
+
} from "./chunk-2YEV3CJF.js";
|
|
1
6
|
import {
|
|
2
7
|
ColorValueSchema,
|
|
3
8
|
GridConfigSchema,
|
|
4
9
|
ThemeConfigSchema
|
|
5
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-N6CABSXM.js";
|
|
6
11
|
import {
|
|
7
12
|
PptxChartPropsSchema,
|
|
8
13
|
PptxComponentDefaultsSchema,
|
|
@@ -19,6 +24,7 @@ import { PPTX_SLIDE_CONTENT_COMPONENTS } from "@json-to-office/shared/schemas/sl
|
|
|
19
24
|
|
|
20
25
|
// src/schemas/components/presentation.ts
|
|
21
26
|
import { Type as Type3 } from "@sinclair/typebox";
|
|
27
|
+
import { FontRegistrySchema } from "@json-to-office/shared";
|
|
22
28
|
|
|
23
29
|
// src/schemas/components/template.ts
|
|
24
30
|
import { Type as Type2 } from "@sinclair/typebox";
|
|
@@ -234,6 +240,7 @@ var PresentationPropsSchema = Type3.Object(
|
|
|
234
240
|
}
|
|
235
241
|
)
|
|
236
242
|
),
|
|
243
|
+
fontRegistry: Type3.Optional(FontRegistrySchema),
|
|
237
244
|
slideWidth: Type3.Optional(
|
|
238
245
|
Type3.Number({
|
|
239
246
|
description: "Slide width in inches (default: 10)",
|
|
@@ -369,7 +376,7 @@ function getPptxContentComponents() {
|
|
|
369
376
|
function isPptxStandardComponent(name) {
|
|
370
377
|
return PPTX_STANDARD_COMPONENTS_REGISTRY.some((c) => c.name === name);
|
|
371
378
|
}
|
|
372
|
-
function createPptxComponentSchemaObject(component, recursiveRef, placeholderRef) {
|
|
379
|
+
function createPptxComponentSchemaObject(component, recursiveRef, placeholderRef, profile) {
|
|
373
380
|
const schema = {
|
|
374
381
|
name: Type5.Literal(component.name),
|
|
375
382
|
id: Type5.Optional(Type5.String()),
|
|
@@ -382,13 +389,31 @@ function createPptxComponentSchemaObject(component, recursiveRef, placeholderRef
|
|
|
382
389
|
};
|
|
383
390
|
if (component.special?.hasSchemaField) {
|
|
384
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
|
+
);
|
|
385
406
|
}
|
|
386
|
-
schema.props =
|
|
407
|
+
schema.props = profile ? pptxPropsSchemaForRenderer(
|
|
408
|
+
component.name,
|
|
409
|
+
component.propsSchema,
|
|
410
|
+
profile.renderer
|
|
411
|
+
) : component.propsSchema;
|
|
387
412
|
if (component.hasChildren && recursiveRef) {
|
|
388
413
|
schema.children = Type5.Optional(Type5.Array(recursiveRef));
|
|
389
414
|
}
|
|
390
|
-
if (component.hasPlaceholders && (placeholderRef ?? recursiveRef)) {
|
|
391
|
-
const baseProperties =
|
|
415
|
+
if (component.hasPlaceholders && (placeholderRef ?? recursiveRef) && profile?.renderer !== "office-open") {
|
|
416
|
+
const baseProperties = schema.props.properties ?? {};
|
|
392
417
|
const phRef = placeholderRef ?? recursiveRef;
|
|
393
418
|
schema.props = Type5.Object(
|
|
394
419
|
{
|
|
@@ -415,13 +440,13 @@ function createAllPptxComponentSchemas(recursiveRef) {
|
|
|
415
440
|
(component) => createPptxComponentSchemaObject(component, recursiveRef)
|
|
416
441
|
);
|
|
417
442
|
}
|
|
418
|
-
function createAllPptxComponentSchemasNarrowed(selfRef, pluginSchemas = []) {
|
|
443
|
+
function createAllPptxComponentSchemasNarrowed(selfRef, pluginSchemas = [], profile) {
|
|
419
444
|
const leafSchemas = /* @__PURE__ */ new Map();
|
|
420
445
|
for (const comp of PPTX_STANDARD_COMPONENTS_REGISTRY) {
|
|
421
|
-
if (!comp.hasChildren) {
|
|
446
|
+
if (!comp.hasChildren && (!profile || isPptxComponentSupported(comp.name, profile.renderer))) {
|
|
422
447
|
leafSchemas.set(
|
|
423
448
|
comp.name,
|
|
424
|
-
createPptxComponentSchemaObject(comp, void 0, selfRef)
|
|
449
|
+
createPptxComponentSchemaObject(comp, void 0, selfRef, profile)
|
|
425
450
|
);
|
|
426
451
|
}
|
|
427
452
|
}
|
|
@@ -437,7 +462,7 @@ function createAllPptxComponentSchemasNarrowed(selfRef, pluginSchemas = []) {
|
|
|
437
462
|
if (!comp.allowedChildren) {
|
|
438
463
|
resolved.set(
|
|
439
464
|
comp.name,
|
|
440
|
-
createPptxComponentSchemaObject(comp, selfRef, selfRef)
|
|
465
|
+
createPptxComponentSchemaObject(comp, selfRef, selfRef, profile)
|
|
441
466
|
);
|
|
442
467
|
pending.splice(i, 1);
|
|
443
468
|
continue;
|
|
@@ -451,7 +476,7 @@ function createAllPptxComponentSchemasNarrowed(selfRef, pluginSchemas = []) {
|
|
|
451
476
|
const childrenType = allChildSchemas.length === 1 ? allChildSchemas[0] : Type5.Union(allChildSchemas);
|
|
452
477
|
resolved.set(
|
|
453
478
|
comp.name,
|
|
454
|
-
createPptxComponentSchemaObject(comp, childrenType, selfRef)
|
|
479
|
+
createPptxComponentSchemaObject(comp, childrenType, selfRef, profile)
|
|
455
480
|
);
|
|
456
481
|
pending.splice(i, 1);
|
|
457
482
|
}
|
|
@@ -485,4 +510,4 @@ export {
|
|
|
485
510
|
createAllPptxComponentSchemas,
|
|
486
511
|
createAllPptxComponentSchemasNarrowed
|
|
487
512
|
};
|
|
488
|
-
//# 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
|
|
@@ -4,7 +4,10 @@ import {
|
|
|
4
4
|
|
|
5
5
|
// src/schemas/theme.ts
|
|
6
6
|
import { Type } from "@sinclair/typebox";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
FontFamilyNameSchema,
|
|
9
|
+
FontRegistrySchema
|
|
10
|
+
} from "@json-to-office/shared";
|
|
8
11
|
import {
|
|
9
12
|
ColorValueSchema,
|
|
10
13
|
STYLE_NAMES
|
|
@@ -114,6 +117,7 @@ var ThemeConfigSchema = Type.Object(
|
|
|
114
117
|
},
|
|
115
118
|
{ additionalProperties: false, description: "Font families" }
|
|
116
119
|
),
|
|
120
|
+
fontRegistry: Type.Optional(FontRegistrySchema),
|
|
117
121
|
defaults: Type.Object(
|
|
118
122
|
{
|
|
119
123
|
fontSize: Type.Number({ description: "Default font size in points" }),
|
|
@@ -155,4 +159,4 @@ export {
|
|
|
155
159
|
STYLE_NAMES2 as STYLE_NAMES,
|
|
156
160
|
StyleNameSchema
|
|
157
161
|
};
|
|
158
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-N6CABSXM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/theme.ts"],"sourcesContent":["/**\n * PPTX Theme Schema\n * Simplified theme configuration for presentations\n */\nimport { Type, Static } from '@sinclair/typebox';\nimport {\n FontFamilyNameSchema,\n FontRegistrySchema,\n} from '@json-to-office/shared';\nimport {\n ColorValueSchema,\n STYLE_NAMES,\n} from '@json-to-office/shared/schemas/slide-content';\nimport { PptxComponentDefaultsSchema } from './component-defaults';\n\nexport {\n ColorValueSchema,\n SEMANTIC_COLOR_NAMES,\n SEMANTIC_COLOR_ALIASES,\n STYLE_NAMES,\n StyleNameSchema,\n} from '@json-to-office/shared/schemas/slide-content';\nexport type { StyleName } from '@json-to-office/shared/schemas/slide-content';\n\nexport const GridMarginSchema = Type.Union(\n [\n Type.Number({ description: 'Margin in inches (all sides)' }),\n Type.Object(\n {\n top: Type.Number({ description: 'Top margin in inches' }),\n right: Type.Number({ description: 'Right margin in inches' }),\n bottom: Type.Number({ description: 'Bottom margin in inches' }),\n left: Type.Number({ description: 'Left margin in inches' }),\n },\n { additionalProperties: false }\n ),\n ],\n { description: 'Slide margins in inches' }\n);\n\nexport const GridGutterSchema = Type.Union(\n [\n Type.Number({ description: 'Gutter in inches (both axes)' }),\n Type.Object(\n {\n column: Type.Number({ description: 'Column gutter in inches' }),\n row: Type.Number({ description: 'Row gutter in inches' }),\n },\n { additionalProperties: false }\n ),\n ],\n { description: 'Gaps between grid tracks in inches' }\n);\n\nexport const GridConfigSchema = Type.Object(\n {\n columns: Type.Optional(\n Type.Number({\n minimum: 1,\n description: 'Number of columns (default: 12)',\n })\n ),\n rows: Type.Optional(\n Type.Number({ minimum: 1, description: 'Number of rows (default: 6)' })\n ),\n margin: Type.Optional(GridMarginSchema),\n gutter: Type.Optional(GridGutterSchema),\n },\n { additionalProperties: false, description: 'Grid layout configuration' }\n);\n\nexport type GridMargin = Static<typeof GridMarginSchema>;\nexport type GridGutter = Static<typeof GridGutterSchema>;\nexport type GridConfig = Static<typeof GridConfigSchema>;\n\nconst HexColorSchema = Type.String({\n pattern: '^#?[0-9A-Fa-f]{6}$',\n description: 'Hex color (e.g. #FF0000)',\n});\n\nexport const TextStyleSchema = Type.Object(\n {\n fontSize: Type.Optional(Type.Number()),\n fontFace: Type.Optional(FontFamilyNameSchema),\n fontColor: Type.Optional(ColorValueSchema),\n bold: Type.Optional(Type.Boolean()),\n fontWeight: Type.Optional(Type.Integer({ minimum: 100, maximum: 900 })),\n italic: Type.Optional(Type.Boolean()),\n align: Type.Optional(\n Type.Union([\n Type.Literal('left'),\n Type.Literal('center'),\n Type.Literal('right'),\n Type.Literal('justify'),\n ])\n ),\n lineSpacing: Type.Optional(Type.Number()),\n charSpacing: Type.Optional(Type.Number()),\n paraSpaceAfter: Type.Optional(Type.Number()),\n },\n { additionalProperties: false, description: 'Text style preset' }\n);\n\nexport type TextStyle = Static<typeof TextStyleSchema>;\n\n// ── Theme config ───────────────────────────────────────────────────\n\nexport const ThemeConfigSchema = Type.Object(\n {\n name: Type.String({ description: 'Theme name' }),\n colors: Type.Object(\n {\n primary: HexColorSchema,\n secondary: HexColorSchema,\n accent: HexColorSchema,\n background: HexColorSchema,\n text: HexColorSchema,\n text2: Type.Optional(HexColorSchema),\n background2: Type.Optional(HexColorSchema),\n accent4: Type.Optional(HexColorSchema),\n accent5: Type.Optional(HexColorSchema),\n accent6: Type.Optional(HexColorSchema),\n },\n {\n additionalProperties: false,\n description: 'Theme color palette (10-slot scheme)',\n }\n ),\n fonts: Type.Object(\n {\n heading: FontFamilyNameSchema,\n body: FontFamilyNameSchema,\n },\n { additionalProperties: false, description: 'Font families' }\n ),\n fontRegistry: Type.Optional(FontRegistrySchema),\n defaults: Type.Object(\n {\n fontSize: Type.Number({ description: 'Default font size in points' }),\n fontColor: HexColorSchema,\n },\n { additionalProperties: false, description: 'Default text styling' }\n ),\n styles: Type.Optional(\n Type.Partial(\n Type.Object(\n Object.fromEntries(\n STYLE_NAMES.map((n) => [n, TextStyleSchema])\n ) as Record<string, typeof TextStyleSchema>\n ),\n { additionalProperties: false, description: 'Named text style presets' }\n )\n ),\n componentDefaults: Type.Optional(PptxComponentDefaultsSchema),\n },\n {\n additionalProperties: false,\n description: 'Presentation theme configuration',\n }\n);\n\nexport type ThemeConfigJson = Static<typeof ThemeConfigSchema>;\n\nexport function isValidThemeConfig(data: unknown): data is ThemeConfigJson {\n return typeof data === 'object' && data !== null;\n}\n"],"mappings":";;;;;AAIA,SAAS,YAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE,oBAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,OACK;AAGA,IAAM,mBAAmB,KAAK;AAAA,EACnC;AAAA,IACE,KAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;AAAA,IAC3D,KAAK;AAAA,MACH;AAAA,QACE,KAAK,KAAK,OAAO,EAAE,aAAa,uBAAuB,CAAC;AAAA,QACxD,OAAO,KAAK,OAAO,EAAE,aAAa,yBAAyB,CAAC;AAAA,QAC5D,QAAQ,KAAK,OAAO,EAAE,aAAa,0BAA0B,CAAC;AAAA,QAC9D,MAAM,KAAK,OAAO,EAAE,aAAa,wBAAwB,CAAC;AAAA,MAC5D;AAAA,MACA,EAAE,sBAAsB,MAAM;AAAA,IAChC;AAAA,EACF;AAAA,EACA,EAAE,aAAa,0BAA0B;AAC3C;AAEO,IAAM,mBAAmB,KAAK;AAAA,EACnC;AAAA,IACE,KAAK,OAAO,EAAE,aAAa,+BAA+B,CAAC;AAAA,IAC3D,KAAK;AAAA,MACH;AAAA,QACE,QAAQ,KAAK,OAAO,EAAE,aAAa,0BAA0B,CAAC;AAAA,QAC9D,KAAK,KAAK,OAAO,EAAE,aAAa,uBAAuB,CAAC;AAAA,MAC1D;AAAA,MACA,EAAE,sBAAsB,MAAM;AAAA,IAChC;AAAA,EACF;AAAA,EACA,EAAE,aAAa,qCAAqC;AACtD;AAEO,IAAM,mBAAmB,KAAK;AAAA,EACnC;AAAA,IACE,SAAS,KAAK;AAAA,MACZ,KAAK,OAAO;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACA,MAAM,KAAK;AAAA,MACT,KAAK,OAAO,EAAE,SAAS,GAAG,aAAa,8BAA8B,CAAC;AAAA,IACxE;AAAA,IACA,QAAQ,KAAK,SAAS,gBAAgB;AAAA,IACtC,QAAQ,KAAK,SAAS,gBAAgB;AAAA,EACxC;AAAA,EACA,EAAE,sBAAsB,OAAO,aAAa,4BAA4B;AAC1E;AAMA,IAAM,iBAAiB,KAAK,OAAO;AAAA,EACjC,SAAS;AAAA,EACT,aAAa;AACf,CAAC;AAEM,IAAM,kBAAkB,KAAK;AAAA,EAClC;AAAA,IACE,UAAU,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,IACrC,UAAU,KAAK,SAAS,oBAAoB;AAAA,IAC5C,WAAW,KAAK,SAAS,gBAAgB;AAAA,IACzC,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,IAClC,YAAY,KAAK,SAAS,KAAK,QAAQ,EAAE,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,IACtE,QAAQ,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,IACpC,OAAO,KAAK;AAAA,MACV,KAAK,MAAM;AAAA,QACT,KAAK,QAAQ,MAAM;AAAA,QACnB,KAAK,QAAQ,QAAQ;AAAA,QACrB,KAAK,QAAQ,OAAO;AAAA,QACpB,KAAK,QAAQ,SAAS;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACA,aAAa,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,IACxC,aAAa,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,IACxC,gBAAgB,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EAC7C;AAAA,EACA,EAAE,sBAAsB,OAAO,aAAa,oBAAoB;AAClE;AAMO,IAAM,oBAAoB,KAAK;AAAA,EACpC;AAAA,IACE,MAAM,KAAK,OAAO,EAAE,aAAa,aAAa,CAAC;AAAA,IAC/C,QAAQ,KAAK;AAAA,MACX;AAAA,QACE,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,OAAO,KAAK,SAAS,cAAc;AAAA,QACnC,aAAa,KAAK,SAAS,cAAc;AAAA,QACzC,SAAS,KAAK,SAAS,cAAc;AAAA,QACrC,SAAS,KAAK,SAAS,cAAc;AAAA,QACrC,SAAS,KAAK,SAAS,cAAc;AAAA,MACvC;AAAA,MACA;AAAA,QACE,sBAAsB;AAAA,QACtB,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,OAAO,KAAK;AAAA,MACV;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,EAAE,sBAAsB,OAAO,aAAa,gBAAgB;AAAA,IAC9D;AAAA,IACA,cAAc,KAAK,SAAS,kBAAkB;AAAA,IAC9C,UAAU,KAAK;AAAA,MACb;AAAA,QACE,UAAU,KAAK,OAAO,EAAE,aAAa,8BAA8B,CAAC;AAAA,QACpE,WAAW;AAAA,MACb;AAAA,MACA,EAAE,sBAAsB,OAAO,aAAa,uBAAuB;AAAA,IACrE;AAAA,IACA,QAAQ,KAAK;AAAA,MACX,KAAK;AAAA,QACH,KAAK;AAAA,UACH,OAAO;AAAA,YACL,YAAY,IAAI,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC;AAAA,UAC7C;AAAA,QACF;AAAA,QACA,EAAE,sBAAsB,OAAO,aAAa,2BAA2B;AAAA,MACzE;AAAA,IACF;AAAA,IACA,mBAAmB,KAAK,SAAS,2BAA2B;AAAA,EAC9D;AAAA,EACA;AAAA,IACE,sBAAsB;AAAA,IACtB,aAAa;AAAA,EACf;AACF;AAIO,SAAS,mBAAmB,MAAwC;AACzE,SAAO,OAAO,SAAS,YAAY,SAAS;AAC9C;","names":["ColorValueSchema","STYLE_NAMES"]}
|
|
@@ -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,
|
|
@@ -42,7 +47,7 @@ import {
|
|
|
42
47
|
TextStyleSchema,
|
|
43
48
|
ThemeConfigSchema,
|
|
44
49
|
isValidThemeConfig
|
|
45
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-N6CABSXM.js";
|
|
46
51
|
import {
|
|
47
52
|
ChartComponentDefaultsSchema,
|
|
48
53
|
GradientFillSchema,
|
|
@@ -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,
|