@pdfme/cli 5.5.10-dev.125

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/contract.ts","../src/schema-plugins.ts","../src/utils.ts","../src/diagnostics.ts","../src/fonts.ts","../src/cjk-detect.ts","../src/grid.ts","../src/commands/generate.ts","../src/commands/validate.ts","../src/commands/pdf2img.ts","../src/commands/pdf2size.ts","../src/version.ts","../src/example-templates.ts","../src/example-fonts.ts","../src/commands/examples.ts","../src/commands/doctor.ts","../src/index.ts"],"sourcesContent":["interface CliErrorOptions {\n code?: string;\n exitCode?: number;\n details?: unknown;\n cause?: unknown;\n}\n\nexport interface CliArgDefinition {\n type: 'positional' | 'string' | 'boolean';\n alias?: string | string[];\n description?: string;\n required?: boolean;\n default?: unknown;\n}\n\nexport class CliError extends Error {\n readonly code: string;\n readonly exitCode: number;\n readonly details?: unknown;\n\n constructor(message: string, options: CliErrorOptions = {}) {\n super(message);\n this.name = 'CliError';\n this.code = options.code ?? 'ECLI';\n this.exitCode = options.exitCode ?? 1;\n this.details = options.details;\n if (options.cause !== undefined) {\n this.cause = options.cause as Error;\n }\n }\n}\n\nexport function fail(message: string, options: CliErrorOptions = {}): never {\n throw new CliError(message, options);\n}\n\nexport function printJson(value: Record<string, unknown>): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nexport async function runWithContract<T>(\n options: { json: boolean },\n task: () => Promise<T> | T,\n): Promise<T> {\n try {\n return await task();\n } catch (error) {\n return handleCommandError(error, options.json);\n }\n}\n\nexport function handleCommandError(error: unknown, json: boolean): never {\n const normalized = normalizeCliError(error);\n\n if (json) {\n const payload: Record<string, unknown> = {\n ok: false,\n error: {\n code: normalized.code,\n message: normalized.message,\n },\n };\n\n if (normalized.details !== undefined) {\n (payload.error as Record<string, unknown>).details = normalized.details;\n }\n\n printJson(payload);\n } else {\n console.error(`Error: ${normalized.message}`);\n }\n\n process.exit(normalized.exitCode);\n}\n\nexport function assertNoUnknownFlags(\n rawArgs: string[],\n argsDefinition: Record<string, CliArgDefinition>,\n): void {\n const booleanFlags = new Set<string>();\n const valueFlags = new Set<string>();\n const negatedBooleanFlags = new Set<string>();\n\n for (const [name, definition] of Object.entries(argsDefinition)) {\n if (definition.type === 'positional') continue;\n\n for (const flag of getFlagVariants(name, definition.alias)) {\n if (definition.type === 'boolean') {\n booleanFlags.add(flag);\n if (flag.startsWith('--') && !name.startsWith('no')) {\n negatedBooleanFlags.add(`--no-${flag.slice(2)}`);\n }\n } else {\n valueFlags.add(flag);\n }\n }\n }\n\n for (let i = 0; i < rawArgs.length; i++) {\n const token = rawArgs[i];\n\n if (token === '--') break;\n if (!token.startsWith('-') || token === '-') continue;\n\n const [flag, inlineValue] = splitFlagToken(token);\n\n if (booleanFlags.has(flag) || negatedBooleanFlags.has(flag)) {\n if (inlineValue !== undefined) {\n fail(`Boolean flag ${flag} does not take a value.`, {\n code: 'EARG',\n exitCode: 1,\n });\n }\n continue;\n }\n\n if (valueFlags.has(flag)) {\n if (inlineValue !== undefined) {\n if (inlineValue.length === 0) {\n fail(`Missing value for argument ${flag}.`, { code: 'EARG', exitCode: 1 });\n }\n } else {\n const next = rawArgs[i + 1];\n if (!next || next === '--' || next.startsWith('-')) {\n fail(`Missing value for argument ${flag}.`, { code: 'EARG', exitCode: 1 });\n }\n i++;\n }\n continue;\n }\n\n fail(`Unknown argument: ${flag}`, { code: 'EARG', exitCode: 1 });\n }\n}\n\nexport function isOptionProvided(\n rawArgs: string[],\n name: string,\n alias?: string | string[],\n): boolean {\n const allowedFlags = new Set(getFlagVariants(name, alias));\n return rawArgs.some((token) => {\n if (!token.startsWith('-') || token === '-') return false;\n const [flag] = splitFlagToken(token);\n return allowedFlags.has(flag);\n });\n}\n\nexport function parseEnumArg<T extends string>(\n optionName: string,\n value: unknown,\n allowedValues: readonly T[],\n): T {\n if (typeof value !== 'string' || !allowedValues.includes(value as T)) {\n fail(\n `Invalid value for --${optionName}: expected one of ${allowedValues.join(', ')}, received ${formatValue(value)}.`,\n { code: 'EARG', exitCode: 1 },\n );\n }\n\n return value as T;\n}\n\nexport function parsePositiveNumberArg(optionName: string, value: unknown): number {\n const parsed = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n fail(\n `Invalid value for --${optionName}: expected a positive number, received ${formatValue(value)}.`,\n { code: 'EARG', exitCode: 1 },\n );\n }\n\n return parsed;\n}\n\nfunction normalizeCliError(error: unknown): CliError {\n if (error instanceof CliError) {\n return error;\n }\n\n if (error instanceof Error) {\n const errorCode =\n typeof (error as NodeJS.ErrnoException).code === 'string'\n ? (error as NodeJS.ErrnoException).code\n : undefined;\n\n if (errorCode && errorCode.startsWith('E')) {\n return new CliError(error.message, {\n code: 'EIO',\n exitCode: 3,\n details: { errno: errorCode },\n cause: error,\n });\n }\n\n return new CliError(error.message, {\n code: 'ERUNTIME',\n exitCode: 2,\n cause: error,\n });\n }\n\n return new CliError(String(error), {\n code: 'ERUNTIME',\n exitCode: 2,\n });\n}\n\nfunction splitFlagToken(token: string): [string, string | undefined] {\n const eqIndex = token.indexOf('=');\n if (eqIndex === -1) {\n return [token, undefined];\n }\n\n return [token.slice(0, eqIndex), token.slice(eqIndex + 1)];\n}\n\nfunction getFlagVariants(name: string, alias?: string | string[]): string[] {\n const flags = new Set<string>();\n\n addFlagVariants(flags, name);\n\n for (const item of toArray(alias)) {\n addFlagVariants(flags, item);\n }\n\n return [...flags];\n}\n\nfunction addFlagVariants(flags: Set<string>, value: string): void {\n if (value.length === 1) {\n flags.add(`-${value}`);\n return;\n }\n\n flags.add(`--${value}`);\n flags.add(`--${toKebabCase(value)}`);\n flags.add(`--${toCamelCase(value)}`);\n}\n\nfunction toArray(value?: string | string[]): string[] {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction toKebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/[-_ ]+([a-zA-Z0-9])/g, (_, char: string) => char.toUpperCase());\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n","import type { Plugin, Plugins } from '@pdfme/common';\nimport * as schemas from '@pdfme/schemas';\n\nfunction isPlugin(value: unknown): value is Plugin {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const plugin = value as Partial<Plugin> & {\n propPanel?: { defaultSchema?: { type?: unknown } };\n };\n\n return (\n typeof plugin.pdf === 'function' &&\n typeof plugin.ui === 'function' &&\n typeof plugin.propPanel === 'object' &&\n plugin.propPanel !== null &&\n typeof plugin.propPanel.defaultSchema === 'object' &&\n plugin.propPanel.defaultSchema !== null &&\n typeof plugin.propPanel.defaultSchema.type === 'string'\n );\n}\n\nfunction collectPluginsByType(\n value: unknown,\n plugins: Plugins,\n seen: WeakSet<object>,\n): void {\n if (!value || typeof value !== 'object') {\n return;\n }\n\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n\n if (isPlugin(value)) {\n const type = value.propPanel.defaultSchema.type;\n if (!(type in plugins)) {\n plugins[type] = value;\n }\n return;\n }\n\n for (const child of Object.values(value)) {\n collectPluginsByType(child, plugins, seen);\n }\n}\n\nfunction buildSchemaPlugins(): Plugins {\n const plugins: Plugins = {};\n collectPluginsByType(schemas, plugins, new WeakSet<object>());\n return plugins;\n}\n\nexport const schemaPlugins = buildSchemaPlugins();\nexport const schemaTypes = new Set(Object.keys(schemaPlugins));\n","import {\n accessSync,\n constants,\n existsSync,\n mkdirSync,\n readFileSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, extname, basename, join, resolve } from 'node:path';\nimport { fail, isOptionProvided } from './contract.js';\n\nexport interface UnifiedJob {\n template: Record<string, unknown>;\n inputs: Record<string, unknown>[];\n options?: unknown;\n}\n\ninterface LoadedInput {\n template: Record<string, unknown>;\n inputs: Record<string, unknown>[];\n options?: unknown;\n templateDir?: string;\n}\n\nexport interface WriteTargetInspection {\n path: string;\n resolvedPath: string;\n parentDir: string;\n exists: boolean;\n existingType?: 'file' | 'directory' | 'other';\n writable: boolean;\n checkedPath?: string;\n checkedType?: 'file' | 'directory' | 'other';\n error?: string;\n}\n\nexport function readJsonFile(filePath: string): unknown {\n const resolvedPath = resolve(filePath);\n if (!existsSync(resolvedPath)) {\n fail(`File not found: ${resolvedPath}`, { code: 'EIO', exitCode: 3 });\n }\n\n try {\n const content = readFileSync(resolvedPath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n fail(\n `Failed to parse JSON file: ${resolvedPath}. ${error instanceof Error ? error.message : String(error)}`,\n {\n code: 'EIO',\n exitCode: 3,\n cause: error,\n },\n );\n }\n}\n\nexport function loadInput(args: {\n _: string[];\n template?: string;\n inputs?: string;\n}): LoadedInput {\n const positionalFile = args._[0];\n\n if (positionalFile && !args.template && !args.inputs) {\n const jobFilePath = resolve(positionalFile);\n const data = readJsonFile(jobFilePath) as Record<string, unknown>;\n if ('template' in data && 'inputs' in data) {\n return {\n template: data.template as Record<string, unknown>,\n inputs: data.inputs as Record<string, unknown>[],\n options: data.options,\n templateDir: dirname(jobFilePath),\n };\n }\n fail(\n 'Positional file must be a unified format with \"template\" and \"inputs\" keys. Use -t and -i for separate files.',\n { code: 'EARG', exitCode: 1 },\n );\n }\n\n if (args.template) {\n if (!args.inputs) {\n fail('--inputs (-i) is required when using --template (-t).', {\n code: 'EARG',\n exitCode: 1,\n });\n }\n const templatePath = resolve(args.template);\n const template = readJsonFile(templatePath) as Record<string, unknown>;\n const inputs = readJsonFile(resolve(args.inputs)) as Record<string, unknown>[];\n return { template, inputs, templateDir: dirname(templatePath) };\n }\n\n fail(\n 'No input provided. Use a unified job file or pass --template/-t with --inputs/-i.',\n { code: 'EARG', exitCode: 1 },\n );\n}\n\nexport function resolveBasePdf(\n template: Record<string, unknown>,\n basePdfArg: string | undefined,\n templateDir?: string,\n): Record<string, unknown> {\n if (basePdfArg) {\n const resolvedBasePdf = resolve(basePdfArg);\n if (!existsSync(resolvedBasePdf)) {\n fail(`Base PDF file not found: ${resolvedBasePdf}`, {\n code: 'EIO',\n exitCode: 3,\n });\n }\n const pdfData = new Uint8Array(readFileSync(resolvedBasePdf));\n return { ...template, basePdf: pdfData };\n }\n\n const basePdf = template.basePdf;\n if (typeof basePdf === 'string' && basePdf.endsWith('.pdf') && !basePdf.startsWith('data:')) {\n const resolvedBasePdf = templateDir ? resolve(templateDir, basePdf) : resolve(basePdf);\n if (!existsSync(resolvedBasePdf)) {\n fail(`Base PDF file not found: ${resolvedBasePdf}`, {\n code: 'EIO',\n exitCode: 3,\n });\n }\n const pdfData = new Uint8Array(readFileSync(resolvedBasePdf));\n return { ...template, basePdf: pdfData };\n }\n\n return template;\n}\n\nexport function getImageOutputPaths(\n pdfOutputPath: string,\n pageCount: number,\n imageFormat: string,\n): string[] {\n const dir = dirname(pdfOutputPath);\n const base = basename(pdfOutputPath, extname(pdfOutputPath));\n const ext = imageFormat === 'jpeg' ? 'jpg' : 'png';\n return Array.from({ length: pageCount }, (_, i) => join(dir, `${base}-${i + 1}.${ext}`));\n}\n\nexport function writeOutput(filePath: string, data: Uint8Array | ArrayBuffer): void {\n try {\n const dir = dirname(filePath);\n if (dir && dir !== '.' && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, data instanceof ArrayBuffer ? new Uint8Array(data) : data);\n } catch (error) {\n fail(`Failed to write file: ${filePath}. ${error instanceof Error ? error.message : String(error)}`, {\n code: 'EIO',\n exitCode: 3,\n cause: error,\n });\n }\n}\n\nexport function readPdfFile(filePath: string): Uint8Array {\n const resolvedPath = resolve(filePath);\n if (!existsSync(resolvedPath)) {\n fail(`PDF file not found: ${resolvedPath}`, { code: 'EIO', exitCode: 3 });\n }\n\n try {\n return new Uint8Array(readFileSync(resolvedPath));\n } catch (error) {\n fail(`Failed to read PDF file: ${resolvedPath}. ${error instanceof Error ? error.message : String(error)}`, {\n code: 'EIO',\n exitCode: 3,\n cause: error,\n });\n }\n}\n\n// Standard paper sizes in mm (portrait)\nconst PAPER_SIZES: Record<string, [number, number]> = {\n A3: [297, 420],\n A4: [210, 297],\n A5: [148, 210],\n A6: [105, 148],\n B4: [250, 353],\n B5: [176, 250],\n Letter: [216, 279],\n Legal: [216, 356],\n Tabloid: [279, 432],\n};\n\nexport function detectPaperSize(width: number, height: number): string | null {\n const tolerance = 2; // mm\n for (const [name, [w, h]] of Object.entries(PAPER_SIZES)) {\n if (\n (Math.abs(width - w) <= tolerance && Math.abs(height - h) <= tolerance) ||\n (Math.abs(width - h) <= tolerance && Math.abs(height - w) <= tolerance)\n ) {\n const orientation = width < height ? 'portrait' : 'landscape';\n return `${name} ${orientation}`;\n }\n }\n return null;\n}\n\nexport function parsePageRange(rangeStr: string, totalPages: number): number[] {\n const pages: Set<number> = new Set();\n for (const part of rangeStr.split(',')) {\n const trimmed = part.trim();\n if (!trimmed) {\n fail(`Invalid page range: ${JSON.stringify(rangeStr)}. Empty segments are not allowed.`, {\n code: 'EARG',\n exitCode: 1,\n });\n }\n if (trimmed.includes('-')) {\n const [startStr, endStr] = trimmed.split('-');\n if (\n !startStr ||\n !endStr ||\n !/^\\d+$/.test(startStr) ||\n !/^\\d+$/.test(endStr)\n ) {\n fail(`Invalid page range segment: ${JSON.stringify(trimmed)}. Use formats like \"1-3\" or \"2\".`, {\n code: 'EARG',\n exitCode: 1,\n });\n }\n\n const start = Number.parseInt(startStr, 10);\n const end = Number.parseInt(endStr, 10);\n if (start < 1 || end < 1 || start > end || end > totalPages) {\n fail(\n `Invalid page range segment: ${JSON.stringify(trimmed)}. Pages must be between 1 and ${totalPages}.`,\n {\n code: 'EARG',\n exitCode: 1,\n },\n );\n }\n\n for (let i = start; i <= end; i++) pages.add(i);\n } else {\n if (!/^\\d+$/.test(trimmed)) {\n fail(`Invalid page range segment: ${JSON.stringify(trimmed)}. Use formats like \"1-3\" or \"2\".`, {\n code: 'EARG',\n exitCode: 1,\n });\n }\n const p = Number.parseInt(trimmed, 10);\n if (p < 1 || p > totalPages) {\n fail(`Invalid page number: ${p}. Pages must be between 1 and ${totalPages}.`, {\n code: 'EARG',\n exitCode: 1,\n });\n }\n pages.add(p);\n }\n }\n return [...pages].sort((a, b) => a - b);\n}\n\nexport async function readJsonFromStdin(): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n const content = Buffer.concat(chunks).toString('utf8').trim();\n if (!content) {\n fail('No JSON input received on stdin.', { code: 'EARG', exitCode: 1 });\n }\n\n try {\n return JSON.parse(content);\n } catch (error) {\n fail(`Failed to parse JSON from stdin. ${error instanceof Error ? error.message : String(error)}`, {\n code: 'EIO',\n exitCode: 3,\n cause: error,\n });\n }\n}\n\nexport function ensureSafeDefaultOutputPath(options: {\n filePath: string;\n rawArgs: string[];\n optionName: string;\n optionAlias?: string | string[];\n defaultValue: string;\n force?: boolean;\n}): void {\n const issue = getSafeDefaultOutputPathIssue(options);\n if (issue) {\n fail(issue, { code: 'EARG', exitCode: 1 });\n }\n}\n\nexport function getSafeDefaultOutputPathIssue(options: {\n filePath: string;\n rawArgs: string[];\n optionName: string;\n optionAlias?: string | string[];\n defaultValue: string;\n force?: boolean;\n}): string | undefined {\n const { filePath, rawArgs, optionName, optionAlias, defaultValue, force = false } = options;\n if (force || isOptionProvided(rawArgs, optionName, optionAlias) || filePath !== defaultValue) {\n return undefined;\n }\n\n const resolvedPath = resolve(filePath);\n if (!existsSync(resolvedPath)) {\n return undefined;\n }\n\n return `Refusing to overwrite implicit default output file: ${resolvedPath}. Use -o to choose an explicit path or --force to overwrite.`;\n}\n\nexport function inspectWriteTarget(filePath: string): WriteTargetInspection {\n const resolvedPath = resolve(filePath);\n const parentDir = dirname(resolvedPath);\n const exists = existsSync(resolvedPath);\n let existingType: WriteTargetInspection['existingType'];\n\n if (exists) {\n const stat = statSync(resolvedPath);\n if (stat.isFile()) {\n existingType = 'file';\n } else if (stat.isDirectory()) {\n existingType = 'directory';\n } else {\n existingType = 'other';\n }\n }\n\n const checkedPath = exists && existingType === 'file' ? resolvedPath : findExistingParent(parentDir);\n const checkedType = getFsEntryType(checkedPath);\n\n try {\n accessSync(checkedPath, constants.W_OK);\n return {\n path: filePath,\n resolvedPath,\n parentDir,\n exists,\n existingType,\n writable: true,\n checkedPath: checkedPath !== resolvedPath ? checkedPath : undefined,\n checkedType,\n };\n } catch (error) {\n return {\n path: filePath,\n resolvedPath,\n parentDir,\n exists,\n existingType,\n writable: false,\n checkedPath: checkedPath !== resolvedPath ? checkedPath : undefined,\n checkedType,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction findExistingParent(path: string): string {\n let current = path;\n\n while (!existsSync(current)) {\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return current;\n}\n\nfunction getFsEntryType(path: string): WriteTargetInspection['checkedType'] {\n const stat = statSync(path);\n if (stat.isFile()) {\n return 'file';\n }\n if (stat.isDirectory()) {\n return 'directory';\n }\n return 'other';\n}\n","import { dirname, resolve } from 'node:path';\nimport { checkTemplate } from '@pdfme/common';\nimport { fail } from './contract.js';\nimport { schemaTypes } from './schema-plugins.js';\nimport { detectPaperSize, readJsonFile, readJsonFromStdin } from './utils.js';\n\nexport const KNOWN_TEMPLATE_KEYS = new Set(['author', 'basePdf', 'columns', 'pdfmeVersion', 'schemas']);\nexport const KNOWN_JOB_KEYS = new Set(['template', 'inputs', 'options']);\n\nexport interface ValidationResult {\n errors: string[];\n warnings: string[];\n pages: number;\n fields: number;\n}\n\nexport interface ValidationInspection {\n schemaTypes: string[];\n requiredPlugins: string[];\n requiredFonts: string[];\n basePdf: {\n kind: string;\n width?: number;\n height?: number;\n paperSize?: string | null;\n path?: string;\n resolvedPath?: string;\n };\n}\n\nexport interface FieldInputHint {\n name: string;\n type: string;\n pages: number[];\n required: boolean;\n expectedInput: {\n kind: 'string' | 'jsonStringObject' | 'enumString' | 'stringMatrix';\n variableNames?: string[];\n allowedValues?: string[];\n example?: string | string[][];\n format?: string;\n canonicalFormat?: string;\n contentKind?: string;\n rule?: string;\n groupName?: string;\n groupMemberNames?: string[];\n columnCount?: number;\n columnHeaders?: string[];\n acceptsJsonString?: boolean;\n };\n}\n\nexport interface ValidationSource {\n mode: 'template' | 'job';\n template: Record<string, unknown>;\n inputs?: Record<string, unknown>[];\n options?: unknown;\n templateDir?: string;\n jobWarnings: string[];\n}\n\nexport function findClosestType(type: string): string | null {\n let bestMatch: string | null = null;\n let bestDist = Infinity;\n for (const known of schemaTypes) {\n const dist = levenshtein(type.toLowerCase(), known.toLowerCase());\n if (dist < bestDist && dist <= 3) {\n bestDist = dist;\n bestMatch = known;\n }\n }\n return bestMatch;\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1,\n dp[i][j - 1] + 1,\n dp[i - 1][j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1),\n );\n }\n }\n return dp[m][n];\n}\n\nexport function validateTemplate(template: Record<string, unknown>): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n checkTemplate(template);\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n }\n\n const schemaPages = normalizeSchemaPages(template.schemas);\n if (schemaPages.length === 0) {\n return { errors, warnings, pages: 0, fields: 0 };\n }\n\n const totalFields = schemaPages.reduce((sum, page) => sum + page.length, 0);\n let pageWidth = 210;\n let pageHeight = 297;\n if (\n template.basePdf &&\n typeof template.basePdf === 'object' &&\n 'width' in (template.basePdf as object)\n ) {\n pageWidth = (template.basePdf as { width: number }).width;\n pageHeight = (template.basePdf as { height: number }).height;\n }\n\n const allNames = new Map<string, number[]>();\n\n for (let pageIdx = 0; pageIdx < schemaPages.length; pageIdx++) {\n const page = schemaPages[pageIdx];\n if (!Array.isArray(page)) continue;\n\n const pageNames = new Set<string>();\n\n for (const schema of page) {\n if (typeof schema !== 'object' || schema === null) continue;\n\n const name = schema.name as string;\n const type = schema.type as string;\n const position = schema.position as { x: number; y: number } | undefined;\n const width = schema.width as number | undefined;\n const height = schema.height as number | undefined;\n\n if (type && !schemaTypes.has(type)) {\n const suggestion = findClosestType(type);\n const hint = suggestion ? ` Did you mean: ${suggestion}?` : '';\n errors.push(\n `Field \"${name}\" has unknown type \"${type}\".${hint} Available types: ${[...schemaTypes].join(', ')}`,\n );\n }\n\n if (name && pageNames.has(name)) {\n errors.push(`Duplicate field name \"${name}\" on page ${pageIdx + 1}`);\n }\n\n if (name) {\n pageNames.add(name);\n if (!allNames.has(name)) allNames.set(name, []);\n allNames.get(name)!.push(pageIdx + 1);\n }\n\n if (position && width !== undefined && height !== undefined) {\n if (position.x + width > pageWidth + 1) {\n warnings.push(\n `Field \"${name}\" at (${position.x},${position.y}) extends beyond page width (${pageWidth}mm)`,\n );\n }\n if (position.y + height > pageHeight + 1) {\n warnings.push(\n `Field \"${name}\" at (${position.x},${position.y}) extends beyond page height (${pageHeight}mm)`,\n );\n }\n if (position.x < 0 || position.y < 0) {\n warnings.push(`Field \"${name}\" has negative position (${position.x},${position.y})`);\n }\n }\n }\n }\n\n for (const [name, pages] of allNames) {\n if (pages.length > 1) {\n warnings.push(`Field name \"${name}\" appears on multiple pages: ${pages.join(', ')}`);\n }\n }\n\n return { errors, warnings, pages: schemaPages.length, fields: totalFields };\n}\n\nexport function inspectTemplate(\n template: Record<string, unknown>,\n templateDir?: string,\n): ValidationInspection {\n const schemaPages = normalizeSchemaPages(template.schemas);\n const flattenedSchemas = schemaPages.flat();\n const collectedSchemaTypes = getUniqueStringValues(flattenedSchemas.map((schema) => schema.type));\n const requiredFonts = getUniqueStringValues(flattenedSchemas.map((schema) => schema.fontName));\n\n return {\n schemaTypes: collectedSchemaTypes,\n requiredPlugins: collectedSchemaTypes.filter((type) => schemaTypes.has(type)),\n requiredFonts,\n basePdf: summarizeBasePdf(template.basePdf, templateDir),\n };\n}\n\nexport function collectInputHints(template: Record<string, unknown>): FieldInputHint[] {\n const hintMap = new Map<string, FieldInputHint>();\n const schemaPages = normalizeSchemaPages(template.schemas);\n const radioGroupMembers = collectRadioGroupMembers(schemaPages);\n\n for (let pageIdx = 0; pageIdx < schemaPages.length; pageIdx++) {\n for (const schema of schemaPages[pageIdx]) {\n const name = typeof schema.name === 'string' ? schema.name : '';\n const type = typeof schema.type === 'string' ? schema.type : '';\n const readOnly = schema.readOnly === true;\n\n if (!name || !type || readOnly) {\n continue;\n }\n\n const hint = buildFieldInputHint(schema, pageIdx + 1, radioGroupMembers);\n const key = [\n hint.name,\n hint.type,\n hint.expectedInput.kind,\n JSON.stringify(hint.expectedInput.example ?? null),\n hint.expectedInput.format ?? '',\n hint.expectedInput.canonicalFormat ?? '',\n hint.expectedInput.contentKind ?? '',\n hint.expectedInput.rule ?? '',\n (hint.expectedInput.variableNames ?? []).join('\\u0000'),\n (hint.expectedInput.allowedValues ?? []).join('\\u0000'),\n hint.expectedInput.groupName ?? '',\n (hint.expectedInput.groupMemberNames ?? []).join('\\u0000'),\n String(hint.expectedInput.columnCount ?? ''),\n (hint.expectedInput.columnHeaders ?? []).join('\\u0000'),\n hint.expectedInput.acceptsJsonString === true ? '1' : '0',\n ].join('\\u0001');\n const existing = hintMap.get(key);\n\n if (existing) {\n existing.pages = [...new Set([...existing.pages, pageIdx + 1])].sort((a, b) => a - b);\n existing.required = existing.required || hint.required;\n continue;\n }\n\n hintMap.set(key, hint);\n }\n }\n\n return [...hintMap.values()].sort(\n (a, b) => a.name.localeCompare(b.name) || a.type.localeCompare(b.type),\n );\n}\n\nexport function validateInputContracts(\n template: Record<string, unknown>,\n inputs: Record<string, unknown>[],\n): void {\n const issues = getInputContractIssues(template, inputs);\n if (issues.length > 0) {\n fail(issues[0], { code: 'EVALIDATE', exitCode: 1 });\n }\n}\n\nexport function getInputContractIssues(\n template: Record<string, unknown>,\n inputs: Record<string, unknown>[],\n): string[] {\n const hints = collectInputHints(template);\n const issues: string[] = [];\n\n for (let inputIndex = 0; inputIndex < inputs.length; inputIndex++) {\n const input = inputs[inputIndex] ?? {};\n\n for (const hint of hints) {\n const issue = getInputContractIssue(hint, input, inputIndex);\n if (issue) {\n issues.push(issue);\n }\n }\n\n issues.push(...getRadioGroupSelectionIssues(hints, input, inputIndex));\n }\n\n return issues;\n}\n\nexport async function loadValidationSource(\n file: string | undefined,\n options: { noInputMessage: string },\n): Promise<ValidationSource> {\n const data = await loadValidationInput(file, options.noInputMessage);\n const record = assertRecordObject(data.json, 'Validation input');\n const hasTemplate = 'template' in record;\n const hasInputs = 'inputs' in record;\n\n if (hasTemplate || hasInputs) {\n if (!hasTemplate || !hasInputs) {\n fail('Unified job validation requires both \"template\" and \"inputs\" keys.', {\n code: 'EARG',\n exitCode: 1,\n });\n }\n\n return {\n mode: 'job',\n template: assertRecordObject(record.template, 'Unified job template'),\n inputs: record.inputs as Record<string, unknown>[],\n options: record.options,\n templateDir: data.templateDir,\n jobWarnings: Object.keys(record)\n .filter((key) => !KNOWN_JOB_KEYS.has(key))\n .sort()\n .map((key) => `Unknown unified job field: ${key}`),\n };\n }\n\n return {\n mode: 'template',\n template: assertRecordObject(record, 'Template'),\n templateDir: data.templateDir,\n jobWarnings: [],\n };\n}\n\nasync function loadValidationInput(\n file: string | undefined,\n noInputMessage: string,\n): Promise<{ json: unknown; templateDir?: string }> {\n if (!file || file === '-') {\n if (file === '-' || !process.stdin.isTTY) {\n return { json: await readJsonFromStdin() };\n }\n\n fail(noInputMessage, {\n code: 'EARG',\n exitCode: 1,\n });\n }\n\n const resolvedFile = resolve(file);\n return {\n json: readJsonFile(resolvedFile),\n templateDir: dirname(resolvedFile),\n };\n}\n\nfunction assertRecordObject(value: unknown, label: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n fail(`${label} must be a JSON object.`, { code: 'EARG', exitCode: 1 });\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function normalizeSchemaPages(rawSchemas: unknown): Array<Array<Record<string, unknown>>> {\n if (!Array.isArray(rawSchemas)) {\n return [];\n }\n\n return rawSchemas.map((page) => {\n if (Array.isArray(page)) {\n return page.filter(\n (schema): schema is Record<string, unknown> => typeof schema === 'object' && schema !== null,\n );\n }\n\n if (typeof page === 'object' && page !== null) {\n return Object.values(page).filter(\n (schema): schema is Record<string, unknown> => typeof schema === 'object' && schema !== null,\n );\n }\n\n return [];\n });\n}\n\nfunction buildFieldInputHint(\n schema: Record<string, unknown>,\n page: number,\n radioGroupMembers: Map<string, string[]>,\n): FieldInputHint {\n const type = schema.type as string;\n\n if (type === 'multiVariableText') {\n const variableNames = getUniqueStringValues(\n Array.isArray(schema.variables) ? schema.variables : [],\n );\n\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'jsonStringObject',\n variableNames,\n example: buildMultiVariableTextExample(variableNames),\n },\n };\n }\n\n if (type === 'checkbox') {\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'enumString',\n allowedValues: ['false', 'true'],\n example: 'true',\n },\n };\n }\n\n if (type === 'radioGroup') {\n const groupName = typeof schema.group === 'string' ? schema.group : '';\n const groupMemberNames = groupName ? (radioGroupMembers.get(groupName) ?? []) : [];\n\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'enumString',\n allowedValues: ['false', 'true'],\n example: 'true',\n ...(groupName ? { groupName } : {}),\n ...(groupMemberNames.length > 0 ? { groupMemberNames } : {}),\n },\n };\n }\n\n if (type === 'select') {\n const allowedValues = getUniqueOrderedStringValues(\n Array.isArray(schema.options) ? schema.options : [],\n );\n\n if (allowedValues.length > 0) {\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'enumString',\n allowedValues,\n example: allowedValues[0],\n },\n };\n }\n }\n\n const barcodeRule = getBarcodeRule(type);\n if (barcodeRule) {\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'string',\n contentKind: 'barcodeText',\n rule: barcodeRule,\n },\n };\n }\n\n const assetContentKind = getAssetContentKind(type);\n if (assetContentKind) {\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'string',\n contentKind: assetContentKind,\n },\n };\n }\n\n if (type === 'table') {\n const columnHeaders = getOrderedStringValues(Array.isArray(schema.head) ? schema.head : []);\n const columnCount = getTableColumnCount(schema, columnHeaders);\n\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'stringMatrix',\n ...(columnCount > 0 ? { columnCount } : {}),\n ...(columnHeaders.length > 0 ? { columnHeaders } : {}),\n example: buildTableInputExample(columnHeaders, columnCount),\n acceptsJsonString: true,\n },\n };\n }\n\n if (type === 'date' || type === 'time' || type === 'dateTime') {\n const canonicalFormat = getCanonicalDateStoredFormat(type);\n\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'string',\n format: getDateHintFormat(schema, canonicalFormat),\n canonicalFormat,\n example: getDateInputExample(type),\n },\n };\n }\n\n return {\n name: schema.name as string,\n type,\n pages: [page],\n required: schema.required === true,\n expectedInput: {\n kind: 'string',\n },\n };\n}\n\nfunction buildMultiVariableTextExample(variableNames: string[]): string {\n return JSON.stringify(\n Object.fromEntries(\n variableNames.map((variableName) => [variableName, variableName.toUpperCase()]),\n ),\n );\n}\n\nfunction buildTableInputExample(columnHeaders: string[], columnCount: number): string[][] {\n if (columnCount <= 0) {\n return [];\n }\n\n return [\n Array.from({ length: columnCount }, (_, index) => {\n const header = columnHeaders[index];\n return header ? `${header} value` : `cell-${index + 1}`;\n }),\n ];\n}\n\nfunction getTableColumnCount(schema: Record<string, unknown>, columnHeaders: string[]): number {\n if (columnHeaders.length > 0) {\n return columnHeaders.length;\n }\n\n if (Array.isArray(schema.headWidthPercentages) && schema.headWidthPercentages.length > 0) {\n return schema.headWidthPercentages.length;\n }\n\n const parsedContent = parseTableStringMatrix(schema.content);\n return parsedContent?.[0]?.length ?? 0;\n}\n\nfunction getAssetContentKind(type: string): string | null {\n switch (type) {\n case 'image':\n return 'imageDataUrl';\n case 'signature':\n return 'signatureImageDataUrl';\n case 'svg':\n return 'svgMarkup';\n default:\n return null;\n }\n}\n\nfunction getBarcodeRule(type: string): string | null {\n switch (type) {\n case 'qrcode':\n return 'Any non-empty string up to 499 characters.';\n case 'japanpost':\n return 'Start with 7 digits, then continue with digits, A-Z, or hyphen (-).';\n case 'ean13':\n return '12 or 13 digits; if 13 digits are provided, the final check digit must be valid.';\n case 'ean8':\n return '7 or 8 digits; if 8 digits are provided, the final check digit must be valid.';\n case 'code39':\n return 'Use uppercase A-Z, digits, spaces, and symbols - . $ / + %.';\n case 'code128':\n return 'Text must not contain Kanji, Hiragana, Katakana, or full-width ASCII characters.';\n case 'nw7':\n return 'Start and end with A-D; inner characters may be digits or - . $ : / +.';\n case 'itf14':\n return '13 or 14 digits; if 14 digits are provided, the final check digit must be valid.';\n case 'upca':\n return '11 or 12 digits; if 12 digits are provided, the final check digit must be valid.';\n case 'upce':\n return 'Must start with 0 and be 7 or 8 digits total; if 8 digits are provided, the final check digit must be valid.';\n case 'gs1datamatrix':\n return 'Include (01) followed by a GTIN of 8, 12, 13, or 14 digits with a valid check digit; total length must be 52 characters or fewer.';\n case 'pdf417':\n return 'Any non-empty string up to 1000 characters.';\n default:\n return null;\n }\n}\n\nfunction getCanonicalDateStoredFormat(type: 'date' | 'time' | 'dateTime'): string {\n switch (type) {\n case 'date':\n return 'yyyy/MM/dd';\n case 'time':\n return 'HH:mm';\n case 'dateTime':\n return 'yyyy/MM/dd HH:mm';\n }\n}\n\nfunction getDateHintFormat(schema: Record<string, unknown>, canonicalFormat: string): string {\n const formatValue = typeof schema.format === 'string' ? schema.format.trim() : '';\n if (!formatValue || formatValue === 'undefined') {\n return canonicalFormat;\n }\n\n return formatValue;\n}\n\nfunction getDateInputExample(type: 'date' | 'time' | 'dateTime'): string {\n switch (type) {\n case 'date':\n return '2026/03/28';\n case 'time':\n return '14:30';\n case 'dateTime':\n return '2026/03/28 14:30';\n }\n}\n\nfunction getInputContractIssue(\n hint: FieldInputHint,\n input: Record<string, unknown>,\n inputIndex: number,\n): string | null {\n if (hint.expectedInput.kind === 'jsonStringObject') {\n return getMultiVariableTextInputIssue(hint, input, inputIndex);\n }\n\n if (hint.expectedInput.kind === 'enumString') {\n return getEnumStringInputIssue(hint, input, inputIndex);\n }\n\n if (hint.expectedInput.kind === 'stringMatrix') {\n return getStringMatrixInputIssue(hint, input, inputIndex);\n }\n\n if (isCanonicalDateHint(hint)) {\n return getCanonicalDateInputIssue(hint, input, inputIndex);\n }\n\n return null;\n}\n\nfunction getMultiVariableTextInputIssue(\n hint: FieldInputHint,\n input: Record<string, unknown>,\n inputIndex: number,\n): string | null {\n const rawValue = input[hint.name];\n const variableNames = hint.expectedInput.variableNames ?? [];\n const example = hint.expectedInput.example ?? '{}';\n\n if (rawValue === undefined || rawValue === '') {\n if (!hint.required || variableNames.length === 0) {\n return null;\n }\n\n return buildMultiVariableTextErrorMessage({\n hint,\n inputIndex,\n extra: `Missing variables: ${variableNames.join(', ')}.`,\n example,\n });\n }\n\n if (typeof rawValue !== 'string') {\n return buildMultiVariableTextErrorMessage({\n hint,\n inputIndex,\n extra: `Received ${describeValue(rawValue)}.`,\n example,\n });\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(rawValue);\n } catch {\n return buildMultiVariableTextErrorMessage({\n hint,\n inputIndex,\n extra: `Received ${describeValue(rawValue)}.`,\n example,\n });\n }\n\n if (typeof parsedValue !== 'object' || parsedValue === null || Array.isArray(parsedValue)) {\n return buildMultiVariableTextErrorMessage({\n hint,\n inputIndex,\n extra: `Received ${describeValue(parsedValue)}.`,\n example,\n });\n }\n\n if (!hint.required || variableNames.length === 0) {\n return null;\n }\n\n const values = parsedValue as Record<string, unknown>;\n const missingVariables = variableNames.filter((variableName) => !values[variableName]);\n if (missingVariables.length > 0) {\n return buildMultiVariableTextErrorMessage({\n hint,\n inputIndex,\n extra: `Missing variables: ${missingVariables.join(', ')}.`,\n example,\n });\n }\n\n return null;\n}\n\nfunction getRadioGroupSelectionIssues(\n hints: FieldInputHint[],\n input: Record<string, unknown>,\n inputIndex: number,\n): string[] {\n const groups = new Map<string, FieldInputHint[]>();\n\n for (const hint of hints) {\n if (\n hint.type !== 'radioGroup' ||\n !hint.expectedInput.groupName ||\n (hint.expectedInput.groupMemberNames?.length ?? 0) <= 1\n ) {\n continue;\n }\n\n const groupName = hint.expectedInput.groupName;\n const existing = groups.get(groupName);\n if (existing) {\n existing.push(hint);\n } else {\n groups.set(groupName, [hint]);\n }\n }\n\n const issues: string[] = [];\n\n for (const [groupName, groupHints] of groups) {\n const selectedNames = groupHints\n .filter((hint) => input[hint.name] === 'true')\n .map((hint) => hint.name);\n\n if (selectedNames.length <= 1) {\n continue;\n }\n\n issues.push(\n buildRadioGroupSelectionErrorMessage({\n groupName,\n inputIndex,\n groupMemberNames:\n groupHints[0]?.expectedInput.groupMemberNames ?? groupHints.map((hint) => hint.name),\n selectedNames,\n }),\n );\n }\n\n return issues;\n}\n\nfunction getEnumStringInputIssue(\n hint: FieldInputHint,\n input: Record<string, unknown>,\n inputIndex: number,\n): string | null {\n const rawValue = input[hint.name];\n const allowedValues = hint.expectedInput.allowedValues ?? [];\n const example = hint.expectedInput.example;\n\n if (rawValue === undefined || rawValue === '') {\n return null;\n }\n\n if (typeof rawValue !== 'string') {\n return buildEnumStringErrorMessage({\n hint,\n inputIndex,\n extra: `Received ${describeValue(rawValue)}.`,\n example,\n });\n }\n\n if (allowedValues.length === 0 || allowedValues.includes(rawValue)) {\n return null;\n }\n\n return buildEnumStringErrorMessage({\n hint,\n inputIndex,\n extra: `Received ${describeValue(rawValue)}.`,\n example,\n });\n}\n\nfunction getStringMatrixInputIssue(\n hint: FieldInputHint,\n input: Record<string, unknown>,\n inputIndex: number,\n): string | null {\n const rawValue = input[hint.name];\n const example = hint.expectedInput.example;\n\n if (rawValue === undefined || rawValue === '') {\n return null;\n }\n\n const parsedValue =\n typeof rawValue === 'string' && hint.expectedInput.acceptsJsonString === true\n ? parseTableStringMatrix(rawValue) ?? rawValue\n : rawValue;\n\n const issue = getStringMatrixShapeIssue(parsedValue, hint.expectedInput.columnCount);\n if (!issue) {\n return null;\n }\n\n return buildStringMatrixErrorMessage({\n hint,\n inputIndex,\n extra: issue,\n example,\n });\n}\n\nfunction isCanonicalDateHint(\n hint: FieldInputHint,\n): hint is FieldInputHint & {\n type: 'date' | 'time' | 'dateTime';\n expectedInput: FieldInputHint['expectedInput'] & { canonicalFormat: string };\n} {\n return (\n (hint.type === 'date' || hint.type === 'time' || hint.type === 'dateTime') &&\n typeof hint.expectedInput.canonicalFormat === 'string' &&\n hint.expectedInput.canonicalFormat.length > 0\n );\n}\n\nfunction getCanonicalDateInputIssue(\n hint: FieldInputHint & {\n type: 'date' | 'time' | 'dateTime';\n expectedInput: FieldInputHint['expectedInput'] & { canonicalFormat: string };\n },\n input: Record<string, unknown>,\n inputIndex: number,\n): string | null {\n const rawValue = input[hint.name];\n const example = hint.expectedInput.example;\n\n if (rawValue === undefined || rawValue === '') {\n return null;\n }\n\n if (typeof rawValue !== 'string') {\n return buildCanonicalDateErrorMessage({\n hint,\n inputIndex,\n extra: `Received ${describeValue(rawValue)}.`,\n example,\n });\n }\n\n if (isValidCanonicalDateValue(rawValue, hint.type)) {\n return null;\n }\n\n return buildCanonicalDateErrorMessage({\n hint,\n inputIndex,\n extra: `Received ${describeValue(rawValue)}.`,\n example,\n });\n}\n\nfunction getStringMatrixShapeIssue(value: unknown, expectedColumnCount?: number): string | null {\n if (!Array.isArray(value)) {\n return `Received ${describeValue(value)}.`;\n }\n\n const columnCount = expectedColumnCount ?? getFirstArrayLength(value);\n\n for (let rowIndex = 0; rowIndex < value.length; rowIndex++) {\n const row = value[rowIndex];\n if (!Array.isArray(row)) {\n return `Row ${rowIndex + 1} must be an array of strings. Received ${describeValue(row)}.`;\n }\n\n if (columnCount > 0 && row.length !== columnCount) {\n return `Row ${rowIndex + 1} must contain ${columnCount} cells. Received ${row.length}.`;\n }\n\n for (let colIndex = 0; colIndex < row.length; colIndex++) {\n const cell = row[colIndex];\n if (typeof cell !== 'string') {\n return `Cell [${rowIndex + 1}, ${colIndex + 1}] must be a string. Received ${describeValue(cell)}.`;\n }\n }\n }\n\n return null;\n}\n\nfunction getFirstArrayLength(rows: unknown[]): number {\n for (const row of rows) {\n if (Array.isArray(row)) {\n return row.length;\n }\n }\n\n return 0;\n}\n\nfunction parseTableStringMatrix(rawValue: unknown): string[][] | null {\n if (typeof rawValue !== 'string') {\n return null;\n }\n\n try {\n return JSON.parse(rawValue) as string[][];\n } catch {\n return null;\n }\n}\n\nfunction isValidCanonicalDateValue(value: string, type: 'date' | 'time' | 'dateTime'): boolean {\n switch (type) {\n case 'date':\n return isValidCanonicalDate(value);\n case 'time':\n return isValidCanonicalTime(value);\n case 'dateTime':\n return isValidCanonicalDateTime(value);\n }\n}\n\nfunction isValidCanonicalDate(value: string): boolean {\n const match = value.match(/^(\\d{4})\\/(\\d{2})\\/(\\d{2})$/);\n if (!match) {\n return false;\n }\n\n const [, year, month, day] = match;\n if (!isValidCalendarDate(Number(year), Number(month), Number(day))) {\n return false;\n }\n\n const parsed = parseRendererDateValue(value, 'date');\n return parsed !== null && formatCanonicalDateValue(parsed, 'date') === value;\n}\n\nfunction isValidCanonicalTime(value: string): boolean {\n const match = value.match(/^(\\d{2}):(\\d{2})$/);\n if (!match) {\n return false;\n }\n\n const [, hours, minutes] = match;\n return isValidClockTime(Number(hours), Number(minutes));\n}\n\nfunction isValidCanonicalDateTime(value: string): boolean {\n const match = value.match(/^(\\d{4})\\/(\\d{2})\\/(\\d{2}) (\\d{2}):(\\d{2})$/);\n if (!match) {\n return false;\n }\n\n const [, year, month, day, hours, minutes] = match;\n if (\n !isValidCalendarDate(Number(year), Number(month), Number(day)) ||\n !isValidClockTime(Number(hours), Number(minutes))\n ) {\n return false;\n }\n\n const parsed = parseRendererDateValue(value, 'dateTime');\n return parsed !== null && formatCanonicalDateValue(parsed, 'dateTime') === value;\n}\n\nfunction isValidCalendarDate(year: number, month: number, day: number): boolean {\n if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) {\n return false;\n }\n\n if (month < 1 || month > 12 || day < 1) {\n return false;\n }\n\n const candidate = new Date(year, month - 1, day);\n return (\n candidate.getFullYear() === year &&\n candidate.getMonth() === month - 1 &&\n candidate.getDate() === day\n );\n}\n\nfunction isValidClockTime(hours: number, minutes: number): boolean {\n return (\n Number.isInteger(hours) &&\n Number.isInteger(minutes) &&\n hours >= 0 &&\n hours <= 23 &&\n minutes >= 0 &&\n minutes <= 59\n );\n}\n\nfunction parseRendererDateValue(value: string, type: 'date' | 'time' | 'dateTime'): Date | null {\n const parsed =\n type === 'time' ? new Date(`2021-01-01T${value}`) : new Date(value);\n\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction formatCanonicalDateValue(date: Date, type: 'date' | 'time' | 'dateTime'): string {\n const year = String(date.getFullYear()).padStart(4, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n switch (type) {\n case 'date':\n return `${year}/${month}/${day}`;\n case 'time':\n return `${hours}:${minutes}`;\n case 'dateTime':\n return `${year}/${month}/${day} ${hours}:${minutes}`;\n }\n}\n\nfunction buildMultiVariableTextErrorMessage(args: {\n hint: FieldInputHint;\n inputIndex: number;\n extra: string;\n example: string | string[][];\n}): string {\n const variableLabel =\n args.hint.expectedInput.variableNames && args.hint.expectedInput.variableNames.length > 0\n ? ` with variables: ${args.hint.expectedInput.variableNames.join(', ')}`\n : '';\n\n return `Field \"${args.hint.name}\" (multiVariableText) in input ${args.inputIndex + 1} expects a JSON string object${variableLabel}. Example: ${args.example}. ${args.extra}`;\n}\n\nfunction buildEnumStringErrorMessage(args: {\n hint: FieldInputHint;\n inputIndex: number;\n extra: string;\n example?: string | string[][];\n}): string {\n const allowedValues = (args.hint.expectedInput.allowedValues ?? []).map((value) => JSON.stringify(value));\n const allowedLabel =\n allowedValues.length > 0 ? ` one of: ${allowedValues.join(', ')}` : ' a supported string value';\n const exampleLabel =\n args.example !== undefined ? ` Example: ${JSON.stringify(args.example)}.` : '';\n\n return `Field \"${args.hint.name}\" (${args.hint.type}) in input ${args.inputIndex + 1} expects${allowedLabel}.${exampleLabel} ${args.extra}`.trim();\n}\n\nfunction buildStringMatrixErrorMessage(args: {\n hint: FieldInputHint;\n inputIndex: number;\n extra: string;\n example?: string | string[][];\n}): string {\n const columnCount = args.hint.expectedInput.columnCount;\n const columnHeaders = args.hint.expectedInput.columnHeaders ?? [];\n const columnLabel =\n typeof columnCount === 'number' && columnCount > 0 ? ` with ${columnCount} cells per row` : '';\n const headerLabel =\n columnHeaders.length > 0 ? ` Column headers: ${columnHeaders.join(', ')}.` : '';\n const exampleLabel =\n args.example !== undefined ? ` Example: ${JSON.stringify(args.example)}.` : '';\n const compatibilityLabel =\n args.hint.expectedInput.acceptsJsonString === true\n ? ' JSON string input is also accepted for compatibility.'\n : '';\n\n return `Field \"${args.hint.name}\" (${args.hint.type}) in input ${args.inputIndex + 1} expects a JSON array of string arrays${columnLabel}.${headerLabel}${exampleLabel}${compatibilityLabel} ${args.extra}`.trim();\n}\n\nfunction buildCanonicalDateErrorMessage(args: {\n hint: FieldInputHint & {\n type: 'date' | 'time' | 'dateTime';\n expectedInput: FieldInputHint['expectedInput'] & { canonicalFormat: string };\n };\n inputIndex: number;\n extra: string;\n example?: string | string[][];\n}): string {\n const displayFormat = args.hint.expectedInput.format;\n const displayLabel =\n typeof displayFormat === 'string' &&\n displayFormat.length > 0 &&\n displayFormat !== args.hint.expectedInput.canonicalFormat\n ? ` Display format hint: ${displayFormat}.`\n : '';\n const exampleLabel =\n args.example !== undefined ? ` Example: ${JSON.stringify(args.example)}.` : '';\n\n return `Field \"${args.hint.name}\" (${args.hint.type}) in input ${args.inputIndex + 1} expects canonical stored content in format ${args.hint.expectedInput.canonicalFormat}.${displayLabel}${exampleLabel} ${args.extra}`.trim();\n}\n\nfunction buildRadioGroupSelectionErrorMessage(args: {\n groupName: string;\n inputIndex: number;\n groupMemberNames: string[];\n selectedNames: string[];\n}): string {\n return `Radio group \"${args.groupName}\" in input ${args.inputIndex + 1} allows at most one \"true\" value across fields: ${args.groupMemberNames.join(', ')}. Received \"true\" for: ${args.selectedNames.join(', ')}. Set one field to \"true\" and the others to \"false\".`;\n}\n\nfunction describeValue(value: unknown): string {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n const kind =\n trimmed.startsWith('{') || trimmed.startsWith('[') ? 'string' : 'plain string';\n return `${kind} ${JSON.stringify(value)}`;\n }\n\n if (value === null) {\n return 'null';\n }\n\n if (Array.isArray(value)) {\n return 'array';\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `${typeof value} ${JSON.stringify(value)}`;\n }\n\n return typeof value;\n}\n\nexport function getUniqueStringValues(values: unknown[]): string[] {\n return [\n ...new Set(values.filter((value): value is string => typeof value === 'string' && value.length > 0)),\n ].sort();\n}\n\nfunction getUniqueOrderedStringValues(values: unknown[]): string[] {\n return [\n ...new Set(values.filter((value): value is string => typeof value === 'string' && value.length > 0)),\n ];\n}\n\nfunction getOrderedStringValues(values: unknown[]): string[] {\n return values.filter((value): value is string => typeof value === 'string' && value.length > 0);\n}\n\nfunction collectRadioGroupMembers(\n schemaPages: Array<Array<Record<string, unknown>>>,\n): Map<string, string[]> {\n const groups = new Map<string, string[]>();\n\n for (const page of schemaPages) {\n for (const schema of page) {\n if (schema.readOnly === true || schema.type !== 'radioGroup') {\n continue;\n }\n\n const name = typeof schema.name === 'string' ? schema.name : '';\n const groupName = typeof schema.group === 'string' ? schema.group : '';\n if (!name || !groupName) {\n continue;\n }\n\n const existing = groups.get(groupName);\n if (existing) {\n if (!existing.includes(name)) {\n existing.push(name);\n }\n } else {\n groups.set(groupName, [name]);\n }\n }\n }\n\n return groups;\n}\n\nexport function summarizeBasePdf(\n basePdf: unknown,\n templateDir: string | undefined,\n): ValidationInspection['basePdf'] {\n if (typeof basePdf === 'string') {\n if (basePdf.startsWith('data:')) {\n return { kind: 'dataUri' };\n }\n\n if (basePdf.endsWith('.pdf')) {\n return {\n kind: 'pdfPath',\n path: basePdf,\n resolvedPath: templateDir ? resolve(templateDir, basePdf) : resolve(basePdf),\n };\n }\n\n return { kind: 'string' };\n }\n\n if (basePdf && typeof basePdf === 'object') {\n if ('width' in basePdf && 'height' in basePdf) {\n const width =\n typeof (basePdf as { width?: unknown }).width === 'number'\n ? (basePdf as { width: number }).width\n : undefined;\n const height =\n typeof (basePdf as { height?: unknown }).height === 'number'\n ? (basePdf as { height: number }).height\n : undefined;\n\n return {\n kind: 'blank',\n width,\n height,\n paperSize: width !== undefined && height !== undefined ? detectPaperSize(width, height) : null,\n };\n }\n\n return { kind: 'object' };\n }\n return { kind: 'missing' };\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { extname, join, resolve } from 'node:path';\nimport { getDefaultFont, isUrlSafeToFetch } from '@pdfme/common';\nimport type { Font } from '@pdfme/common';\nimport { CliError, fail } from './contract.js';\n\nconst CACHE_DIR = join(homedir(), '.pdfme', 'fonts');\nconst NOTO_SANS_JP_URL =\n 'https://github.com/google/fonts/raw/main/ofl/notosansjp/NotoSansJP%5Bwght%5D.ttf';\nexport const NOTO_CACHE_FILE = join(CACHE_DIR, 'NotoSansJP-Regular.ttf');\nconst REMOTE_FONT_TIMEOUT_MS = 15000;\nconst MAX_REMOTE_FONT_BYTES = 32 * 1024 * 1024; // 32 MiB\n\nexport type ExplicitFontSourceKind = 'localPath' | 'url' | 'dataUri' | 'inlineBytes' | 'invalid';\nexport type ExplicitFontRemoteProvider = 'genericPublic' | 'googleFontsAsset' | 'googleFontsStylesheet';\n\nexport interface ExplicitFontSourceDiagnosis {\n fontName: string;\n kind: ExplicitFontSourceKind;\n provider?: ExplicitFontRemoteProvider;\n path?: string;\n resolvedPath?: string;\n exists?: boolean;\n url?: string;\n mediaType?: string;\n formatHint?: string | null;\n supportedFormat?: boolean;\n needsNetwork: boolean;\n dataType?: string;\n}\n\ninterface ResolveFontOptions {\n fontArgs?: string[];\n hasCJK: boolean;\n noAutoFont: boolean;\n verbose: boolean;\n hasExplicitFontConfig?: boolean;\n}\n\nfunction ensureCacheDir(): void {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n}\n\nexport async function downloadNotoSansJP(verbose: boolean): Promise<Uint8Array | null> {\n if (existsSync(NOTO_CACHE_FILE)) {\n if (verbose) console.error('Using cached NotoSansJP from', NOTO_CACHE_FILE);\n return new Uint8Array(readFileSync(NOTO_CACHE_FILE)) as Uint8Array<ArrayBuffer>;\n }\n\n ensureCacheDir();\n console.error('Downloading NotoSansJP for CJK support...');\n\n try {\n const response = await fetch(NOTO_SANS_JP_URL);\n if (!response.ok) {\n console.error(`Warning: Failed to download NotoSansJP (HTTP ${response.status})`);\n return null;\n }\n const buffer = new Uint8Array(await response.arrayBuffer()) as Uint8Array<ArrayBuffer>;\n writeFileSync(NOTO_CACHE_FILE, buffer);\n console.error('Cached NotoSansJP to', NOTO_CACHE_FILE);\n return buffer;\n } catch (error) {\n console.error(\n 'Warning: Could not download NotoSansJP. CJK text may not render correctly.',\n error instanceof Error ? error.message : '',\n );\n return null;\n }\n}\n\nexport function parseCustomFonts(fontArgs: string[]): Font {\n const font: Font = {};\n for (let i = 0; i < fontArgs.length; i++) {\n const arg = fontArgs[i];\n const eqIndex = arg.indexOf('=');\n if (eqIndex === -1) {\n fail(\n `Invalid --font format ${JSON.stringify(arg)}. Expected name=path, for example \"NotoSansJP=./fonts/NotoSansJP.ttf\".`,\n { code: 'EARG', exitCode: 1 },\n );\n }\n const name = arg.slice(0, eqIndex);\n const filePath = resolve(arg.slice(eqIndex + 1));\n if (!existsSync(filePath)) {\n fail(`Font file not found: ${filePath}`, { code: 'EIO', exitCode: 3 });\n }\n\n const extension = extname(filePath).toLowerCase();\n if (extension !== '.ttf') {\n fail(\n `Unsupported font format for ${filePath}. @pdfme/cli currently guarantees only .ttf custom fonts.`,\n { code: 'EUNSUPPORTED', exitCode: 1 },\n );\n }\n\n font[name] = {\n data: new Uint8Array(readFileSync(filePath)) as Uint8Array<ArrayBuffer>,\n fallback: i === 0,\n subset: true,\n };\n }\n return font;\n}\n\nexport function analyzeExplicitFontRecord(\n fontRecord: Record<string, unknown>,\n templateDir?: string,\n): {\n sources: ExplicitFontSourceDiagnosis[];\n issues: string[];\n warnings: string[];\n} {\n const issues: string[] = [];\n const warnings: string[] = [];\n const sources: ExplicitFontSourceDiagnosis[] = [];\n\n for (const fontName of Object.keys(fontRecord).sort()) {\n const result = analyzeExplicitFontSource(fontName, fontRecord[fontName], templateDir);\n sources.push(result.source);\n issues.push(...result.issues);\n warnings.push(...result.warnings);\n }\n\n return { sources, issues, warnings };\n}\n\nexport async function normalizeExplicitFontOption(\n jobFont: unknown,\n templateDir?: string,\n): Promise<Font | undefined> {\n if (jobFont === undefined) {\n return undefined;\n }\n\n if (typeof jobFont !== 'object' || jobFont === null || Array.isArray(jobFont)) {\n fail('Unified job options.font must be an object.', {\n code: 'EARG',\n exitCode: 1,\n });\n }\n\n const normalized: Font = {};\n const fontRecord = jobFont as Record<string, unknown>;\n\n for (const fontName of Object.keys(fontRecord).sort()) {\n normalized[fontName] = await normalizeExplicitFontSource(fontName, fontRecord[fontName], templateDir);\n }\n\n return normalized;\n}\n\nfunction analyzeExplicitFontSource(\n fontName: string,\n value: unknown,\n templateDir?: string,\n): {\n source: ExplicitFontSourceDiagnosis;\n issues: string[];\n warnings: string[];\n} {\n const issues: string[] = [];\n const warnings: string[] = [];\n\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n issues.push(`Font config for ${fontName} must be an object with a \"data\" field.`);\n return {\n source: {\n fontName,\n kind: 'invalid',\n needsNetwork: false,\n dataType: getValueType(value),\n },\n issues,\n warnings,\n };\n }\n\n const record = value as Record<string, unknown>;\n const data = record.data;\n if (data === undefined) {\n issues.push(`Font config for ${fontName} is missing \"data\".`);\n return {\n source: {\n fontName,\n kind: 'invalid',\n needsNetwork: false,\n dataType: 'missing',\n },\n issues,\n warnings,\n };\n }\n\n if (typeof data === 'string') {\n if (data.startsWith('data:')) {\n return analyzeDataUriFontSource(fontName, data);\n }\n\n const parsedUrl = tryParseUrl(data);\n if (parsedUrl) {\n if (parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:') {\n return analyzeUrlFontSource(fontName, parsedUrl);\n }\n\n issues.push(\n `Font source for ${fontName} uses unsupported URL protocol \"${parsedUrl.protocol}\". Use a local .ttf path, a data URI, or an https URL.`,\n );\n return {\n source: {\n fontName,\n kind: 'invalid',\n needsNetwork: false,\n dataType: 'string',\n },\n issues,\n warnings,\n };\n }\n\n return analyzeLocalFontSource(fontName, data, templateDir);\n }\n\n if (data instanceof Uint8Array || data instanceof ArrayBuffer) {\n return {\n source: {\n fontName,\n kind: 'inlineBytes',\n needsNetwork: false,\n dataType: getValueType(data),\n },\n issues,\n warnings,\n };\n }\n\n issues.push(`Font source for ${fontName} has unsupported data type ${getValueType(data)}.`);\n return {\n source: {\n fontName,\n kind: 'invalid',\n needsNetwork: false,\n dataType: getValueType(data),\n },\n issues,\n warnings,\n };\n}\n\nfunction analyzeLocalFontSource(\n fontName: string,\n pathValue: string,\n templateDir?: string,\n): {\n source: ExplicitFontSourceDiagnosis;\n issues: string[];\n warnings: string[];\n} {\n const issues: string[] = [];\n const warnings: string[] = [];\n const resolvedPath = templateDir ? resolve(templateDir, pathValue) : resolve(pathValue);\n const exists = existsSync(resolvedPath);\n const formatHint = detectPathFormatHint(resolvedPath);\n const formatResult = evaluateFontFormat(fontName, formatHint, `Font file for ${fontName}`);\n\n if (!exists) {\n issues.push(`Font file for ${fontName} not found: ${resolvedPath}`);\n }\n if (formatResult.issue) {\n issues.push(formatResult.issue);\n }\n if (formatResult.warning) {\n warnings.push(formatResult.warning);\n }\n\n return {\n source: {\n fontName,\n kind: 'localPath',\n path: pathValue,\n resolvedPath,\n exists,\n formatHint,\n supportedFormat: formatResult.supportedFormat,\n needsNetwork: false,\n dataType: 'string',\n },\n issues,\n warnings,\n };\n}\n\nfunction analyzeUrlFontSource(\n fontName: string,\n url: URL,\n): {\n source: ExplicitFontSourceDiagnosis;\n issues: string[];\n warnings: string[];\n} {\n const issues: string[] = [];\n const warnings: string[] = [];\n const provider = detectRemoteFontProvider(url);\n const formatHint = detectPathFormatHint(url.pathname);\n const formatResult = evaluateFontFormat(fontName, formatHint, `Font URL for ${fontName}`);\n\n if (provider === 'googleFontsStylesheet') {\n issues.push(\n `Font URL for ${fontName} uses the unsupported Google Fonts stylesheet API. Use the direct fonts.gstatic.com asset URL or download the font locally.`,\n );\n }\n if (!isUrlSafeToFetch(url.toString())) {\n issues.push(\n `Font URL for ${fontName} is invalid or unsafe. Only http: and https: URLs pointing to public hosts are allowed.`,\n );\n }\n if (provider !== 'googleFontsStylesheet' && formatResult.issue) {\n issues.push(formatResult.issue);\n }\n if (provider !== 'googleFontsStylesheet' && formatResult.warning) {\n warnings.push(formatResult.warning);\n }\n\n return {\n source: {\n fontName,\n kind: 'url',\n provider,\n url: url.toString(),\n formatHint,\n supportedFormat: formatResult.supportedFormat,\n needsNetwork: true,\n dataType: 'string',\n },\n issues,\n warnings,\n };\n}\n\nfunction analyzeDataUriFontSource(\n fontName: string,\n dataUri: string,\n): {\n source: ExplicitFontSourceDiagnosis;\n issues: string[];\n warnings: string[];\n} {\n const issues: string[] = [];\n const warnings: string[] = [];\n const mediaType = getDataUriMediaType(dataUri);\n const formatHint = detectDataUriFormatHint(mediaType);\n const formatResult = evaluateFontFormat(fontName, formatHint, `Font data URI for ${fontName}`);\n\n if (formatResult.issue) {\n issues.push(formatResult.issue);\n }\n if (formatResult.warning) {\n warnings.push(formatResult.warning);\n }\n\n return {\n source: {\n fontName,\n kind: 'dataUri',\n mediaType,\n formatHint,\n supportedFormat: formatResult.supportedFormat,\n needsNetwork: false,\n dataType: 'string',\n },\n issues,\n warnings,\n };\n}\n\nasync function normalizeExplicitFontSource(\n fontName: string,\n value: unknown,\n templateDir?: string,\n): Promise<Font[string]> {\n const analysis = analyzeExplicitFontSource(fontName, value, templateDir);\n\n for (const issue of analysis.issues) {\n const code = issue.includes('not found')\n ? 'EIO'\n : issue.includes('unsupported')\n || issue.includes('unsafe')\n || issue.includes('uses .')\n ? 'EUNSUPPORTED'\n : 'EARG';\n fail(issue, { code, exitCode: code === 'EIO' ? 3 : 1 });\n }\n\n const record = value as Record<string, unknown>;\n const data = record.data;\n\n if (analysis.source.kind === 'localPath') {\n return {\n ...record,\n data: new Uint8Array(readFileSync(analysis.source.resolvedPath!)) as Uint8Array<ArrayBuffer>,\n };\n }\n\n if (analysis.source.kind === 'url') {\n return {\n ...record,\n data: await fetchRemoteFontSource(analysis.source),\n };\n }\n\n if (\n analysis.source.kind === 'dataUri'\n || analysis.source.kind === 'inlineBytes'\n ) {\n const normalizedData =\n typeof data === 'string'\n ? data\n : data instanceof Uint8Array\n ? (data as Uint8Array<ArrayBuffer>)\n : (data as ArrayBuffer);\n return {\n ...record,\n data: normalizedData,\n };\n }\n\n fail(`Font source for ${fontName} has unsupported data type ${getValueType(data)}.`, {\n code: 'EARG',\n exitCode: 1,\n });\n}\n\nasync function fetchRemoteFontSource(\n source: ExplicitFontSourceDiagnosis,\n): Promise<Uint8Array<ArrayBuffer>> {\n const url = source.url!;\n try {\n const response = await fetch(url, {\n signal: AbortSignal.timeout(REMOTE_FONT_TIMEOUT_MS),\n });\n if (!response.ok) {\n failRemoteFontFetch(source, `Failed to fetch remote font data from ${url}. HTTP ${response.status}`);\n }\n\n const contentLengthHeader = response.headers.get('content-length');\n const declaredLength = contentLengthHeader ? Number(contentLengthHeader) : Number.NaN;\n if (Number.isFinite(declaredLength) && declaredLength > MAX_REMOTE_FONT_BYTES) {\n failRemoteFontFetch(\n source,\n `Remote font data from ${url} exceeds the ${MAX_REMOTE_FONT_BYTES}-byte safety limit.`,\n );\n }\n\n const buffer = await readResponseBodyWithLimit(response, source);\n return buffer;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n failRemoteFontFetch(\n source,\n `Failed to fetch remote font data from ${url}. ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction failRemoteFontFetch(source: ExplicitFontSourceDiagnosis, message: string): never {\n fail(message, {\n code: 'EFONT',\n exitCode: 2,\n details: {\n fontName: source.fontName,\n url: source.url,\n provider: source.provider,\n timeoutMs: REMOTE_FONT_TIMEOUT_MS,\n maxBytes: MAX_REMOTE_FONT_BYTES,\n },\n });\n}\n\nasync function readResponseBodyWithLimit(\n response: Response,\n source: ExplicitFontSourceDiagnosis,\n): Promise<Uint8Array<ArrayBuffer>> {\n if (!response.body) {\n const buffer = new Uint8Array(await response.arrayBuffer()) as Uint8Array<ArrayBuffer>;\n if (buffer.byteLength > MAX_REMOTE_FONT_BYTES) {\n failRemoteFontFetch(\n source,\n `Remote font data from ${source.url} exceeds the ${MAX_REMOTE_FONT_BYTES}-byte safety limit.`,\n );\n }\n return buffer;\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (!value) {\n continue;\n }\n\n total += value.byteLength;\n if (total > MAX_REMOTE_FONT_BYTES) {\n failRemoteFontFetch(\n source,\n `Remote font data from ${source.url} exceeds the ${MAX_REMOTE_FONT_BYTES}-byte safety limit.`,\n );\n }\n\n chunks.push(value);\n }\n\n const merged = new Uint8Array(total) as Uint8Array<ArrayBuffer>;\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged;\n}\n\nfunction tryParseUrl(value: string): URL | null {\n try {\n return new URL(value);\n } catch {\n return null;\n }\n}\n\nfunction detectRemoteFontProvider(url: URL): ExplicitFontRemoteProvider {\n const hostname = url.hostname.toLowerCase();\n if (hostname === 'fonts.gstatic.com' || hostname.endsWith('.fonts.gstatic.com')) {\n return 'googleFontsAsset';\n }\n if (hostname === 'fonts.googleapis.com' || hostname.endsWith('.fonts.googleapis.com')) {\n return 'googleFontsStylesheet';\n }\n return 'genericPublic';\n}\n\nfunction getDataUriMediaType(value: string): string | undefined {\n const match = value.match(/^data:([^;,]+)/i);\n return match ? match[1] : undefined;\n}\n\nfunction detectPathFormatHint(value: string): string | null {\n const extension = extname(value).toLowerCase();\n return extension ? extension.slice(1) : null;\n}\n\nfunction detectDataUriFormatHint(mediaType?: string): string | null {\n if (!mediaType) {\n return null;\n }\n\n const lower = mediaType.toLowerCase();\n if (lower.includes('ttf') || lower.endsWith('/sfnt')) {\n return 'ttf';\n }\n if (lower.includes('otf')) {\n return 'otf';\n }\n if (lower.includes('ttc')) {\n return 'ttc';\n }\n return null;\n}\n\nfunction evaluateFontFormat(\n fontName: string,\n formatHint: string | null,\n sourceLabel: string,\n): {\n supportedFormat?: boolean;\n issue?: string;\n warning?: string;\n} {\n if (formatHint === 'ttf') {\n return { supportedFormat: true };\n }\n\n if (formatHint === null) {\n return {\n warning: `${sourceLabel} does not clearly advertise a .ttf format. @pdfme/cli currently guarantees only .ttf custom fonts.`,\n };\n }\n\n return {\n supportedFormat: false,\n issue: `${sourceLabel} uses .${formatHint}. @pdfme/cli currently guarantees only .ttf custom fonts for ${fontName}.`,\n };\n}\n\nfunction getValueType(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (value instanceof Uint8Array) return 'Uint8Array';\n if (value instanceof ArrayBuffer) return 'ArrayBuffer';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\nexport async function resolveFont(\n options: ResolveFontOptions,\n): Promise<Font> {\n const {\n fontArgs,\n hasCJK,\n noAutoFont,\n verbose,\n hasExplicitFontConfig = false,\n } = options;\n\n if (fontArgs && fontArgs.length > 0) {\n return parseCustomFonts(fontArgs);\n }\n\n const defaultFont = getDefaultFont();\n\n if (!hasCJK || hasExplicitFontConfig) {\n return defaultFont;\n }\n\n if (noAutoFont) {\n fail(\n 'CJK text detected, but automatic NotoSansJP download is disabled by --noAutoFont and no explicit font source was provided. Provide --font or options.font.',\n {\n code: 'EFONT',\n exitCode: 2,\n details: {\n fontName: 'NotoSansJP',\n cacheFile: NOTO_CACHE_FILE,\n autoFont: false,\n },\n },\n );\n }\n\n const notoData = await downloadNotoSansJP(verbose);\n if (!notoData) {\n fail(\n 'CJK text detected, but NotoSansJP could not be resolved automatically. Re-run with network access, warm the font cache, or provide --font / options.font.',\n {\n code: 'EFONT',\n exitCode: 2,\n details: {\n fontName: 'NotoSansJP',\n cacheFile: NOTO_CACHE_FILE,\n downloadUrl: NOTO_SANS_JP_URL,\n autoFont: true,\n },\n },\n );\n }\n\n return {\n NotoSansJP: { data: notoData, fallback: true, subset: true },\n ...Object.fromEntries(\n Object.entries(defaultFont).map(([k, v]) => [k, { ...v, fallback: false }]),\n ),\n } as Font;\n}\n","// CJK Unicode ranges\nconst CJK_RANGES = [\n [0x4e00, 0x9fff], // CJK Unified Ideographs\n [0x3400, 0x4dbf], // CJK Unified Ideographs Extension A\n [0x3040, 0x309f], // Hiragana\n [0x30a0, 0x30ff], // Katakana\n [0xac00, 0xd7af], // Hangul Syllables\n [0x3000, 0x303f], // CJK Symbols and Punctuation\n [0xff00, 0xffef], // Halfwidth and Fullwidth Forms\n] as const;\n\nexport function containsCJK(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n for (const [start, end] of CJK_RANGES) {\n if (code >= start && code <= end) return true;\n }\n }\n return false;\n}\n\nexport function detectCJKInTemplate(template: { schemas?: unknown }): boolean {\n if (!Array.isArray(template.schemas)) {\n return false;\n }\n\n for (const page of template.schemas) {\n if (!Array.isArray(page)) {\n continue;\n }\n\n for (const schema of page) {\n if (typeof schema !== 'object' || schema === null) {\n continue;\n }\n\n if (typeof schema.content === 'string' && containsCJK(schema.content)) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function detectCJKInInputs(inputs: unknown): boolean {\n if (!Array.isArray(inputs)) {\n return false;\n }\n\n for (const input of inputs) {\n if (typeof input !== 'object' || input === null) {\n continue;\n }\n\n for (const value of Object.values(input)) {\n if (typeof value === 'string' && containsCJK(value)) {\n return true;\n }\n }\n }\n return false;\n}\n","interface Schema {\n name: string;\n type: string;\n position: { x: number; y: number };\n width: number;\n height: number;\n [key: string]: unknown;\n}\n\ntype ImageFormat = 'png' | 'jpeg';\n\nconst schemaColorCache = new Map<string, string>();\n\nfunction hashString(value: string): number {\n let hash = 0;\n\n for (let i = 0; i < value.length; i++) {\n hash = (hash * 31 + value.charCodeAt(i)) >>> 0;\n }\n\n return hash;\n}\n\nfunction hslToHex(hue: number, saturation: number, lightness: number): string {\n const s = saturation / 100;\n const l = lightness / 100;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const h = hue / 60;\n const x = c * (1 - Math.abs((h % 2) - 1));\n\n let r = 0;\n let g = 0;\n let b = 0;\n\n if (h >= 0 && h < 1) {\n r = c;\n g = x;\n } else if (h < 2) {\n r = x;\n g = c;\n } else if (h < 3) {\n g = c;\n b = x;\n } else if (h < 4) {\n g = x;\n b = c;\n } else if (h < 5) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n\n const m = l - c / 2;\n const toHex = (channel: number) =>\n Math.round((channel + m) * 255)\n .toString(16)\n .padStart(2, '0');\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction getSchemaColor(type: string): string {\n const normalizedType = type.trim().toLowerCase();\n const cached = schemaColorCache.get(normalizedType);\n if (cached) {\n return cached;\n }\n\n // Keep colors stable per schema type without maintaining a manual lookup table.\n const hash = hashString(normalizedType);\n const color = hslToHex(hash % 360, 65 + (hash % 12), 42 + ((hash >> 8) % 10));\n schemaColorCache.set(normalizedType, color);\n return color;\n}\n\ninterface CanvasContext {\n drawImage(img: unknown, x: number, y: number): void;\n beginPath(): void;\n moveTo(x: number, y: number): void;\n lineTo(x: number, y: number): void;\n stroke(): void;\n fillRect(x: number, y: number, w: number, h: number): void;\n strokeRect(x: number, y: number, w: number, h: number): void;\n fillText(text: string, x: number, y: number): void;\n measureText(text: string): { width: number };\n setLineDash(segments: number[]): void;\n strokeStyle: string;\n fillStyle: string;\n lineWidth: number;\n font: string;\n globalAlpha: number;\n}\n\nfunction drawGridLines(\n ctx: CanvasContext,\n pxPerMm: number,\n pageWidthMm: number,\n pageHeightMm: number,\n imgWidth: number,\n imgHeight: number,\n gridSizeMm: number,\n withLabels: boolean,\n): void {\n ctx.strokeStyle = 'rgba(128, 128, 128, 0.3)';\n ctx.lineWidth = 1;\n\n // Vertical lines\n for (let x = 0; x <= pageWidthMm; x += gridSizeMm) {\n const px = x * pxPerMm;\n ctx.beginPath();\n ctx.moveTo(px, 0);\n ctx.lineTo(px, imgHeight);\n ctx.stroke();\n\n if (withLabels && x % (gridSizeMm * 2) === 0 && x > 0) {\n ctx.fillStyle = 'rgba(100, 100, 100, 0.7)';\n ctx.font = `${Math.max(9, pxPerMm * 2.5)}px sans-serif`;\n ctx.fillText(`${x}`, px + 2, 12);\n }\n }\n\n // Horizontal lines\n for (let y = 0; y <= pageHeightMm; y += gridSizeMm) {\n const px = y * pxPerMm;\n ctx.beginPath();\n ctx.moveTo(0, px);\n ctx.lineTo(imgWidth, px);\n ctx.stroke();\n\n if (withLabels && y % (gridSizeMm * 2) === 0 && y > 0) {\n ctx.fillStyle = 'rgba(100, 100, 100, 0.7)';\n ctx.font = `${Math.max(9, pxPerMm * 2.5)}px sans-serif`;\n ctx.fillText(`${y}`, 2, px - 2);\n }\n }\n}\n\nfunction drawSchemaOverlays(\n ctx: CanvasContext,\n schemas: Schema[],\n pxPerMm: number,\n): void {\n for (const schema of schemas) {\n const color = getSchemaColor(schema.type);\n const x = schema.position.x * pxPerMm;\n const y = schema.position.y * pxPerMm;\n const w = schema.width * pxPerMm;\n const h = schema.height * pxPerMm;\n\n // Dashed rectangle border\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.setLineDash([4, 2]);\n ctx.strokeRect(x, y, w, h);\n ctx.setLineDash([]);\n\n // Label background\n const label = `${schema.name} (${schema.type})`;\n const fontSize = Math.max(10, Math.min(14, pxPerMm * 3));\n ctx.font = `${fontSize}px sans-serif`;\n const metrics = ctx.measureText(label);\n const labelHeight = fontSize + 4;\n const labelWidth = metrics.width + 6;\n\n ctx.fillStyle = color;\n ctx.globalAlpha = 0.85;\n ctx.fillRect(x, y - labelHeight, labelWidth, labelHeight);\n ctx.globalAlpha = 1;\n\n // Label text (white on colored background)\n ctx.fillStyle = '#FFFFFF';\n ctx.fillText(label, x + 3, y - 3);\n }\n}\n\nasync function loadAndPrepareCanvas(\n imageBuffer: ArrayBuffer,\n): Promise<{\n canvas: { toBuffer(mime: string): Buffer };\n ctx: CanvasContext;\n img: { width: number; height: number };\n}> {\n const { createCanvas, loadImage } = await import('@napi-rs/canvas');\n const img = await loadImage(Buffer.from(imageBuffer));\n const canvas = createCanvas(img.width, img.height);\n const ctx = canvas.getContext('2d') as unknown as CanvasContext;\n ctx.drawImage(img, 0, 0);\n return { canvas, ctx, img };\n}\n\nfunction bufferToArrayBuffer(buffer: Buffer): ArrayBuffer {\n const arrayBuffer = new ArrayBuffer(buffer.byteLength);\n new Uint8Array(arrayBuffer).set(buffer);\n return arrayBuffer;\n}\n\n/**\n * Draw grid lines and schema boundary overlays on a generated PDF page image.\n * Used by `pdfme generate --grid`.\n */\nexport async function drawGridOnImage(\n imageBuffer: ArrayBuffer,\n schemas: Schema[],\n gridSizeMm: number,\n pageWidthMm: number,\n pageHeightMm: number,\n imageType: ImageFormat,\n): Promise<ArrayBuffer> {\n const { canvas, ctx, img } = await loadAndPrepareCanvas(imageBuffer);\n const pxPerMm = img.width / pageWidthMm;\n\n drawGridLines(ctx, pxPerMm, pageWidthMm, pageHeightMm, img.width, img.height, gridSizeMm, false);\n drawSchemaOverlays(ctx, schemas, pxPerMm);\n\n const mimeType = imageType === 'jpeg' ? 'image/jpeg' : 'image/png';\n return bufferToArrayBuffer(canvas.toBuffer(mimeType));\n}\n\n/**\n * Draw grid lines with mm coordinate labels on a plain PDF image.\n * Used by `pdfme pdf2img --grid`.\n */\nexport async function drawGridOnPdfImage(\n imageBuffer: ArrayBuffer,\n gridSizeMm: number,\n pageWidthMm: number,\n pageHeightMm: number,\n imageType: ImageFormat,\n): Promise<ArrayBuffer> {\n const { canvas, ctx, img } = await loadAndPrepareCanvas(imageBuffer);\n const pxPerMm = img.width / pageWidthMm;\n\n drawGridLines(ctx, pxPerMm, pageWidthMm, pageHeightMm, img.width, img.height, gridSizeMm, true);\n\n const mimeType = imageType === 'jpeg' ? 'image/jpeg' : 'image/png';\n return bufferToArrayBuffer(canvas.toBuffer(mimeType));\n}\n","import { defineCommand } from 'citty';\nimport { PDFDocument } from '@pdfme/pdf-lib';\nimport { generate } from '@pdfme/generator';\nimport { pdf2img, pdf2size } from '@pdfme/converter';\nimport { checkGenerateProps } from '@pdfme/common';\nimport type { Font, GenerateProps, Template } from '@pdfme/common';\nimport {\n assertNoUnknownFlags,\n fail,\n parseEnumArg,\n parsePositiveNumberArg,\n printJson,\n runWithContract,\n} from '../contract.js';\nimport { validateInputContracts } from '../diagnostics.js';\nimport {\n ensureSafeDefaultOutputPath,\n getImageOutputPaths,\n loadInput,\n resolveBasePdf,\n writeOutput,\n} from '../utils.js';\nimport { normalizeExplicitFontOption, resolveFont } from '../fonts.js';\nimport { detectCJKInTemplate, detectCJKInInputs } from '../cjk-detect.js';\nimport { drawGridOnImage } from '../grid.js';\nimport { schemaPlugins, schemaTypes } from '../schema-plugins.js';\n\nconst generateArgs = {\n file: {\n type: 'positional' as const,\n description: 'Unified JSON file: { template, inputs }',\n required: false,\n },\n template: { type: 'string' as const, alias: 't', description: 'Template JSON file' },\n inputs: { type: 'string' as const, alias: 'i', description: 'Input data JSON file' },\n output: { type: 'string' as const, alias: 'o', description: 'Output PDF path', default: 'output.pdf' },\n force: {\n type: 'boolean' as const,\n description: 'Allow overwriting the implicit default output path',\n default: false,\n },\n image: { type: 'boolean' as const, description: 'Also output PNG images per page', default: false },\n imageFormat: { type: 'string' as const, description: 'Image format: png | jpeg', default: 'png' },\n scale: { type: 'string' as const, description: 'Image render scale', default: '1' },\n grid: {\n type: 'boolean' as const,\n description: 'Overlay grid + schema boundaries on images',\n default: false,\n },\n gridSize: { type: 'string' as const, description: 'Grid spacing in mm', default: '10' },\n font: {\n type: 'string' as const,\n description: 'Custom font(s): name=path (comma-separated for multiple)',\n },\n basePdf: { type: 'string' as const, description: 'Override basePdf with PDF file path' },\n noAutoFont: {\n type: 'boolean' as const,\n description: 'Disable automatic CJK font download',\n default: false,\n },\n verbose: { type: 'boolean' as const, alias: 'v', description: 'Verbose output', default: false },\n json: { type: 'boolean' as const, description: 'Machine-readable JSON output', default: false },\n};\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate PDF from template and inputs',\n },\n args: generateArgs,\n async run({ args, rawArgs }) {\n return runWithContract({ json: Boolean(args.json) }, async () => {\n assertNoUnknownFlags(rawArgs, generateArgs);\n\n const imageFormat = parseEnumArg('imageFormat', args.imageFormat, ['png', 'jpeg']);\n const scale = parsePositiveNumberArg('scale', args.scale);\n const gridSize = parsePositiveNumberArg('gridSize', args.gridSize);\n\n ensureSafeDefaultOutputPath({\n filePath: args.output,\n rawArgs,\n optionName: 'output',\n optionAlias: 'o',\n defaultValue: 'output.pdf',\n force: Boolean(args.force),\n });\n\n const { template: rawTemplate, inputs, options: rawJobOptions, templateDir } = loadInput({\n _: args.file ? [args.file] : [],\n template: args.template,\n inputs: args.inputs,\n });\n\n const template = resolveBasePdf(rawTemplate, args.basePdf, templateDir) as unknown as Template;\n const mode = args.file ? 'job' : 'template+inputs';\n const templatePageCount = normalizeSchemaPages(template.schemas).length;\n const jobOptions = normalizeJobOptions(rawJobOptions);\n assertSupportedSchemaTypes(template);\n\n const fontArgs = args.font\n ? args.font\n .split(',')\n .map((value: string) => value.trim())\n .filter(Boolean)\n : undefined;\n\n const hasCJK = detectCJKInTemplate(template as any) || detectCJKInInputs(inputs);\n const resolvedFont = await resolveFont({\n fontArgs,\n hasCJK,\n noAutoFont: Boolean(args.noAutoFont),\n verbose: Boolean(args.verbose),\n hasExplicitFontConfig: hasExplicitFontEntries(jobOptions.font),\n });\n const mergedFontConfig = mergeFontConfig(jobOptions.font, resolvedFont);\n const font = (await normalizeExplicitFontOption(mergedFontConfig, templateDir)) ?? resolvedFont;\n const generateOptions = { ...jobOptions, font };\n\n try {\n checkGenerateProps({ template, inputs, options: generateOptions });\n } catch (error) {\n fail(`Invalid generation input. ${error instanceof Error ? error.message : String(error)}`, {\n code: 'EVALIDATE',\n exitCode: 1,\n cause: error,\n });\n }\n\n validateInputContracts(template as unknown as Record<string, unknown>, inputs);\n\n if (args.verbose) {\n console.error(`Input: ${describeGenerateInput(args.file, args.template, args.inputs)}`);\n console.error(`Mode: ${mode}`);\n console.error(`Template pages: ${templatePageCount}`);\n console.error(`Inputs: ${inputs.length} set(s)`);\n console.error(`Output: ${args.output}`);\n console.error(\n `Images: ${\n args.image || args.grid\n ? `enabled (${imageFormat}, scale=${scale}, grid=${args.grid ? `${gridSize}mm` : 'disabled'})`\n : 'disabled'\n }`,\n );\n console.error(`Fonts: ${Object.keys(font).join(', ')}`);\n if (args.basePdf) {\n console.error(`Base PDF override: ${args.basePdf}`);\n }\n }\n\n const pdf = await generate({\n template,\n inputs,\n options: generateOptions,\n plugins: schemaPlugins as NonNullable<GenerateProps['plugins']>,\n });\n\n const generatedPdf = await PDFDocument.load(pdf, { updateMetadata: false });\n const pageCount = generatedPdf.getPageCount();\n\n writeOutput(args.output, pdf);\n\n const result: Record<string, unknown> = {\n command: 'generate',\n mode,\n templatePageCount,\n inputCount: inputs.length,\n pageCount,\n outputPath: args.output,\n outputBytes: pdf.byteLength,\n };\n\n if (args.image || args.grid) {\n const images = await pdf2img(pdf, { scale, imageType: imageFormat });\n const imagePaths = getImageOutputPaths(args.output, images.length, imageFormat);\n\n if (args.grid) {\n const renderedPageSizes = await pdf2size(pdf);\n\n for (let i = 0; i < images.length; i++) {\n const templateSchemas = template.schemas ?? [];\n const templatePageIndex = i % templateSchemas.length;\n const pageSchemas = (templateSchemas[templatePageIndex] ?? []) as Array<{\n name: string;\n type: string;\n position: { x: number; y: number };\n width: number;\n height: number;\n }>;\n\n const size = renderedPageSizes[i] ?? renderedPageSizes[0] ?? { width: 210, height: 297 };\n\n const gridImage = await drawGridOnImage(\n images[i],\n pageSchemas,\n gridSize,\n size.width,\n size.height,\n imageFormat,\n );\n writeOutput(imagePaths[i], gridImage);\n }\n } else {\n for (let i = 0; i < images.length; i++) {\n writeOutput(imagePaths[i], images[i]);\n }\n }\n\n result.imagePaths = imagePaths;\n }\n\n if (args.json) {\n printJson({ ok: true, ...result });\n } else {\n console.log(`\\u2713 Output: ${args.output} (${formatBytes(pdf.byteLength)})`);\n if (result.imagePaths) {\n for (const img of result.imagePaths as string[]) {\n console.log(`\\u2713 Image: ${img}`);\n }\n }\n }\n });\n },\n});\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction normalizeJobOptions(rawJobOptions: unknown): Record<string, unknown> {\n if (rawJobOptions === undefined) {\n return {};\n }\n\n if (typeof rawJobOptions !== 'object' || rawJobOptions === null || Array.isArray(rawJobOptions)) {\n fail('Unified job options must be a JSON object.', {\n code: 'EARG',\n exitCode: 1,\n });\n }\n\n return rawJobOptions as Record<string, unknown>;\n}\n\nfunction mergeFontConfig(jobFont: unknown, resolvedFont: Font): Font {\n if (jobFont === undefined) {\n return resolvedFont;\n }\n\n if (typeof jobFont !== 'object' || jobFont === null || Array.isArray(jobFont)) {\n fail('Unified job options.font must be an object.', {\n code: 'EARG',\n exitCode: 1,\n });\n }\n\n return {\n ...(jobFont as Font),\n ...resolvedFont,\n };\n}\n\nfunction hasExplicitFontEntries(jobFont: unknown): boolean {\n if (typeof jobFont !== 'object' || jobFont === null || Array.isArray(jobFont)) {\n return false;\n }\n\n return Object.keys(jobFont as Record<string, unknown>).length > 0;\n}\n\nfunction assertSupportedSchemaTypes(template: Template): void {\n const unsupported: string[] = [];\n\n for (const page of normalizeSchemaPages(template.schemas)) {\n for (const schema of page) {\n const type = schema.type;\n if (typeof type === 'string' && !schemaTypes.has(type)) {\n const name = typeof schema.name === 'string' && schema.name.length > 0 ? schema.name : null;\n unsupported.push(\n name ? `Field \"${name}\" has unknown type \"${type}\"` : `Unknown schema type \"${type}\"`,\n );\n }\n }\n }\n\n if (unsupported.length > 0) {\n fail(`Invalid generation input. ${unsupported.join('; ')}`, {\n code: 'EVALIDATE',\n exitCode: 1,\n });\n }\n}\n\nfunction describeGenerateInput(\n file: string | undefined,\n template: string | undefined,\n inputs: string | undefined,\n): string {\n if (file) {\n return file;\n }\n\n if (template || inputs) {\n return `${template ?? '(missing template)'} + ${inputs ?? '(missing inputs)'}`;\n }\n\n return '(unknown)';\n}\n\nfunction normalizeSchemaPages(rawSchemas: unknown): Array<Array<Record<string, unknown>>> {\n if (!Array.isArray(rawSchemas)) {\n return [];\n }\n\n return rawSchemas.map((page) => {\n if (Array.isArray(page)) {\n return page.filter(\n (schema): schema is Record<string, unknown> => typeof schema === 'object' && schema !== null,\n );\n }\n\n if (typeof page === 'object' && page !== null) {\n return Object.values(page).filter(\n (schema): schema is Record<string, unknown> => typeof schema === 'object' && schema !== null,\n );\n }\n\n return [];\n });\n}\n","import { defineCommand } from 'citty';\nimport { checkGenerateProps } from '@pdfme/common';\nimport { assertNoUnknownFlags, printJson, runWithContract } from '../contract.js';\nimport {\n collectInputHints,\n getInputContractIssues,\n inspectTemplate,\n KNOWN_TEMPLATE_KEYS,\n loadValidationSource,\n validateTemplate,\n} from '../diagnostics.js';\nimport { resolveBasePdf } from '../utils.js';\n\nconst validateArgs = {\n file: {\n type: 'positional' as const,\n description: 'Template JSON file, unified job file, or \"-\" for stdin',\n required: false,\n },\n verbose: { type: 'boolean' as const, alias: 'v', description: 'Verbose output', default: false },\n json: { type: 'boolean' as const, description: 'Machine-readable JSON output', default: false },\n strict: { type: 'boolean' as const, description: 'Treat warnings as errors', default: false },\n};\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate a pdfme template JSON file',\n },\n args: validateArgs,\n async run({ args, rawArgs }) {\n return runWithContract({ json: Boolean(args.json) }, async () => {\n assertNoUnknownFlags(rawArgs, validateArgs);\n\n const source = await loadValidationSource(args.file, {\n noInputMessage: 'No validation input provided. Pass a file path or pipe JSON via stdin.',\n });\n const templateUnknownKeys = Object.keys(source.template)\n .filter((key) => !KNOWN_TEMPLATE_KEYS.has(key))\n .sort();\n const inspection = inspectTemplate(source.template, source.templateDir);\n\n const resolvedTemplate = resolveBasePdf(\n source.template,\n undefined,\n source.templateDir,\n ) as Record<string, unknown>;\n\n const result = validateTemplate(resolvedTemplate);\n result.warnings.push(...source.jobWarnings);\n\n if (templateUnknownKeys.length > 0) {\n result.warnings.push(\n `Unknown template top-level field(s): ${templateUnknownKeys.join(', ')}`,\n );\n }\n\n if (source.mode === 'job') {\n try {\n checkGenerateProps({\n template: resolvedTemplate as any,\n inputs: source.inputs as any,\n options: source.options as any,\n });\n } catch (error) {\n result.errors.unshift(error instanceof Error ? error.message : String(error));\n }\n\n result.errors.push(...getInputContractIssues(resolvedTemplate, source.inputs ?? []));\n }\n\n const valid = result.errors.length === 0 && (!args.strict || result.warnings.length === 0);\n const inputCount = source.mode === 'job' ? (source.inputs?.length ?? 0) : undefined;\n\n if (args.verbose) {\n console.error(`Input: ${describeValidationInput(args.file)}`);\n console.error(`Mode: ${source.mode}`);\n console.error(`Template pages: ${result.pages}`);\n console.error(`Fields: ${result.fields}`);\n if (inputCount !== undefined) {\n console.error(`Inputs: ${inputCount} set(s)`);\n }\n console.error(`Valid: ${valid ? 'yes' : 'no'}`);\n console.error(`Strict: ${args.strict ? 'enabled' : 'disabled'}`);\n console.error(`Errors: ${result.errors.length}`);\n console.error(`Warnings: ${result.warnings.length}`);\n }\n\n if (args.json) {\n printJson({\n ok: true,\n command: 'validate',\n valid,\n mode: source.mode,\n templatePageCount: result.pages,\n fieldCount: result.fields,\n ...(inputCount !== undefined ? { inputCount } : {}),\n errors: result.errors,\n warnings: result.warnings,\n inspection,\n inputHints: collectInputHints(source.template),\n });\n } else {\n if (result.errors.length === 0 && result.warnings.length === 0) {\n console.log(\n `\\u2713 Template is valid (${result.pages} page(s), ${result.fields} field(s))`,\n );\n }\n for (const err of result.errors) {\n console.log(`\\u2717 Error: ${err}`);\n }\n for (const warn of result.warnings) {\n console.log(`\\u26a0 Warning: ${warn}`);\n }\n }\n\n if (!valid) {\n process.exit(1);\n }\n });\n },\n});\n\nfunction describeValidationInput(file: string | undefined): string {\n if (!file || file === '-') {\n return 'stdin';\n }\n\n return file;\n}\n","import { basename, extname, join } from 'node:path';\nimport { existsSync, mkdirSync, statSync } from 'node:fs';\nimport { defineCommand } from 'citty';\nimport { pdf2img, pdf2size } from '@pdfme/converter';\nimport {\n assertNoUnknownFlags,\n fail,\n parseEnumArg,\n parsePositiveNumberArg,\n printJson,\n runWithContract,\n} from '../contract.js';\nimport { detectPaperSize, parsePageRange, readPdfFile, writeOutput } from '../utils.js';\nimport { drawGridOnPdfImage } from '../grid.js';\n\nconst pdf2imgArgs = {\n file: { type: 'positional' as const, description: 'Input PDF file', required: false },\n output: { type: 'string' as const, alias: 'o', description: 'Output directory' },\n grid: { type: 'boolean' as const, description: 'Overlay mm grid on images', default: false },\n gridSize: { type: 'string' as const, description: 'Grid spacing in mm', default: '10' },\n scale: { type: 'string' as const, description: 'Render scale', default: '1' },\n imageFormat: { type: 'string' as const, description: 'Image format: png | jpeg', default: 'png' },\n pages: { type: 'string' as const, description: 'Page range (e.g., 1-3, 1,3,5)' },\n verbose: { type: 'boolean' as const, alias: 'v', description: 'Verbose output', default: false },\n json: {\n type: 'boolean' as const,\n description: 'Machine-readable JSON output (includes size info)',\n default: false,\n },\n};\n\nexport default defineCommand({\n meta: {\n name: 'pdf2img',\n description: 'Convert PDF pages to images',\n },\n args: pdf2imgArgs,\n async run({ args, rawArgs }) {\n return runWithContract({ json: Boolean(args.json) }, async () => {\n assertNoUnknownFlags(rawArgs, pdf2imgArgs);\n\n if (!args.file) {\n fail('No input PDF provided.', { code: 'EARG', exitCode: 1 });\n }\n\n const scale = parsePositiveNumberArg('scale', args.scale);\n const gridSize = parsePositiveNumberArg('gridSize', args.gridSize);\n const imageFormat = parseEnumArg('imageFormat', args.imageFormat, ['png', 'jpeg']);\n const pdfData = readPdfFile(args.file);\n const sizes = await pdf2size(pdfData);\n\n const pageIndices = args.pages\n ? parsePageRange(args.pages, sizes.length).map((page) => page - 1)\n : Array.from({ length: sizes.length }, (_, index) => index);\n\n const allImages = await pdf2img(pdfData, {\n scale,\n imageType: imageFormat,\n });\n\n const inputBase = basename(args.file, extname(args.file));\n const ext = imageFormat === 'jpeg' ? 'jpg' : 'png';\n let outputDir = '.';\n\n if (args.output) {\n outputDir = args.output;\n if (existsSync(outputDir)) {\n if (!statSync(outputDir).isDirectory()) {\n fail(`Output path must be a directory for pdf2img: ${args.output}`, {\n code: 'EIO',\n exitCode: 3,\n });\n }\n } else {\n mkdirSync(outputDir, { recursive: true });\n }\n }\n\n if (args.verbose) {\n console.error(`Input: ${args.file}`);\n console.error(`Pages: ${sizes.length}`);\n console.error(`Selected pages: ${pageIndices.map((pageIdx) => pageIdx + 1).join(', ')}`);\n console.error(`Output: ${outputDir}`);\n console.error(`Image format: ${imageFormat}`);\n console.error(`Scale: ${scale}`);\n console.error(`Grid: ${args.grid ? `enabled (${gridSize}mm)` : 'disabled'}`);\n }\n\n const results: Array<{ outputPath: string; pageNumber: number; width: number; height: number }> = [];\n\n for (const pageIdx of pageIndices) {\n let imageData = allImages[pageIdx];\n const size = sizes[pageIdx] ?? { width: 210, height: 297 };\n\n if (args.grid) {\n imageData = await drawGridOnPdfImage(\n imageData,\n gridSize,\n size.width,\n size.height,\n imageFormat,\n );\n }\n\n const outputPath = join(outputDir, `${inputBase}-${pageIdx + 1}.${ext}`);\n writeOutput(outputPath, imageData);\n\n const paperSize = detectPaperSize(size.width, size.height);\n results.push({\n outputPath,\n pageNumber: pageIdx + 1,\n width: Math.round(size.width * 100) / 100,\n height: Math.round(size.height * 100) / 100,\n });\n\n if (!args.json) {\n const sizeLabel = paperSize ? `, ${paperSize}` : '';\n console.log(\n `\\u2713 ${outputPath} (${size.width.toFixed(0)}\\u00d7${size.height.toFixed(0)}mm${sizeLabel})`,\n );\n }\n }\n\n if (args.json) {\n printJson({\n ok: true,\n command: 'pdf2img',\n pageCount: sizes.length,\n selectedPageCount: results.length,\n outputDir,\n outputPaths: results.map((result) => result.outputPath),\n pages: results,\n });\n }\n });\n },\n});\n","import { defineCommand } from 'citty';\nimport { pdf2size } from '@pdfme/converter';\nimport { assertNoUnknownFlags, fail, printJson, runWithContract } from '../contract.js';\nimport { detectPaperSize, readPdfFile } from '../utils.js';\n\nconst pdf2sizeArgs = {\n file: { type: 'positional' as const, description: 'Input PDF file', required: false },\n verbose: { type: 'boolean' as const, alias: 'v', description: 'Verbose output', default: false },\n json: { type: 'boolean' as const, description: 'Machine-readable JSON output', default: false },\n};\n\nexport default defineCommand({\n meta: {\n name: 'pdf2size',\n description: 'Get page dimensions of a PDF file',\n },\n args: pdf2sizeArgs,\n async run({ args, rawArgs }) {\n return runWithContract({ json: Boolean(args.json) }, async () => {\n assertNoUnknownFlags(rawArgs, pdf2sizeArgs);\n\n if (!args.file) {\n fail('No input PDF provided.', { code: 'EARG', exitCode: 1 });\n }\n\n const pdfData = readPdfFile(args.file);\n const sizes = await pdf2size(pdfData);\n\n if (args.verbose) {\n console.error(`Input: ${args.file}`);\n console.error(`Pages: ${sizes.length}`);\n }\n\n const result = sizes.map((size, index) => ({\n pageNumber: index + 1,\n width: Math.round(size.width * 100) / 100,\n height: Math.round(size.height * 100) / 100,\n }));\n\n if (args.json) {\n printJson({ ok: true, command: 'pdf2size', pageCount: result.length, pages: result });\n } else {\n for (let i = 0; i < sizes.length; i++) {\n const size = sizes[i];\n const paperSize = detectPaperSize(size.width, size.height);\n const sizeLabel = paperSize ? ` (${paperSize})` : '';\n console.log(\n `Page ${i + 1}: ${size.width.toFixed(0)} \\u00d7 ${size.height.toFixed(0)} mm${sizeLabel}`,\n );\n }\n }\n });\n },\n});\n","import { readFileSync } from 'node:fs';\n\ndeclare const __CLI_VERSION__: string | undefined;\n\nfunction readPackageVersion(): string {\n try {\n const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as {\n version?: string;\n };\n return packageJson.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nexport const CLI_VERSION =\n typeof __CLI_VERSION__ === 'string' && __CLI_VERSION__.length > 0\n ? __CLI_VERSION__\n : readPackageVersion();\n","import { CLI_VERSION } from './version.js';\n\nexport interface ExampleManifestEntry {\n name: string;\n author: string;\n path: string;\n thumbnailPath: string;\n pageCount: number;\n fieldCount: number;\n schemaTypes: string[];\n fontNames: string[];\n hasCJK: boolean;\n basePdfKind: string;\n}\n\nexport interface ExampleManifest {\n schemaVersion: number;\n cliVersion: string;\n templates: ExampleManifestEntry[];\n}\n\nexport interface ExampleManifestLoadResult {\n manifest: ExampleManifest;\n source: 'remote';\n url?: string;\n}\n\nexport interface ExampleTemplateLoadResult {\n template: Record<string, unknown>;\n source: 'remote';\n url?: string;\n}\n\nexport function getExamplesBaseUrl(): string {\n return process.env.PDFME_EXAMPLES_BASE_URL ?? 'https://playground.pdfme.com/template-assets';\n}\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const response = await fetch(url, {\n signal: AbortSignal.timeout(15000),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n return (await response.json()) as T;\n}\n\nexport async function getExampleManifest(): Promise<ExampleManifestLoadResult> {\n let lastError: unknown;\n for (const url of getManifestUrls()) {\n try {\n return { manifest: normalizeManifest(await fetchJson<unknown>(url)), source: 'remote', url };\n } catch (error) {\n lastError = error;\n }\n }\n\n throw new Error(`Could not load examples manifest. ${formatError(lastError)}`);\n}\n\nexport async function getExampleTemplateNames(): Promise<string[]> {\n const { manifest } = await getExampleManifest();\n return manifest.templates\n .map((entry) => entry.name)\n .filter((name): name is string => typeof name === 'string' && name.length > 0)\n .sort();\n}\n\nexport async function fetchExampleTemplate(\n name: string,\n options: { manifest?: ExampleManifest } = {},\n): Promise<Record<string, unknown>> {\n const result = await fetchExampleTemplateWithSource(name, options);\n return result.template;\n}\n\nexport async function fetchExampleTemplateWithSource(\n name: string,\n options: { manifest?: ExampleManifest } = {},\n): Promise<ExampleTemplateLoadResult> {\n const manifest = options.manifest ?? (await getExampleManifest()).manifest;\n const entry = manifest.templates.find((template) => template.name === name);\n\n if (!entry) {\n throw new Error(`Template \"${name}\" is not present in the examples manifest.`);\n }\n\n const relativePath = entry.path;\n const templateUrl = `${getExamplesBaseUrl().replace(/\\/$/, '')}/${relativePath}`;\n return { template: await fetchJson<Record<string, unknown>>(templateUrl), source: 'remote', url: templateUrl };\n}\n\nfunction getManifestUrls(): string[] {\n const baseUrl = getExamplesBaseUrl().replace(/\\/$/, '');\n return [`${baseUrl}/manifest.json`, `${baseUrl}/index.json`];\n}\n\nfunction normalizeManifest(raw: unknown): ExampleManifest {\n if (Array.isArray(raw)) {\n return {\n schemaVersion: 1,\n cliVersion: CLI_VERSION,\n templates: normalizeEntries(raw),\n };\n }\n\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Examples manifest must be a JSON object or array.');\n }\n\n const record = raw as Record<string, unknown>;\n const rawTemplates = Array.isArray(record.templates)\n ? record.templates\n : Array.isArray(record.entries)\n ? record.entries\n : undefined;\n\n if (!rawTemplates) {\n throw new Error('Examples manifest is missing templates.');\n }\n\n return {\n schemaVersion:\n typeof record.schemaVersion === 'number' && Number.isFinite(record.schemaVersion)\n ? record.schemaVersion\n : 1,\n cliVersion: typeof record.cliVersion === 'string' ? record.cliVersion : CLI_VERSION,\n templates: normalizeEntries(rawTemplates),\n };\n}\n\nfunction normalizeEntries(rawTemplates: unknown[]): ExampleManifestEntry[] {\n return rawTemplates\n .filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null)\n .map((entry) => {\n const name = typeof entry.name === 'string' ? entry.name : '';\n\n return {\n name,\n author: typeof entry.author === 'string' && entry.author.length > 0 ? entry.author : 'pdfme',\n path: typeof entry.path === 'string' && entry.path.length > 0 ? entry.path : `${name}/template.json`,\n thumbnailPath:\n typeof entry.thumbnailPath === 'string' && entry.thumbnailPath.length > 0\n ? entry.thumbnailPath\n : `${name}/thumbnail.png`,\n pageCount: typeof entry.pageCount === 'number' && Number.isFinite(entry.pageCount) ? entry.pageCount : 0,\n fieldCount: typeof entry.fieldCount === 'number' && Number.isFinite(entry.fieldCount) ? entry.fieldCount : 0,\n schemaTypes: normalizeStringArray(entry.schemaTypes),\n fontNames: normalizeStringArray(entry.fontNames),\n hasCJK: typeof entry.hasCJK === 'boolean' ? entry.hasCJK : false,\n basePdfKind: typeof entry.basePdfKind === 'string' && entry.basePdfKind.length > 0 ? entry.basePdfKind : 'unknown',\n };\n })\n .filter((entry) => entry.name.length > 0);\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter((item): item is string => typeof item === 'string' && item.length > 0);\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { Font } from '@pdfme/common';\n\nexport const OFFICIAL_EXAMPLE_FONT_URLS = {\n NotoSansJP:\n 'https://fonts.gstatic.com/s/notosansjp/v53/-F6jfjtqLzI2JPCgQBnw7HFyzSD-AsregP8VFBEj75vY0rw-oME.ttf',\n NotoSerifJP:\n 'https://fonts.gstatic.com/s/notoserifjp/v30/xn71YHs72GKoTvER4Gn3b5eMRtWGkp6o7MjQ2bwxOubAILO5wBCU.ttf',\n 'PinyonScript-Regular':\n 'https://fonts.gstatic.com/s/pinyonscript/v22/6xKpdSJbL9-e9LuoeQiDRQR8aOLQO4bhiDY.ttf',\n} as const;\n\nexport function collectTemplateFontNames(template: Record<string, unknown>): string[] {\n const schemas = template.schemas;\n if (!Array.isArray(schemas)) {\n return [];\n }\n\n const fontNames = new Set<string>();\n for (const page of schemas) {\n const pageSchemas = Array.isArray(page)\n ? page\n : typeof page === 'object' && page !== null\n ? Object.values(page)\n : [];\n\n for (const schema of pageSchemas) {\n if (typeof schema !== 'object' || schema === null) continue;\n\n const fontName = (schema as Record<string, unknown>).fontName;\n if (typeof fontName === 'string' && fontName.length > 0) {\n fontNames.add(fontName);\n }\n }\n }\n\n return [...fontNames].sort();\n}\n\nexport function getOfficialExampleFonts(template: Record<string, unknown>): Font | undefined {\n const entries = collectTemplateFontNames(template).flatMap((fontName) => {\n const url = OFFICIAL_EXAMPLE_FONT_URLS[fontName as keyof typeof OFFICIAL_EXAMPLE_FONT_URLS];\n return url\n ? [[fontName, { data: url, fallback: false, subset: true }] as const]\n : [];\n });\n\n if (entries.length === 0) {\n return undefined;\n }\n\n return Object.fromEntries(entries) as Font;\n}\n","import { defineCommand } from 'citty';\nimport {\n assertNoUnknownFlags,\n fail,\n printJson,\n runWithContract,\n} from '../contract.js';\nimport { writeOutput } from '../utils.js';\nimport {\n fetchExampleTemplateWithSource,\n getExampleManifest,\n getExamplesBaseUrl,\n} from '../example-templates.js';\nimport { getOfficialExampleFonts } from '../example-fonts.js';\n\nconst examplesArgs = {\n name: { type: 'positional' as const, description: 'Template name to output', required: false },\n list: { type: 'boolean' as const, description: 'List available templates', default: false },\n output: { type: 'string' as const, alias: 'o', description: 'Output file path' },\n withInputs: {\n type: 'boolean' as const,\n alias: 'w',\n description: 'Output unified format with sample inputs',\n default: false,\n },\n verbose: { type: 'boolean' as const, alias: 'v', description: 'Verbose output', default: false },\n json: { type: 'boolean' as const, description: 'Machine-readable JSON output', default: false },\n};\n\nfunction generateSampleInputs(template: Record<string, unknown>): Record<string, string>[] {\n const fields = normalizeSchemaPages(template.schemas).flat();\n\n if (fields.length === 0) return [{}];\n\n const input: Record<string, string> = {};\n for (const schema of fields) {\n if (typeof schema !== 'object' || schema === null) continue;\n const name = schema.name as string;\n const content = schema.content as string | undefined;\n const readOnly = schema.readOnly as boolean | undefined;\n\n if (readOnly) continue;\n if (name) {\n input[name] = content || `Sample ${name}`;\n }\n }\n\n return [input];\n}\n\nexport default defineCommand({\n meta: {\n name: 'examples',\n description: 'List and output example pdfme templates',\n },\n args: examplesArgs,\n async run({ args, rawArgs }) {\n return runWithContract({ json: Boolean(args.json) }, async () => {\n assertNoUnknownFlags(rawArgs, examplesArgs);\n\n let manifestResult;\n try {\n manifestResult = await getExampleManifest();\n } catch (error) {\n fail(\n `Failed to load examples manifest. ${error instanceof Error ? error.message : String(error)}`,\n {\n code: 'EIO',\n exitCode: 3,\n cause: error,\n },\n );\n }\n\n const templateEntries = manifestResult.manifest.templates;\n const templateNames = templateEntries\n .map((entry) => entry.name)\n .filter((name): name is string => typeof name === 'string' && name.length > 0)\n .sort();\n\n if (args.verbose) {\n console.error(`Base URL: ${getExamplesBaseUrl()}`);\n console.error(`Manifest source: ${manifestResult.source}`);\n if (manifestResult.url) {\n console.error(`Manifest URL: ${manifestResult.url}`);\n }\n console.error(`Templates: ${templateNames.length}`);\n }\n\n if (args.list || !args.name) {\n if (args.json) {\n printJson({\n ok: true,\n command: 'examples',\n mode: 'list',\n templateCount: templateNames.length,\n source: manifestResult.source,\n baseUrl: getExamplesBaseUrl(),\n manifest: manifestResult.manifest,\n });\n } else {\n console.log('Available templates:');\n for (const name of templateNames) {\n console.log(` ${name}`);\n }\n }\n return;\n }\n\n const entry = templateEntries.find((template) => template.name === args.name);\n if (!entry) {\n fail(`Template \"${args.name}\" not found. Available templates: ${templateNames.join(', ')}`, {\n code: 'EARG',\n exitCode: 1,\n });\n }\n\n let templateResult;\n try {\n templateResult = await fetchExampleTemplateWithSource(args.name, {\n manifest: manifestResult.manifest,\n });\n } catch (error) {\n fail(\n `Failed to load example template \"${args.name}\". ${error instanceof Error ? error.message : String(error)}`,\n {\n code: 'EIO',\n exitCode: 3,\n cause: error,\n },\n );\n }\n\n const output = args.withInputs ? buildExampleJob(templateResult.template) : templateResult.template;\n const mode = args.withInputs ? 'job' : 'template';\n const stats = countTemplateStats(templateResult.template);\n const inputCount = args.withInputs ? (((output.inputs as unknown[])?.length ?? 0)) : undefined;\n\n if (args.verbose) {\n console.error(`Template: ${args.name}`);\n console.error(`Template source: ${templateResult.source}`);\n if (templateResult.url) {\n console.error(`Template URL: ${templateResult.url}`);\n }\n console.error(`Mode: ${mode}`);\n console.error(`Template pages: ${stats.templatePageCount}`);\n console.error(`Fields: ${stats.fieldCount}`);\n if (inputCount !== undefined) {\n console.error(`Inputs: ${inputCount} set(s)`);\n }\n console.error(`Output: ${args.output ?? 'stdout'}`);\n }\n\n if (args.output) {\n writeOutput(args.output, new TextEncoder().encode(JSON.stringify(output, null, 2)));\n\n if (args.json) {\n printJson({\n ok: true,\n command: 'examples',\n name: args.name,\n mode,\n source: templateResult.source,\n templatePageCount: stats.templatePageCount,\n fieldCount: stats.fieldCount,\n ...(inputCount !== undefined ? { inputCount } : {}),\n outputPath: args.output,\n });\n } else {\n const label = args.withInputs ? 'Job file' : 'Template';\n console.log(`\\u2713 ${label} written to ${args.output}`);\n }\n return;\n }\n\n if (args.json) {\n printJson({\n ok: true,\n command: 'examples',\n name: args.name,\n source: templateResult.source,\n mode,\n templatePageCount: stats.templatePageCount,\n fieldCount: stats.fieldCount,\n ...(inputCount !== undefined ? { inputCount } : {}),\n data: output,\n });\n } else {\n console.log(JSON.stringify(output, null, 2));\n }\n });\n },\n});\n\nfunction buildExampleJob(template: Record<string, unknown>): Record<string, unknown> {\n const job: Record<string, unknown> = {\n template,\n inputs: generateSampleInputs(template),\n };\n\n const font = getOfficialExampleFonts(template);\n if (font) {\n job.options = { font };\n }\n\n return job;\n}\n\nfunction countTemplateStats(template: Record<string, unknown>): {\n templatePageCount: number;\n fieldCount: number;\n} {\n const schemaPages = normalizeSchemaPages(template.schemas);\n return {\n templatePageCount: schemaPages.length,\n fieldCount: schemaPages.reduce((count, page) => count + page.length, 0),\n };\n}\n\nfunction normalizeSchemaPages(rawSchemas: unknown): Array<Array<Record<string, unknown>>> {\n if (!Array.isArray(rawSchemas)) {\n return [];\n }\n\n return rawSchemas.map((page) => {\n if (Array.isArray(page)) {\n return page.filter(\n (schema): schema is Record<string, unknown> => typeof schema === 'object' && schema !== null,\n );\n }\n\n if (typeof page === 'object' && page !== null) {\n return Object.entries(page)\n .map(([name, schema]) =>\n typeof schema === 'object' && schema !== null\n ? ({ ...schema, name: (schema as Record<string, unknown>).name ?? name } as Record<\n string,\n unknown\n >)\n : null,\n )\n .filter((schema): schema is Record<string, unknown> => schema !== null);\n }\n\n return [];\n });\n}\n","import { accessSync, constants, existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { homedir, tmpdir } from 'node:os';\nimport { defineCommand } from 'citty';\nimport { checkGenerateProps, DEFAULT_FONT_NAME } from '@pdfme/common';\nimport {\n assertNoUnknownFlags,\n fail,\n parseEnumArg,\n printJson,\n runWithContract,\n} from '../contract.js';\nimport { detectCJKInInputs, detectCJKInTemplate } from '../cjk-detect.js';\nimport {\n collectInputHints,\n getInputContractIssues,\n inspectTemplate,\n KNOWN_TEMPLATE_KEYS,\n loadValidationSource,\n summarizeBasePdf,\n validateTemplate,\n} from '../diagnostics.js';\nimport {\n analyzeExplicitFontRecord,\n NOTO_CACHE_FILE,\n type ExplicitFontRemoteProvider,\n type ExplicitFontSourceDiagnosis,\n} from '../fonts.js';\nimport {\n getImageOutputPaths,\n getSafeDefaultOutputPathIssue,\n inspectWriteTarget,\n type WriteTargetInspection,\n} from '../utils.js';\nimport { CLI_VERSION } from '../version.js';\n\nconst doctorArgs = {\n target: {\n type: 'positional' as const,\n description: 'Optional job/template JSON file, or \"fonts\" for font-focused diagnosis',\n required: false,\n },\n file: {\n type: 'positional' as const,\n description: 'Job/template JSON file for \"doctor fonts\", or \"-\" for stdin',\n required: false,\n },\n verbose: { type: 'boolean' as const, alias: 'v', description: 'Verbose output', default: false },\n json: { type: 'boolean' as const, description: 'Machine-readable JSON output', default: false },\n noAutoFont: {\n type: 'boolean' as const,\n description: 'Simulate generate with automatic CJK font download disabled',\n default: false,\n },\n output: {\n type: 'string' as const,\n alias: 'o',\n description: 'Simulate generate output PDF path for runtime/path diagnosis',\n default: 'output.pdf',\n },\n force: {\n type: 'boolean' as const,\n description: 'Simulate generate --force for implicit default output path checks',\n default: false,\n },\n image: {\n type: 'boolean' as const,\n description: 'Simulate generate --image when previewing runtime output paths',\n default: false,\n },\n imageFormat: {\n type: 'string' as const,\n description: 'Image format to use when previewing runtime output paths: png | jpeg',\n default: 'png',\n },\n};\n\ntype DoctorTarget = 'environment' | 'input' | 'fonts';\ntype FontSourceKind =\n | 'default'\n | 'autoCache'\n | 'autoDownload'\n | 'localPath'\n | 'url'\n | 'dataUri'\n | 'inlineBytes'\n | 'invalid';\n\ninterface DoctorInvocation {\n target: DoctorTarget;\n file?: string;\n}\n\ninterface PathStatus {\n path: string;\n writable: boolean;\n checkedPath?: string;\n error?: string;\n}\n\ninterface EnvironmentReport {\n nodeVersion: string;\n cliVersion: string;\n platform: string;\n arch: string;\n cwd: PathStatus;\n tempDir: PathStatus;\n homeDir: string;\n fontCache: {\n file: string;\n dir: string;\n cached: boolean;\n writable: boolean;\n checkedPath?: string;\n error?: string;\n };\n}\n\ninterface BasePdfDiagnosis {\n kind: string;\n width?: number;\n height?: number;\n paperSize?: string | null;\n path?: string;\n resolvedPath?: string;\n exists?: boolean;\n issue?: string;\n}\n\ninterface FontSourceDiagnosis {\n fontName: string;\n source: 'explicit' | 'implicit';\n kind: FontSourceKind;\n provider?: ExplicitFontRemoteProvider;\n path?: string;\n resolvedPath?: string;\n exists?: boolean;\n url?: string;\n mediaType?: string;\n formatHint?: string | null;\n supportedFormat?: boolean;\n needsNetwork: boolean;\n dataType?: string;\n}\n\ninterface FontDiagnosis {\n hasCJK: boolean;\n requiredFonts: string[];\n explicitFonts: string[];\n effectiveFonts: string[];\n missingFonts: string[];\n autoFontNeeded: boolean;\n autoFontCached: boolean;\n issues: string[];\n warnings: string[];\n explicitSources: FontSourceDiagnosis[];\n implicitSources: FontSourceDiagnosis[];\n effectiveOptions?: Record<string, unknown>;\n}\n\ninterface RuntimeOptions {\n output: string;\n force: boolean;\n image: boolean;\n imageFormat: 'png' | 'jpeg';\n rawArgs: string[];\n}\n\ninterface OutputPathDiagnosis extends WriteTargetInspection {\n implicitDefaultProtected: boolean;\n issue?: string;\n}\n\ninterface RuntimeDiagnosis {\n estimatedPages: number;\n output: OutputPathDiagnosis;\n imageOutputs: {\n enabled: boolean;\n format: 'png' | 'jpeg';\n paths: string[];\n directory: string;\n };\n}\n\ninterface InputDiagnosis {\n validation: {\n valid: boolean;\n pages: number;\n fields: number;\n errors: string[];\n warnings: string[];\n };\n inspection: ReturnType<typeof inspectTemplate>;\n basePdfDiagnosis: BasePdfDiagnosis;\n fontDiagnosis: FontDiagnosis;\n runtimeDiagnosis: RuntimeDiagnosis;\n issues: string[];\n warnings: string[];\n healthy: boolean;\n}\n\nexport default defineCommand({\n meta: {\n name: 'doctor',\n description: 'Diagnose the local pdfme CLI environment and input readiness',\n },\n args: doctorArgs,\n async run({ args, rawArgs }) {\n return runWithContract({ json: Boolean(args.json) }, async () => {\n assertNoUnknownFlags(rawArgs, doctorArgs);\n\n const invocation = resolveDoctorInvocation(args);\n const imageFormat = parseEnumArg('imageFormat', args.imageFormat, ['png', 'jpeg']);\n const environment = getEnvironmentReport();\n\n if (invocation.target === 'environment') {\n const issues = collectEnvironmentIssues(environment);\n const warnings = collectEnvironmentWarnings(environment);\n const healthy = issues.length === 0;\n\n if (args.verbose) {\n printDoctorEnvironmentVerbose(environment, healthy, issues, warnings);\n }\n\n if (args.json) {\n printJson({\n ok: true,\n command: 'doctor',\n target: 'environment',\n healthy,\n environment,\n issues,\n warnings,\n });\n } else {\n printEnvironmentReport(environment, issues, warnings);\n }\n\n if (!healthy) {\n process.exit(1);\n }\n return;\n }\n\n const source = await loadValidationSource(invocation.file, {\n noInputMessage:\n invocation.target === 'fonts'\n ? 'No font diagnostic input provided. Pass a file path or pipe JSON via stdin.'\n : 'No diagnostic input provided. Pass a file path or pipe JSON via stdin.',\n });\n\n const diagnosis = buildInputDiagnosis(source, environment, Boolean(args.noAutoFont), {\n includeBasePdfIssue: invocation.target === 'input',\n includeRuntimeIssue: invocation.target === 'input',\n runtime: {\n output: args.output,\n force: Boolean(args.force),\n image: Boolean(args.image),\n imageFormat,\n rawArgs,\n },\n });\n\n if (args.verbose) {\n printDoctorInputVerbose(invocation, source, diagnosis);\n }\n\n const payload =\n invocation.target === 'fonts'\n ? {\n ok: true,\n command: 'doctor',\n target: 'fonts',\n healthy: diagnosis.healthy,\n mode: source.mode,\n templatePageCount: diagnosis.validation.pages,\n fieldCount: diagnosis.validation.fields,\n ...(source.mode === 'job' ? { inputCount: source.inputs?.length ?? 0 } : {}),\n environment,\n validation: createValidationPayload(diagnosis.validation),\n inspection: {\n schemaTypes: diagnosis.inspection.schemaTypes,\n requiredPlugins: diagnosis.inspection.requiredPlugins,\n requiredFonts: diagnosis.inspection.requiredFonts,\n },\n inputHints: collectInputHints(source.template),\n diagnosis: {\n fonts: createFontPayload(diagnosis.fontDiagnosis),\n },\n issues: diagnosis.issues,\n warnings: diagnosis.warnings,\n }\n : {\n ok: true,\n command: 'doctor',\n target: 'input',\n healthy: diagnosis.healthy,\n mode: source.mode,\n templatePageCount: diagnosis.validation.pages,\n fieldCount: diagnosis.validation.fields,\n ...(source.mode === 'job' ? { inputCount: source.inputs?.length ?? 0 } : {}),\n estimatedPageCount: diagnosis.runtimeDiagnosis.estimatedPages,\n environment,\n validation: createValidationPayload(diagnosis.validation),\n inspection: diagnosis.inspection,\n inputHints: collectInputHints(source.template),\n diagnosis: {\n basePdf: diagnosis.basePdfDiagnosis,\n fonts: createFontPayload(diagnosis.fontDiagnosis),\n runtime: diagnosis.runtimeDiagnosis,\n plugins: {\n required: diagnosis.inspection.requiredPlugins,\n unsupportedSchemaTypes: diagnosis.inspection.schemaTypes.filter(\n (type) => !diagnosis.inspection.requiredPlugins.includes(type),\n ),\n },\n },\n issues: diagnosis.issues,\n warnings: diagnosis.warnings,\n };\n\n if (args.json) {\n printJson(payload);\n } else if (invocation.target === 'fonts') {\n printFontReport(payload);\n } else {\n printInputReport(payload);\n }\n\n if (!diagnosis.healthy) {\n process.exit(1);\n }\n });\n },\n});\n\nfunction resolveDoctorInvocation(args: { _: string[]; target?: string; file?: string }): DoctorInvocation {\n const positionals = Array.isArray(args._) ? args._ : [];\n\n if (args.target === 'fonts') {\n if (positionals.length > 2) {\n fail(\n `Unexpected extra positional argument: ${JSON.stringify(positionals[2])}. Usage: pdfme doctor fonts <job-or-template>.`,\n { code: 'EARG', exitCode: 1 },\n );\n }\n\n return { target: 'fonts', file: args.file };\n }\n\n if (positionals.length > 1) {\n fail(\n `Unexpected extra positional argument: ${JSON.stringify(positionals[1])}. Usage: pdfme doctor [job-or-template].`,\n { code: 'EARG', exitCode: 1 },\n );\n }\n\n if (args.target) {\n return { target: 'input', file: args.target };\n }\n\n return { target: 'environment' };\n}\n\nfunction buildInputDiagnosis(\n source: Awaited<ReturnType<typeof loadValidationSource>>,\n environment: EnvironmentReport,\n noAutoFont: boolean,\n options: {\n includeBasePdfIssue: boolean;\n includeRuntimeIssue: boolean;\n runtime: RuntimeOptions;\n },\n): InputDiagnosis {\n const inspection = inspectTemplate(source.template, source.templateDir);\n const validation = validateTemplate(source.template);\n validation.warnings.push(...source.jobWarnings);\n\n const templateUnknownKeys = Object.keys(source.template)\n .filter((key) => !KNOWN_TEMPLATE_KEYS.has(key))\n .sort();\n if (templateUnknownKeys.length > 0) {\n validation.warnings.push(\n `Unknown template top-level field(s): ${templateUnknownKeys.join(', ')}`,\n );\n }\n\n const fontDiagnosis = diagnoseFonts(\n source,\n environment,\n noAutoFont,\n inspection.requiredFonts,\n );\n const basePdfDiagnosis = diagnoseBasePdf(source.template.basePdf, source.templateDir);\n const runtimeDiagnosis = diagnoseRuntime(source, options.runtime);\n const issues = [...validation.errors];\n const warnings = [...validation.warnings, ...fontDiagnosis.warnings];\n\n if (options.includeBasePdfIssue && basePdfDiagnosis.issue) {\n issues.push(basePdfDiagnosis.issue);\n }\n\n issues.push(...fontDiagnosis.issues);\n if (options.includeRuntimeIssue && runtimeDiagnosis.output.issue) {\n issues.push(runtimeDiagnosis.output.issue);\n }\n\n if (source.mode === 'job' && fontDiagnosis.effectiveOptions) {\n try {\n checkGenerateProps({\n template: source.template as any,\n inputs: source.inputs as any,\n options: fontDiagnosis.effectiveOptions as any,\n });\n } catch (error) {\n issues.unshift(error instanceof Error ? error.message : String(error));\n }\n\n issues.push(...getInputContractIssues(source.template, source.inputs ?? []));\n }\n\n return {\n validation: {\n valid: validation.errors.length === 0,\n pages: validation.pages,\n fields: validation.fields,\n errors: validation.errors,\n warnings: validation.warnings,\n },\n inspection,\n basePdfDiagnosis,\n fontDiagnosis,\n runtimeDiagnosis,\n issues,\n warnings,\n healthy: issues.length === 0,\n };\n}\n\nfunction createValidationPayload(validation: InputDiagnosis['validation']): Record<string, unknown> {\n return {\n valid: validation.valid,\n errors: validation.errors,\n warnings: validation.warnings,\n };\n}\n\nfunction createFontPayload(fontDiagnosis: FontDiagnosis): Record<string, unknown> {\n return {\n hasCJK: fontDiagnosis.hasCJK,\n requiredFonts: fontDiagnosis.requiredFonts,\n explicitFonts: fontDiagnosis.explicitFonts,\n effectiveFonts: fontDiagnosis.effectiveFonts,\n missingFonts: fontDiagnosis.missingFonts,\n explicitSources: fontDiagnosis.explicitSources,\n implicitSources: fontDiagnosis.implicitSources,\n autoNotoSansJP: {\n needed: fontDiagnosis.autoFontNeeded,\n cached: fontDiagnosis.autoFontCached,\n cacheFile: NOTO_CACHE_FILE,\n },\n };\n}\n\nfunction getEnvironmentReport(): EnvironmentReport {\n const fontCacheDir = dirname(NOTO_CACHE_FILE);\n const cwdStatus = getWritableStatus(process.cwd());\n const tempStatus = getWritableStatus(tmpdir());\n const fontCacheStatus = getWritableStatus(fontCacheDir);\n\n return {\n nodeVersion: process.version,\n cliVersion: CLI_VERSION,\n platform: process.platform,\n arch: process.arch,\n cwd: cwdStatus,\n tempDir: tempStatus,\n homeDir: homedir(),\n fontCache: {\n file: NOTO_CACHE_FILE,\n dir: fontCacheDir,\n cached: existsSync(NOTO_CACHE_FILE),\n writable: fontCacheStatus.writable,\n checkedPath: fontCacheStatus.checkedPath,\n error: fontCacheStatus.error,\n },\n };\n}\n\nfunction getWritableStatus(path: string): PathStatus {\n const checkedPath = findExistingParent(path);\n\n try {\n accessSync(checkedPath, constants.W_OK);\n return {\n path,\n writable: true,\n checkedPath: checkedPath !== path ? checkedPath : undefined,\n };\n } catch (error) {\n return {\n path,\n writable: false,\n checkedPath: checkedPath !== path ? checkedPath : undefined,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction findExistingParent(path: string): string {\n let current = path;\n\n while (!existsSync(current)) {\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return current;\n}\n\nfunction collectEnvironmentIssues(environment: EnvironmentReport): string[] {\n const issues: string[] = [];\n\n if (!environment.cwd.writable) {\n issues.push(`Current working directory is not writable: ${environment.cwd.path}`);\n }\n if (!environment.tempDir.writable) {\n issues.push(`Temporary directory is not writable: ${environment.tempDir.path}`);\n }\n\n return issues;\n}\n\nfunction collectEnvironmentWarnings(environment: EnvironmentReport): string[] {\n const warnings: string[] = [];\n\n if (!environment.fontCache.writable) {\n warnings.push(`Font cache directory is not writable: ${environment.fontCache.dir}`);\n }\n if (!environment.fontCache.cached) {\n warnings.push(`NotoSansJP is not cached at ${environment.fontCache.file}`);\n }\n\n return warnings;\n}\n\nfunction diagnoseBasePdf(basePdf: unknown, templateDir?: string): BasePdfDiagnosis {\n const summary = summarizeBasePdf(basePdf, templateDir);\n\n if (summary.kind !== 'pdfPath' || !summary.resolvedPath) {\n return summary;\n }\n\n const exists = existsSync(summary.resolvedPath);\n return {\n ...summary,\n exists,\n issue: exists ? undefined : `Base PDF file not found: ${summary.resolvedPath}`,\n };\n}\n\nfunction diagnoseRuntime(\n source: Awaited<ReturnType<typeof loadValidationSource>>,\n options: RuntimeOptions,\n): RuntimeDiagnosis {\n const estimatedPages =\n source.mode === 'job'\n ? (source.inputs?.length ?? 0) * getTemplatePageCount(source.template)\n : getTemplatePageCount(source.template);\n const output = diagnoseOutputPath(options);\n\n return {\n estimatedPages,\n output,\n imageOutputs: {\n enabled: options.image,\n format: options.imageFormat,\n paths: options.image ? getImageOutputPaths(options.output, estimatedPages, options.imageFormat) : [],\n directory: dirname(output.resolvedPath),\n },\n };\n}\n\nfunction diagnoseOutputPath(options: RuntimeOptions): OutputPathDiagnosis {\n const inspection = inspectWriteTarget(options.output);\n const implicitDefaultIssue = getSafeDefaultOutputPathIssue({\n filePath: options.output,\n rawArgs: options.rawArgs,\n optionName: 'output',\n optionAlias: 'o',\n defaultValue: 'output.pdf',\n force: options.force,\n });\n\n let issue = implicitDefaultIssue;\n\n if (!issue && inspection.exists && inspection.existingType === 'directory') {\n issue = `Output path points to a directory: ${inspection.resolvedPath}. Choose a file path like out.pdf.`;\n } else if (!issue && inspection.exists && inspection.existingType === 'other') {\n issue = `Output path is not a regular file: ${inspection.resolvedPath}.`;\n } else if (!issue && inspection.checkedType && inspection.checkedType !== 'directory' && inspection.existingType !== 'file') {\n issue = `Output directory cannot be created because an existing path segment is not a directory: ${inspection.checkedPath ?? inspection.parentDir}.`;\n } else if (!issue && !inspection.writable) {\n issue =\n inspection.exists && inspection.existingType === 'file'\n ? `Output file is not writable: ${inspection.resolvedPath}.`\n : `Output directory is not writable for ${inspection.resolvedPath}: ${inspection.checkedPath ?? inspection.parentDir}.`;\n }\n\n return {\n ...inspection,\n implicitDefaultProtected: Boolean(implicitDefaultIssue),\n issue,\n };\n}\n\nfunction getTemplatePageCount(template: Record<string, unknown>): number {\n return Array.isArray(template.schemas) ? template.schemas.length : 0;\n}\n\nfunction diagnoseFonts(\n source: Awaited<ReturnType<typeof loadValidationSource>>,\n environment: EnvironmentReport,\n noAutoFont: boolean,\n requiredFonts: string[],\n): FontDiagnosis {\n const hasCJK = detectCJKInTemplate(source.template) || detectCJKInInputs(source.inputs ?? []);\n const issues: string[] = [];\n const warnings: string[] = [];\n const autoFontCached = existsSync(NOTO_CACHE_FILE);\n const explicit = normalizeExplicitFontConfig(source.options, source.templateDir);\n\n issues.push(...explicit.issues);\n warnings.push(...explicit.warnings);\n\n const autoFontNeeded = hasCJK && explicit.fontNames.length === 0;\n if (autoFontNeeded && noAutoFont) {\n issues.push(\n 'CJK text detected, but automatic NotoSansJP download is disabled by --noAutoFont and no explicit font source was provided.',\n );\n } else if (autoFontNeeded && !autoFontCached && !environment.fontCache.writable) {\n issues.push(\n `CJK text detected and NotoSansJP is not cached at ${NOTO_CACHE_FILE}, but the font cache directory is not writable: ${environment.fontCache.dir}. Provide --font / options.font or warm the cache in a writable HOME.`,\n );\n } else if (autoFontNeeded && !autoFontCached) {\n warnings.push(\n `CJK text detected and NotoSansJP is not cached at ${NOTO_CACHE_FILE}. Generate will require network access to fetch it.`,\n );\n }\n\n const resolvedFont = autoFontNeeded\n ? {\n NotoSansJP: { data: new Uint8Array(), fallback: true, subset: true },\n [DEFAULT_FONT_NAME]: { data: new Uint8Array(), fallback: false, subset: true },\n }\n : {\n [DEFAULT_FONT_NAME]: { data: new Uint8Array(), fallback: true, subset: true },\n };\n\n const effectiveFont = explicit.fontRecord ? { ...explicit.fontRecord, ...resolvedFont } : resolvedFont;\n const effectiveFonts = Object.keys(effectiveFont).sort();\n const missingFonts = requiredFonts.filter((fontName) => !effectiveFonts.includes(fontName));\n\n if (source.mode === 'template' && missingFonts.length > 0) {\n issues.push(\n `Template references font(s) that are not available by default: ${missingFonts.join(', ')}. Provide them via generate --font or unified job options.font.`,\n );\n }\n\n return {\n hasCJK,\n requiredFonts,\n explicitFonts: explicit.fontNames,\n effectiveFonts,\n missingFonts,\n autoFontNeeded,\n autoFontCached,\n issues,\n warnings,\n explicitSources: explicit.sources,\n implicitSources: buildImplicitFontSources(autoFontNeeded, autoFontCached),\n effectiveOptions: explicit.optionsRecord\n ? { ...explicit.optionsRecord, font: effectiveFont }\n : { font: effectiveFont },\n };\n}\n\nfunction normalizeExplicitFontConfig(\n options: unknown,\n templateDir?: string,\n): {\n issues: string[];\n warnings: string[];\n fontNames: string[];\n fontRecord?: Record<string, unknown>;\n optionsRecord?: Record<string, unknown>;\n sources: FontSourceDiagnosis[];\n} {\n if (options === undefined) {\n return { issues: [], warnings: [], fontNames: [], sources: [] };\n }\n\n if (typeof options !== 'object' || options === null || Array.isArray(options)) {\n return {\n issues: ['Unified job options must be a JSON object.'],\n warnings: [],\n fontNames: [],\n sources: [],\n };\n }\n\n const optionsRecord = options as Record<string, unknown>;\n const font = optionsRecord.font;\n if (font === undefined) {\n return { issues: [], warnings: [], fontNames: [], optionsRecord, sources: [] };\n }\n\n if (typeof font !== 'object' || font === null || Array.isArray(font)) {\n return {\n issues: ['Unified job options.font must be an object.'],\n warnings: [],\n fontNames: [],\n optionsRecord,\n sources: [],\n };\n }\n\n const fontRecord = font as Record<string, unknown>;\n const sourceDiagnostics = analyzeExplicitFontRecord(fontRecord, templateDir);\n\n return {\n issues: sourceDiagnostics.issues,\n warnings: sourceDiagnostics.warnings,\n fontNames: Object.keys(fontRecord).sort(),\n fontRecord,\n optionsRecord,\n sources: sortFontSources(sourceDiagnostics.sources.map(toDoctorExplicitSource)),\n };\n}\n\nfunction toDoctorExplicitSource(source: ExplicitFontSourceDiagnosis): FontSourceDiagnosis {\n return {\n ...source,\n source: 'explicit',\n };\n}\n\nfunction buildImplicitFontSources(\n autoFontNeeded: boolean,\n autoFontCached: boolean,\n): FontSourceDiagnosis[] {\n const sources: FontSourceDiagnosis[] = [\n {\n fontName: DEFAULT_FONT_NAME,\n source: 'implicit',\n kind: 'default',\n formatHint: 'ttf',\n supportedFormat: true,\n needsNetwork: false,\n },\n ];\n\n if (autoFontNeeded) {\n sources.push({\n fontName: 'NotoSansJP',\n source: 'implicit',\n kind: autoFontCached ? 'autoCache' : 'autoDownload',\n path: NOTO_CACHE_FILE,\n resolvedPath: NOTO_CACHE_FILE,\n exists: autoFontCached,\n formatHint: 'ttf',\n supportedFormat: true,\n needsNetwork: !autoFontCached,\n });\n }\n\n return sortFontSources(sources);\n}\n\nfunction sortFontSources(sources: FontSourceDiagnosis[]): FontSourceDiagnosis[] {\n return [...sources].sort(\n (a, b) => a.fontName.localeCompare(b.fontName) || a.kind.localeCompare(b.kind),\n );\n}\n\nfunction printEnvironmentReport(\n environment: EnvironmentReport,\n issues: string[],\n warnings: string[],\n): void {\n const header = issues.length === 0 ? '\\u2713 Environment looks ready' : '\\u2717 Environment has blocking issues';\n console.log(header);\n console.log(`Node: ${environment.nodeVersion}`);\n console.log(`CLI: ${environment.cliVersion}`);\n console.log(`Platform: ${environment.platform} ${environment.arch}`);\n console.log(`cwd: ${environment.cwd.path} (${environment.cwd.writable ? 'writable' : 'not writable'})`);\n console.log(\n `temp: ${environment.tempDir.path} (${environment.tempDir.writable ? 'writable' : 'not writable'})`,\n );\n console.log(\n `font cache: ${environment.fontCache.file} (${environment.fontCache.cached ? 'cached' : 'not cached'})`,\n );\n\n for (const issue of issues) {\n console.log(`\\u2717 Issue: ${issue}`);\n }\n for (const warning of warnings) {\n console.log(`\\u26a0 Warning: ${warning}`);\n }\n}\n\nfunction printDoctorEnvironmentVerbose(\n environment: EnvironmentReport,\n healthy: boolean,\n issues: string[],\n warnings: string[],\n): void {\n console.error('Target: environment');\n console.error(`Healthy: ${healthy ? 'yes' : 'no'}`);\n console.error(`Node: ${environment.nodeVersion}`);\n console.error(`CLI: ${environment.cliVersion}`);\n console.error(`Platform: ${environment.platform} ${environment.arch}`);\n console.error(`cwd: ${environment.cwd.path}`);\n console.error(`temp: ${environment.tempDir.path}`);\n console.error(\n `Font cache: ${environment.fontCache.cached ? 'cached' : 'not cached'} (${environment.fontCache.file})`,\n );\n console.error(`Issues: ${issues.length}`);\n console.error(`Warnings: ${warnings.length}`);\n}\n\nfunction printInputReport(payload: Record<string, unknown>): void {\n const healthy = Boolean(payload.healthy);\n const inspection = payload.inspection as {\n schemaTypes: string[];\n };\n const diagnosis = payload.diagnosis as {\n runtime?: RuntimeDiagnosis;\n };\n const issues = payload.issues as string[];\n const warnings = payload.warnings as string[];\n\n console.log(healthy ? '\\u2713 Doctor checks passed' : '\\u2717 Doctor found blocking issues');\n console.log(`Mode: ${payload.mode}`);\n console.log(`Template pages: ${payload.templatePageCount}`);\n console.log(`Fields: ${payload.fieldCount}`);\n console.log(`Schema types: ${inspection.schemaTypes.join(', ') || '(none)'}`);\n if (diagnosis.runtime) {\n console.log(\n `Output: ${diagnosis.runtime.output.path} (${diagnosis.runtime.output.writable ? 'writable' : 'not writable'})`,\n );\n if (diagnosis.runtime.imageOutputs.enabled) {\n console.log(\n `Images: ${diagnosis.runtime.imageOutputs.paths.length} ${diagnosis.runtime.imageOutputs.format.toUpperCase()} file(s) in ${diagnosis.runtime.imageOutputs.directory}`,\n );\n }\n }\n\n for (const issue of issues) {\n console.log(`\\u2717 Issue: ${issue}`);\n }\n for (const warning of warnings) {\n console.log(`\\u26a0 Warning: ${warning}`);\n }\n}\n\nfunction printDoctorInputVerbose(\n invocation: DoctorInvocation,\n source: Awaited<ReturnType<typeof loadValidationSource>>,\n diagnosis: InputDiagnosis,\n): void {\n console.error(`Target: ${invocation.target}`);\n console.error(`Input: ${describeDoctorInput(invocation.file)}`);\n console.error(`Mode: ${source.mode}`);\n console.error(`Template pages: ${diagnosis.validation.pages}`);\n console.error(`Fields: ${diagnosis.validation.fields}`);\n if (source.mode === 'job') {\n console.error(`Inputs: ${source.inputs?.length ?? 0} set(s)`);\n }\n if (invocation.target === 'input') {\n console.error(`Estimated pages: ${diagnosis.runtimeDiagnosis.estimatedPages}`);\n console.error(`Output: ${diagnosis.runtimeDiagnosis.output.path}`);\n console.error(\n `Images: ${\n diagnosis.runtimeDiagnosis.imageOutputs.enabled\n ? `enabled (${diagnosis.runtimeDiagnosis.imageOutputs.format}, ${diagnosis.runtimeDiagnosis.imageOutputs.paths.length} file(s))`\n : 'disabled'\n }`,\n );\n }\n console.error(`Healthy: ${diagnosis.healthy ? 'yes' : 'no'}`);\n console.error(`Issues: ${diagnosis.issues.length}`);\n console.error(`Warnings: ${diagnosis.warnings.length}`);\n}\n\nfunction printFontReport(payload: Record<string, unknown>): void {\n const healthy = Boolean(payload.healthy);\n const diagnosis = payload.diagnosis as {\n fonts: {\n requiredFonts: string[];\n explicitFonts: string[];\n effectiveFonts: string[];\n explicitSources: FontSourceDiagnosis[];\n implicitSources: FontSourceDiagnosis[];\n };\n };\n const issues = payload.issues as string[];\n const warnings = payload.warnings as string[];\n\n console.log(healthy ? '\\u2713 Font checks passed' : '\\u2717 Font checks found blocking issues');\n console.log(`Mode: ${payload.mode}`);\n console.log(`Required fonts: ${diagnosis.fonts.requiredFonts.join(', ') || '(none)'}`);\n console.log(`Explicit fonts: ${diagnosis.fonts.explicitFonts.join(', ') || '(none)'}`);\n console.log(`Effective fonts: ${diagnosis.fonts.effectiveFonts.join(', ') || '(none)'}`);\n\n for (const source of diagnosis.fonts.explicitSources) {\n console.log(\n `- explicit ${source.fontName}: ${source.kind}${source.path ? ` (${source.path})` : source.url ? ` (${source.url})` : ''}`,\n );\n }\n for (const source of diagnosis.fonts.implicitSources) {\n console.log(\n `- implicit ${source.fontName}: ${source.kind}${source.path ? ` (${source.path})` : ''}`,\n );\n }\n\n for (const issue of issues) {\n console.log(`\\u2717 Issue: ${issue}`);\n }\n for (const warning of warnings) {\n console.log(`\\u26a0 Warning: ${warning}`);\n }\n}\n\nfunction describeDoctorInput(file: string | undefined): string {\n if (!file || file === '-') {\n return 'stdin';\n }\n\n return file;\n}\n","import { defineCommand, runMain } from 'citty';\nimport generateCmd from './commands/generate.js';\nimport validateCmd from './commands/validate.js';\nimport pdf2imgCmd from './commands/pdf2img.js';\nimport pdf2sizeCmd from './commands/pdf2size.js';\nimport examplesCmd from './commands/examples.js';\nimport doctorCmd from './commands/doctor.js';\nimport { CLI_VERSION } from './version.js';\n\nconst main = defineCommand({\n meta: {\n name: 'pdfme',\n version: CLI_VERSION,\n description: 'CLI tool for pdfme - generate PDFs, convert images, validate templates',\n },\n subCommands: {\n generate: generateCmd,\n validate: validateCmd,\n pdf2img: pdf2imgCmd,\n pdf2size: pdf2sizeCmd,\n examples: examplesCmd,\n doctor: doctorCmd,\n },\n});\n\nrunMain(main);\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Plugins } from '@pdfme/common';
2
+ export declare const schemaPlugins: Plugins;
3
+ export declare const schemaTypes: Set<string>;
@@ -0,0 +1,53 @@
1
+ export interface UnifiedJob {
2
+ template: Record<string, unknown>;
3
+ inputs: Record<string, unknown>[];
4
+ options?: unknown;
5
+ }
6
+ interface LoadedInput {
7
+ template: Record<string, unknown>;
8
+ inputs: Record<string, unknown>[];
9
+ options?: unknown;
10
+ templateDir?: string;
11
+ }
12
+ export interface WriteTargetInspection {
13
+ path: string;
14
+ resolvedPath: string;
15
+ parentDir: string;
16
+ exists: boolean;
17
+ existingType?: 'file' | 'directory' | 'other';
18
+ writable: boolean;
19
+ checkedPath?: string;
20
+ checkedType?: 'file' | 'directory' | 'other';
21
+ error?: string;
22
+ }
23
+ export declare function readJsonFile(filePath: string): unknown;
24
+ export declare function loadInput(args: {
25
+ _: string[];
26
+ template?: string;
27
+ inputs?: string;
28
+ }): LoadedInput;
29
+ export declare function resolveBasePdf(template: Record<string, unknown>, basePdfArg: string | undefined, templateDir?: string): Record<string, unknown>;
30
+ export declare function getImageOutputPaths(pdfOutputPath: string, pageCount: number, imageFormat: string): string[];
31
+ export declare function writeOutput(filePath: string, data: Uint8Array | ArrayBuffer): void;
32
+ export declare function readPdfFile(filePath: string): Uint8Array;
33
+ export declare function detectPaperSize(width: number, height: number): string | null;
34
+ export declare function parsePageRange(rangeStr: string, totalPages: number): number[];
35
+ export declare function readJsonFromStdin(): Promise<unknown>;
36
+ export declare function ensureSafeDefaultOutputPath(options: {
37
+ filePath: string;
38
+ rawArgs: string[];
39
+ optionName: string;
40
+ optionAlias?: string | string[];
41
+ defaultValue: string;
42
+ force?: boolean;
43
+ }): void;
44
+ export declare function getSafeDefaultOutputPathIssue(options: {
45
+ filePath: string;
46
+ rawArgs: string[];
47
+ optionName: string;
48
+ optionAlias?: string | string[];
49
+ defaultValue: string;
50
+ force?: boolean;
51
+ }): string | undefined;
52
+ export declare function inspectWriteTarget(filePath: string): WriteTargetInspection;
53
+ export {};
@@ -0,0 +1 @@
1
+ export declare const CLI_VERSION: string;