@json-to-office/shared-docx 0.1.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 (59) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +9 -0
  3. package/dist/chunk-5533WPL6.js +1895 -0
  4. package/dist/chunk-5533WPL6.js.map +1 -0
  5. package/dist/chunk-AA4HIXRG.js +34 -0
  6. package/dist/chunk-AA4HIXRG.js.map +1 -0
  7. package/dist/chunk-BEPLK76M.js +454 -0
  8. package/dist/chunk-BEPLK76M.js.map +1 -0
  9. package/dist/chunk-BOUURUYX.js +364 -0
  10. package/dist/chunk-BOUURUYX.js.map +1 -0
  11. package/dist/chunk-EKWM2CWA.js +97 -0
  12. package/dist/chunk-EKWM2CWA.js.map +1 -0
  13. package/dist/chunk-ET6YMNMF.js +35 -0
  14. package/dist/chunk-ET6YMNMF.js.map +1 -0
  15. package/dist/chunk-F5LVWDTY.js +57 -0
  16. package/dist/chunk-F5LVWDTY.js.map +1 -0
  17. package/dist/chunk-HHMK2RWF.js +274 -0
  18. package/dist/chunk-HHMK2RWF.js.map +1 -0
  19. package/dist/chunk-LOE6BZQG.js +750 -0
  20. package/dist/chunk-LOE6BZQG.js.map +1 -0
  21. package/dist/chunk-LWR4TFZ5.js +121 -0
  22. package/dist/chunk-LWR4TFZ5.js.map +1 -0
  23. package/dist/chunk-VP3X6DBP.js +44 -0
  24. package/dist/chunk-VP3X6DBP.js.map +1 -0
  25. package/dist/document-validator-CiaGiy1v.d.ts +119 -0
  26. package/dist/index.d.ts +938 -0
  27. package/dist/index.js +1129 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/schemas/api.d.ts +46 -0
  30. package/dist/schemas/api.js +16 -0
  31. package/dist/schemas/api.js.map +1 -0
  32. package/dist/schemas/component-registry.d.ts +90 -0
  33. package/dist/schemas/component-registry.js +24 -0
  34. package/dist/schemas/component-registry.js.map +1 -0
  35. package/dist/schemas/components.d.ts +755 -0
  36. package/dist/schemas/components.js +94 -0
  37. package/dist/schemas/components.js.map +1 -0
  38. package/dist/schemas/custom-components.d.ts +59 -0
  39. package/dist/schemas/custom-components.js +11 -0
  40. package/dist/schemas/custom-components.js.map +1 -0
  41. package/dist/schemas/document.d.ts +43 -0
  42. package/dist/schemas/document.js +19 -0
  43. package/dist/schemas/document.js.map +1 -0
  44. package/dist/schemas/export.d.ts +67 -0
  45. package/dist/schemas/export.js +19 -0
  46. package/dist/schemas/export.js.map +1 -0
  47. package/dist/schemas/font.d.ts +57 -0
  48. package/dist/schemas/font.js +11 -0
  49. package/dist/schemas/font.js.map +1 -0
  50. package/dist/schemas/generator.d.ts +80 -0
  51. package/dist/schemas/generator.js +9 -0
  52. package/dist/schemas/generator.js.map +1 -0
  53. package/dist/schemas/theme.d.ts +3354 -0
  54. package/dist/schemas/theme.js +42 -0
  55. package/dist/schemas/theme.js.map +1 -0
  56. package/dist/validation/unified/index.d.ts +720 -0
  57. package/dist/validation/unified/index.js +154 -0
  58. package/dist/validation/unified/index.js.map +1 -0
  59. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/validation/unified/error-transformer.ts","../src/validation/unified/deep-validator.ts","../src/validation/unified/base-validator.ts","../src/validation/unified/document-validator.ts"],"sourcesContent":["/**\n * Unified error transformation utilities\n * Converts TypeBox ValueError objects to standardized ValidationError format\n */\n\nimport type { ValueError } from '@sinclair/typebox/value';\nimport type { ValidationError } from '@json-to-office/shared';\nimport { ReportPropsSchema } from '../../schemas/components/report';\nimport {\n isObjectSchema,\n getObjectSchemaPropertyNames,\n getLiteralValue,\n type ErrorFormatterConfig,\n createErrorConfig,\n formatErrorMessage,\n ERROR_EMOJIS,\n} from '@json-to-office/shared';\n\n/**\n * Generate enhanced error message based on error type and context\n */\nfunction generateEnhancedMessage(\n error: ValueError,\n _config: Required<ErrorFormatterConfig>\n): string {\n const typeStr = String(error.type || '');\n const path = error.path || 'root';\n\n // Handle union errors specially - these are the most common and least helpful\n if (typeStr === '62' || typeStr === 'union') {\n return generateUnionErrorMessage(error);\n }\n\n // Handle additional properties error\n if (error.message?.includes('additionalProperties')) {\n return generateAdditionalPropertiesMessage(error);\n }\n\n // Handle missing required properties\n if (error.message?.includes('Required property')) {\n return generateRequiredPropertyMessage(error);\n }\n\n // Handle type mismatches\n if (\n typeStr === 'string' ||\n typeStr === 'number' ||\n typeStr === 'boolean' ||\n typeStr === 'array' ||\n typeStr === 'object'\n ) {\n return generateTypeMismatchMessage(error);\n }\n\n // Handle literal value errors\n if (typeStr === 'literal') {\n return generateLiteralErrorMessage(error);\n }\n\n // Handle pattern/regex errors\n if (typeStr === 'pattern' || typeStr === 'RegExp') {\n return generatePatternErrorMessage(error);\n }\n\n // Default to original message with some context\n return `At ${path}: ${error.message}`;\n}\n\n/**\n * Generate message for union validation errors\n */\nfunction generateUnionErrorMessage(error: ValueError): string {\n const path = error.path || 'root';\n const value = error.value;\n\n // Try to determine what the user was attempting\n if (path === 'root' || path === '/' || path === '/jsonDefinition') {\n // Root level or jsonDefinition union error - likely a document type issue\n if (value && typeof value === 'object') {\n if ('name' in value) {\n const name = value.name;\n if (name === 'docx') {\n return 'Document structure appears valid but contains invalid component configurations. Check each component for errors.';\n }\n return `Unknown document name '${name}'. Expected 'docx'.`;\n }\n\n // Missing name field\n const valueAny = value as Record<string, unknown>;\n if ('children' in value && Array.isArray(valueAny.children)) {\n return 'Document is missing required \\'name\\' field. Add \"name\": \"docx\" at the root level.';\n }\n\n // Check if it might be a theme\n if ('name' in value || 'styles' in value) {\n return 'This appears to be a theme configuration. Use --type theme or ensure proper document structure.';\n }\n }\n return 'Invalid document structure. Expected a document with name=\"docx\" or a theme configuration.';\n }\n\n // Component-level union error\n if (path.includes('/children/')) {\n if (value && typeof value === 'object' && 'name' in value) {\n const componentType = (value as any).name;\n return `Invalid component configuration for type '${componentType}'. Check that all required fields are present and correctly formatted.`;\n }\n return 'Invalid component structure. Each component must have a \"name\" field and valid configuration.';\n }\n\n // Default union error message\n return `Value at ${path} doesn't match any of the expected formats. Check the structure and required fields.`;\n}\n\n/**\n * Generate message for additional properties errors\n */\nfunction generateAdditionalPropertiesMessage(error: ValueError): string {\n const path = error.path || 'root';\n const value = error.value;\n\n if (typeof value === 'object' && value !== null) {\n // Try to identify the unknown properties\n const schema = error.schema;\n if (schema && isObjectSchema(schema)) {\n const knownProps = getObjectSchemaPropertyNames(schema);\n const actualProps = Object.keys(value);\n const unknownProps = actualProps.filter((p) => !knownProps.includes(p));\n\n if (unknownProps.length > 0) {\n return (\n `Unknown properties at ${path}: ${unknownProps.join(', ')}. ` +\n `Allowed properties are: ${knownProps.join(', ')}`\n );\n }\n }\n }\n\n return `Additional properties not allowed at ${path}. Check for typos or unsupported fields.`;\n}\n\n/**\n * Generate message for required property errors\n */\nfunction generateRequiredPropertyMessage(error: ValueError): string {\n const path = error.path || 'root';\n const match = error.message?.match(/Required property '([^']+)'/);\n\n if (match) {\n const propName = match[1];\n return `Missing required field '${propName}' at ${path}. This field is mandatory for this configuration.`;\n }\n\n return `Missing required property at ${path}. Check that all mandatory fields are present.`;\n}\n\n/**\n * Generate message for type mismatch errors\n */\nfunction generateTypeMismatchMessage(error: ValueError): string {\n const path = error.path || 'root';\n const expectedType = String(error.type);\n const actualType = Array.isArray(error.value) ? 'array' : typeof error.value;\n\n // Provide context-specific messages\n if (path.includes('alignment')) {\n return `Invalid alignment value at ${path}. Expected one of: left, center, right, justify`;\n }\n\n if (path.includes('color')) {\n return `Invalid color value at ${path}. Use hex format (#RRGGBB), rgb(r,g,b), or a named color`;\n }\n\n if (path.includes('fontSize') || path.includes('size')) {\n return `Invalid size value at ${path}. Expected a number (in points)`;\n }\n\n if (\n path.includes('margin') ||\n path.includes('padding') ||\n path.includes('spacing')\n ) {\n return `Invalid spacing value at ${path}. Expected a number or spacing object with top/bottom/left/right`;\n }\n\n return `Type mismatch at ${path}: Expected ${expectedType} but got ${actualType}`;\n}\n\n/**\n * Generate message for literal value errors\n */\nfunction generateLiteralErrorMessage(error: ValueError): string {\n const path = error.path || 'root';\n const expected = error.schema\n ? JSON.stringify(getLiteralValue(error.schema))\n : 'specific value';\n const actual = JSON.stringify(error.value);\n\n return `Invalid value at ${path}: Expected exactly ${expected} but got ${actual}`;\n}\n\n/**\n * Generate message for pattern/regex errors\n */\nfunction generatePatternErrorMessage(error: ValueError): string {\n const path = error.path || 'root';\n\n // Try to provide helpful context based on the path\n if (path.includes('email')) {\n return `Invalid email format at ${path}. Use format: user@example.com`;\n }\n\n if (path.includes('url') || path.includes('link')) {\n return `Invalid URL format at ${path}. Use format: https://example.com`;\n }\n\n if (path.includes('date')) {\n return `Invalid date format at ${path}. Use ISO format: YYYY-MM-DD`;\n }\n\n if (path.includes('phone')) {\n return `Invalid phone number format at ${path}`;\n }\n\n return `Value at ${path} doesn't match the required pattern`;\n}\n\n/**\n * Transform TypeBox ValueError to standardized ValidationError\n */\nexport function transformValueError(\n error: ValueError,\n jsonString?: string,\n config?: ErrorFormatterConfig\n): ValidationError {\n const formatterConfig = createErrorConfig(config);\n\n // Generate enhanced message based on error type\n const enhancedMessage = generateEnhancedMessage(error, formatterConfig);\n\n const baseError: ValidationError = {\n path: error.path || 'root',\n message: formatErrorMessage(\n enhancedMessage || error.message,\n formatterConfig\n ),\n code: String(error.type || 'validation_error'),\n value: error.value,\n };\n\n // Add suggestion if available and configured\n if (formatterConfig.includeSuggestions) {\n const suggestion = getSuggestion(error, formatterConfig);\n if (suggestion) {\n baseError.suggestion = formatErrorMessage(suggestion, formatterConfig);\n }\n }\n\n // Calculate line and column if JSON string is provided\n if (jsonString && error.path) {\n const position = calculatePosition(jsonString, error.path);\n if (position) {\n baseError.line = position.line;\n baseError.column = position.column;\n }\n }\n\n return baseError;\n}\n\n/**\n * Transform multiple TypeBox errors to ValidationError array\n * Enhanced to collect ALL errors, not just stopping at union failures\n */\nexport function transformValueErrors(\n errors: ValueError[],\n options?: {\n jsonString?: string;\n maxErrors?: number;\n }\n): ValidationError[] {\n const maxErrors = options?.maxErrors ?? Number.MAX_SAFE_INTEGER;\n const result: ValidationError[] = [];\n const seenPaths = new Set<string>();\n\n // Collect all errors, but avoid duplicates at the same path\n for (const error of errors) {\n if (result.length >= maxErrors) break;\n\n // Create a unique key for this error based on path and type\n const errorKey = `${error.path}:${error.type}`;\n\n // Skip if we've already seen an error at this exact path and type\n // This helps avoid duplicate union errors while still showing all unique issues\n if (!seenPaths.has(errorKey)) {\n seenPaths.add(errorKey);\n result.push(transformValueError(error, options?.jsonString, undefined));\n }\n }\n\n return result;\n}\n\n/**\n * Calculate line and column position in JSON string\n */\nexport function calculatePosition(\n jsonString: string,\n path: string\n): { line: number; column: number } | null {\n try {\n // Convert path like \"/children/0/props/title\" to searchable parts\n const pathParts = path.split('/').filter(Boolean);\n if (pathParts.length === 0) {\n return { line: 1, column: 1 };\n }\n\n // Try to find the last part of the path in the JSON\n const lastPart = pathParts[pathParts.length - 1];\n const searchPattern = `\"${lastPart}\"`;\n const index = jsonString.indexOf(searchPattern);\n\n if (index === -1) {\n // Try to find just the value if it's a property name\n return { line: 1, column: 1 };\n }\n\n // Calculate line and column from index\n const beforeError = jsonString.substring(0, index);\n const lines = beforeError.split('\\n');\n const line = lines.length;\n const column = lines[lines.length - 1].length + 1;\n\n return { line, column };\n } catch {\n return null;\n }\n}\n\n/**\n * Get helpful suggestion based on error type and context\n */\nfunction getSuggestion(\n error: ValueError,\n config: Required<ErrorFormatterConfig>\n): string | undefined {\n const { type, path, value } = error;\n const typeStr = String(type);\n\n // Enhanced suggestions for union errors\n if (typeStr === '62' || typeStr === 'union') {\n if (path === 'root' || path === '/') {\n if (value && typeof value === 'object') {\n if (!('name' in value)) {\n const msg = 'Add a \"name\" field with value \"docx\" for documents';\n return config.includeEmojis ? `${ERROR_EMOJIS.FIX} ${msg}` : msg;\n }\n if ('props' in value && typeof value.props === 'object') {\n const knownFields = getObjectSchemaPropertyNames(ReportPropsSchema);\n return `Review the props section for unsupported fields. Allowed fields: ${knownFields.join(', ')}`;\n }\n }\n return 'Ensure the document has proper structure: { \"name\": \"docx\", \"props\": {...}, \"children\": [...] }';\n }\n if (path?.includes('/children/')) {\n return 'Check that the component has a valid \"name\" and all required fields for that component type';\n }\n return 'Review the structure and ensure all required fields are present with correct types';\n }\n\n // Suggestions for additional properties errors\n if (error.message?.includes('additionalProperties')) {\n return 'Remove any unknown or unsupported fields. Check documentation for allowed properties.';\n }\n\n // Suggestions for required properties\n if (error.message?.includes('Required property')) {\n return 'Add the missing required field to fix this error';\n }\n\n // Type-specific suggestions\n if (typeStr === 'string') {\n if (path?.includes('alignment')) {\n return 'Use one of: left, center, right, justify';\n }\n if (path?.includes('color')) {\n return 'Use a valid color format (hex: #RRGGBB, rgb: rgb(r,g,b), or named color)';\n }\n return 'Provide a text string value';\n }\n\n if (typeStr === 'number') {\n if (path?.includes('fontSize') || path?.includes('size')) {\n return 'Use a number in points (e.g., 12, 14, 16)';\n }\n if (path?.includes('margin') || path?.includes('padding')) {\n return 'Use a number for spacing in points';\n }\n return 'Provide a numeric value';\n }\n\n if (typeStr === 'boolean') {\n return 'Use true or false (without quotes)';\n }\n\n if (typeStr === 'array') {\n if (path?.includes('children') || path?.includes('modules')) {\n return 'Provide an array of component objects, each with a \"name\" field';\n }\n return 'Provide an array/list of values using square brackets []';\n }\n\n if (typeStr === 'object') {\n return 'Provide an object with key-value pairs using curly braces {}';\n }\n\n if (typeStr === 'literal') {\n const expected = error.schema\n ? JSON.stringify(getLiteralValue(error.schema))\n : 'specific value';\n return `Use exactly this value: ${expected}`;\n }\n\n if (typeStr === 'pattern' || typeStr === 'RegExp') {\n if (path?.includes('email')) {\n return 'Use valid email format: user@example.com';\n }\n if (path?.includes('url')) {\n return 'Use valid URL format: https://example.com';\n }\n if (path?.includes('date')) {\n return 'Use ISO date format: YYYY-MM-DD';\n }\n return 'Ensure the value matches the required format';\n }\n\n // Path-based suggestions\n if (path?.includes('name') || path?.includes('type')) {\n return 'Use a valid component name: docx, section, columns, heading, paragraph, image, statistic, table, header, footer, list, toc, text-box, or highcharts';\n }\n\n return undefined;\n}\n\n/**\n * Format validation errors as a summary string\n */\nexport function formatErrorSummary(errors: ValidationError[]): string {\n if (errors.length === 0) return 'No errors';\n\n if (errors.length === 1) {\n return errors[0].message;\n }\n\n const summary = errors\n .slice(0, 3)\n .map((e) => `${e.path}: ${e.message}`)\n .join(', ');\n\n if (errors.length > 3) {\n return `${summary} and ${errors.length - 3} more...`;\n }\n\n return summary;\n}\n\n/**\n * Group errors by path for better reporting\n */\nexport function groupErrorsByPath(\n errors: ValidationError[]\n): Map<string, ValidationError[]> {\n const grouped = new Map<string, ValidationError[]>();\n\n for (const error of errors) {\n const path = error.path || 'root';\n const group = grouped.get(path) || [];\n group.push(error);\n grouped.set(path, group);\n }\n\n return grouped;\n}\n\n/**\n * Create a JSON parse error\n */\nexport function createJsonParseError(\n error: Error,\n jsonString: string\n): ValidationError {\n // Try to extract position from error message\n const match = error.message.match(/position (\\d+)/);\n const position = match ? parseInt(match[1], 10) : 0;\n\n let line = 1;\n let column = 1;\n\n if (position > 0) {\n const lines = jsonString.substring(0, position).split('\\n');\n line = lines.length;\n column = lines[lines.length - 1].length + 1;\n }\n\n return {\n path: 'root',\n message: `JSON Parse Error: ${error.message}`,\n code: 'json_parse_error',\n line,\n column,\n suggestion: 'Check for missing commas, quotes, or brackets',\n };\n}\n","/**\n * Deep validation utilities for collecting ALL errors in nested structures\n * This bypasses TypeBox's union short-circuiting to provide comprehensive error reporting\n */\n\nimport { Value } from '@sinclair/typebox/value';\nimport type { TSchema } from '@sinclair/typebox';\nimport type { ValidationError } from '@json-to-office/shared';\nimport {\n ReportPropsSchema,\n SectionPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n TablePropsSchema,\n ImagePropsSchema,\n ListPropsSchema,\n StatisticPropsSchema,\n ColumnsPropsSchema,\n HeaderPropsSchema,\n FooterPropsSchema,\n} from '../../schemas/components';\nimport { CustomComponentDefinitionSchema } from '../../schemas/custom-components';\nimport { transformValueErrors } from './error-transformer';\n\n// Map of component names to their schemas\nconst COMPONENT_SCHEMAS: Record<string, TSchema> = {\n report: ReportPropsSchema,\n section: SectionPropsSchema,\n heading: HeadingPropsSchema,\n paragraph: ParagraphPropsSchema,\n table: TablePropsSchema,\n image: ImagePropsSchema,\n list: ListPropsSchema,\n statistic: StatisticPropsSchema,\n columns: ColumnsPropsSchema,\n header: HeaderPropsSchema,\n footer: FooterPropsSchema,\n custom: CustomComponentDefinitionSchema,\n};\n\n/**\n * Deep validate a document to collect ALL errors, not just union-level errors\n */\nexport function deepValidateDocument(data: any): ValidationError[] {\n const allErrors: ValidationError[] = [];\n\n // Validate the document structure\n if (!data || typeof data !== 'object') {\n allErrors.push({\n path: 'root',\n message: 'Document must be an object',\n code: 'invalid_type',\n });\n return allErrors;\n }\n\n // Check name field\n if (!data.name) {\n allErrors.push({\n path: '/name',\n message: 'Missing required field \"name\"',\n code: 'required_property',\n });\n } else if (data.name !== 'docx') {\n allErrors.push({\n path: '/name',\n message: `Invalid name \"${data.name}\". Expected \"docx\"`,\n code: 'invalid_value',\n });\n }\n\n // Validate props section if present and name is docx\n if (data.name === 'docx' && data.props) {\n const propsErrors = validateComponentProps('docx', data.props, '/props');\n allErrors.push(...propsErrors);\n }\n\n // Validate children array\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 } else {\n // Validate each child component\n data.children.forEach((child: any, index: number) => {\n const childPath = `/children/${index}`;\n\n if (!child || typeof child !== 'object') {\n allErrors.push({\n path: childPath,\n message: 'Component must be an object',\n code: 'invalid_type',\n });\n return;\n }\n\n // Check component name\n if (!child.name) {\n allErrors.push({\n path: `${childPath}/name`,\n message: 'Component missing required field \"name\"',\n code: 'required_property',\n });\n return;\n }\n\n // Validate component props based on name\n if (child.props) {\n const componentErrors = validateComponentProps(\n child.name,\n child.props,\n `${childPath}/props`\n );\n allErrors.push(...componentErrors);\n } else if (child.name !== 'custom') {\n // Most components require props\n allErrors.push({\n path: `${childPath}/props`,\n message: 'Component missing required field \"props\"',\n code: 'required_property',\n });\n }\n\n // Special handling for section components (recursive)\n if (child.name === 'section' && child.children) {\n if (!Array.isArray(child.children)) {\n allErrors.push({\n path: `${childPath}/children`,\n message: 'Section children must be an array',\n code: 'invalid_type',\n });\n } else {\n // Recursively validate nested components\n child.children.forEach((nestedChild: any, nestedIndex: number) => {\n const nestedChildPath = `${childPath}/children/${nestedIndex}`;\n if (!nestedChild || typeof nestedChild !== 'object') {\n allErrors.push({\n path: nestedChildPath,\n message: 'Nested component must be an object',\n code: 'invalid_type',\n });\n return;\n }\n\n if (!nestedChild.name) {\n allErrors.push({\n path: `${nestedChildPath}/name`,\n message: 'Nested component missing required field \"name\"',\n code: 'required_property',\n });\n } else {\n if (nestedChild.props) {\n const nestedErrors = validateComponentProps(\n nestedChild.name,\n nestedChild.props,\n `${nestedChildPath}/props`\n );\n allErrors.push(...nestedErrors);\n } else if (nestedChild.name !== 'custom') {\n // Most components require props\n allErrors.push({\n path: `${nestedChildPath}/props`,\n message: 'Component missing required field \"props\"',\n code: 'required_property',\n });\n }\n }\n });\n }\n }\n });\n }\n\n return allErrors;\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): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Get the schema for this component\n const schema = COMPONENT_SCHEMAS[componentName];\n if (!schema) {\n // Unknown component type\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 // Use TypeBox to validate against the specific schema\n if (!Value.Check(schema, props)) {\n const valueErrors = [...Value.Errors(schema, props)];\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 // Combine base path with error path\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 */\nexport function comprehensiveValidateDocument(\n data: any,\n existingErrors: ValidationError[] = []\n): ValidationError[] {\n // First, get deep validation errors\n const deepErrors = deepValidateDocument(data);\n\n // If we got specific errors from deep validation, prefer those\n if (deepErrors.length > 0) {\n // Filter out any generic \"invalid component configurations\" errors\n const filteredExisting = existingErrors.filter(\n (e) =>\n !e.message.includes('invalid module configurations') &&\n !e.message.includes('invalid component configurations')\n );\n\n // Combine and deduplicate\n const allErrors = [...filteredExisting, ...deepErrors];\n const uniqueErrors = deduplicateErrors(allErrors);\n\n return uniqueErrors;\n }\n\n // Otherwise return the existing errors\n return existingErrors;\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","/**\n * Base validator implementation\n * Core validation logic that eliminates duplication across the codebase\n */\n\nimport { Value } from '@sinclair/typebox/value';\nimport type { Static, TSchema } from '@sinclair/typebox';\nimport type {\n ValidationResult,\n ValidationOptions,\n JsonValidationResult,\n} from './types';\nimport {\n transformValueErrors,\n createJsonParseError,\n formatErrorSummary,\n} from '@json-to-office/shared';\n\n/**\n * Base validation function that all specific validators use\n * This eliminates the repeated Value.Check -> Value.Errors -> map pattern\n */\nexport function validateAgainstSchema<T extends TSchema>(\n schema: T,\n data: unknown,\n options?: ValidationOptions\n): ValidationResult<Static<T>> {\n try {\n // Check if data matches the schema\n if (!Value.Check(schema, data)) {\n // Collect ALL errors (not just the first one)\n const errors = [...Value.Errors(schema, data)];\n const transformedErrors = transformValueErrors(errors, {\n jsonString: options?.jsonString,\n maxErrors: options?.maxErrors || 100, // Default to 100 if not specified\n });\n\n return {\n valid: false,\n errors: transformedErrors,\n };\n }\n\n // Data is valid, apply transformations if requested\n let processedData = data;\n\n if (options?.clean) {\n // Remove unknown properties\n processedData = Value.Clean(schema, Value.Clone(processedData));\n }\n\n if (options?.applyDefaults) {\n // Apply default values\n processedData = Value.Default(schema, processedData);\n }\n\n return {\n valid: true,\n data: processedData as Static<T>,\n };\n } catch (error) {\n // Handle unexpected errors\n return {\n valid: false,\n errors: [\n {\n path: 'root',\n message:\n error instanceof Error ? error.message : 'Unknown validation error',\n code: 'validation_exception',\n },\n ],\n };\n }\n}\n\n/**\n * Validate JSON string or object with schema\n */\nexport function validateJson<T extends TSchema>(\n schema: T,\n jsonInput: string | object,\n options?: ValidationOptions\n): JsonValidationResult<Static<T>> {\n // Handle string input\n if (typeof jsonInput === 'string') {\n // Basic input validation\n if (!jsonInput.trim()) {\n return {\n valid: false,\n errors: [\n {\n path: 'root',\n message: 'Input must be a non-empty string',\n code: 'empty_input',\n },\n ],\n isJsonError: true,\n };\n }\n\n // Try to parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonInput);\n } catch (error) {\n if (error instanceof Error) {\n return {\n valid: false,\n errors: [createJsonParseError(error, jsonInput)],\n isJsonError: true,\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: 'root',\n message: 'Failed to parse JSON',\n code: 'json_parse_error',\n },\n ],\n isJsonError: true,\n };\n }\n\n // Validate parsed object with position calculation\n const result = validateAgainstSchema(schema, parsed, {\n ...options,\n jsonString: jsonInput,\n calculatePosition: true,\n });\n\n return {\n ...result,\n parsed,\n isJsonError: false,\n };\n }\n\n // Handle object input directly\n const result = validateAgainstSchema(schema, jsonInput, options);\n return {\n ...result,\n parsed: jsonInput,\n isJsonError: false,\n };\n}\n\n/**\n * Batch validate multiple items\n */\nexport function validateBatch<T extends TSchema>(\n schema: T,\n items: unknown[],\n options?: ValidationOptions\n): ValidationResult<Static<T>[]> {\n const results: Static<T>[] = [];\n const allErrors: any[] = [];\n let hasErrors = false;\n\n for (let i = 0; i < items.length; i++) {\n const result = validateAgainstSchema(schema, items[i], options);\n\n if (result.valid && result.data) {\n results.push(result.data);\n } else {\n hasErrors = true;\n if (result.errors) {\n // Prefix errors with item index\n const prefixedErrors = result.errors.map((e) => ({\n ...e,\n path: `[${i}]${e.path ? '/' + e.path : ''}`,\n }));\n allErrors.push(...prefixedErrors);\n }\n }\n\n // Stop if we've hit the max errors\n if (options?.maxErrors && allErrors.length >= options.maxErrors) {\n break;\n }\n }\n\n if (hasErrors) {\n return {\n valid: false,\n errors: allErrors.slice(0, options?.maxErrors),\n };\n }\n\n return {\n valid: true,\n data: results,\n };\n}\n\n/**\n * Validate with custom error enhancement\n */\nexport function validateWithEnhancement<T extends TSchema>(\n schema: T,\n data: unknown,\n enhancer: (errors: any[]) => any[],\n options?: ValidationOptions\n): ValidationResult<Static<T>> {\n const result = validateAgainstSchema(schema, data, options);\n\n if (!result.valid && result.errors) {\n result.errors = enhancer(result.errors);\n }\n\n return result;\n}\n\n/**\n * Create a validator function for a specific schema\n */\nexport function createValidator<T extends TSchema>(\n schema: T,\n defaultOptions?: ValidationOptions\n) {\n return (data: unknown, options?: ValidationOptions) => {\n return validateAgainstSchema(schema, data, {\n ...defaultOptions,\n ...options,\n });\n };\n}\n\n/**\n * Create a JSON validator function for a specific schema\n */\nexport function createJsonValidator<T extends TSchema>(\n schema: T,\n defaultOptions?: ValidationOptions\n) {\n return (jsonInput: string | object, options?: ValidationOptions) => {\n return validateJson(schema, jsonInput, {\n ...defaultOptions,\n ...options,\n });\n };\n}\n\n/**\n * Utility to check if validation result is successful with type guard\n */\nexport function isValidationSuccess<T>(\n result: ValidationResult<T>\n): result is ValidationResult<T> & { valid: true; data: T } {\n return result.valid === true && result.data !== undefined;\n}\n\n/**\n * Get validation error summary\n */\nexport function getValidationSummary(result: ValidationResult): string {\n if (result.valid) {\n return 'Validation successful';\n }\n\n if (!result.errors || result.errors.length === 0) {\n return 'Validation failed with unknown error';\n }\n\n return formatErrorSummary(result.errors);\n}\n","/**\n * Document validation implementation\n * Single source of truth for all document validation\n */\n\nimport type { Static } from '@sinclair/typebox';\nimport {\n ComponentDefinitionSchema,\n StandardComponentDefinitionSchema,\n} from '../../schemas/components';\nimport { extractStandardComponentNames } from '@json-to-office/shared';\nimport { comprehensiveValidateDocument } from './deep-validator';\n\n// JsonComponentDefinitionSchema is just an alias for ComponentDefinitionSchema\nconst JsonComponentDefinitionSchema = ComponentDefinitionSchema;\nimport type { DocumentValidationResult, ValidationOptions } from './types';\nimport { validateAgainstSchema, validateJson } from './base-validator';\n\n/**\n * Validate a document/report component definition\n */\nexport function validateDocument(\n data: unknown,\n options?: ValidationOptions\n): DocumentValidationResult {\n const result = validateAgainstSchema(ComponentDefinitionSchema, data, options);\n\n // If validation failed, use deep validation to get all detailed errors\n let finalErrors = result.errors || [];\n if (!result.valid && data) {\n finalErrors = comprehensiveValidateDocument(data, result.errors);\n }\n\n // Add document-specific metadata\n const documentResult: DocumentValidationResult = {\n ...result,\n documentType: 'docx',\n errors: finalErrors, // Use the comprehensive errors\n };\n\n // Check if document has custom components\n if (result.valid && result.data) {\n const doc = result.data as any;\n if (doc.children && Array.isArray(doc.children)) {\n const hasCustom = doc.children.some(\n (c: any) => !isStandardComponentName(c.name)\n );\n documentResult.hasCustomComponents = hasCustom;\n }\n }\n\n return documentResult;\n}\n\n/**\n * Validate a JSON document (string or object)\n */\nexport function validateJsonDocument(\n jsonInput: string | object,\n options?: ValidationOptions\n): DocumentValidationResult {\n // Use the JSON-specific schema which includes the $schema field\n const result = validateJson(JsonComponentDefinitionSchema, jsonInput, options);\n\n // If validation failed, use deep validation to get all detailed errors\n let finalErrors = result.errors || [];\n if (!result.valid && result.parsed) {\n finalErrors = comprehensiveValidateDocument(result.parsed, result.errors);\n }\n\n // Add document-specific metadata\n const documentResult: DocumentValidationResult = {\n ...result,\n documentType: 'docx',\n errors: finalErrors, // Use the comprehensive errors\n };\n\n // Check for custom components\n if (result.valid && result.data) {\n const doc = result.data as any;\n if (doc.children && Array.isArray(doc.children)) {\n const hasCustom = doc.children.some(\n (c: any) => !isStandardComponentName(c.name)\n );\n documentResult.hasCustomComponents = hasCustom;\n }\n }\n\n return documentResult;\n}\n\n/**\n * Type guard for document validation result\n */\nexport function isValidDocument(\n result: DocumentValidationResult\n): result is DocumentValidationResult & {\n valid: true;\n data: Static<typeof ComponentDefinitionSchema>;\n} {\n return result.valid === true && result.data !== undefined;\n}\n\n/**\n * Extract standard component names from the schema (cached)\n */\nfunction getStandardComponentNames(): string[] {\n return extractStandardComponentNames(StandardComponentDefinitionSchema);\n}\n\n/**\n * Check if a component name is standard\n */\nfunction isStandardComponentName(name: string): boolean {\n const standardNames = getStandardComponentNames();\n return standardNames.includes(name);\n}\n\n/**\n * Create a document validator with default options\n */\nexport function createDocumentValidator(defaultOptions?: ValidationOptions) {\n return {\n validate: (data: unknown, options?: ValidationOptions) =>\n validateDocument(data, { ...defaultOptions, ...options }),\n validateJson: (jsonInput: string | object, options?: ValidationOptions) =>\n validateJsonDocument(jsonInput, { ...defaultOptions, ...options }),\n };\n}\n\n// Export convenient validators with common configurations\nexport const documentValidator = createDocumentValidator({\n clean: true,\n applyDefaults: true,\n maxErrors: 100, // Collect up to 100 errors to show all validation issues\n});\n\nexport const strictDocumentValidator = createDocumentValidator({\n clean: false,\n applyDefaults: false,\n maxErrors: 100, // Increased from 10 to show more errors\n});\n\n/**\n * Legacy compatibility exports\n */\nexport const validateJsonComponent = validateJsonDocument;\nexport const validateDocumentWithSchema = validateDocument;\n"],"mappings":"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","names":["Value","transformValueErrors","result"]}
@@ -0,0 +1,121 @@
1
+ import {
2
+ STANDARD_COMPONENTS_REGISTRY,
3
+ createComponentSchemaObject,
4
+ getStandardComponent
5
+ } from "./chunk-5533WPL6.js";
6
+
7
+ // src/schemas/generator.ts
8
+ import { Type } from "@sinclair/typebox";
9
+ import { latestVersion } from "@json-to-office/shared";
10
+ function generateUnifiedDocumentSchema(options = {}) {
11
+ const {
12
+ includeStandardComponents = true,
13
+ customComponents = [],
14
+ title = "JSON Report Definition",
15
+ description = "JSON report definition with TypeBox schemas"
16
+ } = options;
17
+ const ComponentDefinition = Type.Recursive(
18
+ (This) => {
19
+ const componentSchemas = [];
20
+ if (includeStandardComponents) {
21
+ for (const component of STANDARD_COMPONENTS_REGISTRY) {
22
+ componentSchemas.push(createComponentSchemaObject(component, This));
23
+ }
24
+ }
25
+ for (const customComponent of customComponents) {
26
+ if (customComponent.versionedProps && customComponent.versionedProps.length > 0) {
27
+ const versionEntries = customComponent.versionedProps;
28
+ const latest = latestVersion(versionEntries.map((e) => e.version));
29
+ for (const entry of versionEntries) {
30
+ const versionLiteralDesc = entry.description || customComponent.description;
31
+ const schema = {
32
+ name: Type.Literal(customComponent.name),
33
+ id: Type.Optional(Type.String()),
34
+ version: versionLiteralDesc ? Type.Literal(entry.version, {
35
+ description: versionLiteralDesc
36
+ }) : Type.Literal(entry.version),
37
+ props: entry.propsSchema
38
+ };
39
+ if (entry.hasChildren) {
40
+ schema.children = Type.Optional(Type.Array(This));
41
+ }
42
+ const versionDesc = entry.description ? `${customComponent.name} v${entry.version} \u2014 ${entry.description}` : customComponent.description ? `${customComponent.name} v${entry.version} \u2014 ${customComponent.description}` : `${customComponent.name} v${entry.version}`;
43
+ componentSchemas.push(
44
+ Type.Object(schema, {
45
+ additionalProperties: false,
46
+ description: versionDesc
47
+ })
48
+ );
49
+ }
50
+ const latestEntry = versionEntries.find((e) => e.version === latest);
51
+ const fallbackSchema = {
52
+ name: Type.Literal(customComponent.name),
53
+ id: Type.Optional(Type.String()),
54
+ props: latestEntry.propsSchema
55
+ };
56
+ if (latestEntry.hasChildren) {
57
+ fallbackSchema.children = Type.Optional(Type.Array(This));
58
+ }
59
+ const fallbackDesc = latestEntry.description ? `${customComponent.name} (latest: v${latest}) \u2014 ${latestEntry.description}` : customComponent.description ? `${customComponent.name} (latest: v${latest}) \u2014 ${customComponent.description}` : `${customComponent.name} (latest: v${latest})`;
60
+ componentSchemas.push(
61
+ Type.Object(fallbackSchema, {
62
+ additionalProperties: false,
63
+ description: fallbackDesc
64
+ })
65
+ );
66
+ } else {
67
+ const hasChildren = !!customComponent.hasChildren;
68
+ const schema = {
69
+ name: Type.Literal(customComponent.name),
70
+ id: Type.Optional(Type.String()),
71
+ props: customComponent.propsSchema
72
+ };
73
+ if (hasChildren) {
74
+ schema.children = Type.Optional(Type.Array(This));
75
+ }
76
+ componentSchemas.push(
77
+ Type.Object(schema, {
78
+ additionalProperties: false,
79
+ ...customComponent.description ? { description: customComponent.description } : {}
80
+ })
81
+ );
82
+ }
83
+ }
84
+ if (componentSchemas.length === 0) {
85
+ return Type.Any();
86
+ } else if (componentSchemas.length === 1) {
87
+ return componentSchemas[0];
88
+ } else {
89
+ const componentDescription = customComponents.length > 0 ? "Component definition with discriminated union including custom components" : "Component definition with discriminated union";
90
+ return Type.Union(componentSchemas, {
91
+ discriminator: { propertyName: "name" },
92
+ description: componentDescription
93
+ });
94
+ }
95
+ },
96
+ { $id: "ComponentDefinition" }
97
+ );
98
+ const reportComponent = getStandardComponent("docx");
99
+ if (!reportComponent) {
100
+ throw new Error("Docx root component not found in registry");
101
+ }
102
+ return Type.Object(
103
+ {
104
+ name: Type.Literal("docx"),
105
+ id: Type.Optional(Type.String()),
106
+ $schema: Type.Optional(Type.String({ format: "uri" })),
107
+ props: reportComponent.propsSchema,
108
+ children: Type.Optional(Type.Array(ComponentDefinition))
109
+ },
110
+ {
111
+ additionalProperties: false,
112
+ title,
113
+ description
114
+ }
115
+ );
116
+ }
117
+
118
+ export {
119
+ generateUnifiedDocumentSchema
120
+ };
121
+ //# sourceMappingURL=chunk-LWR4TFZ5.js.map
@@ -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 STANDARD_COMPONENTS_REGISTRY,\n createComponentSchemaObject,\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 // Create a recursive component definition schema\n const ComponentDefinition = Type.Recursive(\n (This) => {\n const componentSchemas: TSchema[] = [];\n\n // Add standard components from registry - SINGLE SOURCE OF TRUTH\n if (includeStandardComponents) {\n for (const component of STANDARD_COMPONENTS_REGISTRY) {\n componentSchemas.push(createComponentSchemaObject(component, This));\n }\n }\n\n // Add custom components\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 // Attach description directly to the version literal so Monaco\n // shows it in the autocomplete dropdown for version values\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 // Build description: combine component-level + version-level descriptions\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 componentSchemas.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 componentSchemas.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 componentSchemas.push(\n Type.Object(schema, {\n additionalProperties: false,\n ...(customComponent.description\n ? { description: customComponent.description }\n : {}),\n })\n );\n }\n }\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 // Create union with discriminator for proper JSON Schema generation\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 // In the unified structure, a document IS a report component with an optional $schema field\n // Only support the new unified structure - no legacy support\n\n // Get report component props from registry\n const reportComponent = getStandardComponent('docx');\n if (!reportComponent) {\n throw new Error('Docx root component not found in registry');\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 props: reportComponent.propsSchema,\n children: Type.Optional(Type.Array(ComponentDefinition)),\n },\n {\n additionalProperties: false,\n title,\n description,\n }\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,44 @@
1
+ // src/schemas/custom-components.ts
2
+ import { Type } from "@sinclair/typebox";
3
+ var TextSpaceAfterPropsSchema = Type.Object({
4
+ content: Type.String({
5
+ description: "Text content (required)"
6
+ }),
7
+ spaceAfter: Type.Optional(
8
+ Type.Number({
9
+ minimum: 0,
10
+ description: "Spacing after text in points"
11
+ })
12
+ ),
13
+ fontSize: Type.Optional(Type.Number({ minimum: 1 })),
14
+ fontFamily: Type.Optional(Type.String()),
15
+ bold: Type.Optional(Type.Boolean()),
16
+ italic: Type.Optional(Type.Boolean()),
17
+ underline: Type.Optional(Type.Boolean()),
18
+ color: Type.Optional(
19
+ Type.String({
20
+ pattern: "^#[0-9A-Fa-f]{6}$"
21
+ })
22
+ ),
23
+ alignment: Type.Optional(
24
+ Type.Union([
25
+ Type.Literal("left"),
26
+ Type.Literal("center"),
27
+ Type.Literal("right"),
28
+ Type.Literal("justify")
29
+ ])
30
+ )
31
+ });
32
+ var TextSpaceAfterComponentSchema = Type.Object({
33
+ name: Type.Literal("text-space-after"),
34
+ id: Type.Optional(Type.String()),
35
+ props: TextSpaceAfterPropsSchema
36
+ });
37
+ var CustomComponentDefinitionSchema = TextSpaceAfterComponentSchema;
38
+
39
+ export {
40
+ TextSpaceAfterPropsSchema,
41
+ TextSpaceAfterComponentSchema,
42
+ CustomComponentDefinitionSchema
43
+ };
44
+ //# sourceMappingURL=chunk-VP3X6DBP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/custom-components.ts"],"sourcesContent":["/**\n * Custom Component Schema Definitions using TypeBox\n *\n * Schemas for custom components that extend the base document generation capabilities.\n * These are kept separate from base components but still part of the shared package\n * to maintain a single source of truth for all schemas.\n */\n\nimport { Type, Static } from '@sinclair/typebox';\n\n// ============================================================================\n// Text Space After Custom Component\n// ============================================================================\n\n/**\n * Text Space After component props\n * Simple custom component that adds spacing after text content\n */\nexport const TextSpaceAfterPropsSchema = Type.Object({\n content: Type.String({\n description: 'Text content (required)',\n }),\n spaceAfter: Type.Optional(\n Type.Number({\n minimum: 0,\n description: 'Spacing after text in points',\n })\n ),\n fontSize: Type.Optional(Type.Number({ minimum: 1 })),\n fontFamily: Type.Optional(Type.String()),\n bold: Type.Optional(Type.Boolean()),\n italic: Type.Optional(Type.Boolean()),\n underline: Type.Optional(Type.Boolean()),\n color: Type.Optional(\n Type.String({\n pattern: '^#[0-9A-Fa-f]{6}$',\n })\n ),\n alignment: Type.Optional(\n Type.Union([\n Type.Literal('left'),\n Type.Literal('center'),\n Type.Literal('right'),\n Type.Literal('justify'),\n ])\n ),\n});\n\n/**\n * Text Space After component definition schema\n */\nexport const TextSpaceAfterComponentSchema = Type.Object({\n name: Type.Literal('text-space-after'),\n id: Type.Optional(Type.String()),\n props: TextSpaceAfterPropsSchema,\n});\n\n// ============================================================================\n// Combined Custom Components Union\n// ============================================================================\n\n/**\n * Union of all custom component types\n */\nexport const CustomComponentDefinitionSchema = TextSpaceAfterComponentSchema;\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\n// Text Space After types\nexport type TextSpaceAfterProps = Static<typeof TextSpaceAfterPropsSchema>;\nexport type TextSpaceAfterComponent = Static<\n typeof TextSpaceAfterComponentSchema\n>;\n\n// Combined custom component type\nexport type CustomComponentDefinition = Static<\n typeof CustomComponentDefinitionSchema\n>;\n"],"mappings":";AAQA,SAAS,YAAoB;AAUtB,IAAM,4BAA4B,KAAK,OAAO;AAAA,EACnD,SAAS,KAAK,OAAO;AAAA,IACnB,aAAa;AAAA,EACf,CAAC;AAAA,EACD,YAAY,KAAK;AAAA,IACf,KAAK,OAAO;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EACA,UAAU,KAAK,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAAA,EACnD,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EACvC,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,EAClC,QAAQ,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,EACpC,WAAW,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,EACvC,OAAO,KAAK;AAAA,IACV,KAAK,OAAO;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EACA,WAAW,KAAK;AAAA,IACd,KAAK,MAAM;AAAA,MACT,KAAK,QAAQ,MAAM;AAAA,MACnB,KAAK,QAAQ,QAAQ;AAAA,MACrB,KAAK,QAAQ,OAAO;AAAA,MACpB,KAAK,QAAQ,SAAS;AAAA,IACxB,CAAC;AAAA,EACH;AACF,CAAC;AAKM,IAAM,gCAAgC,KAAK,OAAO;AAAA,EACvD,MAAM,KAAK,QAAQ,kBAAkB;AAAA,EACrC,IAAI,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EAC/B,OAAO;AACT,CAAC;AASM,IAAM,kCAAkC;","names":[]}
@@ -0,0 +1,119 @@
1
+ import { Static } from '@sinclair/typebox';
2
+ import { ComponentDefinitionSchema } from './schemas/components.js';
3
+ import { ValueError } from '@sinclair/typebox/value';
4
+ import { ValidationResult as ValidationResult$1, ValidationError as ValidationError$1 } from '@json-to-office/shared';
5
+
6
+ /**
7
+ * Unified validation types - extends @json-to-office/shared types
8
+ */
9
+
10
+ /**
11
+ * Re-export the shared ValidationError type.
12
+ * Docx validation code uses this everywhere.
13
+ */
14
+ type ValidationError = ValidationError$1;
15
+ /**
16
+ * Generic validation result that can be used for any validation scenario
17
+ */
18
+ interface ValidationResult<T = unknown> extends ValidationResult$1 {
19
+ success?: boolean;
20
+ data?: T;
21
+ errors?: ValidationError[];
22
+ }
23
+ /**
24
+ * Options for validation behavior
25
+ */
26
+ interface ValidationOptions {
27
+ /** Apply Value.Clean to remove unknown properties */
28
+ clean?: boolean;
29
+ /** Apply Value.Default to add default values */
30
+ applyDefaults?: boolean;
31
+ /** Include detailed error reports */
32
+ includeReport?: boolean;
33
+ /** Calculate line/column for JSON errors */
34
+ calculatePosition?: boolean;
35
+ /** Original JSON string for position calculation */
36
+ jsonString?: string;
37
+ /** Maximum number of errors to collect */
38
+ maxErrors?: number;
39
+ }
40
+ /**
41
+ * Result specifically for JSON parsing with validation
42
+ */
43
+ interface JsonValidationResult<T = unknown> extends ValidationResult<T> {
44
+ parsed?: unknown;
45
+ isJsonError?: boolean;
46
+ }
47
+ /**
48
+ * Theme-specific validation result
49
+ */
50
+ interface ThemeValidationResult extends ValidationResult {
51
+ themeName?: string;
52
+ }
53
+ /**
54
+ * Document-specific validation result
55
+ */
56
+ interface DocumentValidationResult extends ValidationResult {
57
+ documentType?: string;
58
+ hasCustomComponents?: boolean;
59
+ errors: ValidationError[];
60
+ warnings?: ValidationError[];
61
+ }
62
+ /**
63
+ * Component-specific validation result
64
+ */
65
+ interface ComponentValidationResult<T = unknown> extends ValidationResult<T> {
66
+ componentName?: string;
67
+ isCustomComponent?: boolean;
68
+ success?: boolean;
69
+ }
70
+ /**
71
+ * TypeBox error with additional context
72
+ */
73
+ interface EnhancedValueError extends ValueError {
74
+ suggestion?: string;
75
+ severity?: 'error' | 'warning' | 'info';
76
+ }
77
+
78
+ /**
79
+ * Document validation implementation
80
+ * Single source of truth for all document validation
81
+ */
82
+
83
+ /**
84
+ * Validate a document/report component definition
85
+ */
86
+ declare function validateDocument(data: unknown, options?: ValidationOptions): DocumentValidationResult;
87
+ /**
88
+ * Validate a JSON document (string or object)
89
+ */
90
+ declare function validateJsonDocument(jsonInput: string | object, options?: ValidationOptions): DocumentValidationResult;
91
+ /**
92
+ * Type guard for document validation result
93
+ */
94
+ declare function isValidDocument(result: DocumentValidationResult): result is DocumentValidationResult & {
95
+ valid: true;
96
+ data: Static<typeof ComponentDefinitionSchema>;
97
+ };
98
+ /**
99
+ * Create a document validator with default options
100
+ */
101
+ declare function createDocumentValidator(defaultOptions?: ValidationOptions): {
102
+ validate: (data: unknown, options?: ValidationOptions) => DocumentValidationResult;
103
+ validateJson: (jsonInput: string | object, options?: ValidationOptions) => DocumentValidationResult;
104
+ };
105
+ declare const documentValidator: {
106
+ validate: (data: unknown, options?: ValidationOptions) => DocumentValidationResult;
107
+ validateJson: (jsonInput: string | object, options?: ValidationOptions) => DocumentValidationResult;
108
+ };
109
+ declare const strictDocumentValidator: {
110
+ validate: (data: unknown, options?: ValidationOptions) => DocumentValidationResult;
111
+ validateJson: (jsonInput: string | object, options?: ValidationOptions) => DocumentValidationResult;
112
+ };
113
+ /**
114
+ * Legacy compatibility exports
115
+ */
116
+ declare const validateJsonComponent: typeof validateJsonDocument;
117
+ declare const validateDocumentWithSchema: typeof validateDocument;
118
+
119
+ export { type ComponentValidationResult as C, type DocumentValidationResult as D, type EnhancedValueError as E, type JsonValidationResult as J, type ThemeValidationResult as T, type ValidationOptions as V, validateDocumentWithSchema as a, validateJsonDocument as b, createDocumentValidator as c, documentValidator as d, validateJsonComponent as e, type ValidationResult as f, isValidDocument as i, strictDocumentValidator as s, validateDocument as v };