@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.
- package/LICENSE +18 -0
- package/README.md +23 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +5639 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/assets/HomePage-CGK1cPFp.js +99 -0
- package/dist/client/assets/HomePage-CGK1cPFp.js.map +1 -0
- package/dist/client/assets/JsonEditorPage-DKaFqYpM.js +3 -0
- package/dist/client/assets/JsonEditorPage-DKaFqYpM.js.map +1 -0
- package/dist/client/assets/NotFoundPage-Et1QhbQw.js +2 -0
- package/dist/client/assets/NotFoundPage-Et1QhbQw.js.map +1 -0
- package/dist/client/assets/button-B5W5GwSc.js +2 -0
- package/dist/client/assets/button-B5W5GwSc.js.map +1 -0
- package/dist/client/assets/docx-preview-CUjVWdSJ.js +34 -0
- package/dist/client/assets/docx-preview-CUjVWdSJ.js.map +1 -0
- package/dist/client/assets/editor-CH_tiHyn.js +9 -0
- package/dist/client/assets/editor-CH_tiHyn.js.map +1 -0
- package/dist/client/assets/editor-monaco-json-8I2epq6g.js +6 -0
- package/dist/client/assets/editor-monaco-json-8I2epq6g.js.map +1 -0
- package/dist/client/assets/index-B9dV-vCI.css +1 -0
- package/dist/client/assets/index-DactvF4v.js +3 -0
- package/dist/client/assets/index-DactvF4v.js.map +1 -0
- package/dist/client/assets/monaco-editor-DzeBDgmk.js +12 -0
- package/dist/client/assets/monaco-editor-DzeBDgmk.js.map +1 -0
- package/dist/client/assets/preview-CJlTPgks.js +3 -0
- package/dist/client/assets/preview-CJlTPgks.js.map +1 -0
- package/dist/client/assets/query-vendor-UL64zsGL.js +15 -0
- package/dist/client/assets/query-vendor-UL64zsGL.js.map +1 -0
- package/dist/client/assets/radix-ui-CXavUarI.js +2 -0
- package/dist/client/assets/radix-ui-CXavUarI.js.map +1 -0
- package/dist/client/assets/react-vendor-DhdcN9D5.js +102 -0
- package/dist/client/assets/react-vendor-DhdcN9D5.js.map +1 -0
- package/dist/client/assets/settings-store-provider-DuCKtwqs.js +2 -0
- package/dist/client/assets/settings-store-provider-DuCKtwqs.js.map +1 -0
- package/dist/client/assets/state-vendor-CAMVKh-F.js +6 -0
- package/dist/client/assets/state-vendor-CAMVKh-F.js.map +1 -0
- package/dist/client/assets/ui-vendor-C6DsfOoA.js +247 -0
- package/dist/client/assets/ui-vendor-C6DsfOoA.js.map +1 -0
- package/dist/client/css/preview/docxjs.css +11 -0
- package/dist/client/icon.svg +5 -0
- package/dist/client/index.html +23 -0
- package/dist/client/templates/Charts Demo.pptx.json +174 -0
- package/dist/client/templates/Company Branding.pptx.json +143 -0
- package/dist/client/templates/Dashboard.pptx.json +91 -0
- package/dist/client/templates/Product Launch.pptx.json +87 -0
- package/dist/client/templates/Sales Deck.pptx.json +80 -0
- package/dist/client/templates/Wiseair.pptx.json +5382 -0
- package/dist/client/templates/themes/corporate.pptx.theme.json +32 -0
- package/dist/client/templates/themes/minimal.pptx.theme.json +32 -0
- package/dist/client/templates/themes/vibrant.pptx.theme.json +32 -0
- package/dist/index.d.ts +387 -0
- package/dist/index.js +2303 -0
- package/dist/index.js.map +1 -0
- package/package.json +147 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.6_tsx@4.20.3_typescript@5.3.3_yaml@2.8.3/node_modules/tsup/assets/esm_shims.js","../src/services/plugin-loader.ts","../src/services/file-scanner.ts","../src/services/plugin-metadata.ts","../src/utils/project-root.ts","../src/services/plugin-discovery.ts","../src/services/cache-events.ts","../src/services/plugin-registry.ts","../src/server/config/index.ts","../src/server/config/api-info.ts","../src/server/utils/logger.ts","../src/server/services/generator.ts","../src/server/services/cache.ts","../src/server/services/libreoffice-converter.ts","../src/server/container/index.ts","../src/server/routes/health.ts","../src/server/schemas/loose.ts","../src/server/lib/typebox-validator.ts","../src/server/middleware/hono/rate-limit.ts","../src/server/routes/format.ts","../src/server/routes/discovery.ts","../src/server/services/ai-schema.ts","../src/server/services/prompt-loader.ts","../src/server/routes/ai.ts","../src/server/middleware/hono/request-id.ts","../src/server/middleware/hono/auth.ts","../src/server/middleware/hono/error-handler.ts","../src/server/middleware/hono/security.ts","../src/server/middleware/hono/error-recovery.ts","../src/server/middleware/hono/request-logger.ts","../src/server/app.ts","../src/server/unified-server.ts","../src/cli.ts","../src/format-adapter.ts","../src/commands/generate.ts","../src/services/generator-factory.ts","../src/config/plugin-config.ts","../src/commands/shared.ts","../src/services/plugin-resolver.ts","../src/commands/ui.ts","../src/commands/validate.ts","../src/services/json-validator.ts","../src/commands/schemas.ts","../src/services/schema-generator.ts","../src/services/typebox-exporter.ts","../src/commands/discover.ts","../src/services/plugin-display.ts","../src/commands/init.ts","../src/commands/dev.ts","../src/config/loader.ts","../src/config/schema.ts","../src/config/defaults.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\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 { 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 * 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 { 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 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 dotenv from 'dotenv';\n\ndotenv.config();\n\nfunction parseEnv(env: NodeJS.ProcessEnv) {\n return {\n NODE_ENV: (env.NODE_ENV || 'development') as 'development' | 'production' | 'test',\n PORT: parseInt(env.PORT || '3003', 10),\n CORS_ORIGIN: env.CORS_ORIGIN || '*',\n API_KEY: env.API_KEY,\n API_KEY_HEADER: env.API_KEY_HEADER || 'x-api-key',\n RATE_LIMIT_WINDOW_MS: parseInt(env.RATE_LIMIT_WINDOW_MS || '900000', 10),\n RATE_LIMIT_MAX: parseInt(env.RATE_LIMIT_MAX || '100', 10),\n MAX_FILE_SIZE: parseInt(env.MAX_FILE_SIZE || '10485760', 10),\n UPLOAD_DIR: env.UPLOAD_DIR || 'uploads',\n LIBREOFFICE_PATH: env.LIBREOFFICE_PATH,\n LIBREOFFICE_TIMEOUT_MS: env.LIBREOFFICE_TIMEOUT_MS\n ? parseInt(env.LIBREOFFICE_TIMEOUT_MS, 10)\n : 30000,\n LOG_LEVEL: (env.LOG_LEVEL || 'info') as 'error' | 'warn' | 'info' | 'debug',\n CACHE_ENABLED: env.CACHE_ENABLED !== 'false',\n CACHE_MAX_SIZE_MB: parseInt(env.CACHE_MAX_SIZE_MB || '100', 10),\n CACHE_TTL_SECONDS: parseInt(env.CACHE_TTL_SECONDS || '3600', 10),\n CACHE_MAX_ITEMS: parseInt(env.CACHE_MAX_ITEMS || '1000', 10),\n };\n}\n\nconst parsedEnv = parseEnv(process.env);\n\nexport const config = {\n ...parsedEnv,\n\n isDevelopment: parsedEnv.NODE_ENV === 'development',\n isProduction: parsedEnv.NODE_ENV === 'production',\n isTest: parsedEnv.NODE_ENV === 'test',\n\n features: {\n apiKey: Boolean(parsedEnv.API_KEY),\n cache: parsedEnv.CACHE_ENABLED,\n },\n\n cors: {\n origin:\n parsedEnv.CORS_ORIGIN === '*'\n ? parsedEnv.CORS_ORIGIN\n : parsedEnv.CORS_ORIGIN.split(',').map((o) => o.trim()),\n credentials: true,\n },\n\n rateLimit: {\n windowMs: parsedEnv.RATE_LIMIT_WINDOW_MS,\n max: parsedEnv.RATE_LIMIT_MAX,\n },\n\n cache: {\n enabled: parsedEnv.CACHE_ENABLED,\n maxSizeMB: parsedEnv.CACHE_MAX_SIZE_MB,\n ttlSeconds: parsedEnv.CACHE_TTL_SECONDS,\n maxItems: parsedEnv.CACHE_MAX_ITEMS,\n },\n} as const;\n\nexport type ServerConfig = typeof config;\n","import { config } from './index.js';\n\nexport async function getApiInfo() {\n return {\n name: 'JSON to Office API',\n version: '1.0.0',\n description: 'Generate DOCX and PPTX documents from JSON definitions',\n environment: config.NODE_ENV,\n endpoints: {\n health: '/health',\n api: '/api',\n generate: '/api/{format}/generate',\n validate: '/api/{format}/validate',\n discovery: '/api/discovery',\n },\n };\n}\n","import { config } from '../config/index.js';\n\ntype LogLevel = 'error' | 'warn' | 'info' | 'debug';\n\ninterface LogContext {\n [key: string]: unknown;\n}\n\nclass Logger {\n private level: LogLevel;\n\n constructor(level: LogLevel = 'info') {\n this.level = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['error', 'warn', 'info', 'debug'];\n return levels.indexOf(level) <= levels.indexOf(this.level);\n }\n\n private formatMessage(level: LogLevel, message: string, context?: LogContext): string {\n const timestamp = new Date().toISOString();\n const contextStr = context\n ? ` ${JSON.stringify(context, this.errorReplacer)}`\n : '';\n return `[${timestamp}] [${level.toUpperCase()}] ${message}${contextStr}`;\n }\n\n private errorReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n return value;\n }\n\n private log(level: LogLevel, message: string, context?: LogContext): void {\n if (!this.shouldLog(level)) return;\n const formatted = this.formatMessage(level, message, context);\n switch (level) {\n case 'error': console.error(formatted); break;\n case 'warn': console.warn(formatted); break;\n case 'info': console.info(formatted); break;\n case 'debug': console.debug(formatted); break;\n }\n }\n\n error(message: string, context?: LogContext): void { this.log('error', message, context); }\n warn(message: string, context?: LogContext): void { this.log('warn', message, context); }\n info(message: string, context?: LogContext): void { this.log('info', message, context); }\n debug(message: string, context?: LogContext): void { this.log('debug', message, context); }\n}\n\nexport const logger = new Logger(config.LOG_LEVEL);\n","import type { FormatAdapter } from '../../format-adapter.js';\nimport { CacheService } from './cache.js';\nimport { logger } from '../utils/logger.js';\nimport { cacheEvents } from '../../services/cache-events.js';\n\nexport class GeneratorService {\n private adapter: FormatAdapter;\n private cacheService: CacheService;\n private cacheInvalidationHandler: (() => void) | null = null;\n\n constructor(adapter: FormatAdapter, cacheService: CacheService) {\n this.adapter = adapter;\n this.cacheService = cacheService;\n\n this.cacheInvalidationHandler = () => this.cacheService.clear();\n cacheEvents.on('generator:invalidate', this.cacheInvalidationHandler);\n }\n\n async generate(request: {\n jsonDefinition: any;\n customThemes?: Record<string, any>;\n options?: Record<string, unknown>;\n }): Promise<{\n filename: string;\n fileId?: string;\n buffer: Buffer;\n cached?: boolean;\n warnings?: any[] | null;\n }> {\n const { jsonDefinition, customThemes, options } = request;\n const config =\n typeof jsonDefinition === 'string'\n ? JSON.parse(jsonDefinition)\n : jsonDefinition;\n\n const bypassCache = options?.bypassCache === true;\n const cacheKeyData = { config, customThemes: customThemes && Object.keys(customThemes).length > 0 ? customThemes : null };\n const cacheKey = this.cacheService.generateCacheKey(cacheKeyData);\n const hasDynamicContent = this.cacheService.hasDynamicContent(config);\n\n // Try cache\n if (!bypassCache && !hasDynamicContent) {\n const cachedBuffer = this.cacheService.get(cacheKey);\n if (cachedBuffer) {\n logger.info('Served from cache', { title: config.metadata?.title });\n return {\n filename: `${config.metadata?.title || this.adapter.label}${this.adapter.extension}`,\n fileId: Date.now().toString(),\n buffer: cachedBuffer,\n cached: true,\n warnings: null,\n };\n }\n }\n\n // Generate\n logger.info(`Generating ${this.adapter.label}`, { title: config.metadata?.title });\n const buffer = await this.adapter.generateBuffer(config, { customThemes });\n\n // Store in cache\n this.cacheService.set(cacheKey, buffer, config, {\n bypassCache: bypassCache || hasDynamicContent,\n });\n\n return {\n filename: `${config.metadata?.title || this.adapter.label}${this.adapter.extension}`,\n fileId: Date.now().toString(),\n buffer,\n cached: false,\n warnings: null,\n };\n }\n\n async validate(jsonDefinition: any): Promise<{ valid: boolean; errors?: string[] }> {\n const config =\n typeof jsonDefinition === 'string'\n ? JSON.parse(jsonDefinition)\n : jsonDefinition;\n\n return this.adapter.validateDocument(config);\n }\n\n destroy(): void {\n if (this.cacheInvalidationHandler) {\n cacheEvents.off('generator:invalidate', this.cacheInvalidationHandler);\n this.cacheInvalidationHandler = null;\n }\n this.cacheService.clear();\n }\n}\n","import { LRUCache } from 'lru-cache';\nimport crypto from 'crypto';\nimport { logger } from '../utils/logger.js';\nimport { config } from '../config/index.js';\nimport { cacheEvents } from '../../services/cache-events.js';\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n evictions: number;\n size: number;\n itemCount: number;\n}\n\nexport class CacheService {\n private cache: LRUCache<string, Buffer>;\n private stats: CacheStats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n size: 0,\n itemCount: 0,\n };\n private cacheInvalidationHandler: (() => void) | null = null;\n\n constructor() {\n const maxSizeBytes = config.cache.maxSizeMB * 1024 * 1024;\n\n this.cache = new LRUCache<string, Buffer>({\n max: config.cache.maxItems,\n maxSize: maxSizeBytes,\n sizeCalculation: (value: Buffer) => value.length,\n ttl: config.cache.ttlSeconds * 1000,\n dispose: (_value: Buffer, _key: string, reason: LRUCache.DisposeReason) => {\n if (reason === 'evict' || reason === 'delete') {\n this.stats.evictions++;\n }\n },\n updateAgeOnGet: true,\n updateAgeOnHas: false,\n });\n\n this.cacheInvalidationHandler = () => this.clear();\n cacheEvents.on('cache:invalidate', this.cacheInvalidationHandler);\n }\n\n generateCacheKey(data: unknown): string {\n const normalized = JSON.stringify(data, this.sortKeysReplacer);\n return crypto.createHash('sha256').update(normalized).digest('hex');\n }\n\n private sortKeysReplacer(_key: string, value: unknown): unknown {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return Object.keys(value)\n .sort()\n .reduce((sorted: Record<string, unknown>, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n }, {});\n }\n return value;\n }\n\n hasDynamicContent(data: unknown): boolean {\n const str = JSON.stringify(data);\n const patterns = [\n /\\{\\{now\\}\\}/i, /\\{\\{date\\}\\}/i, /\\{\\{time\\}\\}/i,\n /\\{\\{timestamp\\}\\}/i, /\\{\\{random\\}\\}/i, /\\{\\{uuid\\}\\}/i,\n ];\n return patterns.some((p) => p.test(str));\n }\n\n get(key: string): Buffer | null {\n if (!config.features.cache) return null;\n const value = this.cache.get(key);\n if (value) {\n this.stats.hits++;\n this.updateStats();\n return value;\n }\n this.stats.misses++;\n return null;\n }\n\n set(key: string, value: Buffer, documentConfig: unknown, options?: { bypassCache?: boolean }): void {\n if (!config.features.cache || options?.bypassCache || this.hasDynamicContent(documentConfig)) return;\n this.cache.set(key, value);\n this.updateStats();\n }\n\n clear(): void {\n this.cache.clear();\n this.stats = { hits: 0, misses: 0, evictions: 0, size: 0, itemCount: 0 };\n logger.info('Cache cleared');\n }\n\n getStats(): CacheStats & { enabled: boolean; hitRate: number } {\n const total = this.stats.hits + this.stats.misses;\n return {\n ...this.stats,\n enabled: config.features.cache,\n hitRate: total > 0 ? Math.round((this.stats.hits / total) * 100) / 100 : 0,\n };\n }\n\n private updateStats(): void {\n this.stats.size = this.cache.calculatedSize || 0;\n this.stats.itemCount = this.cache.size;\n }\n\n destroy(): void {\n if (this.cacheInvalidationHandler) {\n cacheEvents.off('cache:invalidate', this.cacheInvalidationHandler);\n this.cacheInvalidationHandler = null;\n }\n }\n}\n","import { execFile } from 'node:child_process';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { config } from '../config/index.js';\n\nconst DEFAULT_CONVERSION_TIMEOUT_MS = 30000;\nconst BINARY_PROBE_TIMEOUT_MS = 5000;\nconst MAX_EXEC_BUFFER_BYTES = 20 * 1024 * 1024;\n\ntype ExecError = NodeJS.ErrnoException & { stdout?: string | Buffer; stderr?: string | Buffer };\n\nfunction executeFile(binary: string, args: string[], timeoutMs: number): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n execFile(binary, args, { timeout: timeoutMs, maxBuffer: MAX_EXEC_BUFFER_BYTES, windowsHide: true }, (error, stdout, stderr) => {\n if (error) {\n const execError = error as ExecError;\n execError.stdout = stdout;\n execError.stderr = stderr;\n reject(execError);\n return;\n }\n resolve({ stdout: stdout ?? '', stderr: stderr ?? '' });\n });\n });\n}\n\nfunction toErrorText(value: unknown): string {\n if (!value) return '';\n if (Buffer.isBuffer(value)) return value.toString('utf8');\n if (typeof value === 'string') return value;\n return String(value);\n}\n\nfunction sanitizeBaseName(originalName?: string): string {\n const parsed = path.parse(originalName || 'document');\n return (parsed.name || 'document').replace(/[^a-zA-Z0-9._-]/g, '_') || 'document';\n}\n\nexport class LibreOfficeError extends Error {\n readonly code: 'BINARY_NOT_FOUND' | 'CONVERSION_TIMEOUT' | 'CONVERSION_FAILED' | 'OUTPUT_NOT_FOUND';\n constructor(code: LibreOfficeError['code'], message: string) {\n super(message);\n this.name = 'LibreOfficeError';\n this.code = code;\n }\n}\n\nexport class LibreOfficeBinaryNotFoundError extends LibreOfficeError {\n readonly candidates: string[];\n constructor(candidates: string[]) {\n super('BINARY_NOT_FOUND', 'LibreOffice binary not found. Install LibreOffice locally or set LIBREOFFICE_PATH.');\n this.name = 'LibreOfficeBinaryNotFoundError';\n this.candidates = candidates;\n }\n}\n\nexport class LibreOfficeTimeoutError extends LibreOfficeError {\n readonly timeoutMs: number;\n constructor(timeoutMs: number) {\n super('CONVERSION_TIMEOUT', `LibreOffice conversion timed out after ${timeoutMs}ms`);\n this.name = 'LibreOfficeTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n\nexport class LibreOfficeConversionError extends LibreOfficeError {\n readonly details?: string;\n constructor(message: string, details?: string) {\n super('CONVERSION_FAILED', message);\n this.name = 'LibreOfficeConversionError';\n this.details = details;\n }\n}\n\nexport class LibreOfficeOutputNotFoundError extends LibreOfficeError {\n readonly outputPath: string;\n constructor(outputPath: string) {\n super('OUTPUT_NOT_FOUND', 'LibreOffice conversion completed but PDF output was not produced');\n this.name = 'LibreOfficeOutputNotFoundError';\n this.outputPath = outputPath;\n }\n}\n\nexport class LibreOfficeConverterService {\n private readonly timeoutMs: number;\n private readonly format: 'docx' | 'pptx';\n\n constructor(format: 'docx' | 'pptx', timeoutMs?: number) {\n this.format = format;\n this.timeoutMs = timeoutMs || config.LIBREOFFICE_TIMEOUT_MS || DEFAULT_CONVERSION_TIMEOUT_MS;\n }\n\n async convertToPdf(input: Buffer, originalName: string = 'document'): Promise<Buffer> {\n if (!input || input.length === 0) {\n throw new LibreOfficeConversionError('Input file is empty');\n }\n\n const binaryPath = await this.resolveBinaryPath();\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'jto-libreoffice-'));\n const outputBaseName = sanitizeBaseName(originalName);\n const ext = this.format === 'pptx' ? '.pptx' : '.docx';\n const inputPath = path.join(tempDir, `${outputBaseName}${ext}`);\n const pdfPath = path.join(tempDir, `${outputBaseName}.pdf`);\n\n try {\n await fs.writeFile(inputPath, input);\n\n const filterName = this.format === 'pptx' ? 'impress_pdf_Export' : 'writer_pdf_Export';\n await this.runConversion(binaryPath, inputPath, tempDir, filterName);\n\n try {\n return await fs.readFile(pdfPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new LibreOfficeOutputNotFoundError(pdfPath);\n }\n throw error;\n }\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n }\n\n private getBinaryCandidates(): string[] {\n const candidates: string[] = [];\n const configured = config.LIBREOFFICE_PATH?.trim();\n if (configured) candidates.push(configured);\n if (process.platform === 'darwin') {\n candidates.push('/Applications/LibreOffice.app/Contents/MacOS/soffice');\n }\n candidates.push('soffice', 'libreoffice');\n return [...new Set(candidates)];\n }\n\n private async resolveBinaryPath(): Promise<string> {\n const candidates = this.getBinaryCandidates();\n for (const candidate of candidates) {\n if (await this.isBinaryAvailable(candidate)) return candidate;\n }\n throw new LibreOfficeBinaryNotFoundError(candidates);\n }\n\n private async isBinaryAvailable(binaryPath: string): Promise<boolean> {\n if (binaryPath.includes(path.sep)) {\n try { await fs.access(binaryPath); } catch { return false; }\n }\n try {\n await executeFile(binaryPath, ['--version'], BINARY_PROBE_TIMEOUT_MS);\n return true;\n } catch (error) {\n const code = (error as ExecError).code;\n return code !== 'ENOENT' && code !== 'EACCES';\n }\n }\n\n private async runConversion(binaryPath: string, inputPath: string, outputDir: string, filterName: string): Promise<void> {\n const userProfilePath = path.join(outputDir, 'user-profile').replace(/\\\\/g, '/');\n const userInstallation = `file:///${userProfilePath.replace(/^\\//, '')}`;\n const args = [\n '--headless', '--norestore', '--nolockcheck', '--nodefault',\n `-env:UserInstallation=${userInstallation}`,\n '--convert-to', `pdf:${filterName}`,\n '--outdir', outputDir, inputPath,\n ];\n\n try {\n await executeFile(binaryPath, args, this.timeoutMs);\n } catch (error) {\n const execError = error as ExecError;\n if (execError.code === 'ETIMEDOUT') throw new LibreOfficeTimeoutError(this.timeoutMs);\n if (execError.code === 'ENOENT') throw new LibreOfficeBinaryNotFoundError(this.getBinaryCandidates());\n const details = [toErrorText(execError.stderr), toErrorText(execError.stdout)].filter(Boolean).join('\\n').trim();\n throw new LibreOfficeConversionError('LibreOffice failed to convert to PDF', details || execError.message);\n }\n }\n}\n","import type { FormatAdapter } from '../../format-adapter.js';\nimport { GeneratorService } from '../services/generator.js';\nimport { CacheService } from '../services/cache.js';\nimport { LibreOfficeConverterService } from '../services/libreoffice-converter.js';\n\ntype ServiceMap = {\n generatorService: GeneratorService;\n cacheService: CacheService;\n libreOfficeConverterService: LibreOfficeConverterService;\n};\n\nexport class Container {\n private static instance: Container;\n private services: Map<keyof ServiceMap, ServiceMap[keyof ServiceMap]> = new Map();\n private adapter: FormatAdapter;\n\n private constructor(adapter: FormatAdapter) {\n this.adapter = adapter;\n const cacheService = new CacheService();\n const generatorService = new GeneratorService(adapter, cacheService);\n const libreOfficeConverterService = new LibreOfficeConverterService(adapter.name as 'docx' | 'pptx');\n\n this.services.set('cacheService', cacheService);\n this.services.set('generatorService', generatorService);\n this.services.set('libreOfficeConverterService', libreOfficeConverterService);\n }\n\n public static initialize(adapter: FormatAdapter): Container {\n Container.instance = new Container(adapter);\n return Container.instance;\n }\n\n public static getInstance(): Container {\n if (!Container.instance) {\n throw new Error('Container not initialized. Call Container.initialize(adapter) first.');\n }\n return Container.instance;\n }\n\n public static getAdapter(): FormatAdapter {\n return Container.getInstance().adapter;\n }\n\n public get<K extends keyof ServiceMap>(serviceName: K): ServiceMap[K] {\n const service = this.services.get(serviceName);\n if (!service) {\n throw new Error(`Service ${serviceName} not found`);\n }\n return service as ServiceMap[K];\n }\n}\n\nexport const getContainer = () => Container.getInstance();\n","import { Hono } from 'hono';\nimport { config } from '../config/index.js';\nimport { getContainer } from '../container/index.js';\nimport { AppEnv } from '../types/hono.js';\n\nexport const healthRouter = new Hono<AppEnv>();\n\nhealthRouter.get('/', (c) => {\n const memoryUsage = process.memoryUsage();\n const uptime = process.uptime();\n\n let cacheStats: any;\n try {\n const cacheService = getContainer().get('cacheService');\n cacheStats = cacheService.getStats();\n } catch {\n cacheStats = { enabled: false, hits: 0, misses: 0, hitRate: 0, evictions: 0, size: 0, itemCount: 0 };\n }\n\n return c.json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n environment: config.NODE_ENV,\n version: '1.0.0',\n framework: 'Hono',\n uptime: Math.floor(uptime),\n memory: {\n rss: `${Math.round(memoryUsage.rss / 1024 / 1024)} MB`,\n heapTotal: `${Math.round(memoryUsage.heapTotal / 1024 / 1024)} MB`,\n heapUsed: `${Math.round(memoryUsage.heapUsed / 1024 / 1024)} MB`,\n },\n cache: {\n enabled: cacheStats.enabled,\n hits: cacheStats.hits,\n misses: cacheStats.misses,\n hitRate: `${(cacheStats.hitRate * 100).toFixed(1)}%`,\n itemCount: cacheStats.itemCount,\n },\n });\n});\n\nhealthRouter.get('/ready', (c) => c.json({ status: 'ready' }));\nhealthRouter.get('/live', (c) => c.json({ status: 'alive' }));\n","/**\n * Loose schemas for initial request validation before plugin-aware validation.\n * These schemas allow unknown types that will be validated by plugin-aware validators.\n */\n\nimport { Type } from '@sinclair/typebox';\n\n/**\n * Loose presentation generation request schema that allows plugin module types.\n * The strict validation is performed later with plugin-aware validators.\n */\nexport const LooseDocumentGenerationRequestSchema = Type.Object(\n {\n jsonDefinition: Type.Union([\n Type.String(), // Allow JSON string\n Type.Object({}, { additionalProperties: true }), // Allow any object\n ]),\n customThemes: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n options: Type.Optional(Type.Object({}, { additionalProperties: true })),\n },\n { additionalProperties: true }\n);\n\n/**\n * Loose document validation request schema that allows plugin module types.\n */\nexport const LooseDocumentValidationRequestSchema = Type.Object(\n {\n jsonDefinition: Type.Union([\n Type.String(), // Allow JSON string\n Type.Object({}, { additionalProperties: true }), // Allow any object\n ]),\n },\n { additionalProperties: true }\n);\n","import { TSchema } from '@sinclair/typebox';\nimport { Value } from '@sinclair/typebox/value';\nimport { Context, Env, ValidationTargets, MiddlewareHandler } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\nexport function tbValidator<\n T extends TSchema,\n E extends Env = Env,\n P extends string = string,\n>(schema: T) {\n return (async (c: Context<E, P>, next: () => Promise<void>) => {\n let value: unknown;\n\n try {\n value = await c.req.json();\n } catch {\n throw new HTTPException(400, {\n message: 'Invalid JSON in request body',\n });\n }\n\n const isValid = Value.Check(schema, value);\n\n if (isValid) {\n (c.req as { validatedData?: Record<string, unknown> }).validatedData = {\n json: value,\n };\n await next();\n } else {\n const errors = [...Value.Errors(schema, value)].map((error) => ({\n path: error.path,\n message: error.message,\n value: error.value,\n }));\n\n const errorMessages = errors.map((e) => e.message);\n\n throw new HTTPException(400, {\n message:\n errorMessages.length === 1\n ? errorMessages[0]\n : `Validation failed:\\n${errorMessages.join('\\n')}`,\n cause: { errors },\n });\n }\n }) as MiddlewareHandler<E, P, Record<string, unknown>>;\n}\n\nexport function getValidated<T>(\n c: Context,\n target: keyof ValidationTargets\n): T {\n const validatedData = (c.req as { validatedData?: Record<string, unknown> })\n .validatedData;\n if (!validatedData || !validatedData[target]) {\n throw new Error(`No validated data found for target: ${target}`);\n }\n return validatedData[target] as T;\n}\n","import { MiddlewareHandler } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\ninterface RateLimitOptions {\n limit: number;\n window: number; // milliseconds\n keyGenerator?: (c: any) => string;\n}\n\n// In-memory store for rate limiting (use Redis in production)\nconst rateLimitStore = new Map<string, { count: number; resetTime: number }>();\n\n/**\n * Rate limiting middleware for Hono\n */\nexport const rateLimiter = (options: RateLimitOptions): MiddlewareHandler => {\n const { limit, window, keyGenerator } = options;\n\n return async (c, next) => {\n const key = keyGenerator\n ? keyGenerator(c)\n : c.req.header('X-Real-IP') || c.req.header('X-Forwarded-For')?.split(',').pop()?.trim() || 'anonymous';\n const now = Date.now();\n\n // Clean up expired entries\n for (const [k, v] of rateLimitStore.entries()) {\n if (v.resetTime < now) {\n rateLimitStore.delete(k);\n }\n }\n\n const record = rateLimitStore.get(key);\n\n if (!record) {\n // First request\n rateLimitStore.set(key, {\n count: 1,\n resetTime: now + window,\n });\n } else if (record.resetTime < now) {\n // Window expired, reset\n record.count = 1;\n record.resetTime = now + window;\n } else if (record.count >= limit) {\n // Rate limit exceeded\n const retryAfter = Math.ceil((record.resetTime - now) / 1000);\n\n c.header('X-RateLimit-Limit', String(limit));\n c.header('X-RateLimit-Remaining', '0');\n c.header('X-RateLimit-Reset', String(record.resetTime));\n c.header('Retry-After', String(retryAfter));\n\n throw new HTTPException(429, {\n message: 'Too many requests, please try again later',\n });\n } else {\n // Increment count\n record.count++;\n }\n\n // Add rate limit headers\n const currentRecord = rateLimitStore.get(key)!;\n c.header('X-RateLimit-Limit', String(limit));\n c.header(\n 'X-RateLimit-Remaining',\n String(Math.max(0, limit - currentRecord.count))\n );\n c.header('X-RateLimit-Reset', String(currentRecord.resetTime));\n\n await next();\n };\n};\n","import { Hono } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\nimport { getContainer } from '../container/index.js';\nimport { LooseDocumentGenerationRequestSchema, LooseDocumentValidationRequestSchema } from '../schemas/loose.js';\nimport { tbValidator, getValidated } from '../lib/typebox-validator.js';\nimport { logger } from '../utils/logger.js';\nimport { rateLimiter } from '../middleware/hono/rate-limit.js';\nimport { AppEnv } from '../types/hono.js';\nimport type { FormatAdapter } from '../../format-adapter.js';\nimport { PluginRegistry } from '../../services/plugin-registry.js';\nimport {\n LibreOfficeBinaryNotFoundError,\n LibreOfficeConversionError,\n LibreOfficeOutputNotFoundError,\n LibreOfficeTimeoutError,\n} from '../services/libreoffice-converter.js';\n\nexport function createFormatRouter(adapter: FormatAdapter) {\n const router = new Hono<AppEnv>();\n\n const contentTypeMw = async (c: any, next: () => Promise<void>) => {\n const contentType = c.req.header('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n throw new HTTPException(400, { message: 'Content-Type must be application/json' });\n }\n await next();\n };\n\n // POST /generate\n router.post(\n '/generate',\n rateLimiter({\n limit: process.env.NODE_ENV === 'production' ? 10 : 1000,\n window: 15 * 60 * 1000,\n keyGenerator: (c) => c.req.header('X-Real-IP') || c.req.header('X-Forwarded-For')?.split(',').pop()?.trim() || 'anonymous',\n }),\n contentTypeMw,\n tbValidator(LooseDocumentGenerationRequestSchema),\n async (c) => {\n const generatorService = getContainer().get('generatorService');\n const { jsonDefinition, customThemes, options } = getValidated<{\n jsonDefinition: any;\n customThemes?: Record<string, any>;\n options?: { bypassCache?: boolean; returnUrl?: boolean };\n }>(c, 'json');\n const requestId = c.get('requestId');\n\n try {\n const bypassCache =\n c.req.header('X-Bypass-Cache') === 'true' ||\n c.req.query('bypass-cache') === 'true' ||\n options?.bypassCache === true;\n\n const result = await generatorService.generate({\n jsonDefinition,\n customThemes,\n options: { ...options, bypassCache },\n });\n\n const cacheService = getContainer().get('cacheService');\n const cacheStats = cacheService.getStats();\n\n const contentType = adapter.name === 'pptx'\n ? 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n\n return c.json({\n success: true,\n data: {\n document: result.buffer.toString('base64'),\n filename: result.filename,\n fileId: result.fileId || null,\n contentType,\n },\n cache: {\n status: result.cached ? 'HIT' : 'MISS',\n hitRate: `${(cacheStats.hitRate * 100).toFixed(1)}%`,\n },\n warnings: result.warnings || [],\n meta: { timestamp: new Date().toISOString(), requestId },\n });\n } catch (error) {\n logger.error(`${adapter.label} generation failed`, { error, requestId });\n\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n if (msg.includes('invalid') || msg.includes('validation') || msg.includes('missing required')) {\n throw new HTTPException(400, { message: error.message });\n }\n }\n if (error instanceof HTTPException) throw error;\n throw new HTTPException(500, {\n message: `Internal server error during ${adapter.label} generation`,\n });\n }\n }\n );\n\n // POST /validate\n router.post(\n '/validate',\n contentTypeMw,\n tbValidator(LooseDocumentValidationRequestSchema),\n async (c) => {\n const generatorService = getContainer().get('generatorService');\n const { jsonDefinition } = getValidated<{ jsonDefinition: any }>(c, 'json');\n const requestId = c.get('requestId');\n\n try {\n const result = await generatorService.validate(jsonDefinition);\n return c.json({\n success: result.valid,\n data: result,\n meta: { timestamp: new Date().toISOString(), requestId },\n });\n } catch (error) {\n logger.error('Validation failed', { error, requestId });\n throw error;\n }\n }\n );\n\n // POST /preview/libreoffice\n router.post(\n '/preview/libreoffice',\n rateLimiter({\n limit: process.env.NODE_ENV === 'production' ? 20 : 1000,\n window: 15 * 60 * 1000,\n keyGenerator: (c) => c.req.header('X-Real-IP') || c.req.header('X-Forwarded-For')?.split(',').pop()?.trim() || 'anonymous',\n }),\n async (c) => {\n const requestId = c.get('requestId');\n const libreOfficeService = getContainer().get('libreOfficeConverterService');\n\n try {\n const body = await c.req.parseBody();\n const file = body.file;\n\n if (!file || typeof file === 'string') {\n throw new HTTPException(400, { message: `No ${adapter.name.toUpperCase()} file provided` });\n }\n if ((file as File).size === 0) {\n throw new HTTPException(400, { message: `${adapter.name.toUpperCase()} file is empty` });\n }\n\n const arrayBuffer = await (file as File).arrayBuffer();\n const inputBuffer = Buffer.from(arrayBuffer);\n const pdfBuffer = await libreOfficeService.convertToPdf(inputBuffer, (file as File).name);\n\n const pdfName = ((file as File).name || 'preview').replace(/\\.[^.]+$/i, '') + '.pdf';\n c.header('Content-Type', 'application/pdf');\n c.header('Content-Disposition', `inline; filename=\"${pdfName}\"`);\n c.header('Content-Length', String(pdfBuffer.length));\n\n return c.body(pdfBuffer);\n } catch (error) {\n logger.error('LibreOffice preview conversion failed', { error, requestId });\n if (error instanceof HTTPException) throw error;\n if (error instanceof LibreOfficeBinaryNotFoundError) {\n throw new HTTPException(503, {\n message: 'LibreOffice is not available. Install LibreOffice or set LIBREOFFICE_PATH.',\n });\n }\n if (error instanceof LibreOfficeTimeoutError || error instanceof LibreOfficeConversionError || error instanceof LibreOfficeOutputNotFoundError) {\n throw new HTTPException(500, { message: 'LibreOffice preview conversion failed.' });\n }\n throw new HTTPException(500, { message: 'Internal server error during preview conversion' });\n }\n }\n );\n\n // POST /standard-components\n router.post(\n '/standard-components',\n contentTypeMw,\n tbValidator(LooseDocumentGenerationRequestSchema),\n async (c) => {\n const { jsonDefinition, customThemes } = getValidated<{\n jsonDefinition: any;\n customThemes?: Record<string, any>;\n }>(c, 'json');\n const requestId = c.get('requestId');\n\n try {\n const config =\n typeof jsonDefinition === 'string'\n ? JSON.parse(jsonDefinition)\n : jsonDefinition;\n\n // If plugins are loaded, use plugin-aware generator to resolve custom components\n const registry = PluginRegistry.getInstance();\n if (registry.hasPlugins()) {\n const plugins = registry.getPlugins();\n const generatorResult = await adapter.createGenerator(plugins, {\n theme: customThemes ? Object.values(customThemes)[0] : undefined,\n });\n\n if (generatorResult.getStandardComponentsDefinition) {\n const standardComponents =\n await generatorResult.getStandardComponentsDefinition(config);\n return c.json({\n success: true,\n data: standardComponents,\n meta: { timestamp: new Date().toISOString(), requestId },\n });\n }\n }\n\n // No plugins — config is already standard components\n return c.json({\n success: true,\n data: config,\n meta: { timestamp: new Date().toISOString(), requestId },\n });\n } catch (error) {\n logger.error('Failed to get standard components definition', { error, requestId });\n if (error instanceof HTTPException) throw error;\n throw new HTTPException(500, { message: 'Failed to get standard components definition' });\n }\n }\n );\n\n // GET /cache-stats\n router.get('/cache-stats', async (c) => {\n try {\n const cacheService = getContainer().get('cacheService');\n const stats = cacheService.getStats();\n const components = (await adapter.getComponentCacheStats?.()) ?? null;\n return c.json({\n success: true,\n data: {\n document: {\n hits: stats.hits,\n misses: stats.misses,\n hitRate: stats.hitRate,\n size: stats.size,\n itemCount: stats.itemCount,\n enabled: stats.enabled,\n },\n ...(components ? { components } : {}),\n },\n meta: { timestamp: new Date().toISOString() },\n });\n } catch (error) {\n logger.error('Failed to get cache statistics', { error });\n throw new HTTPException(500, { message: 'Failed to get cache statistics' });\n }\n });\n\n // GET /cache-analytics\n router.get('/cache-analytics', async (c) => {\n try {\n const analytics = await adapter.getComponentCacheAnalytics?.();\n if (!analytics) {\n return c.json({ success: true, data: null, meta: { timestamp: new Date().toISOString() } });\n }\n return c.json({\n success: true,\n data: analytics,\n meta: { timestamp: new Date().toISOString() },\n });\n } catch (error) {\n logger.error('Failed to get cache analytics', { error });\n throw new HTTPException(500, { message: 'Failed to get cache analytics' });\n }\n });\n\n // DELETE /cache\n router.delete('/cache', async (c) => {\n try {\n const cacheService = getContainer().get('cacheService');\n cacheService.clear();\n const { invalidateAllCaches } = await import('../../services/cache-events.js');\n invalidateAllCaches();\n return c.json({\n success: true,\n data: { message: 'Cache cleared successfully' },\n meta: { timestamp: new Date().toISOString() },\n });\n } catch (error) {\n logger.error('Failed to clear cache', { error });\n throw new HTTPException(500, { message: 'Failed to clear cache' });\n }\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { PluginDiscoveryService } from '../../services/plugin-discovery.js';\nimport { PluginRegistry } from '../../services/plugin-registry.js';\nimport { logger } from '../utils/logger.js';\nimport { AppEnv } from '../types/hono.js';\nimport { Container } from '../container/index.js';\n\nexport const discoveryRouter = new Hono<AppEnv>();\n\n// ---------------------------------------------------------------------------\n// Schema generation helpers (mirrors client-side json-schema-generator.ts)\n// ---------------------------------------------------------------------------\n\nfunction cleanupTypeBoxIds(schema: any): void {\n if (typeof schema !== 'object' || schema === null) return;\n if (schema.$id && /^T\\d+$/.test(schema.$id)) delete schema.$id;\n if (schema.$ref && /^T\\d+$/.test(schema.$ref)) schema.$ref = '#/definitions/ComponentDefinition';\n if (Array.isArray(schema)) { schema.forEach(cleanupTypeBoxIds); return; }\n Object.keys(schema).forEach((key) => {\n if (typeof schema[key] === 'object' && schema[key] !== null) cleanupTypeBoxIds(schema[key]);\n });\n}\n\nasync function generateDocumentSchema(format: string): Promise<any> {\n if (format === 'docx') {\n const shared = await import('@json-to-office/shared-docx');\n const unified = shared.generateUnifiedDocumentSchema({ customComponents: [] });\n return shared.convertToJsonSchema(unified, {\n $schema: 'https://json-schema.org/draft-07/schema#',\n $id: 'https://json-to-office.dev/schema/document/v1.0.0',\n title: 'JSON to DOCX Document Definition',\n description: 'Schema for JSON to DOCX JSON document definitions',\n });\n } else {\n const shared = await import('@json-to-office/shared-pptx');\n const unified = shared.generateUnifiedDocumentSchema({ customComponents: [] });\n return shared.convertToJsonSchema(unified, {\n $schema: 'https://json-schema.org/draft-07/schema#',\n $id: 'https://json-to-office.dev/schema/presentation/v1.0.0',\n title: 'JSON to PPTX Presentation Definition',\n description: 'Schema for JSON to PPTX JSON presentation definitions',\n });\n }\n}\n\nasync function generateThemeSchema(format: string): Promise<any> {\n let source: any;\n let label: string;\n if (format === 'docx') {\n const shared = await import('@json-to-office/shared-docx');\n source = shared.ThemeConfigSchema;\n label = 'DOCX';\n } else {\n const shared = await import('@json-to-office/shared-pptx');\n source = shared.ThemeConfigSchema;\n label = 'PPTX';\n }\n const schema = JSON.parse(JSON.stringify(source));\n cleanupTypeBoxIds(schema);\n return {\n ...schema,\n $schema: 'https://json-schema.org/draft-07/schema#',\n $id: 'https://json-to-office.dev/schemas/theme/v1.0.0',\n title: `JSON to ${label} Theme`,\n description: `Theme definition for JSON to ${label} ${format === 'docx' ? 'documents' : 'presentations'}`,\n };\n}\n\ndiscoveryRouter.get('/all', async (c) => {\n try {\n const format = Container.getAdapter().name as 'docx' | 'pptx';\n const discovery = new PluginDiscoveryService({\n maxDepth: 10,\n includeNodeModules: false,\n verbose: false,\n });\n const [plugins, documents, themes] = await Promise.all([\n discovery.discoverPlugins(),\n discovery.discoverDocuments(format),\n discovery.discoverThemes(format),\n ]);\n const results = { plugins, documents, themes };\n return c.json({\n success: true,\n data: results,\n counts: {\n plugins: results.plugins.length,\n documents: results.documents.length,\n themes: results.themes.length,\n },\n });\n } catch (error: any) {\n logger.error('Discovery failed', { error: error.message });\n return c.json({ success: false, error: error.message }, 500);\n }\n});\n\ndiscoveryRouter.get('/plugins', async (c) => {\n try {\n const includeSchemas = c.req.query('schemas') === 'true';\n const includeExamples = c.req.query('examples') === 'true';\n const discovery = new PluginDiscoveryService({\n maxDepth: 10,\n includeNodeModules: false,\n verbose: false,\n });\n const plugins = await discovery.discoverPlugins();\n const processed = plugins.map((plugin) => {\n const result: any = { ...plugin };\n if (!includeSchemas && result.schema) {\n delete result.schema.raw;\n delete result.schema.jsonSchema;\n }\n if (!includeExamples) delete result.examples;\n return result;\n });\n return c.json({ success: true, data: processed, count: plugins.length });\n } catch (error: any) {\n logger.error('Plugin discovery failed', { error: error.message });\n return c.json({ success: false, error: error.message }, 500);\n }\n});\n\ndiscoveryRouter.get('/documents', async (c) => {\n try {\n const format = Container.getAdapter().name as 'docx' | 'pptx';\n const discovery = new PluginDiscoveryService({\n maxDepth: 10,\n includeNodeModules: false,\n verbose: false,\n });\n const documents = await discovery.discoverDocuments(format);\n return c.json({ success: true, data: documents, count: documents.length });\n } catch (error: any) {\n logger.error('Document discovery failed', { error: error.message });\n return c.json({ success: false, error: error.message }, 500);\n }\n});\n\ndiscoveryRouter.get('/themes', async (c) => {\n try {\n const format = Container.getAdapter().name as 'docx' | 'pptx';\n const discovery = new PluginDiscoveryService({\n maxDepth: 10,\n includeNodeModules: false,\n verbose: false,\n });\n const themes = await discovery.discoverThemes(format);\n return c.json({ success: true, data: themes, count: themes.length });\n } catch (error: any) {\n logger.error('Theme discovery failed', { error: error.message });\n return c.json({ success: false, error: error.message }, 500);\n }\n});\n\ndiscoveryRouter.get('/plugin/:name', async (c) => {\n try {\n const pluginName = c.req.param('name');\n const discovery = new PluginDiscoveryService({\n maxDepth: 10,\n includeNodeModules: false,\n verbose: false,\n });\n const plugins = await discovery.discoverPlugins();\n const plugin = plugins.find((p) => p.name === pluginName);\n if (!plugin) return c.json({ success: false, error: `Plugin '${pluginName}' not found` }, 404);\n return c.json({ success: true, data: plugin });\n } catch (error: any) {\n return c.json({ success: false, error: error.message }, 500);\n }\n});\n\ndiscoveryRouter.post('/load-plugins', async (c) => {\n // Require API key for plugin loading regardless of global auth setting\n const apiKey = c.req.header('X-API-Key') || c.req.header('Authorization');\n if (!apiKey && process.env.NODE_ENV === 'production') {\n return c.json({ success: false, error: 'Authentication required' }, 401);\n }\n\n try {\n const registry = PluginRegistry.getInstance();\n const result = await registry.discoverAndLoad();\n return c.json({ success: true, data: result });\n } catch (error: any) {\n return c.json({ success: false, error: error.message }, 500);\n }\n});\n\ndiscoveryRouter.get('/documents/:name/content', async (c) => {\n try {\n const name = c.req.param('name');\n const format = Container.getAdapter().name as 'docx' | 'pptx';\n const discovery = new PluginDiscoveryService({\n maxDepth: 10,\n includeNodeModules: false,\n verbose: false,\n });\n const content = await discovery.getDocumentContent(name, format);\n return c.text(content);\n } catch (error: any) {\n const status = error.message.includes('not found') ? 404 : 500;\n return c.json({ success: false, error: error.message }, status);\n }\n});\n\ndiscoveryRouter.get('/themes/:name/content', async (c) => {\n try {\n const name = c.req.param('name');\n const format = Container.getAdapter().name as 'docx' | 'pptx';\n const discovery = new PluginDiscoveryService({\n maxDepth: 10,\n includeNodeModules: false,\n verbose: false,\n });\n const content = await discovery.getThemeContent(name, format);\n return c.text(content);\n } catch (error: any) {\n const status = error.message.includes('not found') ? 404 : 500;\n return c.json({ success: false, error: error.message }, status);\n }\n});\n\ndiscoveryRouter.get('/schemas/document', async (c) => {\n try {\n const adapter = Container.getAdapter();\n const schema = await generateDocumentSchema(adapter.name);\n return c.json({ success: true, data: schema });\n } catch (error: any) {\n logger.error('Document schema generation failed', { error: error.message });\n return c.json({ success: false, error: error.message }, 500);\n }\n});\n\ndiscoveryRouter.get('/schemas/theme', async (c) => {\n try {\n const adapter = Container.getAdapter();\n const schema = await generateThemeSchema(adapter.name);\n return c.json({ success: true, data: schema });\n } catch (error: any) {\n logger.error('Theme schema generation failed', { error: error.message });\n return c.json({ success: false, error: error.message }, 500);\n }\n});\n","/**\n * Builds and caches the full JSON schema per format for AI structured output.\n */\nimport { Container } from '../container/index.js';\n\nconst schemaCache = new Map<string, any>();\n\nfunction cleanupTypeBoxIds(schema: any): void {\n if (typeof schema !== 'object' || schema === null) return;\n if (schema.$id && /^T\\d+$/.test(schema.$id)) delete schema.$id;\n if (schema.$ref && /^T\\d+$/.test(schema.$ref))\n schema.$ref = '#/definitions/ComponentDefinition';\n if (Array.isArray(schema)) {\n schema.forEach(cleanupTypeBoxIds);\n return;\n }\n Object.keys(schema).forEach((key) => {\n if (typeof schema[key] === 'object' && schema[key] !== null)\n cleanupTypeBoxIds(schema[key]);\n });\n}\n\nexport async function getDocumentSchema(format: string): Promise<any> {\n const cacheKey = `${format}:document`;\n if (schemaCache.has(cacheKey)) return schemaCache.get(cacheKey);\n\n let schema: any;\n if (format === 'docx') {\n const shared = await import('@json-to-office/shared-docx');\n const unified = shared.generateUnifiedDocumentSchema({\n customComponents: [],\n });\n schema = shared.convertToJsonSchema(unified, {\n title: 'JSON to DOCX Document',\n description: 'Schema for JSON to DOCX document definitions',\n });\n } else {\n const shared = await import('@json-to-office/shared-pptx');\n const unified = shared.generateUnifiedDocumentSchema({\n customComponents: [],\n });\n schema = shared.convertToJsonSchema(unified, {\n title: 'JSON to PPTX Presentation',\n description: 'Schema for JSON to PPTX presentation definitions',\n });\n }\n\n // Remove $schema URI — not needed for AI context\n delete schema.$schema;\n delete schema.$id;\n cleanupTypeBoxIds(schema);\n\n schemaCache.set(cacheKey, schema);\n return schema;\n}\n\nexport async function getThemeSchema(format: string): Promise<any> {\n const cacheKey = `${format}:theme`;\n if (schemaCache.has(cacheKey)) return schemaCache.get(cacheKey);\n\n let schema: any;\n if (format === 'docx') {\n const shared = await import('@json-to-office/shared-docx');\n schema = shared.convertToJsonSchema(shared.ThemeConfigSchema, {\n title: 'JSON to DOCX Theme',\n description: 'Schema for DOCX theme configuration',\n });\n } else {\n const shared = await import('@json-to-office/shared-pptx');\n schema = shared.convertToJsonSchema(shared.ThemeConfigSchema, {\n title: 'JSON to PPTX Theme',\n description: 'Schema for PPTX theme configuration',\n });\n }\n\n delete schema.$schema;\n delete schema.$id;\n cleanupTypeBoxIds(schema);\n\n schemaCache.set(cacheKey, schema);\n return schema;\n}\n\nexport async function getSchemaString(format: string, docType: 'document' | 'theme'): Promise<string> {\n const schema = docType === 'theme'\n ? await getThemeSchema(format)\n : await getDocumentSchema(format);\n return JSON.stringify(schema, null, 2);\n}\n\nexport function getDocumentSchemaString(format: string): Promise<string> {\n return getSchemaString(format, 'document');\n}\n\nexport function getFormatFromContainer(): string {\n return Container.getAdapter().name;\n}\n","/**\n * Reads .md prompt files from the prompts/ directory and interpolates {{var}} placeholders.\n */\nimport { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// In dev (tsx): __dirname = src/server/services → ../prompts\n// In prod (tsup): __dirname = dist → look for prompts in src/server/prompts (fallback)\nfunction resolvePromptsDir(): string {\n const candidates = [\n join(__dirname, '..', 'prompts'), // dev: src/server/prompts\n join(__dirname, 'prompts'), // bundled: dist/prompts\n join(__dirname, '..', 'src', 'server', 'prompts'), // prod from dist/\n ];\n for (const dir of candidates) {\n if (existsSync(dir)) return dir;\n }\n return candidates[0]; // fallback — will error on read if missing\n}\n\nconst PROMPTS_DIR = resolvePromptsDir();\n\nconst cache = new Map<string, string>();\n\nfunction readPromptFile(name: string): string {\n if (cache.has(name)) return cache.get(name)!;\n const filePath = join(PROMPTS_DIR, name);\n const content = readFileSync(filePath, 'utf-8');\n cache.set(name, content);\n return content;\n}\n\nexport function loadPrompt(\n name: string,\n vars: Record<string, string> = {}\n): string {\n let content = readPromptFile(name);\n for (const [key, value] of Object.entries(vars)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n return content;\n}\n","import { Hono } from 'hono';\nimport { streamText, convertToModelMessages, type ModelMessage } from 'ai';\nimport { claudeCode } from 'ai-sdk-provider-claude-code';\nimport { extractText as extractPdfText } from 'unpdf';\nimport { AppEnv } from '../types/hono.js';\nimport {\n getSchemaString,\n getFormatFromContainer,\n} from '../services/ai-schema.js';\nimport { loadPrompt } from '../services/prompt-loader.js';\nimport { logger } from '../utils/logger.js';\nimport { rateLimiter } from '../middleware/hono/rate-limit.js';\n\nfunction sanitizeFilename(name: string): string {\n return name.replace(/[[\\]\\n\\r]/g, '_');\n}\n\n/**\n * Convert data: URL file parts to inline base64 so providers that\n * reject data: URLs (e.g. claude-code) can consume them.\n */\nfunction fixDataUrlFileParts(messages: ModelMessage[]): ModelMessage[] {\n for (const msg of messages) {\n if (msg.role !== 'user' || typeof msg.content === 'string') continue;\n for (const part of msg.content) {\n if (part.type !== 'file') continue;\n const data = part.data;\n if (data instanceof URL && data.protocol === 'data:') {\n const str = data.toString();\n const commaIdx = str.indexOf(',');\n if (commaIdx !== -1) {\n const isBase64 = str.slice(0, commaIdx).includes(';base64');\n const payload = str.slice(commaIdx + 1);\n const decoded = Buffer.from(\n decodeURIComponent(payload),\n 'utf-8'\n ).toString('base64');\n part.data = isBase64 ? payload : decoded;\n }\n } else if (typeof data === 'string' && data.startsWith('data:')) {\n const commaIdx = data.indexOf(',');\n if (commaIdx !== -1) {\n const isBase64 = data.slice(0, commaIdx).includes(';base64');\n const payload = data.slice(commaIdx + 1);\n const decoded = Buffer.from(\n decodeURIComponent(payload),\n 'utf-8'\n ).toString('base64');\n part.data = isBase64 ? payload : decoded;\n }\n }\n }\n }\n return messages;\n}\n\nconst TEXT_MIME_TYPES = new Set([\n 'text/plain',\n 'text/markdown',\n 'text/csv',\n 'text/html',\n]);\n\nfunction toBuffer(data: string | Uint8Array | ArrayBuffer | URL): Buffer {\n if (data instanceof ArrayBuffer) return Buffer.from(new Uint8Array(data));\n if (data instanceof Uint8Array) return Buffer.from(data);\n if (data instanceof URL) {\n const str = data.toString();\n const commaIdx = str.indexOf(',');\n if (commaIdx === -1) return Buffer.from(str, 'base64');\n const isBase64 = str.slice(0, commaIdx).includes(';base64');\n const payload = str.slice(commaIdx + 1);\n return isBase64\n ? Buffer.from(payload, 'base64')\n : Buffer.from(decodeURIComponent(payload), 'utf-8');\n }\n // base64 string (or raw data: string already stripped by fixDataUrlFileParts)\n return Buffer.from(data, 'base64');\n}\n\nasync function extractFileText(\n mimeType: string,\n data: string | Uint8Array | ArrayBuffer | URL\n): Promise<string> {\n const buf = toBuffer(data);\n if (mimeType === 'application/pdf') {\n const { text } = await extractPdfText(new Uint8Array(buf));\n return Array.isArray(text) ? text.join('\\n') : String(text);\n }\n // text/* types\n return buf.toString('utf-8');\n}\n\nasync function extractNonImageFileParts(\n messages: ModelMessage[]\n): Promise<ModelMessage[]> {\n for (const msg of messages) {\n if (msg.role !== 'user' || typeof msg.content === 'string') continue;\n const newContent: typeof msg.content = [];\n for (const part of msg.content) {\n if (part.type !== 'file') {\n newContent.push(part);\n continue;\n }\n const mime = part.mediaType ?? '';\n // Images pass through — the provider handles them\n if (mime.startsWith('image/')) {\n newContent.push(part);\n continue;\n }\n // Non-image file: extract text\n if (mime === 'application/pdf' || TEXT_MIME_TYPES.has(mime)) {\n const filename = sanitizeFilename((part as any).filename || 'file');\n try {\n const text = await extractFileText(mime, part.data);\n newContent.push({\n type: 'text' as const,\n text: `[Attached file: ${filename}]\\n${text}`,\n });\n } catch (err: any) {\n logger.warn('Failed to extract file content', {\n filename,\n mime,\n error: err.message,\n });\n newContent.push({\n type: 'text' as const,\n text: `[Attached file: ${filename} — could not extract content]`,\n });\n }\n } else {\n // Unknown MIME — mention it but don't crash\n const filename = sanitizeFilename((part as any).filename || 'file');\n newContent.push({\n type: 'text' as const,\n text: `[Attached file: ${filename} — unsupported format: ${mime}]`,\n });\n }\n }\n msg.content = newContent;\n }\n return messages;\n}\n\nexport function createAiRouter() {\n const router = new Hono<AppEnv>();\n\n router.post(\n '/chat',\n rateLimiter({\n limit: process.env.NODE_ENV === 'production' ? 30 : 1000,\n window: 15 * 60 * 1000,\n keyGenerator: (c) =>\n c.req.header('X-Real-IP') ||\n c.req.header('X-Forwarded-For')?.split(',').pop()?.trim() ||\n 'anonymous',\n }),\n async (c) => {\n try {\n const body = await c.req.json();\n const {\n messages,\n context,\n format: clientFormat,\n activeDocument,\n documentType,\n scope,\n model: requestedModel,\n } = body;\n const VALID_MODELS = ['opus', 'sonnet', 'haiku'] as const;\n const model = VALID_MODELS.includes(requestedModel)\n ? requestedModel\n : 'opus';\n\n const format = clientFormat || getFormatFromContainer();\n const isTheme = documentType === 'application/json+theme';\n const schemaStr = await getSchemaString(\n format,\n isTheme ? 'theme' : 'document'\n );\n const contentLabel = isTheme ? 'Theme' : 'Document';\n\n // === Prompt assembly: base → format → format+design → mode ===\n\n // Layer 1: Base\n let systemPrompt = loadPrompt(\n isTheme ? 'system-theme.md' : 'system.md',\n {\n format,\n schema: schemaStr,\n }\n );\n\n // Layer 2: Format-specific core (always loaded)\n if (!isTheme) {\n if (format === 'pptx') {\n systemPrompt += '\\n\\n' + loadPrompt('pptx-core.md');\n } else if (format === 'docx') {\n systemPrompt += '\\n\\n' + loadPrompt('instructions-docx.md');\n }\n }\n\n // Determine mode: selection-edit, edit-document, or generate\n const hasSelection =\n context && context.length > 0 && context[0]?.selectedText;\n const hasActiveDoc = !hasSelection && activeDocument?.text;\n const isGenerate = !hasSelection && !hasActiveDoc;\n\n // Layer 3: Format+design (generate and edit-document only, not selection-edit)\n if (!isTheme && format === 'pptx' && !hasSelection) {\n systemPrompt += '\\n\\n' + loadPrompt('pptx-design.md');\n }\n\n // Layer 4: Mode-specific instructions\n if (hasSelection) {\n const ctx = context[0];\n // Use pptx-aware selection editing for pptx, generic for others\n const editFile =\n format === 'pptx' && !isTheme\n ? 'instructions-edit-pptx.md'\n : 'instructions-edit.md';\n systemPrompt +=\n '\\n\\n' +\n loadPrompt(editFile, {\n documentName: ctx.documentName || 'unknown',\n jsonPath: ctx.jsonPath || '',\n selectedText: ctx.selectedText,\n });\n } else if (hasActiveDoc) {\n const pptxScope =\n format === 'pptx' &&\n !isTheme &&\n (scope === 'slides' || scope === 'templates');\n\n let parsedDoc: any = null;\n if (pptxScope) {\n try {\n parsedDoc = JSON.parse(activeDocument.text);\n } catch {\n /* fall through to global */\n }\n }\n\n if (pptxScope && parsedDoc) {\n const doc = parsedDoc;\n\n if (scope === 'slides') {\n const templatesSummary = (doc.props?.templates || [])\n .map((m: any) => {\n const phs = (m.placeholders || [])\n .map((p: any) => {\n const d = p.defaults\n ? ` → defaults: ${JSON.stringify(p.defaults)}`\n : '';\n return ` - \\`${p.name}\\`${d}`;\n })\n .join('\\n');\n return `**${m.name}**\\n${phs}`;\n })\n .join('\\n\\n');\n const slidesText = JSON.stringify(doc.children || [], null, 2);\n systemPrompt +=\n '\\n\\n' +\n loadPrompt('instructions-edit-document-pptx-slides.md', {\n documentName: activeDocument.name || 'untitled',\n templatesSummary,\n slidesText,\n });\n } else {\n const templatesText = JSON.stringify(\n doc.props?.templates || [],\n null,\n 2\n );\n const slidesSummary = (doc.children || [])\n .map((s: any, i: number) => {\n const template = s.props?.template || '(none)';\n const phs = Object.keys(s.props?.placeholders || {}).join(\n ', '\n );\n return ` ${i}: template=${template}, placeholders=[${phs}]`;\n })\n .join('\\n');\n systemPrompt +=\n '\\n\\n' +\n loadPrompt('instructions-edit-document-pptx-templates.md', {\n documentName: activeDocument.name || 'untitled',\n templatesText,\n slidesSummary,\n });\n }\n } else {\n const editDocFiles: Record<string, string> = {\n pptx: 'instructions-edit-document-pptx.md',\n docx: 'instructions-edit-document-docx.md',\n };\n const editDocFile = isTheme\n ? 'instructions-edit-document.md'\n : editDocFiles[format] ?? 'instructions-edit-document.md';\n systemPrompt +=\n '\\n\\n' +\n loadPrompt(editDocFile, {\n contentLabel,\n contentLabelLower: contentLabel.toLowerCase(),\n documentName: activeDocument.name || 'untitled',\n documentText: activeDocument.text,\n });\n }\n } else if (isGenerate) {\n const generateFiles: Record<string, string> = {\n pptx: 'instructions-generate-pptx.md',\n docx: 'instructions-generate-docx.md',\n };\n const generateFile = isTheme\n ? 'instructions-generate.md'\n : generateFiles[format] ?? 'instructions-generate.md';\n systemPrompt +=\n '\\n\\n' +\n loadPrompt(generateFile, {\n contentType: isTheme ? 'theme' : 'document',\n });\n }\n\n // If context is provided (selection from editor), prepend as a user message\n const allMessages = [...messages];\n if (context && context.length > 0) {\n const contextParts = context.map((ctx: any) => {\n const parts: string[] = [];\n if (ctx.documentName) parts.push(`Document: ${ctx.documentName}`);\n if (ctx.jsonPath) parts.push(`JSON Path: ${ctx.jsonPath}`);\n if (ctx.selectedText)\n parts.push(`Selected:\\n\\`\\`\\`json\\n${ctx.selectedText}\\n\\`\\`\\``);\n return parts.join('\\n');\n });\n\n // Insert context as a system-style user message before the last user message\n const lastMsg = allMessages[allMessages.length - 1];\n if (lastMsg && lastMsg.role === 'user') {\n const contextPrefix = `[Editor Context]\\n${contextParts.join('\\n---\\n')}\\n\\n`;\n // Prepend context to the last user message text\n if (typeof lastMsg.content === 'string') {\n lastMsg.content = contextPrefix + lastMsg.content;\n } else if (Array.isArray(lastMsg.parts)) {\n lastMsg.parts = [\n { type: 'text', text: contextPrefix },\n ...lastMsg.parts,\n ];\n }\n }\n }\n\n const modelMessages = await extractNonImageFileParts(\n fixDataUrlFileParts(await convertToModelMessages(allMessages))\n );\n\n const result = streamText({\n model: claudeCode(model, { streamingInput: 'always' }),\n system: systemPrompt,\n messages: modelMessages,\n });\n\n return result.toUIMessageStreamResponse();\n } catch (error: any) {\n const message = error.message || 'Unknown error';\n const status = error.status || error.statusCode || 500;\n\n if (status === 429 || message.includes('rate')) {\n logger.warn('AI rate limit hit', { error: message });\n return c.json(\n {\n error:\n 'Rate limit exceeded. Please wait before sending another message.',\n },\n 429\n );\n }\n if (\n status === 413 ||\n message.includes('too large') ||\n message.includes('too long')\n ) {\n logger.warn('AI request too large', { error: message });\n return c.json(\n {\n error:\n 'Request too large for the AI model. Try selecting a smaller portion of the document.',\n },\n 413\n );\n }\n if (error.name === 'AbortError' || message.includes('abort')) {\n logger.info('AI request aborted');\n return c.json({ error: 'Request was cancelled.' }, 400);\n }\n\n logger.error('AI chat error', { error: message, stack: error.stack });\n return c.json(\n {\n error:\n process.env.NODE_ENV === 'production'\n ? 'Something went wrong. Please try again.'\n : message,\n },\n 500\n );\n }\n }\n );\n\n return router;\n}\n","import { MiddlewareHandler } from 'hono';\nimport { randomUUID } from 'crypto';\n\n/**\n * Request ID middleware for Hono\n * Generates a unique ID for each request for tracing\n */\nexport const requestIdMiddleware: MiddlewareHandler = async (c, next) => {\n const requestId = c.req.header('X-Request-Id') || randomUUID();\n\n // Set request ID in context\n c.set('requestId', requestId);\n\n // Add to response headers\n c.header('X-Request-Id', requestId);\n\n await next();\n};\n","import { MiddlewareHandler } from 'hono';\nimport { config } from '../../config';\n\n/**\n * API Key authentication middleware for Hono\n */\nexport const apiKeyAuthMiddleware: MiddlewareHandler = async (c, next) => {\n // Skip auth if not configured\n if (!config.features.apiKey || !config.API_KEY) {\n return next();\n }\n\n const apiKey = c.req.header(config.API_KEY_HEADER);\n\n if (!apiKey) {\n return c.json(\n {\n success: false,\n error: 'API key required',\n code: 'UNAUTHORIZED',\n },\n 401\n );\n }\n\n if (apiKey !== config.API_KEY) {\n return c.json(\n {\n success: false,\n error: 'Invalid API key',\n code: 'UNAUTHORIZED',\n },\n 401\n );\n }\n\n await next();\n};\n","import { ErrorHandler } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\nimport { logger } from '../../utils/logger';\nimport { config } from '../../config';\n\n/**\n * Global error handler for Hono\n */\nexport const errorHandler: ErrorHandler = (err, c) => {\n const requestId = c.get('requestId') || 'unknown';\n\n // Handle Hono HTTPException\n if (err instanceof HTTPException) {\n return c.json(\n {\n success: false,\n error: err.message,\n code: err.status >= 500 ? 'INTERNAL_ERROR' : 'CLIENT_ERROR',\n requestId,\n },\n err.status\n );\n }\n\n // Log unexpected errors\n logger.error('Unhandled error', {\n error: err.message,\n stack: err.stack,\n requestId,\n path: c.req.path,\n method: c.req.method,\n });\n\n // Handle validation errors (TypeBox format)\n if (err.name === 'ValidationError' && 'errors' in err) {\n return c.json(\n {\n success: false,\n error: 'Validation failed',\n errors: (err as any).errors,\n code: 'VALIDATION_ERROR',\n requestId,\n },\n 400\n );\n }\n\n // Default error response\n return c.json(\n {\n success: false,\n error: config.isDevelopment ? err.message : 'Internal server error',\n code: 'INTERNAL_ERROR',\n requestId,\n },\n 500\n );\n};\n","import { MiddlewareHandler } from 'hono';\n\n/**\n * Security middleware for Hono\n * Adds additional security headers and input sanitization\n */\nexport const securityMiddleware: MiddlewareHandler = async (c, next) => {\n // Add security headers\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('X-Frame-Options', 'DENY');\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n c.header('Permissions-Policy', 'geolocation=(), microphone=(), camera=()');\n\n // Remove sensitive headers\n c.header('X-Powered-By', '');\n\n await next();\n};\n","import { MiddlewareHandler } from 'hono';\n// import { HTTPException } from 'hono/http-exception';\nimport { logger } from '../../utils/logger';\n\n/**\n * Error recovery middleware for Hono\n * Handles specific error types with appropriate recovery strategies\n */\nexport const errorRecoveryMiddleware: MiddlewareHandler = async (c, next) => {\n try {\n await next();\n } catch (err: any) {\n const requestId = c.get('requestId') || 'unknown';\n\n logger.error('Error recovery triggered', {\n error: err.message,\n name: err.name,\n path: c.req.path,\n method: c.req.method,\n requestId,\n });\n\n // Handle payload too large errors\n if (err.name === 'PayloadTooLargeError' || err.status === 413) {\n return c.json(\n {\n success: false,\n error: 'Payload too large',\n message: 'The request body exceeds the maximum allowed size',\n code: 'PAYLOAD_TOO_LARGE',\n requestId,\n },\n 413\n );\n }\n\n // Handle JSON syntax errors\n if (\n (err.name === 'SyntaxError' && err.message.includes('JSON')) ||\n (err.status === 400 && err.message.includes('JSON'))\n ) {\n return c.json(\n {\n success: false,\n error: 'Invalid JSON',\n message: 'The request body contains invalid JSON',\n code: 'INVALID_JSON',\n requestId,\n },\n 400\n );\n }\n\n // Handle timeout errors\n if (err.name === 'TimeoutError' || err.code === 'ETIMEDOUT') {\n return c.json(\n {\n success: false,\n error: 'Request timeout',\n message: 'The request took too long to process',\n code: 'TIMEOUT',\n requestId,\n },\n 408\n );\n }\n\n // Re-throw the error to be handled by the global error handler\n throw err;\n }\n};\n","import { MiddlewareHandler } from 'hono';\nimport { logger } from '../../utils/logger';\n\n/**\n * Request logger middleware for Hono\n * Logs incoming requests and their responses\n */\nexport const requestLoggerMiddleware: MiddlewareHandler = async (c, next) => {\n const startTime = Date.now();\n const requestId = c.get('requestId');\n\n // Log incoming request\n logger.info('Incoming request', {\n requestId,\n method: c.req.method,\n url: c.req.url,\n path: c.req.path,\n ip:\n c.req.header('x-forwarded-for') || c.req.header('x-real-ip') || 'unknown',\n userAgent: c.req.header('user-agent'),\n });\n\n try {\n // Process the request\n await next();\n\n // Log response\n const duration = Date.now() - startTime;\n const status = c.res.status;\n\n logger.info('Request completed', {\n requestId,\n method: c.req.method,\n path: c.req.path,\n status,\n duration,\n responseTime: `${duration}ms`,\n });\n\n // Add response time header\n c.header('X-Response-Time', `${duration}ms`);\n } catch (error) {\n // Log error response\n const duration = Date.now() - startTime;\n\n logger.error('Request failed', {\n requestId,\n method: c.req.method,\n path: c.req.path,\n duration,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Re-throw the error\n throw error;\n }\n};\n","import { Hono } from 'hono';\n\nimport { cors } from 'hono/cors';\nimport { secureHeaders } from 'hono/secure-headers';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport { config } from './config/index.js';\nimport { getApiInfo } from './config/api-info.js';\nimport type { FormatAdapter } from '../format-adapter.js';\n\nimport { healthRouter } from './routes/health.js';\nimport { createFormatRouter } from './routes/format.js';\nimport { discoveryRouter } from './routes/discovery.js';\nimport { createAiRouter } from './routes/ai.js';\n\nimport { requestIdMiddleware } from './middleware/hono/request-id.js';\nimport { apiKeyAuthMiddleware } from './middleware/hono/auth.js';\nimport { errorHandler } from './middleware/hono/error-handler.js';\nimport { securityMiddleware } from './middleware/hono/security.js';\nimport { errorRecoveryMiddleware } from './middleware/hono/error-recovery.js';\nimport { requestLoggerMiddleware } from './middleware/hono/request-logger.js';\n\nimport { AppEnv } from './types/hono.js';\nimport { Container } from './container/index.js';\n\nexport function createAPIApp(adapter: FormatAdapter) {\n // Initialize DI container with the adapter\n Container.initialize(adapter);\n\n const honoApp = new Hono<AppEnv>();\n\n // Built-in middleware\n honoApp.use('*', timing());\n honoApp.use('*', honoLogger());\n\n // CORS\n honoApp.use(\n '*',\n cors({\n origin: config.cors.origin,\n credentials: config.cors.credentials,\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', config.API_KEY_HEADER],\n exposeHeaders: ['X-Request-Id', 'X-File-Id'],\n maxAge: 86400,\n })\n );\n\n honoApp.use('*', secureHeaders());\n\n // Custom middleware\n honoApp.use('*', requestIdMiddleware);\n honoApp.use('*', errorRecoveryMiddleware);\n honoApp.use('*', requestLoggerMiddleware);\n honoApp.use('*', securityMiddleware);\n\n // API key auth (if enabled)\n if (config.features.apiKey) {\n honoApp.use('/api/*', apiKeyAuthMiddleware);\n }\n\n // Mount routes\n honoApp.route('/health', healthRouter);\n\n // Format-specific routes at /api/{format}/*\n const formatRouter = createFormatRouter(adapter);\n honoApp.route(`/api/${adapter.name}`, formatRouter);\n\n // Also mount at /api/documents or /api/presentations for backward compat\n const legacyPath = adapter.name === 'docx' ? '/api/documents' : '/api/presentations';\n honoApp.route(legacyPath, formatRouter);\n\n // Discovery routes\n honoApp.route('/api/discovery', discoveryRouter);\n\n // AI chat routes\n honoApp.route('/api/ai', createAiRouter());\n\n // Root endpoint\n honoApp.get('/', async (c) => {\n const apiInfo = await getApiInfo();\n return c.json(apiInfo);\n });\n\n honoApp.get('/api', async (c) => {\n const apiInfo = await getApiInfo();\n return c.json(apiInfo);\n });\n\n // 404 handler\n honoApp.notFound((c) => {\n return c.json(\n {\n success: false,\n error: 'Not found',\n path: c.req.path,\n method: c.req.method,\n requestId: c.get('requestId'),\n },\n 404\n );\n });\n\n honoApp.onError(errorHandler);\n\n return honoApp;\n}\n","import { Hono } from 'hono';\nimport { serve } from '@hono/node-server';\nimport { logger } from 'hono/logger';\nimport { compress } from 'hono/compress';\nimport { createAPIApp } from './app.js';\nimport type { Config } from '../config/schema.js';\nimport type { FormatAdapter } from '../format-adapter.js';\nimport { resolve, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { logger as serverLogger } from './utils/logger.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport class UnifiedServer {\n private app: Hono;\n private config: Config;\n private adapter: FormatAdapter;\n private server: ReturnType<typeof serve> | null = null;\n private viteServer: any | null = null;\n\n constructor(adapter: FormatAdapter, config: Config) {\n this.adapter = adapter;\n this.config = config;\n this.app = new Hono();\n }\n\n async initialize() {\n await this.setupMiddleware();\n await this.setupRoutes();\n }\n\n private async setupMiddleware() {\n this.app.use('*', logger());\n this.app.use('*', compress());\n }\n\n private async setupRoutes() {\n // Health check (fast path)\n this.app.get('/health', (c) =>\n c.json({\n status: 'ok',\n timestamp: Date.now(),\n version: '1.0.0',\n mode: this.config.mode,\n format: this.adapter.name,\n })\n );\n\n // Mount API routes FIRST\n const apiApp = createAPIApp(this.adapter);\n\n this.app.get('/api', async (c) => {\n return await apiApp.fetch(c.req.raw);\n });\n\n this.app.use('*', async (c, next) => {\n const path = c.req.path;\n\n if (path.startsWith('/api')) {\n // Allow Vite module requests to fall through\n if (/\\.(ts|tsx|js|jsx|css|map)$/.test(path)) {\n return next();\n }\n const response = await apiApp.fetch(c.req.raw);\n if (response.status !== 404) {\n return response;\n }\n }\n\n return next();\n });\n\n // Client serving\n if (this.config.mode === 'development') {\n await this.setupDevClient();\n } else {\n await this.setupProdClient();\n }\n }\n\n private async setupDevClient() {\n const { existsSync } = await import('fs');\n const format = this.adapter.name.replace(/[^a-zA-Z0-9]/g, '');\n\n const formatPlugin = {\n name: 'jto-format-inject',\n transformIndexHtml(html: string) {\n return html.replace(\n '</head>',\n `<script>window.__JTO_FORMAT__ = '${format}';</script>\\n</head>`\n );\n },\n };\n\n const isBundled =\n __filename.endsWith('.cjs') ||\n __filename.endsWith('.mjs') ||\n __dirname.includes('node_modules') ||\n __dirname.endsWith('dist');\n\n let clientPath: string | null = null;\n\n // Check env var\n if (process.env.JTO_CLIENT_PATH) {\n const envClientPath = process.env.JTO_CLIENT_PATH;\n if (existsSync(envClientPath) && existsSync(resolve(envClientPath, 'index.html'))) {\n clientPath = envClientPath;\n serverLogger.debug('[Dev Server] Using client from JTO_CLIENT_PATH', { path: clientPath });\n }\n } else if (isBundled) {\n const bundledClientPath = resolve(__dirname, 'client');\n if (existsSync(bundledClientPath) && existsSync(resolve(bundledClientPath, 'index.html'))) {\n clientPath = bundledClientPath;\n serverLogger.debug('[Dev Server] Using bundled client at', { path: clientPath });\n }\n } else {\n const possiblePaths = [\n resolve(__dirname, '../client'),\n resolve(__dirname, '../../dist/client'),\n ];\n\n for (const p of possiblePaths) {\n if (existsSync(p)) {\n if (p.replace(/\\\\/g, '/').includes('/src/client')) {\n serverLogger.debug('[Dev Server] Using Vite dev server for', { path: p });\n try {\n const { createServer: createViteServer } = await import('vite');\n this.viteServer = await createViteServer({\n root: p,\n plugins: [formatPlugin],\n server: {\n middlewareMode: true,\n hmr: { port: this.config.development.hmrPort || 5173 },\n },\n });\n } catch (err) {\n serverLogger.warn('[Dev Server] Vite not available for dev mode');\n }\n break;\n } else if (existsSync(resolve(p, 'index.html'))) {\n clientPath = p;\n serverLogger.debug('[Dev Server] Using pre-built client at', { path: clientPath });\n break;\n }\n }\n }\n }\n\n if (clientPath) {\n return this.setupBuiltClient(clientPath);\n }\n\n if (!this.viteServer && !isBundled) {\n const sourceClientPath = resolve(__dirname, '../client');\n try {\n const { createServer: createViteServer } = await import('vite');\n this.viteServer = await createViteServer({\n root: sourceClientPath,\n plugins: [formatPlugin],\n server: {\n middlewareMode: true,\n hmr: { port: this.config.development.hmrPort || 5173 },\n },\n });\n } catch {\n serverLogger.warn('[Dev Server] Vite not available');\n }\n }\n\n if (this.viteServer) {\n this.app.use('*', async (c, next) => {\n const path = c.req.path;\n\n if ((path.startsWith('/api') || path === '/health') && !/\\.(ts|tsx|js|jsx|css|map)$/.test(path)) {\n return next();\n }\n\n const env = c.env as Record<string, unknown>;\n const req = env.incoming || env.req;\n const res = env.outgoing || env.res;\n\n if (req && res && this.viteServer) {\n return new Promise((resolve) => {\n this.viteServer!.middlewares.handle(req as any, res as any, () => {\n resolve(next());\n });\n });\n }\n\n return next();\n });\n }\n }\n\n private async setupBuiltClient(clientPath: string) {\n const { serveStatic } = await import('@hono/node-server/serve-static');\n const fs = await import('fs');\n const { extname } = await import('path');\n const mime = await import('mime-types');\n\n const format = this.adapter.name.replace(/[^a-zA-Z0-9]/g, '');\n\n // Serve static assets\n this.app.use('/assets/*', serveStatic({\n root: clientPath,\n rewriteRequestPath: (path) => path.replace(/^\\/assets/, '/assets'),\n }));\n\n // Handle file requests\n this.app.use('/*', async (c, next) => {\n const reqPath = c.req.path;\n if (reqPath.startsWith('/api') || reqPath === '/health') return next();\n\n const ext = extname(reqPath);\n if (ext) {\n const filePath = resolve(clientPath, reqPath.slice(1));\n if (fs.existsSync(filePath)) {\n const mimeType = mime.lookup(filePath) || 'application/octet-stream';\n const content = fs.readFileSync(filePath);\n c.header('Content-Type', mimeType);\n return c.body(content);\n }\n }\n\n return next();\n });\n\n // SPA fallback - inject format into HTML\n this.app.get('*', async (c) => {\n const reqPath = c.req.path;\n if (reqPath.startsWith('/api') || reqPath === '/health') return c.notFound();\n\n const indexPath = resolve(clientPath, 'index.html');\n if (fs.existsSync(indexPath)) {\n let html = fs.readFileSync(indexPath, 'utf-8');\n // Inject format configuration\n html = html.replace(\n '</head>',\n `<script>window.__JTO_FORMAT__ = '${format}';</script>\\n</head>`\n );\n return c.html(html);\n }\n\n return c.notFound();\n });\n }\n\n private async setupProdClient() {\n const { serveStatic } = await import('@hono/node-server/serve-static');\n const format = this.adapter.name.replace(/[^a-zA-Z0-9]/g, '');\n\n this.app.use('/*', async (c, next) => {\n const path = c.req.path;\n if (path.startsWith('/api') || path === '/health') return next();\n return serveStatic({ root: './dist/client' })(c, next);\n });\n\n this.app.get('*', (c) => {\n const path = c.req.path;\n if (path.startsWith('/api') || path === '/health') return c.notFound();\n\n return c.html(`<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>JSON to Office</title>\n <script>window.__JTO_FORMAT__ = '${format}';</script>\n <script>window.location.href = '/';</script>\n</head>\n<body>\n <noscript>You need to enable JavaScript to run this app.</noscript>\n</body>\n</html>`);\n });\n }\n\n async start(): Promise<void> {\n await this.initialize();\n\n return new Promise((resolve) => {\n this.server = serve(\n {\n fetch: this.app.fetch,\n port: this.config.server.port,\n hostname: this.config.server.host,\n },\n () => {\n resolve();\n }\n );\n });\n }\n\n async stop(): Promise<void> {\n if (this.viteServer) await this.viteServer.close();\n if (this.server) {\n return new Promise((resolve) => {\n this.server?.close(() => resolve());\n });\n }\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { DocxFormatAdapter, PptxFormatAdapter, type FormatAdapter } from './format-adapter.js';\nimport { createGenerateCommand } from './commands/generate.js';\nimport { createValidateCommand } from './commands/validate.js';\nimport { createSchemasCommand } from './commands/schemas.js';\nimport { createDiscoverCommand } from './commands/discover.js';\nimport { createInitCommand } from './commands/init.js';\nimport { createDevCommand } from './commands/dev.js';\n\ndeclare const __PACKAGE_VERSION__: string | undefined;\nconst PACKAGE_VERSION =\n typeof __PACKAGE_VERSION__ !== 'undefined' ? __PACKAGE_VERSION__ : 'dev-mode';\n\nfunction registerFormatCommands(parent: Command, adapter: FormatAdapter): void {\n parent.addCommand(createGenerateCommand(adapter));\n parent.addCommand(createValidateCommand(adapter));\n parent.addCommand(createSchemasCommand(adapter));\n parent.addCommand(createDiscoverCommand(adapter));\n parent.addCommand(createInitCommand(adapter));\n parent.addCommand(createDevCommand(adapter));\n}\n\nconst program = new Command();\n\nprogram\n .name('jto')\n .description('JSON to Office CLI - Generate .docx and .pptx from JSON')\n .version(PACKAGE_VERSION);\n\n// === DOCX subcommand ===\nconst docx = new Command('docx').description('DOCX document commands');\nregisterFormatCommands(docx, new DocxFormatAdapter());\n\n// === PPTX subcommand ===\nconst pptx = new Command('pptx').description('PPTX presentation commands');\nregisterFormatCommands(pptx, new PptxFormatAdapter());\n\nprogram.addCommand(docx);\nprogram.addCommand(pptx);\n\nprogram.addHelpText(\n 'after',\n `\n${chalk.gray('Examples:')}\n $ jto docx generate doc.json ${chalk.dim('# Generate DOCX from JSON')}\n $ jto pptx generate slides.json ${chalk.dim('# Generate PPTX from JSON')}\n $ jto docx dev ${chalk.dim('# Start DOCX dev server')}\n $ jto pptx validate slides.json ${chalk.dim('# Validate PPTX JSON')}\n $ jto docx schemas ${chalk.dim('# Export DOCX JSON schemas')}\n $ jto pptx discover ${chalk.dim('# Discover PPTX plugins')}\n`\n);\n\nprogram.exitOverride();\n\n(async () => {\n try {\n await program.parseAsync(process.argv);\n } catch (error: any) {\n if (\n error.code === 'commander.version' ||\n error.code === 'commander.help' ||\n error.code === 'commander.helpDisplayed'\n ) {\n process.exit(0);\n }\n if (error.code === 'commander.executeSubCommandAsync') {\n process.exit(error.exitCode);\n }\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n})();\n","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 { Command } from 'commander';\nimport { readFileSync, writeFileSync } from 'fs';\nimport { resolve, basename } from 'path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport type { FormatAdapter } from '../format-adapter.js';\nimport { PluginRegistry } from '../services/plugin-registry.js';\n\nimport { GeneratorFactory } from '../services/generator-factory.js';\nimport { PluginConfigService } from '../config/plugin-config.js';\nimport { loadPlugins } from './shared.js';\nimport { shortPath, formatTiming, formatError, EXIT_CODES } from './ui.js';\n\ninterface GenerateOptions {\n output?: string;\n template?: string;\n plugins?: string | boolean;\n pluginDir?: string;\n theme?: string;\n themePath?: string;\n strict?: boolean;\n dryRun?: boolean;\n}\n\nexport function createGenerateCommand(adapter: FormatAdapter): Command {\n return new Command('generate')\n .description(`Generate ${adapter.label} from JSON`)\n .argument('<input>', 'Input JSON file path')\n .option('-o, --output <path>', 'Output file path')\n .option('-t, --template <name>', 'Template to use')\n .option(\n '--plugins [names-or-paths]',\n 'Load plugins (comma-separated names/paths, or no value for auto-discovery)'\n )\n .option('--plugin-dir <dir>', 'Directory to search for plugins')\n .option('--theme <name-or-path>', 'Theme name or path to theme file')\n .option('--theme-path <path>', 'Path to theme file (alternative to --theme)')\n .option('--strict', 'Enable strict validation')\n .option('--dry-run', 'Preview without writing files')\n .action(async (input: string, options: GenerateOptions) => {\n const spinner = ora('Initializing...').start();\n const startTime = performance.now();\n\n try {\n const configService = PluginConfigService.getInstance();\n const config = await configService.loadConfig();\n\n const mergedConfig = config\n ? configService.mergeWithOptions({\n theme: options.theme,\n themePath: options.themePath,\n validation: { strict: options.strict },\n })\n : {\n theme: options.theme,\n themePath: options.themePath,\n validation: { strict: options.strict },\n };\n\n await loadPlugins(options, config, configService, spinner);\n\n spinner.text = 'Reading input file...';\n const inputPath = resolve(process.cwd(), input);\n const jsonContent = readFileSync(inputPath, 'utf-8');\n const documentDefinition = JSON.parse(jsonContent);\n\n const factory = new GeneratorFactory(adapter);\n\n const outputPath = options.output\n ? resolve(process.cwd(), options.output)\n : resolve(process.cwd(), basename(input, '.json') + adapter.extension);\n\n const pluginInfo = factory.getPluginInfo();\n\n if (options.dryRun) {\n spinner.succeed(`Dry run complete ${formatTiming(startTime)}`);\n\n const lines = [\n `${chalk.cyan('Input:')} ${input}`,\n `${chalk.cyan('Output:')} ${shortPath(outputPath)}`,\n `${chalk.cyan('Format:')} ${adapter.name}`,\n `${chalk.cyan('Theme:')} ${mergedConfig.theme || 'default'}`,\n `${chalk.cyan('Strict:')} ${mergedConfig.validation?.strict ? 'yes' : 'no'}`,\n ];\n if (pluginInfo.hasPlugins) {\n lines.push(`${chalk.cyan('Plugins:')} ${pluginInfo.count} loaded (${pluginInfo.names.join(', ')})`);\n }\n lines.push(`${chalk.cyan('Validation:')} ${chalk.green('passed')}`);\n\n console.log(\n boxen(lines.join('\\n'), {\n padding: 1,\n borderColor: 'yellow',\n borderStyle: 'round',\n title: 'Dry Run',\n titleAlignment: 'center',\n })\n );\n\n PluginRegistry.getInstance().clear();\n return;\n }\n\n spinner.text = `Generating ${adapter.label}...`;\n const buffer = await factory.generate(documentDefinition, {\n theme: mergedConfig.theme,\n themePath: mergedConfig.themePath,\n validation: mergedConfig.validation,\n });\n\n spinner.text = 'Writing output file...';\n writeFileSync(outputPath, Buffer.from(buffer));\n\n spinner.succeed(\n `${adapter.label.charAt(0).toUpperCase() + adapter.label.slice(1)} generated successfully! ${formatTiming(startTime)}`\n );\n\n const lines = [\n `${chalk.cyan('Input:')} ${input}`,\n `${chalk.cyan('Output:')} ${shortPath(outputPath)}`,\n `${chalk.cyan('Format:')} ${adapter.name}`,\n ];\n if (pluginInfo.hasPlugins) {\n lines.push(`${chalk.cyan('Plugins:')} ${pluginInfo.count} loaded (${pluginInfo.names.join(', ')})`);\n }\n\n console.log(\n boxen(lines.join('\\n'), {\n padding: 1,\n borderColor: 'green',\n borderStyle: 'round',\n title: adapter.label.charAt(0).toUpperCase() + adapter.label.slice(1),\n titleAlignment: 'center',\n })\n );\n\n PluginRegistry.getInstance().clear();\n } catch (error: any) {\n spinner.fail(`${adapter.label.charAt(0).toUpperCase() + adapter.label.slice(1)} generation failed`);\n formatError(error);\n\n PluginRegistry.getInstance().clear();\n process.exit(EXIT_CODES.FAIL);\n }\n })\n .addHelpText(\n 'after',\n `\n${chalk.gray('Examples:')}\n $ jto ${adapter.name} generate doc.json ${chalk.dim('# Generate without plugins')}\n $ jto ${adapter.name} generate doc.json --plugins ${chalk.dim('# Auto-discover plugins')}\n $ jto ${adapter.name} generate doc.json --plugins weather,data ${chalk.dim('# Use plugins by name')}\n $ jto ${adapter.name} generate doc.json --theme minimal ${chalk.dim('# Use built-in theme')}\n $ jto ${adapter.name} generate doc.json --theme-path ./theme.json ${chalk.dim('# Use custom theme')}\n $ jto ${adapter.name} generate doc.json --dry-run ${chalk.dim('# Preview without writing')}\n`\n );\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 { 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 { PluginRegistry } from '../services/plugin-registry.js';\nimport { PluginResolver } from '../services/plugin-resolver.js';\nimport { PluginConfigService } from '../config/plugin-config.js';\n\ninterface PluginOptions {\n plugins?: string | boolean;\n pluginDir?: string;\n}\n\nexport async function loadPlugins(\n options: PluginOptions,\n config: any,\n configService: PluginConfigService,\n spinner: any\n): Promise<void> {\n const registry = PluginRegistry.getInstance();\n\n if (options.plugins !== undefined) {\n spinner.text = 'Loading plugins...';\n\n if (options.plugins === true) {\n const result = await registry.discoverAndLoad();\n if (result.discovered > 0) {\n spinner.text = `Loaded ${result.loaded}/${result.discovered} discovered plugins...`;\n }\n } else if (\n typeof options.plugins === 'string' &&\n options.plugins.length > 0\n ) {\n const pluginList = options.plugins.split(',').map((p) => p.trim());\n for (const plugin of pluginList) {\n await registry.loadPlugin(plugin);\n }\n }\n } else if (config?.autoDiscover) {\n spinner.text = 'Auto-discovering plugins...';\n const result = await registry.discoverAndLoad();\n if (result.discovered > 0) {\n spinner.text = `Loaded ${result.loaded}/${result.discovered} discovered plugins...`;\n }\n } else if (config?.plugins && config.plugins.length > 0) {\n spinner.text = 'Loading configured plugins...';\n const resolver = new PluginResolver();\n const resolved = await resolver.resolveMultiple(config.plugins);\n const paths: string[] = [];\n for (const [, resolvedPath] of resolved) {\n paths.push(resolvedPath);\n }\n await registry.loadPlugins(paths);\n }\n\n if (options.pluginDir) {\n spinner.text = `Loading plugins from ${options.pluginDir}...`;\n const loadedCount = await registry.loadPluginsFromDirectory(\n options.pluginDir\n );\n if (loadedCount > 0) {\n spinner.text = `Loaded ${loadedCount} plugin(s) from ${options.pluginDir}...`;\n }\n } else if (config?.pluginDirs) {\n for (const dir of configService.getPluginDirectories()) {\n const loadedCount = await registry.loadPluginsFromDirectory(dir);\n if (loadedCount > 0) {\n spinner.text = `Loaded ${loadedCount} plugin(s) from ${dir}...`;\n }\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 { relative, dirname, basename } from 'path';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\n\nexport const EXIT_CODES = { OK: 0, FAIL: 1 } as const;\n\nexport function shortPath(absPath: string): string {\n return relative(process.cwd(), absPath) || absPath;\n}\n\nexport function dimPath(absPath: string): string {\n const rel = shortPath(absPath);\n const dir = dirname(rel);\n const file = basename(rel);\n return dir === '.' ? chalk.bold(file) : chalk.dim(dir + '/') + chalk.bold(file);\n}\n\nexport function createTable(headers: string[], rows: string[][]): string {\n const table = new Table({\n head: headers.map((h) => chalk.bold(h)),\n style: { head: [], border: ['gray'] },\n wordWrap: true,\n });\n for (const row of rows) table.push(row);\n return table.toString();\n}\n\nexport function formatTiming(startMs: number): string {\n const ms = Math.round(performance.now() - startMs);\n return chalk.dim(`(${ms}ms)`);\n}\n\nexport function formatError(error: any): void {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`File not found: ${error.path || error.message}`));\n } else if (error instanceof SyntaxError) {\n console.error(chalk.red('Invalid JSON in input file'));\n console.error(chalk.dim(error.message));\n } else {\n console.error(chalk.red(error.message));\n if (error.validationErrors) {\n console.error(chalk.yellow('\\nValidation errors:'));\n for (const err of error.validationErrors) {\n console.error(chalk.red(` - ${err.path || 'root'}: ${err.message}`));\n if (err.suggestions) {\n for (const s of err.suggestions) {\n console.error(chalk.dim(` -> ${s}`));\n }\n }\n }\n }\n if (error.stack && !error.validationErrors) {\n console.error(chalk.dim('\\nStack trace:'));\n console.error(chalk.dim(error.stack));\n }\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { resolve, relative } from 'path';\nimport { existsSync } from 'fs';\nimport type { FormatAdapter } from '../format-adapter.js';\nimport { JsonValidator } from '../services/json-validator.js';\nimport { createTable, formatTiming, formatError, EXIT_CODES } from './ui.js';\n\ninterface ValidateCommandOptions {\n type?: 'document' | 'theme' | 'auto';\n schema?: string;\n strict?: boolean;\n quiet?: boolean;\n format?: 'pretty' | 'json';\n recursive?: boolean;\n}\n\nexport function createValidateCommand(adapter: FormatAdapter): Command {\n return new Command('validate')\n .description(`Validate JSON ${adapter.label}s or themes against schemas`)\n .argument(\n '<file-or-directory>',\n 'JSON file, directory, or glob pattern to validate'\n )\n .option(\n '-t, --type <type>',\n 'Validation type: \\'document\\', \\'theme\\', or \\'auto\\'',\n 'auto'\n )\n .option('-s, --schema <path>', 'Path to custom JSON schema file')\n .option('--strict', 'Use strict validation (no cleaning or defaults)')\n .option('-q, --quiet', 'Only output errors, no success messages')\n .option(\n '-f, --format <format>',\n 'Error output format: \\'pretty\\' or \\'json\\'',\n 'pretty'\n )\n .option(\n '-r, --recursive',\n 'Validate all JSON files in directory recursively'\n )\n .action(\n async (fileOrDirectory: string, options: ValidateCommandOptions) => {\n const validator = new JsonValidator(adapter.name);\n const isJsonFormat = options.format === 'json';\n\n const showSpinner = !options.quiet && !isJsonFormat;\n const spinner = showSpinner ? ora('Validating...').start() : null;\n const startTime = performance.now();\n\n try {\n if (options.schema && !existsSync(resolve(options.schema))) {\n throw new Error(`Schema file not found: ${options.schema}`);\n }\n\n const results = await validator.validate(fileOrDirectory, {\n type: options.type,\n schema: options.schema,\n strict: options.strict,\n recursive: options.recursive,\n });\n\n if (results.length === 0) {\n if (spinner) spinner.warn('No JSON files found to validate');\n process.exit(EXIT_CODES.OK);\n }\n\n const totalFiles = results.length;\n const validFiles = results.filter((r) => r.valid).length;\n const invalidFiles = totalFiles - validFiles;\n\n if (isJsonFormat) {\n console.log(validator.formatResultsAsJson(results));\n } else {\n if (spinner) {\n if (invalidFiles > 0) {\n spinner.fail(\n `Validation completed: ${invalidFiles}/${totalFiles} file(s) failed ${formatTiming(startTime)}`\n );\n } else {\n spinner.succeed(`All ${totalFiles} file(s) are valid! ${formatTiming(startTime)}`);\n }\n }\n\n if (!options.quiet || invalidFiles > 0) {\n console.log('');\n\n // Show per-file error details for failed files\n for (const result of results) {\n if (!result.valid) {\n const relativePath = relative(process.cwd(), result.file);\n console.log(chalk.red('FAIL'), chalk.bold(relativePath));\n\n if (result.errors && result.errors.length > 0) {\n console.log(chalk.red(' Errors:'));\n for (const error of result.errors) {\n console.log(\n chalk.red(validator.formatError(error, 4))\n );\n }\n }\n\n if (result.warnings && result.warnings.length > 0) {\n console.log(chalk.yellow(' Warnings:'));\n for (const warning of result.warnings) {\n console.log(\n chalk.yellow(validator.formatError(warning, 4))\n );\n }\n }\n\n console.log('');\n }\n }\n }\n\n if (totalFiles > 1 && !options.quiet) {\n const rows = results.map((r) => {\n const relativePath = relative(process.cwd(), r.file);\n const status = r.valid ? chalk.green('OK') : chalk.red('FAIL');\n const errorCount = r.valid ? '-' : chalk.red(String(r.errors?.length || 0));\n return [relativePath, status, errorCount];\n });\n console.log(createTable(['File', 'Status', 'Errors'], rows));\n }\n }\n\n process.exit(invalidFiles > 0 ? EXIT_CODES.FAIL : EXIT_CODES.OK);\n } catch (error: any) {\n if (spinner) spinner.fail('Validation failed');\n\n if (isJsonFormat) {\n console.log(\n JSON.stringify({ error: true, message: error.message }, null, 2)\n );\n } else {\n formatError(error);\n }\n\n process.exit(EXIT_CODES.FAIL);\n }\n }\n )\n .addHelpText(\n 'after',\n `\n${chalk.gray('Examples:')}\n $ jto ${adapter.name} validate document.json ${chalk.dim('# Validate a single file')}\n $ jto ${adapter.name} validate theme.json --type theme ${chalk.dim('# Validate with specific type')}\n $ jto ${adapter.name} validate ./documents --recursive ${chalk.dim('# Validate all JSON files in directory')}\n $ jto ${adapter.name} validate document.json --format json ${chalk.dim('# Output as JSON for tooling')}\n`\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 { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as path from 'path';\nimport type { FormatAdapter } from '../format-adapter.js';\nimport { PluginRegistry } from '../services/plugin-registry.js';\nimport { PluginConfigService } from '../config/plugin-config.js';\nimport { SchemaGenerator } from '../services/schema-generator.js';\nimport { loadPlugins } from './shared.js';\nimport { createTable, shortPath, formatTiming, formatError, EXIT_CODES } from './ui.js';\n\ninterface JsonSchemaOptions {\n outputDir?: string;\n plugins?: string | boolean;\n pluginDir?: string;\n format?: 'json' | 'typebox';\n themeOnly?: boolean;\n documentOnly?: boolean;\n split?: boolean;\n}\n\nexport function createSchemasCommand(adapter: FormatAdapter): Command {\n return new Command('schemas')\n .description(`Generate JSON schemas for ${adapter.label}s and themes`)\n .option(\n '-o, --output-dir <path>',\n 'Output directory for schema files',\n './schemas'\n )\n .option(\n '--plugins [names-or-paths]',\n 'Load plugins (comma-separated names/paths, or no value for auto-discovery)'\n )\n .option('--plugin-dir <dir>', 'Directory to search for plugins')\n .option('-f, --format <type>', 'Output format (json or typebox)', 'json')\n .option('--theme-only', 'Generate only theme schemas')\n .option('--document-only', 'Generate only document schemas')\n .option(\n '--split',\n 'Generate separate schema files for each component type'\n )\n .action(async (options: JsonSchemaOptions) => {\n const spinner = ora('Initializing...').start();\n const startTime = performance.now();\n\n try {\n const configService = PluginConfigService.getInstance();\n const config = await configService.loadConfig();\n\n if (!options.themeOnly) {\n await loadPlugins(options, config, configService, spinner);\n }\n\n spinner.text = 'Generating schemas...';\n const generator = new SchemaGenerator(adapter.name);\n\n const generateOptions = {\n includeDocument: !options.themeOnly,\n includeTheme: !options.documentOnly,\n split: options.split || false,\n format: options.format || 'json',\n };\n\n const outputDir = path.resolve(\n process.cwd(),\n options.outputDir || './schemas'\n );\n const results = await generator.generateAndExportSchemas(\n outputDir,\n generateOptions\n );\n\n spinner.succeed(`Schema generation completed! ${formatTiming(startTime)}`);\n\n const rows: string[][] = [];\n if (results.document) {\n rows.push(['Document', shortPath(results.document)]);\n }\n if (results.theme) {\n rows.push(['Theme', shortPath(results.theme)]);\n }\n if (results.components) {\n for (const componentPath of results.components) {\n rows.push(['Component', shortPath(componentPath)]);\n }\n }\n\n console.log(`\\n${chalk.bold('Generated Schemas:')}\\n`);\n console.log(createTable(['Type', 'Path'], rows));\n\n const registry = PluginRegistry.getInstance();\n const loadedPlugins = registry.getPlugins();\n if (loadedPlugins.length > 0) {\n console.log(chalk.cyan('\\n Included Plugins:'));\n loadedPlugins.forEach((plugin) => {\n console.log(\n chalk.dim(\n ` - ${plugin.name}${(plugin as any).version ? ` (${(plugin as any).version})` : ''}`\n )\n );\n });\n }\n\n console.log('\\n' + chalk.green('Schemas are ready for use!'));\n\n PluginRegistry.getInstance().clear();\n } catch (error: any) {\n spinner.fail('Schema generation failed');\n formatError(error);\n PluginRegistry.getInstance().clear();\n process.exit(EXIT_CODES.FAIL);\n }\n })\n .addHelpText(\n 'after',\n `\n${chalk.gray('Examples:')}\n $ jto ${adapter.name} schemas ${chalk.dim('# Generate schemas without plugins')}\n $ jto ${adapter.name} schemas --plugins ${chalk.dim('# Auto-discover and include plugins')}\n $ jto ${adapter.name} schemas --format typebox ${chalk.dim('# Generate TypeBox TypeScript files')}\n $ jto ${adapter.name} schemas --theme-only ${chalk.dim('# Generate only theme schemas')}\n $ jto ${adapter.name} schemas --split ${chalk.dim('# Generate individual component schemas')}\n`\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 { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport {\n PluginDiscoveryService,\n type DocumentMetadata,\n type ThemeMetadata,\n} from '../services/plugin-discovery.js';\nimport { PluginDisplay } from '../services/plugin-display.js';\nimport { PluginRegistry } from '../services/plugin-registry.js';\nimport type { FormatAdapter } from '../format-adapter.js';\nimport { createTable, dimPath, formatError, EXIT_CODES } from './ui.js';\n\nexport function createDiscoverCommand(adapter: FormatAdapter): Command {\n return new Command('discover')\n .description(`Discover json-to-${adapter.name} plugins, documents, and themes`)\n .option('-j, --json', 'Output as JSON')\n .option('-s, --schema', 'Include full schemas in output (plugins only)')\n .option('-e, --examples', 'Include usage examples (plugins only)')\n .option(\n '-t, --type <type>',\n 'Type to discover: plugin, document, theme, or all (default: all)',\n 'all'\n )\n .option(\n '-s, --scope <path>',\n 'Limit discovery scope to a specific directory'\n )\n .option('--max-depth <depth>', 'Maximum search depth', '10')\n .option('--include-node-modules', 'Include node_modules in search')\n .option('-v, --verbose', 'Verbose output for debugging')\n .option('--grouped', 'Group items by location')\n .action(async (options) => {\n const discoverType = options.type?.toLowerCase() || 'all';\n const validTypes = ['plugin', 'document', 'theme', 'all'];\n\n if (!validTypes.includes(discoverType)) {\n console.error(\n chalk.red(\n `Invalid type: ${discoverType}. Must be one of: ${validTypes.join(', ')}`\n )\n );\n process.exit(EXIT_CODES.FAIL);\n }\n\n const scopeDescription = options.scope\n ? `scope: ${options.scope}`\n : 'entire project';\n\n const spinnerText =\n discoverType === 'all'\n ? `Discovering plugins, documents, and themes in ${scopeDescription}...`\n : `Discovering ${discoverType}s in ${scopeDescription}...`;\n const spinner = options.json ? null : ora(spinnerText).start();\n\n try {\n const discoveryOptions = {\n scope: options.scope,\n maxDepth: parseInt(options.maxDepth, 10),\n includeNodeModules: options.includeNodeModules,\n verbose: options.verbose,\n };\n\n const discovery = new PluginDiscoveryService(discoveryOptions);\n\n let plugins: any[] = [];\n let documents: DocumentMetadata[] = [];\n let themes: ThemeMetadata[] = [];\n let totalCount = 0;\n\n const format = adapter.name as 'docx' | 'pptx';\n\n if (discoverType === 'all') {\n const results = await discovery.discoverAll(format);\n plugins = results.plugins;\n documents = results.documents;\n themes = results.themes;\n totalCount = plugins.length + documents.length + themes.length;\n } else if (discoverType === 'plugin') {\n plugins = await discovery.discoverPlugins();\n totalCount = plugins.length;\n } else if (discoverType === 'document') {\n documents = await discovery.discoverDocuments(format);\n totalCount = documents.length;\n } else if (discoverType === 'theme') {\n themes = await discovery.discoverThemes(format);\n totalCount = themes.length;\n }\n\n if (spinner) {\n if (totalCount === 0) {\n spinner.warn(\n `No ${discoverType === 'all' ? 'items' : discoverType + 's'} found`\n );\n } else {\n const message =\n discoverType === 'all'\n ? `Found ${plugins.length} plugin${plugins.length !== 1 ? 's' : ''}, ` +\n `${documents.length} document${documents.length !== 1 ? 's' : ''}, ` +\n `${themes.length} theme${themes.length !== 1 ? 's' : ''}`\n : `Found ${totalCount} ${discoverType}${totalCount !== 1 ? 's' : ''}`;\n spinner.succeed(message);\n }\n }\n\n if (options.json) {\n if (discoverType === 'all') {\n console.log(\n JSON.stringify({ plugins, documents, themes }, null, 2)\n );\n } else if (discoverType === 'plugin') {\n const display = new PluginDisplay({\n json: true,\n schema: options.schema,\n examples: options.examples,\n verbose: options.verbose,\n });\n await display.show(plugins);\n } else if (discoverType === 'document') {\n console.log(JSON.stringify(documents, null, 2));\n } else if (discoverType === 'theme') {\n console.log(JSON.stringify(themes, null, 2));\n }\n } else {\n if (discoverType === 'all') {\n if (plugins.length > 0) {\n console.log(chalk.bold('\\nPlugins:'));\n displayAsTable(plugins, 'plugin', options.grouped);\n }\n if (documents.length > 0) {\n console.log(chalk.bold('\\nDocuments:'));\n displayAsTable(documents, 'document', options.grouped);\n }\n if (themes.length > 0) {\n console.log(chalk.bold('\\nThemes:'));\n displayAsTable(themes, 'theme', options.grouped);\n }\n } else if (discoverType === 'plugin') {\n const display = new PluginDisplay({\n json: false,\n schema: options.schema,\n examples: options.examples,\n verbose: options.verbose,\n });\n if (options.grouped) {\n display.displayGrouped(plugins);\n } else {\n await display.show(plugins);\n }\n } else if (discoverType === 'document') {\n displayAsTable(documents, 'document', options.grouped);\n } else if (discoverType === 'theme') {\n displayAsTable(themes, 'theme', options.grouped);\n }\n }\n\n PluginRegistry.getInstance().clear();\n } catch (error: any) {\n if (spinner) spinner.fail('Discovery failed');\n formatError(error);\n PluginRegistry.getInstance().clear();\n process.exit(EXIT_CODES.FAIL);\n }\n })\n .addHelpText(\n 'after',\n `\n${chalk.gray('Examples:')}\n $ jto ${adapter.name} discover ${chalk.dim('# Discover all items')}\n $ jto ${adapter.name} discover --type plugin ${chalk.dim('# Discover only plugins')}\n $ jto ${adapter.name} discover --json ${chalk.dim('# Output as JSON')}\n $ jto ${adapter.name} discover --grouped ${chalk.dim('# Group by location')}\n`\n );\n}\n\nfunction displayAsTable(items: any[], type: string, grouped: boolean) {\n if (grouped) {\n const groups = groupByLocation(items);\n for (const [location, groupItems] of Object.entries(groups)) {\n if (groupItems.length > 0) {\n console.log(chalk.gray(`\\n ${location}:`));\n const rows = groupItems.map((item: any) => [\n item.name || item.title || '',\n type,\n dimPath(item.filePath || item.path || ''),\n ]);\n console.log(createTable(['Name', 'Type', 'Path'], rows));\n }\n }\n } else {\n const rows = items.map((item: any) => [\n item.name || item.title || '',\n type,\n dimPath(item.filePath || item.path || ''),\n ]);\n console.log(createTable(['Name', 'Type', 'Path'], rows));\n }\n}\n\nfunction groupByLocation<T extends { location: string }>(\n items: T[]\n): Record<string, T[]> {\n return items.reduce(\n (acc, item) => {\n const loc = item.location;\n if (!acc[loc]) acc[loc] = [];\n acc[loc].push(item);\n return acc;\n },\n {} as Record<string, T[]>\n );\n}\n","import chalk from 'chalk';\nimport type { PluginMetadata } from './plugin-metadata.js';\n\nexport interface DisplayOptions {\n json?: boolean;\n schema?: boolean;\n examples?: boolean;\n verbose?: boolean;\n}\n\nexport class PluginDisplay {\n private options: DisplayOptions;\n\n constructor(options: DisplayOptions = {}) {\n this.options = options;\n }\n\n async show(plugins: PluginMetadata[]): Promise<void> {\n if (this.options.json) {\n this.displayJson(plugins);\n } else {\n this.displayConsole(plugins);\n }\n }\n\n private displayJson(plugins: PluginMetadata[]): void {\n const output: any = {\n plugins: plugins.map((plugin) => this.formatPluginForJson(plugin)),\n count: plugins.length,\n locations: {\n upstream: plugins.filter((p) => p.location === 'upstream').length,\n current: plugins.filter((p) => p.location === 'current').length,\n downstream: plugins.filter((p) => p.location === 'downstream').length,\n },\n };\n\n console.log(JSON.stringify(output, null, 2));\n }\n\n private formatPluginForJson(plugin: PluginMetadata): any {\n const formatted: any = {\n name: plugin.name,\n description: plugin.description,\n version: plugin.version,\n filePath: plugin.filePath,\n relativePath: plugin.relativePath,\n location: plugin.location,\n };\n\n if (this.options.schema) {\n formatted.schema = plugin.schema.jsonSchema || plugin.schema.raw;\n formatted.properties = plugin.schema.properties;\n }\n\n if (this.options.examples && plugin.examples) {\n formatted.examples = plugin.examples;\n }\n\n return formatted;\n }\n\n private displayConsole(plugins: PluginMetadata[]): void {\n console.log();\n console.log(chalk.bold.cyan('Custom Plugins Discovery'));\n console.log(chalk.gray('-'.repeat(50)));\n console.log();\n\n const upstream = plugins.filter((p) => p.location === 'upstream');\n const current = plugins.filter((p) => p.location === 'current');\n const downstream = plugins.filter((p) => p.location === 'downstream');\n\n console.log(chalk.bold('Search Results:'));\n if (upstream.length > 0) {\n console.log(\n chalk.gray(' Upstream: ') +\n chalk.green(`${upstream.length} plugin${upstream.length !== 1 ? 's' : ''} found`)\n );\n }\n if (current.length > 0) {\n console.log(\n chalk.gray(' Current: ') +\n chalk.green(`${current.length} plugin${current.length !== 1 ? 's' : ''} found`)\n );\n }\n if (downstream.length > 0) {\n console.log(\n chalk.gray(' Downstream:') +\n chalk.green(`${downstream.length} plugin${downstream.length !== 1 ? 's' : ''} found`)\n );\n }\n console.log();\n\n if (plugins.length === 0) {\n console.log(chalk.yellow('No plugins found.'));\n console.log(\n chalk.gray('Make sure your custom components follow the *.component.ts naming convention.')\n );\n return;\n }\n\n plugins.forEach((plugin, index) => {\n if (index > 0) console.log();\n this.displayPlugin(plugin);\n });\n\n console.log();\n console.log(chalk.gray('-'.repeat(50)));\n console.log(\n chalk.bold(`Total: ${plugins.length} plugin${plugins.length !== 1 ? 's' : ''} discovered`)\n );\n }\n\n private displayPlugin(plugin: PluginMetadata): void {\n console.log(chalk.bold.yellow(` ${plugin.name}`));\n\n const locationIcon = {\n upstream: '^',\n current: '*',\n downstream: 'v',\n }[plugin.location];\n\n console.log(\n chalk.gray(` ${locationIcon} Path: `) + chalk.blue(plugin.relativePath)\n );\n\n if (plugin.description) {\n console.log(chalk.gray(' Description: ') + plugin.description);\n }\n\n if (plugin.version) {\n console.log(chalk.gray(' Version: ') + plugin.version);\n }\n\n if (this.options.schema && plugin.schema.properties) {\n console.log();\n console.log(chalk.gray(' Schema Properties:'));\n for (const [key, prop] of Object.entries(plugin.schema.properties)) {\n const required = (prop as any).required ? chalk.red('*') : '';\n const type = chalk.cyan((prop as any).type || 'any');\n let line = ` - ${key}${required} (${type})`;\n if ((prop as any).description) {\n line += chalk.gray(` - ${(prop as any).description}`);\n }\n console.log(line);\n }\n }\n\n if (this.options.examples && plugin.examples && plugin.examples.length > 0) {\n console.log();\n console.log(chalk.gray(' Example:'));\n const example = plugin.examples[0];\n if (example.title) {\n console.log(chalk.gray(` ${example.title}`));\n }\n const exampleJson = JSON.stringify(example.props, null, 2);\n const indentedJson = exampleJson\n .split('\\n')\n .map((line) => ' ' + line)\n .join('\\n');\n console.log(chalk.green(indentedJson));\n }\n }\n\n displayGrouped(plugins: PluginMetadata[]): void {\n const grouped = {\n upstream: plugins.filter((p) => p.location === 'upstream'),\n current: plugins.filter((p) => p.location === 'current'),\n downstream: plugins.filter((p) => p.location === 'downstream'),\n };\n\n console.log();\n console.log(chalk.bold.cyan('Custom Plugins Discovery'));\n console.log(chalk.gray('-'.repeat(50)));\n\n for (const [location, locationPlugins] of Object.entries(grouped)) {\n if (locationPlugins.length === 0) continue;\n\n console.log();\n console.log(\n chalk.bold(\n `${location.charAt(0).toUpperCase() + location.slice(1)} (${locationPlugins.length}):`\n )\n );\n console.log();\n\n locationPlugins.forEach((plugin) => {\n console.log(` ${chalk.yellow('*')} ${chalk.bold(plugin.name)}`);\n console.log(` ${chalk.gray(plugin.relativePath)}`);\n if (plugin.description) {\n console.log(` ${chalk.italic(plugin.description)}`);\n }\n });\n }\n\n console.log();\n console.log(chalk.gray('-'.repeat(50)));\n console.log(\n chalk.bold(`Total: ${plugins.length} plugin${plugins.length !== 1 ? 's' : ''} discovered`)\n );\n }\n}\n","import { Command } from 'commander';\nimport { mkdirSync, writeFileSync, existsSync } from 'fs';\nimport { resolve, join } from 'path';\nimport { execSync } from 'child_process';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport type { FormatAdapter } from '../format-adapter.js';\nimport { EXIT_CODES } from './ui.js';\n\ninterface InitOptions {\n template?: string;\n skipInstall?: boolean;\n}\n\nexport function createInitCommand(adapter: FormatAdapter): Command {\n return new Command('init')\n .description(`Initialize a new json-to-${adapter.name} project`)\n .argument('[name]', 'Project name')\n .option('-t, --template <type>', 'Project template', 'basic')\n .option('--skip-install', 'Skip dependency installation')\n .action(async (name: string | undefined, options: InitOptions) => {\n try {\n if (!name) {\n try {\n // @ts-expect-error -- prompts lacks type declarations\n const prompts = (await import('prompts')).default;\n const response = await prompts({\n type: 'text',\n name: 'projectName',\n message: 'Project name:',\n initial: `my-json-to-${adapter.name}-project`,\n });\n name = response.projectName;\n } catch {\n name = `my-json-to-${adapter.name}-project`;\n }\n\n if (!name) {\n console.log(chalk.red('Project name is required'));\n process.exit(EXIT_CODES.FAIL);\n }\n }\n\n const projectPath = resolve(process.cwd(), name);\n\n if (existsSync(projectPath)) {\n console.error(chalk.red(`Directory ${name} already exists`));\n process.exit(EXIT_CODES.FAIL);\n }\n\n mkdirSync(projectPath, { recursive: true });\n\n const packageJson = {\n name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: `jto ${adapter.name} dev`,\n generate: `jto ${adapter.name} generate`,\n validate: `jto ${adapter.name} validate`,\n schemas: `jto ${adapter.name} schemas`,\n },\n dependencies: {\n [`@json-to-office/json-to-${adapter.name}`]: 'latest',\n },\n devDependencies: {\n '@json-to-office/jto': 'latest',\n typescript: '^5.3.3',\n },\n };\n\n writeFileSync(\n join(projectPath, 'package.json'),\n JSON.stringify(packageJson, null, 2)\n );\n\n // Create example document based on format\n const exampleDocument =\n adapter.name === 'docx'\n ? {\n name: 'docx',\n props: {\n title: 'Welcome to JSON-to-Office',\n subtitle: `Your ${adapter.label} generation project`,\n theme: 'minimal',\n },\n children: [\n {\n name: 'heading',\n props: { text: 'Welcome', level: 1 },\n },\n {\n name: 'paragraph',\n props: {\n text: 'Edit example.json to customize your document.',\n },\n },\n ],\n }\n : {\n name: 'pptx',\n props: {\n title: 'Welcome to JSON-to-Office',\n },\n children: [\n {\n name: 'slide',\n props: {},\n children: [\n {\n name: 'text',\n props: {\n text: 'Welcome to JSON-to-Office',\n x: 1,\n y: 1,\n w: 8,\n h: 2,\n fontSize: 36,\n },\n },\n ],\n },\n ],\n };\n\n writeFileSync(\n join(projectPath, 'example.json'),\n JSON.stringify(exampleDocument, null, 2)\n );\n\n const gitignore = `node_modules\\ndist\\n.cache\\n*${adapter.extension}\\n.env\\n.env.local\\n`;\n writeFileSync(join(projectPath, '.gitignore'), gitignore);\n\n console.log(chalk.green(`\\nCreated project at ${projectPath}\\n`));\n\n if (!options.skipInstall) {\n const spinner = ora('Installing dependencies...').start();\n\n try {\n execSync('npm install', {\n cwd: projectPath,\n stdio: 'ignore',\n });\n spinner.succeed('Dependencies installed');\n } catch {\n spinner.fail('Failed to install dependencies');\n console.log(\n chalk.yellow(\n '\\nRun `npm install` manually to install dependencies'\n )\n );\n }\n }\n\n const nextSteps = [\n `cd ${name}`,\n ...(options.skipInstall ? ['npm install'] : []),\n `jto ${adapter.name} generate example.json`,\n ];\n\n console.log(\n boxen(\n chalk.bold(`${name}\\n\\n`) +\n chalk.gray('Next steps:\\n') +\n nextSteps.map((s) => chalk.cyan(` $ ${s}`)).join('\\n'),\n {\n padding: 1,\n borderColor: 'green',\n borderStyle: 'round',\n title: 'Project created',\n titleAlignment: 'center',\n }\n )\n );\n } catch (error: any) {\n console.error(chalk.red('Failed to create project:'), error.message);\n process.exit(EXIT_CODES.FAIL);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport boxen from 'boxen';\nimport type { FormatAdapter } from '../format-adapter.js';\nimport { loadConfig } from '../config/loader.js';\nimport { formatError, EXIT_CODES } from './ui.js';\n\ninterface DevOptions {\n port?: string;\n host?: string;\n open?: boolean;\n config?: string;\n}\n\nexport function createDevCommand(adapter: FormatAdapter): Command {\n const dev = new Command('dev');\n return dev\n .description('Start development server with web UI')\n .option(\n '-p, --port <port>',\n 'Port to run server on',\n String(adapter.defaultPort)\n )\n .option('-H, --host <host>', 'Host to bind to', 'localhost')\n .option('-o, --open', 'Open browser automatically')\n .option('-c, --config <path>', 'Path to config file')\n .action(async (options: DevOptions) => {\n const spinner = ora(`Starting ${adapter.name.toUpperCase()} dev server...`).start();\n\n try {\n const config = await loadConfig(options.config);\n\n // CLI flag > adapter default > config file default\n const portSource = dev.getOptionValueSource('port');\n const hostSource = dev.getOptionValueSource('host');\n if (portSource === 'cli') {\n config.server.port = parseInt(options.port!, 10);\n } else if (config.server.port === 3003 && adapter.defaultPort !== 3003) {\n config.server.port = adapter.defaultPort;\n }\n if (hostSource === 'cli') {\n config.server.host = options.host!;\n }\n\n const { UnifiedServer } = await import('../server/unified-server.js');\n const server = new UnifiedServer(adapter, config);\n await server.start();\n\n const url = `http://${config.server.host}:${config.server.port}`;\n spinner.succeed('Server ready');\n\n console.log(\n boxen(\n chalk.bold(`${adapter.name.toUpperCase()} Dev Server\\n\\n`) +\n `${chalk.cyan('Local:')} ${chalk.bold(url)}\\n` +\n `${chalk.cyan('API:')} ${url}/api/${adapter.name}/generate\\n` +\n `${chalk.cyan('Health:')} ${url}/health\\n\\n` +\n chalk.gray('Press Ctrl+C to stop'),\n {\n padding: 1,\n borderColor: 'green',\n borderStyle: 'round',\n }\n )\n );\n\n // Open browser if requested\n if (options.open) {\n const { execFile } = await import('child_process');\n const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n execFile(cmd, [url]);\n }\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(chalk.yellow('\\nShutting down...'));\n await server.stop();\n process.exit(EXIT_CODES.OK);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n } catch (error: any) {\n spinner.fail('Failed to start dev server');\n formatError(error);\n process.exit(EXIT_CODES.FAIL);\n }\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","fs","path","path","fs","relative","path","config","fs","path","resolve","Type","Value","HTTPException","Hono","HTTPException","config","invalidateAllCaches","Hono","cleanupTypeBoxIds","readFileSync","existsSync","join","dirname","fileURLToPath","__dirname","Hono","HTTPException","Hono","Hono","logger","resolve","dirname","fileURLToPath","__filename","__dirname","config","path","existsSync","fs","extname","Command","chalk","path","config","readFileSync","resolve","basename","chalk","fs","path","config","defaultConfig","fs","path","config","relative","dirname","basename","config","resolve","readFileSync","basename","lines","chalk","Command","chalk","ora","resolve","relative","existsSync","readFileSync","statSync","resolve","join","glob","Command","ora","existsSync","resolve","relative","chalk","Command","chalk","ora","path","path","fs","fs","Command","ora","config","chalk","Command","chalk","ora","chalk","Command","chalk","ora","Command","writeFileSync","existsSync","resolve","join","ora","chalk","boxen","Command","chalk","resolve","existsSync","writeFileSync","join","ora","boxen","Command","chalk","ora","boxen","existsSync","readFile","resolve","pathToFileURL","config","resolve","existsSync","readFile","pathToFileURL","Command","ora","config","UnifiedServer","boxen","chalk","execFile","Command","chalk"]}
|