@eigenpal/docx-editor-agents 0.0.28 → 0.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridge.js +3 -1
- package/dist/bridge.js.map +1 -1
- package/dist/bridge.mjs +8 -0
- package/dist/bridge.mjs.map +1 -0
- package/dist/chunk-5D2V7VK3.js +976 -0
- package/dist/chunk-5D2V7VK3.js.map +1 -0
- package/dist/chunk-5E3CFYZ4.mjs +249 -0
- package/dist/chunk-5E3CFYZ4.mjs.map +1 -0
- package/dist/chunk-GACRQVPW.js +11680 -0
- package/dist/chunk-GACRQVPW.js.map +1 -0
- package/dist/chunk-OFUT6WUQ.mjs +969 -0
- package/dist/chunk-OFUT6WUQ.mjs.map +1 -0
- package/dist/chunk-Q2HHIVUL.js +266 -0
- package/dist/chunk-Q2HHIVUL.js.map +1 -0
- package/dist/chunk-R4MIGZEJ.mjs +11587 -0
- package/dist/chunk-R4MIGZEJ.mjs.map +1 -0
- package/dist/executor-6ZG2VUZS.mjs +3 -0
- package/dist/executor-6ZG2VUZS.mjs.map +1 -0
- package/dist/executor-ZRVQSXRT.js +16 -0
- package/dist/executor-ZRVQSXRT.js.map +1 -0
- package/dist/headless-O2RRWYCB.js +422 -0
- package/dist/headless-O2RRWYCB.js.map +1 -0
- package/dist/headless-UKRSG32U.mjs +5 -0
- package/dist/headless-UKRSG32U.mjs.map +1 -0
- package/dist/index.d.mts +2013 -0
- package/dist/index.d.ts +1776 -1
- package/dist/index.js +26 -19
- package/dist/index.js.map +1 -1
- package/dist/{index.cjs → index.mjs} +23 -26
- package/dist/index.mjs.map +1 -0
- package/dist/processTemplate-7M6KZ6GR.mjs +3 -0
- package/dist/processTemplate-7M6KZ6GR.mjs.map +1 -0
- package/dist/processTemplate-H4X2MH5R.js +54 -0
- package/dist/processTemplate-H4X2MH5R.js.map +1 -0
- package/package.json +11 -9
- package/dist/bridge.cjs +0 -10
- package/dist/bridge.cjs.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -238
- /package/dist/{bridge.d.cts → bridge.d.mts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/core-plugins/registry.ts","../../core/src/agent/executor.ts"],"names":[],"mappings":"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","file":"chunk-5D2V7VK3.js","sourcesContent":["/**\n * Plugin Registry\n *\n * Central registry for core plugins. Manages plugin lifecycle,\n * collects command handlers from all plugins, and aggregates\n * MCP tool definitions for the MCP server.\n */\n\nimport type {\n CorePlugin,\n CommandHandler,\n McpToolDefinition,\n PluginEvent,\n PluginEventListener,\n PluginRegistrationResult,\n PluginOptions,\n} from './types';\n\n// ============================================================================\n// PLUGIN REGISTRY\n// ============================================================================\n\n/**\n * Plugin Registry - manages core plugins\n *\n * @example\n * ```ts\n * import { pluginRegistry, docxtemplaterPlugin } from '@eigenpal/docx-editor/core-plugins';\n *\n * // Register plugins\n * pluginRegistry.register(docxtemplaterPlugin);\n *\n * // Get all MCP tools for MCP server\n * const tools = pluginRegistry.getMcpTools();\n *\n * // Get command handler for executor\n * const handler = pluginRegistry.getCommandHandler('insertTemplateVariable');\n * ```\n */\nexport class PluginRegistry {\n private plugins: Map<string, CorePlugin> = new Map();\n private commandHandlers: Map<string, { pluginId: string; handler: CommandHandler }> = new Map();\n private eventListeners: Set<PluginEventListener> = new Set();\n private initialized: Set<string> = new Set();\n\n // ==========================================================================\n // REGISTRATION\n // ==========================================================================\n\n /**\n * Register a plugin\n *\n * @param plugin - The plugin to register\n * @param options - Optional configuration\n * @returns Registration result\n */\n register(plugin: CorePlugin, options?: PluginOptions): PluginRegistrationResult {\n const warnings: string[] = [];\n\n // Validate plugin\n if (!plugin.id) {\n return { success: false, error: 'Plugin must have an id' };\n }\n\n if (this.plugins.has(plugin.id)) {\n return { success: false, error: `Plugin '${plugin.id}' is already registered` };\n }\n\n // Check dependencies\n if (plugin.dependencies) {\n for (const depId of plugin.dependencies) {\n if (!this.plugins.has(depId)) {\n return {\n success: false,\n error: `Plugin '${plugin.id}' requires '${depId}' which is not registered`,\n };\n }\n }\n }\n\n // Register command handlers\n if (plugin.commandHandlers) {\n for (const [commandType, handler] of Object.entries(plugin.commandHandlers)) {\n if (this.commandHandlers.has(commandType)) {\n const existing = this.commandHandlers.get(commandType)!;\n warnings.push(\n `Command '${commandType}' from '${plugin.id}' overrides handler from '${existing.pluginId}'`\n );\n }\n this.commandHandlers.set(commandType, { pluginId: plugin.id, handler });\n }\n }\n\n // Store plugin\n this.plugins.set(plugin.id, plugin);\n\n // Initialize if needed\n if (plugin.initialize && !this.initialized.has(plugin.id)) {\n try {\n const result = plugin.initialize();\n if (result instanceof Promise) {\n // Handle async initialization\n result\n .then(() => {\n this.initialized.add(plugin.id);\n })\n .catch((err) => {\n this.emit({ type: 'error', pluginId: plugin.id, error: err as Error });\n });\n } else {\n this.initialized.add(plugin.id);\n }\n } catch (err) {\n this.emit({ type: 'error', pluginId: plugin.id, error: err as Error });\n }\n }\n\n // Log if debug enabled\n if (options?.debug) {\n console.log(`[PluginRegistry] Registered plugin: ${plugin.id}`);\n }\n\n // Emit event\n this.emit({ type: 'registered', plugin });\n\n return {\n success: true,\n plugin,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n /**\n * Unregister a plugin\n *\n * @param pluginId - ID of the plugin to unregister\n * @returns Whether unregistration succeeded\n */\n unregister(pluginId: string): boolean {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) {\n return false;\n }\n\n // Check if other plugins depend on this one\n for (const [id, p] of this.plugins) {\n if (p.dependencies?.includes(pluginId)) {\n console.warn(`Cannot unregister '${pluginId}': '${id}' depends on it`);\n return false;\n }\n }\n\n // Remove command handlers\n for (const [commandType, { pluginId: pid }] of this.commandHandlers) {\n if (pid === pluginId) {\n this.commandHandlers.delete(commandType);\n }\n }\n\n // Call destroy if available\n if (plugin.destroy) {\n try {\n const result = plugin.destroy();\n if (result instanceof Promise) {\n result.catch((err) => {\n this.emit({ type: 'error', pluginId, error: err as Error });\n });\n }\n } catch (err) {\n this.emit({ type: 'error', pluginId, error: err as Error });\n }\n }\n\n // Remove plugin\n this.plugins.delete(pluginId);\n this.initialized.delete(pluginId);\n\n // Emit event\n this.emit({ type: 'unregistered', pluginId });\n\n return true;\n }\n\n // ==========================================================================\n // QUERIES\n // ==========================================================================\n\n /**\n * Get a registered plugin by ID\n *\n * @param id - Plugin ID\n * @returns The plugin or undefined\n */\n get(id: string): CorePlugin | undefined {\n return this.plugins.get(id);\n }\n\n /**\n * Get all registered plugins\n *\n * @returns Array of all plugins\n */\n getAll(): CorePlugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Check if a plugin is registered\n *\n * @param id - Plugin ID\n * @returns Whether the plugin is registered\n */\n has(id: string): boolean {\n return this.plugins.has(id);\n }\n\n /**\n * Get number of registered plugins\n */\n get size(): number {\n return this.plugins.size;\n }\n\n // ==========================================================================\n // COMMAND HANDLERS\n // ==========================================================================\n\n /**\n * Get a command handler for a command type\n *\n * @param commandType - The command type\n * @returns The handler or undefined\n */\n getCommandHandler(commandType: string): CommandHandler | undefined {\n const entry = this.commandHandlers.get(commandType);\n return entry?.handler;\n }\n\n /**\n * Get all registered command types\n *\n * @returns Array of command type strings\n */\n getCommandTypes(): string[] {\n return Array.from(this.commandHandlers.keys());\n }\n\n /**\n * Check if a command type has a handler\n *\n * @param commandType - The command type\n * @returns Whether a handler exists\n */\n hasCommandHandler(commandType: string): boolean {\n return this.commandHandlers.has(commandType);\n }\n\n // ==========================================================================\n // MCP TOOLS\n // ==========================================================================\n\n /**\n * Get all MCP tools from all registered plugins\n *\n * @returns Array of MCP tool definitions\n */\n getMcpTools(): McpToolDefinition[] {\n const tools: McpToolDefinition[] = [];\n\n for (const plugin of this.plugins.values()) {\n if (plugin.mcpTools) {\n tools.push(...plugin.mcpTools);\n }\n }\n\n return tools;\n }\n\n /**\n * Get MCP tools from a specific plugin\n *\n * @param pluginId - Plugin ID\n * @returns Array of MCP tool definitions\n */\n getMcpToolsForPlugin(pluginId: string): McpToolDefinition[] {\n const plugin = this.plugins.get(pluginId);\n return plugin?.mcpTools || [];\n }\n\n /**\n * Get an MCP tool by name\n *\n * @param toolName - Tool name\n * @returns The tool definition or undefined\n */\n getMcpTool(toolName: string): McpToolDefinition | undefined {\n for (const plugin of this.plugins.values()) {\n if (plugin.mcpTools) {\n const tool = plugin.mcpTools.find((t) => t.name === toolName);\n if (tool) return tool;\n }\n }\n return undefined;\n }\n\n // ==========================================================================\n // EVENTS\n // ==========================================================================\n\n /**\n * Add an event listener\n *\n * @param listener - Event listener function\n */\n addEventListener(listener: PluginEventListener): void {\n this.eventListeners.add(listener);\n }\n\n /**\n * Remove an event listener\n *\n * @param listener - Event listener function\n */\n removeEventListener(listener: PluginEventListener): void {\n this.eventListeners.delete(listener);\n }\n\n /**\n * Emit an event to all listeners\n */\n private emit(event: PluginEvent): void {\n for (const listener of this.eventListeners) {\n try {\n listener(event);\n } catch (err) {\n console.error('[PluginRegistry] Event listener error:', err);\n }\n }\n }\n\n // ==========================================================================\n // UTILITIES\n // ==========================================================================\n\n /**\n * Clear all registered plugins\n *\n * Useful for testing or resetting state.\n */\n clear(): void {\n // Call destroy on all plugins\n for (const plugin of this.plugins.values()) {\n if (plugin.destroy) {\n try {\n plugin.destroy();\n } catch {\n // Ignore errors during clear\n }\n }\n }\n\n this.plugins.clear();\n this.commandHandlers.clear();\n this.initialized.clear();\n }\n\n /**\n * Get registry state for debugging\n */\n getDebugInfo(): {\n plugins: string[];\n commandTypes: string[];\n mcpTools: string[];\n initialized: string[];\n } {\n return {\n plugins: Array.from(this.plugins.keys()),\n commandTypes: Array.from(this.commandHandlers.keys()),\n mcpTools: this.getMcpTools().map((t) => t.name),\n initialized: Array.from(this.initialized),\n };\n }\n}\n\n// ============================================================================\n// GLOBAL INSTANCE\n// ============================================================================\n\n/**\n * Global plugin registry instance\n *\n * Use this for registering plugins and accessing their capabilities.\n */\nexport const pluginRegistry = new PluginRegistry();\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Register multiple plugins at once\n *\n * @param plugins - Array of plugins to register\n * @returns Array of registration results\n */\nexport function registerPlugins(\n plugins: CorePlugin[],\n options?: PluginOptions\n): PluginRegistrationResult[] {\n return plugins.map((plugin) => pluginRegistry.register(plugin, options));\n}\n\n/**\n * Create a plugin registration helper with options pre-configured\n *\n * @param options - Default options for plugin registration\n * @returns Registration function\n */\nexport function createPluginRegistrar(options: PluginOptions) {\n return (plugin: CorePlugin) => pluginRegistry.register(plugin, options);\n}\n","/**\n * Command Executor\n *\n * Executes agent commands on a document immutably:\n * - Handles all command types from AgentCommand\n * - Preserves surrounding formatting\n * - Returns new document (immutable updates)\n */\n\nimport type {\n Document,\n DocumentBody,\n Paragraph,\n Run,\n TextContent,\n ParagraphContent,\n BlockContent,\n Table,\n TableRow,\n TableCell,\n TextFormatting,\n Image,\n Hyperlink,\n} from '../types/document';\n\nimport type {\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n FormatParagraphCommand,\n ApplyStyleCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n RemoveHyperlinkCommand,\n InsertParagraphBreakCommand,\n MergeParagraphsCommand,\n SplitParagraphCommand,\n SetVariableCommand,\n ApplyVariablesCommand,\n} from '../types/agentApi';\n\nimport { pluginRegistry } from '../core-plugins/registry';\n\n// ============================================================================\n// MAIN EXECUTOR\n// ============================================================================\n\n/**\n * Execute an agent command on a document\n * Returns a new document with the command applied (immutable)\n *\n * Dispatch order:\n * 1. Try plugin handlers first (allows plugins to override built-in commands)\n * 2. Fall back to built-in handlers\n *\n * @param doc - The document to modify\n * @param command - The command to execute\n * @returns New document with command applied\n */\nexport function executeCommand(doc: Document, command: AgentCommand): Document {\n // Try plugin handlers first\n const pluginHandler = pluginRegistry.getCommandHandler(command.type);\n if (pluginHandler) {\n // Plugin commands use a more flexible type\n return pluginHandler(doc, command as unknown as import('../core-plugins/types').PluginCommand);\n }\n\n // Fall back to built-in handlers\n switch (command.type) {\n case 'insertText':\n return executeInsertText(doc, command);\n case 'replaceText':\n return executeReplaceText(doc, command);\n case 'deleteText':\n return executeDeleteText(doc, command);\n case 'formatText':\n return executeFormatText(doc, command);\n case 'formatParagraph':\n return executeFormatParagraph(doc, command);\n case 'applyStyle':\n return executeApplyStyle(doc, command);\n case 'insertTable':\n return executeInsertTable(doc, command);\n case 'insertImage':\n return executeInsertImage(doc, command);\n case 'insertHyperlink':\n return executeInsertHyperlink(doc, command);\n case 'removeHyperlink':\n return executeRemoveHyperlink(doc, command);\n case 'insertParagraphBreak':\n return executeInsertParagraphBreak(doc, command);\n case 'mergeParagraphs':\n return executeMergeParagraphs(doc, command);\n case 'splitParagraph':\n return executeSplitParagraph(doc, command);\n case 'setVariable':\n return executeSetVariable(doc, command);\n case 'applyVariables':\n return executeApplyVariables(doc, command);\n default:\n // Exhaustive check - should never happen with proper types\n const _exhaustive: never = command;\n throw new Error(`Unknown command type: ${(_exhaustive as AgentCommand).type}`);\n }\n}\n\n/**\n * Execute multiple commands in sequence\n *\n * @param doc - The document to modify\n * @param commands - Commands to execute in order\n * @returns New document with all commands applied\n */\nexport function executeCommands(doc: Document, commands: AgentCommand[]): Document {\n return commands.reduce((currentDoc, command) => executeCommand(currentDoc, command), doc);\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Deep clone a document for immutable updates\n */\nfunction cloneDocument(doc: Document): Document {\n return JSON.parse(JSON.stringify(doc));\n}\n\n/**\n * Get the block index for a paragraph index\n */\nfunction getBlockIndexForParagraph(body: DocumentBody, paragraphIndex: number): number {\n let currentParagraphIndex = 0;\n for (let i = 0; i < body.content.length; i++) {\n if (body.content[i].type === 'paragraph') {\n if (currentParagraphIndex === paragraphIndex) {\n return i;\n }\n currentParagraphIndex++;\n }\n }\n return -1;\n}\n\n/**\n * Get plain text from a paragraph\n */\nfunction getParagraphText(paragraph: Paragraph): string {\n let text = '';\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n for (const content of item.content) {\n if (content.type === 'text') {\n text += content.text;\n }\n }\n } else if (item.type === 'hyperlink') {\n for (const child of item.children) {\n if (child.type === 'run') {\n for (const content of child.content) {\n if (content.type === 'text') {\n text += content.text;\n }\n }\n }\n }\n }\n }\n return text;\n}\n\n/**\n * Create a new run with text\n */\nfunction createTextRun(text: string, formatting?: TextFormatting): Run {\n return {\n type: 'run',\n formatting,\n content: [\n {\n type: 'text',\n text,\n },\n ],\n };\n}\n\n/**\n * Insert text at a specific offset within a paragraph\n * Returns new paragraph content\n */\nfunction insertTextAtOffset(\n paragraph: Paragraph,\n offset: number,\n text: string,\n formatting?: TextFormatting\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n let inserted = false;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n if (!inserted && offset >= runStart && offset <= runEnd) {\n // Insert within this run\n const insertPos = offset - runStart;\n\n if (insertPos > 0) {\n // Text before insertion point\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, insertPos) }],\n });\n }\n\n // New text\n newContent.push(createTextRun(text, formatting || item.formatting));\n\n if (insertPos < runText.length) {\n // Text after insertion point\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(insertPos) }],\n });\n }\n\n inserted = true;\n } else {\n newContent.push(item);\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n // If not inserted yet, append at the end\n if (!inserted) {\n newContent.push(createTextRun(text, formatting));\n }\n\n return newContent;\n}\n\n/**\n * Delete text in a range within a single paragraph\n */\nfunction deleteTextInParagraph(\n paragraph: Paragraph,\n startOffset: number,\n endOffset: number\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n // Check if run overlaps with deletion range\n if (runEnd <= startOffset || runStart >= endOffset) {\n // No overlap, keep entire run\n newContent.push(item);\n } else {\n // Partial overlap\n let newText = '';\n\n if (runStart < startOffset) {\n // Keep text before start\n newText += runText.slice(0, startOffset - runStart);\n }\n\n if (runEnd > endOffset) {\n // Keep text after end\n newText += runText.slice(endOffset - runStart);\n }\n\n if (newText.length > 0) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: newText }],\n });\n }\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n return newContent;\n}\n\n/**\n * Apply formatting to text in a range within a paragraph\n */\nfunction applyFormattingInParagraph(\n paragraph: Paragraph,\n startOffset: number,\n endOffset: number,\n formatting: Partial<TextFormatting>\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n // Check if run overlaps with formatting range\n if (runEnd <= startOffset || runStart >= endOffset) {\n // No overlap, keep entire run unchanged\n newContent.push(item);\n } else if (runStart >= startOffset && runEnd <= endOffset) {\n // Entire run is within range, apply formatting\n newContent.push({\n ...item,\n formatting: { ...item.formatting, ...formatting },\n });\n } else {\n // Partial overlap - need to split run\n const overlapStart = Math.max(startOffset, runStart);\n const overlapEnd = Math.min(endOffset, runEnd);\n\n // Text before overlap\n if (runStart < overlapStart) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, overlapStart - runStart) }],\n });\n }\n\n // Overlapping text with formatting\n newContent.push({\n ...item,\n formatting: { ...item.formatting, ...formatting },\n content: [\n {\n type: 'text',\n text: runText.slice(overlapStart - runStart, overlapEnd - runStart),\n },\n ],\n });\n\n // Text after overlap\n if (runEnd > overlapEnd) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(overlapEnd - runStart) }],\n });\n }\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n return newContent;\n}\n\n// ============================================================================\n// COMMAND IMPLEMENTATIONS\n// ============================================================================\n\n/**\n * Insert text at a position\n */\nfunction executeInsertText(doc: Document, command: InsertTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = insertTextAtOffset(\n paragraph,\n command.position.offset,\n command.text,\n command.formatting\n );\n\n return newDoc;\n}\n\n/**\n * Replace text in a range\n */\nfunction executeReplaceText(doc: Document, command: ReplaceTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n\n // Delete the range first\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n\n // Then insert the new text\n paragraph.content = insertTextAtOffset(\n paragraph,\n start.offset,\n command.text,\n command.formatting\n );\n } else {\n // Multiple paragraphs - simplify by deleting and inserting\n // Delete from start to end of first paragraph\n const startBlockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n const startParagraph = body.content[startBlockIndex] as Paragraph;\n const startText = getParagraphText(startParagraph);\n\n startParagraph.content = deleteTextInParagraph(startParagraph, start.offset, startText.length);\n startParagraph.content = insertTextAtOffset(\n startParagraph,\n start.offset,\n command.text,\n command.formatting\n );\n\n // Delete intermediate paragraphs and beginning of last paragraph\n const paragraphsToRemove: number[] = [];\n for (let i = start.paragraphIndex + 1; i <= end.paragraphIndex; i++) {\n paragraphsToRemove.push(getBlockIndexForParagraph(body, i));\n }\n\n // Remove in reverse order to preserve indices\n for (let i = paragraphsToRemove.length - 1; i >= 0; i--) {\n if (paragraphsToRemove[i] !== -1) {\n body.content.splice(paragraphsToRemove[i], 1);\n }\n }\n }\n\n return newDoc;\n}\n\n/**\n * Delete text in a range\n */\nfunction executeDeleteText(doc: Document, command: DeleteTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n } else {\n // Multiple paragraphs\n // Truncate first paragraph\n const startBlockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n const startParagraph = body.content[startBlockIndex] as Paragraph;\n const startText = getParagraphText(startParagraph);\n startParagraph.content = deleteTextInParagraph(startParagraph, start.offset, startText.length);\n\n // Delete intermediate paragraphs and truncate last\n const endBlockIndex = getBlockIndexForParagraph(body, end.paragraphIndex);\n const endParagraph = body.content[endBlockIndex] as Paragraph;\n endParagraph.content = deleteTextInParagraph(endParagraph, 0, end.offset);\n\n // Merge last paragraph content into first\n startParagraph.content.push(...endParagraph.content);\n\n // Remove paragraphs between start and end (inclusive of end)\n const indicesToRemove: number[] = [];\n for (let i = start.paragraphIndex + 1; i <= end.paragraphIndex; i++) {\n indicesToRemove.push(getBlockIndexForParagraph(body, i));\n }\n\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n if (indicesToRemove[i] !== -1) {\n body.content.splice(indicesToRemove[i], 1);\n }\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply formatting to a range\n */\nfunction executeFormatText(doc: Document, command: FormatTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = applyFormattingInParagraph(\n paragraph,\n start.offset,\n end.offset,\n command.formatting\n );\n } else {\n // Multiple paragraphs\n for (let i = start.paragraphIndex; i <= end.paragraphIndex; i++) {\n const blockIndex = getBlockIndexForParagraph(body, i);\n if (blockIndex === -1) continue;\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n let startOffset = 0;\n let endOffset = paragraphText.length;\n\n if (i === start.paragraphIndex) {\n startOffset = start.offset;\n }\n if (i === end.paragraphIndex) {\n endOffset = end.offset;\n }\n\n paragraph.content = applyFormattingInParagraph(\n paragraph,\n startOffset,\n endOffset,\n command.formatting\n );\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply paragraph formatting\n */\nfunction executeFormatParagraph(doc: Document, command: FormatParagraphCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.formatting = { ...paragraph.formatting, ...command.formatting };\n\n // Handle listRendering when numPr changes\n if ('numPr' in command.formatting) {\n const numPr = command.formatting.numPr;\n if (numPr && numPr.numId !== undefined && numPr.numId !== 0) {\n // Setting a list - compute listRendering\n const ilvl = numPr.ilvl ?? 0;\n const isBullet = numPr.numId === 1; // numId 1 is typically bullets, 2 is numbered\n\n // Try to get marker from numbering definitions if available\n let marker = isBullet ? '•' : `${1}.`; // Default markers\n\n if (newDoc.package.numbering) {\n const num = newDoc.package.numbering.nums.find((n) => n.numId === numPr.numId);\n if (num) {\n const abstractNum = newDoc.package.numbering.abstractNums.find(\n (a) => a.abstractNumId === num.abstractNumId\n );\n if (abstractNum) {\n const level = abstractNum.levels.find((l) => l.ilvl === ilvl);\n if (level) {\n marker = level.lvlText || marker;\n }\n }\n }\n }\n\n paragraph.listRendering = {\n level: ilvl,\n numId: numPr.numId,\n marker,\n isBullet,\n };\n } else {\n // Removing list - clear listRendering\n delete paragraph.listRendering;\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply a named style to a paragraph\n */\nfunction executeApplyStyle(doc: Document, command: ApplyStyleCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.formatting = {\n ...paragraph.formatting,\n styleId: command.styleId,\n };\n\n return newDoc;\n}\n\n/**\n * Insert a table at a position\n */\nfunction executeInsertTable(doc: Document, command: InsertTableCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n // Create table structure\n const rows: TableRow[] = [];\n\n for (let r = 0; r < command.rows; r++) {\n const cells: TableCell[] = [];\n\n for (let c = 0; c < command.columns; c++) {\n const cellText = command.data?.[r]?.[c] || '';\n cells.push({\n type: 'tableCell',\n content: [\n {\n type: 'paragraph',\n content: cellText ? [createTextRun(cellText)] : [],\n },\n ],\n });\n }\n\n rows.push({\n type: 'tableRow',\n formatting: r === 0 && command.hasHeader ? { header: true } : undefined,\n cells,\n });\n }\n\n const table: Table = {\n type: 'table',\n rows,\n };\n\n // Insert table after the specified paragraph\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n body.content.push(table);\n } else {\n body.content.splice(blockIndex + 1, 0, table);\n }\n\n return newDoc;\n}\n\n/**\n * Insert an image at a position\n */\nfunction executeInsertImage(doc: Document, command: InsertImageCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n\n // Create image\n const image: Image = {\n type: 'image',\n rId: `rId_img_${Date.now()}`,\n src: command.src,\n alt: command.alt,\n size: {\n width: (command.width || 100) * 914400, // Convert pixels to EMU\n height: (command.height || 100) * 914400,\n },\n wrap: { type: 'inline' },\n };\n\n // Create run with drawing content\n const imageRun: Run = {\n type: 'run',\n content: [\n {\n type: 'drawing',\n image,\n },\n ],\n };\n\n // Insert image run at offset\n const newContent = insertTextAtOffset(paragraph, command.position.offset, '', undefined);\n // Find insertion point and add image\n let inserted = false;\n let currentOffset = 0;\n\n for (let i = 0; i < newContent.length; i++) {\n const item = newContent[i];\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n currentOffset += runText.length;\n\n if (!inserted && currentOffset >= command.position.offset) {\n newContent.splice(i + 1, 0, imageRun);\n inserted = true;\n break;\n }\n }\n }\n\n if (!inserted) {\n newContent.push(imageRun);\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Insert a hyperlink at a range\n */\nfunction executeInsertHyperlink(doc: Document, command: InsertHyperlinkCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex !== end.paragraphIndex) {\n throw new Error('Hyperlinks cannot span multiple paragraphs');\n }\n\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n // Get the text that will become the link\n const linkText = command.displayText || paragraphText.slice(start.offset, end.offset);\n\n // Delete the original text\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n\n // Create hyperlink\n const hyperlink: Hyperlink = {\n type: 'hyperlink',\n href: command.url,\n tooltip: command.tooltip,\n children: [createTextRun(linkText)],\n };\n\n // Insert hyperlink at position\n let inserted = false;\n let currentOffset = 0;\n const newContent: ParagraphContent[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runEnd = currentOffset + runText.length;\n\n if (!inserted && currentOffset <= start.offset && start.offset <= runEnd) {\n const insertPos = start.offset - currentOffset;\n\n if (insertPos > 0) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, insertPos) }],\n });\n }\n\n newContent.push(hyperlink);\n\n if (insertPos < runText.length) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(insertPos) }],\n });\n }\n\n inserted = true;\n } else {\n newContent.push(item);\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n if (!inserted) {\n newContent.push(hyperlink);\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Remove a hyperlink but keep the text\n */\nfunction executeRemoveHyperlink(doc: Document, command: RemoveHyperlinkCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start } = command.range;\n\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const newContent: ParagraphContent[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'hyperlink') {\n // Convert hyperlink children to regular runs\n for (const child of item.children) {\n if (child.type === 'run') {\n newContent.push(child);\n }\n }\n } else {\n newContent.push(item);\n }\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Insert a paragraph break\n */\nfunction executeInsertParagraphBreak(\n doc: Document,\n command: InsertParagraphBreakCommand\n): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n // Split the paragraph at the offset\n const beforeContent = deleteTextInParagraph(\n { ...paragraph, content: [...paragraph.content] },\n command.position.offset,\n paragraphText.length\n );\n\n const afterContent = deleteTextInParagraph(\n { ...paragraph, content: [...paragraph.content] },\n 0,\n command.position.offset\n );\n\n // Update current paragraph with content before break\n paragraph.content = beforeContent;\n\n // Create new paragraph with content after break\n const newParagraph: Paragraph = {\n type: 'paragraph',\n formatting: paragraph.formatting,\n content: afterContent,\n };\n\n // Insert new paragraph after current one\n body.content.splice(blockIndex + 1, 0, newParagraph);\n\n return newDoc;\n}\n\n/**\n * Merge paragraphs\n */\nfunction executeMergeParagraphs(doc: Document, command: MergeParagraphsCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const startBlockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (startBlockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const baseParagraph = body.content[startBlockIndex] as Paragraph;\n\n // Collect all content from paragraphs to merge\n const indicesToRemove: number[] = [];\n\n for (let i = 1; i <= command.count; i++) {\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex + i);\n if (blockIndex !== -1) {\n const para = body.content[blockIndex] as Paragraph;\n baseParagraph.content.push(...para.content);\n indicesToRemove.push(blockIndex);\n }\n }\n\n // Remove merged paragraphs in reverse order\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n body.content.splice(indicesToRemove[i], 1);\n }\n\n return newDoc;\n}\n\n/**\n * Split a paragraph at a position\n */\nfunction executeSplitParagraph(doc: Document, command: SplitParagraphCommand): Document {\n // Split is the same as insert paragraph break\n return executeInsertParagraphBreak(doc, {\n type: 'insertParagraphBreak',\n position: command.position,\n });\n}\n\n/**\n * Set a template variable value\n */\nfunction executeSetVariable(doc: Document, command: SetVariableCommand): Document {\n const newDoc = cloneDocument(doc);\n\n // Store variable in document for later application\n if (!newDoc.templateVariables) {\n newDoc.templateVariables = [];\n }\n\n if (!newDoc.templateVariables.includes(command.name)) {\n newDoc.templateVariables.push(command.name);\n }\n\n // Note: Actual variable substitution happens in applyVariables\n return newDoc;\n}\n\n/**\n * Apply all template variables\n */\nfunction executeApplyVariables(doc: Document, command: ApplyVariablesCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n // Replace {variable} patterns in all text content\n function replaceVariablesInRun(run: Run): void {\n for (const content of run.content) {\n if (content.type === 'text') {\n for (const [name, value] of Object.entries(command.values)) {\n const pattern = new RegExp(`\\\\{${name}\\\\}`, 'g');\n content.text = content.text.replace(pattern, value);\n }\n }\n }\n }\n\n function replaceVariablesInParagraph(paragraph: Paragraph): void {\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n replaceVariablesInRun(item);\n } else if (item.type === 'hyperlink') {\n for (const child of item.children) {\n if (child.type === 'run') {\n replaceVariablesInRun(child);\n }\n }\n }\n }\n }\n\n function replaceVariablesInBlock(block: BlockContent): void {\n if (block.type === 'paragraph') {\n replaceVariablesInParagraph(block);\n } else if (block.type === 'table') {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const cellBlock of cell.content) {\n replaceVariablesInBlock(cellBlock);\n }\n }\n }\n }\n }\n\n for (const block of body.content) {\n replaceVariablesInBlock(block);\n }\n\n return newDoc;\n}\n"]}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import PizZip from 'pizzip';
|
|
2
|
+
import Docxtemplater from 'docxtemplater';
|
|
3
|
+
|
|
4
|
+
// ../core/src/utils/processTemplate.ts
|
|
5
|
+
function processTemplate(buffer, variables, options = {}) {
|
|
6
|
+
const result = processTemplateDetailed(buffer, variables, options);
|
|
7
|
+
return result.buffer;
|
|
8
|
+
}
|
|
9
|
+
function processTemplateDetailed(buffer, variables, options = {}) {
|
|
10
|
+
const { nullGetter = "keep", linebreaks = true, delimiters } = options;
|
|
11
|
+
const warnings = [];
|
|
12
|
+
const replacedVariables = [];
|
|
13
|
+
const unreplacedVariables = [];
|
|
14
|
+
try {
|
|
15
|
+
const zip = new PizZip(buffer);
|
|
16
|
+
const doc = new Docxtemplater(zip, {
|
|
17
|
+
paragraphLoop: true,
|
|
18
|
+
linebreaks,
|
|
19
|
+
// Handle undefined tags based on option
|
|
20
|
+
nullGetter: (part) => {
|
|
21
|
+
const varName = part.value || "";
|
|
22
|
+
if (nullGetter === "error") {
|
|
23
|
+
throw new Error(`Undefined variable: ${varName}`);
|
|
24
|
+
}
|
|
25
|
+
if (nullGetter === "empty") {
|
|
26
|
+
unreplacedVariables.push(varName);
|
|
27
|
+
return "";
|
|
28
|
+
}
|
|
29
|
+
unreplacedVariables.push(varName);
|
|
30
|
+
return `{${varName}}`;
|
|
31
|
+
},
|
|
32
|
+
// Custom delimiters if specified (docxtemplater uses single braces by default)
|
|
33
|
+
delimiters: delimiters ? { start: delimiters.start || "{", end: delimiters.end || "}" } : void 0
|
|
34
|
+
});
|
|
35
|
+
Object.keys(variables).forEach((key) => {
|
|
36
|
+
if (variables[key] !== void 0 && variables[key] !== null) {
|
|
37
|
+
replacedVariables.push(key);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
doc.setData(variables);
|
|
41
|
+
doc.render();
|
|
42
|
+
const outputBuffer = doc.getZip().generate({
|
|
43
|
+
type: "arraybuffer",
|
|
44
|
+
compression: "DEFLATE",
|
|
45
|
+
compressionOptions: { level: 6 }
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
buffer: outputBuffer,
|
|
49
|
+
replacedVariables,
|
|
50
|
+
unreplacedVariables,
|
|
51
|
+
warnings
|
|
52
|
+
};
|
|
53
|
+
} catch (error) {
|
|
54
|
+
throw formatTemplateError(error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function processTemplateAsBlob(buffer, variables, options = {}) {
|
|
58
|
+
const resultBuffer = processTemplate(buffer, variables, options);
|
|
59
|
+
return new Blob([resultBuffer], {
|
|
60
|
+
type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function processTemplateAndDownload(buffer, variables, filename = "document", options = {}) {
|
|
64
|
+
const blob = processTemplateAsBlob(buffer, variables, options);
|
|
65
|
+
downloadBlob(blob, `${filename}.docx`);
|
|
66
|
+
}
|
|
67
|
+
function getTemplateTags(buffer) {
|
|
68
|
+
try {
|
|
69
|
+
const zip = new PizZip(buffer);
|
|
70
|
+
const doc = new Docxtemplater(zip, {
|
|
71
|
+
paragraphLoop: true,
|
|
72
|
+
linebreaks: true
|
|
73
|
+
});
|
|
74
|
+
const fullText = doc.getFullText();
|
|
75
|
+
return extractTagsFromText(fullText);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
throw formatTemplateError(error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function validateTemplate(buffer) {
|
|
81
|
+
const errors = [];
|
|
82
|
+
let tags = [];
|
|
83
|
+
try {
|
|
84
|
+
const zip = new PizZip(buffer);
|
|
85
|
+
const doc = new Docxtemplater(zip, {
|
|
86
|
+
paragraphLoop: true,
|
|
87
|
+
linebreaks: true
|
|
88
|
+
});
|
|
89
|
+
const fullText = doc.getFullText();
|
|
90
|
+
tags = extractTagsFromText(fullText);
|
|
91
|
+
const unclosedTags = findUnclosedTags(fullText);
|
|
92
|
+
for (const tag of unclosedTags) {
|
|
93
|
+
errors.push({
|
|
94
|
+
message: `Unclosed tag: ${tag}`,
|
|
95
|
+
variable: tag,
|
|
96
|
+
type: "parse"
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
valid: errors.length === 0,
|
|
101
|
+
errors,
|
|
102
|
+
tags
|
|
103
|
+
};
|
|
104
|
+
} catch (error) {
|
|
105
|
+
errors.push(formatTemplateError(error));
|
|
106
|
+
return {
|
|
107
|
+
valid: false,
|
|
108
|
+
errors,
|
|
109
|
+
tags
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function getMissingVariables(tags, variables) {
|
|
114
|
+
return tags.filter(
|
|
115
|
+
(tag) => !(tag in variables) || variables[tag] === void 0 || variables[tag] === null
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
function previewTemplate(buffer, variables) {
|
|
119
|
+
try {
|
|
120
|
+
const zip = new PizZip(buffer);
|
|
121
|
+
const doc = new Docxtemplater(zip, {
|
|
122
|
+
paragraphLoop: true,
|
|
123
|
+
linebreaks: true,
|
|
124
|
+
nullGetter: (part) => {
|
|
125
|
+
const varName = part.value || "";
|
|
126
|
+
return `[${varName}]`;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
doc.setData(variables);
|
|
130
|
+
doc.render();
|
|
131
|
+
return doc.getFullText();
|
|
132
|
+
} catch (error) {
|
|
133
|
+
throw formatTemplateError(error);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function extractTagsFromText(text) {
|
|
137
|
+
const tags = [];
|
|
138
|
+
const regex = /\{([^{}]+)\}/g;
|
|
139
|
+
let match;
|
|
140
|
+
while ((match = regex.exec(text)) !== null) {
|
|
141
|
+
const tag = match[1].trim();
|
|
142
|
+
if (tag && !tags.includes(tag)) {
|
|
143
|
+
tags.push(tag);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return tags.sort();
|
|
147
|
+
}
|
|
148
|
+
function findUnclosedTags(text) {
|
|
149
|
+
const unclosed = [];
|
|
150
|
+
let depth = 0;
|
|
151
|
+
let currentTag = "";
|
|
152
|
+
for (const char of text) {
|
|
153
|
+
if (char === "{") {
|
|
154
|
+
depth++;
|
|
155
|
+
currentTag = "";
|
|
156
|
+
} else if (char === "}") {
|
|
157
|
+
depth--;
|
|
158
|
+
if (depth < 0) {
|
|
159
|
+
depth = 0;
|
|
160
|
+
}
|
|
161
|
+
} else if (depth > 0) {
|
|
162
|
+
currentTag += char;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (depth > 0 && currentTag.trim()) {
|
|
166
|
+
unclosed.push(currentTag.trim());
|
|
167
|
+
}
|
|
168
|
+
return unclosed;
|
|
169
|
+
}
|
|
170
|
+
function isDocxTemplaterError(error) {
|
|
171
|
+
return "properties" in error && typeof error.properties === "object";
|
|
172
|
+
}
|
|
173
|
+
function formatTemplateError(error) {
|
|
174
|
+
if (error instanceof Error) {
|
|
175
|
+
if (isDocxTemplaterError(error) && error.properties?.errors) {
|
|
176
|
+
const firstError = error.properties.errors[0];
|
|
177
|
+
return {
|
|
178
|
+
message: firstError?.message || "Template processing error",
|
|
179
|
+
variable: firstError?.properties?.tag,
|
|
180
|
+
type: "render",
|
|
181
|
+
originalError: error
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (error.message.includes("undefined")) {
|
|
185
|
+
const match = error.message.match(/undefined (?:variable|tag):\s*(\S+)/i);
|
|
186
|
+
return {
|
|
187
|
+
message: error.message,
|
|
188
|
+
variable: match ? match[1] : void 0,
|
|
189
|
+
type: "undefined",
|
|
190
|
+
originalError: error
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (error.message.includes("parse") || error.message.includes("unclosed") || error.message.includes("syntax")) {
|
|
194
|
+
return {
|
|
195
|
+
message: error.message,
|
|
196
|
+
type: "parse",
|
|
197
|
+
originalError: error
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
message: error.message,
|
|
202
|
+
type: "unknown",
|
|
203
|
+
originalError: error
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
message: String(error),
|
|
208
|
+
type: "unknown"
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function downloadBlob(blob, filename) {
|
|
212
|
+
const url = URL.createObjectURL(blob);
|
|
213
|
+
const link = document.createElement("a");
|
|
214
|
+
link.href = url;
|
|
215
|
+
link.download = filename;
|
|
216
|
+
document.body.appendChild(link);
|
|
217
|
+
link.click();
|
|
218
|
+
document.body.removeChild(link);
|
|
219
|
+
URL.revokeObjectURL(url);
|
|
220
|
+
}
|
|
221
|
+
function processTemplateAdvanced(buffer, data, options = {}) {
|
|
222
|
+
const { linebreaks = true, delimiters } = options;
|
|
223
|
+
try {
|
|
224
|
+
const zip = new PizZip(buffer);
|
|
225
|
+
const doc = new Docxtemplater(zip, {
|
|
226
|
+
paragraphLoop: true,
|
|
227
|
+
linebreaks,
|
|
228
|
+
delimiters: delimiters ? { start: delimiters.start || "{", end: delimiters.end || "}" } : void 0
|
|
229
|
+
});
|
|
230
|
+
doc.setData(data);
|
|
231
|
+
doc.render();
|
|
232
|
+
return doc.getZip().generate({
|
|
233
|
+
type: "arraybuffer",
|
|
234
|
+
compression: "DEFLATE"
|
|
235
|
+
});
|
|
236
|
+
} catch (error) {
|
|
237
|
+
throw formatTemplateError(error);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function createTemplateProcessor(defaultOptions = {}) {
|
|
241
|
+
return (buffer, variables) => {
|
|
242
|
+
return processTemplate(buffer, variables, defaultOptions);
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
var processTemplate_default = processTemplate;
|
|
246
|
+
|
|
247
|
+
export { createTemplateProcessor, getMissingVariables, getTemplateTags, previewTemplate, processTemplate, processTemplateAdvanced, processTemplateAndDownload, processTemplateAsBlob, processTemplateDetailed, processTemplate_default, validateTemplate };
|
|
248
|
+
//# sourceMappingURL=chunk-5E3CFYZ4.mjs.map
|
|
249
|
+
//# sourceMappingURL=chunk-5E3CFYZ4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/utils/processTemplate.ts"],"names":[],"mappings":";;;;AAyEO,SAAS,eAAA,CACd,MAAA,EACA,SAAA,EACA,OAAA,GAAkC,EAAC,EACtB;AACb,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AACjE,EAAA,OAAO,MAAA,CAAO,MAAA;AAChB;AAUO,SAAS,uBAAA,CACd,MAAA,EACA,SAAA,EACA,OAAA,GAAkC,EAAC,EACZ;AACvB,EAAA,MAAM,EAAE,UAAA,GAAa,MAAA,EAAQ,UAAA,GAAa,IAAA,EAAM,YAAW,GAAI,OAAA;AAE/D,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,oBAA8B,EAAC;AACrC,EAAA,MAAM,sBAAgC,EAAC;AAEvC,EAAA,IAAI;AAEF,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,MAAM,CAAA;AAG7B,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,GAAA,EAAK;AAAA,MACjC,aAAA,EAAe,IAAA;AAAA,MACf,UAAA;AAAA;AAAA,MAEA,UAAA,EAAY,CAAC,IAAA,KAA8C;AACzD,QAAA,MAAM,OAAA,GAAU,KAAK,KAAA,IAAS,EAAA;AAE9B,QAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAE,CAAA;AAAA,QAClD;AAEA,QAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,UAAA,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAChC,UAAA,OAAO,EAAA;AAAA,QACT;AAGA,QAAA,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAChC,QAAA,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AAAA,MACpB,CAAA;AAAA;AAAA,MAEA,UAAA,EAAY,UAAA,GACR,EAAE,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,GAAA,EAAK,GAAA,EAAK,UAAA,CAAW,GAAA,IAAO,GAAA,EAAI,GAC7D,KAAA;AAAA,KACL,CAAA;AAGD,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACtC,MAAA,IAAI,UAAU,GAAG,CAAA,KAAM,UAAa,SAAA,CAAU,GAAG,MAAM,IAAA,EAAM;AAC3D,QAAA,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAAA,MAC5B;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,GAAA,CAAI,QAAQ,SAAS,CAAA;AAGrB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,MAAA,EAAO,CAAE,QAAA,CAAS;AAAA,MACzC,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa,SAAA;AAAA,MACb,kBAAA,EAAoB,EAAE,KAAA,EAAO,CAAA;AAAE,KAChC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,YAAA;AAAA,MACR,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,oBAAoB,KAAK,CAAA;AAAA,EACjC;AACF;AAUO,SAAS,qBAAA,CACd,MAAA,EACA,SAAA,EACA,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AAC/D,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,YAAY,CAAA,EAAG;AAAA,IAC9B,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAUO,SAAS,2BACd,MAAA,EACA,SAAA,EACA,WAAmB,UAAA,EACnB,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AAC7D,EAAA,YAAA,CAAa,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAO,CAAA;AACvC;AAYO,SAAS,gBAAgB,MAAA,EAA+B;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,MAAM,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,GAAA,EAAK;AAAA,MACjC,aAAA,EAAe,IAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACb,CAAA;AAGD,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,IAAA,OAAO,oBAAoB,QAAQ,CAAA;AAAA,EACrC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,oBAAoB,KAAK,CAAA;AAAA,EACjC;AACF;AAQO,SAAS,iBAAiB,MAAA,EAI/B;AACA,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,IAAI,OAAiB,EAAC;AAEtB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,MAAM,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,GAAA,EAAK;AAAA,MACjC,aAAA,EAAe,IAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACb,CAAA;AAGD,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,IAAA,IAAA,GAAO,oBAAoB,QAAQ,CAAA;AAGnC,IAAA,MAAM,YAAA,GAAe,iBAAiB,QAAQ,CAAA;AAC9C,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,OAAA,EAAS,iBAAiB,GAAG,CAAA,CAAA;AAAA,QAC7B,QAAA,EAAU,GAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAC,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AASO,SAAS,mBAAA,CAAoB,MAAgB,SAAA,EAA6C;AAC/F,EAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACV,CAAC,GAAA,KAAQ,EAAE,GAAA,IAAO,SAAA,CAAA,IAAc,SAAA,CAAU,GAAG,CAAA,KAAM,MAAA,IAAa,SAAA,CAAU,GAAG,CAAA,KAAM;AAAA,GACrF;AACF;AAUO,SAAS,eAAA,CAAgB,QAAqB,SAAA,EAA2C;AAC9F,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,MAAM,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,GAAA,EAAK;AAAA,MACjC,aAAA,EAAe,IAAA;AAAA,MACf,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA,EAAY,CAAC,IAAA,KAA6B;AACxC,QAAA,MAAM,OAAA,GAAU,KAAK,KAAA,IAAS,EAAA;AAC9B,QAAA,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AAAA,MACpB;AAAA,KACD,CAAA;AAED,IAAA,GAAA,CAAI,QAAQ,SAAS,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,OAAO,IAAI,WAAA,EAAY;AAAA,EACzB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,oBAAoB,KAAK,CAAA;AAAA,EACjC;AACF;AASA,SAAS,oBAAoB,IAAA,EAAwB;AACnD,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQ,eAAA;AACd,EAAA,IAAI,KAAA;AAEJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAE1C,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1B,IAAA,IAAI,GAAA,IAAO,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,KAAK,IAAA,EAAK;AACnB;AAKA,SAAS,iBAAiB,IAAA,EAAwB;AAChD,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,UAAA,GAAa,EAAA;AAEjB,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,KAAA,EAAA;AACA,MAAA,UAAA,GAAa,EAAA;AAAA,IACf,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,KAAA,GAAQ,CAAA;AAAA,MACV;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AACpB,MAAA,UAAA,IAAc,IAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,UAAA,CAAW,IAAA,EAAK,EAAG;AAClC,IAAA,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,QAAA;AACT;AAYA,SAAS,qBAAqB,KAAA,EAA2C;AACvE,EAAA,OAAO,YAAA,IAAgB,KAAA,IAAS,OAAQ,KAAA,CAA6B,UAAA,KAAe,QAAA;AACtF;AAKA,SAAS,oBAAoB,KAAA,EAA+B;AAC1D,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAE1B,IAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,IAAK,KAAA,CAAM,YAAY,MAAA,EAAQ;AAE3D,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA;AAC5C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,YAAY,OAAA,IAAW,2BAAA;AAAA,QAChC,QAAA,EAAU,YAAY,UAAA,EAAY,GAAA;AAAA,QAClC,IAAA,EAAM,QAAA;AAAA,QACN,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACvC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,sCAAsC,CAAA;AACxE,MAAA,OAAO;AAAA,QACL,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,QAAA,EAAU,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA;AAAA,QAC7B,IAAA,EAAM,WAAA;AAAA,QACN,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,IACE,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,KAC9B,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IACjC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAC/B;AACA,MAAA,OAAO;AAAA,QACL,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,IAAA,EAAM,OAAA;AAAA,QACN,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,KAAK,CAAA;AAAA,IACrB,IAAA,EAAM;AAAA,GACR;AACF;AAKA,SAAS,YAAA,CAAa,MAAY,QAAA,EAAwB;AACxD,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,EAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,EAAA,IAAA,CAAK,KAAA,EAAM;AACX,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACzB;AAeO,SAAS,uBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,GAAkC,EAAC,EACtB;AACb,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAM,UAAA,EAAW,GAAI,OAAA;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,MAAM,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,GAAA,EAAK;AAAA,MACjC,aAAA,EAAe,IAAA;AAAA,MACf,UAAA;AAAA,MACA,UAAA,EAAY,UAAA,GACR,EAAE,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,GAAA,EAAK,GAAA,EAAK,UAAA,CAAW,GAAA,IAAO,GAAA,EAAI,GAC7D,KAAA;AAAA,KACL,CAAA;AAED,IAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AAChB,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,OAAO,GAAA,CAAI,MAAA,EAAO,CAAE,QAAA,CAAS;AAAA,MAC3B,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,oBAAoB,KAAK,CAAA;AAAA,EACjC;AACF;AAKO,SAAS,uBAAA,CACd,cAAA,GAAyC,EAAC,EAC+B;AACzE,EAAA,OAAO,CAAC,QAAqB,SAAA,KAAsC;AACjE,IAAA,OAAO,eAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,cAAc,CAAA;AAAA,EAC1D,CAAA;AACF;AAEA,IAAO,uBAAA,GAAQ","file":"chunk-5E3CFYZ4.mjs","sourcesContent":["/**\n * Template Processing Utility\n *\n * Uses docxtemplater to substitute template variables in DOCX documents:\n * - Processes {variable_name} patterns (docxtemplater default syntax)\n * - Preserves all formatting (fonts, styles, colors, tables)\n * - Error handling with useful messages\n */\n\nimport PizZip from 'pizzip';\nimport Docxtemplater from 'docxtemplater';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for template processing\n */\nexport interface ProcessTemplateOptions {\n /** How to handle undefined variables */\n nullGetter?: 'keep' | 'empty' | 'error';\n /** Custom parser for variable names */\n parser?: (tag: string) => { get: (scope: Record<string, unknown>) => unknown };\n /** Line breaks: keep raw \\n or convert to w:br */\n linebreaks?: boolean;\n /** Delimiter settings */\n delimiters?: {\n start?: string;\n end?: string;\n };\n}\n\n/**\n * Result of template processing\n */\nexport interface ProcessTemplateResult {\n /** The processed document buffer */\n buffer: ArrayBuffer;\n /** Variables that were found and replaced */\n replacedVariables: string[];\n /** Variables that were not replaced (no value provided) */\n unreplacedVariables: string[];\n /** Any warnings during processing */\n warnings: string[];\n}\n\n/**\n * Error details from template processing\n */\nexport interface TemplateError {\n /** Error message */\n message: string;\n /** Variable name that caused the error (if applicable) */\n variable?: string;\n /** Error type */\n type: 'parse' | 'render' | 'undefined' | 'unknown';\n /** Original error */\n originalError?: Error;\n}\n\n// ============================================================================\n// MAIN FUNCTIONS\n// ============================================================================\n\n/**\n * Process a DOCX template with variable substitution\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @param variables - Map of variable names to values\n * @param options - Processing options\n * @returns Processed DOCX as ArrayBuffer\n */\nexport function processTemplate(\n buffer: ArrayBuffer,\n variables: Record<string, string>,\n options: ProcessTemplateOptions = {}\n): ArrayBuffer {\n const result = processTemplateDetailed(buffer, variables, options);\n return result.buffer;\n}\n\n/**\n * Process template with detailed result\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @param variables - Map of variable names to values\n * @param options - Processing options\n * @returns Detailed processing result\n */\nexport function processTemplateDetailed(\n buffer: ArrayBuffer,\n variables: Record<string, string>,\n options: ProcessTemplateOptions = {}\n): ProcessTemplateResult {\n const { nullGetter = 'keep', linebreaks = true, delimiters } = options;\n\n const warnings: string[] = [];\n const replacedVariables: string[] = [];\n const unreplacedVariables: string[] = [];\n\n try {\n // Load the docx as a zip\n const zip = new PizZip(buffer);\n\n // Create docxtemplater instance\n const doc = new Docxtemplater(zip, {\n paragraphLoop: true,\n linebreaks,\n // Handle undefined tags based on option\n nullGetter: (part: { module?: string; value?: string }) => {\n const varName = part.value || '';\n\n if (nullGetter === 'error') {\n throw new Error(`Undefined variable: ${varName}`);\n }\n\n if (nullGetter === 'empty') {\n unreplacedVariables.push(varName);\n return '';\n }\n\n // Default: keep the tag as-is\n unreplacedVariables.push(varName);\n return `{${varName}}`;\n },\n // Custom delimiters if specified (docxtemplater uses single braces by default)\n delimiters: delimiters\n ? { start: delimiters.start || '{', end: delimiters.end || '}' }\n : undefined,\n });\n\n // Track which variables are being replaced\n Object.keys(variables).forEach((key) => {\n if (variables[key] !== undefined && variables[key] !== null) {\n replacedVariables.push(key);\n }\n });\n\n // Set the data\n doc.setData(variables);\n\n // Render the document\n doc.render();\n\n // Get the output buffer\n const outputBuffer = doc.getZip().generate({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n });\n\n return {\n buffer: outputBuffer,\n replacedVariables,\n unreplacedVariables,\n warnings,\n };\n } catch (error) {\n throw formatTemplateError(error);\n }\n}\n\n/**\n * Process template and return as Blob\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @param variables - Map of variable names to values\n * @param options - Processing options\n * @returns Processed DOCX as Blob\n */\nexport function processTemplateAsBlob(\n buffer: ArrayBuffer,\n variables: Record<string, string>,\n options: ProcessTemplateOptions = {}\n): Blob {\n const resultBuffer = processTemplate(buffer, variables, options);\n return new Blob([resultBuffer], {\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n });\n}\n\n/**\n * Process template and trigger download\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @param variables - Map of variable names to values\n * @param filename - Output filename (without extension)\n * @param options - Processing options\n */\nexport function processTemplateAndDownload(\n buffer: ArrayBuffer,\n variables: Record<string, string>,\n filename: string = 'document',\n options: ProcessTemplateOptions = {}\n): void {\n const blob = processTemplateAsBlob(buffer, variables, options);\n downloadBlob(blob, `${filename}.docx`);\n}\n\n// ============================================================================\n// VALIDATION & INSPECTION\n// ============================================================================\n\n/**\n * Get all template tags in a document without processing\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @returns List of tag names found\n */\nexport function getTemplateTags(buffer: ArrayBuffer): string[] {\n try {\n const zip = new PizZip(buffer);\n const doc = new Docxtemplater(zip, {\n paragraphLoop: true,\n linebreaks: true,\n });\n\n // Get the full text to extract tags\n const fullText = doc.getFullText();\n return extractTagsFromText(fullText);\n } catch (error) {\n throw formatTemplateError(error);\n }\n}\n\n/**\n * Validate that a document is a valid docxtemplater template\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @returns Validation result\n */\nexport function validateTemplate(buffer: ArrayBuffer): {\n valid: boolean;\n errors: TemplateError[];\n tags: string[];\n} {\n const errors: TemplateError[] = [];\n let tags: string[] = [];\n\n try {\n const zip = new PizZip(buffer);\n const doc = new Docxtemplater(zip, {\n paragraphLoop: true,\n linebreaks: true,\n });\n\n // Try to get full text (validates structure)\n const fullText = doc.getFullText();\n tags = extractTagsFromText(fullText);\n\n // Check for unclosed tags\n const unclosedTags = findUnclosedTags(fullText);\n for (const tag of unclosedTags) {\n errors.push({\n message: `Unclosed tag: ${tag}`,\n variable: tag,\n type: 'parse',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n tags,\n };\n } catch (error) {\n errors.push(formatTemplateError(error));\n return {\n valid: false,\n errors,\n tags,\n };\n }\n}\n\n/**\n * Check if all required variables have values\n *\n * @param tags - List of template tags\n * @param variables - Provided variable values\n * @returns Missing variable names\n */\nexport function getMissingVariables(tags: string[], variables: Record<string, string>): string[] {\n return tags.filter(\n (tag) => !(tag in variables) || variables[tag] === undefined || variables[tag] === null\n );\n}\n\n/**\n * Preview what the document will look like after processing\n * Returns the document text with variables replaced (for preview purposes)\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @param variables - Map of variable names to values\n * @returns Preview text\n */\nexport function previewTemplate(buffer: ArrayBuffer, variables: Record<string, string>): string {\n try {\n const zip = new PizZip(buffer);\n const doc = new Docxtemplater(zip, {\n paragraphLoop: true,\n linebreaks: true,\n nullGetter: (part: { value?: string }) => {\n const varName = part.value || '';\n return `[${varName}]`;\n },\n });\n\n doc.setData(variables);\n doc.render();\n\n return doc.getFullText();\n } catch (error) {\n throw formatTemplateError(error);\n }\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Extract tag names from text\n */\nfunction extractTagsFromText(text: string): string[] {\n const tags: string[] = [];\n const regex = /\\{([^{}]+)\\}/g;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n // docxtemplater uses single braces internally\n const tag = match[1].trim();\n if (tag && !tags.includes(tag)) {\n tags.push(tag);\n }\n }\n\n return tags.sort();\n}\n\n/**\n * Find unclosed template tags\n */\nfunction findUnclosedTags(text: string): string[] {\n const unclosed: string[] = [];\n\n // Check for { without matching }\n let depth = 0;\n let currentTag = '';\n\n for (const char of text) {\n if (char === '{') {\n depth++;\n currentTag = '';\n } else if (char === '}') {\n depth--;\n if (depth < 0) {\n depth = 0; // Reset on extra close brace\n }\n } else if (depth > 0) {\n currentTag += char;\n }\n }\n\n if (depth > 0 && currentTag.trim()) {\n unclosed.push(currentTag.trim());\n }\n\n return unclosed;\n}\n\n/** Type guard for docxtemplater multi-error */\ninterface DocxTemplaterError extends Error {\n properties?: {\n errors?: Array<{\n message?: string;\n properties?: { tag?: string };\n }>;\n };\n}\n\nfunction isDocxTemplaterError(error: Error): error is DocxTemplaterError {\n return 'properties' in error && typeof (error as DocxTemplaterError).properties === 'object';\n}\n\n/**\n * Format docxtemplater errors into useful messages\n */\nfunction formatTemplateError(error: unknown): TemplateError {\n if (error instanceof Error) {\n // Check for docxtemplater specific errors\n if (isDocxTemplaterError(error) && error.properties?.errors) {\n // Multi-error from docxtemplater\n const firstError = error.properties.errors[0];\n return {\n message: firstError?.message || 'Template processing error',\n variable: firstError?.properties?.tag,\n type: 'render',\n originalError: error,\n };\n }\n\n // Check for undefined tag errors\n if (error.message.includes('undefined')) {\n const match = error.message.match(/undefined (?:variable|tag):\\s*(\\S+)/i);\n return {\n message: error.message,\n variable: match ? match[1] : undefined,\n type: 'undefined',\n originalError: error,\n };\n }\n\n // Check for parse errors\n if (\n error.message.includes('parse') ||\n error.message.includes('unclosed') ||\n error.message.includes('syntax')\n ) {\n return {\n message: error.message,\n type: 'parse',\n originalError: error,\n };\n }\n\n return {\n message: error.message,\n type: 'unknown',\n originalError: error,\n };\n }\n\n return {\n message: String(error),\n type: 'unknown',\n };\n}\n\n/**\n * Download a blob as a file\n */\nfunction downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n// ============================================================================\n// ADVANCED FEATURES\n// ============================================================================\n\n/**\n * Process template with conditional sections\n * Supports #if, #unless, #each loops\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @param data - Full data object (can include arrays, nested objects)\n * @param options - Processing options\n * @returns Processed DOCX as ArrayBuffer\n */\nexport function processTemplateAdvanced(\n buffer: ArrayBuffer,\n data: Record<string, unknown>,\n options: ProcessTemplateOptions = {}\n): ArrayBuffer {\n const { linebreaks = true, delimiters } = options;\n\n try {\n const zip = new PizZip(buffer);\n const doc = new Docxtemplater(zip, {\n paragraphLoop: true,\n linebreaks,\n delimiters: delimiters\n ? { start: delimiters.start || '{', end: delimiters.end || '}' }\n : undefined,\n });\n\n doc.setData(data);\n doc.render();\n\n return doc.getZip().generate({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n });\n } catch (error) {\n throw formatTemplateError(error);\n }\n}\n\n/**\n * Create a template processor with preset options\n */\nexport function createTemplateProcessor(\n defaultOptions: ProcessTemplateOptions = {}\n): (buffer: ArrayBuffer, variables: Record<string, string>) => ArrayBuffer {\n return (buffer: ArrayBuffer, variables: Record<string, string>) => {\n return processTemplate(buffer, variables, defaultOptions);\n };\n}\n\nexport default processTemplate;\n"]}
|