@json-to-office/jto 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 (54) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +23 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +5639 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/client/assets/HomePage-CGK1cPFp.js +99 -0
  7. package/dist/client/assets/HomePage-CGK1cPFp.js.map +1 -0
  8. package/dist/client/assets/JsonEditorPage-DKaFqYpM.js +3 -0
  9. package/dist/client/assets/JsonEditorPage-DKaFqYpM.js.map +1 -0
  10. package/dist/client/assets/NotFoundPage-Et1QhbQw.js +2 -0
  11. package/dist/client/assets/NotFoundPage-Et1QhbQw.js.map +1 -0
  12. package/dist/client/assets/button-B5W5GwSc.js +2 -0
  13. package/dist/client/assets/button-B5W5GwSc.js.map +1 -0
  14. package/dist/client/assets/docx-preview-CUjVWdSJ.js +34 -0
  15. package/dist/client/assets/docx-preview-CUjVWdSJ.js.map +1 -0
  16. package/dist/client/assets/editor-CH_tiHyn.js +9 -0
  17. package/dist/client/assets/editor-CH_tiHyn.js.map +1 -0
  18. package/dist/client/assets/editor-monaco-json-8I2epq6g.js +6 -0
  19. package/dist/client/assets/editor-monaco-json-8I2epq6g.js.map +1 -0
  20. package/dist/client/assets/index-B9dV-vCI.css +1 -0
  21. package/dist/client/assets/index-DactvF4v.js +3 -0
  22. package/dist/client/assets/index-DactvF4v.js.map +1 -0
  23. package/dist/client/assets/monaco-editor-DzeBDgmk.js +12 -0
  24. package/dist/client/assets/monaco-editor-DzeBDgmk.js.map +1 -0
  25. package/dist/client/assets/preview-CJlTPgks.js +3 -0
  26. package/dist/client/assets/preview-CJlTPgks.js.map +1 -0
  27. package/dist/client/assets/query-vendor-UL64zsGL.js +15 -0
  28. package/dist/client/assets/query-vendor-UL64zsGL.js.map +1 -0
  29. package/dist/client/assets/radix-ui-CXavUarI.js +2 -0
  30. package/dist/client/assets/radix-ui-CXavUarI.js.map +1 -0
  31. package/dist/client/assets/react-vendor-DhdcN9D5.js +102 -0
  32. package/dist/client/assets/react-vendor-DhdcN9D5.js.map +1 -0
  33. package/dist/client/assets/settings-store-provider-DuCKtwqs.js +2 -0
  34. package/dist/client/assets/settings-store-provider-DuCKtwqs.js.map +1 -0
  35. package/dist/client/assets/state-vendor-CAMVKh-F.js +6 -0
  36. package/dist/client/assets/state-vendor-CAMVKh-F.js.map +1 -0
  37. package/dist/client/assets/ui-vendor-C6DsfOoA.js +247 -0
  38. package/dist/client/assets/ui-vendor-C6DsfOoA.js.map +1 -0
  39. package/dist/client/css/preview/docxjs.css +11 -0
  40. package/dist/client/icon.svg +5 -0
  41. package/dist/client/index.html +23 -0
  42. package/dist/client/templates/Charts Demo.pptx.json +174 -0
  43. package/dist/client/templates/Company Branding.pptx.json +143 -0
  44. package/dist/client/templates/Dashboard.pptx.json +91 -0
  45. package/dist/client/templates/Product Launch.pptx.json +87 -0
  46. package/dist/client/templates/Sales Deck.pptx.json +80 -0
  47. package/dist/client/templates/Wiseair.pptx.json +5382 -0
  48. package/dist/client/templates/themes/corporate.pptx.theme.json +32 -0
  49. package/dist/client/templates/themes/minimal.pptx.theme.json +32 -0
  50. package/dist/client/templates/themes/vibrant.pptx.theme.json +32 -0
  51. package/dist/index.d.ts +387 -0
  52. package/dist/index.js +2303 -0
  53. package/dist/index.js.map +1 -0
  54. package/package.json +147 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/format-adapter.ts","../src/services/plugin-loader.ts","../src/services/plugin-discovery.ts","../src/services/file-scanner.ts","../src/services/plugin-metadata.ts","../src/utils/project-root.ts","../src/services/plugin-registry.ts","../src/services/cache-events.ts","../src/services/generator-factory.ts","../src/services/plugin-resolver.ts","../src/services/schema-generator.ts","../src/services/typebox-exporter.ts","../src/services/json-validator.ts","../src/config/plugin-config.ts","../src/config/loader.ts","../src/config/schema.ts","../src/config/defaults.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\n\nexport type FormatName = 'docx' | 'pptx';\n\nexport interface GeneratorOptions {\n theme?: string | any;\n themePath?: string;\n customThemes?: Record<string, any>;\n validation?: {\n strict?: boolean;\n allowUnknownFields?: boolean;\n };\n}\n\nexport interface GeneratorResult {\n generateBuffer: (document: any) => Promise<Buffer>;\n getStandardComponentsDefinition?: (config: any) => Promise<any>;\n hasPlugins: boolean;\n pluginNames: string[];\n}\n\nexport interface FormatAdapter {\n name: FormatName;\n extension: string;\n label: string;\n defaultPort: number;\n\n generateBuffer(json: unknown, options: GeneratorOptions): Promise<Buffer>;\n\n createGenerator(\n plugins: any[],\n options: GeneratorOptions\n ): Promise<GeneratorResult>;\n\n parseJson(input: string | object): unknown;\n validateDocument(doc: unknown): { valid: boolean; errors?: any[] };\n\n generateSchema(options?: any): any;\n\n getBuiltinThemes(): Record<string, any>;\n resolveTheme(options: GeneratorOptions): Promise<any>;\n loadCustomThemes(\n options: GeneratorOptions\n ): Promise<Record<string, any> | undefined>;\n\n getComponentCacheStats?(): Promise<any>;\n getComponentCacheAnalytics?(): Promise<any>;\n}\n\nexport class DocxFormatAdapter implements FormatAdapter {\n name: FormatName = 'docx';\n extension = '.docx';\n label = 'document';\n defaultPort = 3003;\n\n async generateBuffer(json: unknown, options: GeneratorOptions): Promise<Buffer> {\n const core = await import('@json-to-office/core-docx');\n const docDefinition = typeof json === 'string' ? JSON.parse(json as string) : json;\n const customThemes = await this.loadCustomThemes(options);\n return await core.generateBufferFromJson(docDefinition as any, { customThemes });\n }\n\n async createGenerator(\n plugins: any[],\n options: GeneratorOptions\n ): Promise<GeneratorResult> {\n const core = await import('@json-to-office/core-docx');\n const hasPlugins = plugins.length > 0;\n const pluginNames = plugins.map((p) => p.name);\n\n if (!hasPlugins) {\n return {\n generateBuffer: async (document: any) => {\n const docDefinition =\n typeof document === 'string' ? JSON.parse(document) : document;\n const customThemes = await this.loadCustomThemes(options);\n return await core.generateBufferFromJson(docDefinition, { customThemes });\n },\n hasPlugins: false,\n pluginNames: [],\n };\n }\n\n const theme = await this.resolveTheme(options);\n // createDocumentGenerator returns a builder; add components via .addComponent()\n let generator = core.createDocumentGenerator({\n theme,\n debug: process.env.DEBUG === 'true',\n }) as any;\n\n for (const plugin of plugins) {\n generator = generator.addComponent(plugin);\n }\n\n return {\n generateBuffer: async (document: any) => {\n const docDefinition =\n typeof document === 'string' ? JSON.parse(document) : document;\n const validationResult = generator.validate(docDefinition);\n if (!validationResult.valid) {\n const errors = validationResult.errors || [];\n throw new Error(\n `Document validation failed:\\n${errors\n .map((e: any) => ` - ${e.path}: ${e.message}`)\n .join('\\n')}`\n );\n }\n const result = await generator.generateBuffer(docDefinition);\n // generateBuffer returns BufferGenerationResult { buffer, warnings }\n return result.buffer;\n },\n getStandardComponentsDefinition: generator.getStandardComponentsDefinition\n ? (config: any) => generator.getStandardComponentsDefinition(config)\n : undefined,\n hasPlugins: true,\n pluginNames,\n };\n }\n\n parseJson(input: string | object): unknown {\n return typeof input === 'string' ? JSON.parse(input) : input;\n }\n\n validateDocument(_doc: unknown): { valid: boolean; errors?: any[] } {\n return { valid: true };\n }\n\n generateSchema(_options?: any): any {\n // Delegate to shared-docx\n return null;\n }\n\n getBuiltinThemes(): Record<string, any> {\n try {\n // Dynamic import at call time\n const core = require('@json-to-office/core-docx');\n return core.themes || {};\n } catch {\n return {};\n }\n }\n\n async resolveTheme(options: GeneratorOptions): Promise<any> {\n const core = await import('@json-to-office/core-docx');\n\n if (options.themePath) {\n try {\n if (options.themePath.endsWith('.json')) {\n return await core.loadThemeFromFile(options.themePath);\n } else {\n const themePath = path.resolve(process.cwd(), options.themePath);\n const themeModule = await import(themePath);\n return themeModule.default || themeModule.theme;\n }\n } catch (error: any) {\n console.warn(\n `Failed to load theme from ${options.themePath}: ${error.message}`\n );\n }\n }\n\n if (typeof options.theme === 'string') {\n const builtInTheme = (core.themes as Record<string, any>)?.[options.theme];\n if (builtInTheme) return builtInTheme;\n\n if (options.theme.endsWith('.json') && fs.existsSync(options.theme)) {\n try {\n return await core.loadThemeFromFile(options.theme);\n } catch {}\n }\n\n try {\n return await core.loadThemeFromJson(options.theme);\n } catch {}\n }\n\n if (typeof options.theme === 'object' && options.theme !== null) {\n return options.theme;\n }\n\n return (core.themes as any)?.minimal || {};\n }\n\n async loadCustomThemes(\n options: GeneratorOptions\n ): Promise<Record<string, any> | undefined> {\n const core = await import('@json-to-office/core-docx');\n const customThemes: Record<string, any> = {};\n\n // Include themes passed directly from the client (playground UI)\n if (options.customThemes) {\n Object.assign(customThemes, options.customThemes);\n }\n\n if (typeof options.theme === 'object' && options.theme !== null) {\n customThemes.custom = options.theme;\n }\n\n if (options.themePath) {\n try {\n if (options.themePath.endsWith('.json')) {\n customThemes.custom = await core.loadThemeFromFile(options.themePath);\n } else {\n const themePath = path.resolve(process.cwd(), options.themePath);\n const themeModule = await import(themePath);\n customThemes.custom = themeModule.default || themeModule.theme;\n }\n } catch (error: any) {\n console.warn(\n `Failed to load theme from ${options.themePath}: ${error.message}`\n );\n }\n }\n\n return Object.keys(customThemes).length > 0 ? customThemes : undefined;\n }\n\n async getComponentCacheStats(): Promise<any> {\n try {\n const core = await import('@json-to-office/core-docx');\n const stats = core.getComponentCacheStats?.();\n if (!stats) return null;\n // Convert componentStats Map to serializable format matching client's ComponentCacheData\n const componentStats = Array.from(\n (stats.componentStats as Map<string, any>).entries()\n ).map(([, s]: [string, any]) => {\n const total = s.hits + s.misses;\n const hitRate = total > 0 ? s.hits / total : 0;\n return {\n type: s.name,\n hits: s.hits,\n misses: s.misses,\n avgProcessTime: s.avgProcessTime,\n avgSize: s.avgSize,\n entries: s.entries,\n hitRate,\n missRate: total > 0 ? s.misses / total : 0,\n totalRequests: total,\n memoryUsage: s.entries * s.avgSize,\n efficiencyScore: Math.round(hitRate * 100),\n };\n });\n return {\n entries: stats.entries,\n totalSize: stats.totalSize,\n hitRate: stats.hitRate,\n missRate: stats.missRate,\n totalHits: stats.totalHits,\n totalMisses: stats.totalMisses,\n avgResponseTime: stats.avgResponseTime,\n evictions: stats.evictions,\n componentStats,\n };\n } catch {\n return null;\n }\n }\n\n async getComponentCacheAnalytics(): Promise<any> {\n try {\n const core = await import('@json-to-office/core-docx');\n const stats = core.getComponentCacheStats?.();\n if (!stats) return null;\n const analytics = new core.ComponentCacheAnalytics();\n const report = analytics.analyzeCache(stats);\n // Remap componentMetrics field names for client compatibility\n return {\n ...report,\n componentMetrics: report.componentMetrics.map((m: any) => ({\n componentType: m.componentName,\n hitRate: m.hitRate,\n totalRequests: m.totalRequests,\n avgHitTime: m.avgHitTime,\n avgMissTime: m.avgMissTime,\n efficiencyScore: m.efficiencyScore,\n memoryUsage: m.memoryUsage,\n timeSaved: m.timeSaved,\n costBenefitRatio: m.costBenefitRatio,\n })),\n recommendations: report.recommendations.map((r: any) => ({\n componentType: r.componentName,\n type: r.type,\n description: r.description,\n expectedImprovement: r.expectedImprovement,\n priority: r.priority,\n reasoning: r.reasoning,\n })),\n };\n } catch {\n return null;\n }\n }\n}\n\nexport class PptxFormatAdapter implements FormatAdapter {\n name: FormatName = 'pptx';\n extension = '.pptx';\n label = 'presentation';\n defaultPort = 3004;\n\n async generateBuffer(json: unknown, options: GeneratorOptions): Promise<Buffer> {\n const core = await import('@json-to-office/core-pptx');\n const docDefinition = typeof json === 'string' ? JSON.parse(json as string) : json;\n const customThemes = await this.loadCustomThemes(options);\n return await core.generateBufferFromJson(docDefinition as any, { customThemes });\n }\n\n async createGenerator(\n plugins: any[],\n options: GeneratorOptions\n ): Promise<GeneratorResult> {\n const core = await import('@json-to-office/core-pptx');\n const hasPlugins = plugins.length > 0;\n const pluginNames = plugins.map((p) => p.name);\n\n return {\n generateBuffer: async (document: any) => {\n const docDefinition =\n typeof document === 'string' ? JSON.parse(document) : document;\n const customThemes = await this.loadCustomThemes(options);\n return await core.generateBufferFromJson(docDefinition, { customThemes });\n },\n hasPlugins,\n pluginNames,\n };\n }\n\n parseJson(input: string | object): unknown {\n return typeof input === 'string' ? JSON.parse(input) : input;\n }\n\n validateDocument(_doc: unknown): { valid: boolean; errors?: any[] } {\n return { valid: true };\n }\n\n generateSchema(_options?: any): any {\n return null;\n }\n\n getBuiltinThemes(): Record<string, any> {\n try {\n const core = require('@json-to-office/core-pptx');\n return core.pptxThemes || {};\n } catch {\n return {};\n }\n }\n\n async resolveTheme(options: GeneratorOptions): Promise<any> {\n const core = await import('@json-to-office/core-pptx');\n const themes = (core as any).pptxThemes || {};\n\n if (options.themePath) {\n try {\n if (options.themePath.endsWith('.json')) {\n const content = fs.readFileSync(\n path.resolve(process.cwd(), options.themePath),\n 'utf-8'\n );\n return JSON.parse(content);\n } else {\n const themePath = path.resolve(process.cwd(), options.themePath);\n const themeModule = await import(themePath);\n return themeModule.default || themeModule.theme;\n }\n } catch (error: any) {\n console.warn(\n `Failed to load theme from ${options.themePath}: ${error.message}`\n );\n }\n }\n\n if (typeof options.theme === 'string') {\n const builtIn =\n themes[options.theme] || (core as any).getPptxTheme?.(options.theme);\n if (builtIn) return builtIn;\n\n if (options.theme.endsWith('.json') && fs.existsSync(options.theme)) {\n try {\n const content = fs.readFileSync(\n path.resolve(process.cwd(), options.theme),\n 'utf-8'\n );\n return JSON.parse(content);\n } catch {}\n }\n }\n\n if (typeof options.theme === 'object' && options.theme !== null) {\n return options.theme;\n }\n\n return themes.minimal || {};\n }\n\n async loadCustomThemes(\n options: GeneratorOptions\n ): Promise<Record<string, any> | undefined> {\n const customThemes: Record<string, any> = {};\n\n // Include themes passed directly from the client (playground UI)\n if (options.customThemes) {\n Object.assign(customThemes, options.customThemes);\n }\n\n if (typeof options.theme === 'object' && options.theme !== null) {\n customThemes.custom = options.theme;\n }\n\n if (options.themePath) {\n try {\n if (options.themePath.endsWith('.json')) {\n const content = fs.readFileSync(\n path.resolve(process.cwd(), options.themePath),\n 'utf-8'\n );\n customThemes.custom = JSON.parse(content);\n } else {\n const themePath = path.resolve(process.cwd(), options.themePath);\n const themeModule = await import(themePath);\n customThemes.custom = themeModule.default || themeModule.theme;\n }\n } catch (error: any) {\n console.warn(\n `Failed to load theme from ${options.themePath}: ${error.message}`\n );\n }\n }\n\n return Object.keys(customThemes).length > 0 ? customThemes : undefined;\n }\n}\n\nexport function createAdapter(format: FormatName): FormatAdapter {\n switch (format) {\n case 'docx':\n return new DocxFormatAdapter();\n case 'pptx':\n return new PptxFormatAdapter();\n default:\n throw new Error(`Unknown format: ${format}`);\n }\n}\n","import * as path from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface CustomComponent {\n name: string;\n versions?: Record<string, any>;\n [key: string]: any;\n}\n\nlet globalTsxUnregister: (() => void) | undefined;\nlet tsxInitializationPromise: Promise<void> | undefined;\n\nexport class PluginLoader {\n private tsxUnregister?: () => void;\n\n async initialize(): Promise<void> {\n if (globalTsxUnregister) {\n this.tsxUnregister = globalTsxUnregister;\n return;\n }\n\n if (tsxInitializationPromise) {\n await tsxInitializationPromise;\n this.tsxUnregister = globalTsxUnregister;\n return;\n }\n\n tsxInitializationPromise = (async () => {\n try {\n const { register } = await import('tsx/esm/api');\n globalTsxUnregister = register();\n this.tsxUnregister = globalTsxUnregister;\n } catch {\n console.warn('tsx not available, TypeScript module loading may fail');\n }\n })();\n\n await tsxInitializationPromise;\n }\n\n async loadPlugin(filePath: string): Promise<CustomComponent | null> {\n try {\n if (!filePath.endsWith('.ts')) {\n return null;\n }\n\n if (!this.tsxUnregister) {\n await this.initialize();\n }\n\n const fileUrl = pathToFileURL(filePath).href;\n const module = await import(`${fileUrl}?t=${Date.now()}`);\n return this.extractComponent(module, filePath);\n } catch (error: any) {\n if (process.env.DEBUG) {\n console.error(`Failed to load plugin from ${filePath}:`, error);\n } else {\n console.warn(\n `Failed to load plugin from ${path.basename(filePath)}: ${error.message}`\n );\n }\n return null;\n }\n }\n\n async loadPlugins(\n filePaths: string[]\n ): Promise<Map<string, CustomComponent>> {\n const plugins = new Map<string, CustomComponent>();\n\n const results = await Promise.allSettled(\n filePaths.map(async (filePath) => {\n const module = await this.loadPlugin(filePath);\n return { filePath, module };\n })\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.module) {\n plugins.set(result.value.filePath, result.value.module);\n }\n }\n\n return plugins;\n }\n\n private extractComponent(\n module: any,\n filePath: string\n ): CustomComponent | null {\n if (module.default && this.isValidComponent(module.default)) {\n return module.default;\n }\n\n const componentExports = Object.entries(module)\n .filter(\n ([key]) =>\n key.endsWith('Component') ||\n key.endsWith('component') ||\n key.endsWith('Module') ||\n key.endsWith('module')\n )\n .map(([_, value]) => value);\n\n for (const exportedValue of componentExports) {\n if (this.isValidComponent(exportedValue)) {\n return exportedValue as CustomComponent;\n }\n }\n\n for (const [key, value] of Object.entries(module)) {\n if (this.isValidComponent(value)) {\n if (process.env.DEBUG) {\n console.log(\n `Found component in export '${key}' from ${path.basename(filePath)}`\n );\n }\n return value as CustomComponent;\n }\n }\n\n return null;\n }\n\n private isValidComponent(obj: any): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n const hasName = typeof obj.name === 'string' && obj.name.length > 0;\n\n if (obj.versions && typeof obj.versions === 'object') {\n const entries = Object.values(obj.versions);\n return (\n hasName &&\n entries.length > 0 &&\n entries.some(\n (entry: any) =>\n entry &&\n typeof entry === 'object' &&\n entry.propsSchema &&\n typeof entry.propsSchema === 'object' &&\n typeof entry.render === 'function'\n )\n );\n }\n\n return false;\n }\n\n cleanup(): void {\n this.tsxUnregister = undefined;\n }\n}\n","import * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { FileSystemScanner, type DiscoveryType } from './file-scanner.js';\nimport { PluginLoader } from './plugin-loader.js';\nimport {\n PluginMetadataExtractor,\n type PluginMetadata,\n} from './plugin-metadata.js';\nimport { getProjectRoot, resolveScopePath } from '../utils/project-root.js';\n\nexport interface DiscoverOptions {\n scope?: string;\n maxDepth?: number;\n includeNodeModules?: boolean;\n verbose?: boolean;\n type?: DiscoveryType | 'all';\n}\n\nexport interface DocumentMetadata {\n name: string;\n path: string;\n location: 'current' | 'downstream';\n type?: string;\n title?: string;\n description?: string;\n theme?: string;\n}\n\nexport interface ThemeMetadata {\n name: string;\n path: string;\n location: 'current' | 'downstream';\n description?: string;\n}\n\nexport type DiscoveryResult = PluginMetadata | DocumentMetadata | ThemeMetadata;\n\nexport class PluginDiscoveryService {\n private scanner: FileSystemScanner;\n private loader: PluginLoader;\n private metadataExtractor: PluginMetadataExtractor;\n private options: DiscoverOptions;\n private searchPath: string;\n private projectRoot: string;\n\n constructor(options: DiscoverOptions = {}) {\n this.options = options;\n this.scanner = new FileSystemScanner();\n this.loader = new PluginLoader();\n\n this.projectRoot = getProjectRoot();\n\n if (options.scope) {\n try {\n this.searchPath = resolveScopePath(options.scope, this.projectRoot);\n } catch (error: any) {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n }\n } else {\n this.searchPath = this.projectRoot;\n }\n\n this.metadataExtractor = new PluginMetadataExtractor(this.searchPath);\n }\n\n async discover(): Promise<PluginMetadata[]> {\n return this.discoverPlugins();\n }\n\n async discoverPlugins(): Promise<PluginMetadata[]> {\n const startPath = this.searchPath;\n\n try {\n await this.loader.initialize();\n\n const allPluginPaths = await this.searchDownstream(startPath, 'plugin');\n const uniquePaths = this.scanner.deduplicatePaths(allPluginPaths);\n\n if (this.options.verbose) {\n console.log(`Found ${uniquePaths.length} potential plugin files`);\n }\n\n const loadedModules = await this.loader.loadPlugins(uniquePaths);\n\n if (this.options.verbose) {\n console.log(`Successfully loaded ${loadedModules.size} plugins`);\n }\n\n const metadata = await this.metadataExtractor.extractBatch(loadedModules);\n\n metadata.sort((a, b) => {\n const locationOrder: Record<string, number> = {\n current: 0,\n downstream: 1,\n upstream: 2,\n };\n const locationDiff =\n locationOrder[a.location] - locationOrder[b.location];\n if (locationDiff !== 0) return locationDiff;\n return a.name.localeCompare(b.name);\n });\n\n return metadata;\n } finally {\n this.loader.cleanup();\n }\n }\n\n async discoverDocuments(format?: 'docx' | 'pptx'): Promise<DocumentMetadata[]> {\n const startPath = this.searchPath;\n\n const discoveryType: DiscoveryType = format === 'pptx' ? 'pptx-document' : 'docx-document';\n const ext = format === 'pptx' ? '.pptx.json' : '.docx.json';\n\n const allDocumentPaths = await this.searchDownstream(startPath, discoveryType);\n const uniquePaths = this.scanner.deduplicatePaths(allDocumentPaths);\n\n const metadata: DocumentMetadata[] = [];\n for (const docPath of uniquePaths) {\n try {\n const content = await fs.readFile(docPath, 'utf-8');\n const json = JSON.parse(content);\n const location = this.getFileLocation(docPath, startPath);\n\n metadata.push({\n name: path.basename(docPath, ext),\n path: docPath,\n location,\n type: json.name || 'document',\n title: json.props?.title || json.title,\n description: json.props?.metadata?.description || json.description,\n theme: json.props?.theme || json.theme,\n });\n } catch {}\n }\n\n metadata.sort((a, b) => {\n const locationOrder: Record<string, number> = { current: 0, downstream: 1, upstream: 2 };\n const locationDiff = locationOrder[a.location] - locationOrder[b.location];\n if (locationDiff !== 0) return locationDiff;\n return a.name.localeCompare(b.name);\n });\n\n return metadata;\n }\n\n async discoverThemes(format: 'docx' | 'pptx'): Promise<ThemeMetadata[]> {\n const startPath = this.searchPath;\n\n const discoveryType: DiscoveryType = format === 'pptx' ? 'pptx-theme' : 'docx-theme';\n const ext = format === 'pptx' ? '.pptx.theme.json' : '.docx.theme.json';\n\n const allThemePaths = await this.searchDownstream(startPath, discoveryType);\n const uniquePaths = this.scanner.deduplicatePaths(allThemePaths);\n\n const metadata: ThemeMetadata[] = [];\n for (const themePath of uniquePaths) {\n try {\n const content = await fs.readFile(themePath, 'utf-8');\n const json = JSON.parse(content);\n const location = this.getFileLocation(themePath, startPath);\n\n metadata.push({\n name: path.basename(themePath, ext),\n path: themePath,\n location,\n description: json.description || json.metadata?.description,\n });\n } catch {}\n }\n\n metadata.sort((a, b) => {\n const locationOrder: Record<string, number> = { current: 0, downstream: 1, upstream: 2 };\n const locationDiff = locationOrder[a.location] - locationOrder[b.location];\n if (locationDiff !== 0) return locationDiff;\n return a.name.localeCompare(b.name);\n });\n\n return metadata;\n }\n\n async getDocumentContent(name: string, format?: 'docx' | 'pptx'): Promise<string> {\n const documents = await this.discoverDocuments(format);\n const document = documents.find((doc) => doc.name === name);\n if (!document) throw new Error(`Document '${name}' not found`);\n return await fs.readFile(document.path, 'utf-8');\n }\n\n async getThemeContent(name: string, format: 'docx' | 'pptx'): Promise<string> {\n const themes = await this.discoverThemes(format);\n const theme = themes.find((t) => t.name === name);\n if (!theme) throw new Error(`Theme '${name}' not found`);\n return await fs.readFile(theme.path, 'utf-8');\n }\n\n async discoverAll(format: 'docx' | 'pptx'): Promise<{\n plugins: PluginMetadata[];\n documents: DocumentMetadata[];\n themes: ThemeMetadata[];\n }> {\n const [plugins, documents, themes] = await Promise.all([\n this.discoverPlugins(),\n this.discoverDocuments(format),\n this.discoverThemes(format),\n ]);\n return { plugins, documents, themes };\n }\n\n private getFileLocation(\n filePath: string,\n startPath: string\n ): 'current' | 'downstream' {\n const relative = path.relative(startPath, filePath);\n if (relative === path.basename(filePath)) {\n return 'current';\n }\n return 'downstream';\n }\n\n private async searchDownstream(\n startPath: string,\n fileType: DiscoveryType = 'plugin'\n ): Promise<string[]> {\n const resolvedPath = path.resolve(startPath);\n\n const plugins = await this.scanner.scan(resolvedPath, fileType, {\n maxDepth: this.options.maxDepth || 10,\n excludeNodeModules: !this.options.includeNodeModules,\n });\n\n if (await this.scanner.hasPackageJson(resolvedPath)) {\n const monorepoPlugins = await this.scanner.scanMonorepoLocations(\n resolvedPath,\n fileType\n );\n\n const downstreamMonorepoPlugins = monorepoPlugins.filter((p) => {\n const relative = path.relative(resolvedPath, p);\n return !relative.startsWith('..');\n });\n\n plugins.push(...downstreamMonorepoPlugins);\n }\n\n return plugins;\n }\n\n async hasPlugins(): Promise<boolean> {\n const plugins = await this.discoverPlugins();\n return plugins.length > 0;\n }\n\n async getPluginByName(name: string): Promise<PluginMetadata | undefined> {\n const plugins = await this.discoverPlugins();\n return plugins.find((p) => p.name === name);\n }\n}\n","import { glob } from 'glob';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\n\nexport interface ScanOptions {\n maxDepth?: number;\n excludeNodeModules?: boolean;\n additionalIgnore?: string[];\n}\n\nexport type DiscoveryType = 'plugin' | 'docx-document' | 'pptx-document' | 'pptx-theme' | 'docx-theme';\n\nexport interface FilePattern {\n type: DiscoveryType;\n pattern: string;\n monorepoPatterns?: string[];\n}\n\nexport class FileSystemScanner {\n private readonly FILE_PATTERNS: Record<DiscoveryType, FilePattern> = {\n plugin: {\n type: 'plugin',\n pattern: '*.component.ts',\n monorepoPatterns: [\n 'packages/*/src/**/*.component.ts',\n 'packages/**/src/**/*.component.ts',\n 'apps/*/src/**/*.component.ts',\n 'apps/**/src/**/*.component.ts',\n 'libs/*/src/**/*.component.ts',\n 'libs/**/src/**/*.component.ts',\n 'components/**/*.component.ts',\n 'plugins/**/*.component.ts',\n 'src/plugins/**/*.component.ts',\n 'src/components/**/*.component.ts',\n ],\n },\n 'docx-document': {\n type: 'docx-document',\n pattern: '*.docx.json',\n monorepoPatterns: [\n 'packages/*/src/**/*.docx.json',\n 'packages/**/src/**/*.docx.json',\n 'apps/*/src/**/*.docx.json',\n 'apps/**/src/**/*.docx.json',\n 'libs/*/src/**/*.docx.json',\n 'libs/**/src/**/*.docx.json',\n 'documents/**/*.docx.json',\n 'src/documents/**/*.docx.json',\n 'templates/**/*.docx.json',\n 'src/templates/**/*.docx.json',\n ],\n },\n 'pptx-document': {\n type: 'pptx-document',\n pattern: '*.pptx.json',\n monorepoPatterns: [\n 'packages/*/src/**/*.pptx.json',\n 'packages/**/src/**/*.pptx.json',\n 'apps/*/src/**/*.pptx.json',\n 'apps/**/src/**/*.pptx.json',\n 'libs/*/src/**/*.pptx.json',\n 'libs/**/src/**/*.pptx.json',\n 'documents/**/*.pptx.json',\n 'src/documents/**/*.pptx.json',\n 'templates/**/*.pptx.json',\n 'src/templates/**/*.pptx.json',\n ],\n },\n 'pptx-theme': {\n type: 'pptx-theme',\n pattern: '*.pptx.theme.json',\n monorepoPatterns: [\n 'packages/*/src/**/*.pptx.theme.json',\n 'packages/**/src/**/*.pptx.theme.json',\n 'apps/*/src/**/*.pptx.theme.json',\n 'apps/**/src/**/*.pptx.theme.json',\n 'libs/*/src/**/*.pptx.theme.json',\n 'libs/**/src/**/*.pptx.theme.json',\n 'themes/**/*.pptx.theme.json',\n 'src/themes/**/*.pptx.theme.json',\n 'templates/**/*.pptx.theme.json',\n 'src/templates/**/*.pptx.theme.json',\n ],\n },\n 'docx-theme': {\n type: 'docx-theme',\n pattern: '*.docx.theme.json',\n monorepoPatterns: [\n 'packages/*/src/**/*.docx.theme.json',\n 'packages/**/src/**/*.docx.theme.json',\n 'apps/*/src/**/*.docx.theme.json',\n 'apps/**/src/**/*.docx.theme.json',\n 'libs/*/src/**/*.docx.theme.json',\n 'libs/**/src/**/*.docx.theme.json',\n 'themes/**/*.docx.theme.json',\n 'src/themes/**/*.docx.theme.json',\n 'templates/**/*.docx.theme.json',\n 'src/templates/**/*.docx.theme.json',\n ],\n },\n };\n\n private readonly EXCLUDE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/coverage/**',\n '**/.next/**',\n '**/.turbo/**',\n '**/tmp/**',\n '**/.cache/**',\n '**/out/**',\n ];\n\n async scan(\n basePath: string,\n fileType: DiscoveryType = 'plugin',\n options: ScanOptions = {}\n ): Promise<string[]> {\n const {\n maxDepth = 10,\n excludeNodeModules = true,\n additionalIgnore = [],\n } = options;\n\n const patterns = this.buildPatterns(fileType, maxDepth);\n const ignore = this.buildIgnorePatterns(\n excludeNodeModules,\n additionalIgnore\n );\n\n try {\n const files = await glob(patterns, {\n cwd: basePath,\n absolute: true,\n ignore,\n nodir: true,\n });\n\n return files;\n } catch {\n return [];\n }\n }\n\n async scanMonorepoLocations(\n rootPath: string,\n fileType: DiscoveryType = 'plugin'\n ): Promise<string[]> {\n const monorepoPatterns =\n this.FILE_PATTERNS[fileType].monorepoPatterns || [];\n\n const allFiles: string[] = [];\n\n for (const pattern of monorepoPatterns) {\n try {\n const matches = await glob(pattern, {\n cwd: rootPath,\n absolute: true,\n ignore: this.EXCLUDE_PATTERNS,\n });\n allFiles.push(...matches);\n } catch {}\n }\n\n return allFiles;\n }\n\n async hasPackageJson(dirPath: string): Promise<boolean> {\n try {\n await fs.access(path.join(dirPath, 'package.json'));\n return true;\n } catch {\n return false;\n }\n }\n\n isInNodeModules(currentPath: string): boolean {\n return currentPath.includes('node_modules');\n }\n\n private buildPatterns(fileType: DiscoveryType, maxDepth: number): string[] {\n const filePattern = this.FILE_PATTERNS[fileType].pattern;\n const patterns: string[] = [filePattern];\n\n for (let depth = 1; depth <= maxDepth; depth++) {\n const depthPattern = Array(depth).fill('*').join('/') + '/' + filePattern;\n patterns.push(depthPattern);\n }\n\n return patterns;\n }\n\n private buildIgnorePatterns(\n excludeNodeModules: boolean,\n additionalIgnore: string[]\n ): string[] {\n let ignore = [...this.EXCLUDE_PATTERNS];\n\n if (!excludeNodeModules) {\n ignore = ignore.filter((pattern) => !pattern.includes('node_modules'));\n }\n\n return [...ignore, ...additionalIgnore];\n }\n\n deduplicatePaths(paths: string[]): string[] {\n const uniquePaths = new Set(paths.map((p) => path.resolve(p)));\n return Array.from(uniquePaths);\n }\n\n}\n","import * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { type TSchema } from '@sinclair/typebox';\nimport { latestVersion } from '@json-to-office/shared';\nimport type { CustomComponent } from './plugin-loader.js';\n\nexport interface PluginExample {\n title?: string;\n props: any;\n description?: string;\n}\n\nexport interface PluginMetadata {\n name: string;\n description?: string;\n version?: string;\n filePath: string;\n relativePath: string;\n location: 'upstream' | 'downstream' | 'current';\n hasChildren?: boolean;\n schema: {\n raw: TSchema;\n jsonSchema?: any;\n properties?: Record<string, any>;\n };\n examples?: PluginExample[];\n}\n\nexport class PluginMetadataExtractor {\n private cwd: string;\n\n constructor(cwd?: string) {\n this.cwd = cwd || process.cwd();\n }\n\n async extract(\n component: CustomComponent,\n filePath: string\n ): Promise<PluginMetadata> {\n const location = this.determineLocation(filePath);\n const relativePath = path.relative(this.cwd, filePath);\n\n const versions = (component as any).versions || {};\n const versionKeys = Object.keys(versions);\n const latestVer =\n versionKeys.length > 0 ? latestVersion(versionKeys) : undefined;\n const latestEntry = latestVer ? versions[latestVer] : undefined;\n\n const metadata: PluginMetadata = {\n name: component.name,\n description: latestEntry?.description,\n version: latestVer,\n filePath,\n relativePath,\n location,\n hasChildren: latestEntry?.hasChildren === true,\n schema: {\n raw: latestEntry?.propsSchema,\n },\n };\n\n if (latestEntry?.propsSchema) {\n try {\n metadata.schema.jsonSchema = this.typeboxToJsonSchema(\n latestEntry.propsSchema\n );\n metadata.schema.properties = this.extractProperties(\n latestEntry.propsSchema\n );\n } catch {}\n }\n\n try {\n metadata.examples = await this.extractExamples(filePath);\n } catch {\n metadata.examples = [];\n }\n\n return metadata;\n }\n\n private determineLocation(\n filePath: string\n ): 'upstream' | 'downstream' | 'current' {\n const resolvedPath = path.resolve(filePath);\n const resolvedCwd = path.resolve(this.cwd);\n\n if (path.dirname(resolvedPath) === resolvedCwd) {\n return 'current';\n }\n\n if (resolvedPath.startsWith(resolvedCwd)) {\n return 'downstream';\n }\n\n return 'upstream';\n }\n\n private typeboxToJsonSchema(schema: TSchema): any {\n try {\n const jsonSchema = JSON.parse(JSON.stringify(schema));\n delete jsonSchema[Symbol.for('TypeBox.Kind')];\n delete jsonSchema.static;\n return jsonSchema;\n } catch {\n return schema;\n }\n }\n\n private extractProperties(schema: TSchema): Record<string, any> {\n const properties: Record<string, any> = {};\n\n try {\n if (schema.type === 'object' && schema.properties) {\n for (const [key, value] of Object.entries(schema.properties)) {\n const prop: any = value as any;\n let type = prop.type || 'unknown';\n let enumValues: any[] | undefined;\n\n if (prop.anyOf && Array.isArray(prop.anyOf)) {\n const literals = prop.anyOf\n .filter(\n (item: any) =>\n item.type === 'string' && item.const !== undefined\n )\n .map((item: any) => item.const);\n\n if (literals.length > 0) {\n type = 'string';\n enumValues = literals;\n } else {\n const types = prop.anyOf\n .map((item: any) => item.type)\n .filter(Boolean);\n type = types.length > 0 ? types.join(' | ') : 'union';\n }\n }\n\n properties[key] = {\n type,\n description: prop.description,\n required: schema.required?.includes(key) || false,\n default: prop.default,\n enum: enumValues || prop.enum,\n pattern: prop.pattern,\n minimum: prop.minimum,\n maximum: prop.maximum,\n minLength: prop.minLength,\n maxLength: prop.maxLength,\n };\n\n Object.keys(properties[key]).forEach((k) => {\n if (properties[key][k] === undefined) {\n delete properties[key][k];\n }\n });\n }\n }\n } catch {}\n\n return properties;\n }\n\n private async extractExamples(filePath: string): Promise<PluginExample[]> {\n const examples: PluginExample[] = [];\n const normalizeExampleProps = (input: any) => {\n if (input && typeof input === 'object' && 'props' in input) {\n return (input as { props: any }).props;\n }\n return input;\n };\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n\n const exampleRegex =\n /@example\\s*(?:<caption>(.*?)<\\/caption>)?\\s*\\*?\\s*```(?:json|typescript|ts)?\\s*([\\s\\S]*?)```/gi;\n let match;\n\n while ((match = exampleRegex.exec(content)) !== null) {\n const title = match[1]?.trim();\n let codeBlock = match[2];\n\n codeBlock = codeBlock\n .split('\\n')\n .map((line) => line.replace(/^\\s*\\*\\s?/, ''))\n .join('\\n')\n .trim();\n\n const jsonMatch = codeBlock.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n try {\n const props = JSON.parse(jsonMatch[0]);\n examples.push({\n title,\n props: normalizeExampleProps(props),\n });\n } catch {\n const propsMatch = codeBlock.match(/props:\\s*\\{[\\s\\S]*?\\}/);\n if (propsMatch) {\n try {\n const configStr = propsMatch[0].replace(/props:\\s*/, '');\n const cleanConfig = configStr\n .replace(/(['\"])?([a-zA-Z0-9_]+)(['\"])?:/g, '\"$2\":')\n .replace(/'/g, '\"')\n .replace(/,(\\s*[}\\]])/g, '$1')\n .replace(/,\\s*$/, '');\n const props = JSON.parse(cleanConfig);\n examples.push({ title, props });\n } catch {}\n }\n }\n }\n }\n\n const inlineExampleRegex = /\\/\\/\\s*Example:\\s*(\\{.*?\\})/g;\n while ((match = inlineExampleRegex.exec(content)) !== null) {\n try {\n const props = JSON.parse(match[1]);\n examples.push({ props: normalizeExampleProps(props) });\n } catch {}\n }\n } catch {}\n\n return examples;\n }\n\n async extractBatch(\n components: Map<string, CustomComponent>\n ): Promise<PluginMetadata[]> {\n const metadataList: PluginMetadata[] = [];\n\n for (const [filePath, component] of components) {\n try {\n const metadata = await this.extract(component, filePath);\n metadataList.push(metadata);\n } catch (error) {\n console.warn(`Failed to extract metadata from ${filePath}:`, error);\n }\n }\n\n return metadataList;\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nconst PROJECT_ROOT_MARKERS = [\n 'pnpm-workspace.yaml',\n 'pnpm-workspace.yml',\n 'turbo.json',\n 'lerna.json',\n 'nx.json',\n '.git',\n 'package.json',\n];\n\nfunction hasWorkspaces(packageJsonPath: string): boolean {\n try {\n const content = fs.readFileSync(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(content);\n return !!(pkg.workspaces || pkg.private === true);\n } catch {\n return false;\n }\n}\n\nexport function findProjectRoot(startPath?: string): string | null {\n let currentPath = path.resolve(startPath || process.cwd());\n const root = path.parse(currentPath).root;\n\n while (currentPath !== root) {\n for (const marker of PROJECT_ROOT_MARKERS) {\n const markerPath = path.join(currentPath, marker);\n\n if (fs.existsSync(markerPath)) {\n if (marker === 'package.json') {\n if (hasWorkspaces(markerPath)) {\n return currentPath;\n }\n continue;\n }\n return currentPath;\n }\n }\n\n const parentPath = path.dirname(currentPath);\n if (parentPath === currentPath) break;\n currentPath = parentPath;\n }\n\n const fallbackPackageJson = path.join(\n startPath || process.cwd(),\n 'package.json'\n );\n if (fs.existsSync(fallbackPackageJson)) {\n return startPath || process.cwd();\n }\n\n return null;\n}\n\nexport function getProjectRoot(startPath?: string): string {\n const root = findProjectRoot(startPath);\n if (!root) {\n console.warn(\n 'Warning: Could not detect project root, using current directory'\n );\n return process.cwd();\n }\n return root;\n}\n\nexport function isWithinProject(\n targetPath: string,\n projectRoot: string\n): boolean {\n const resolvedTarget = path.resolve(targetPath);\n const resolvedRoot = path.resolve(projectRoot);\n return resolvedTarget.startsWith(resolvedRoot);\n}\n\nexport function resolveScopePath(scope: string, projectRoot: string): string {\n const resolved = path.resolve(projectRoot, scope);\n\n if (!isWithinProject(resolved, projectRoot)) {\n throw new Error(`Scope path \"${scope}\" is outside the project root`);\n }\n\n if (!fs.existsSync(resolved)) {\n throw new Error(`Scope directory not found: ${scope}`);\n }\n\n const stats = fs.statSync(resolved);\n if (!stats.isDirectory()) {\n throw new Error(`Scope must be a directory, not a file: ${scope}`);\n }\n\n return resolved;\n}\n","import type { CustomComponent } from './plugin-loader.js';\nimport { PluginLoader } from './plugin-loader.js';\nimport { PluginDiscoveryService } from './plugin-discovery.js';\nimport type { PluginMetadata } from './plugin-metadata.js';\nimport * as path from 'path';\nimport { invalidateAllCaches } from './cache-events.js';\n\nexport class PluginRegistry {\n private static instance: PluginRegistry;\n private plugins: Map<string, CustomComponent> = new Map();\n private pluginPaths: Map<string, string> = new Map();\n private pluginMetadata: Map<string, PluginMetadata> = new Map();\n private loader: PluginLoader;\n private discoveryService: PluginDiscoveryService;\n\n private constructor() {\n this.loader = new PluginLoader();\n this.discoveryService = new PluginDiscoveryService();\n }\n\n static getInstance(): PluginRegistry {\n if (!PluginRegistry.instance) {\n PluginRegistry.instance = new PluginRegistry();\n }\n return PluginRegistry.instance;\n }\n\n private notifyCacheInvalidation(): void {\n try {\n invalidateAllCaches();\n } catch {}\n }\n\n async loadPlugin(pathOrName: string): Promise<void> {\n try {\n await this.loader.initialize();\n\n const pluginPath = await this.resolvePluginPath(pathOrName);\n if (!pluginPath) {\n throw new Error(`Plugin '${pathOrName}' not found`);\n }\n\n const module = await this.loader.loadPlugin(pluginPath);\n if (module) {\n this.plugins.set(module.name, module);\n this.pluginPaths.set(module.name, pluginPath);\n this.notifyCacheInvalidation();\n } else {\n throw new Error(`Failed to load valid component from ${pluginPath}`);\n }\n } catch (error: any) {\n throw new Error(\n `Failed to load plugin '${pathOrName}': ${error.message}`\n );\n }\n }\n\n async loadPlugins(pathsOrNames: string[]): Promise<void> {\n const errors: string[] = [];\n\n try {\n for (const pathOrName of pathsOrNames) {\n try {\n await this.loadPlugin(pathOrName);\n } catch (error: any) {\n errors.push(error.message);\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `Failed to load ${errors.length} plugin(s): ${errors.join('; ')}`\n );\n }\n } finally {\n this.loader.cleanup();\n }\n }\n\n private async loadPluginsFromMetadata(\n pluginMetadata: PluginMetadata[]\n ): Promise<number> {\n let loadedCount = 0;\n\n for (const metadata of pluginMetadata) {\n try {\n const pluginPath = metadata.filePath;\n const module = await this.loader.loadPlugin(pluginPath);\n if (module) {\n this.plugins.set(module.name, module);\n this.pluginPaths.set(module.name, pluginPath);\n this.pluginMetadata.set(module.name, metadata);\n loadedCount++;\n this.notifyCacheInvalidation();\n }\n } catch {}\n }\n\n return loadedCount;\n }\n\n async loadPluginsFromDirectory(dir: string): Promise<number> {\n try {\n await this.loader.initialize();\n\n const discovery = new PluginDiscoveryService({\n scope: dir,\n maxDepth: 5,\n });\n\n const pluginMetadata = await discovery.discover();\n return await this.loadPluginsFromMetadata(pluginMetadata);\n } catch (error: any) {\n throw new Error(\n `Failed to load plugins from directory: ${error.message}`\n );\n } finally {\n this.loader.cleanup();\n }\n }\n\n async discoverAndLoad(): Promise<{ discovered: number; loaded: number }> {\n try {\n await this.loader.initialize();\n\n const pluginMetadata = await this.discoveryService.discover();\n const discovered = pluginMetadata.length;\n\n if (discovered === 0) {\n return { discovered: 0, loaded: 0 };\n }\n\n const loaded = await this.loadPluginsFromMetadata(pluginMetadata);\n return { discovered, loaded };\n } catch (error: any) {\n throw new Error(`Failed to discover and load plugins: ${error.message}`);\n } finally {\n this.loader.cleanup();\n }\n }\n\n async resolvePluginName(name: string): Promise<string | undefined> {\n if (this.pluginPaths.has(name)) {\n return this.pluginPaths.get(name);\n }\n\n try {\n const pluginMetadata = await this.discoveryService.discover();\n const metadata = pluginMetadata.find((p) => p.name === name);\n if (metadata) return metadata.filePath;\n } catch {}\n\n return undefined;\n }\n\n private async resolvePluginPath(\n pathOrName: string\n ): Promise<string | undefined> {\n if (pathOrName.endsWith('.ts') || pathOrName.endsWith('.js')) {\n return path.resolve(process.cwd(), pathOrName);\n }\n return await this.resolvePluginName(pathOrName);\n }\n\n getPlugins(): CustomComponent[] {\n return Array.from(this.plugins.values());\n }\n\n getPluginNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n getPlugin(name: string): CustomComponent | undefined {\n return this.plugins.get(name);\n }\n\n hasPlugins(): boolean {\n return this.plugins.size > 0;\n }\n\n getPluginCount(): number {\n return this.plugins.size;\n }\n\n clear(): void {\n this.plugins.clear();\n this.pluginPaths.clear();\n this.pluginMetadata.clear();\n this.loader.cleanup();\n this.notifyCacheInvalidation();\n }\n\n static cleanup(): void {\n if (PluginRegistry.instance) {\n PluginRegistry.instance.clear();\n }\n }\n\n getPluginMetadata(name: string): PluginMetadata | undefined {\n return this.pluginMetadata.get(name);\n }\n\n getAllPluginMetadata(): PluginMetadata[] {\n return Array.from(this.pluginMetadata.values());\n }\n}\n","import { EventEmitter } from 'events';\n\nexport interface CacheEvents {\n 'cache:invalidate': () => void;\n 'schema:invalidate': () => void;\n 'generator:invalidate': () => void;\n}\n\nclass CacheEventEmitter extends EventEmitter {\n emit<K extends keyof CacheEvents>(\n event: K,\n ...args: Parameters<CacheEvents[K]>\n ): boolean {\n return super.emit(event, ...args);\n }\n\n on<K extends keyof CacheEvents>(event: K, listener: CacheEvents[K]): this {\n return super.on(event, listener);\n }\n\n off<K extends keyof CacheEvents>(event: K, listener: CacheEvents[K]): this {\n return super.off(event, listener);\n }\n\n once<K extends keyof CacheEvents>(event: K, listener: CacheEvents[K]): this {\n return super.once(event, listener);\n }\n}\n\nexport const cacheEvents = new CacheEventEmitter();\n\nexport function invalidateAllCaches(): void {\n cacheEvents.emit('cache:invalidate');\n cacheEvents.emit('schema:invalidate');\n cacheEvents.emit('generator:invalidate');\n}\n","import { PluginRegistry } from './plugin-registry.js';\nimport type { FormatAdapter, GeneratorOptions } from '../format-adapter.js';\n\ntype ComponentDefinition = any;\n\nexport class GeneratorFactory {\n private registry: PluginRegistry;\n private adapter: FormatAdapter;\n\n constructor(adapter: FormatAdapter) {\n this.registry = PluginRegistry.getInstance();\n this.adapter = adapter;\n }\n\n async createGenerator(options: GeneratorOptions = {}): Promise<{\n generateBuffer: (document: ComponentDefinition | string) => Promise<Buffer>;\n hasPlugins: boolean;\n pluginNames: string[];\n }> {\n const plugins = this.registry.getPlugins();\n return this.adapter.createGenerator(plugins, options);\n }\n\n async generate(\n document: ComponentDefinition | string,\n options: GeneratorOptions = {}\n ): Promise<Buffer> {\n const generator = await this.createGenerator(options);\n return await generator.generateBuffer(document);\n }\n\n getPluginInfo(): {\n hasPlugins: boolean;\n count: number;\n names: string[];\n } {\n return {\n hasPlugins: this.registry.hasPlugins(),\n count: this.registry.getPluginCount(),\n names: this.registry.getPluginNames(),\n };\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { PluginDiscoveryService } from './plugin-discovery.js';\nimport type { PluginMetadata } from './plugin-metadata.js';\n\nexport class PluginResolver {\n private discoveryService: PluginDiscoveryService;\n private discoveredPlugins: Map<string, PluginMetadata> = new Map();\n private lastDiscoveryTime: number = 0;\n private readonly CACHE_DURATION = 5 * 60 * 1000;\n\n constructor() {\n this.discoveryService = new PluginDiscoveryService();\n }\n\n async resolve(input: string): Promise<string> {\n const pathResult = await this.resolveAsPath(input);\n if (pathResult) return pathResult;\n\n const nameResult = await this.resolveAsName(input);\n if (nameResult) return nameResult;\n\n await this.refreshDiscoveryCache();\n const discoveredResult = await this.resolveAsName(input);\n if (discoveredResult) return discoveredResult;\n\n throw await this.createNotFoundError(input);\n }\n\n async resolveMultiple(inputs: string[]): Promise<Map<string, string>> {\n const resolved = new Map<string, string>();\n const errors: string[] = [];\n\n for (const input of inputs) {\n try {\n const resolvedPath = await this.resolve(input);\n resolved.set(input, resolvedPath);\n } catch (error: any) {\n errors.push(`${input}: ${error.message}`);\n }\n }\n\n if (errors.length > 0 && errors.length === inputs.length) {\n throw new Error(`Failed to resolve plugins:\\n${errors.join('\\n')}`);\n }\n\n return resolved;\n }\n\n private async resolveAsPath(input: string): Promise<string | null> {\n if (!this.looksLikePath(input)) return null;\n\n const resolvedPath = path.resolve(process.cwd(), input);\n\n try {\n const stats = await fs.stat(resolvedPath);\n if (stats.isFile()) return resolvedPath;\n } catch {}\n\n return null;\n }\n\n private async resolveAsName(name: string): Promise<string | null> {\n if (this.discoveredPlugins.size === 0 || this.isCacheExpired()) {\n await this.refreshDiscoveryCache();\n }\n\n const plugin = this.discoveredPlugins.get(name);\n if (plugin) return plugin.filePath;\n\n const lowerName = name.toLowerCase();\n for (const [pluginName, metadata] of this.discoveredPlugins) {\n if (pluginName.toLowerCase() === lowerName) return metadata.filePath;\n }\n\n return null;\n }\n\n private async refreshDiscoveryCache(): Promise<void> {\n try {\n const plugins = await this.discoveryService.discover();\n this.discoveredPlugins.clear();\n for (const plugin of plugins) {\n this.discoveredPlugins.set(plugin.name, plugin);\n }\n this.lastDiscoveryTime = Date.now();\n } catch (error: any) {\n console.warn(`Plugin discovery failed: ${error.message}`);\n }\n }\n\n private isCacheExpired(): boolean {\n return Date.now() - this.lastDiscoveryTime > this.CACHE_DURATION;\n }\n\n private looksLikePath(input: string): boolean {\n if (input.endsWith('.ts') || input.endsWith('.js')) return true;\n if (input.includes('/') || input.includes('\\\\')) return true;\n if (input.startsWith('./') || input.startsWith('../')) return true;\n if (path.isAbsolute(input)) return true;\n return false;\n }\n\n private async createNotFoundError(input: string): Promise<Error> {\n let message = `Plugin '${input}' not found.`;\n\n if (this.discoveredPlugins.size > 0) {\n const suggestions = this.findSimilarNames(input);\n if (suggestions.length > 0) {\n message += '\\n\\nDid you mean one of these?';\n suggestions.forEach((name) => { message += `\\n - ${name}`; });\n } else {\n message += '\\n\\nAvailable plugins:';\n Array.from(this.discoveredPlugins.keys())\n .slice(0, 5)\n .forEach((name) => { message += `\\n - ${name}`; });\n if (this.discoveredPlugins.size > 5) {\n message += `\\n ... and ${this.discoveredPlugins.size - 5} more`;\n }\n }\n }\n\n message += '\\n\\nUse \\'jto <format> discover\\' to list all available plugins.';\n\n return new Error(message);\n }\n\n private findSimilarNames(input: string): string[] {\n const inputLower = input.toLowerCase();\n const suggestions: string[] = [];\n\n for (const name of this.discoveredPlugins.keys()) {\n const nameLower = name.toLowerCase();\n if (nameLower.includes(inputLower) || inputLower.includes(nameLower)) {\n suggestions.push(name);\n } else if (nameLower.startsWith(inputLower[0])) {\n suggestions.push(name);\n }\n if (suggestions.length >= 3) break;\n }\n\n return suggestions;\n }\n\n async getAvailablePluginNames(): Promise<string[]> {\n if (this.discoveredPlugins.size === 0 || this.isCacheExpired()) {\n await this.refreshDiscoveryCache();\n }\n return Array.from(this.discoveredPlugins.keys());\n }\n\n clearCache(): void {\n this.discoveredPlugins.clear();\n this.lastDiscoveryTime = 0;\n }\n}\n","import * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { PluginRegistry } from './plugin-registry.js';\nimport { TypeBoxExporter } from './typebox-exporter.js';\nimport type { CustomComponent } from './plugin-loader.js';\nimport type { TSchema } from '@sinclair/typebox';\nimport type { FormatName } from '../format-adapter.js';\n\nexport interface SchemaGenerateOptions {\n includeDocument?: boolean;\n includeTheme?: boolean;\n split?: boolean;\n format?: 'json' | 'typebox';\n}\n\nexport interface SchemaGenerateResults {\n document?: string;\n theme?: string;\n components?: string[];\n}\n\nexport class SchemaGenerator {\n private registry: PluginRegistry;\n private typeboxExporter: TypeBoxExporter;\n private formatName: FormatName;\n\n constructor(formatName: FormatName = 'docx') {\n this.registry = PluginRegistry.getInstance();\n this.typeboxExporter = new TypeBoxExporter(formatName);\n this.formatName = formatName;\n }\n\n async generateAndExportSchemas(\n outputDir: string,\n options: SchemaGenerateOptions = {}\n ): Promise<SchemaGenerateResults> {\n const {\n includeDocument = true,\n includeTheme = true,\n split = false,\n format = 'json',\n } = options;\n\n const results: SchemaGenerateResults = {};\n\n await fs.mkdir(outputDir, { recursive: true });\n\n const customComponents = this.getCustomComponents();\n\n if (includeDocument) {\n const documentPath = await this.generateDocumentSchema(\n outputDir,\n customComponents,\n format\n );\n results.document = documentPath;\n }\n\n if (includeTheme) {\n const themePath = await this.generateThemeSchema(outputDir, format);\n results.theme = themePath;\n }\n\n if (split) {\n const componentPaths = await this.generateComponentSchemas(\n outputDir,\n customComponents,\n format\n );\n results.components = componentPaths;\n }\n\n return results;\n }\n\n private async generateDocumentSchema(\n outputDir: string,\n customComponents: Array<{\n name: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n versionedProps?: Array<{\n version: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n }>;\n }>,\n format: 'json' | 'typebox'\n ): Promise<string> {\n if (this.formatName === 'docx') {\n const { generateUnifiedDocumentSchema } = await import(\n '@json-to-office/shared-docx'\n );\n const schema = generateUnifiedDocumentSchema({\n includeStandardComponents: true,\n includeTheme: false,\n customComponents: customComponents.map((m) => ({\n name: m.name,\n propsSchema: m.propsSchema,\n hasChildren: m.hasChildren,\n versionedProps: m.versionedProps,\n })),\n title: 'JSON Document Definition',\n description:\n customComponents.length > 0\n ? 'Document definition with standard and custom plugin components'\n : 'Document definition with standard components',\n });\n\n if (format === 'json') {\n const { convertToJsonSchema, exportSchemaToFile } = await import(\n '@json-to-office/shared'\n );\n const jsonSchema = convertToJsonSchema(schema, {\n $id: 'document.schema.json',\n });\n const outputPath = path.join(outputDir, 'document.schema.json');\n await exportSchemaToFile(jsonSchema, outputPath, { prettyPrint: true });\n return outputPath;\n } else {\n const outputPath = path.join(outputDir, 'document.schema.ts');\n await this.typeboxExporter.exportDocumentSchema(\n schema,\n outputPath,\n customComponents\n );\n return outputPath;\n }\n } else {\n // PPTX schema generation — different CustomComponentInfo shape\n const { generateUnifiedDocumentSchema } = await import(\n '@json-to-office/shared-pptx'\n );\n\n const schema = generateUnifiedDocumentSchema({\n customComponents: customComponents.map((m) => ({\n name: m.name,\n versions: m.versionedProps\n ? m.versionedProps.map((vp) => ({\n version: vp.version,\n propsSchema: vp.propsSchema,\n hasChildren: vp.hasChildren,\n }))\n : [\n {\n version: '1.0.0',\n propsSchema: m.propsSchema,\n hasChildren: m.hasChildren,\n },\n ],\n })),\n });\n\n if (format === 'json') {\n const { convertToJsonSchema, exportSchemaToFile } = await import(\n '@json-to-office/shared'\n );\n const jsonSchema = convertToJsonSchema(schema, {\n $id: 'presentation.schema.json',\n });\n const outputPath = path.join(outputDir, 'presentation.schema.json');\n await exportSchemaToFile(jsonSchema, outputPath, { prettyPrint: true });\n return outputPath;\n } else {\n const outputPath = path.join(outputDir, 'presentation.schema.ts');\n await this.typeboxExporter.exportDocumentSchema(\n schema,\n outputPath,\n customComponents\n );\n return outputPath;\n }\n }\n }\n\n private async generateThemeSchema(\n outputDir: string,\n format: 'json' | 'typebox'\n ): Promise<string> {\n const sharedPkg =\n this.formatName === 'docx'\n ? '@json-to-office/shared-docx'\n : '@json-to-office/shared-pptx';\n\n const shared = await import(sharedPkg);\n const ThemeConfigSchema = shared.ThemeConfigSchema;\n\n if (format === 'json') {\n const { convertToJsonSchema, exportSchemaToFile } = await import(\n '@json-to-office/shared'\n );\n const jsonSchema = convertToJsonSchema(ThemeConfigSchema, {\n $id: 'theme.schema.json',\n title: 'Theme Configuration',\n description: 'Theme configuration for styling',\n });\n\n const outputPath = path.join(outputDir, 'theme.schema.json');\n await exportSchemaToFile(jsonSchema, outputPath, { prettyPrint: true });\n return outputPath;\n } else {\n const outputPath = path.join(outputDir, 'theme.schema.ts');\n await this.typeboxExporter.exportThemeSchema(\n ThemeConfigSchema,\n outputPath\n );\n return outputPath;\n }\n }\n\n private async generateComponentSchemas(\n outputDir: string,\n customComponents: Array<{ name: string; propsSchema: TSchema }>,\n format: 'json' | 'typebox'\n ): Promise<string[]> {\n const componentsDir = path.join(outputDir, 'components');\n await fs.mkdir(componentsDir, { recursive: true });\n\n const paths: string[] = [];\n\n // Get standard components based on format\n const standardComponents = await this.getStandardComponentSchemas();\n\n for (const [type, schema] of Object.entries(standardComponents)) {\n if (format === 'json') {\n const { convertToJsonSchema, exportSchemaToFile } = await import(\n '@json-to-office/shared'\n );\n const jsonSchema = convertToJsonSchema(schema, {\n $id: `${type}.schema.json`,\n title: `${type} Component`,\n description: `${type} component configuration`,\n });\n const outputPath = path.join(componentsDir, `${type}.schema.json`);\n await exportSchemaToFile(jsonSchema, outputPath, { prettyPrint: true });\n paths.push(outputPath);\n } else {\n const outputPath = path.join(componentsDir, `${type}.schema.ts`);\n await this.typeboxExporter.exportComponentSchema(type, schema, outputPath);\n paths.push(outputPath);\n }\n }\n\n // Custom component schemas\n for (const customComponent of customComponents) {\n if (format === 'json') {\n const { convertToJsonSchema, exportSchemaToFile } = await import(\n '@json-to-office/shared'\n );\n const jsonSchema = convertToJsonSchema(customComponent.propsSchema, {\n $id: `${customComponent.name}.schema.json`,\n title: `${customComponent.name} Component`,\n description: `Custom ${customComponent.name} component configuration`,\n });\n const outputPath = path.join(\n componentsDir,\n `${customComponent.name}.schema.json`\n );\n await exportSchemaToFile(jsonSchema, outputPath, { prettyPrint: true });\n paths.push(outputPath);\n } else {\n const outputPath = path.join(\n componentsDir,\n `${customComponent.name}.schema.ts`\n );\n await this.typeboxExporter.exportComponentSchema(\n customComponent.name,\n customComponent.propsSchema,\n outputPath\n );\n paths.push(outputPath);\n }\n }\n\n return paths;\n }\n\n private async getStandardComponentSchemas(): Promise<Record<string, TSchema>> {\n if (this.formatName === 'docx') {\n const shared = await import('@json-to-office/shared-docx');\n return {\n report: shared.ReportPropsSchema,\n section: shared.SectionPropsSchema,\n columns: shared.ColumnsPropsSchema,\n heading: shared.HeadingPropsSchema,\n paragraph: shared.ParagraphPropsSchema,\n image: shared.ImagePropsSchema,\n statistic: shared.StatisticPropsSchema,\n table: shared.TablePropsSchema,\n header: shared.HeaderPropsSchema,\n footer: shared.FooterPropsSchema,\n list: shared.ListPropsSchema,\n };\n } else {\n const shared = await import('@json-to-office/shared-pptx');\n return {\n presentation: shared.PresentationPropsSchema,\n slide: shared.SlidePropsSchema,\n text: shared.TextPropsSchema,\n image: shared.PptxImagePropsSchema,\n shape: shared.ShapePropsSchema,\n table: shared.PptxTablePropsSchema,\n };\n }\n }\n\n private getCustomComponents(): Array<{\n name: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n versionedProps?: Array<{\n version: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n }>;\n }> {\n const loadedPlugins = this.registry.getPlugins();\n const customComponents: Array<{\n name: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n versionedProps?: Array<{\n version: string;\n propsSchema: TSchema;\n hasChildren?: boolean;\n }>;\n }> = [];\n\n for (const plugin of loadedPlugins) {\n const component = plugin as unknown as CustomComponent;\n const versions = (component as any).versions;\n if (component.name && versions && typeof versions === 'object') {\n const versionKeys = Object.keys(versions);\n if (versionKeys.length > 0) {\n const versionedProps = versionKeys.map((v: string) => ({\n version: v,\n propsSchema: versions[v].propsSchema as TSchema,\n hasChildren: versions[v].hasChildren === true,\n }));\n\n const hasChildren = versionKeys.some(\n (v: string) => versions[v].hasChildren === true\n );\n const latestKey = versionKeys.reduce((a, b) => (a > b ? a : b));\n\n customComponents.push({\n name: component.name,\n propsSchema: versions[latestKey].propsSchema as TSchema,\n hasChildren,\n versionedProps,\n });\n }\n }\n }\n\n return customComponents;\n }\n}\n","import * as fs from 'fs/promises';\nimport type { TSchema } from '@sinclair/typebox';\nimport type { FormatName } from '../format-adapter.js';\n\nexport class TypeBoxExporter {\n private formatName: FormatName;\n\n constructor(formatName: FormatName = 'docx') {\n this.formatName = formatName;\n }\n\n private get sharedPackage(): string {\n return this.formatName === 'docx'\n ? '@json-to-office/shared-docx'\n : '@json-to-office/shared-pptx';\n }\n\n async exportDocumentSchema(\n schema: TSchema,\n outputPath: string,\n customComponents: Array<{ name: string; propsSchema: TSchema }>\n ): Promise<void> {\n const hasCustomComponents = customComponents.length > 0;\n\n const content = [\n '/**',\n ` * Generated TypeBox Document Schema (${this.formatName.toUpperCase()})`,\n hasCustomComponents\n ? ' * Includes standard components and custom plugin components'\n : ' * Includes standard components only',\n ' * Generated on: ' + new Date().toISOString(),\n ' */',\n '',\n 'import { Type, type Static } from \\'@sinclair/typebox\\';',\n `// Import component schemas from '${this.sharedPackage}'`,\n '',\n 'export const DocumentSchema = Type.Any(); // TODO: generate full recursive schema',\n '',\n 'export type DocumentType = Static<typeof DocumentSchema>;',\n '',\n ].join('\\n');\n\n await fs.writeFile(outputPath, content, 'utf-8');\n }\n\n async exportThemeSchema(schema: TSchema, outputPath: string): Promise<void> {\n const content = [\n '/**',\n ` * Generated TypeBox Theme Schema (${this.formatName.toUpperCase()})`,\n ' * Generated on: ' + new Date().toISOString(),\n ' */',\n '',\n 'import { type Static } from \\'@sinclair/typebox\\';',\n '',\n `export { ThemeConfigSchema } from '${this.sharedPackage}';`,\n '',\n `import { ThemeConfigSchema } from '${this.sharedPackage}';`,\n 'export type ThemeType = Static<typeof ThemeConfigSchema>;',\n '',\n ].join('\\n');\n\n await fs.writeFile(outputPath, content, 'utf-8');\n }\n\n async exportComponentSchema(\n componentName: string,\n schema: TSchema,\n outputPath: string,\n metadata?: { title?: string; description?: string }\n ): Promise<void> {\n const pascalName = this.toPascalCase(componentName);\n\n const content = [\n '/**',\n ` * Generated TypeBox Component Schema: ${componentName}`,\n metadata?.description ? ` * ${metadata.description}` : '',\n ' * Generated on: ' + new Date().toISOString(),\n ' */',\n '',\n 'import { Type, type Static } from \\'@sinclair/typebox\\';',\n '',\n `export const ${pascalName}ComponentSchema = Type.Object({`,\n ` name: Type.Literal('${componentName}'),`,\n ' id: Type.Optional(Type.String()),',\n ' props: Type.Any(),',\n '});',\n '',\n `export type ${pascalName}ComponentType = Static<typeof ${pascalName}ComponentSchema>;`,\n '',\n ]\n .filter((line) => line !== '')\n .join('\\n');\n\n await fs.writeFile(outputPath, content, 'utf-8');\n }\n\n private toPascalCase(str: string): string {\n return str\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n }\n}\n","import { readFileSync, statSync, readdirSync } from 'fs';\nimport { resolve, join, extname } from 'path';\nimport * as glob from 'glob';\nimport type { FormatName } from '../format-adapter.js';\n\nexport interface ValidationError {\n path: string;\n message: string;\n code?: string;\n line?: number;\n column?: number;\n suggestion?: string;\n value?: any;\n}\n\nexport interface ValidateFileResult {\n file: string;\n valid: boolean;\n type?: 'document' | 'theme' | 'custom';\n errors?: ValidationError[];\n warnings?: ValidationError[];\n}\n\nexport interface ValidateOptions {\n type?: 'document' | 'theme' | 'auto';\n schema?: string;\n strict?: boolean;\n recursive?: boolean;\n}\n\nexport class JsonValidator {\n private format: FormatName;\n\n constructor(format: FormatName = 'docx') {\n this.format = format;\n }\n\n async validate(\n pathOrPattern: string,\n options: ValidateOptions = {}\n ): Promise<ValidateFileResult[]> {\n const results: ValidateFileResult[] = [];\n\n const files = await this.getFilesToValidate(pathOrPattern, options);\n\n for (const file of files) {\n const result = await this.validateFile(file, options);\n results.push(result);\n }\n\n return results;\n }\n\n async validateFile(\n filePath: string,\n options: ValidateOptions = {}\n ): Promise<ValidateFileResult> {\n const absolutePath = resolve(filePath);\n\n try {\n const content = readFileSync(absolutePath, 'utf-8');\n let jsonData: any;\n\n try {\n jsonData = JSON.parse(content);\n } catch (error: any) {\n return {\n file: filePath,\n valid: false,\n errors: [\n {\n path: 'root',\n message: `Invalid JSON: ${error.message}`,\n code: 'json_parse_error',\n },\n ],\n };\n }\n\n const validationType =\n options.type === 'auto' || !options.type\n ? this.detectType(jsonData)\n : options.type;\n\n if (options.schema) {\n return await this.validateWithCustomSchema(\n filePath,\n jsonData,\n options.schema,\n options.strict\n );\n } else if (validationType === 'document') {\n return await this.validateAsDocument(\n filePath,\n jsonData,\n content,\n options.strict\n );\n } else if (validationType === 'theme') {\n return await this.validateAsTheme(\n filePath,\n jsonData,\n content,\n options.strict\n );\n } else {\n return {\n file: filePath,\n valid: false,\n errors: [\n {\n path: 'root',\n message:\n 'Could not determine JSON type (document or theme). Use --type to specify.',\n code: 'unknown_type',\n },\n ],\n };\n }\n } catch (error: any) {\n return {\n file: filePath,\n valid: false,\n errors: [\n {\n path: 'file',\n message: error.message,\n code: 'file_error',\n },\n ],\n };\n }\n }\n\n private async validateAsDocument(\n filePath: string,\n jsonData: any,\n jsonString: string,\n strict?: boolean\n ): Promise<ValidateFileResult> {\n try {\n if (this.format === 'docx') {\n const { validate, validateStrict } = await import(\n '@json-to-office/shared-docx'\n );\n const validator = strict ? validateStrict : validate;\n const result = validator.jsonDocument(jsonString);\n return {\n file: filePath,\n valid: result.valid,\n type: 'document',\n errors: result.errors?.map((e: any) => ({\n ...e,\n code: e.code || 'VALIDATION_ERROR',\n })),\n warnings: result.warnings?.map((e: any) => ({\n ...e,\n code: e.code || 'WARNING',\n })),\n };\n } else {\n // PPTX - basic validation\n return {\n file: filePath,\n valid: true,\n type: 'document',\n };\n }\n } catch {\n // Fallback if validation module not available\n return { file: filePath, valid: true, type: 'document' };\n }\n }\n\n private async validateAsTheme(\n filePath: string,\n jsonData: any,\n jsonString: string,\n strict?: boolean\n ): Promise<ValidateFileResult> {\n try {\n if (this.format === 'docx') {\n const { validate, validateStrict } = await import(\n '@json-to-office/shared-docx'\n );\n const validator = strict ? validateStrict : validate;\n const result = validator.jsonTheme(jsonString);\n return {\n file: filePath,\n valid: result.valid,\n type: 'theme',\n errors: result.errors?.map((e: any) => ({\n ...e,\n code: e.code || 'VALIDATION_ERROR',\n })),\n };\n } else {\n return { file: filePath, valid: true, type: 'theme' };\n }\n } catch {\n return { file: filePath, valid: true, type: 'theme' };\n }\n }\n\n private async validateWithCustomSchema(\n filePath: string,\n jsonData: any,\n schemaPath: string,\n strict?: boolean\n ): Promise<ValidateFileResult> {\n try {\n const schemaContent = readFileSync(resolve(schemaPath), 'utf-8');\n const schema = JSON.parse(schemaContent);\n\n const Ajv = (await import('ajv')).default;\n const addFormats = (await import('ajv-formats')).default;\n\n const ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: strict ?? false,\n });\n addFormats(ajv);\n\n const validate = ajv.compile(schema);\n const valid = validate(jsonData);\n\n const errors: ValidationError[] =\n validate.errors?.map((error) => ({\n path: error.instancePath || 'root',\n message: error.message || 'Validation error',\n code: error.keyword || 'validation_error',\n value: error.data,\n })) || [];\n\n return {\n file: filePath,\n valid: valid as boolean,\n type: 'custom',\n errors: valid ? undefined : errors,\n };\n } catch (error: any) {\n return {\n file: filePath,\n valid: false,\n type: 'custom',\n errors: [\n {\n path: 'schema',\n message: `Failed to load or compile schema: ${error.message}`,\n code: 'schema_error',\n },\n ],\n };\n }\n }\n\n private detectType(jsonData: any): 'document' | 'theme' | null {\n if (\n jsonData.name === 'docx' ||\n jsonData.name === 'pptx' ||\n (jsonData.children && Array.isArray(jsonData.children)) ||\n (jsonData.slides && Array.isArray(jsonData.slides)) ||\n (jsonData.props && jsonData.props.metadata?.title)\n ) {\n return 'document';\n }\n\n if (\n jsonData.colors ||\n jsonData.fonts ||\n jsonData.styles ||\n jsonData.pageSetup ||\n jsonData.componentDefaults ||\n (jsonData.name && (jsonData.colors || jsonData.fonts))\n ) {\n return 'theme';\n }\n\n return null;\n }\n\n private async getFilesToValidate(\n pathOrPattern: string,\n options: ValidateOptions\n ): Promise<string[]> {\n const resolvedPath = resolve(pathOrPattern);\n\n try {\n const stats = statSync(resolvedPath);\n\n if (stats.isFile()) {\n return [resolvedPath];\n } else if (stats.isDirectory()) {\n if (options.recursive) {\n const pattern = join(resolvedPath, '**/*.json');\n return glob.glob(pattern, {\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n });\n } else {\n const files = readdirSync(resolvedPath);\n return files\n .filter((file) => extname(file).toLowerCase() === '.json')\n .map((file) => join(resolvedPath, file));\n }\n }\n } catch {\n return glob.glob(pathOrPattern, {\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n });\n }\n\n return [];\n }\n\n formatError(error: ValidationError, indent: number = 0): string {\n const spaces = ' '.repeat(indent);\n let output = `${spaces}* ${error.path}: ${error.message}`;\n\n if (error.line && error.column) {\n output += ` (line ${error.line}, column ${error.column})`;\n }\n\n if (error.suggestion) {\n output += `\\n${spaces} -> ${error.suggestion}`;\n }\n\n return output;\n }\n\n formatResultsAsJson(results: ValidateFileResult[]): string {\n return JSON.stringify(results, null, 2);\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { cosmiconfig } from 'cosmiconfig';\n\nexport interface PluginConfig {\n plugins?: string[];\n pluginDirs?: string[];\n autoDiscover?: boolean;\n aliases?: Record<string, string>;\n theme?: string | any;\n themePath?: string;\n discovery?: {\n maxDepth?: number;\n includeNodeModules?: boolean;\n upstreamOnly?: boolean;\n downstreamOnly?: boolean;\n };\n validation?: {\n strict?: boolean;\n allowUnknownFields?: boolean;\n };\n}\n\nexport class PluginConfigService {\n private static instance: PluginConfigService;\n private config: PluginConfig | null = null;\n private configPath: string | null = null;\n\n private static readonly CONFIG_FILES = [\n '.json-to-office.config.json',\n '.json-to-office.config.js',\n 'json-to-office.config.json',\n 'json-to-office.config.js',\n '.json-to-officerc',\n '.json-to-officerc.json',\n '.json-to-officerc.js',\n // Legacy support\n '.json-to-docx.config.json',\n '.json-to-docx.config.js',\n 'json-to-docx.config.json',\n '.json-to-pptx.config.json',\n '.json-to-pptx.config.js',\n 'json-to-pptx.config.json',\n ];\n\n private constructor() {}\n\n static getInstance(): PluginConfigService {\n if (!PluginConfigService.instance) {\n PluginConfigService.instance = new PluginConfigService();\n }\n return PluginConfigService.instance;\n }\n\n async loadConfig(startPath?: string): Promise<PluginConfig | null> {\n try {\n const explorer = cosmiconfig('json-to-office', {\n searchPlaces: PluginConfigService.CONFIG_FILES,\n stopDir: path.parse(startPath || process.cwd()).root,\n });\n\n const result = await explorer.search(startPath);\n\n if (result) {\n this.config = result.config as PluginConfig;\n this.configPath = result.filepath;\n return this.config;\n }\n } catch (error: any) {\n console.warn(`Failed to load configuration: ${error.message}`);\n }\n\n const packageConfig = await this.loadFromPackageJson(startPath);\n if (packageConfig) {\n this.config = packageConfig;\n return this.config;\n }\n\n return null;\n }\n\n private async loadFromPackageJson(\n startPath?: string\n ): Promise<PluginConfig | null> {\n try {\n const packagePath = path.join(startPath || process.cwd(), 'package.json');\n const packageContent = await fs.readFile(packagePath, 'utf-8');\n const packageJson = JSON.parse(packageContent);\n\n // Check for json-to-office, json-to-docx, or json-to-pptx keys\n const config =\n packageJson['json-to-office'] ||\n packageJson['json-to-docx'] ||\n packageJson['json-to-pptx'];\n\n if (config) {\n this.configPath = packagePath;\n return config as PluginConfig;\n }\n } catch {}\n\n return null;\n }\n\n getConfig(): PluginConfig | null {\n return this.config;\n }\n\n getConfigPath(): string | null {\n return this.configPath;\n }\n\n mergeWithOptions(options: Partial<PluginConfig>): PluginConfig {\n const base = this.config || {};\n\n return {\n ...base,\n ...options,\n discovery: {\n ...base.discovery,\n ...options.discovery,\n },\n validation: {\n ...base.validation,\n ...options.validation,\n },\n plugins: this.mergeArrays(base.plugins, options.plugins),\n pluginDirs: this.mergeArrays(base.pluginDirs, options.pluginDirs),\n aliases: {\n ...base.aliases,\n ...options.aliases,\n },\n };\n }\n\n private mergeArrays(arr1?: string[], arr2?: string[]): string[] | undefined {\n if (!arr1 && !arr2) return undefined;\n if (!arr1) return arr2;\n if (!arr2) return arr1;\n return Array.from(new Set([...arr1, ...arr2]));\n }\n\n resolveAlias(name: string): string {\n if (this.config?.aliases && this.config.aliases[name]) {\n return this.config.aliases[name];\n }\n return name;\n }\n\n getConfiguredPlugins(): string[] {\n return this.config?.plugins || [];\n }\n\n getPluginDirectories(): string[] {\n const dirs = this.config?.pluginDirs || [];\n\n if (this.configPath) {\n const configDir = path.dirname(this.configPath);\n return dirs.map((dir) => {\n if (path.isAbsolute(dir)) return dir;\n return path.resolve(configDir, dir);\n });\n }\n\n return dirs.map((dir) => path.resolve(process.cwd(), dir));\n }\n\n isAutoDiscoverEnabled(): boolean {\n return this.config?.autoDiscover ?? false;\n }\n\n async saveConfig(config: PluginConfig, filePath?: string): Promise<void> {\n const targetPath =\n filePath ||\n this.configPath ||\n path.join(process.cwd(), '.json-to-office.config.json');\n\n const content = JSON.stringify(config, null, 2);\n await fs.writeFile(targetPath, content, 'utf-8');\n\n this.config = config;\n this.configPath = targetPath;\n }\n\n async createDefaultConfig(filePath?: string): Promise<void> {\n const defaultConfig: PluginConfig = {\n plugins: [],\n pluginDirs: ['./plugins', './custom-components'],\n autoDiscover: false,\n aliases: {},\n theme: 'minimal',\n discovery: {\n maxDepth: 5,\n includeNodeModules: false,\n },\n validation: {\n strict: false,\n allowUnknownFields: true,\n },\n };\n\n await this.saveConfig(defaultConfig, filePath);\n }\n\n clearConfig(): void {\n this.config = null;\n this.configPath = null;\n }\n}\n","import { existsSync } from 'fs';\nimport { readFile } from 'fs/promises';\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport { Config, ConfigSchema } from './schema.js';\nimport { Value } from '@sinclair/typebox/value';\nimport { defaultConfig } from './defaults.js';\n\nconst CONFIG_FILES = [\n 'json-to-office.config.ts',\n 'json-to-office.config.js',\n 'json-to-office.config.mjs',\n 'json-to-office.config.json',\n // Legacy support\n 'json-to-docx.config.ts',\n 'json-to-docx.config.js',\n 'json-to-docx.config.json',\n 'json-to-pptx.config.ts',\n 'json-to-pptx.config.js',\n 'json-to-pptx.config.json',\n];\n\nexport async function loadConfig(configPath?: string): Promise<Config> {\n let userConfig = {};\n\n const configFile = configPath || (await findConfigFile());\n\n if (configFile) {\n try {\n userConfig = await loadConfigFile(configFile);\n } catch (error: any) {\n console.warn(`Warning: Failed to load config file: ${error.message}`);\n }\n }\n\n const config = deepMerge(defaultConfig, userConfig);\n\n if (!Value.Check(ConfigSchema, config)) {\n const errors = [...Value.Errors(ConfigSchema, config)];\n console.warn('Warning: Invalid configuration detected:', errors);\n return defaultConfig;\n }\n\n return config as Config;\n}\n\nasync function findConfigFile(): Promise<string | null> {\n const cwd = process.cwd();\n\n for (const filename of CONFIG_FILES) {\n const filepath = resolve(cwd, filename);\n if (existsSync(filepath)) {\n return filepath;\n }\n }\n\n return null;\n}\n\nasync function loadConfigFile(filepath: string): Promise<any> {\n const ext = filepath.split('.').pop();\n\n if (ext === 'json') {\n const content = await readFile(filepath, 'utf-8');\n return JSON.parse(content);\n }\n\n const fileUrl = pathToFileURL(filepath).href;\n const module = await import(fileUrl);\n return module.default || module;\n}\n\nfunction deepMerge(target: any, source: any): any {\n const output = { ...target };\n\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach((key) => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] });\n } else {\n output[key] = deepMerge(target[key], source[key]);\n }\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n\n return output;\n}\n\nfunction isObject(item: any): boolean {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n","import { Type, Static } from '@sinclair/typebox';\n\nexport const ConfigSchema = Type.Object({\n mode: Type.Union([Type.Literal('development'), Type.Literal('production')], {\n default: 'development',\n }),\n\n server: Type.Object({\n port: Type.Number({ default: 3003, minimum: 0, maximum: 65535 }),\n host: Type.String({ default: 'localhost' }),\n cors: Type.Optional(\n Type.Object({\n origin: Type.Union([Type.String(), Type.Array(Type.String())]),\n credentials: Type.Boolean({ default: true }),\n })\n ),\n }),\n\n api: Type.Object({\n basePath: Type.String({ default: '/api' }),\n rateLimit: Type.Optional(\n Type.Object({\n windowMs: Type.Number({ default: 60000 }),\n max: Type.Number({ default: 100 }),\n })\n ),\n upload: Type.Object({\n maxFileSize: Type.Number({ default: 10 * 1024 * 1024 }),\n allowedMimeTypes: Type.Array(Type.String(), {\n default: ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml'],\n }),\n }),\n }),\n\n playground: Type.Object({\n enabled: Type.Boolean({ default: true }),\n root: Type.String({ default: '../../apps/web-react' }),\n features: Type.Object({\n livePreview: Type.Boolean({ default: true }),\n templateLibrary: Type.Boolean({ default: true }),\n componentBuilder: Type.Boolean({ default: false }),\n collaboration: Type.Boolean({ default: false }),\n }),\n }),\n\n development: Type.Object({\n hmr: Type.Boolean({ default: true }),\n hmrPort: Type.Optional(Type.Number()),\n sourceMap: Type.Boolean({ default: true }),\n verbose: Type.Boolean({ default: false }),\n }),\n\n paths: Type.Object({\n templates: Type.String({ default: './templates' }),\n modules: Type.String({ default: './modules' }),\n cache: Type.String({ default: './.cache' }),\n }),\n});\n\nexport type Config = Static<typeof ConfigSchema>;\n","import type { Config } from './schema.js';\n\nexport const defaultConfig: Config = {\n mode: 'development',\n\n server: {\n port: 3003,\n host: 'localhost',\n cors: {\n origin: '*',\n credentials: true,\n },\n },\n\n api: {\n basePath: '/api',\n upload: {\n maxFileSize: 10 * 1024 * 1024,\n allowedMimeTypes: [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n ],\n },\n },\n\n playground: {\n enabled: true,\n root: '../../apps/web-react',\n features: {\n livePreview: true,\n templateLibrary: true,\n componentBuilder: false,\n collaboration: false,\n },\n },\n\n development: {\n hmr: true,\n sourceMap: true,\n verbose: false,\n },\n\n paths: {\n templates: './templates',\n modules: './modules',\n cache: './.cache',\n },\n};\n"],"mappings":"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","names":["path","path","fs","path","fs","path","fs","fs","path","relative","path","fs","path","path","fs","fs","readFileSync","statSync","resolve","join","glob","fs","path","defaultConfig","existsSync","readFile","resolve","pathToFileURL","resolve","existsSync","readFile","pathToFileURL"]}
package/package.json ADDED
@@ -0,0 +1,147 @@
1
+ {
2
+ "name": "@json-to-office/jto",
3
+ "version": "0.1.0",
4
+ "description": "JSON to Office CLI - Unified document and presentation generation",
5
+ "type": "module",
6
+ "bin": {
7
+ "jto": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ },
16
+ "./dist/cli.js": "./dist/cli.js"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "templates",
21
+ "LICENSE"
22
+ ],
23
+ "dependencies": {
24
+ "@ai-sdk/react": "^3.0.118",
25
+ "@hono/node-server": "1.13.7",
26
+ "@monaco-editor/react": "4.7.0",
27
+ "@radix-ui/react-collapsible": "1.1.3",
28
+ "@radix-ui/react-context-menu": "2.2.6",
29
+ "@radix-ui/react-dialog": "1.1.6",
30
+ "@radix-ui/react-dropdown-menu": "2.1.6",
31
+ "@radix-ui/react-hover-card": "1.1.6",
32
+ "@radix-ui/react-label": "2.1.2",
33
+ "@radix-ui/react-menubar": "1.1.6",
34
+ "@radix-ui/react-progress": "1.1.7",
35
+ "@radix-ui/react-scroll-area": "1.2.3",
36
+ "@radix-ui/react-select": "2.1.6",
37
+ "@radix-ui/react-separator": "1.1.2",
38
+ "@radix-ui/react-slot": "1.1.2",
39
+ "@radix-ui/react-switch": "1.2.5",
40
+ "@radix-ui/react-tabs": "1.1.3",
41
+ "@radix-ui/react-tooltip": "1.1.8",
42
+ "@sinclair/typebox": "0.34.38",
43
+ "@tailwindcss/postcss": "4.1.11",
44
+ "@tanstack/react-query": "5.62.11",
45
+ "ai": "^6.0.116",
46
+ "ai-sdk-provider-claude-code": "^3.4.3",
47
+ "ajv": "8.12.0",
48
+ "ajv-formats": "2.1.1",
49
+ "axios": "1.7.9",
50
+ "boxen": "^8.0.1",
51
+ "chalk": "5.3.0",
52
+ "class-variance-authority": "0.7.1",
53
+ "cli-table3": "^0.6.5",
54
+ "clsx": "2.1.1",
55
+ "commander": "11.1.0",
56
+ "constrained-editor-plugin": "1.4.0",
57
+ "cosmiconfig": "9.0.0",
58
+ "docx-preview": "0.3.3",
59
+ "dotenv": "16.3.1",
60
+ "glob": "10.3.10",
61
+ "hono": "4.6.14",
62
+ "idb-keyval": "^6.2.2",
63
+ "jsonrepair": "^3.13.3",
64
+ "lodash.debounce": "4.0.8",
65
+ "lru-cache": "10.4.3",
66
+ "lucide-react": "0.468.0",
67
+ "mime-types": "2.1.35",
68
+ "monaco-editor": "0.52.2",
69
+ "ora": "8.0.1",
70
+ "postcss": "8.5.6",
71
+ "react": "19.2.4",
72
+ "react-dom": "19.2.4",
73
+ "react-hook-form": "7.54.2",
74
+ "react-markdown": "^10.1.0",
75
+ "react-resizable-panels": "2.1.7",
76
+ "react-router": "7.0.2",
77
+ "react-router-dom": "7.0.2",
78
+ "recharts": "2.15.0",
79
+ "rehype-raw": "^7.0.0",
80
+ "remark-gfm": "^4.0.1",
81
+ "tailwind-merge": "3.0.1",
82
+ "tailwindcss": "4.1.11",
83
+ "tailwindcss-animate": "1.0.7",
84
+ "tsx": "4.20.3",
85
+ "unpdf": "^1.4.0",
86
+ "vite": "6.0.5",
87
+ "zod": "^4.0.0",
88
+ "zustand": "5.0.2",
89
+ "@json-to-office/core-docx": "^0.1.0",
90
+ "@json-to-office/core-pptx": "^0.1.0",
91
+ "@json-to-office/shared": "^0.1.0",
92
+ "@json-to-office/shared-docx": "^0.1.0",
93
+ "@json-to-office/shared-pptx": "^0.1.0"
94
+ },
95
+ "devDependencies": {
96
+ "@types/lodash.debounce": "4.0.9",
97
+ "@types/mime-types": "2.1.4",
98
+ "@types/node": "20.11.0",
99
+ "@types/react": "19.2.14",
100
+ "@types/react-dom": "19.2.3",
101
+ "@vitejs/plugin-react": "4.3.4",
102
+ "prompts": "2.4.2",
103
+ "tsup": "8.5.0",
104
+ "typescript": "5.3.3"
105
+ },
106
+ "engines": {
107
+ "node": ">=20.0.0"
108
+ },
109
+ "author": "Paolo Barbato",
110
+ "license": "MIT",
111
+ "repository": {
112
+ "type": "git",
113
+ "url": "https://github.com/Wiseair-srl/json-to-office.git",
114
+ "directory": "packages/jto"
115
+ },
116
+ "homepage": "https://github.com/Wiseair-srl/json-to-office/tree/main/packages/jto",
117
+ "bugs": {
118
+ "url": "https://github.com/Wiseair-srl/json-to-office/issues"
119
+ },
120
+ "publishConfig": {
121
+ "access": "public"
122
+ },
123
+ "keywords": [
124
+ "json-to-office",
125
+ "typescript",
126
+ "cli",
127
+ "docx",
128
+ "pptx",
129
+ "document",
130
+ "presentation"
131
+ ],
132
+ "scripts": {
133
+ "build": "tsup && vite build --config src/client/vite.config.ts",
134
+ "build:server": "tsup",
135
+ "build:client": "vite build --config src/client/vite.config.ts",
136
+ "dev": "tsup --watch",
137
+ "clean": "rm -rf dist",
138
+ "lint": "eslint src",
139
+ "lint:fix": "eslint src --fix",
140
+ "typecheck": "tsc --noEmit",
141
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
142
+ "test": "vitest run --passWithNoTests",
143
+ "test:watch": "vitest",
144
+ "test:coverage": "vitest run --coverage --passWithNoTests",
145
+ "cli": "tsx src/cli.ts"
146
+ }
147
+ }