@cuongph.dev/dbdocgen 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/model/validation.ts","../src/core/config/loader.ts","../src/core/config/schema.ts","../src/parsers/sql/sql-parser.ts","../src/core/warnings.ts","../src/parsers/sql/sql-normalizer.ts","../src/exporters/excel/excel-exporter.ts","../src/exporters/shared/output-labels.ts","../src/exporters/diagram/mermaid-exporter.ts","../src/exporters/markdown/markdown-exporter.ts","../src/core/sanitize.ts","../src/exporters/html/html-exporter.ts","../src/exporters/word/word-exporter.ts","../src/core/pipeline/generate-db-docs.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const enrichedTextSchema = z.object({\n value: z.string().min(1),\n source: z.enum([\"db_comment\", \"backend_source\", \"ai\"]),\n confidence: z.enum([\"high\", \"medium\", \"low\"]),\n needsReview: z.boolean()\n});\n\nexport const reviewTodoSchema = z.object({\n type: z.enum([\"table\", \"column\", \"relationship\", \"ai\", \"parser\"]),\n target: z.string().min(1),\n issue: z.string().min(1),\n suggestion: z.string().optional(),\n source: z.enum([\"schema\", \"backend_source\", \"ai\", \"parser\"])\n});\n\nexport const columnDocSchema = z.object({\n name: z.string().min(1),\n type: z.string().min(1),\n nullable: z.boolean(),\n defaultValue: z.string().optional(),\n isPrimaryKey: z.boolean(),\n isForeignKey: z.boolean(),\n comment: z.string().optional(),\n description: enrichedTextSchema.optional()\n});\n\nexport const foreignKeyDocSchema = z.object({\n name: z.string().optional(),\n columns: z.array(z.string().min(1)),\n referencedTable: z.string().min(1),\n referencedColumns: z.array(z.string().min(1))\n});\n\nexport const indexDocSchema = z.object({\n name: z.string().min(1),\n table: z.string().min(1),\n columns: z.array(z.string().min(1)),\n unique: z.boolean()\n});\n\nexport const relationshipDocSchema = z.object({\n fromTable: z.string().min(1),\n fromColumn: z.string().min(1),\n toTable: z.string().min(1),\n toColumn: z.string().min(1),\n constraintName: z.string().optional(),\n source: z.enum([\"schema\", \"ai_suggestion\"]),\n needsReview: z.boolean()\n});\n\nexport const warningDocSchema = z.object({\n code: z.string().min(1),\n message: z.string().min(1),\n target: z.string().optional(),\n severity: z.enum([\"info\", \"warning\", \"error\"])\n});\n\nexport const tableDocSchema = z.object({\n name: z.string().min(1),\n schema: z.string().optional(),\n comment: z.string().optional(),\n description: enrichedTextSchema.optional(),\n columns: z.array(columnDocSchema),\n primaryKeys: z.array(z.string()),\n foreignKeys: z.array(foreignKeyDocSchema),\n indexes: z.array(indexDocSchema),\n reviewTodos: z.array(reviewTodoSchema)\n});\n\nexport const databaseDocSchema = z.object({\n dialect: z.enum([\n \"postgres\",\n \"mysql\",\n \"mariadb\",\n \"sqlite\",\n \"mssql\",\n \"unknown\"\n ]),\n tables: z.array(tableDocSchema),\n relationships: z.array(relationshipDocSchema),\n indexes: z.array(indexDocSchema),\n warnings: z.array(warningDocSchema)\n});\n","import { cosmiconfig } from \"cosmiconfig\";\nimport {\n dbdocgenConfigSchema,\n type DbdocgenConfig,\n type OutputFormat\n} from \"./schema\";\n\ntype DeepPartial<T> = T extends object\n ? { [P in keyof T]?: DeepPartial<T[P]> }\n : T;\n\nexport type CliConfigOptions = {\n schema?: string;\n dialect?: \"postgres\" | \"mysql\" | \"mariadb\" | \"sqlite\" | \"mssql\" | \"unknown\";\n outDir?: string;\n formats?: OutputFormat[];\n configPath?: string;\n};\n\nexport type LoadConfigInput = {\n cwd: string;\n cliOptions: CliConfigOptions;\n};\n\nexport async function loadConfig(\n input: LoadConfigInput\n): Promise<DbdocgenConfig> {\n const explorer = cosmiconfig(\"dbdocgen\", {\n searchPlaces: [\"dbdocgen.config.js\", \"dbdocgen.config.json\", \".dbdocgenrc\"]\n });\n\n const result = input.cliOptions.configPath\n ? await explorer.load(input.cliOptions.configPath)\n : await explorer.search(input.cwd);\n\n const fileConfig = (result?.config ?? {}) as DeepPartial<DbdocgenConfig>;\n const merged = mergeConfig(fileConfig, input.cliOptions);\n return dbdocgenConfigSchema.parse(merged);\n}\n\nfunction mergeConfig(\n fileConfig: DeepPartial<DbdocgenConfig>,\n cli: CliConfigOptions\n): DeepPartial<DbdocgenConfig> {\n return {\n ...fileConfig,\n schema: cli.schema ?? fileConfig.schema,\n dialect: cli.dialect ?? fileConfig.dialect,\n outDir: cli.outDir ?? fileConfig.outDir,\n output: {\n ...fileConfig.output,\n formats: cli.formats ?? fileConfig.output?.formats\n }\n };\n}\n","import { z } from \"zod\";\n\nconst dialectSchema = z.enum([\n \"postgres\",\n \"mysql\",\n \"mariadb\",\n \"sqlite\",\n \"mssql\",\n \"unknown\"\n]);\n\nexport const outputFormatSchema = z.enum([\n \"excel\",\n \"markdown\",\n \"html\",\n \"diagram\",\n \"word\"\n]);\n\nexport const outputLanguageSchema = z.enum([\"en\", \"jp\"]);\n\nexport const dbdocgenConfigSchema = z.object({\n schema: z.string().default(\"./schema.sql\"),\n dialect: dialectSchema.optional(),\n outDir: z.string().default(\"./docs/db\"),\n output: z\n .object({\n formats: z\n .array(outputFormatSchema)\n .default([\"excel\", \"markdown\", \"html\", \"diagram\", \"word\"]),\n language: outputLanguageSchema.default(\"en\")\n })\n .default({} as never)\n});\n\nexport type OutputFormat = z.infer<typeof outputFormatSchema>;\nexport type OutputLanguage = z.infer<typeof outputLanguageSchema>;\nexport type DbdocgenConfig = z.infer<typeof dbdocgenConfigSchema>;\n","import nodeSqlParser from \"node-sql-parser\";\n\nconst { Parser } = nodeSqlParser;\nimport type {\n DatabaseDialect,\n DatabaseDoc\n} from \"../../core/model/database-doc\";\nimport { createWarning } from \"../../core/warnings\";\nimport { normalizeSqlAst } from \"./sql-normalizer\";\n\nexport type ParseSqlSchemaOptions = {\n dialect?: DatabaseDialect;\n};\n\nexport async function parseSqlSchema(\n sql: string,\n options: ParseSqlSchemaOptions = {}\n): Promise<DatabaseDoc> {\n const requestedDialect = options.dialect;\n const parser = new Parser();\n const detectedDialect = detectDialect(sql);\n const attempts = buildDialectAttempts(requestedDialect, detectedDialect);\n const failures: Array<{ dialect: DatabaseDialect; message: string }> = [];\n const successes: Array<{\n dialect: DatabaseDialect;\n doc: DatabaseDoc;\n score: number;\n }> = [];\n\n for (const dialect of attempts) {\n try {\n const ast = parser.astify(sql, buildAstifyOptions(dialect));\n const doc = normalizeSqlAst(ast, dialect);\n successes.push({\n dialect,\n doc,\n score: scoreParsedDoc(doc)\n });\n } catch (error) {\n failures.push({\n dialect,\n message: error instanceof Error ? error.message : \"Unsupported SQL syntax\"\n });\n }\n }\n\n const best = pickBestResult(successes, requestedDialect, detectedDialect);\n if (best) {\n if (!requestedDialect && best.dialect !== \"unknown\") {\n best.doc.warnings.unshift(\n createWarning(\n \"DIALECT_AUTO_DETECTED\",\n `SQL dialect auto-detected as \"${best.dialect}\".`\n )\n );\n } else if (requestedDialect && requestedDialect !== best.dialect) {\n best.doc.warnings.unshift(\n createWarning(\n \"DIALECT_FALLBACK\",\n `Requested dialect \"${requestedDialect}\" produced a lower-quality parse, reparsed successfully as \"${best.dialect}\".`\n )\n );\n }\n\n return best.doc;\n }\n\n return {\n dialect: requestedDialect ?? \"unknown\",\n tables: [],\n relationships: [],\n indexes: [],\n warnings: [\n createWarning(\n \"UNSUPPORTED_SQL\",\n failures[0]?.message ?? \"Unsupported SQL syntax\"\n )\n ]\n };\n}\n\nfunction mapDialect(\n dialect?: DatabaseDialect\n): \"postgresql\" | \"mysql\" | undefined {\n if (dialect === \"postgres\") return \"postgresql\";\n if (dialect === \"mysql\" || dialect === \"mariadb\") return \"mysql\";\n return undefined;\n}\n\nfunction buildAstifyOptions(\n dialect?: DatabaseDialect\n): { database: \"postgresql\" | \"mysql\" } | undefined {\n const database = mapDialect(dialect);\n return database ? { database } : undefined;\n}\n\nfunction buildDialectAttempts(\n requestedDialect?: DatabaseDialect,\n detectedDialect?: DatabaseDialect\n): DatabaseDialect[] {\n const attempts: DatabaseDialect[] = [];\n\n if (requestedDialect) {\n attempts.push(requestedDialect);\n }\n\n if (detectedDialect) {\n attempts.push(detectedDialect);\n }\n\n attempts.push(\"mysql\", \"mariadb\", \"postgres\", \"unknown\");\n return dedupeDialects(attempts);\n}\n\nfunction dedupeDialects(dialects: DatabaseDialect[]): DatabaseDialect[] {\n const seen = new Set<DatabaseDialect>();\n const ordered: DatabaseDialect[] = [];\n\n for (const dialect of dialects) {\n if (seen.has(dialect)) continue;\n seen.add(dialect);\n ordered.push(dialect);\n }\n\n return ordered;\n}\n\nfunction detectDialect(sql: string): DatabaseDialect | undefined {\n const source = sql.toUpperCase();\n\n const mysqlSignals = [\n \"AUTO_INCREMENT\",\n \"ENGINE=\",\n \"TINYINT\",\n \"UNSIGNED\",\n \"ZEROFILL\",\n \"CHARACTER SET\",\n \"COLLATE \"\n ];\n\n if (mysqlSignals.some((signal) => source.includes(signal))) {\n return \"mysql\";\n }\n\n const postgresSignals = [\n \"SERIAL\",\n \"BIGSERIAL\",\n \"GENERATED ALWAYS AS IDENTITY\",\n \"JSONB\",\n \"ILIKE\",\n \"CREATE EXTENSION\"\n ];\n\n if (postgresSignals.some((signal) => source.includes(signal))) {\n return \"postgres\";\n }\n\n return undefined;\n}\n\nfunction pickBestResult(\n successes: Array<{ dialect: DatabaseDialect; doc: DatabaseDoc; score: number }>,\n requestedDialect?: DatabaseDialect,\n detectedDialect?: DatabaseDialect\n): { dialect: DatabaseDialect; doc: DatabaseDoc; score: number } | undefined {\n const ranked = [...successes].sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n\n const leftBias = dialectBias(left.dialect, requestedDialect, detectedDialect);\n const rightBias = dialectBias(\n right.dialect,\n requestedDialect,\n detectedDialect\n );\n\n return rightBias - leftBias;\n });\n\n return ranked[0];\n}\n\nfunction scoreParsedDoc(doc: DatabaseDoc): number {\n let score = 0;\n\n score += doc.tables.length * 100;\n score += doc.indexes.length * 15;\n score += doc.relationships.length * 20;\n score -= doc.warnings.length * 25;\n\n for (const table of doc.tables) {\n score += table.columns.length * 10;\n score += table.primaryKeys.length * 5;\n\n for (const column of table.columns) {\n if (column.name && column.name !== \"unknown\") score += 3;\n if (column.type && column.type !== \"unknown\") score += 2;\n if (column.name.includes(\"[object Object]\")) score -= 50;\n if (column.type.includes(\"[object Object]\")) score -= 30;\n }\n }\n\n return score;\n}\n\nfunction dialectBias(\n dialect: DatabaseDialect,\n requestedDialect?: DatabaseDialect,\n detectedDialect?: DatabaseDialect\n): number {\n let bias = 0;\n\n if (detectedDialect && dialect === detectedDialect) bias += 20;\n if (requestedDialect && dialect === requestedDialect) bias += 5;\n if (dialect === \"unknown\") bias -= 10;\n\n return bias;\n}\n","import type { WarningDoc } from \"./model/database-doc\";\n\nexport function createWarning(\n code: string,\n message: string,\n target?: string\n): WarningDoc {\n return {\n code,\n message,\n target,\n severity: \"warning\"\n };\n}\n","import type {\n DatabaseDialect,\n DatabaseDoc,\n IndexDoc,\n RelationshipDoc,\n TableDoc,\n WarningDoc\n} from \"../../core/model/database-doc\";\n\ntype AnyAst = Record<string, unknown>;\n\nexport function normalizeSqlAst(\n ast: unknown,\n dialect: DatabaseDialect\n): DatabaseDoc {\n const statements = Array.isArray(ast) ? ast : [ast];\n const tables: TableDoc[] = [];\n const indexes: IndexDoc[] = [];\n const relationships: RelationshipDoc[] = [];\n const warnings: WarningDoc[] = [];\n\n for (const statement of statements as AnyAst[]) {\n if (statement.type === \"create\" && statement.keyword === \"table\") {\n const table = normalizeCreateTable(statement);\n tables.push(table);\n const result = relationshipsFromTable(table);\n relationships.push(...result.relationships);\n warnings.push(...result.warnings);\n }\n\n if (statement.type === \"create\" && statement.keyword === \"index\") {\n indexes.push(normalizeCreateIndex(statement));\n }\n }\n\n for (const index of indexes) {\n const table = tables.find((candidate) => candidate.name === index.table);\n table?.indexes.push(index);\n }\n\n return {\n dialect,\n tables,\n relationships,\n indexes,\n warnings\n };\n}\n\nfunction normalizeCreateTable(statement: AnyAst): TableDoc {\n const tableName = extractTableName(statement.table);\n const createDefinitions = Array.isArray(statement.create_definitions)\n ? (statement.create_definitions as AnyAst[])\n : [];\n\n const table: TableDoc = {\n name: tableName,\n columns: [],\n primaryKeys: [],\n foreignKeys: [],\n indexes: [],\n reviewTodos: []\n };\n\n for (const definition of createDefinitions) {\n if (definition.resource === \"column\") {\n const columnName = extractDeepColumnName(definition.column);\n const isPrimaryKey = hasPrimaryKey(definition);\n const isNotNull = hasNotNull(definition);\n\n table.columns.push({\n name: columnName,\n type: normalizeType(definition.definition),\n nullable: !isNotNull && !isPrimaryKey,\n defaultValue: extractDefaultFromDef(definition),\n isPrimaryKey,\n isForeignKey: false\n });\n if (isPrimaryKey) table.primaryKeys.push(columnName);\n }\n\n if (\n definition.resource === \"constraint\" &&\n isConstraintType(definition.constraint_type, \"PRIMARY KEY\")\n ) {\n table.primaryKeys = extractDeepColumnNames(definition.definition);\n for (const column of table.columns) {\n if (table.primaryKeys.includes(column.name)) column.isPrimaryKey = true;\n }\n }\n\n if (\n definition.resource === \"constraint\" &&\n isConstraintType(definition.constraint_type, \"FOREIGN KEY\")\n ) {\n const columns = extractDeepColumnNames(definition.definition);\n const refDef = definition.reference_definition as AnyAst | undefined;\n const referencedTable = extractTableName(refDef?.table);\n const referencedColumns = extractDeepColumnNames(refDef?.definition);\n table.foreignKeys.push({\n name:\n typeof definition.constraint === \"string\"\n ? definition.constraint\n : undefined,\n columns,\n referencedTable,\n referencedColumns\n });\n for (const column of table.columns) {\n if (columns.includes(column.name)) column.isForeignKey = true;\n }\n }\n }\n\n return table;\n}\n\nfunction normalizeCreateIndex(statement: AnyAst): IndexDoc {\n return {\n name: String(statement.index ?? statement.index_name ?? \"unnamed_index\"),\n table: extractTableName(statement.table),\n columns: extractDeepColumnNames(\n statement.index_columns ?? statement.columns\n ),\n unique: Boolean(statement.unique)\n };\n}\n\nfunction relationshipsFromTable(table: TableDoc): {\n relationships: RelationshipDoc[];\n warnings: WarningDoc[];\n} {\n const relationships: RelationshipDoc[] = [];\n const warnings: WarningDoc[] = [];\n\n for (const foreignKey of table.foreignKeys) {\n for (let index = 0; index < foreignKey.columns.length; index++) {\n const column = foreignKey.columns[index];\n let toColumn: string;\n let needsReview = false;\n\n if (foreignKey.referencedColumns[index]) {\n toColumn = foreignKey.referencedColumns[index];\n } else {\n toColumn = foreignKey.referencedColumns[0] ?? column;\n needsReview = true;\n\n table.reviewTodos.push({\n type: \"relationship\",\n target: `${table.name}.${column} → ${foreignKey.referencedTable}`,\n issue: `Foreign key column \"${column}\" references table \"${foreignKey.referencedTable}\" but the referenced column at position ${index} is missing from the schema. Using \"${toColumn}\" as a best-guess fallback.`,\n suggestion: `Verify the referenced column name in table \"${foreignKey.referencedTable}\" and update manually.`,\n source: \"schema\"\n });\n\n warnings.push({\n code: \"FK_REFERENCED_COLUMN_GUESS\",\n message: `In table \"${table.name}\", foreign key column \"${column}\" references \"${foreignKey.referencedTable}\" but the referenced column at index ${index} is missing. Falling back to \"${toColumn}\".`,\n target: `${table.name}.${column}`,\n severity: \"warning\"\n });\n }\n\n relationships.push({\n fromTable: table.name,\n fromColumn: column,\n toTable: foreignKey.referencedTable,\n toColumn,\n constraintName: foreignKey.name,\n source: \"schema\" as const,\n needsReview\n });\n }\n }\n\n return { relationships, warnings };\n}\n\nfunction extractTableName(value: unknown): string {\n if (Array.isArray(value)) return extractTableName(value[0]);\n if (typeof value === \"object\" && value !== null) {\n const object = value as Record<string, unknown>;\n return String(object.table ?? object.tableName ?? object.name ?? \"unknown\");\n }\n return String(value ?? \"unknown\");\n}\n\nfunction extractDeepColumnName(value: unknown): string {\n if (typeof value !== \"object\" || value === null)\n return String(value ?? \"unknown\");\n const object = value as Record<string, unknown>;\n\n if (object.expr && typeof object.expr === \"object\") {\n return extractDeepColumnName(object.expr);\n }\n if (object.column && typeof object.column === \"object\") {\n return extractDeepColumnName(object.column);\n }\n if (object.value !== undefined) {\n return String(object.value);\n }\n if (object.column !== undefined) {\n return String(object.column);\n }\n return String(object.name ?? object.tableName ?? \"unknown\");\n}\n\nfunction extractDeepColumnNames(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.map((item) => extractDeepColumnName(item));\n}\n\nfunction normalizeType(value: unknown): string {\n if (typeof value === \"object\" && value !== null) {\n const object = value as Record<string, unknown>;\n return String(\n object.dataType ?? object.type ?? object.name ?? \"unknown\"\n ).toLowerCase();\n }\n return String(value ?? \"unknown\").toLowerCase();\n}\n\nfunction hasPrimaryKey(def: AnyAst): boolean {\n if (def.primary_key) return true;\n if (\n def.constraint_type &&\n isConstraintType(def.constraint_type, \"PRIMARY KEY\")\n )\n return true;\n return false;\n}\n\nfunction hasNotNull(def: AnyAst): boolean {\n if (!def.nullable) return false;\n if (\n typeof def.nullable === \"object\" &&\n (def.nullable as AnyAst).type === \"not null\"\n )\n return true;\n if (String(def.nullable) === \"not null\") return true;\n return false;\n}\n\nfunction isConstraintType(value: unknown, expected: string): boolean {\n if (typeof value !== \"string\") return false;\n return value.toUpperCase() === expected.toUpperCase();\n}\n\nfunction extractDefaultFromDef(def: AnyAst): string | undefined {\n if (!def.default_val) return undefined;\n const defaultVal = def.default_val as AnyAst;\n if (defaultVal.type === \"default\" && defaultVal.value) {\n if (typeof defaultVal.value === \"object\" && defaultVal.value !== null) {\n const val = defaultVal.value as AnyAst;\n if (val.type === \"function\" && val.name) {\n const name = val.name as AnyAst;\n const parts = Array.isArray(name.name) ? (name.name as AnyAst[]) : [];\n return parts.map((p) => String(p.value ?? \"\")).join(\"\");\n }\n if (val.type === \"single_quote_string\") {\n return `'${String(val.value)}'`;\n }\n if (val.value !== undefined) return String(val.value);\n }\n return String(defaultVal.value);\n }\n if (typeof defaultVal.value === \"string\") return defaultVal.value;\n return undefined;\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport ExcelJS from \"exceljs\";\nimport type { OutputLanguage } from \"../../core/config/schema\";\nimport type { DatabaseDoc, TableDoc } from \"../../core/model/database-doc\";\nimport { getOutputLabels, type OutputLabels } from \"../shared/output-labels\";\n\nconst COLOR = {\n headerBg: \"FF4472C4\",\n headerFg: \"FFFFFFFF\",\n metaBg: \"FFD9E1F2\",\n metaFg: \"FF1F3864\",\n overviewBg: \"FF4472C4\",\n overviewFg: \"FFFFFFFF\",\n altRow: \"FFF2F7FF\",\n pkBg: \"FFFFF3CD\",\n fkBg: \"FFE8F4FD\",\n link: \"FF0563C1\",\n border: \"FFB8CCE4\",\n valueBg: \"FFFAFBFE\",\n};\n\nconst COL_COUNT = 7; // overview + table definition columns\n\nexport type ExportOptions = {\n outDir: string;\n language?: OutputLanguage;\n};\n\nexport async function exportExcelDictionary(\n doc: DatabaseDoc,\n options: ExportOptions\n): Promise<void> {\n await mkdir(options.outDir, { recursive: true });\n const workbook = new ExcelJS.Workbook();\n const labels = getOutputLabels(options.language);\n\n const sheetNames = new Map<string, string>();\n for (const table of doc.tables) {\n sheetNames.set(table.name, buildSheetName(table.name, sheetNames));\n }\n\n addOverviewSheet(workbook, doc, labels, sheetNames);\n\n for (const table of doc.tables) {\n const sheetName = sheetNames.get(table.name)!;\n const sheet = workbook.addWorksheet(sheetName);\n populateTableSheet(sheet, table, doc, labels);\n }\n\n await workbook.xlsx.writeFile(\n join(options.outDir, \"database_dictionary.xlsx\")\n );\n}\n\n// ── Overview ──────────────────────────────────────────────────────────────────\n\nfunction addOverviewSheet(\n workbook: ExcelJS.Workbook,\n doc: DatabaseDoc,\n labels: OutputLabels,\n sheetNames: Map<string, string>\n) {\n const sheet = workbook.addWorksheet(\"Overview\");\n\n // Row 1: title\n sheet.mergeCells(1, 1, 1, COL_COUNT);\n const titleCell = sheet.getCell(1, 1);\n titleCell.value = labels.docTitle;\n titleCell.font = { bold: true, size: 14, color: { argb: COLOR.overviewFg } };\n titleCell.fill = solidFill(COLOR.overviewBg);\n titleCell.alignment = { horizontal: \"center\", vertical: \"middle\" };\n sheet.getRow(1).height = 30;\n\n sheet.addRow([]);\n\n // Summary block (rows 3–5)\n const summary: [string, string | number][] = [\n [labels.dialectLabel, doc.dialect],\n [labels.tablesLabel, doc.tables.length],\n [labels.relationshipsLabel, doc.relationships.length],\n ];\n for (const [field, value] of summary) {\n const row = sheet.addRow([field, value]);\n styleMetaRow(row);\n applyBorderToRow(row, 2);\n row.getCell(1).alignment = { vertical: \"middle\", indent: 1 };\n row.getCell(2).alignment = { vertical: \"middle\", indent: 1 };\n }\n\n sheet.addRow([]);\n\n // Section heading (row 7)\n const sectionRow = sheet.addRow([labels.tableListHeading]);\n sheet.mergeCells(sectionRow.number, 1, sectionRow.number, COL_COUNT);\n const sectionCell = sectionRow.getCell(1);\n sectionCell.font = { bold: true, size: 11, color: { argb: COLOR.metaFg } };\n sectionCell.fill = solidFill(COLOR.metaBg);\n sectionCell.alignment = { vertical: \"middle\" };\n sectionRow.height = 22;\n\n // Table list header (row 8)\n const headerRowNum = sectionRow.number + 1;\n const headerRow = sheet.getRow(headerRowNum);\n headerRow.values = [\n labels.rowNo,\n labels.tableLabel,\n labels.tableLogicalName,\n labels.columnsCount,\n labels.primaryKey,\n labels.foreignKeys,\n labels.indexes,\n ];\n styleColorRow(headerRow, COLOR.overviewBg, COLOR.overviewFg);\n applyBorderToRow(headerRow, COL_COUNT);\n\n // Data rows\n for (const [i, table] of doc.tables.entries()) {\n const indexes = collectTableIndexes(table, doc);\n const targetSheet = sheetNames.get(table.name)!;\n const row = sheet.addRow([\n i + 1,\n table.name,\n displayValue(table.comment, labels),\n table.columns.length,\n displayValue(table.primaryKeys.join(\", \"), labels),\n table.foreignKeys.length > 0\n ? table.foreignKeys\n .map((fk) => `${fk.columns.join(\",\")} → ${fk.referencedTable}`)\n .join(\"; \")\n : labels.none,\n indexes.length > 0\n ? indexes.map((idx) => idx.name).join(\"; \")\n : labels.none,\n ]);\n\n setHyperlink(row.getCell(2), table.name, targetSheet);\n row.getCell(2).font = { bold: true, color: { argb: COLOR.link }, underline: true };\n row.getCell(4).alignment = { horizontal: \"center\" };\n\n if (i % 2 === 1) {\n shadeRow(row, COL_COUNT, COLOR.altRow);\n }\n applyBorderToRow(row, COL_COUNT);\n }\n\n sheet.columns = [\n { width: 20 },\n { width: 28 },\n { width: 30 },\n { width: 9 },\n { width: 20 },\n { width: 38 },\n { width: 38 },\n ];\n\n sheet.autoFilter = {\n from: { row: headerRowNum, column: 1 },\n to: { row: headerRowNum + doc.tables.length, column: COL_COUNT },\n };\n sheet.views = [{ state: \"frozen\", ySplit: headerRowNum }];\n}\n\n// ── Per-table sheet ───────────────────────────────────────────────────────────\n\nfunction populateTableSheet(\n sheet: ExcelJS.Worksheet,\n table: TableDoc,\n doc: DatabaseDoc,\n labels: OutputLabels\n) {\n const indexes = collectTableIndexes(table, doc);\n\n // Row 1: table title\n sheet.mergeCells(1, 1, 1, 6);\n const titleCell = sheet.getCell(1, 1);\n titleCell.value = table.name;\n titleCell.font = { bold: true, size: 13, color: { argb: COLOR.overviewFg } };\n titleCell.fill = solidFill(COLOR.headerBg);\n titleCell.alignment = { horizontal: \"left\", vertical: \"middle\", indent: 1 };\n sheet.getRow(1).height = 26;\n\n // Row 2: back link\n const backRow = sheet.addRow([labels.backToOverview]);\n setHyperlink(backRow.getCell(1), labels.backToOverview, \"Overview\");\n backRow.getCell(1).font = { color: { argb: COLOR.link }, underline: true, size: 10 };\n\n sheet.addRow([]);\n\n // Metadata block\n const metaData: [string, string][] = [\n [labels.tablePhysicalName, table.name],\n [labels.tableLogicalName, displayValue(table.comment, labels)],\n ...(table.schema ? [[labels.schema, table.schema] as [string, string]] : []),\n [labels.columnsCount, String(table.columns.length)],\n [labels.primaryKey, displayValue(table.primaryKeys.join(\", \"), labels)],\n [\n labels.foreignKeys,\n table.foreignKeys.length > 0\n ? table.foreignKeys\n .map((fk) => {\n const name = fk.name ? ` (${fk.name})` : \"\";\n return `${fk.columns.join(\", \")} → ${fk.referencedTable}.${fk.referencedColumns.join(\", \")}${name}`;\n })\n .join(\"; \")\n : labels.none,\n ],\n [\n labels.indexes,\n indexes.length > 0\n ? indexes\n .map(\n (idx) =>\n `${idx.name} (${idx.columns.join(\", \")})${idx.unique ? \" UNIQUE\" : \"\"}`\n )\n .join(\"; \")\n : labels.none,\n ],\n ];\n\n for (const [field, value] of metaData) {\n const row = sheet.addRow([field, value]);\n styleMetaRow(row);\n applyBorderToRow(row, 2);\n row.getCell(2).alignment = { wrapText: true, vertical: \"top\" };\n }\n\n sheet.addRow([]);\n\n // Column definition header\n const headerRow = sheet.addRow([\n labels.physicalName,\n labels.logicalName,\n labels.type,\n labels.required,\n labels.defaultValue,\n labels.notes,\n ]);\n styleColorRow(headerRow, COLOR.headerBg, COLOR.headerFg);\n applyBorderToRow(headerRow, 6);\n\n const headerRowNum = headerRow.number;\n\n // Column data rows\n for (const [i, column] of table.columns.entries()) {\n const markers: string[] = [];\n if (column.isPrimaryKey) markers.push(labels.pkMarker);\n if (column.isForeignKey) markers.push(labels.fkMarker);\n const notes = [markers.join(\", \"), column.description?.value ?? \"\"]\n .filter(Boolean)\n .join(\" | \");\n\n const row = sheet.addRow([\n column.name,\n displayValue(column.comment, labels),\n column.type,\n column.nullable ? labels.no : labels.yes,\n column.defaultValue ?? \"-\",\n notes || \"-\",\n ]);\n\n if (column.isPrimaryKey) {\n shadeRow(row, 6, COLOR.pkBg);\n row.getCell(1).font = { bold: true };\n } else if (column.isForeignKey) {\n shadeRow(row, 6, COLOR.fkBg);\n } else if (i % 2 === 1) {\n shadeRow(row, 6, COLOR.altRow);\n }\n\n row.getCell(4).alignment = { horizontal: \"center\" };\n applyBorderToRow(row, 6);\n }\n\n sheet.columns = [\n { width: 24 },\n { width: 28 },\n { width: 18 },\n { width: 10 },\n { width: 18 },\n { width: 36 },\n ];\n\n sheet.views = [{ state: \"frozen\", ySplit: headerRowNum }];\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction displayValue(value: string | undefined, labels: OutputLabels): string {\n const trimmed = value?.trim();\n return trimmed ? trimmed : labels.none;\n}\n\nfunction buildSheetName(\n tableName: string,\n existing: Map<string, string>\n): string {\n const base = tableName.slice(0, 31);\n if (![...existing.values()].includes(base)) return base;\n let suffix = 2;\n while (suffix < 100) {\n const candidate = `${tableName.slice(0, 28)}_${suffix}`;\n if (![...existing.values()].includes(candidate)) return candidate;\n suffix++;\n }\n return base;\n}\n\nfunction sheetLocation(sheetName: string, cellRef = \"A1\"): string {\n if (/^[A-Za-z0-9_]+$/.test(sheetName)) {\n return `${sheetName}!${cellRef}`;\n }\n const escaped = sheetName.replace(/'/g, \"''\");\n return `'${escaped}'!${cellRef}`;\n}\n\nfunction setHyperlink(\n cell: ExcelJS.Cell,\n text: string,\n sheetName: string\n): void {\n cell.value = { text, hyperlink: sheetLocation(sheetName) };\n}\n\nfunction solidFill(argb: string): ExcelJS.Fill {\n return { type: \"pattern\", pattern: \"solid\", fgColor: { argb } };\n}\n\nfunction styleMetaRow(row: ExcelJS.Row) {\n row.getCell(1).font = { bold: true, color: { argb: COLOR.metaFg } };\n row.getCell(1).fill = solidFill(COLOR.metaBg);\n row.getCell(2).fill = solidFill(COLOR.valueBg);\n}\n\nfunction styleColorRow(row: ExcelJS.Row, bgArgb: string, fgArgb: string) {\n row.eachCell((cell) => {\n cell.font = { bold: true, color: { argb: fgArgb } };\n cell.fill = solidFill(bgArgb);\n cell.alignment = { vertical: \"middle\", horizontal: \"center\" };\n });\n row.height = 22;\n}\n\nfunction shadeRow(row: ExcelJS.Row, colCount: number, argb: string) {\n for (let c = 1; c <= colCount; c++) {\n row.getCell(c).fill = solidFill(argb);\n }\n}\n\nfunction applyBorderToRow(row: ExcelJS.Row, colCount: number) {\n const border: ExcelJS.Border = { style: \"thin\", color: { argb: COLOR.border } };\n for (let c = 1; c <= colCount; c++) {\n row.getCell(c).border = {\n top: border,\n left: border,\n bottom: border,\n right: border,\n };\n }\n}\n\nfunction collectTableIndexes(table: TableDoc, doc: DatabaseDoc) {\n return [\n ...table.indexes,\n ...doc.indexes.filter(\n (idx) =>\n idx.table === table.name &&\n !table.indexes.some((tableIdx) => tableIdx.name === idx.name)\n ),\n ];\n}\n","import type { OutputLanguage } from \"../../core/config/schema\";\n\nexport type OutputLabels = {\n docTitle: string;\n tableInfoHeading: string;\n columnsHeading: string;\n metaField: string;\n metaValue: string;\n tablePhysicalName: string;\n tableLogicalName: string;\n schema: string;\n primaryKey: string;\n foreignKeys: string;\n indexes: string;\n none: string;\n physicalName: string;\n logicalName: string;\n type: string;\n required: string;\n defaultValue: string;\n notes: string;\n yes: string;\n no: string;\n generatedNote: string;\n overviewHeading: string;\n tableListHeading: string;\n relationshipsHeading: string;\n warningsHeading: string;\n tableLabel: string;\n descriptionLabel: string;\n dialectLabel: string;\n tablesLabel: string;\n relationshipsLabel: string;\n severity: string;\n code: string;\n target: string;\n message: string;\n fromTable: string;\n fromColumn: string;\n toTable: string;\n toColumn: string;\n constraint: string;\n source: string;\n needsReview: string;\n columnsCount: string;\n rowNo: string;\n backToOverview: string;\n pkMarker: string;\n fkMarker: string;\n};\n\nconst LABELS: Record<OutputLanguage, OutputLabels> = {\n en: {\n docTitle: \"Database Documentation\",\n tableInfoHeading: \"Table Info\",\n columnsHeading: \"Columns\",\n metaField: \"Field\",\n metaValue: \"Value\",\n tablePhysicalName: \"Table Physical Name\",\n tableLogicalName: \"Table Logical Name\",\n schema: \"Schema\",\n primaryKey: \"Primary Key\",\n foreignKeys: \"Foreign Keys\",\n indexes: \"Indexes\",\n none: \"(none)\",\n physicalName: \"Physical Name\",\n logicalName: \"Logical Name\",\n type: \"Type\",\n required: \"Required\",\n defaultValue: \"Default Value\",\n notes: \"Notes\",\n yes: \"Yes\",\n no: \"No\",\n generatedNote: \"Generated by dbdocgen in A5:SQL-style layout.\",\n overviewHeading: \"Overview\",\n tableListHeading: \"Table List\",\n relationshipsHeading: \"Relationships\",\n warningsHeading: \"Warnings\",\n tableLabel: \"Table\",\n descriptionLabel: \"Description\",\n dialectLabel: \"Dialect\",\n tablesLabel: \"Tables\",\n relationshipsLabel: \"Relationships\",\n severity: \"Severity\",\n code: \"Code\",\n target: \"Target\",\n message: \"Message\",\n fromTable: \"From Table\",\n fromColumn: \"From Column\",\n toTable: \"To Table\",\n toColumn: \"To Column\",\n constraint: \"Constraint\",\n source: \"Source\",\n needsReview: \"Needs Review\",\n columnsCount: \"Columns\",\n rowNo: \"#\",\n backToOverview: \"← Overview\",\n pkMarker: \"PK\",\n fkMarker: \"FK\"\n },\n jp: {\n docTitle: \"Database Documentation\",\n tableInfoHeading: \"Table Info\",\n columnsHeading: \"Columns\",\n metaField: \"項目\",\n metaValue: \"値\",\n tablePhysicalName: \"テーブル物理名\",\n tableLogicalName: \"テーブル論理名\",\n schema: \"スキーマ\",\n primaryKey: \"主キー\",\n foreignKeys: \"外部キー\",\n indexes: \"インデックス\",\n none: \"(none)\",\n physicalName: \"物理名\",\n logicalName: \"論理名\",\n type: \"型\",\n required: \"必須\",\n defaultValue: \"デフォルト値\",\n notes: \"備考\",\n yes: \"Yes\",\n no: \"No\",\n generatedNote: \"Generated by dbdocgen in A5:SQL-style layout.\",\n overviewHeading: \"Overview\",\n tableListHeading: \"Table List\",\n relationshipsHeading: \"Relationships\",\n warningsHeading: \"Warnings\",\n tableLabel: \"Table\",\n descriptionLabel: \"Description\",\n dialectLabel: \"Dialect\",\n tablesLabel: \"Tables\",\n relationshipsLabel: \"Relationships\",\n severity: \"Severity\",\n code: \"Code\",\n target: \"Target\",\n message: \"Message\",\n fromTable: \"From Table\",\n fromColumn: \"From Column\",\n toTable: \"To Table\",\n toColumn: \"To Column\",\n constraint: \"Constraint\",\n source: \"Source\",\n needsReview: \"Needs Review\",\n columnsCount: \"列数\",\n rowNo: \"No.\",\n backToOverview: \"← 一覧\",\n pkMarker: \"PK\",\n fkMarker: \"FK\"\n }\n};\n\nexport function getOutputLabels(language: OutputLanguage = \"en\"): OutputLabels {\n return LABELS[language];\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DatabaseDoc } from \"../../core/model/database-doc\";\n\nexport type DiagramExportOptions = {\n outDir: string;\n};\n\nexport async function exportMermaidDiagram(\n doc: DatabaseDoc,\n options: DiagramExportOptions\n): Promise<void> {\n await mkdir(options.outDir, { recursive: true });\n await writeFile(\n join(options.outDir, \"er_diagram.mmd\"),\n renderMermaid(doc),\n \"utf8\"\n );\n}\n\nexport function renderMermaid(doc: DatabaseDoc): string {\n const lines = [\"erDiagram\"];\n\n // Warnings as Mermaid comments\n for (const warning of doc.warnings) {\n const target = warning.target ? ` (${warning.target})` : \"\";\n lines.push(\n ` %% WARNING [${warning.severity}] ${warning.code}${target}: ${warning.message}`\n );\n }\n\n for (const table of doc.tables) {\n // Table review TODOs as comments\n for (const todo of table.reviewTodos) {\n lines.push(` %% TODO [${todo.type}] ${todo.target}: ${todo.issue}`);\n }\n\n lines.push(` ${table.name} {`);\n for (const column of table.columns) {\n const markers = [\n column.isPrimaryKey ? \"PK\" : \"\",\n column.isForeignKey ? \"FK\" : \"\"\n ]\n .filter(Boolean)\n .join(\" \");\n lines.push(\n ` ${sanitizeType(column.type)} ${column.name}${markers ? ` \"${markers}\"` : \"\"}`\n );\n }\n lines.push(\" }\");\n }\n\n for (const relationship of doc.relationships.filter(\n (item) => item.source === \"schema\"\n )) {\n lines.push(\n ` ${relationship.toTable} ||--o{ ${relationship.fromTable} : \"${relationship.constraintName ?? relationship.fromColumn}\"`\n );\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction sanitizeType(type: string): string {\n return type.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { OutputLanguage } from \"../../core/config/schema\";\nimport type { DatabaseDoc, TableDoc } from \"../../core/model/database-doc\";\nimport { sanitizeFilename } from \"../../core/sanitize\";\nimport { getOutputLabels } from \"../shared/output-labels\";\n\nexport type MarkdownExportOptions = {\n outDir: string;\n language?: OutputLanguage;\n};\n\nexport async function exportMarkdownDocs(\n doc: DatabaseDoc,\n options: MarkdownExportOptions\n): Promise<void> {\n try {\n const tablesDir = join(options.outDir, \"tables\");\n await mkdir(tablesDir, { recursive: true });\n const labels = getOutputLabels(options.language);\n\n for (const table of doc.tables) {\n await writeFile(\n join(tablesDir, `${sanitizeFilename(table.name)}.md`),\n renderTableDoc(table, doc, labels),\n \"utf8\"\n );\n }\n } catch (err) {\n throw new Error(\n `Failed to export Markdown docs: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err }\n );\n }\n}\n\nfunction renderTableDoc(\n table: TableDoc,\n doc: DatabaseDoc,\n labels: ReturnType<typeof getOutputLabels>\n): string {\n const lines: string[] = [];\n const tableIndexes = collectTableIndexes(table, doc);\n\n lines.push(`# ${escapeMd(table.name)}`);\n lines.push(\"\");\n lines.push(`## ${labels.tableInfoHeading}`);\n lines.push(\"\");\n lines.push(`| ${labels.metaField} | ${labels.metaValue} |`);\n lines.push(\"|------|----|\");\n lines.push(`| ${labels.tablePhysicalName} | ${escapeMd(table.name)} |`);\n lines.push(`| ${labels.tableLogicalName} | ${escapeMd(table.comment ?? \"\")} |`);\n lines.push(`| ${labels.schema} | ${escapeMd(table.schema ?? \"\")} |`);\n lines.push(\n `| ${labels.primaryKey} | ${escapeMd(table.primaryKeys.join(\", \") || labels.none)} |`\n );\n lines.push(\n `| ${labels.foreignKeys} | ${escapeMd(\n table.foreignKeys.length > 0\n ? table.foreignKeys\n .map((fk) => {\n const name = fk.name ? ` (${fk.name})` : \"\";\n return `${fk.columns.join(\", \")} -> ${fk.referencedTable}.${fk.referencedColumns.join(\", \")}${name}`;\n })\n .join(\"; \")\n : labels.none\n )} |`\n );\n lines.push(\n `| ${labels.indexes} | ${escapeMd(\n tableIndexes.length > 0\n ? tableIndexes\n .map(\n (idx) =>\n `${idx.name} (${idx.columns.join(\", \")})${idx.unique ? \" UNIQUE\" : \"\"}`\n )\n .join(\"; \")\n : labels.none\n )} |`\n );\n lines.push(\"\");\n lines.push(`## ${labels.columnsHeading}`);\n lines.push(\"\");\n lines.push(\n `| ${labels.physicalName} | ${labels.logicalName} | ${labels.type} | ${labels.required} | ${labels.defaultValue} | ${labels.notes} |`\n );\n lines.push(\"|--------|--------|----|------|--------------|------|\");\n\n for (const col of table.columns) {\n lines.push(\n `| ${escapeMd(col.name)} | ${escapeMd(col.comment ?? \"\")} | ${escapeMd(col.type)} | ${col.nullable ? labels.no : labels.yes} | ${escapeMd(col.defaultValue ?? \"-\")} | ${escapeMd(col.description?.value ?? \"\")} |`\n );\n }\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction collectTableIndexes(table: TableDoc, doc: DatabaseDoc) {\n return [\n ...table.indexes,\n ...doc.indexes.filter(\n (idx) =>\n idx.table === table.name &&\n !table.indexes.some((tableIdx) => tableIdx.name === idx.name)\n )\n ];\n}\n\nfunction escapeMd(text: string): string {\n return text.replace(/([|*_`\\[\\]<>#~\\\\])/g, \"\\\\$1\");\n}\n","/**\n * Sanitize a table name for safe use in file paths.\n * Valid chars: alphanumeric, underscore, hyphen.\n * Everything else (including path separators, traversal sequences) → `_`.\n */\nexport function sanitizeFilename(name: string): string {\n return name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { OutputLanguage } from \"../../core/config/schema\";\nimport type { DatabaseDoc, TableDoc } from \"../../core/model/database-doc\";\nimport { sanitizeFilename } from \"../../core/sanitize\";\nimport { getOutputLabels } from \"../shared/output-labels\";\n\nexport type HtmlExportOptions = {\n outDir: string;\n language?: OutputLanguage;\n};\n\nexport async function exportHtmlDocs(\n doc: DatabaseDoc,\n options: HtmlExportOptions\n): Promise<void> {\n try {\n const htmlDir = join(options.outDir, \"html\");\n const tablesDir = join(htmlDir, \"tables\");\n await mkdir(tablesDir, { recursive: true });\n const labels = getOutputLabels(options.language);\n\n // index.html\n await writeFile(\n join(htmlDir, \"index.html\"),\n renderIndexPage(doc, labels),\n \"utf8\"\n );\n\n // per-table pages\n for (const table of doc.tables) {\n await writeFile(\n join(tablesDir, `${sanitizeFilename(table.name)}.html`),\n renderTablePage(table, doc, labels),\n \"utf8\"\n );\n }\n } catch (err) {\n throw new Error(\n `Failed to export HTML docs: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err }\n );\n }\n}\n\n// ── Shared CSS ────────────────────────────────────────────────────────────────\n\nconst CSS = `\n :root {\n --bg: #f3f4f6;\n --paper: #ffffff;\n --text: #111827;\n --muted: #4b5563;\n --border: #bfc7d4;\n --accent: #4472c4;\n --accent-light: #dbe5f1;\n --accent-mid: #eef3f8;\n --pk-bg: #fff3cd;\n --fk-bg: #e8f4fd;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: \"Yu Gothic UI\", \"Meiryo\", Arial, sans-serif;\n background: var(--bg); color: var(--text); line-height: 1.5;\n padding: 24px;\n }\n a { color: var(--accent); text-decoration: none; }\n a:hover { text-decoration: underline; }\n .sheet {\n max-width: 1200px;\n margin: 0 auto;\n background: var(--paper);\n border: 1px solid var(--border);\n padding: 24px;\n }\n h1 { font-size: 22px; margin-bottom: 16px; color: var(--accent); border-bottom: 2px solid var(--accent-light); padding-bottom: 8px; }\n h2 { font-size: 15px; margin: 20px 0 8px; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; }\n table { width: 100%; border-collapse: collapse; table-layout: fixed; margin-bottom: 16px; }\n th, td {\n border: 1px solid var(--border);\n padding: 7px 10px;\n text-align: left;\n vertical-align: top;\n word-break: break-word;\n font-size: 13px;\n }\n thead th { background: var(--accent); color: #fff; font-weight: 700; }\n .meta th { background: var(--accent-light); font-weight: 700; color: #1f3864; width: 180px; }\n .meta td { background: #fafbfe; }\n .pk td:first-child { font-weight: 700; }\n .pk { background: var(--pk-bg); }\n .fk { background: var(--fk-bg); }\n .badge {\n display: inline-block; font-size: 10px; font-weight: 700;\n padding: 1px 5px; border-radius: 3px; margin-left: 4px; vertical-align: middle;\n }\n .badge-pk { background: #f59e0b; color: #fff; }\n .badge-fk { background: var(--accent); color: #fff; }\n .note { color: var(--muted); font-size: 12px; margin-top: 10px; }\n .back { margin-bottom: 16px; font-size: 13px; }\n .summary { display: flex; gap: 24px; margin-bottom: 20px; }\n .summary-item { background: var(--accent-light); border-radius: 6px; padding: 10px 18px; }\n .summary-item .num { font-size: 24px; font-weight: 700; color: var(--accent); }\n .summary-item .lbl { font-size: 12px; color: var(--muted); }\n .table-list { width: 100%; border-collapse: collapse; margin-top: 8px; }\n .table-list th { background: var(--accent); color: #fff; }\n .table-list tr:nth-child(even) td { background: var(--accent-mid); }\n .table-list td:first-child a { font-weight: 600; }\n`;\n\nfunction pageShell(title: string, body: string, fromSubdir = false): string {\n const base = fromSubdir ? \"../\" : \"\";\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${esc(title)}</title>\n <style>${CSS} </style>\n</head>\n<body>\n <div class=\"sheet\">\n${body}\n </div>\n</body>\n</html>`;\n}\n\n// ── Index page ────────────────────────────────────────────────────────────────\n\nfunction renderIndexPage(\n doc: DatabaseDoc,\n labels: ReturnType<typeof getOutputLabels>\n): string {\n let tableRows = \"\";\n for (const table of doc.tables) {\n const pkCols = table.primaryKeys.join(\", \") || labels.none;\n const fkCount = table.foreignKeys.length;\n const fileName = sanitizeFilename(table.name);\n tableRows += ` <tr>\n <td><a href=\"tables/${fileName}.html\">${esc(table.name)}</a></td>\n <td>${esc(table.comment ?? \"\")}</td>\n <td style=\"text-align:center\">${table.columns.length}</td>\n <td>${esc(pkCols)}</td>\n <td style=\"text-align:center\">${fkCount}</td>\n </tr>\\n`;\n }\n\n const body = `\n <h1>${esc(labels.docTitle)}</h1>\n <div class=\"summary\">\n <div class=\"summary-item\"><div class=\"num\">${doc.tables.length}</div><div class=\"lbl\">${esc(labels.tablesLabel)}</div></div>\n <div class=\"summary-item\"><div class=\"num\">${doc.relationships.length}</div><div class=\"lbl\">${esc(labels.relationshipsLabel)}</div></div>\n <div class=\"summary-item\"><div class=\"num\">${doc.dialect}</div><div class=\"lbl\">${esc(labels.dialectLabel)}</div></div>\n </div>\n <h2>${esc(labels.tableListHeading)}</h2>\n <table class=\"table-list\">\n <thead><tr>\n <th>${esc(labels.tableLabel)}</th>\n <th>${esc(labels.tableLogicalName)}</th>\n <th style=\"width:70px;text-align:center\">Cols</th>\n <th>${esc(labels.primaryKey)}</th>\n <th style=\"width:50px;text-align:center\">FK</th>\n </tr></thead>\n <tbody>\n${tableRows} </tbody>\n </table>\n <p class=\"note\">${esc(labels.generatedNote)}</p>\n`;\n return pageShell(labels.docTitle, body);\n}\n\n// ── Per-table page ────────────────────────────────────────────────────────────\n\nfunction renderTablePage(\n table: TableDoc,\n doc: DatabaseDoc,\n labels: ReturnType<typeof getOutputLabels>\n): string {\n const indexes = collectTableIndexes(table, doc);\n\n const foreignKeys = table.foreignKeys.length\n ? table.foreignKeys\n .map((fk) => {\n const name = fk.name ? ` (${fk.name})` : \"\";\n return `${fk.columns.join(\", \")} → ${fk.referencedTable}.${fk.referencedColumns.join(\", \")}${name}`;\n })\n .join(\"<br>\")\n : labels.none;\n\n const indexText = indexes.length\n ? indexes\n .map(\n (idx) =>\n `${idx.name} (${idx.columns.join(\", \")})${idx.unique ? \" UNIQUE\" : \"\"}`\n )\n .join(\"<br>\")\n : labels.none;\n\n let colRows = \"\";\n for (const col of table.columns) {\n const pkBadge = col.isPrimaryKey\n ? `<span class=\"badge badge-pk\">PK</span>`\n : \"\";\n const fkBadge = col.isForeignKey\n ? `<span class=\"badge badge-fk\">FK</span>`\n : \"\";\n const rowClass = col.isPrimaryKey ? \"pk\" : col.isForeignKey ? \"fk\" : \"\";\n const required = col.nullable ? labels.no : labels.yes;\n colRows += ` <tr${rowClass ? ` class=\"${rowClass}\"` : \"\"}>`\n + `<td>${esc(col.name)}${pkBadge}${fkBadge}</td>`\n + `<td>${esc(col.comment ?? \"\")}</td>`\n + `<td>${esc(col.type)}</td>`\n + `<td>${required}</td>`\n + `<td>${esc(col.defaultValue ?? \"-\")}</td>`\n + `<td>${esc(col.description?.value ?? \"\")}</td>`\n + `</tr>\\n`;\n }\n\n const body = `\n <p class=\"back\"><a href=\"../index.html\">← ${esc(labels.tableListHeading)}</a></p>\n <h1>${esc(table.name)}</h1>\n <h2>${esc(labels.tableInfoHeading)}</h2>\n <table class=\"meta\">\n <tbody>\n <tr><th>${esc(labels.tablePhysicalName)}</th><td>${esc(table.name)}</td></tr>\n <tr><th>${esc(labels.tableLogicalName)}</th><td>${esc(table.comment ?? \"\")}</td></tr>\n <tr><th>${esc(labels.schema)}</th><td>${esc(table.schema ?? \"\")}</td></tr>\n <tr><th>${esc(labels.primaryKey)}</th><td>${esc(table.primaryKeys.join(\", \") || labels.none)}</td></tr>\n <tr><th>${esc(labels.foreignKeys)}</th><td>${foreignKeys}</td></tr>\n <tr><th>${esc(labels.indexes)}</th><td>${indexText}</td></tr>\n </tbody>\n </table>\n\n <h2>${esc(labels.columnsHeading)}</h2>\n <table class=\"columns\">\n <thead><tr>\n <th>${esc(labels.physicalName)}</th>\n <th>${esc(labels.logicalName)}</th>\n <th>${esc(labels.type)}</th>\n <th>${esc(labels.required)}</th>\n <th>${esc(labels.defaultValue)}</th>\n <th>${esc(labels.notes)}</th>\n </tr></thead>\n <tbody>\n${colRows} </tbody>\n </table>\n <p class=\"note\">${esc(labels.generatedNote)}</p>\n`;\n return pageShell(table.name, body);\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction collectTableIndexes(table: TableDoc, doc: DatabaseDoc) {\n return [\n ...table.indexes,\n ...doc.indexes.filter(\n (idx) =>\n idx.table === table.name &&\n !table.indexes.some((tableIdx) => tableIdx.name === idx.name)\n ),\n ];\n}\n\nfunction esc(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n Document,\n Packer,\n Paragraph,\n Table,\n TableCell,\n TableRow,\n TextRun,\n HeadingLevel\n} from \"docx\";\nimport type { OutputLanguage } from \"../../core/config/schema\";\nimport type {\n DatabaseDoc,\n TableDoc\n} from \"../../core/model/database-doc\";\nimport { getOutputLabels } from \"../shared/output-labels\";\n\nexport type WordExportOptions = {\n outDir: string;\n language?: OutputLanguage;\n};\n\nexport async function exportWordDocument(\n doc: DatabaseDoc,\n options: WordExportOptions\n): Promise<void> {\n try {\n await mkdir(options.outDir, { recursive: true });\n const labels = getOutputLabels(options.language);\n\n const children: (Paragraph | Table)[] = [];\n\n // Title\n children.push(\n new Paragraph({\n heading: HeadingLevel.HEADING_1,\n children: [new TextRun(labels.docTitle)]\n })\n );\n\n // Overview\n children.push(\n new Paragraph({\n heading: HeadingLevel.HEADING_2,\n children: [new TextRun(labels.overviewHeading)]\n })\n );\n\n children.push(\n new Paragraph({\n children: [new TextRun(`${labels.dialectLabel}: ${doc.dialect}`)]\n })\n );\n\n children.push(\n new Paragraph({\n children: [new TextRun(`${labels.tablesLabel}: ${doc.tables.length}`)]\n })\n );\n\n children.push(\n new Paragraph({\n children: [new TextRun(`${labels.relationshipsLabel}: ${doc.relationships.length}`)]\n })\n );\n\n // Table List section\n children.push(\n new Paragraph({\n heading: HeadingLevel.HEADING_2,\n children: [new TextRun(labels.tableListHeading)]\n })\n );\n\n if (doc.tables.length > 0) {\n const tableListRows = [\n new TableRow({\n children: [\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun({ text: labels.tableLabel, bold: true })]\n })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun({ text: labels.descriptionLabel, bold: true })]\n })\n ]\n })\n ]\n })\n ];\n\n for (const table of doc.tables) {\n tableListRows.push(\n new TableRow({\n children: [\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(table.name)] })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({\n children: [\n new TextRun(\n table.description?.value ?? table.comment ?? \"\"\n )\n ]\n })\n ]\n })\n ]\n })\n );\n }\n\n children.push(new Table({ rows: tableListRows }));\n }\n\n // Table Details\n for (const table of doc.tables) {\n children.push(...renderTableDetail(table, doc, labels));\n }\n\n // Relationships section\n children.push(\n new Paragraph({\n heading: HeadingLevel.HEADING_2,\n children: [new TextRun(labels.relationshipsHeading)]\n })\n );\n\n if (doc.relationships.length > 0) {\n const relHeaderCells = [\n labels.fromTable,\n labels.fromColumn,\n labels.toTable,\n labels.toColumn,\n labels.constraint,\n labels.source,\n labels.needsReview\n ].map(\n (h) =>\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun({ text: h, bold: true })]\n })\n ]\n })\n );\n\n const relRows = [new TableRow({ children: relHeaderCells })];\n\n for (const rel of doc.relationships) {\n relRows.push(\n new TableRow({\n children: [\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(rel.fromTable)] })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(rel.fromColumn)] })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(rel.toTable)] })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(rel.toColumn)] })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun(rel.constraintName ?? \"\")]\n })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(rel.source)] })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun(rel.needsReview ? labels.yes : labels.no)]\n })\n ]\n })\n ]\n })\n );\n }\n\n children.push(new Table({ rows: relRows }));\n } else {\n children.push(\n new Paragraph({\n children: [new TextRun(labels.none)]\n })\n );\n }\n\n // Warnings section\n children.push(\n new Paragraph({\n heading: HeadingLevel.HEADING_2,\n children: [new TextRun(labels.warningsHeading)]\n })\n );\n\n if (doc.warnings.length > 0) {\n const warnHeaderCells = [\n labels.severity,\n labels.code,\n labels.target,\n labels.message\n ].map(\n (h) =>\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun({ text: h, bold: true })]\n })\n ]\n })\n );\n\n const warnRows = [new TableRow({ children: warnHeaderCells })];\n\n for (const warning of doc.warnings) {\n warnRows.push(\n new TableRow({\n children: [\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(warning.severity)] })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(warning.code)] })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun(warning.target ?? \"\")]\n })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(warning.message)] })\n ]\n })\n ]\n })\n );\n }\n\n children.push(new Table({ rows: warnRows }));\n } else {\n children.push(\n new Paragraph({\n children: [new TextRun(labels.none)]\n })\n );\n }\n\n const wordDoc = new Document({\n sections: [{ children }]\n });\n\n const buffer = await Packer.toBuffer(wordDoc);\n await writeFile(join(options.outDir, \"database_document.docx\"), buffer);\n } catch (err) {\n throw new Error(\n `Failed to export Word document: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err }\n );\n }\n}\n\nfunction renderTableDetail(\n table: TableDoc,\n doc: DatabaseDoc,\n labels: ReturnType<typeof getOutputLabels>\n): (Paragraph | Table)[] {\n const items: (Paragraph | Table)[] = [];\n const indexes = collectTableIndexes(table, doc);\n\n items.push(\n new Paragraph({\n heading: HeadingLevel.HEADING_2,\n children: [new TextRun(table.name)]\n })\n );\n\n items.push(\n new Paragraph({\n heading: HeadingLevel.HEADING_3,\n children: [new TextRun(labels.tableInfoHeading)]\n })\n );\n items.push(\n renderMetaTable([\n [labels.tablePhysicalName, table.name],\n [labels.tableLogicalName, table.comment ?? \"\"],\n [labels.schema, table.schema ?? \"\"],\n [labels.primaryKey, table.primaryKeys.join(\", \") || labels.none],\n [\n labels.foreignKeys,\n table.foreignKeys.length > 0\n ? table.foreignKeys\n .map((fk) => {\n const name = fk.name ? ` (${fk.name})` : \"\";\n return `${fk.columns.join(\", \")} -> ${fk.referencedTable}.${fk.referencedColumns.join(\", \")}${name}`;\n })\n .join(\"; \")\n : labels.none\n ],\n [\n labels.indexes,\n indexes.length > 0\n ? indexes\n .map(\n (idx) =>\n `${idx.name} (${idx.columns.join(\", \")})${idx.unique ? \" UNIQUE\" : \"\"}`\n )\n .join(\"; \")\n : labels.none\n ]\n ])\n );\n\n items.push(\n new Paragraph({\n heading: HeadingLevel.HEADING_3,\n children: [new TextRun(labels.columnsHeading)]\n })\n );\n items.push(renderColumnsTable(table, labels));\n\n // Page break between tables\n items.push(\n new Paragraph({\n children: [new TextRun(\"\")]\n })\n );\n\n return items;\n}\n\nfunction renderColumnsTable(\n table: TableDoc,\n labels: ReturnType<typeof getOutputLabels>\n): Table {\n const headerCells = [\n labels.physicalName,\n labels.logicalName,\n labels.type,\n labels.required,\n labels.defaultValue,\n labels.notes\n ].map(\n (h) =>\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun({ text: h, bold: true })] })\n ]\n })\n );\n\n const colRows = [new TableRow({ children: headerCells })];\n\n for (const col of table.columns) {\n colRows.push(\n new TableRow({\n children: [\n new TableCell({\n children: [new Paragraph({ children: [new TextRun(col.name)] })]\n }),\n new TableCell({\n children: [\n new Paragraph({ children: [new TextRun(col.comment ?? \"\")] })\n ]\n }),\n new TableCell({\n children: [new Paragraph({ children: [new TextRun(col.type)] })]\n }),\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun(col.nullable ? labels.no : labels.yes)]\n })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun(col.defaultValue ?? \"-\")]\n })\n ]\n }),\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun(col.description?.value ?? \"\")]\n })\n ]\n }),\n ]\n })\n );\n }\n\n return new Table({ rows: colRows });\n}\n\nfunction renderLabelValueParagraph(label: string, value: string): Paragraph {\n return new Paragraph({\n children: [new TextRun(`${label}: ${value}`)]\n });\n}\n\nfunction renderMetaTable(rows: Array<[string, string]>): Table {\n return new Table({\n rows: rows.map(\n ([label, value]) =>\n new TableRow({\n children: [\n new TableCell({\n children: [\n new Paragraph({\n children: [new TextRun({ text: label, bold: true })]\n })\n ]\n }),\n new TableCell({\n children: [new Paragraph({ children: [new TextRun(value)] })]\n })\n ]\n })\n )\n });\n}\n\nfunction collectTableIndexes(table: TableDoc, doc: DatabaseDoc) {\n return [\n ...table.indexes,\n ...doc.indexes.filter(\n (idx) =>\n idx.table === table.name &&\n !table.indexes.some((tableIdx) => tableIdx.name === idx.name)\n )\n ];\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { OutputFormat, OutputLanguage } from \"../config/schema\";\nimport type { DatabaseDialect, DatabaseDoc } from \"../model/database-doc\";\nimport { exportMermaidDiagram } from \"../../exporters/diagram/mermaid-exporter\";\nimport { exportExcelDictionary } from \"../../exporters/excel/excel-exporter\";\nimport { exportMarkdownDocs } from \"../../exporters/markdown/markdown-exporter\";\nimport { exportHtmlDocs } from \"../../exporters/html/html-exporter\";\nimport { exportWordDocument } from \"../../exporters/word/word-exporter\";\nimport { parseSqlSchema } from \"../../parsers/sql/sql-parser\";\n\nexport type GenerateDbDocsOptions = {\n schema: string;\n outDir: string;\n dialect?: DatabaseDialect;\n output: {\n formats: OutputFormat[];\n language?: OutputLanguage;\n };\n onProgress?: (event: {\n step: string;\n message: string;\n detail?: Record<string, unknown>;\n }) => void;\n};\n\nexport async function generateDbDocs(\n options: GenerateDbDocsOptions\n): Promise<DatabaseDoc> {\n const progress = (\n step: string,\n message: string,\n detail?: Record<string, unknown>\n ) => {\n options.onProgress?.({ step, message, detail });\n };\n\n progress(\"read_schema\", \"Reading schema file\", { schema: options.schema });\n const sql = await readFile(options.schema, \"utf8\");\n progress(\"parse_schema\", \"Parsing schema\", { dialect: options.dialect ?? \"auto-detect\" });\n let doc = await parseSqlSchema(sql, {\n dialect: options.dialect\n });\n progress(\"schema_parsed\", \"Schema parsed\", {\n tables: doc.tables.length,\n warnings: doc.warnings.length,\n dialect: doc.dialect\n });\n\n const exporters: Array<{\n format: OutputFormat;\n fn: () => Promise<void>;\n }> = [];\n\n if (options.output.formats.includes(\"excel\")) {\n exporters.push({\n format: \"excel\",\n fn: () =>\n exportExcelDictionary(doc, {\n outDir: options.outDir,\n language: options.output.language\n })\n });\n }\n\n if (options.output.formats.includes(\"diagram\")) {\n exporters.push({\n format: \"diagram\",\n fn: () => exportMermaidDiagram(doc, { outDir: options.outDir })\n });\n }\n\n if (options.output.formats.includes(\"markdown\")) {\n exporters.push({\n format: \"markdown\",\n fn: () =>\n exportMarkdownDocs(doc, {\n outDir: options.outDir,\n language: options.output.language\n })\n });\n }\n\n if (options.output.formats.includes(\"html\")) {\n exporters.push({\n format: \"html\",\n fn: () =>\n exportHtmlDocs(doc, {\n outDir: options.outDir,\n language: options.output.language\n })\n });\n }\n\n if (options.output.formats.includes(\"word\")) {\n exporters.push({\n format: \"word\",\n fn: () =>\n exportWordDocument(doc, {\n outDir: options.outDir,\n language: options.output.language\n })\n });\n }\n\n for (const { format, fn } of exporters) {\n try {\n progress(`export_${format}`, `Exporting ${format} output`, {\n outDir: options.outDir\n });\n await fn();\n progress(`export_${format}_done`, `Exported ${format} output`, {\n outDir: options.outDir\n });\n } catch (err) {\n console.error(\n `[dbdocgen] Failed to export ${format} docs:`,\n err instanceof Error ? err.message : String(err)\n );\n progress(`export_${format}_failed`, `Failed to export ${format}`, {\n error: err instanceof Error ? err.message : String(err)\n });\n }\n }\n\n progress(\"complete\", \"Generation complete\", {\n tables: doc.tables.length,\n warnings: doc.warnings.length,\n outDir: options.outDir\n });\n return doc;\n}\n","export const version = \"0.1.0\";\n\nexport type {\n ColumnDoc,\n Confidence,\n DatabaseDialect,\n DatabaseDoc,\n EnrichedText,\n ForeignKeyDoc,\n IndexDoc,\n RelationshipDoc,\n ReviewTodo,\n TableDoc,\n WarningDoc\n} from \"./core/model/database-doc\";\n\nexport { databaseDocSchema } from \"./core/model/validation\";\n\nexport { loadConfig } from \"./core/config/loader\";\nexport type { DbdocgenConfig, OutputFormat } from \"./core/config/schema\";\n\nexport { parseSqlSchema } from \"./parsers/sql/sql-parser\";\n\nexport { exportExcelDictionary } from \"./exporters/excel/excel-exporter\";\nexport {\n exportMermaidDiagram,\n renderMermaid\n} from \"./exporters/diagram/mermaid-exporter\";\nexport { exportMarkdownDocs } from \"./exporters/markdown/markdown-exporter\";\nexport { exportHtmlDocs } from \"./exporters/html/html-exporter\";\nexport { exportWordDocument } from \"./exporters/word/word-exporter\";\n\nexport { generateDbDocs } from \"./core/pipeline/generate-db-docs\";\nexport type { GenerateDbDocsOptions } from \"./core/pipeline/generate-db-docs\";\n"],"mappings":"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","names":["z","mkdir","join","mkdir","writeFile","join","join","mkdir","writeFile","collectTableIndexes","mkdir","writeFile","join","join","mkdir","writeFile","collectTableIndexes","mkdir","writeFile","join","mkdir","writeFile","join","collectTableIndexes","collectTableIndexes"]}
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@cuongph.dev/dbdocgen",
3
+ "version": "0.1.0",
4
+ "description": "Generate database documentation from SQL schema files — Excel, Markdown, HTML, Mermaid ER diagram, and Word (A5:SQL-style layout)",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/cuongph-dev-work/sql_documentation_tool.git"
8
+ },
9
+ "bugs": {
10
+ "url": "https://github.com/cuongph-dev-work/sql_documentation_tool/issues"
11
+ },
12
+ "homepage": "https://github.com/cuongph-dev-work/sql_documentation_tool#readme",
13
+ "author": "cuongph-dev-work",
14
+ "license": "MIT",
15
+ "type": "module",
16
+ "engines": {
17
+ "node": ">=20"
18
+ },
19
+ "keywords": [
20
+ "database",
21
+ "documentation",
22
+ "sql",
23
+ "schema",
24
+ "ddl",
25
+ "excel",
26
+ "markdown",
27
+ "mermaid",
28
+ "erd",
29
+ "data-dictionary",
30
+ "mysql",
31
+ "postgresql",
32
+ "cli"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "bin": {
38
+ "dbdocgen": "dist/cli/index.js"
39
+ },
40
+ "exports": {
41
+ ".": {
42
+ "types": "./dist/index.d.ts",
43
+ "import": "./dist/index.js",
44
+ "require": "./dist/index.cjs"
45
+ }
46
+ },
47
+ "files": [
48
+ "dist",
49
+ "README.md",
50
+ "LICENSE"
51
+ ],
52
+ "dependencies": {
53
+ "commander": "^15.0.0",
54
+ "cosmiconfig": "^9.0.2",
55
+ "docx": "^9.7.1",
56
+ "exceljs": "^4.4.0",
57
+ "node-sql-parser": "^5.4.0",
58
+ "zod": "^4.4.3"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^26.0.1",
62
+ "@typescript-eslint/eslint-plugin": "^8.62.0",
63
+ "@typescript-eslint/parser": "^8.62.0",
64
+ "eslint": "^10.5.0",
65
+ "prettier": "^3.8.5",
66
+ "tsup": "^8.5.1",
67
+ "tsx": "^4.22.4",
68
+ "typescript": "^6.0.3",
69
+ "vitest": "^4.1.9"
70
+ },
71
+ "scripts": {
72
+ "build": "tsup",
73
+ "dev": "tsx src/cli/index.ts",
74
+ "test": "vitest run",
75
+ "test:watch": "vitest",
76
+ "lint": "eslint .",
77
+ "format": "prettier --write .",
78
+ "typecheck": "tsc --noEmit"
79
+ }
80
+ }