drizzle-docs-generator 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md CHANGED
@@ -65,12 +65,20 @@ drizzle-docs generate ./src/db/schema.ts -d postgresql -f markdown --no-er-diagr
65
65
  | `-o, --output <path>` | 出力ファイルまたはディレクトリパス |
66
66
  | `-d, --dialect <dialect>` | DB 種別: `postgresql` (デフォルト), `mysql`, `sqlite` |
67
67
  | `-f, --format <format>` | 出力形式: `dbml` (デフォルト), `markdown` |
68
- | `-r, --relational` | relations() 定義からリファレンスを生成 |
69
68
  | `-w, --watch` | ファイル変更時に自動再生成 |
70
69
  | `--single-file` | Markdown を単一ファイルで出力 (markdown のみ) |
71
70
  | `--no-er-diagram` | ER 図を Markdown 出力から除外 |
72
71
  | `--force` | 確認なしで既存ファイルを上書き |
73
72
 
73
+ ### リレーション検出
74
+
75
+ リレーションはスキーマから**自動検出**されます:
76
+
77
+ - **v1 API** (`defineRelations()`): スキーマオブジェクトから実行時に検出
78
+ - **v0 API** (`relations()`): ソースファイルを解析して検出
79
+
80
+ 設定不要 - リレーション定義があれば使用し、なければ外部キー制約にフォールバックします。
81
+
74
82
  ## 例
75
83
 
76
84
  ```typescript
@@ -119,8 +127,7 @@ import * as schema from "./schema";
119
127
 
120
128
  const dbml = pgGenerate({
121
129
  schema,
122
- source: "./schema.ts",
123
- relational: false,
130
+ source: "./schema.ts", // JSDoc コメントと v0 relations() 検出用
124
131
  out: "./output.dbml", // optional
125
132
  });
126
133
  ```
package/README.md CHANGED
@@ -65,12 +65,20 @@ drizzle-docs generate ./src/db/schema.ts -d postgresql -f markdown --no-er-diagr
65
65
  | `-o, --output <path>` | Output file or directory path |
66
66
  | `-d, --dialect <dialect>` | Database: `postgresql` (default), `mysql`, `sqlite` |
67
67
  | `-f, --format <format>` | Output format: `dbml` (default), `markdown` |
68
- | `-r, --relational` | Generate refs from relations() definitions |
69
68
  | `-w, --watch` | Regenerate on file changes |
70
69
  | `--single-file` | Output Markdown as a single file (markdown only) |
71
70
  | `--no-er-diagram` | Exclude ER diagram from Markdown output |
72
71
  | `--force` | Overwrite existing files without confirmation |
73
72
 
73
+ ### Relation Detection
74
+
75
+ Relations are **automatically detected** from your schema:
76
+
77
+ - **v1 API** (`defineRelations()`): Detected from schema objects at runtime
78
+ - **v0 API** (`relations()`): Detected by parsing source files
79
+
80
+ No configuration needed - the tool will use relation definitions when present, or fall back to foreign key constraints.
81
+
74
82
  ## Example
75
83
 
76
84
  ```typescript
@@ -119,8 +127,7 @@ import * as schema from "./schema";
119
127
 
120
128
  const dbml = pgGenerate({
121
129
  schema,
122
- source: "./schema.ts",
123
- relational: false,
130
+ source: "./schema.ts", // for JSDoc comments and v0 relations() detection
124
131
  out: "./output.dbml", // optional
125
132
  });
126
133
  ```
package/dist/cli/index.js CHANGED
@@ -1,27 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command as D } from "commander";
3
- import { readFileSync as q, existsSync as l, mkdirSync as g, writeFileSync as f, watch as v, lstatSync as S, readdirSync as G } from "node:fs";
3
+ import { readFileSync as q, existsSync as l, mkdirSync as g, writeFileSync as u, watch as v, lstatSync as S, readdirSync as G } from "node:fs";
4
4
  import { join as m, dirname as p, resolve as y } from "node:path";
5
5
  import { pathToFileURL as $ } from "node:url";
6
6
  import { PgGenerator as O, pgGenerate as j } from "../generator/pg.js";
7
7
  import { MySqlGenerator as z, mysqlGenerate as P } from "../generator/mysql.js";
8
- import { SqliteGenerator as T, sqliteGenerate as U } from "../generator/sqlite.js";
9
- import "drizzle-orm";
10
- import "drizzle-orm/pg-core";
11
- import "drizzle-orm/mysql-core";
12
- import "drizzle-orm/sqlite-core";
13
- import "typescript";
8
+ import { SqliteGenerator as T, sqliteGenerate as R } from "../generator/sqlite.js";
14
9
  import { MarkdownFormatter as F } from "../formatter/markdown.js";
15
10
  import { MermaidErDiagramFormatter as k } from "../formatter/mermaid.js";
16
- import { register as R } from "tsx/esm/api";
17
- const W = R(), h = new D(), C = m(import.meta.dirname, "../../package.json"), w = JSON.parse(q(C, "utf-8"));
11
+ import { register as U } from "tsx/esm/api";
12
+ const W = U(), h = new D(), C = m(import.meta.dirname, "../../package.json"), w = JSON.parse(q(C, "utf-8"));
18
13
  h.name("drizzle-docs").description(w.description).version(w.version);
19
14
  function E(r) {
20
15
  switch (r) {
21
16
  case "mysql":
22
17
  return P;
23
18
  case "sqlite":
24
- return U;
19
+ return R;
25
20
  default:
26
21
  return j;
27
22
  }
@@ -53,7 +48,6 @@ async function L(r, e) {
53
48
  if (e.format === "markdown") {
54
49
  const a = x(e.dialect), s = new a({
55
50
  schema: n,
56
- relational: e.relational,
57
51
  source: r
58
52
  }).toIntermediateSchema();
59
53
  if (!e.singleFile && e.output) {
@@ -64,7 +58,6 @@ async function L(r, e) {
64
58
  } else
65
59
  return E(e.dialect)({
66
60
  schema: n,
67
- relational: e.relational,
68
61
  source: r
69
62
  });
70
63
  }
@@ -92,7 +85,6 @@ function N(r) {
92
85
  function B(r, e, o) {
93
86
  return E(o.dialect)({
94
87
  schema: r,
95
- relational: o.relational,
96
88
  source: e[0]
97
89
  }) || "";
98
90
  }
@@ -129,10 +121,10 @@ ${s}
129
121
  \`\`\`
130
122
  `;
131
123
  }
132
- f(m(e, "README.md"), a, "utf-8");
133
- for (const i of r.tables) {
134
- const s = t.generateTableDoc(i, r), c = `${i.name}.md`;
135
- f(m(e, c), `# ${i.name}
124
+ u(m(e, "README.md"), a, "utf-8");
125
+ for (const c of r.tables) {
126
+ const s = t.generateTableDoc(c, r), i = `${c.name}.md`;
127
+ u(m(e, i), `# ${c.name}
136
128
 
137
129
  ${s}
138
130
  `, "utf-8");
@@ -140,7 +132,7 @@ ${s}
140
132
  }
141
133
  function J(r, e) {
142
134
  const o = p(e);
143
- g(o, { recursive: !0 }), f(e, r.endsWith(`
135
+ g(o, { recursive: !0 }), u(e, r.endsWith(`
144
136
  `) ? r : r + `
145
137
  `, "utf-8");
146
138
  }
@@ -149,9 +141,9 @@ async function A(r, e) {
149
141
  try {
150
142
  const t = {};
151
143
  for (const n of o) {
152
- const a = $(n).href, i = e.watch ? `?t=${Date.now()}` : "";
144
+ const a = $(n).href, c = e.watch ? `?t=${Date.now()}` : "";
153
145
  try {
154
- const s = await import(a + i);
146
+ const s = await import(a + c);
155
147
  Object.assign(t, s);
156
148
  } catch (s) {
157
149
  throw s instanceof Error && (console.error(`Error importing ${n}: ${s.message}`), console.error(`
@@ -159,30 +151,29 @@ Possible causes:`), console.error("- Syntax error in the schema file"), console.
159
151
  }
160
152
  }
161
153
  if (e.format === "markdown") {
162
- const n = x(e.dialect), i = new n({
154
+ const n = x(e.dialect), c = new n({
163
155
  schema: t,
164
- relational: e.relational,
165
156
  source: o[0]
166
157
  }).toIntermediateSchema();
167
158
  if (e.singleFile) {
168
- const s = d(i, e);
159
+ const s = d(c, e);
169
160
  e.output ? (!e.force && l(e.output) && (console.error(
170
161
  `Error: Output file already exists: ${e.output}
171
162
  Use --force to overwrite existing files.`
172
163
  ), process.exit(1)), J(s, e.output), console.log(`Markdown generated: ${e.output}`)) : console.log(s);
173
164
  } else if (e.output) {
174
165
  if (!e.force) {
175
- const s = i.tables.map((u) => u.name), c = I(e.output, s);
176
- c.length > 0 && (console.error(
166
+ const s = c.tables.map((f) => f.name), i = I(e.output, s);
167
+ i.length > 0 && (console.error(
177
168
  `Error: The following files already exist:
178
- ${c.map((u) => ` - ${u}`).join(`
169
+ ${i.map((f) => ` - ${f}`).join(`
179
170
  `)}
180
171
  Use --force to overwrite existing files.`
181
172
  ), process.exit(1));
182
173
  }
183
- M(i, e.output, e), console.log(`Markdown generated: ${e.output}/`);
174
+ M(c, e.output, e), console.log(`Markdown generated: ${e.output}/`);
184
175
  } else {
185
- const s = d(i, e);
176
+ const s = d(c, e);
186
177
  console.log(s);
187
178
  }
188
179
  } else {
@@ -193,7 +184,7 @@ Use --force to overwrite existing files.`
193
184
  Use --force to overwrite existing files.`
194
185
  ), process.exit(1));
195
186
  const a = p(e.output);
196
- g(a, { recursive: !0 }), f(e.output, n.endsWith(`
187
+ g(a, { recursive: !0 }), u(e.output, n.endsWith(`
197
188
  `) ? n : n + `
198
189
  `, "utf-8"), console.log(`DBML generated: ${e.output}`);
199
190
  } else
@@ -212,12 +203,12 @@ function V(r, e) {
212
203
  console.log(`
213
204
  File changed, regenerating...`);
214
205
  try {
215
- const a = await L(o, e), i = e.format === "markdown" ? "Markdown" : "DBML", s = e.format === "markdown" && !e.singleFile && e.output;
206
+ const a = await L(o, e), c = e.format === "markdown" ? "Markdown" : "DBML", s = e.format === "markdown" && !e.singleFile && e.output;
216
207
  if (!e.output && a)
217
208
  console.log(a);
218
209
  else if (e.output) {
219
- const c = s ? `${e.output}/` : e.output;
220
- console.log(`${i} regenerated: ${c}`);
210
+ const i = s ? `${e.output}/` : e.output;
211
+ console.log(`${c} regenerated: ${i}`);
221
212
  }
222
213
  } catch (a) {
223
214
  a instanceof Error ? console.error(`Error: ${a.message}`) : console.error("Error:", a);
@@ -225,7 +216,7 @@ File changed, regenerating...`);
225
216
  }, 100));
226
217
  });
227
218
  }
228
- h.command("generate").description("Generate documentation from Drizzle schema files").argument("<schema>", "Path to Drizzle schema file or directory").option("-o, --output <path>", "Output file or directory path").option("-d, --dialect <dialect>", "Database dialect (postgresql, mysql, sqlite)", "postgresql").option("-f, --format <format>", "Output format (dbml, markdown)", "dbml").option("-r, --relational", "Use relations() definitions instead of foreign keys").option("-w, --watch", "Watch for file changes and regenerate").option("--single-file", "Output Markdown as a single file (for markdown format)").option("--no-er-diagram", "Exclude ER diagram from Markdown output").option("--force", "Overwrite existing files without confirmation").action(async (r, e) => {
219
+ h.command("generate").description("Generate documentation from Drizzle schema files").argument("<schema>", "Path to Drizzle schema file or directory").option("-o, --output <path>", "Output file or directory path").option("-d, --dialect <dialect>", "Database dialect (postgresql, mysql, sqlite)", "postgresql").option("-f, --format <format>", "Output format (dbml, markdown)", "dbml").option("-w, --watch", "Watch for file changes and regenerate").option("--single-file", "Output Markdown as a single file (for markdown format)").option("--no-er-diagram", "Exclude ER diagram from Markdown output").option("--force", "Overwrite existing files without confirmation").action(async (r, e) => {
229
220
  const o = ["postgresql", "mysql", "sqlite"];
230
221
  o.includes(e.dialect) || (console.error(
231
222
  `Error: Invalid dialect "${e.dialect}". Valid options: ${o.join(", ")}`
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CLI for drizzle-docs-generator\n *\n * Generates DBML files from Drizzle ORM schema definitions.\n */\n\nimport { Command } from \"commander\";\nimport {\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n watch,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { pgGenerate, mysqlGenerate, sqliteGenerate } from \"../generator/index\";\nimport { PgGenerator, MySqlGenerator, SqliteGenerator } from \"../generator/index\";\nimport { MarkdownFormatter } from \"../formatter/markdown\";\nimport { MermaidErDiagramFormatter } from \"../formatter/mermaid\";\nimport { register } from \"tsx/esm/api\";\nimport type { IntermediateSchema } from \"../types\";\n\n// Register tsx loader to support TypeScript and extensionless imports\nconst unregister = register();\n\nconst program = new Command();\n\n// Use import.meta.dirname (Node 20.11+) to resolve package.json\n// This works correctly even after bundling\nconst packageJsonPath = join(import.meta.dirname, \"../../package.json\");\nconst packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n version: string;\n description: string;\n};\n\nprogram.name(\"drizzle-docs\").description(packageJson.description).version(packageJson.version);\n\ntype Dialect = \"postgresql\" | \"mysql\" | \"sqlite\";\ntype OutputFormat = \"dbml\" | \"markdown\";\n\ninterface GenerateCommandOptions {\n output?: string;\n dialect: Dialect;\n relational?: boolean;\n watch?: boolean;\n format: OutputFormat;\n singleFile?: boolean;\n erDiagram: boolean; // commander uses --no-er-diagram which sets erDiagram to false\n force?: boolean; // skip overwrite confirmation for existing files\n}\n\n/**\n * Get the generate function based on dialect\n */\nfunction getGenerateFunction(dialect: Dialect) {\n switch (dialect) {\n case \"mysql\":\n return mysqlGenerate;\n case \"sqlite\":\n return sqliteGenerate;\n case \"postgresql\":\n default:\n return pgGenerate;\n }\n}\n\n/**\n * Get the generator class based on dialect\n */\nfunction getGeneratorClass(dialect: Dialect) {\n switch (dialect) {\n case \"mysql\":\n return MySqlGenerator;\n case \"sqlite\":\n return SqliteGenerator;\n case \"postgresql\":\n default:\n return PgGenerator;\n }\n}\n\n/**\n * Check if output directory has existing files\n */\nfunction hasExistingFiles(outputDir: string, tableNames: string[]): string[] {\n const existingFiles: string[] = [];\n\n if (!existsSync(outputDir)) {\n return existingFiles;\n }\n\n const readmePath = join(outputDir, \"README.md\");\n if (existsSync(readmePath)) {\n existingFiles.push(readmePath);\n }\n\n for (const tableName of tableNames) {\n const tablePath = join(outputDir, `${tableName}.md`);\n if (existsSync(tablePath)) {\n existingFiles.push(tablePath);\n }\n }\n\n return existingFiles;\n}\n\n/**\n * Generate output from a schema file (for watch mode)\n * Returns the generated output string for single-file formats,\n * or writes multiple files directly for multi-file markdown\n */\nasync function generateFromSchema(\n schemaPath: string,\n options: GenerateCommandOptions,\n): Promise<string | undefined> {\n // Use file URL for dynamic import (required for ESM)\n const schemaUrl = pathToFileURL(schemaPath).href;\n\n // Dynamic import with cache busting for watch mode\n const cacheBuster = options.watch ? `?t=${Date.now()}` : \"\";\n const schemaModule = (await import(schemaUrl + cacheBuster)) as Record<string, unknown>;\n\n if (options.format === \"markdown\") {\n const GeneratorClass = getGeneratorClass(options.dialect);\n const generator = new GeneratorClass({\n schema: schemaModule,\n relational: options.relational,\n source: schemaPath,\n });\n const intermediateSchema = generator.toIntermediateSchema();\n\n // Handle multi-file output in watch mode\n if (!options.singleFile && options.output) {\n writeMarkdownMultipleFiles(intermediateSchema, options.output, options);\n return undefined;\n }\n\n return generateMarkdownOutput(intermediateSchema, options);\n } else {\n const generate = getGenerateFunction(options.dialect);\n return generate({\n schema: schemaModule,\n relational: options.relational,\n source: schemaPath,\n });\n }\n}\n\n/**\n * Find all TypeScript schema files in a directory\n */\nfunction findSchemaFiles(dirPath: string): string[] {\n const files: string[] = [];\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Recursively search subdirectories\n files.push(...findSchemaFiles(fullPath));\n } else if (entry.isFile() && /\\.(ts|js|mts|mjs|cts|cjs)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error reading directory ${dirPath}: ${error.message}`);\n }\n }\n\n return files;\n}\n\n/**\n * Resolve schema path (file or directory)\n */\nfunction resolveSchemaPath(schema: string): string[] {\n const schemaPath = resolve(process.cwd(), schema);\n\n // Check if path exists\n if (!existsSync(schemaPath)) {\n console.error(`Error: Schema path not found: ${schemaPath}`);\n process.exit(1);\n }\n\n // Check if it's a directory\n const stats = lstatSync(schemaPath);\n if (stats.isDirectory()) {\n const schemaFiles = findSchemaFiles(schemaPath);\n if (schemaFiles.length === 0) {\n console.error(`Error: No schema files found in directory: ${schemaPath}`);\n process.exit(1);\n }\n return schemaFiles;\n }\n\n // Single file\n return [schemaPath];\n}\n\n/**\n * Generate DBML format output\n */\nfunction generateDbmlOutput(\n mergedSchema: Record<string, unknown>,\n schemaPaths: string[],\n options: GenerateCommandOptions,\n): string {\n const generate = getGenerateFunction(options.dialect);\n return (\n generate({\n schema: mergedSchema,\n relational: options.relational,\n source: schemaPaths[0],\n }) || \"\"\n );\n}\n\n/**\n * Generate Markdown format output\n */\nfunction generateMarkdownOutput(\n intermediateSchema: IntermediateSchema,\n options: GenerateCommandOptions,\n): string {\n const markdownFormatter = new MarkdownFormatter();\n const markdown = markdownFormatter.format(intermediateSchema);\n\n // Include ER diagram unless --no-er-diagram is specified\n if (options.erDiagram) {\n const mermaidFormatter = new MermaidErDiagramFormatter();\n const erDiagram = mermaidFormatter.format(intermediateSchema);\n\n return `${markdown}\\n\\n---\\n\\n## ER Diagram\\n\\n\\`\\`\\`mermaid\\n${erDiagram}\\n\\`\\`\\``;\n }\n\n return markdown;\n}\n\n/**\n * Write Markdown to multiple files (one per table)\n */\nfunction writeMarkdownMultipleFiles(\n intermediateSchema: IntermediateSchema,\n outputDir: string,\n options: GenerateCommandOptions,\n): void {\n // Ensure output directory exists\n mkdirSync(outputDir, { recursive: true });\n\n const markdownFormatter = new MarkdownFormatter({ linkFormat: \"file\" });\n\n // Write README.md with index\n const index = markdownFormatter.generateIndex(intermediateSchema);\n let readme = `${index}\\n`;\n\n // Add ER diagram to README unless disabled\n if (options.erDiagram) {\n const mermaidFormatter = new MermaidErDiagramFormatter();\n const erDiagram = mermaidFormatter.format(intermediateSchema);\n readme += `\\n---\\n\\n## ER Diagram\\n\\n\\`\\`\\`mermaid\\n${erDiagram}\\n\\`\\`\\`\\n`;\n }\n\n writeFileSync(join(outputDir, \"README.md\"), readme, \"utf-8\");\n\n // Write individual table files\n for (const table of intermediateSchema.tables) {\n const tableDoc = markdownFormatter.generateTableDoc(table, intermediateSchema);\n const fileName = `${table.name}.md`;\n writeFileSync(join(outputDir, fileName), `# ${table.name}\\n\\n${tableDoc}\\n`, \"utf-8\");\n }\n}\n\n/**\n * Write single Markdown file\n */\nfunction writeSingleMarkdownFile(content: string, outputPath: string): void {\n const dir = dirname(outputPath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(outputPath, content.endsWith(\"\\n\") ? content : content + \"\\n\", \"utf-8\");\n}\n\n/**\n * Run the generate command\n */\nasync function runGenerate(schema: string, options: GenerateCommandOptions): Promise<void> {\n const schemaPaths = resolveSchemaPath(schema);\n\n try {\n // Merge all schema modules\n const mergedSchema: Record<string, unknown> = {};\n\n for (const schemaPath of schemaPaths) {\n const schemaUrl = pathToFileURL(schemaPath).href;\n const cacheBuster = options.watch ? `?t=${Date.now()}` : \"\";\n\n try {\n const schemaModule = (await import(schemaUrl + cacheBuster)) as Record<string, unknown>;\n Object.assign(mergedSchema, schemaModule);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error importing ${schemaPath}: ${error.message}`);\n console.error(\"\\nPossible causes:\");\n console.error(\"- Syntax error in the schema file\");\n console.error(\"- Missing dependencies (make sure drizzle-orm is installed)\");\n console.error(\"- Circular dependencies between schema files\");\n }\n throw error;\n }\n }\n\n if (options.format === \"markdown\") {\n // Generate Markdown format\n const GeneratorClass = getGeneratorClass(options.dialect);\n const generator = new GeneratorClass({\n schema: mergedSchema,\n relational: options.relational,\n source: schemaPaths[0],\n });\n const intermediateSchema = generator.toIntermediateSchema();\n\n if (options.singleFile) {\n // Single file Markdown output\n const content = generateMarkdownOutput(intermediateSchema, options);\n\n if (options.output) {\n // Check for existing file if --force is not specified\n if (!options.force && existsSync(options.output)) {\n console.error(\n `Error: Output file already exists: ${options.output}\\nUse --force to overwrite existing files.`,\n );\n process.exit(1);\n }\n writeSingleMarkdownFile(content, options.output);\n console.log(`Markdown generated: ${options.output}`);\n } else {\n console.log(content);\n }\n } else {\n // Multiple files Markdown output\n if (!options.output) {\n // If no output specified, default to stdout with single file format\n const content = generateMarkdownOutput(intermediateSchema, options);\n console.log(content);\n } else {\n // Check for existing files if --force is not specified\n if (!options.force) {\n const tableNames = intermediateSchema.tables.map((t) => t.name);\n const existingFiles = hasExistingFiles(options.output, tableNames);\n if (existingFiles.length > 0) {\n console.error(\n `Error: The following files already exist:\\n${existingFiles.map((f) => ` - ${f}`).join(\"\\n\")}\\nUse --force to overwrite existing files.`,\n );\n process.exit(1);\n }\n }\n writeMarkdownMultipleFiles(intermediateSchema, options.output, options);\n console.log(`Markdown generated: ${options.output}/`);\n }\n }\n } else {\n // Generate DBML format (default)\n const dbml = generateDbmlOutput(mergedSchema, schemaPaths, options);\n\n if (options.output) {\n // Check for existing file if --force is not specified\n if (!options.force && existsSync(options.output)) {\n console.error(\n `Error: Output file already exists: ${options.output}\\nUse --force to overwrite existing files.`,\n );\n process.exit(1);\n }\n const dir = dirname(options.output);\n mkdirSync(dir, { recursive: true });\n writeFileSync(options.output, dbml.endsWith(\"\\n\") ? dbml : dbml + \"\\n\", \"utf-8\");\n console.log(`DBML generated: ${options.output}`);\n } else {\n console.log(dbml);\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error generating output: ${error.message}`);\n } else {\n console.error(\"Error generating output:\", error);\n }\n process.exit(1);\n }\n}\n\n/**\n * Watch mode: regenerate on file changes\n */\nfunction watchSchema(schema: string, options: GenerateCommandOptions): void {\n const schemaPath = resolve(process.cwd(), schema);\n\n console.log(`Watching for changes: ${schemaPath}`);\n\n let debounceTimer: NodeJS.Timeout | null = null;\n\n watch(schemaPath, async (eventType) => {\n if (eventType === \"change\") {\n // Debounce to avoid multiple triggers\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n console.log(\"\\nFile changed, regenerating...\");\n try {\n const output = await generateFromSchema(schemaPath, options);\n const formatLabel = options.format === \"markdown\" ? \"Markdown\" : \"DBML\";\n const isMultiFile =\n options.format === \"markdown\" && !options.singleFile && options.output;\n\n if (!options.output && output) {\n console.log(output);\n } else if (options.output) {\n const outputLabel = isMultiFile ? `${options.output}/` : options.output;\n console.log(`${formatLabel} regenerated: ${outputLabel}`);\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n } else {\n console.error(\"Error:\", error);\n }\n }\n }, 100);\n }\n });\n}\n\nprogram\n .command(\"generate\")\n .description(\"Generate documentation from Drizzle schema files\")\n .argument(\"<schema>\", \"Path to Drizzle schema file or directory\")\n .option(\"-o, --output <path>\", \"Output file or directory path\")\n .option(\"-d, --dialect <dialect>\", \"Database dialect (postgresql, mysql, sqlite)\", \"postgresql\")\n .option(\"-f, --format <format>\", \"Output format (dbml, markdown)\", \"dbml\")\n .option(\"-r, --relational\", \"Use relations() definitions instead of foreign keys\")\n .option(\"-w, --watch\", \"Watch for file changes and regenerate\")\n .option(\"--single-file\", \"Output Markdown as a single file (for markdown format)\")\n .option(\"--no-er-diagram\", \"Exclude ER diagram from Markdown output\")\n .option(\"--force\", \"Overwrite existing files without confirmation\")\n .action(async (schema: string, options: GenerateCommandOptions) => {\n // Validate dialect\n const validDialects: Dialect[] = [\"postgresql\", \"mysql\", \"sqlite\"];\n if (!validDialects.includes(options.dialect)) {\n console.error(\n `Error: Invalid dialect \"${options.dialect}\". Valid options: ${validDialects.join(\", \")}`,\n );\n process.exit(1);\n }\n\n // Validate format\n const validFormats: OutputFormat[] = [\"dbml\", \"markdown\"];\n if (!validFormats.includes(options.format)) {\n console.error(\n `Error: Invalid format \"${options.format}\". Valid options: ${validFormats.join(\", \")}`,\n );\n process.exit(1);\n }\n\n // Warn if --single-file or --no-er-diagram used with non-markdown format\n if (options.format !== \"markdown\") {\n if (options.singleFile) {\n console.warn(\"Warning: --single-file is only applicable with --format markdown\");\n }\n if (!options.erDiagram) {\n console.warn(\"Warning: --no-er-diagram is only applicable with --format markdown\");\n }\n }\n\n // Initial generation\n await runGenerate(schema, options);\n\n // Start watch mode if requested\n if (options.watch) {\n watchSchema(schema, options);\n }\n });\n\nprogram.parse();\n\n// Cleanup: Unregister tsx loader when process exits\nprocess.on(\"exit\", () => {\n unregister();\n});\n"],"names":["unregister","register","program","Command","packageJsonPath","join","packageJson","readFileSync","getGenerateFunction","dialect","mysqlGenerate","sqliteGenerate","pgGenerate","getGeneratorClass","MySqlGenerator","SqliteGenerator","PgGenerator","hasExistingFiles","outputDir","tableNames","existingFiles","existsSync","readmePath","tableName","tablePath","generateFromSchema","schemaPath","options","schemaUrl","pathToFileURL","cacheBuster","schemaModule","GeneratorClass","intermediateSchema","writeMarkdownMultipleFiles","generateMarkdownOutput","findSchemaFiles","dirPath","files","entries","readdirSync","entry","fullPath","error","resolveSchemaPath","schema","resolve","lstatSync","schemaFiles","generateDbmlOutput","mergedSchema","schemaPaths","markdown","MarkdownFormatter","erDiagram","MermaidErDiagramFormatter","mkdirSync","markdownFormatter","readme","writeFileSync","table","tableDoc","fileName","writeSingleMarkdownFile","content","outputPath","dir","dirname","runGenerate","t","f","dbml","watchSchema","debounceTimer","watch","eventType","output","formatLabel","isMultiFile","outputLabel","validDialects","validFormats"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CLI for drizzle-docs-generator\n *\n * Generates DBML files from Drizzle ORM schema definitions.\n */\n\nimport { Command } from \"commander\";\nimport {\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n watch,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { pgGenerate } from \"../generator/pg\";\nimport { mysqlGenerate } from \"../generator/mysql\";\nimport { sqliteGenerate } from \"../generator/sqlite\";\nimport { PgGenerator } from \"../generator/pg\";\nimport { MySqlGenerator } from \"../generator/mysql\";\nimport { SqliteGenerator } from \"../generator/sqlite\";\nimport { MarkdownFormatter } from \"../formatter/markdown\";\nimport { MermaidErDiagramFormatter } from \"../formatter/mermaid\";\nimport { register } from \"tsx/esm/api\";\nimport type { IntermediateSchema } from \"../types\";\n\n// Register tsx loader to support TypeScript and extensionless imports\nconst unregister = register();\n\nconst program = new Command();\n\n// Use import.meta.dirname (Node 20.11+) to resolve package.json\n// This works correctly even after bundling\nconst packageJsonPath = join(import.meta.dirname, \"../../package.json\");\nconst packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n version: string;\n description: string;\n};\n\nprogram.name(\"drizzle-docs\").description(packageJson.description).version(packageJson.version);\n\ntype Dialect = \"postgresql\" | \"mysql\" | \"sqlite\";\ntype OutputFormat = \"dbml\" | \"markdown\";\n\ninterface GenerateCommandOptions {\n output?: string;\n dialect: Dialect;\n watch?: boolean;\n format: OutputFormat;\n singleFile?: boolean;\n erDiagram: boolean; // commander uses --no-er-diagram which sets erDiagram to false\n force?: boolean; // skip overwrite confirmation for existing files\n}\n\n/**\n * Get the generate function based on dialect\n */\nfunction getGenerateFunction(dialect: Dialect) {\n switch (dialect) {\n case \"mysql\":\n return mysqlGenerate;\n case \"sqlite\":\n return sqliteGenerate;\n case \"postgresql\":\n default:\n return pgGenerate;\n }\n}\n\n/**\n * Get the generator class based on dialect\n */\nfunction getGeneratorClass(dialect: Dialect) {\n switch (dialect) {\n case \"mysql\":\n return MySqlGenerator;\n case \"sqlite\":\n return SqliteGenerator;\n case \"postgresql\":\n default:\n return PgGenerator;\n }\n}\n\n/**\n * Check if output directory has existing files\n */\nfunction hasExistingFiles(outputDir: string, tableNames: string[]): string[] {\n const existingFiles: string[] = [];\n\n if (!existsSync(outputDir)) {\n return existingFiles;\n }\n\n const readmePath = join(outputDir, \"README.md\");\n if (existsSync(readmePath)) {\n existingFiles.push(readmePath);\n }\n\n for (const tableName of tableNames) {\n const tablePath = join(outputDir, `${tableName}.md`);\n if (existsSync(tablePath)) {\n existingFiles.push(tablePath);\n }\n }\n\n return existingFiles;\n}\n\n/**\n * Generate output from a schema file (for watch mode)\n * Returns the generated output string for single-file formats,\n * or writes multiple files directly for multi-file markdown\n */\nasync function generateFromSchema(\n schemaPath: string,\n options: GenerateCommandOptions,\n): Promise<string | undefined> {\n // Use file URL for dynamic import (required for ESM)\n const schemaUrl = pathToFileURL(schemaPath).href;\n\n // Dynamic import with cache busting for watch mode\n const cacheBuster = options.watch ? `?t=${Date.now()}` : \"\";\n const schemaModule = (await import(schemaUrl + cacheBuster)) as Record<string, unknown>;\n\n if (options.format === \"markdown\") {\n const GeneratorClass = getGeneratorClass(options.dialect);\n const generator = new GeneratorClass({\n schema: schemaModule,\n source: schemaPath,\n });\n const intermediateSchema = generator.toIntermediateSchema();\n\n // Handle multi-file output in watch mode\n if (!options.singleFile && options.output) {\n writeMarkdownMultipleFiles(intermediateSchema, options.output, options);\n return undefined;\n }\n\n return generateMarkdownOutput(intermediateSchema, options);\n } else {\n const generate = getGenerateFunction(options.dialect);\n return generate({\n schema: schemaModule,\n source: schemaPath,\n });\n }\n}\n\n/**\n * Find all TypeScript schema files in a directory\n */\nfunction findSchemaFiles(dirPath: string): string[] {\n const files: string[] = [];\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Recursively search subdirectories\n files.push(...findSchemaFiles(fullPath));\n } else if (entry.isFile() && /\\.(ts|js|mts|mjs|cts|cjs)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error reading directory ${dirPath}: ${error.message}`);\n }\n }\n\n return files;\n}\n\n/**\n * Resolve schema path (file or directory)\n */\nfunction resolveSchemaPath(schema: string): string[] {\n const schemaPath = resolve(process.cwd(), schema);\n\n // Check if path exists\n if (!existsSync(schemaPath)) {\n console.error(`Error: Schema path not found: ${schemaPath}`);\n process.exit(1);\n }\n\n // Check if it's a directory\n const stats = lstatSync(schemaPath);\n if (stats.isDirectory()) {\n const schemaFiles = findSchemaFiles(schemaPath);\n if (schemaFiles.length === 0) {\n console.error(`Error: No schema files found in directory: ${schemaPath}`);\n process.exit(1);\n }\n return schemaFiles;\n }\n\n // Single file\n return [schemaPath];\n}\n\n/**\n * Generate DBML format output\n */\nfunction generateDbmlOutput(\n mergedSchema: Record<string, unknown>,\n schemaPaths: string[],\n options: GenerateCommandOptions,\n): string {\n const generate = getGenerateFunction(options.dialect);\n return (\n generate({\n schema: mergedSchema,\n source: schemaPaths[0],\n }) || \"\"\n );\n}\n\n/**\n * Generate Markdown format output\n */\nfunction generateMarkdownOutput(\n intermediateSchema: IntermediateSchema,\n options: GenerateCommandOptions,\n): string {\n const markdownFormatter = new MarkdownFormatter();\n const markdown = markdownFormatter.format(intermediateSchema);\n\n // Include ER diagram unless --no-er-diagram is specified\n if (options.erDiagram) {\n const mermaidFormatter = new MermaidErDiagramFormatter();\n const erDiagram = mermaidFormatter.format(intermediateSchema);\n\n return `${markdown}\\n\\n---\\n\\n## ER Diagram\\n\\n\\`\\`\\`mermaid\\n${erDiagram}\\n\\`\\`\\``;\n }\n\n return markdown;\n}\n\n/**\n * Write Markdown to multiple files (one per table)\n */\nfunction writeMarkdownMultipleFiles(\n intermediateSchema: IntermediateSchema,\n outputDir: string,\n options: GenerateCommandOptions,\n): void {\n // Ensure output directory exists\n mkdirSync(outputDir, { recursive: true });\n\n const markdownFormatter = new MarkdownFormatter({ linkFormat: \"file\" });\n\n // Write README.md with index\n const index = markdownFormatter.generateIndex(intermediateSchema);\n let readme = `${index}\\n`;\n\n // Add ER diagram to README unless disabled\n if (options.erDiagram) {\n const mermaidFormatter = new MermaidErDiagramFormatter();\n const erDiagram = mermaidFormatter.format(intermediateSchema);\n readme += `\\n---\\n\\n## ER Diagram\\n\\n\\`\\`\\`mermaid\\n${erDiagram}\\n\\`\\`\\`\\n`;\n }\n\n writeFileSync(join(outputDir, \"README.md\"), readme, \"utf-8\");\n\n // Write individual table files\n for (const table of intermediateSchema.tables) {\n const tableDoc = markdownFormatter.generateTableDoc(table, intermediateSchema);\n const fileName = `${table.name}.md`;\n writeFileSync(join(outputDir, fileName), `# ${table.name}\\n\\n${tableDoc}\\n`, \"utf-8\");\n }\n}\n\n/**\n * Write single Markdown file\n */\nfunction writeSingleMarkdownFile(content: string, outputPath: string): void {\n const dir = dirname(outputPath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(outputPath, content.endsWith(\"\\n\") ? content : content + \"\\n\", \"utf-8\");\n}\n\n/**\n * Run the generate command\n */\nasync function runGenerate(schema: string, options: GenerateCommandOptions): Promise<void> {\n const schemaPaths = resolveSchemaPath(schema);\n\n try {\n // Merge all schema modules\n const mergedSchema: Record<string, unknown> = {};\n\n for (const schemaPath of schemaPaths) {\n const schemaUrl = pathToFileURL(schemaPath).href;\n const cacheBuster = options.watch ? `?t=${Date.now()}` : \"\";\n\n try {\n const schemaModule = (await import(schemaUrl + cacheBuster)) as Record<string, unknown>;\n Object.assign(mergedSchema, schemaModule);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error importing ${schemaPath}: ${error.message}`);\n console.error(\"\\nPossible causes:\");\n console.error(\"- Syntax error in the schema file\");\n console.error(\"- Missing dependencies (make sure drizzle-orm is installed)\");\n console.error(\"- Circular dependencies between schema files\");\n }\n throw error;\n }\n }\n\n if (options.format === \"markdown\") {\n // Generate Markdown format\n const GeneratorClass = getGeneratorClass(options.dialect);\n const generator = new GeneratorClass({\n schema: mergedSchema,\n source: schemaPaths[0],\n });\n const intermediateSchema = generator.toIntermediateSchema();\n\n if (options.singleFile) {\n // Single file Markdown output\n const content = generateMarkdownOutput(intermediateSchema, options);\n\n if (options.output) {\n // Check for existing file if --force is not specified\n if (!options.force && existsSync(options.output)) {\n console.error(\n `Error: Output file already exists: ${options.output}\\nUse --force to overwrite existing files.`,\n );\n process.exit(1);\n }\n writeSingleMarkdownFile(content, options.output);\n console.log(`Markdown generated: ${options.output}`);\n } else {\n console.log(content);\n }\n } else {\n // Multiple files Markdown output\n if (!options.output) {\n // If no output specified, default to stdout with single file format\n const content = generateMarkdownOutput(intermediateSchema, options);\n console.log(content);\n } else {\n // Check for existing files if --force is not specified\n if (!options.force) {\n const tableNames = intermediateSchema.tables.map((t) => t.name);\n const existingFiles = hasExistingFiles(options.output, tableNames);\n if (existingFiles.length > 0) {\n console.error(\n `Error: The following files already exist:\\n${existingFiles.map((f) => ` - ${f}`).join(\"\\n\")}\\nUse --force to overwrite existing files.`,\n );\n process.exit(1);\n }\n }\n writeMarkdownMultipleFiles(intermediateSchema, options.output, options);\n console.log(`Markdown generated: ${options.output}/`);\n }\n }\n } else {\n // Generate DBML format (default)\n const dbml = generateDbmlOutput(mergedSchema, schemaPaths, options);\n\n if (options.output) {\n // Check for existing file if --force is not specified\n if (!options.force && existsSync(options.output)) {\n console.error(\n `Error: Output file already exists: ${options.output}\\nUse --force to overwrite existing files.`,\n );\n process.exit(1);\n }\n const dir = dirname(options.output);\n mkdirSync(dir, { recursive: true });\n writeFileSync(options.output, dbml.endsWith(\"\\n\") ? dbml : dbml + \"\\n\", \"utf-8\");\n console.log(`DBML generated: ${options.output}`);\n } else {\n console.log(dbml);\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error generating output: ${error.message}`);\n } else {\n console.error(\"Error generating output:\", error);\n }\n process.exit(1);\n }\n}\n\n/**\n * Watch mode: regenerate on file changes\n */\nfunction watchSchema(schema: string, options: GenerateCommandOptions): void {\n const schemaPath = resolve(process.cwd(), schema);\n\n console.log(`Watching for changes: ${schemaPath}`);\n\n let debounceTimer: NodeJS.Timeout | null = null;\n\n watch(schemaPath, async (eventType) => {\n if (eventType === \"change\") {\n // Debounce to avoid multiple triggers\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n console.log(\"\\nFile changed, regenerating...\");\n try {\n const output = await generateFromSchema(schemaPath, options);\n const formatLabel = options.format === \"markdown\" ? \"Markdown\" : \"DBML\";\n const isMultiFile =\n options.format === \"markdown\" && !options.singleFile && options.output;\n\n if (!options.output && output) {\n console.log(output);\n } else if (options.output) {\n const outputLabel = isMultiFile ? `${options.output}/` : options.output;\n console.log(`${formatLabel} regenerated: ${outputLabel}`);\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n } else {\n console.error(\"Error:\", error);\n }\n }\n }, 100);\n }\n });\n}\n\nprogram\n .command(\"generate\")\n .description(\"Generate documentation from Drizzle schema files\")\n .argument(\"<schema>\", \"Path to Drizzle schema file or directory\")\n .option(\"-o, --output <path>\", \"Output file or directory path\")\n .option(\"-d, --dialect <dialect>\", \"Database dialect (postgresql, mysql, sqlite)\", \"postgresql\")\n .option(\"-f, --format <format>\", \"Output format (dbml, markdown)\", \"dbml\")\n .option(\"-w, --watch\", \"Watch for file changes and regenerate\")\n .option(\"--single-file\", \"Output Markdown as a single file (for markdown format)\")\n .option(\"--no-er-diagram\", \"Exclude ER diagram from Markdown output\")\n .option(\"--force\", \"Overwrite existing files without confirmation\")\n .action(async (schema: string, options: GenerateCommandOptions) => {\n // Validate dialect\n const validDialects: Dialect[] = [\"postgresql\", \"mysql\", \"sqlite\"];\n if (!validDialects.includes(options.dialect)) {\n console.error(\n `Error: Invalid dialect \"${options.dialect}\". Valid options: ${validDialects.join(\", \")}`,\n );\n process.exit(1);\n }\n\n // Validate format\n const validFormats: OutputFormat[] = [\"dbml\", \"markdown\"];\n if (!validFormats.includes(options.format)) {\n console.error(\n `Error: Invalid format \"${options.format}\". Valid options: ${validFormats.join(\", \")}`,\n );\n process.exit(1);\n }\n\n // Warn if --single-file or --no-er-diagram used with non-markdown format\n if (options.format !== \"markdown\") {\n if (options.singleFile) {\n console.warn(\"Warning: --single-file is only applicable with --format markdown\");\n }\n if (!options.erDiagram) {\n console.warn(\"Warning: --no-er-diagram is only applicable with --format markdown\");\n }\n }\n\n // Initial generation\n await runGenerate(schema, options);\n\n // Start watch mode if requested\n if (options.watch) {\n watchSchema(schema, options);\n }\n });\n\nprogram.parse();\n\n// Cleanup: Unregister tsx loader when process exits\nprocess.on(\"exit\", () => {\n unregister();\n});\n"],"names":["unregister","register","program","Command","packageJsonPath","join","packageJson","readFileSync","getGenerateFunction","dialect","mysqlGenerate","sqliteGenerate","pgGenerate","getGeneratorClass","MySqlGenerator","SqliteGenerator","PgGenerator","hasExistingFiles","outputDir","tableNames","existingFiles","existsSync","readmePath","tableName","tablePath","generateFromSchema","schemaPath","options","schemaUrl","pathToFileURL","cacheBuster","schemaModule","GeneratorClass","intermediateSchema","writeMarkdownMultipleFiles","generateMarkdownOutput","findSchemaFiles","dirPath","files","entries","readdirSync","entry","fullPath","error","resolveSchemaPath","schema","resolve","lstatSync","schemaFiles","generateDbmlOutput","mergedSchema","schemaPaths","markdown","MarkdownFormatter","erDiagram","MermaidErDiagramFormatter","mkdirSync","markdownFormatter","readme","writeFileSync","table","tableDoc","fileName","writeSingleMarkdownFile","content","outputPath","dir","dirname","runGenerate","t","dbml","watchSchema","debounceTimer","watch","eventType","output","formatLabel","isMultiFile","outputLabel","validDialects","validFormats"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { OutputFormatter, FormatterOptions } from './types';
3
3
  /**
4
4
  * Link format for table references
5
5
  */
6
- export type LinkFormat = "anchor" | "file";
6
+ type LinkFormat = "anchor" | "file";
7
7
  /**
8
8
  * Options for MarkdownFormatter
9
9
  */
@@ -122,4 +122,5 @@ export declare class MarkdownFormatter implements OutputFormatter {
122
122
  */
123
123
  private escapeMarkdown;
124
124
  }
125
+ export {};
125
126
  //# sourceMappingURL=markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatter/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EAMhB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAaD;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,OAAO,CAAqC;IAEpD;;;;OAIG;gBACS,OAAO,GAAE,wBAA6B;IAIlD;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IAyB1C;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IA4BjD;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM;IAsC5E;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6C5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoBhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiC9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAelC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,OAAO;IAOf;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,cAAc;CAGvB"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatter/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EAMhB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE;;GAEG;AACH,KAAK,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAaD;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,OAAO,CAAqC;IAEpD;;;;OAIG;gBACS,OAAO,GAAE,wBAA6B;IAIlD;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IAyB1C;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IA4BjD;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM;IAsC5E;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6C5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoBhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiC9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAelC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,OAAO;IAOf;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,cAAc;CAGvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sources":["../../src/formatter/markdown.ts"],"sourcesContent":["import type {\n IntermediateSchema,\n TableDefinition,\n ColumnDefinition,\n IndexDefinition,\n ConstraintDefinition,\n RelationDefinition,\n EnumDefinition,\n} from \"../types\";\nimport type { OutputFormatter, FormatterOptions } from \"./types\";\n\n/**\n * Link format for table references\n */\nexport type LinkFormat = \"anchor\" | \"file\";\n\n/**\n * Options for MarkdownFormatter\n */\nexport interface MarkdownFormatterOptions extends FormatterOptions {\n /**\n * Whether to use relative links for table references\n * @default true\n */\n useRelativeLinks?: boolean;\n /**\n * Link format: \"anchor\" for #table-name, \"file\" for ./table-name.md\n * @default \"anchor\"\n */\n linkFormat?: LinkFormat;\n}\n\n/**\n * Default formatter options\n */\nconst DEFAULT_OPTIONS: Required<MarkdownFormatterOptions> = {\n includeComments: true,\n includeIndexes: true,\n includeConstraints: true,\n useRelativeLinks: true,\n linkFormat: \"anchor\",\n};\n\n/**\n * MarkdownFormatter converts IntermediateSchema to tbls-style Markdown format\n *\n * This formatter generates human-readable Markdown documentation from\n * the database-agnostic IntermediateSchema representation.\n *\n * Output includes:\n * - Table index (README.md style)\n * - Individual table documentation with columns, constraints, indexes, and relations\n */\nexport class MarkdownFormatter implements OutputFormatter {\n private options: Required<MarkdownFormatterOptions>;\n\n /**\n * Create a new MarkdownFormatter\n *\n * @param options - Formatter options\n */\n constructor(options: MarkdownFormatterOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Format the intermediate schema into a single Markdown document\n *\n * This generates a complete document containing the index and all table docs.\n *\n * @param schema - The intermediate schema to format\n * @returns Markdown string\n */\n format(schema: IntermediateSchema): string {\n const lines: string[] = [];\n\n // Generate index section\n lines.push(this.generateIndex(schema));\n\n // Generate enum documentation if any\n if (schema.enums.length > 0) {\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(this.generateEnumsSection(schema.enums));\n }\n\n // Generate table documentation\n for (const table of schema.tables) {\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(this.generateTableDoc(table, schema));\n }\n\n return lines.join(\"\\n\").trim();\n }\n\n /**\n * Generate the index section (README.md style)\n *\n * @param schema - The intermediate schema\n * @returns Markdown string for the index\n */\n generateIndex(schema: IntermediateSchema): string {\n const lines: string[] = [];\n\n lines.push(\"# Tables\");\n lines.push(\"\");\n\n if (schema.tables.length === 0) {\n lines.push(\"No tables defined.\");\n return lines.join(\"\\n\");\n }\n\n // Table header\n lines.push(\"| Name | Columns | Comment |\");\n lines.push(\"|------|---------|---------|\");\n\n // Table rows\n for (const table of schema.tables) {\n const name = this.options.useRelativeLinks ? this.createTableLink(table.name) : table.name;\n const columnCount = table.columns.length;\n const comment =\n this.options.includeComments && table.comment ? this.escapeMarkdown(table.comment) : \"\";\n\n lines.push(`| ${name} | ${columnCount} | ${comment} |`);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate documentation for a single table\n *\n * @param table - The table definition\n * @param schema - The full schema (for relation lookups)\n * @returns Markdown string for the table documentation\n */\n generateTableDoc(table: TableDefinition, schema: IntermediateSchema): string {\n const lines: string[] = [];\n\n // Table heading with anchor\n lines.push(`## ${table.name}`);\n lines.push(\"\");\n\n // Table comment\n if (this.options.includeComments && table.comment) {\n lines.push(this.escapeMarkdown(table.comment));\n lines.push(\"\");\n }\n\n // Columns section\n lines.push(this.generateColumnsTable(table.columns, table.name, schema));\n\n // Constraints section\n if (this.options.includeConstraints && table.constraints.length > 0) {\n lines.push(\"\");\n lines.push(this.generateConstraintsTable(table.constraints));\n }\n\n // Indexes section\n if (this.options.includeIndexes && table.indexes.length > 0) {\n lines.push(\"\");\n lines.push(this.generateIndexesTable(table.indexes));\n }\n\n // Relations section\n const tableRelations = this.getTableRelations(table.name, schema.relations);\n if (tableRelations.length > 0) {\n lines.push(\"\");\n lines.push(this.generateRelationsTable(tableRelations, table.name));\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate the columns table for a table\n */\n private generateColumnsTable(\n columns: ColumnDefinition[],\n tableName: string,\n schema: IntermediateSchema,\n ): string {\n const lines: string[] = [];\n\n lines.push(\"### Columns\");\n lines.push(\"\");\n\n if (columns.length === 0) {\n lines.push(\"No columns defined.\");\n return lines.join(\"\\n\");\n }\n\n // Build column info with relations\n const columnInfo = columns.map((col) => {\n const children = this.getChildRelations(tableName, col.name, schema.relations);\n const parents = this.getParentRelations(tableName, col.name, schema.relations);\n return { column: col, children, parents };\n });\n\n // Table header\n lines.push(\"| Name | Type | Default | Nullable | Children | Parents | Comment |\");\n lines.push(\"|------|------|---------|----------|----------|---------|---------|\");\n\n // Table rows\n for (const { column, children, parents } of columnInfo) {\n const name = column.primaryKey ? `**${column.name}**` : column.name;\n const type = this.escapeMarkdown(column.type);\n const defaultVal = column.defaultValue !== undefined ? `\\`${column.defaultValue}\\`` : \"-\";\n const nullable = column.nullable ? \"YES\" : \"NO\";\n const childrenStr = children.length > 0 ? this.formatRelationLinks(children) : \"-\";\n const parentsStr = parents.length > 0 ? this.formatRelationLinks(parents) : \"-\";\n const comment =\n this.options.includeComments && column.comment ? this.escapeMarkdown(column.comment) : \"-\";\n\n lines.push(\n `| ${name} | ${type} | ${defaultVal} | ${nullable} | ${childrenStr} | ${parentsStr} | ${comment} |`,\n );\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate the constraints table\n */\n private generateConstraintsTable(constraints: ConstraintDefinition[]): string {\n const lines: string[] = [];\n\n lines.push(\"### Constraints\");\n lines.push(\"\");\n\n lines.push(\"| Name | Type | Definition |\");\n lines.push(\"|------|------|------------|\");\n\n for (const constraint of constraints) {\n const name = constraint.name || \"-\";\n const type = this.formatConstraintType(constraint.type);\n const definition = this.formatConstraintDefinition(constraint);\n\n lines.push(`| ${name} | ${type} | ${definition} |`);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate the indexes table\n */\n private generateIndexesTable(indexes: IndexDefinition[]): string {\n const lines: string[] = [];\n\n lines.push(\"### Indexes\");\n lines.push(\"\");\n\n lines.push(\"| Name | Columns | Unique | Type |\");\n lines.push(\"|------|---------|--------|------|\");\n\n for (const index of indexes) {\n const name = index.name || \"-\";\n const columns = index.columns.join(\", \");\n const unique = index.unique ? \"YES\" : \"NO\";\n const type = index.type || \"-\";\n\n lines.push(`| ${name} | ${columns} | ${unique} | ${type} |`);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate the relations table for a specific table\n */\n private generateRelationsTable(relations: RelationDefinition[], tableName: string): string {\n const lines: string[] = [];\n\n lines.push(\"### Relations\");\n lines.push(\"\");\n\n lines.push(\"| Parent | Child | Type |\");\n lines.push(\"|--------|-------|------|\");\n\n for (const relation of relations) {\n const isParent = relation.toTable === tableName;\n const parent = `${relation.toTable}.${relation.toColumns.join(\", \")}`;\n const child = `${relation.fromTable}.${relation.fromColumns.join(\", \")}`;\n const type = this.formatRelationType(relation.type);\n\n // Add links if enabled\n const parentLink = this.options.useRelativeLinks\n ? this.createTableLink(relation.toTable, parent)\n : parent;\n const childLink = this.options.useRelativeLinks\n ? this.createTableLink(relation.fromTable, child)\n : child;\n\n // Highlight the current table\n const parentDisplay = isParent ? `**${parentLink}**` : parentLink;\n const childDisplay = !isParent ? `**${childLink}**` : childLink;\n\n lines.push(`| ${parentDisplay} | ${childDisplay} | ${type} |`);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate documentation for enums\n */\n private generateEnumsSection(enums: EnumDefinition[]): string {\n const lines: string[] = [];\n\n lines.push(\"# Enums\");\n lines.push(\"\");\n\n for (const enumDef of enums) {\n lines.push(`## ${enumDef.name}`);\n lines.push(\"\");\n lines.push(\"| Value |\");\n lines.push(\"|-------|\");\n for (const value of enumDef.values) {\n lines.push(`| ${value} |`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trim();\n }\n\n /**\n * Get all relations involving a specific table\n */\n private getTableRelations(\n tableName: string,\n relations: RelationDefinition[],\n ): RelationDefinition[] {\n return relations.filter((r) => r.fromTable === tableName || r.toTable === tableName);\n }\n\n /**\n * Get child relations for a specific column (where this column is referenced)\n */\n private getChildRelations(\n tableName: string,\n columnName: string,\n relations: RelationDefinition[],\n ): Array<{ table: string; column: string }> {\n return relations\n .filter((r) => r.toTable === tableName && r.toColumns.includes(columnName))\n .map((r) => ({\n table: r.fromTable,\n column: r.fromColumns.join(\", \"),\n }));\n }\n\n /**\n * Get parent relations for a specific column (columns this column references)\n */\n private getParentRelations(\n tableName: string,\n columnName: string,\n relations: RelationDefinition[],\n ): Array<{ table: string; column: string }> {\n return relations\n .filter((r) => r.fromTable === tableName && r.fromColumns.includes(columnName))\n .map((r) => ({\n table: r.toTable,\n column: r.toColumns.join(\", \"),\n }));\n }\n\n /**\n * Format relation links for display in columns table\n */\n private formatRelationLinks(relations: Array<{ table: string; column: string }>): string {\n return relations\n .map((r) => {\n const text = `${r.table}.${r.column}`;\n return this.options.useRelativeLinks ? this.createTableLink(r.table, text) : text;\n })\n .join(\", \");\n }\n\n /**\n * Format constraint type for display\n */\n private formatConstraintType(type: ConstraintDefinition[\"type\"]): string {\n const typeMap: Record<ConstraintDefinition[\"type\"], string> = {\n primary_key: \"PRIMARY KEY\",\n foreign_key: \"FOREIGN KEY\",\n unique: \"UNIQUE\",\n check: \"CHECK\",\n not_null: \"NOT NULL\",\n };\n return typeMap[type] || type;\n }\n\n /**\n * Format constraint definition for display\n */\n private formatConstraintDefinition(constraint: ConstraintDefinition): string {\n if (constraint.definition) {\n return `\\`${constraint.definition}\\``;\n }\n\n const columns = constraint.columns.join(\", \");\n\n if (constraint.type === \"foreign_key\" && constraint.referencedTable) {\n const refColumns = constraint.referencedColumns?.join(\", \") || \"\";\n return `(${columns}) → ${constraint.referencedTable}(${refColumns})`;\n }\n\n return `(${columns})`;\n }\n\n /**\n * Format relation type for display\n */\n private formatRelationType(type: RelationDefinition[\"type\"]): string {\n const typeMap: Record<RelationDefinition[\"type\"], string> = {\n \"one-to-one\": \"One to One\",\n \"one-to-many\": \"One to Many\",\n \"many-to-one\": \"Many to One\",\n \"many-to-many\": \"Many to Many\",\n };\n return typeMap[type] || type;\n }\n\n /**\n * Create a URL-safe slug from a string\n */\n private slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n }\n\n /**\n * Create a table link based on the configured link format\n */\n private createTableLink(tableName: string, displayText?: string): string {\n const text = displayText || tableName;\n if (this.options.linkFormat === \"file\") {\n return `[${text}](./${tableName}.md)`;\n }\n return `[${text}](#${this.slugify(tableName)})`;\n }\n\n /**\n * Escape special Markdown characters in a string\n */\n private escapeMarkdown(str: string): string {\n return str.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n }\n}\n"],"names":["DEFAULT_OPTIONS","MarkdownFormatter","options","schema","lines","table","name","columnCount","comment","tableRelations","columns","tableName","columnInfo","col","children","parents","column","type","defaultVal","nullable","childrenStr","parentsStr","constraints","constraint","definition","indexes","index","unique","relations","relation","isParent","parent","child","parentLink","childLink","parentDisplay","childDisplay","enums","enumDef","value","r","columnName","text","refColumns","str","displayText"],"mappings":"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"}
1
+ {"version":3,"file":"markdown.js","sources":["../../src/formatter/markdown.ts"],"sourcesContent":["import type {\n IntermediateSchema,\n TableDefinition,\n ColumnDefinition,\n IndexDefinition,\n ConstraintDefinition,\n RelationDefinition,\n EnumDefinition,\n} from \"../types\";\nimport type { OutputFormatter, FormatterOptions } from \"./types\";\n\n/**\n * Link format for table references\n */\ntype LinkFormat = \"anchor\" | \"file\";\n\n/**\n * Options for MarkdownFormatter\n */\nexport interface MarkdownFormatterOptions extends FormatterOptions {\n /**\n * Whether to use relative links for table references\n * @default true\n */\n useRelativeLinks?: boolean;\n /**\n * Link format: \"anchor\" for #table-name, \"file\" for ./table-name.md\n * @default \"anchor\"\n */\n linkFormat?: LinkFormat;\n}\n\n/**\n * Default formatter options\n */\nconst DEFAULT_OPTIONS: Required<MarkdownFormatterOptions> = {\n includeComments: true,\n includeIndexes: true,\n includeConstraints: true,\n useRelativeLinks: true,\n linkFormat: \"anchor\",\n};\n\n/**\n * MarkdownFormatter converts IntermediateSchema to tbls-style Markdown format\n *\n * This formatter generates human-readable Markdown documentation from\n * the database-agnostic IntermediateSchema representation.\n *\n * Output includes:\n * - Table index (README.md style)\n * - Individual table documentation with columns, constraints, indexes, and relations\n */\nexport class MarkdownFormatter implements OutputFormatter {\n private options: Required<MarkdownFormatterOptions>;\n\n /**\n * Create a new MarkdownFormatter\n *\n * @param options - Formatter options\n */\n constructor(options: MarkdownFormatterOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Format the intermediate schema into a single Markdown document\n *\n * This generates a complete document containing the index and all table docs.\n *\n * @param schema - The intermediate schema to format\n * @returns Markdown string\n */\n format(schema: IntermediateSchema): string {\n const lines: string[] = [];\n\n // Generate index section\n lines.push(this.generateIndex(schema));\n\n // Generate enum documentation if any\n if (schema.enums.length > 0) {\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(this.generateEnumsSection(schema.enums));\n }\n\n // Generate table documentation\n for (const table of schema.tables) {\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(this.generateTableDoc(table, schema));\n }\n\n return lines.join(\"\\n\").trim();\n }\n\n /**\n * Generate the index section (README.md style)\n *\n * @param schema - The intermediate schema\n * @returns Markdown string for the index\n */\n generateIndex(schema: IntermediateSchema): string {\n const lines: string[] = [];\n\n lines.push(\"# Tables\");\n lines.push(\"\");\n\n if (schema.tables.length === 0) {\n lines.push(\"No tables defined.\");\n return lines.join(\"\\n\");\n }\n\n // Table header\n lines.push(\"| Name | Columns | Comment |\");\n lines.push(\"|------|---------|---------|\");\n\n // Table rows\n for (const table of schema.tables) {\n const name = this.options.useRelativeLinks ? this.createTableLink(table.name) : table.name;\n const columnCount = table.columns.length;\n const comment =\n this.options.includeComments && table.comment ? this.escapeMarkdown(table.comment) : \"\";\n\n lines.push(`| ${name} | ${columnCount} | ${comment} |`);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate documentation for a single table\n *\n * @param table - The table definition\n * @param schema - The full schema (for relation lookups)\n * @returns Markdown string for the table documentation\n */\n generateTableDoc(table: TableDefinition, schema: IntermediateSchema): string {\n const lines: string[] = [];\n\n // Table heading with anchor\n lines.push(`## ${table.name}`);\n lines.push(\"\");\n\n // Table comment\n if (this.options.includeComments && table.comment) {\n lines.push(this.escapeMarkdown(table.comment));\n lines.push(\"\");\n }\n\n // Columns section\n lines.push(this.generateColumnsTable(table.columns, table.name, schema));\n\n // Constraints section\n if (this.options.includeConstraints && table.constraints.length > 0) {\n lines.push(\"\");\n lines.push(this.generateConstraintsTable(table.constraints));\n }\n\n // Indexes section\n if (this.options.includeIndexes && table.indexes.length > 0) {\n lines.push(\"\");\n lines.push(this.generateIndexesTable(table.indexes));\n }\n\n // Relations section\n const tableRelations = this.getTableRelations(table.name, schema.relations);\n if (tableRelations.length > 0) {\n lines.push(\"\");\n lines.push(this.generateRelationsTable(tableRelations, table.name));\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate the columns table for a table\n */\n private generateColumnsTable(\n columns: ColumnDefinition[],\n tableName: string,\n schema: IntermediateSchema,\n ): string {\n const lines: string[] = [];\n\n lines.push(\"### Columns\");\n lines.push(\"\");\n\n if (columns.length === 0) {\n lines.push(\"No columns defined.\");\n return lines.join(\"\\n\");\n }\n\n // Build column info with relations\n const columnInfo = columns.map((col) => {\n const children = this.getChildRelations(tableName, col.name, schema.relations);\n const parents = this.getParentRelations(tableName, col.name, schema.relations);\n return { column: col, children, parents };\n });\n\n // Table header\n lines.push(\"| Name | Type | Default | Nullable | Children | Parents | Comment |\");\n lines.push(\"|------|------|---------|----------|----------|---------|---------|\");\n\n // Table rows\n for (const { column, children, parents } of columnInfo) {\n const name = column.primaryKey ? `**${column.name}**` : column.name;\n const type = this.escapeMarkdown(column.type);\n const defaultVal = column.defaultValue !== undefined ? `\\`${column.defaultValue}\\`` : \"-\";\n const nullable = column.nullable ? \"YES\" : \"NO\";\n const childrenStr = children.length > 0 ? this.formatRelationLinks(children) : \"-\";\n const parentsStr = parents.length > 0 ? this.formatRelationLinks(parents) : \"-\";\n const comment =\n this.options.includeComments && column.comment ? this.escapeMarkdown(column.comment) : \"-\";\n\n lines.push(\n `| ${name} | ${type} | ${defaultVal} | ${nullable} | ${childrenStr} | ${parentsStr} | ${comment} |`,\n );\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate the constraints table\n */\n private generateConstraintsTable(constraints: ConstraintDefinition[]): string {\n const lines: string[] = [];\n\n lines.push(\"### Constraints\");\n lines.push(\"\");\n\n lines.push(\"| Name | Type | Definition |\");\n lines.push(\"|------|------|------------|\");\n\n for (const constraint of constraints) {\n const name = constraint.name || \"-\";\n const type = this.formatConstraintType(constraint.type);\n const definition = this.formatConstraintDefinition(constraint);\n\n lines.push(`| ${name} | ${type} | ${definition} |`);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate the indexes table\n */\n private generateIndexesTable(indexes: IndexDefinition[]): string {\n const lines: string[] = [];\n\n lines.push(\"### Indexes\");\n lines.push(\"\");\n\n lines.push(\"| Name | Columns | Unique | Type |\");\n lines.push(\"|------|---------|--------|------|\");\n\n for (const index of indexes) {\n const name = index.name || \"-\";\n const columns = index.columns.join(\", \");\n const unique = index.unique ? \"YES\" : \"NO\";\n const type = index.type || \"-\";\n\n lines.push(`| ${name} | ${columns} | ${unique} | ${type} |`);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate the relations table for a specific table\n */\n private generateRelationsTable(relations: RelationDefinition[], tableName: string): string {\n const lines: string[] = [];\n\n lines.push(\"### Relations\");\n lines.push(\"\");\n\n lines.push(\"| Parent | Child | Type |\");\n lines.push(\"|--------|-------|------|\");\n\n for (const relation of relations) {\n const isParent = relation.toTable === tableName;\n const parent = `${relation.toTable}.${relation.toColumns.join(\", \")}`;\n const child = `${relation.fromTable}.${relation.fromColumns.join(\", \")}`;\n const type = this.formatRelationType(relation.type);\n\n // Add links if enabled\n const parentLink = this.options.useRelativeLinks\n ? this.createTableLink(relation.toTable, parent)\n : parent;\n const childLink = this.options.useRelativeLinks\n ? this.createTableLink(relation.fromTable, child)\n : child;\n\n // Highlight the current table\n const parentDisplay = isParent ? `**${parentLink}**` : parentLink;\n const childDisplay = !isParent ? `**${childLink}**` : childLink;\n\n lines.push(`| ${parentDisplay} | ${childDisplay} | ${type} |`);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate documentation for enums\n */\n private generateEnumsSection(enums: EnumDefinition[]): string {\n const lines: string[] = [];\n\n lines.push(\"# Enums\");\n lines.push(\"\");\n\n for (const enumDef of enums) {\n lines.push(`## ${enumDef.name}`);\n lines.push(\"\");\n lines.push(\"| Value |\");\n lines.push(\"|-------|\");\n for (const value of enumDef.values) {\n lines.push(`| ${value} |`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trim();\n }\n\n /**\n * Get all relations involving a specific table\n */\n private getTableRelations(\n tableName: string,\n relations: RelationDefinition[],\n ): RelationDefinition[] {\n return relations.filter((r) => r.fromTable === tableName || r.toTable === tableName);\n }\n\n /**\n * Get child relations for a specific column (where this column is referenced)\n */\n private getChildRelations(\n tableName: string,\n columnName: string,\n relations: RelationDefinition[],\n ): Array<{ table: string; column: string }> {\n return relations\n .filter((r) => r.toTable === tableName && r.toColumns.includes(columnName))\n .map((r) => ({\n table: r.fromTable,\n column: r.fromColumns.join(\", \"),\n }));\n }\n\n /**\n * Get parent relations for a specific column (columns this column references)\n */\n private getParentRelations(\n tableName: string,\n columnName: string,\n relations: RelationDefinition[],\n ): Array<{ table: string; column: string }> {\n return relations\n .filter((r) => r.fromTable === tableName && r.fromColumns.includes(columnName))\n .map((r) => ({\n table: r.toTable,\n column: r.toColumns.join(\", \"),\n }));\n }\n\n /**\n * Format relation links for display in columns table\n */\n private formatRelationLinks(relations: Array<{ table: string; column: string }>): string {\n return relations\n .map((r) => {\n const text = `${r.table}.${r.column}`;\n return this.options.useRelativeLinks ? this.createTableLink(r.table, text) : text;\n })\n .join(\", \");\n }\n\n /**\n * Format constraint type for display\n */\n private formatConstraintType(type: ConstraintDefinition[\"type\"]): string {\n const typeMap: Record<ConstraintDefinition[\"type\"], string> = {\n primary_key: \"PRIMARY KEY\",\n foreign_key: \"FOREIGN KEY\",\n unique: \"UNIQUE\",\n check: \"CHECK\",\n not_null: \"NOT NULL\",\n };\n return typeMap[type] || type;\n }\n\n /**\n * Format constraint definition for display\n */\n private formatConstraintDefinition(constraint: ConstraintDefinition): string {\n if (constraint.definition) {\n return `\\`${constraint.definition}\\``;\n }\n\n const columns = constraint.columns.join(\", \");\n\n if (constraint.type === \"foreign_key\" && constraint.referencedTable) {\n const refColumns = constraint.referencedColumns?.join(\", \") || \"\";\n return `(${columns}) → ${constraint.referencedTable}(${refColumns})`;\n }\n\n return `(${columns})`;\n }\n\n /**\n * Format relation type for display\n */\n private formatRelationType(type: RelationDefinition[\"type\"]): string {\n const typeMap: Record<RelationDefinition[\"type\"], string> = {\n \"one-to-one\": \"One to One\",\n \"one-to-many\": \"One to Many\",\n \"many-to-one\": \"Many to One\",\n \"many-to-many\": \"Many to Many\",\n };\n return typeMap[type] || type;\n }\n\n /**\n * Create a URL-safe slug from a string\n */\n private slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n }\n\n /**\n * Create a table link based on the configured link format\n */\n private createTableLink(tableName: string, displayText?: string): string {\n const text = displayText || tableName;\n if (this.options.linkFormat === \"file\") {\n return `[${text}](./${tableName}.md)`;\n }\n return `[${text}](#${this.slugify(tableName)})`;\n }\n\n /**\n * Escape special Markdown characters in a string\n */\n private escapeMarkdown(str: string): string {\n return str.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n }\n}\n"],"names":["DEFAULT_OPTIONS","MarkdownFormatter","options","schema","lines","table","name","columnCount","comment","tableRelations","columns","tableName","columnInfo","col","children","parents","column","type","defaultVal","nullable","childrenStr","parentsStr","constraints","constraint","definition","indexes","index","unique","relations","relation","isParent","parent","child","parentLink","childLink","parentDisplay","childDisplay","enums","enumDef","value","r","columnName","text","refColumns","str","displayText"],"mappings":"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"}
@@ -13,7 +13,7 @@ export interface DialectConfig {
13
13
  /**
14
14
  * Configuration for an index definition
15
15
  */
16
- export interface IndexConfig {
16
+ interface IndexConfig {
17
17
  config: {
18
18
  columns: Array<{
19
19
  name: string;
@@ -26,7 +26,7 @@ export interface IndexConfig {
26
26
  /**
27
27
  * Configuration for a primary key constraint
28
28
  */
29
- export interface PrimaryKeyConfig {
29
+ interface PrimaryKeyConfig {
30
30
  columns: Array<{
31
31
  name: string;
32
32
  }>;
@@ -35,7 +35,7 @@ export interface PrimaryKeyConfig {
35
35
  /**
36
36
  * Configuration for a unique constraint
37
37
  */
38
- export interface UniqueConstraintConfig {
38
+ interface UniqueConstraintConfig {
39
39
  columns: Array<{
40
40
  name: string;
41
41
  }>;
@@ -72,7 +72,6 @@ export interface TableConfig {
72
72
  */
73
73
  export declare abstract class BaseGenerator<TSchema extends Record<string, unknown> = Record<string, unknown>> {
74
74
  protected schema: TSchema;
75
- protected relational: boolean;
76
75
  protected generatedRefs: GeneratedRef[];
77
76
  protected comments: SchemaComments | undefined;
78
77
  protected parsedRelations: SchemaRelations | undefined;
@@ -80,7 +79,7 @@ export declare abstract class BaseGenerator<TSchema extends Record<string, unkno
80
79
  protected abstract dialectConfig: DialectConfig;
81
80
  /**
82
81
  * Create a new generator instance
83
- * @param options - Configuration options including schema, relational mode, source code, and comments
82
+ * @param options - Configuration options including schema, source code, and comments
84
83
  */
85
84
  constructor(options: GenerateOptions<TSchema>);
86
85
  /**
@@ -191,6 +190,15 @@ export declare abstract class BaseGenerator<TSchema extends Record<string, unkno
191
190
  * @returns GeneratedRef object
192
191
  */
193
192
  protected parseForeignKey(tableName: string, fk: ForeignKeyConfig): GeneratedRef;
193
+ /**
194
+ * Detect if relation definitions are present in the schema
195
+ *
196
+ * Checks for both v1 (defineRelations()) and v0 (relations()) API usage.
197
+ * Returns true if any relation definitions are found.
198
+ *
199
+ * @returns True if relations are defined, false otherwise
200
+ */
201
+ private hasRelationDefinitions;
194
202
  /**
195
203
  * Create the appropriate relation adapter based on schema contents
196
204
  *
@@ -288,4 +296,5 @@ export declare abstract class BaseGenerator<TSchema extends Record<string, unkno
288
296
  * @param content - The DBML content to write
289
297
  */
290
298
  export declare function writeDbmlFile(filePath: string, content: string): void;
299
+ export {};
291
300
  //# sourceMappingURL=common.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/generator/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/generator/common.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,26 @@
1
1
  import { is as r, Relation as h, getTableName as m, getTableColumns as y } from "drizzle-orm";
2
2
  import { PgTable as c, getTableConfig as b } from "drizzle-orm/pg-core";
3
- import { MySqlTable as f, getTableConfig as T } from "drizzle-orm/mysql-core";
4
- import { SQLiteTable as u, getTableConfig as d } from "drizzle-orm/sqlite-core";
3
+ import { MySqlTable as f, getTableConfig as d } from "drizzle-orm/mysql-core";
4
+ import { SQLiteTable as u, getTableConfig as T } from "drizzle-orm/sqlite-core";
5
5
  import { mkdirSync as C, writeFileSync as D } from "node:fs";
6
6
  import { resolve as R, dirname as q } from "node:path";
7
7
  import { DbmlFormatter as j } from "../formatter/dbml.js";
8
8
  import { extractComments as v } from "../parser/comments.js";
9
- import { extractRelations as x } from "../parser/relations.js";
10
- import { V0RelationAdapter as K } from "../adapter/v0-adapter.js";
11
- import { V1RelationAdapter as V } from "../adapter/v1-adapter.js";
9
+ import { extractRelations as V } from "../parser/relations.js";
10
+ import { V0RelationAdapter as x } from "../adapter/v0-adapter.js";
11
+ import { V1RelationAdapter as K } from "../adapter/v1-adapter.js";
12
12
  class N {
13
13
  schema;
14
- relational;
15
14
  generatedRefs = [];
16
15
  comments;
17
16
  parsedRelations;
18
17
  source;
19
18
  /**
20
19
  * Create a new generator instance
21
- * @param options - Configuration options including schema, relational mode, source code, and comments
20
+ * @param options - Configuration options including schema, source code, and comments
22
21
  */
23
22
  constructor(e) {
24
- this.schema = e.schema, this.relational = e.relational ?? !1, this.source = e.source, e.comments ? this.comments = e.comments : this.source && (this.comments = v(this.source)), this.relational && this.source && (this.parsedRelations = x(this.source));
23
+ this.schema = e.schema, this.source = e.source, e.comments ? this.comments = e.comments : this.source && (this.comments = v(this.source)), this.source && (this.parsedRelations = V(this.source));
25
24
  }
26
25
  /**
27
26
  * Generate complete DBML output from the schema
@@ -129,11 +128,11 @@ class N {
129
128
  return this.mapTableConfig(t);
130
129
  }
131
130
  if (r(e, f)) {
132
- const t = T(e);
131
+ const t = d(e);
133
132
  return this.mapTableConfig(t);
134
133
  }
135
134
  if (r(e, u)) {
136
- const t = d(e);
135
+ const t = T(e);
137
136
  return this.mapTableConfig(t);
138
137
  }
139
138
  }
@@ -238,6 +237,17 @@ class N {
238
237
  onUpdate: t.onUpdate
239
238
  };
240
239
  }
240
+ /**
241
+ * Detect if relation definitions are present in the schema
242
+ *
243
+ * Checks for both v1 (defineRelations()) and v0 (relations()) API usage.
244
+ * Returns true if any relation definitions are found.
245
+ *
246
+ * @returns True if relations are defined, false otherwise
247
+ */
248
+ hasRelationDefinitions() {
249
+ return !!(this.getV1RelationEntries().length > 0 || this.parsedRelations && this.parsedRelations.relations.length > 0);
250
+ }
241
251
  /**
242
252
  * Create the appropriate relation adapter based on schema contents
243
253
  *
@@ -248,7 +258,7 @@ class N {
248
258
  */
249
259
  createRelationAdapter() {
250
260
  const e = this.getV1RelationEntries();
251
- return e.length > 0 ? new V(e) : new K(this.schema, this.parsedRelations);
261
+ return e.length > 0 ? new K(e) : new x(this.schema, this.parsedRelations);
252
262
  }
253
263
  /**
254
264
  * Convert a UnifiedRelation to a RelationDefinition
@@ -283,7 +293,7 @@ class N {
283
293
  (i) => this.tableToDefinition(i)
284
294
  );
285
295
  let o = [];
286
- if (this.relational)
296
+ if (this.hasRelationDefinitions())
287
297
  o = this.createRelationAdapter().extract().map((l) => this.unifiedRelationToDefinition(l));
288
298
  else {
289
299
  this.generatedRefs = [];
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sources":["../../src/generator/common.ts"],"sourcesContent":["import {\n type AnyColumn,\n type Table,\n getTableColumns,\n getTableName,\n is,\n Relation,\n} from \"drizzle-orm\";\nimport type { TableRelationalConfig } from \"drizzle-orm/relations\";\nimport { PgTable, getTableConfig as getPgTableConfig } from \"drizzle-orm/pg-core\";\nimport { MySqlTable, getTableConfig as getMySqlTableConfig } from \"drizzle-orm/mysql-core\";\nimport { SQLiteTable, getTableConfig as getSqliteTableConfig } from \"drizzle-orm/sqlite-core\";\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { DbmlFormatter } from \"../formatter/dbml\";\n\nimport type {\n GeneratedRef,\n GenerateOptions,\n IntermediateSchema,\n TableDefinition,\n ColumnDefinition,\n IndexDefinition,\n ConstraintDefinition,\n RelationDefinition,\n EnumDefinition,\n DatabaseType,\n IntermediateRelationType,\n} from \"../types\";\nimport { extractComments, type SchemaComments } from \"../parser/comments\";\nimport { extractRelations, type SchemaRelations } from \"../parser/relations\";\nimport { V0RelationAdapter, V1RelationAdapter, type UnifiedRelation } from \"../adapter\";\n\n/**\n * Configuration for different database dialects\n */\nexport interface DialectConfig {\n escapeName: (name: string) => string;\n isIncrement: (column: AnyColumn) => boolean;\n}\n\n/**\n * Configuration for an index definition\n */\nexport interface IndexConfig {\n config: {\n columns: Array<{ name: string }>;\n name?: string;\n unique: boolean;\n using?: string;\n };\n}\n\n/**\n * Configuration for a primary key constraint\n */\nexport interface PrimaryKeyConfig {\n columns: Array<{ name: string }>;\n name?: string;\n}\n\n/**\n * Configuration for a unique constraint\n */\nexport interface UniqueConstraintConfig {\n columns: Array<{ name: string }>;\n name?: string;\n}\n\n/**\n * Configuration for a foreign key constraint\n */\nexport interface ForeignKeyConfig {\n reference: () => {\n columns: Array<{ name: string }>;\n foreignColumns: Array<{ name: string }>;\n foreignTable: Table;\n };\n name?: string;\n onDelete?: string;\n onUpdate?: string;\n}\n\n/**\n * Table configuration extracted from Drizzle tables\n */\nexport interface TableConfig {\n indexes: IndexConfig[];\n primaryKeys: PrimaryKeyConfig[];\n uniqueConstraints: UniqueConstraintConfig[];\n foreignKeys: ForeignKeyConfig[];\n}\n\n/**\n * Base generator class for DBML generation\n */\nexport abstract class BaseGenerator<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> {\n protected schema: TSchema;\n protected relational: boolean;\n protected generatedRefs: GeneratedRef[] = [];\n protected comments: SchemaComments | undefined;\n protected parsedRelations: SchemaRelations | undefined;\n protected source: string | undefined;\n protected abstract dialectConfig: DialectConfig;\n\n /**\n * Create a new generator instance\n * @param options - Configuration options including schema, relational mode, source code, and comments\n */\n constructor(options: GenerateOptions<TSchema>) {\n this.schema = options.schema;\n this.relational = options.relational ?? false;\n this.source = options.source;\n\n // Initialize comments from options\n if (options.comments) {\n this.comments = options.comments;\n } else if (this.source) {\n this.comments = extractComments(this.source);\n }\n\n // Extract relations from source if relational mode is enabled\n if (this.relational && this.source) {\n this.parsedRelations = extractRelations(this.source);\n }\n }\n\n /**\n * Generate complete DBML output from the schema\n *\n * Creates DBML representation including:\n * - Table definitions with columns, indexes, and constraints\n * - Foreign key references (from table config or relations)\n * - Comments for tables and columns\n *\n * @returns The complete DBML string\n */\n generate(): string {\n const schema = this.toIntermediateSchema();\n const formatter = new DbmlFormatter();\n return formatter.format(schema);\n }\n\n /**\n * Get all tables from schema\n *\n * Extracts all Drizzle table objects from the schema by checking each value\n * with isTable() method.\n *\n * @returns Array of table objects\n */\n protected getTables(): Table[] {\n const tables: Table[] = [];\n for (const value of Object.values(this.schema)) {\n if (this.isTable(value)) {\n tables.push(value as Table);\n }\n }\n return tables;\n }\n\n /**\n * Check if a value is a Drizzle table\n *\n * Validates whether a value is a table instance from any supported dialect\n * (PostgreSQL, MySQL, or SQLite).\n *\n * @param value - The value to check\n * @returns True if value is a Drizzle table\n */\n protected isTable(value: unknown): boolean {\n return is(value, PgTable) || is(value, MySqlTable) || is(value, SQLiteTable);\n }\n\n /**\n * Check if a value is a v1 relation entry (from defineRelations())\n *\n * Uses official Drizzle v1 types: TableRelationalConfig with Relation instances.\n * Validates the structure has 'table', 'name', and 'relations' properties with valid types.\n *\n * @param value - The value to check\n * @returns True if value is a v1 relation entry\n */\n protected isV1RelationEntry(value: unknown): value is TableRelationalConfig {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n if (\n !(\"table\" in obj) ||\n !(\"name\" in obj) ||\n typeof obj.name !== \"string\" ||\n !(\"relations\" in obj) ||\n typeof obj.relations !== \"object\" ||\n obj.relations === null\n ) {\n return false;\n }\n // Check that 'relations' contains Relation instances (using drizzle-orm is())\n const relations = obj.relations as Record<string, unknown>;\n const relationValues = Object.values(relations);\n // Empty relations object is valid, but if there are entries, they must be Relations\n if (relationValues.length > 0) {\n return relationValues.some((rel) => is(rel, Relation));\n }\n // If no relations defined, also check table is valid\n return this.isTable(obj.table);\n }\n\n /**\n * Get all v1 relation entries from schema (defineRelations() API)\n *\n * Handles both individual entries and the full defineRelations() result object.\n * Extracts relation configurations that use the modern v1 API with official types.\n *\n * @returns Array of v1 relation entries\n */\n protected getV1RelationEntries(): TableRelationalConfig[] {\n const entries: TableRelationalConfig[] = [];\n for (const value of Object.values(this.schema)) {\n // Check if it's an individual relation entry\n if (this.isV1RelationEntry(value)) {\n entries.push(value);\n }\n // Check if it's the full defineRelations() result object\n // (an object where each value is a relation entry)\n else if (this.isV1DefineRelationsResult(value)) {\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (this.isV1RelationEntry(entry)) {\n entries.push(entry);\n }\n }\n }\n }\n return entries;\n }\n\n /**\n * Check if a value is a full v1 defineRelations() result object\n *\n * This is an object where all values are TableRelationalConfig objects.\n * Used to detect the full result of calling defineRelations() in v1.\n *\n * @param value - The value to check\n * @returns True if value is a full defineRelations() result\n */\n protected isV1DefineRelationsResult(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n const values = Object.values(obj);\n // Must have at least one entry and all must be relation entries\n return values.length > 0 && values.every((v) => this.isV1RelationEntry(v));\n }\n\n /**\n * Get table configuration from a Drizzle table\n *\n * Extracts indexes, primary keys, unique constraints, and foreign keys\n * from the table using the appropriate dialect-specific config getter.\n *\n * @param table - The Drizzle table to get configuration from\n * @returns Table configuration or undefined if dialect is not supported\n */\n protected getTableConfig(table: Table): TableConfig | undefined {\n // Detect dialect and use appropriate config getter\n // Cast is required at boundary due to Drizzle ORM's internal SQL<unknown> | Column union types\n if (is(table, PgTable)) {\n const config = getPgTableConfig(table);\n return this.mapTableConfig(config as Parameters<typeof this.mapTableConfig>[0]);\n }\n if (is(table, MySqlTable)) {\n const config = getMySqlTableConfig(table);\n return this.mapTableConfig(config as Parameters<typeof this.mapTableConfig>[0]);\n }\n if (is(table, SQLiteTable)) {\n const config = getSqliteTableConfig(table);\n return this.mapTableConfig(config as Parameters<typeof this.mapTableConfig>[0]);\n }\n return undefined;\n }\n\n /**\n * Map Drizzle's internal table config to our typed TableConfig\n *\n * Note: Drizzle ORM's columns type is `SQL<unknown> | IndexedColumn` union,\n * so we use `{ name?: string }` and cast to access the name property.\n * This is unavoidable due to Drizzle's internal type structure.\n */\n private mapTableConfig(config: {\n indexes: Array<{\n config: {\n columns: Array<{ name?: string }>;\n name?: string;\n unique?: boolean;\n using?: string;\n };\n }>;\n primaryKeys: Array<{ columns: Array<{ name?: string }>; name?: string }>;\n uniqueConstraints: Array<{ columns: Array<{ name?: string }>; name?: string }>;\n foreignKeys: Array<{\n reference: () => {\n columns: Array<{ name: string }>;\n foreignColumns: Array<{ name: string }>;\n foreignTable: Table;\n };\n name?: string;\n onDelete?: string;\n onUpdate?: string;\n }>;\n }): TableConfig {\n return {\n indexes: (config.indexes || []).map((idx) => ({\n config: {\n columns: idx.config.columns\n .filter((c): c is { name: string } => typeof c.name === \"string\")\n .map((c) => ({ name: c.name })),\n name: idx.config.name,\n unique: idx.config.unique ?? false,\n using: idx.config.using,\n },\n })),\n primaryKeys: (config.primaryKeys || []).map((pk) => ({\n columns: pk.columns\n .filter((c): c is { name: string } => typeof c.name === \"string\")\n .map((c) => ({ name: c.name })),\n name: pk.name,\n })),\n uniqueConstraints: (config.uniqueConstraints || []).map((uc) => ({\n columns: uc.columns\n .filter((c): c is { name: string } => typeof c.name === \"string\")\n .map((c) => ({ name: c.name })),\n name: uc.name,\n })),\n foreignKeys: (config.foreignKeys || []).map((fk) => ({\n reference: fk.reference,\n name: fk.name,\n onDelete: fk.onDelete,\n onUpdate: fk.onUpdate,\n })),\n };\n }\n\n /**\n * Get the default value for a column\n *\n * Extracts and formats the default value from a column, handling SQL expressions,\n * objects, and primitive values. Returns undefined if no default value exists.\n *\n * @param column - The column to get the default value from\n * @returns Formatted default value string or undefined\n */\n protected getDefaultValue(column: AnyColumn): string | undefined {\n if (!column.hasDefault) {\n return undefined;\n }\n\n const defaultValue = column.default;\n\n if (defaultValue === null) {\n return \"null\";\n }\n\n if (defaultValue === undefined) {\n return undefined;\n }\n\n // Handle SQL expressions\n if (typeof defaultValue === \"object\" && defaultValue !== null) {\n if (\"queryChunks\" in defaultValue) {\n // It's a SQL template\n const chunks = (defaultValue as { queryChunks: unknown[] }).queryChunks;\n const sqlParts: string[] = [];\n for (const chunk of chunks) {\n if (typeof chunk === \"string\") {\n sqlParts.push(chunk);\n } else if (typeof chunk === \"object\" && chunk !== null && \"value\" in chunk) {\n sqlParts.push(String((chunk as { value: unknown }).value));\n }\n }\n return sqlParts.join(\"\");\n }\n if (\"sql\" in defaultValue) {\n return (defaultValue as { sql: string }).sql;\n }\n // JSON object\n return JSON.stringify(defaultValue);\n }\n\n // Handle primitives\n if (typeof defaultValue === \"string\") {\n // Use '' escape (SQL standard)\n const escaped = defaultValue.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n if (typeof defaultValue === \"number\" || typeof defaultValue === \"boolean\") {\n return String(defaultValue);\n }\n\n return undefined;\n }\n\n /**\n * Collect foreign keys from table configuration\n *\n * Parses all foreign key definitions from the table config and adds them\n * to the generatedRefs collection for later output.\n *\n * @param tableName - The name of the source table\n * @param foreignKeys - Array of foreign key definitions from table config\n */\n protected collectForeignKeysFromConfig(tableName: string, foreignKeys: ForeignKeyConfig[]): void {\n for (const fk of foreignKeys) {\n const ref = this.parseForeignKey(tableName, fk);\n this.generatedRefs.push(ref);\n }\n }\n\n /**\n * Parse a foreign key into a GeneratedRef\n *\n * Extracts foreign key information (source/target tables and columns, actions)\n * and converts it to a GeneratedRef object for DBML output.\n *\n * @param tableName - The name of the source table\n * @param fk - The foreign key definition to parse\n * @returns GeneratedRef object\n */\n protected parseForeignKey(tableName: string, fk: ForeignKeyConfig): GeneratedRef {\n const reference = fk.reference();\n const fromColumns = reference.columns.map((c) => c.name);\n const toColumns = reference.foreignColumns.map((c) => c.name);\n const toTable = getTableName(reference.foreignTable);\n\n return {\n fromTable: tableName,\n fromColumns,\n toTable,\n toColumns,\n type: \">\",\n onDelete: fk.onDelete,\n onUpdate: fk.onUpdate,\n };\n }\n\n /**\n * Create the appropriate relation adapter based on schema contents\n *\n * Detects whether v1 or v0 relations are present and returns the\n * corresponding adapter implementation.\n *\n * @returns RelationAdapter instance (V1RelationAdapter or V0RelationAdapter)\n */\n private createRelationAdapter() {\n const v1Entries = this.getV1RelationEntries();\n if (v1Entries.length > 0) {\n return new V1RelationAdapter(v1Entries);\n }\n return new V0RelationAdapter(this.schema, this.parsedRelations);\n }\n\n /**\n * Convert a UnifiedRelation to a RelationDefinition\n *\n * Maps the unified relation format from adapters to the intermediate\n * schema's RelationDefinition format.\n *\n * @param unified - The unified relation from adapter\n * @returns RelationDefinition for intermediate schema\n */\n private unifiedRelationToDefinition(unified: UnifiedRelation): RelationDefinition {\n return {\n fromTable: unified.sourceTable,\n fromColumns: unified.sourceColumns,\n toTable: unified.targetTable,\n toColumns: unified.targetColumns,\n type: unified.relationType,\n onDelete: unified.onDelete,\n onUpdate: unified.onUpdate,\n };\n }\n\n /**\n * Convert the Drizzle schema to an intermediate schema representation\n *\n * Creates a database-agnostic intermediate representation that can be\n * used to generate various output formats (DBML, Markdown, JSON, etc.)\n *\n * @returns The intermediate schema representation\n */\n toIntermediateSchema(): IntermediateSchema {\n const tables = this.getTables();\n\n // Determine database type from the first table\n const databaseType = this.getDatabaseType(tables[0]);\n\n // Convert tables to intermediate format\n const tableDefinitions: TableDefinition[] = tables.map((table) =>\n this.tableToDefinition(table),\n );\n\n // Collect relations\n let relations: RelationDefinition[] = [];\n\n if (this.relational) {\n // Use adapter to extract relations in unified format\n const adapter = this.createRelationAdapter();\n const unifiedRelations = adapter.extract();\n relations = unifiedRelations.map((unified) => this.unifiedRelationToDefinition(unified));\n } else {\n // Collect foreign keys from table configs (legacy path)\n // Reset generatedRefs to collect fresh relations\n this.generatedRefs = [];\n for (const table of tables) {\n const tableName = getTableName(table);\n const tableConfig = this.getTableConfig(table);\n if (tableConfig && tableConfig.foreignKeys.length > 0) {\n this.collectForeignKeysFromConfig(tableName, tableConfig.foreignKeys);\n }\n }\n // Convert GeneratedRefs to RelationDefinitions\n relations = this.generatedRefs.map((ref) => this.refToRelationDefinition(ref));\n }\n\n // Collect enums (override in subclasses for dialect-specific behavior)\n const enums: EnumDefinition[] = this.collectEnumDefinitions();\n\n return {\n databaseType,\n tables: tableDefinitions,\n relations,\n enums,\n };\n }\n\n /**\n * Determine the database type from a Drizzle table\n *\n * @param table - The table to check (can be undefined for empty schemas)\n * @returns The database type\n */\n protected getDatabaseType(table: Table | undefined): DatabaseType {\n if (!table) {\n // Default to postgresql if no tables\n return \"postgresql\";\n }\n if (is(table, PgTable)) {\n return \"postgresql\";\n }\n if (is(table, MySqlTable)) {\n return \"mysql\";\n }\n if (is(table, SQLiteTable)) {\n return \"sqlite\";\n }\n // Fallback\n return \"postgresql\";\n }\n\n /**\n * Convert a Drizzle table to a TableDefinition\n *\n * @param table - The Drizzle table to convert\n * @returns The table definition\n */\n protected tableToDefinition(table: Table): TableDefinition {\n const tableName = getTableName(table);\n const columns = getTableColumns(table);\n const tableConfig = this.getTableConfig(table);\n\n // Convert columns\n const columnDefinitions: ColumnDefinition[] = Object.values(columns).map((column) =>\n this.columnToDefinition(column, tableName),\n );\n\n // Convert indexes\n const indexDefinitions: IndexDefinition[] = this.extractIndexDefinitions(tableConfig);\n\n // Convert constraints\n const constraintDefinitions: ConstraintDefinition[] =\n this.extractConstraintDefinitions(tableConfig);\n\n // Get table comment\n const tableComment = this.comments?.tables[tableName]?.comment;\n\n return {\n name: tableName,\n comment: tableComment,\n columns: columnDefinitions,\n indexes: indexDefinitions,\n constraints: constraintDefinitions,\n };\n }\n\n /**\n * Convert a Drizzle column to a ColumnDefinition\n *\n * @param column - The Drizzle column to convert\n * @param tableName - The name of the table containing the column\n * @returns The column definition\n */\n protected columnToDefinition(column: AnyColumn, tableName: string): ColumnDefinition {\n const columnComment = this.comments?.tables[tableName]?.columns[column.name]?.comment;\n const defaultValue = this.getDefaultValue(column);\n\n return {\n name: column.name,\n type: column.getSQLType(),\n nullable: !column.notNull,\n defaultValue,\n primaryKey: column.primary,\n unique: column.isUnique,\n autoIncrement: this.dialectConfig.isIncrement(column) || undefined,\n comment: columnComment,\n };\n }\n\n /**\n * Extract index definitions from table config\n *\n * @param tableConfig - The table configuration\n * @returns Array of index definitions\n */\n protected extractIndexDefinitions(tableConfig: TableConfig | undefined): IndexDefinition[] {\n if (!tableConfig) {\n return [];\n }\n\n const indexes: IndexDefinition[] = [];\n\n for (const idx of tableConfig.indexes) {\n const columns = idx.config.columns.map((c) => c.name);\n if (columns.length > 0) {\n indexes.push({\n name: idx.config.name || `idx_${columns.join(\"_\")}`,\n columns,\n unique: idx.config.unique,\n type: idx.config.using,\n });\n }\n }\n\n return indexes;\n }\n\n /**\n * Extract constraint definitions from table config\n *\n * @param tableConfig - The table configuration\n * @returns Array of constraint definitions\n */\n protected extractConstraintDefinitions(\n tableConfig: TableConfig | undefined,\n ): ConstraintDefinition[] {\n if (!tableConfig) {\n return [];\n }\n\n const constraints: ConstraintDefinition[] = [];\n\n // Primary keys\n for (const pk of tableConfig.primaryKeys) {\n const columns = pk.columns.map((c) => c.name);\n if (columns.length > 0) {\n constraints.push({\n name: pk.name || `pk_${columns.join(\"_\")}`,\n type: \"primary_key\",\n columns,\n });\n }\n }\n\n // Unique constraints\n for (const uc of tableConfig.uniqueConstraints) {\n const columns = uc.columns.map((c) => c.name);\n if (columns.length > 0) {\n constraints.push({\n name: uc.name || `uq_${columns.join(\"_\")}`,\n type: \"unique\",\n columns,\n });\n }\n }\n\n // Foreign keys\n for (const fk of tableConfig.foreignKeys) {\n const fkDef = this.parseForeignKeyForConstraint(fk);\n if (fkDef) {\n constraints.push(fkDef);\n }\n }\n\n return constraints;\n }\n\n /**\n * Parse a foreign key into a ConstraintDefinition\n *\n * @param fk - The foreign key definition\n * @returns ConstraintDefinition\n */\n protected parseForeignKeyForConstraint(fk: ForeignKeyConfig): ConstraintDefinition {\n const reference = fk.reference();\n const columns = reference.columns.map((c) => c.name);\n const referencedColumns = reference.foreignColumns.map((c) => c.name);\n const referencedTable = getTableName(reference.foreignTable);\n\n return {\n name: fk.name || `fk_${columns.join(\"_\")}_${referencedTable}`,\n type: \"foreign_key\",\n columns,\n referencedTable,\n referencedColumns,\n };\n }\n\n /**\n * Convert a GeneratedRef to a RelationDefinition\n *\n * @param ref - The generated reference\n * @returns The relation definition\n */\n protected refToRelationDefinition(ref: GeneratedRef): RelationDefinition {\n // Map DBML ref type to IntermediateRelationType\n let relationType: IntermediateRelationType;\n switch (ref.type) {\n case \"-\":\n relationType = \"one-to-one\";\n break;\n case \">\":\n relationType = \"many-to-one\";\n break;\n case \"<\":\n relationType = \"one-to-many\";\n break;\n default:\n relationType = \"many-to-one\";\n }\n\n return {\n fromTable: ref.fromTable,\n fromColumns: ref.fromColumns,\n toTable: ref.toTable,\n toColumns: ref.toColumns,\n type: relationType,\n onDelete: ref.onDelete,\n onUpdate: ref.onUpdate,\n };\n }\n\n /**\n * Collect enum definitions from the schema\n *\n * Override in subclasses for dialect-specific enum handling (e.g., PostgreSQL)\n *\n * @returns Array of enum definitions (empty by default)\n */\n protected collectEnumDefinitions(): EnumDefinition[] {\n // Default implementation returns empty array\n // Override in PgGenerator for PostgreSQL enum support\n return [];\n }\n}\n\n/**\n * Write DBML content to a file\n *\n * Creates the directory if it doesn't exist and writes the DBML content\n * to the specified file path.\n *\n * @param filePath - The path to write the DBML file to\n * @param content - The DBML content to write\n */\nexport function writeDbmlFile(filePath: string, content: string): void {\n const resolvedPath = resolve(filePath);\n const dir = dirname(resolvedPath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(resolvedPath, content, \"utf-8\");\n}\n"],"names":["BaseGenerator","options","extractComments","extractRelations","schema","DbmlFormatter","tables","value","is","PgTable","MySqlTable","SQLiteTable","obj","relations","relationValues","rel","Relation","entries","entry","values","v","table","config","getPgTableConfig","getMySqlTableConfig","getSqliteTableConfig","idx","c","pk","uc","fk","column","defaultValue","chunks","sqlParts","chunk","tableName","foreignKeys","ref","reference","fromColumns","toColumns","toTable","getTableName","v1Entries","V1RelationAdapter","V0RelationAdapter","unified","databaseType","tableDefinitions","tableConfig","enums","columns","getTableColumns","columnDefinitions","indexDefinitions","constraintDefinitions","tableComment","columnComment","indexes","constraints","fkDef","referencedColumns","referencedTable","relationType","writeDbmlFile","filePath","content","resolvedPath","resolve","dir","dirname","mkdirSync","writeFileSync"],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sources":["../../src/generator/common.ts"],"sourcesContent":["import {\n type AnyColumn,\n type Table,\n getTableColumns,\n getTableName,\n is,\n Relation,\n} from \"drizzle-orm\";\nimport type { TableRelationalConfig } from \"drizzle-orm/relations\";\nimport { PgTable, getTableConfig as getPgTableConfig } from \"drizzle-orm/pg-core\";\nimport { MySqlTable, getTableConfig as getMySqlTableConfig } from \"drizzle-orm/mysql-core\";\nimport { SQLiteTable, getTableConfig as getSqliteTableConfig } from \"drizzle-orm/sqlite-core\";\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { DbmlFormatter } from \"../formatter/dbml\";\n\nimport type {\n GeneratedRef,\n GenerateOptions,\n IntermediateSchema,\n TableDefinition,\n ColumnDefinition,\n IndexDefinition,\n ConstraintDefinition,\n RelationDefinition,\n EnumDefinition,\n DatabaseType,\n IntermediateRelationType,\n} from \"../types\";\nimport { extractComments, type SchemaComments } from \"../parser/comments\";\nimport { extractRelations, type SchemaRelations } from \"../parser/relations\";\nimport { V0RelationAdapter } from \"../adapter/v0-adapter\";\nimport { V1RelationAdapter } from \"../adapter/v1-adapter\";\nimport type { UnifiedRelation } from \"../adapter/types\";\n\n/**\n * Configuration for different database dialects\n */\nexport interface DialectConfig {\n escapeName: (name: string) => string;\n isIncrement: (column: AnyColumn) => boolean;\n}\n\n/**\n * Configuration for an index definition\n */\ninterface IndexConfig {\n config: {\n columns: Array<{ name: string }>;\n name?: string;\n unique: boolean;\n using?: string;\n };\n}\n\n/**\n * Configuration for a primary key constraint\n */\ninterface PrimaryKeyConfig {\n columns: Array<{ name: string }>;\n name?: string;\n}\n\n/**\n * Configuration for a unique constraint\n */\ninterface UniqueConstraintConfig {\n columns: Array<{ name: string }>;\n name?: string;\n}\n\n/**\n * Configuration for a foreign key constraint\n */\nexport interface ForeignKeyConfig {\n reference: () => {\n columns: Array<{ name: string }>;\n foreignColumns: Array<{ name: string }>;\n foreignTable: Table;\n };\n name?: string;\n onDelete?: string;\n onUpdate?: string;\n}\n\n/**\n * Table configuration extracted from Drizzle tables\n */\nexport interface TableConfig {\n indexes: IndexConfig[];\n primaryKeys: PrimaryKeyConfig[];\n uniqueConstraints: UniqueConstraintConfig[];\n foreignKeys: ForeignKeyConfig[];\n}\n\n/**\n * Base generator class for DBML generation\n */\nexport abstract class BaseGenerator<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> {\n protected schema: TSchema;\n protected generatedRefs: GeneratedRef[] = [];\n protected comments: SchemaComments | undefined;\n protected parsedRelations: SchemaRelations | undefined;\n protected source: string | undefined;\n protected abstract dialectConfig: DialectConfig;\n\n /**\n * Create a new generator instance\n * @param options - Configuration options including schema, source code, and comments\n */\n constructor(options: GenerateOptions<TSchema>) {\n this.schema = options.schema;\n this.source = options.source;\n\n // Initialize comments from options\n if (options.comments) {\n this.comments = options.comments;\n } else if (this.source) {\n this.comments = extractComments(this.source);\n }\n\n // Extract relations from source for v0 API detection\n if (this.source) {\n this.parsedRelations = extractRelations(this.source);\n }\n }\n\n /**\n * Generate complete DBML output from the schema\n *\n * Creates DBML representation including:\n * - Table definitions with columns, indexes, and constraints\n * - Foreign key references (from table config or relations)\n * - Comments for tables and columns\n *\n * @returns The complete DBML string\n */\n generate(): string {\n const schema = this.toIntermediateSchema();\n const formatter = new DbmlFormatter();\n return formatter.format(schema);\n }\n\n /**\n * Get all tables from schema\n *\n * Extracts all Drizzle table objects from the schema by checking each value\n * with isTable() method.\n *\n * @returns Array of table objects\n */\n protected getTables(): Table[] {\n const tables: Table[] = [];\n for (const value of Object.values(this.schema)) {\n if (this.isTable(value)) {\n tables.push(value as Table);\n }\n }\n return tables;\n }\n\n /**\n * Check if a value is a Drizzle table\n *\n * Validates whether a value is a table instance from any supported dialect\n * (PostgreSQL, MySQL, or SQLite).\n *\n * @param value - The value to check\n * @returns True if value is a Drizzle table\n */\n protected isTable(value: unknown): boolean {\n return is(value, PgTable) || is(value, MySqlTable) || is(value, SQLiteTable);\n }\n\n /**\n * Check if a value is a v1 relation entry (from defineRelations())\n *\n * Uses official Drizzle v1 types: TableRelationalConfig with Relation instances.\n * Validates the structure has 'table', 'name', and 'relations' properties with valid types.\n *\n * @param value - The value to check\n * @returns True if value is a v1 relation entry\n */\n protected isV1RelationEntry(value: unknown): value is TableRelationalConfig {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n if (\n !(\"table\" in obj) ||\n !(\"name\" in obj) ||\n typeof obj.name !== \"string\" ||\n !(\"relations\" in obj) ||\n typeof obj.relations !== \"object\" ||\n obj.relations === null\n ) {\n return false;\n }\n // Check that 'relations' contains Relation instances (using drizzle-orm is())\n const relations = obj.relations as Record<string, unknown>;\n const relationValues = Object.values(relations);\n // Empty relations object is valid, but if there are entries, they must be Relations\n if (relationValues.length > 0) {\n return relationValues.some((rel) => is(rel, Relation));\n }\n // If no relations defined, also check table is valid\n return this.isTable(obj.table);\n }\n\n /**\n * Get all v1 relation entries from schema (defineRelations() API)\n *\n * Handles both individual entries and the full defineRelations() result object.\n * Extracts relation configurations that use the modern v1 API with official types.\n *\n * @returns Array of v1 relation entries\n */\n protected getV1RelationEntries(): TableRelationalConfig[] {\n const entries: TableRelationalConfig[] = [];\n for (const value of Object.values(this.schema)) {\n // Check if it's an individual relation entry\n if (this.isV1RelationEntry(value)) {\n entries.push(value);\n }\n // Check if it's the full defineRelations() result object\n // (an object where each value is a relation entry)\n else if (this.isV1DefineRelationsResult(value)) {\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (this.isV1RelationEntry(entry)) {\n entries.push(entry);\n }\n }\n }\n }\n return entries;\n }\n\n /**\n * Check if a value is a full v1 defineRelations() result object\n *\n * This is an object where all values are TableRelationalConfig objects.\n * Used to detect the full result of calling defineRelations() in v1.\n *\n * @param value - The value to check\n * @returns True if value is a full defineRelations() result\n */\n protected isV1DefineRelationsResult(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n const values = Object.values(obj);\n // Must have at least one entry and all must be relation entries\n return values.length > 0 && values.every((v) => this.isV1RelationEntry(v));\n }\n\n /**\n * Get table configuration from a Drizzle table\n *\n * Extracts indexes, primary keys, unique constraints, and foreign keys\n * from the table using the appropriate dialect-specific config getter.\n *\n * @param table - The Drizzle table to get configuration from\n * @returns Table configuration or undefined if dialect is not supported\n */\n protected getTableConfig(table: Table): TableConfig | undefined {\n // Detect dialect and use appropriate config getter\n // Cast is required at boundary due to Drizzle ORM's internal SQL<unknown> | Column union types\n if (is(table, PgTable)) {\n const config = getPgTableConfig(table);\n return this.mapTableConfig(config as Parameters<typeof this.mapTableConfig>[0]);\n }\n if (is(table, MySqlTable)) {\n const config = getMySqlTableConfig(table);\n return this.mapTableConfig(config as Parameters<typeof this.mapTableConfig>[0]);\n }\n if (is(table, SQLiteTable)) {\n const config = getSqliteTableConfig(table);\n return this.mapTableConfig(config as Parameters<typeof this.mapTableConfig>[0]);\n }\n return undefined;\n }\n\n /**\n * Map Drizzle's internal table config to our typed TableConfig\n *\n * Note: Drizzle ORM's columns type is `SQL<unknown> | IndexedColumn` union,\n * so we use `{ name?: string }` and cast to access the name property.\n * This is unavoidable due to Drizzle's internal type structure.\n */\n private mapTableConfig(config: {\n indexes: Array<{\n config: {\n columns: Array<{ name?: string }>;\n name?: string;\n unique?: boolean;\n using?: string;\n };\n }>;\n primaryKeys: Array<{ columns: Array<{ name?: string }>; name?: string }>;\n uniqueConstraints: Array<{ columns: Array<{ name?: string }>; name?: string }>;\n foreignKeys: Array<{\n reference: () => {\n columns: Array<{ name: string }>;\n foreignColumns: Array<{ name: string }>;\n foreignTable: Table;\n };\n name?: string;\n onDelete?: string;\n onUpdate?: string;\n }>;\n }): TableConfig {\n return {\n indexes: (config.indexes || []).map((idx) => ({\n config: {\n columns: idx.config.columns\n .filter((c): c is { name: string } => typeof c.name === \"string\")\n .map((c) => ({ name: c.name })),\n name: idx.config.name,\n unique: idx.config.unique ?? false,\n using: idx.config.using,\n },\n })),\n primaryKeys: (config.primaryKeys || []).map((pk) => ({\n columns: pk.columns\n .filter((c): c is { name: string } => typeof c.name === \"string\")\n .map((c) => ({ name: c.name })),\n name: pk.name,\n })),\n uniqueConstraints: (config.uniqueConstraints || []).map((uc) => ({\n columns: uc.columns\n .filter((c): c is { name: string } => typeof c.name === \"string\")\n .map((c) => ({ name: c.name })),\n name: uc.name,\n })),\n foreignKeys: (config.foreignKeys || []).map((fk) => ({\n reference: fk.reference,\n name: fk.name,\n onDelete: fk.onDelete,\n onUpdate: fk.onUpdate,\n })),\n };\n }\n\n /**\n * Get the default value for a column\n *\n * Extracts and formats the default value from a column, handling SQL expressions,\n * objects, and primitive values. Returns undefined if no default value exists.\n *\n * @param column - The column to get the default value from\n * @returns Formatted default value string or undefined\n */\n protected getDefaultValue(column: AnyColumn): string | undefined {\n if (!column.hasDefault) {\n return undefined;\n }\n\n const defaultValue = column.default;\n\n if (defaultValue === null) {\n return \"null\";\n }\n\n if (defaultValue === undefined) {\n return undefined;\n }\n\n // Handle SQL expressions\n if (typeof defaultValue === \"object\" && defaultValue !== null) {\n if (\"queryChunks\" in defaultValue) {\n // It's a SQL template\n const chunks = (defaultValue as { queryChunks: unknown[] }).queryChunks;\n const sqlParts: string[] = [];\n for (const chunk of chunks) {\n if (typeof chunk === \"string\") {\n sqlParts.push(chunk);\n } else if (typeof chunk === \"object\" && chunk !== null && \"value\" in chunk) {\n sqlParts.push(String((chunk as { value: unknown }).value));\n }\n }\n return sqlParts.join(\"\");\n }\n if (\"sql\" in defaultValue) {\n return (defaultValue as { sql: string }).sql;\n }\n // JSON object\n return JSON.stringify(defaultValue);\n }\n\n // Handle primitives\n if (typeof defaultValue === \"string\") {\n // Use '' escape (SQL standard)\n const escaped = defaultValue.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n if (typeof defaultValue === \"number\" || typeof defaultValue === \"boolean\") {\n return String(defaultValue);\n }\n\n return undefined;\n }\n\n /**\n * Collect foreign keys from table configuration\n *\n * Parses all foreign key definitions from the table config and adds them\n * to the generatedRefs collection for later output.\n *\n * @param tableName - The name of the source table\n * @param foreignKeys - Array of foreign key definitions from table config\n */\n protected collectForeignKeysFromConfig(tableName: string, foreignKeys: ForeignKeyConfig[]): void {\n for (const fk of foreignKeys) {\n const ref = this.parseForeignKey(tableName, fk);\n this.generatedRefs.push(ref);\n }\n }\n\n /**\n * Parse a foreign key into a GeneratedRef\n *\n * Extracts foreign key information (source/target tables and columns, actions)\n * and converts it to a GeneratedRef object for DBML output.\n *\n * @param tableName - The name of the source table\n * @param fk - The foreign key definition to parse\n * @returns GeneratedRef object\n */\n protected parseForeignKey(tableName: string, fk: ForeignKeyConfig): GeneratedRef {\n const reference = fk.reference();\n const fromColumns = reference.columns.map((c) => c.name);\n const toColumns = reference.foreignColumns.map((c) => c.name);\n const toTable = getTableName(reference.foreignTable);\n\n return {\n fromTable: tableName,\n fromColumns,\n toTable,\n toColumns,\n type: \">\",\n onDelete: fk.onDelete,\n onUpdate: fk.onUpdate,\n };\n }\n\n /**\n * Detect if relation definitions are present in the schema\n *\n * Checks for both v1 (defineRelations()) and v0 (relations()) API usage.\n * Returns true if any relation definitions are found.\n *\n * @returns True if relations are defined, false otherwise\n */\n private hasRelationDefinitions(): boolean {\n // Check for v1 relation entries (defineRelations() API)\n const v1Entries = this.getV1RelationEntries();\n if (v1Entries.length > 0) {\n return true;\n }\n\n // Check for v0 relation definitions (relations() API)\n if (this.parsedRelations && this.parsedRelations.relations.length > 0) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Create the appropriate relation adapter based on schema contents\n *\n * Detects whether v1 or v0 relations are present and returns the\n * corresponding adapter implementation.\n *\n * @returns RelationAdapter instance (V1RelationAdapter or V0RelationAdapter)\n */\n private createRelationAdapter() {\n const v1Entries = this.getV1RelationEntries();\n if (v1Entries.length > 0) {\n return new V1RelationAdapter(v1Entries);\n }\n return new V0RelationAdapter(this.schema, this.parsedRelations);\n }\n\n /**\n * Convert a UnifiedRelation to a RelationDefinition\n *\n * Maps the unified relation format from adapters to the intermediate\n * schema's RelationDefinition format.\n *\n * @param unified - The unified relation from adapter\n * @returns RelationDefinition for intermediate schema\n */\n private unifiedRelationToDefinition(unified: UnifiedRelation): RelationDefinition {\n return {\n fromTable: unified.sourceTable,\n fromColumns: unified.sourceColumns,\n toTable: unified.targetTable,\n toColumns: unified.targetColumns,\n type: unified.relationType,\n onDelete: unified.onDelete,\n onUpdate: unified.onUpdate,\n };\n }\n\n /**\n * Convert the Drizzle schema to an intermediate schema representation\n *\n * Creates a database-agnostic intermediate representation that can be\n * used to generate various output formats (DBML, Markdown, JSON, etc.)\n *\n * @returns The intermediate schema representation\n */\n toIntermediateSchema(): IntermediateSchema {\n const tables = this.getTables();\n\n // Determine database type from the first table\n const databaseType = this.getDatabaseType(tables[0]);\n\n // Convert tables to intermediate format\n const tableDefinitions: TableDefinition[] = tables.map((table) =>\n this.tableToDefinition(table),\n );\n\n // Collect relations (auto-detect relation definitions vs foreign keys)\n let relations: RelationDefinition[] = [];\n\n if (this.hasRelationDefinitions()) {\n // Use adapter to extract relations in unified format (v1 or v0 API)\n const adapter = this.createRelationAdapter();\n const unifiedRelations = adapter.extract();\n relations = unifiedRelations.map((unified) => this.unifiedRelationToDefinition(unified));\n } else {\n // Fall back to foreign keys from table configs\n // Reset generatedRefs to collect fresh relations\n this.generatedRefs = [];\n for (const table of tables) {\n const tableName = getTableName(table);\n const tableConfig = this.getTableConfig(table);\n if (tableConfig && tableConfig.foreignKeys.length > 0) {\n this.collectForeignKeysFromConfig(tableName, tableConfig.foreignKeys);\n }\n }\n // Convert GeneratedRefs to RelationDefinitions\n relations = this.generatedRefs.map((ref) => this.refToRelationDefinition(ref));\n }\n\n // Collect enums (override in subclasses for dialect-specific behavior)\n const enums: EnumDefinition[] = this.collectEnumDefinitions();\n\n return {\n databaseType,\n tables: tableDefinitions,\n relations,\n enums,\n };\n }\n\n /**\n * Determine the database type from a Drizzle table\n *\n * @param table - The table to check (can be undefined for empty schemas)\n * @returns The database type\n */\n protected getDatabaseType(table: Table | undefined): DatabaseType {\n if (!table) {\n // Default to postgresql if no tables\n return \"postgresql\";\n }\n if (is(table, PgTable)) {\n return \"postgresql\";\n }\n if (is(table, MySqlTable)) {\n return \"mysql\";\n }\n if (is(table, SQLiteTable)) {\n return \"sqlite\";\n }\n // Fallback\n return \"postgresql\";\n }\n\n /**\n * Convert a Drizzle table to a TableDefinition\n *\n * @param table - The Drizzle table to convert\n * @returns The table definition\n */\n protected tableToDefinition(table: Table): TableDefinition {\n const tableName = getTableName(table);\n const columns = getTableColumns(table);\n const tableConfig = this.getTableConfig(table);\n\n // Convert columns\n const columnDefinitions: ColumnDefinition[] = Object.values(columns).map((column) =>\n this.columnToDefinition(column, tableName),\n );\n\n // Convert indexes\n const indexDefinitions: IndexDefinition[] = this.extractIndexDefinitions(tableConfig);\n\n // Convert constraints\n const constraintDefinitions: ConstraintDefinition[] =\n this.extractConstraintDefinitions(tableConfig);\n\n // Get table comment\n const tableComment = this.comments?.tables[tableName]?.comment;\n\n return {\n name: tableName,\n comment: tableComment,\n columns: columnDefinitions,\n indexes: indexDefinitions,\n constraints: constraintDefinitions,\n };\n }\n\n /**\n * Convert a Drizzle column to a ColumnDefinition\n *\n * @param column - The Drizzle column to convert\n * @param tableName - The name of the table containing the column\n * @returns The column definition\n */\n protected columnToDefinition(column: AnyColumn, tableName: string): ColumnDefinition {\n const columnComment = this.comments?.tables[tableName]?.columns[column.name]?.comment;\n const defaultValue = this.getDefaultValue(column);\n\n return {\n name: column.name,\n type: column.getSQLType(),\n nullable: !column.notNull,\n defaultValue,\n primaryKey: column.primary,\n unique: column.isUnique,\n autoIncrement: this.dialectConfig.isIncrement(column) || undefined,\n comment: columnComment,\n };\n }\n\n /**\n * Extract index definitions from table config\n *\n * @param tableConfig - The table configuration\n * @returns Array of index definitions\n */\n protected extractIndexDefinitions(tableConfig: TableConfig | undefined): IndexDefinition[] {\n if (!tableConfig) {\n return [];\n }\n\n const indexes: IndexDefinition[] = [];\n\n for (const idx of tableConfig.indexes) {\n const columns = idx.config.columns.map((c) => c.name);\n if (columns.length > 0) {\n indexes.push({\n name: idx.config.name || `idx_${columns.join(\"_\")}`,\n columns,\n unique: idx.config.unique,\n type: idx.config.using,\n });\n }\n }\n\n return indexes;\n }\n\n /**\n * Extract constraint definitions from table config\n *\n * @param tableConfig - The table configuration\n * @returns Array of constraint definitions\n */\n protected extractConstraintDefinitions(\n tableConfig: TableConfig | undefined,\n ): ConstraintDefinition[] {\n if (!tableConfig) {\n return [];\n }\n\n const constraints: ConstraintDefinition[] = [];\n\n // Primary keys\n for (const pk of tableConfig.primaryKeys) {\n const columns = pk.columns.map((c) => c.name);\n if (columns.length > 0) {\n constraints.push({\n name: pk.name || `pk_${columns.join(\"_\")}`,\n type: \"primary_key\",\n columns,\n });\n }\n }\n\n // Unique constraints\n for (const uc of tableConfig.uniqueConstraints) {\n const columns = uc.columns.map((c) => c.name);\n if (columns.length > 0) {\n constraints.push({\n name: uc.name || `uq_${columns.join(\"_\")}`,\n type: \"unique\",\n columns,\n });\n }\n }\n\n // Foreign keys\n for (const fk of tableConfig.foreignKeys) {\n const fkDef = this.parseForeignKeyForConstraint(fk);\n if (fkDef) {\n constraints.push(fkDef);\n }\n }\n\n return constraints;\n }\n\n /**\n * Parse a foreign key into a ConstraintDefinition\n *\n * @param fk - The foreign key definition\n * @returns ConstraintDefinition\n */\n protected parseForeignKeyForConstraint(fk: ForeignKeyConfig): ConstraintDefinition {\n const reference = fk.reference();\n const columns = reference.columns.map((c) => c.name);\n const referencedColumns = reference.foreignColumns.map((c) => c.name);\n const referencedTable = getTableName(reference.foreignTable);\n\n return {\n name: fk.name || `fk_${columns.join(\"_\")}_${referencedTable}`,\n type: \"foreign_key\",\n columns,\n referencedTable,\n referencedColumns,\n };\n }\n\n /**\n * Convert a GeneratedRef to a RelationDefinition\n *\n * @param ref - The generated reference\n * @returns The relation definition\n */\n protected refToRelationDefinition(ref: GeneratedRef): RelationDefinition {\n // Map DBML ref type to IntermediateRelationType\n let relationType: IntermediateRelationType;\n switch (ref.type) {\n case \"-\":\n relationType = \"one-to-one\";\n break;\n case \">\":\n relationType = \"many-to-one\";\n break;\n case \"<\":\n relationType = \"one-to-many\";\n break;\n default:\n relationType = \"many-to-one\";\n }\n\n return {\n fromTable: ref.fromTable,\n fromColumns: ref.fromColumns,\n toTable: ref.toTable,\n toColumns: ref.toColumns,\n type: relationType,\n onDelete: ref.onDelete,\n onUpdate: ref.onUpdate,\n };\n }\n\n /**\n * Collect enum definitions from the schema\n *\n * Override in subclasses for dialect-specific enum handling (e.g., PostgreSQL)\n *\n * @returns Array of enum definitions (empty by default)\n */\n protected collectEnumDefinitions(): EnumDefinition[] {\n // Default implementation returns empty array\n // Override in PgGenerator for PostgreSQL enum support\n return [];\n }\n}\n\n/**\n * Write DBML content to a file\n *\n * Creates the directory if it doesn't exist and writes the DBML content\n * to the specified file path.\n *\n * @param filePath - The path to write the DBML file to\n * @param content - The DBML content to write\n */\nexport function writeDbmlFile(filePath: string, content: string): void {\n const resolvedPath = resolve(filePath);\n const dir = dirname(resolvedPath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(resolvedPath, content, \"utf-8\");\n}\n"],"names":["BaseGenerator","options","extractComments","extractRelations","schema","DbmlFormatter","tables","value","is","PgTable","MySqlTable","SQLiteTable","obj","relations","relationValues","rel","Relation","entries","entry","values","v","table","config","getPgTableConfig","getMySqlTableConfig","getSqliteTableConfig","idx","c","pk","uc","fk","column","defaultValue","chunks","sqlParts","chunk","tableName","foreignKeys","ref","reference","fromColumns","toColumns","toTable","getTableName","v1Entries","V1RelationAdapter","V0RelationAdapter","unified","databaseType","tableDefinitions","tableConfig","enums","columns","getTableColumns","columnDefinitions","indexDefinitions","constraintDefinitions","tableComment","columnComment","indexes","constraints","fkDef","referencedColumns","referencedTable","relationType","writeDbmlFile","filePath","content","resolvedPath","resolve","dir","dirname","mkdirSync","writeFileSync"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,11 +6,19 @@
6
6
  * Supports extracting JSDoc comments from source files and including them
7
7
  * as DBML Note clauses using the TypeScript Compiler API.
8
8
  */
9
- export { extractComments } from './parser/index';
10
- export type { SchemaComments, TableComment, ColumnComment } from './parser/index';
11
- export { pgGenerate, PgGenerator, mysqlGenerate, MySqlGenerator, sqliteGenerate, SqliteGenerator, BaseGenerator, DbmlBuilder, writeDbmlFile, } from './generator/index';
12
- export type { GenerateOptions, GeneratedRef, ColumnAttributes, RelationType } from './types';
9
+ export { extractComments } from './parser/comments';
10
+ export type { SchemaComments, TableComment, ColumnComment } from './parser/comments';
11
+ export { pgGenerate, PgGenerator } from './generator/pg';
12
+ export { mysqlGenerate, MySqlGenerator } from './generator/mysql';
13
+ export { sqliteGenerate, SqliteGenerator } from './generator/sqlite';
14
+ export { BaseGenerator, writeDbmlFile } from './generator/common';
15
+ export { DbmlBuilder } from './formatter/dbml-builder';
16
+ export type { GenerateOptions, GeneratedRef } from './types';
13
17
  export type { DatabaseType, ColumnDefinition, IndexDefinition, ConstraintType, ConstraintDefinition, TableDefinition, IntermediateRelationType, RelationDefinition, EnumDefinition, IntermediateSchema, } from './types';
14
- export { DbmlFormatter, MarkdownFormatter, MermaidErDiagramFormatter } from './formatter/index';
15
- export type { OutputFormatter, FormatterOptions, MarkdownFormatterOptions, MermaidFormatterOptions, } from './formatter/index';
18
+ export { DbmlFormatter } from './formatter/dbml';
19
+ export { MarkdownFormatter } from './formatter/markdown';
20
+ export { MermaidErDiagramFormatter } from './formatter/mermaid';
21
+ export type { OutputFormatter, FormatterOptions } from './formatter/types';
22
+ export type { MarkdownFormatterOptions } from './formatter/markdown';
23
+ export type { MermaidFormatterOptions } from './formatter/mermaid';
16
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGlF,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG7F,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EACxB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAChG,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGrF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG7D,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EACxB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,28 +1,25 @@
1
- import { extractComments as a } from "./parser/comments.js";
2
- import "typescript";
3
- import "node:fs";
4
- import "node:path";
5
- import { PgGenerator as i, pgGenerate as x } from "./generator/pg.js";
6
- import { MySqlGenerator as l, mysqlGenerate as n } from "./generator/mysql.js";
7
- import { SqliteGenerator as q, sqliteGenerate as s } from "./generator/sqlite.js";
8
- import { BaseGenerator as F, writeDbmlFile as b } from "./generator/common.js";
9
- import { DbmlBuilder as g } from "./formatter/dbml-builder.js";
10
- import { DbmlFormatter as w } from "./formatter/dbml.js";
11
- import { MarkdownFormatter as B } from "./formatter/markdown.js";
12
- import { MermaidErDiagramFormatter as c } from "./formatter/mermaid.js";
1
+ import { extractComments as t } from "./parser/comments.js";
2
+ import { PgGenerator as m, pgGenerate as a } from "./generator/pg.js";
3
+ import { MySqlGenerator as x, mysqlGenerate as f } from "./generator/mysql.js";
4
+ import { SqliteGenerator as n, sqliteGenerate as i } from "./generator/sqlite.js";
5
+ import { BaseGenerator as q, writeDbmlFile as s } from "./generator/common.js";
6
+ import { DbmlBuilder as F } from "./formatter/dbml-builder.js";
7
+ import { DbmlFormatter as d } from "./formatter/dbml.js";
8
+ import { MarkdownFormatter as M } from "./formatter/markdown.js";
9
+ import { MermaidErDiagramFormatter as y } from "./formatter/mermaid.js";
13
10
  export {
14
- F as BaseGenerator,
15
- g as DbmlBuilder,
16
- w as DbmlFormatter,
17
- B as MarkdownFormatter,
18
- c as MermaidErDiagramFormatter,
19
- l as MySqlGenerator,
20
- i as PgGenerator,
21
- q as SqliteGenerator,
22
- a as extractComments,
23
- n as mysqlGenerate,
24
- x as pgGenerate,
25
- s as sqliteGenerate,
26
- b as writeDbmlFile
11
+ q as BaseGenerator,
12
+ F as DbmlBuilder,
13
+ d as DbmlFormatter,
14
+ M as MarkdownFormatter,
15
+ y as MermaidErDiagramFormatter,
16
+ x as MySqlGenerator,
17
+ m as PgGenerator,
18
+ n as SqliteGenerator,
19
+ t as extractComments,
20
+ f as mysqlGenerate,
21
+ a as pgGenerate,
22
+ i as sqliteGenerate,
23
+ s as writeDbmlFile
27
24
  };
28
25
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
@@ -29,7 +29,6 @@ export declare function runCli(args: string[], options?: {
29
29
  */
30
30
  export declare function runGenerate(schemaPath: string, dialect: "postgresql" | "mysql" | "sqlite", options?: {
31
31
  output?: string;
32
- relational?: boolean;
33
32
  format?: "dbml" | "markdown";
34
33
  singleFile?: boolean;
35
34
  noErDiagram?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../../src/test-utils/cli-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,OAAO,CAAC,SAAS,CAAC,CA0CpB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,EAC1C,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACT,GACL,OAAO,CAAC,SAAS,CAAC,CA4BpB"}
1
+ {"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../../src/test-utils/cli-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,OAAO,CAAC,SAAS,CAAC,CA0CpB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,EAC1C,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACT,GACL,OAAO,CAAC,SAAS,CAAC,CAwBpB"}
@@ -67,14 +67,6 @@ export declare function countTables(dbml: string): number;
67
67
  * @returns Number of references
68
68
  */
69
69
  export declare function countRefs(dbml: string): number;
70
- /**
71
- * Check if Markdown output contains a table heading
72
- *
73
- * @param markdown - Markdown output string
74
- * @param tableName - Table name to check
75
- * @returns true if the table heading exists
76
- */
77
- export declare function hasMarkdownTable(markdown: string, tableName: string): boolean;
78
70
  /**
79
71
  * Check if Markdown output contains all expected table headings
80
72
  *
@@ -1 +1 @@
1
- {"version":3,"file":"dbml-validator.d.ts","sourceRoot":"","sources":["../../src/test-utils/dbml-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,GAAE,GAAG,GAAG,GAAS,GACzB,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,GAAE,GAAG,GAAG,GAAS,GACzB,OAAO,CAqBT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,GAAG,GAAG,GAAS,GACzB,OAAO,CAOT;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,GAAG,GAAG,GAAS,GAAG,OAAO,CAqB/F;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,GAAG,GAAG,GAAS,GACzB,OAAO,CAqBT;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAMD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAEpF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D"}
1
+ {"version":3,"file":"dbml-validator.d.ts","sourceRoot":"","sources":["../../src/test-utils/dbml-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,GAAE,GAAG,GAAG,GAAS,GACzB,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,GAAE,GAAG,GAAG,GAAS,GACzB,OAAO,CAqBT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,GAAG,GAAG,GAAS,GACzB,OAAO,CAOT;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,GAAG,GAAG,GAAS,GAAG,OAAO,CAqB/F;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,GAAG,GAAG,GAAS,GACzB,OAAO,CAqBT;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAiBD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAEpF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,4 @@
1
- import { AnyColumn, Table } from 'drizzle-orm';
2
1
  import { SchemaComments } from './parser/comments';
3
- export type { AnyColumn, Table };
4
2
  /**
5
3
  * Options for DBML generation
6
4
  */
@@ -9,8 +7,6 @@ export interface GenerateOptions<TSchema extends Record<string, unknown>> {
9
7
  schema: TSchema;
10
8
  /** Output file path. If provided, DBML will be written to this file */
11
9
  out?: string;
12
- /** If true, uses relations() definitions instead of foreign keys for references */
13
- relational?: boolean;
14
10
  /**
15
11
  * Path to the source schema file or directory for extracting JSDoc comments and relations.
16
12
  * If a directory is provided, all .ts files will be processed recursively.
@@ -23,10 +19,6 @@ export interface GenerateOptions<TSchema extends Record<string, unknown>> {
23
19
  */
24
20
  comments?: SchemaComments;
25
21
  }
26
- /**
27
- * Supported relation types in DBML
28
- */
29
- export type RelationType = "one-to-one" | "one-to-many" | "many-to-one";
30
22
  /**
31
23
  * Internal representation of a reference/relationship
32
24
  */
@@ -39,17 +31,6 @@ export interface GeneratedRef {
39
31
  onDelete?: string;
40
32
  onUpdate?: string;
41
33
  }
42
- /**
43
- * Column constraint attributes for DBML output
44
- */
45
- export interface ColumnAttributes {
46
- primaryKey?: boolean;
47
- notNull?: boolean;
48
- unique?: boolean;
49
- increment?: boolean;
50
- default?: string;
51
- note?: string;
52
- }
53
34
  /**
54
35
  * Supported database types
55
36
  *
@@ -131,7 +112,6 @@ export interface TableDefinition {
131
112
  }
132
113
  /**
133
114
  * Relation types for intermediate schema
134
- * Note: This is more detailed than RelationType used for DBML output
135
115
  */
136
116
  export type IntermediateRelationType = "one-to-one" | "one-to-many" | "many-to-one" | "many-to-many";
137
117
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drizzle-docs-generator",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "A CLI tool that generates DBML files from Drizzle ORM schema definitions.",
5
5
  "keywords": [
6
6
  "cli",
@@ -1,10 +0,0 @@
1
- /**
2
- * Relation adapters for unifying v0 and v1 relation APIs
3
- *
4
- * This module provides adapters that convert both legacy relations() (v0)
5
- * and modern defineRelations() (v1) to a unified format.
6
- */
7
- export type { RelationAdapter, UnifiedRelation } from './types';
8
- export { V0RelationAdapter } from './v0-adapter';
9
- export { V1RelationAdapter } from './v1-adapter';
10
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapter/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,7 +0,0 @@
1
- export type { OutputFormatter, FormatterOptions } from './types';
2
- export type { MermaidFormatterOptions } from './mermaid';
3
- export type { MarkdownFormatterOptions } from './markdown';
4
- export { DbmlFormatter } from './dbml';
5
- export { MarkdownFormatter } from './markdown';
6
- export { MermaidErDiagramFormatter } from './mermaid';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatter/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC"}
@@ -1,16 +0,0 @@
1
- /**
2
- * DBML Generator Module
3
- *
4
- * Provides functions to generate DBML from Drizzle ORM schema definitions.
5
- * Supports PostgreSQL, MySQL, and SQLite dialects.
6
- *
7
- * JSDoc comments can be extracted from source files and included as DBML Note clauses.
8
- * Use the `source` option to specify the schema source file or directory, or pass pre-extracted
9
- * comments via the `comments` option.
10
- */
11
- export { pgGenerate, PgGenerator } from './pg';
12
- export { mysqlGenerate, MySqlGenerator } from './mysql';
13
- export { sqliteGenerate, SqliteGenerator } from './sqlite';
14
- export { BaseGenerator, writeDbmlFile } from './common';
15
- export { DbmlBuilder } from '../formatter/dbml-builder';
16
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1,5 +0,0 @@
1
- export { extractComments } from './comments';
2
- export type { SchemaComments, TableComment, ColumnComment } from './comments';
3
- export { extractRelations } from './relations';
4
- export type { ParsedRelation, SchemaRelations } from './relations';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Test utilities for integration testing
3
- */
4
- export { runCli, runGenerate } from './cli-runner.js';
5
- export type { CliResult } from './cli-runner.js';
6
- export { hasAllTables, hasAllColumns, hasReference, hasIndexes, hasTableNote, countTables, countRefs, } from './dbml-validator.js';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,SAAS,GACV,MAAM,qBAAqB,CAAC"}