@json-to-office/shared-docx 0.23.0 → 0.25.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.
Files changed (48) hide show
  1. package/dist/{chunk-GJBRYTGZ.js → chunk-55OMIWMP.js} +8 -14
  2. package/dist/chunk-55OMIWMP.js.map +1 -0
  3. package/dist/{chunk-E5YI66B3.js → chunk-7TTAAYQ5.js} +9 -2
  4. package/dist/chunk-7TTAAYQ5.js.map +1 -0
  5. package/dist/{chunk-KNMPYZUO.js → chunk-AZWXGOAE.js} +88 -9
  6. package/dist/chunk-AZWXGOAE.js.map +1 -0
  7. package/dist/{chunk-3JOBFRYR.js → chunk-BA7VBTKF.js} +41 -3
  8. package/dist/chunk-BA7VBTKF.js.map +1 -0
  9. package/dist/{chunk-S4TSENRQ.js → chunk-BRXPJ26B.js} +8 -4
  10. package/dist/chunk-BRXPJ26B.js.map +1 -0
  11. package/dist/{chunk-FNCLWYTA.js → chunk-DTBB6YZI.js} +2 -2
  12. package/dist/{chunk-2TQ74H6S.js → chunk-JFMVBHIY.js} +2 -2
  13. package/dist/{chunk-HTOT7PVC.js → chunk-MF2PDHIE.js} +42 -5
  14. package/dist/chunk-MF2PDHIE.js.map +1 -0
  15. package/dist/{chunk-U7UNC7QH.js → chunk-O3RPJ35G.js} +2 -2
  16. package/dist/{chunk-YQE7H4H4.js → chunk-Q3H7Z724.js} +15 -7
  17. package/dist/chunk-Q3H7Z724.js.map +1 -0
  18. package/dist/{chunk-7636IMZ5.js → chunk-YCDRARTU.js} +2 -2
  19. package/dist/index.d.ts +1076 -2
  20. package/dist/index.js +31 -18
  21. package/dist/index.js.map +1 -1
  22. package/dist/schemas/api.js +6 -5
  23. package/dist/schemas/component-defaults.d.ts +38 -0
  24. package/dist/schemas/component-defaults.js +2 -2
  25. package/dist/schemas/component-registry.js +4 -3
  26. package/dist/schemas/components.d.ts +2430 -220
  27. package/dist/schemas/components.js +15 -4
  28. package/dist/schemas/document.js +7 -6
  29. package/dist/schemas/export.js +5 -4
  30. package/dist/schemas/font.d.ts +3 -1
  31. package/dist/schemas/font.js +1 -1
  32. package/dist/schemas/generator.js +5 -4
  33. package/dist/schemas/theme.d.ts +1113 -1
  34. package/dist/schemas/theme.js +7 -3
  35. package/dist/validation/unified/index.d.ts +1087 -9
  36. package/dist/validation/unified/index.js +9 -9
  37. package/package.json +2 -2
  38. package/dist/chunk-3JOBFRYR.js.map +0 -1
  39. package/dist/chunk-E5YI66B3.js.map +0 -1
  40. package/dist/chunk-GJBRYTGZ.js.map +0 -1
  41. package/dist/chunk-HTOT7PVC.js.map +0 -1
  42. package/dist/chunk-KNMPYZUO.js.map +0 -1
  43. package/dist/chunk-S4TSENRQ.js.map +0 -1
  44. package/dist/chunk-YQE7H4H4.js.map +0 -1
  45. /package/dist/{chunk-FNCLWYTA.js.map → chunk-DTBB6YZI.js.map} +0 -0
  46. /package/dist/{chunk-2TQ74H6S.js.map → chunk-JFMVBHIY.js.map} +0 -0
  47. /package/dist/{chunk-U7UNC7QH.js.map → chunk-O3RPJ35G.js.map} +0 -0
  48. /package/dist/{chunk-7636IMZ5.js.map → chunk-YCDRARTU.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/generator.ts"],"sourcesContent":["/**\n * Unified Document Schema Generator - SHARED UTILITY\n *\n * This is the SHARED implementation for generating document schemas.\n * It's used by MULTIPLE CONSUMERS with different requirements:\n *\n * 1. BUILD-TIME: generate-schemas.mjs uses this to create static .schema.json files\n * - Only standard components (no custom components available at build time)\n * - Outputs to filesystem for IDE autocomplete\n *\n * 2. RUNTIME PLUGIN: plugin/schema.ts uses this for plugin-enhanced schemas\n * - Includes custom components registered at runtime\n * - Cannot be generated at build time (components must be instantiated)\n *\n * 3. WEB APP: Monaco editor may use this for in-browser validation\n * - Optimized for browser environment\n * - No filesystem access\n *\n * This separation is ARCHITECTURAL, not accidental:\n * - Build-time vs runtime constraints are incompatible\n * - Custom components require runtime instantiation\n * - Different consumers need different output formats\n *\n * IMPORTANT: Standard components are defined in component-registry.ts (SINGLE SOURCE OF TRUTH).\n * This generator consumes that registry to ensure consistency across all schema generation.\n */\n\nimport { Type, TSchema } from '@sinclair/typebox';\nimport {\n createAllComponentSchemasNarrowed,\n getStandardComponent,\n} from './component-registry';\nimport { latestVersion } from '@json-to-office/shared';\n\n/**\n * Per-version props schema entry\n */\nexport interface VersionedPropsEntry {\n version: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n description?: string;\n}\n\n/**\n * Custom component interface for plugins\n */\nexport interface CustomComponentInfo {\n name: string;\n propsSchema: TSchema;\n /** When true, the component includes an optional `children` array */\n hasChildren?: boolean;\n /** Human-readable description shown in autocomplete */\n description?: string;\n /**\n * Per-version props schemas for version-discriminated validation.\n * When provided, separate schema variants are generated per version,\n * each pairing its version literal with its specific props schema.\n * A \"no version\" fallback variant uses the latest version's props.\n */\n versionedProps?: VersionedPropsEntry[];\n}\n\n/**\n * Options for generating document schema\n */\nexport interface GenerateDocumentSchemaOptions {\n includeStandardComponents?: boolean;\n includeTheme?: boolean;\n customComponents?: CustomComponentInfo[];\n title?: string;\n description?: string;\n}\n\n/**\n * Generate a complete document schema with all components\n *\n * This is the SHARED IMPLEMENTATION used by:\n * - Build-time schema generation (standard components only)\n * - Runtime plugin schema generation (with custom components)\n * - Web app schema generation (optimized for browser)\n *\n * @param options Configuration for what to include in the schema\n * @returns TypeBox schema that can be converted to JSON Schema\n */\nexport function generateUnifiedDocumentSchema(\n options: GenerateDocumentSchemaOptions = {}\n): TSchema {\n const {\n includeStandardComponents = true,\n customComponents = [],\n title = 'JSON Report Definition',\n description = 'JSON report definition with TypeBox schemas',\n } = options;\n\n // Captured from inside the recursive callback for the root's children.\n let capturedRootChildSchemas: TSchema[] = [];\n let capturedPluginSchemas: TSchema[] = [];\n\n // Create a recursive component definition schema\n const ComponentDefinition = Type.Recursive(\n (This) => {\n // ── Phase 1: Build plugin schemas (plugins get Self for arbitrary nesting) ──\n const pluginSchemas: TSchema[] = [];\n\n for (const customComponent of customComponents) {\n if (\n customComponent.versionedProps &&\n customComponent.versionedProps.length > 0\n ) {\n // Version-discriminated: one variant per version + one \"no version\" fallback\n const versionEntries = customComponent.versionedProps;\n const latest = latestVersion(versionEntries.map((e) => e.version));\n\n // Per-version variants: version is required, props are version-specific\n for (const entry of versionEntries) {\n const versionLiteralDesc =\n entry.description || customComponent.description;\n const schema: Record<string, TSchema> = {\n name: Type.Literal(customComponent.name),\n id: Type.Optional(Type.String()),\n version: versionLiteralDesc\n ? Type.Literal(entry.version, {\n description: versionLiteralDesc,\n })\n : Type.Literal(entry.version),\n props: entry.propsSchema,\n };\n if (entry.hasChildren) {\n schema.children = Type.Optional(Type.Array(This));\n }\n const versionDesc = entry.description\n ? `${customComponent.name} v${entry.version} — ${entry.description}`\n : customComponent.description\n ? `${customComponent.name} v${entry.version} — ${customComponent.description}`\n : `${customComponent.name} v${entry.version}`;\n pluginSchemas.push(\n Type.Object(schema, {\n additionalProperties: false,\n description: versionDesc,\n })\n );\n }\n\n // \"No version\" fallback: version is NOT allowed, uses latest props\n const latestEntry = versionEntries.find((e) => e.version === latest)!;\n const fallbackSchema: Record<string, TSchema> = {\n name: Type.Literal(customComponent.name),\n id: Type.Optional(Type.String()),\n props: latestEntry.propsSchema,\n };\n if (latestEntry.hasChildren) {\n fallbackSchema.children = Type.Optional(Type.Array(This));\n }\n const fallbackDesc = latestEntry.description\n ? `${customComponent.name} (latest: v${latest}) — ${latestEntry.description}`\n : customComponent.description\n ? `${customComponent.name} (latest: v${latest}) — ${customComponent.description}`\n : `${customComponent.name} (latest: v${latest})`;\n pluginSchemas.push(\n Type.Object(fallbackSchema, {\n additionalProperties: false,\n description: fallbackDesc,\n })\n );\n } else {\n // Non-versioned component: single variant\n const hasChildren = !!customComponent.hasChildren;\n const schema: Record<string, TSchema> = {\n name: Type.Literal(customComponent.name),\n id: Type.Optional(Type.String()),\n props: customComponent.propsSchema,\n };\n if (hasChildren) {\n schema.children = Type.Optional(Type.Array(This));\n }\n pluginSchemas.push(\n Type.Object(schema, {\n additionalProperties: false,\n ...(customComponent.description\n ? { description: customComponent.description }\n : {}),\n })\n );\n }\n }\n\n // ── Phase 2: Build standard components with narrowed children ──\n const { schemas: standardSchemas, byName } = includeStandardComponents\n ? createAllComponentSchemasNarrowed(This, pluginSchemas)\n : { schemas: [] as TSchema[], byName: new Map<string, TSchema>() };\n\n // Capture the root's permitted children + plugins. Must happen inside\n // the callback while standardSchemas is available.\n //\n // The root accepts `section` *and* everything a section accepts: the\n // runtime validator and generator both take content components placed\n // directly under `docx` (examples/contract-v1.docx.json is written that\n // way), so a section-only schema reddened valid documents in\n // schema-driven editors.\n const sectionComponent = getStandardComponent('section');\n capturedRootChildSchemas = [\n 'section',\n ...(sectionComponent?.allowedChildren ?? []),\n ]\n .map((componentName) => byName.get(componentName))\n .filter((schema): schema is TSchema => schema !== undefined);\n capturedPluginSchemas = pluginSchemas;\n\n const componentSchemas = [...standardSchemas, ...pluginSchemas];\n\n // Create the union based on the number of schemas\n if (componentSchemas.length === 0) {\n return Type.Any();\n } else if (componentSchemas.length === 1) {\n return componentSchemas[0];\n } else {\n const componentDescription =\n customComponents.length > 0\n ? 'Component definition with discriminated union including custom components'\n : 'Component definition with discriminated union';\n\n return Type.Union(componentSchemas, {\n discriminator: { propertyName: 'name' },\n description: componentDescription,\n });\n }\n },\n { $id: 'ComponentDefinition' }\n );\n\n // Build root docx schema with narrowed children (section + section's own\n // permitted content). ComponentDefinition is embedded in `definitions` so\n // that $refs inside section header/footer and table cell content resolve.\n const reportComponent = getStandardComponent('docx');\n if (!reportComponent) {\n throw new Error('Docx root component not found in registry');\n }\n\n if (capturedRootChildSchemas.length === 0) {\n throw new Error(\n 'Root child schemas not found in narrowed standard schemas'\n );\n }\n\n return Type.Object(\n {\n name: Type.Literal('docx'),\n id: Type.Optional(Type.String()),\n $schema: Type.Optional(Type.String({ format: 'uri' })),\n // Optional so the exported schema agrees with the runtime validator and\n // the generator, both of which treat a propless root as `props: {}`.\n // Schema-driven editors would otherwise flag a document that builds.\n props: Type.Optional(reportComponent.propsSchema),\n children: Type.Optional(\n Type.Array(\n Type.Union([...capturedRootChildSchemas, ...capturedPluginSchemas], {\n discriminator: { propertyName: 'name' },\n })\n )\n ),\n },\n {\n additionalProperties: false,\n title,\n description,\n // Embed ComponentDefinition so convertToJsonSchema extracts it to\n // definitions and bare $ref: \"ComponentDefinition\" values resolve.\n definitions: { ComponentDefinition },\n } as Record<string, unknown>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ComponentDefinitionSchema
3
- } from "./chunk-2TQ74H6S.js";
3
+ } from "./chunk-JFMVBHIY.js";
4
4
 
5
5
  // src/schemas/api.ts
6
6
  import { Type } from "@sinclair/typebox";
@@ -94,4 +94,4 @@ export {
94
94
  GenerateDocumentResponseSchema,
95
95
  ValidateDocumentResponseSchema
96
96
  };
97
- //# sourceMappingURL=chunk-7636IMZ5.js.map
97
+ //# sourceMappingURL=chunk-YCDRARTU.js.map