drizzle-docs-generator 0.5.4 → 0.5.6

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
@@ -1,6 +1,7 @@
1
1
  # drizzle-docs-generator
2
2
 
3
- [![NPM](https://nodei.co/npm/drizzle-docs-generator.svg?style=shields&data=v,d&color=brightgreen)](https://nodei.co/npm/drizzle-docs-generator/)
3
+ [![NPM](https://nodei.co/npm/drizzle-docs-generator.svg?style=shields&data=v,d&color=brightgreen)](https://www.npmjs.com/package/drizzle-docs-generator)
4
+ [![codecov](https://codecov.io/gh/rikeda71/drizzle-docs-generator/branch/main/graph/badge.svg)](https://codecov.io/gh/rikeda71/drizzle-docs-generator)
4
5
 
5
6
  Drizzle ORM スキーマから DBML と Markdown ドキュメントを生成する CLI。JSDoc コメントを Note 句として出力できる。
6
7
 
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # drizzle-docs-generator
2
2
 
3
- [![NPM](https://nodei.co/npm/drizzle-docs-generator.svg?style=shields&data=v,d&color=brightgreen)](https://nodei.co/npm/drizzle-docs-generator/)
3
+ [![NPM](https://nodei.co/npm/drizzle-docs-generator.svg?style=shields&data=v,d&color=brightgreen)](https://www.npmjs.com/package/drizzle-docs-generator)
4
+ [![codecov](https://codecov.io/gh/rikeda71/drizzle-docs-generator/branch/main/graph/badge.svg)](https://codecov.io/gh/rikeda71/drizzle-docs-generator)
4
5
 
5
6
  CLI tool to generate DBML and Markdown documentation from Drizzle ORM schemas. Extracts JSDoc comments and outputs them as Note clauses.
6
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/formatter/mermaid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,yBAA0B,YAAW,eAAe;IAC/D,OAAO,CAAC,OAAO,CAAoC;IAEnD;;;;OAIG;gBACS,OAAO,GAAE,uBAA4B;IAIjD;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IA4B1C;;;;;;OAMG;IACH,aAAa,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAiDpE;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgBhC;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmCpB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAkCpB;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IAStB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/formatter/mermaid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,yBAA0B,YAAW,eAAe;IAC/D,OAAO,CAAC,OAAO,CAAoC;IAEnD;;;;OAIG;gBACS,OAAO,GAAE,uBAA4B;IAIjD;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IA4B1C;;;;;;OAMG;IACH,aAAa,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAiDpE;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgBhC;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmCpB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAiDpB;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IAStB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
@@ -1,4 +1,4 @@
1
- const c = {
1
+ const u = {
2
2
  includeComments: !0,
3
3
  includeIndexes: !0,
4
4
  includeConstraints: !0,
@@ -12,7 +12,7 @@ class f {
12
12
  * @param options - Formatter options
13
13
  */
14
14
  constructor(e = {}) {
15
- this.options = { ...c, ...e };
15
+ this.options = { ...u, ...e };
16
16
  }
17
17
  /**
18
18
  * Format the intermediate schema into a Mermaid ER diagram
@@ -21,15 +21,15 @@ class f {
21
21
  * @returns Mermaid ER diagram string
22
22
  */
23
23
  format(e) {
24
- const t = ["erDiagram"], o = this.collectForeignKeyColumns(e.relations);
25
- for (const n of e.relations) {
26
- const s = this.formatRelation(n);
27
- s && t.push(` ${s}`);
24
+ const t = ["erDiagram"], n = this.collectForeignKeyColumns(e.relations);
25
+ for (const o of e.relations) {
26
+ const i = this.formatRelation(o);
27
+ i && t.push(` ${i}`);
28
28
  }
29
29
  e.relations.length > 0 && e.tables.length > 0 && t.push("");
30
- for (const n of e.tables) {
31
- const s = this.formatTable(n, o);
32
- t.push(...s);
30
+ for (const o of e.tables) {
31
+ const i = this.formatTable(o, n);
32
+ t.push(...i);
33
33
  }
34
34
  return t.join(`
35
35
  `);
@@ -42,22 +42,22 @@ class f {
42
42
  * @returns Mermaid ER diagram string showing only the focused table and its relations
43
43
  */
44
44
  formatFocused(e, t) {
45
- if (!e.tables.find((a) => a.name === t))
45
+ if (!e.tables.find((s) => s.name === t))
46
46
  return "erDiagram";
47
- const n = /* @__PURE__ */ new Set([t]), s = [];
48
- for (const a of e.relations)
49
- (a.fromTable === t || a.toTable === t) && (n.add(a.fromTable), n.add(a.toTable), s.push(a));
50
- const r = e.tables.filter((a) => n.has(a.name)), m = this.collectForeignKeyColumns(s), i = ["erDiagram"];
51
- for (const a of s) {
52
- const l = this.formatRelation(a);
53
- l && i.push(` ${l}`);
47
+ const o = /* @__PURE__ */ new Set([t]), i = [];
48
+ for (const s of e.relations)
49
+ (s.fromTable === t || s.toTable === t) && (o.add(s.fromTable), o.add(s.toTable), i.push(s));
50
+ const a = e.tables.filter((s) => o.has(s.name)), m = this.collectForeignKeyColumns(i), r = ["erDiagram"];
51
+ for (const s of i) {
52
+ const l = this.formatRelation(s);
53
+ l && r.push(` ${l}`);
54
54
  }
55
- s.length > 0 && r.length > 0 && i.push("");
56
- for (const a of r) {
57
- const l = this.formatTable(a, m);
58
- i.push(...l);
55
+ i.length > 0 && a.length > 0 && r.push("");
56
+ for (const s of a) {
57
+ const l = this.formatTable(s, m);
58
+ r.push(...l);
59
59
  }
60
- return i.join(`
60
+ return r.join(`
61
61
  `);
62
62
  }
63
63
  /**
@@ -65,10 +65,10 @@ class f {
65
65
  */
66
66
  collectForeignKeyColumns(e) {
67
67
  const t = /* @__PURE__ */ new Map();
68
- for (const o of e) {
69
- t.has(o.fromTable) || t.set(o.fromTable, /* @__PURE__ */ new Set());
70
- for (const n of o.fromColumns)
71
- t.get(o.fromTable).add(n);
68
+ for (const n of e) {
69
+ t.has(n.fromTable) || t.set(n.fromTable, /* @__PURE__ */ new Set());
70
+ for (const o of n.fromColumns)
71
+ t.get(n.fromTable).add(o);
72
72
  }
73
73
  return t;
74
74
  }
@@ -76,22 +76,22 @@ class f {
76
76
  * Format a table definition to Mermaid syntax
77
77
  */
78
78
  formatTable(e, t) {
79
- const o = [], n = this.escapeName(e.name), s = t.get(e.name) || /* @__PURE__ */ new Set();
80
- o.push(` ${n} {`);
81
- for (const r of e.columns) {
82
- const m = this.formatColumn(r, s);
83
- o.push(` ${m}`);
79
+ const n = [], o = this.escapeName(e.name), i = t.get(e.name) || /* @__PURE__ */ new Set();
80
+ n.push(` ${o} {`);
81
+ for (const a of e.columns) {
82
+ const m = this.formatColumn(a, i);
83
+ n.push(` ${m}`);
84
84
  }
85
- return o.push(" }"), o;
85
+ return n.push(" }"), n;
86
86
  }
87
87
  /**
88
88
  * Format a column definition to Mermaid syntax
89
89
  */
90
90
  formatColumn(e, t) {
91
- const o = [];
92
- this.options.includeColumnTypes && o.push(this.simplifyType(e.type)), o.push(this.escapeName(e.name));
93
91
  const n = [];
94
- return e.primaryKey && n.push("PK"), t.has(e.name) && n.push("FK"), e.unique && !e.primaryKey && n.push("UK"), n.length > 0 && o.push(n.join(",")), this.options.includeComments && e.comment && o.push(`"${this.escapeString(e.comment)}"`), o.join(" ");
92
+ this.options.includeColumnTypes && n.push(this.simplifyType(e.type)), n.push(this.escapeName(e.name));
93
+ const o = [];
94
+ return e.primaryKey && o.push("PK"), t.has(e.name) && o.push("FK"), e.unique && !e.primaryKey && o.push("UK"), o.length > 0 && n.push(o.join(",")), this.options.includeComments && e.comment && n.push(`"${this.escapeString(e.comment)}"`), n.join(" ");
95
95
  }
96
96
  /**
97
97
  * Simplify SQL type for Mermaid display
@@ -112,18 +112,33 @@ class f {
112
112
  boolean: "boolean",
113
113
  timestamp: "timestamp",
114
114
  timestamptz: "timestamptz",
115
+ "timestamp with time zone": "timestamptz",
116
+ "time with time zone": "timetz",
115
117
  date: "date",
116
118
  time: "time",
119
+ timetz: "timetz",
117
120
  json: "json",
118
121
  jsonb: "jsonb",
119
122
  uuid: "uuid",
120
123
  real: "real",
121
124
  float: "float",
122
125
  double: "double",
126
+ "double precision": "double",
123
127
  decimal: "decimal",
124
128
  numeric: "numeric",
125
129
  blob: "blob",
126
- bytea: "bytea"
130
+ bytea: "bytea",
131
+ // MySQL types
132
+ tinyint: "tinyint",
133
+ mediumint: "mediumint",
134
+ // MySQL unsigned types (u-prefix for distinction)
135
+ "tinyint unsigned": "utinyint",
136
+ "smallint unsigned": "usmallint",
137
+ "mediumint unsigned": "umediumint",
138
+ "int unsigned": "uint",
139
+ "bigint unsigned": "ubigint",
140
+ "float unsigned": "ufloat",
141
+ "double unsigned": "udouble"
127
142
  }[t] || t;
128
143
  }
129
144
  /**
@@ -136,8 +151,8 @@ class f {
136
151
  * - }o--o{ : many-to-many
137
152
  */
138
153
  formatRelation(e) {
139
- const t = this.escapeName(e.fromTable), o = this.escapeName(e.toTable), n = this.getRelationSymbol(e.type), s = e.fromColumns.join(", ");
140
- return `${t} ${n} ${o} : "${s}"`;
154
+ const t = this.escapeName(e.fromTable), n = this.escapeName(e.toTable), o = this.getRelationSymbol(e.type), i = e.fromColumns.join(", ");
155
+ return `${t} ${o} ${n} : "${i}"`;
141
156
  }
142
157
  /**
143
158
  * Convert IntermediateRelationType to Mermaid relation symbol
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid.js","sources":["../../src/formatter/mermaid.ts"],"sourcesContent":["import type {\n IntermediateSchema,\n TableDefinition,\n ColumnDefinition,\n RelationDefinition,\n} from \"../types\";\nimport type { OutputFormatter, FormatterOptions } from \"./types\";\n\n/**\n * Options for MermaidErDiagramFormatter\n */\nexport interface MermaidFormatterOptions extends FormatterOptions {\n /**\n * Whether to include column types in the diagram\n * @default true\n */\n includeColumnTypes?: boolean;\n}\n\n/**\n * Default formatter options\n */\nconst DEFAULT_OPTIONS: Required<MermaidFormatterOptions> = {\n includeComments: true,\n includeIndexes: true,\n includeConstraints: true,\n includeColumnTypes: true,\n};\n\n/**\n * MermaidErDiagramFormatter generates Mermaid ER diagram syntax from IntermediateSchema\n *\n * This formatter creates Mermaid-compatible ER diagrams that can be rendered\n * in GitHub, GitLab, or any Mermaid-supporting platform.\n *\n * @example\n * ```typescript\n * const formatter = new MermaidErDiagramFormatter();\n * const mermaid = formatter.format(schema);\n * // Output:\n * // erDiagram\n * // users ||--o{ posts : \"author_id\"\n * // users {\n * // int id PK\n * // varchar username\n * // }\n * ```\n *\n * @see https://mermaid.js.org/syntax/entityRelationshipDiagram.html\n */\nexport class MermaidErDiagramFormatter implements OutputFormatter {\n private options: Required<MermaidFormatterOptions>;\n\n /**\n * Create a new MermaidErDiagramFormatter\n *\n * @param options - Formatter options\n */\n constructor(options: MermaidFormatterOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Format the intermediate schema into a Mermaid ER diagram\n *\n * @param schema - The intermediate schema to format\n * @returns Mermaid ER diagram string\n */\n format(schema: IntermediateSchema): string {\n const lines: string[] = [\"erDiagram\"];\n\n // Collect foreign key columns for FK markers\n const fkColumns = this.collectForeignKeyColumns(schema.relations);\n\n // Generate relations first (at the top of the diagram)\n for (const relation of schema.relations) {\n const relationLine = this.formatRelation(relation);\n if (relationLine) {\n lines.push(` ${relationLine}`);\n }\n }\n\n // Add blank line between relations and tables if there are both\n if (schema.relations.length > 0 && schema.tables.length > 0) {\n lines.push(\"\");\n }\n\n // Generate tables\n for (const table of schema.tables) {\n const tableLines = this.formatTable(table, fkColumns);\n lines.push(...tableLines);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Format a focused ER diagram showing only a specific table and its related tables\n *\n * @param schema - The intermediate schema\n * @param tableName - The name of the table to focus on\n * @returns Mermaid ER diagram string showing only the focused table and its relations\n */\n formatFocused(schema: IntermediateSchema, tableName: string): string {\n // Find the target table\n const targetTable = schema.tables.find((t) => t.name === tableName);\n if (!targetTable) {\n return \"erDiagram\";\n }\n\n // Find related tables through relations\n const relatedTableNames = new Set<string>([tableName]);\n const relevantRelations: RelationDefinition[] = [];\n\n for (const relation of schema.relations) {\n if (relation.fromTable === tableName || relation.toTable === tableName) {\n relatedTableNames.add(relation.fromTable);\n relatedTableNames.add(relation.toTable);\n relevantRelations.push(relation);\n }\n }\n\n // Filter tables to only include related ones\n const relevantTables = schema.tables.filter((t) => relatedTableNames.has(t.name));\n\n // Collect foreign key columns for FK markers\n const fkColumns = this.collectForeignKeyColumns(relevantRelations);\n\n const lines: string[] = [\"erDiagram\"];\n\n // Generate relations\n for (const relation of relevantRelations) {\n const relationLine = this.formatRelation(relation);\n if (relationLine) {\n lines.push(` ${relationLine}`);\n }\n }\n\n // Add blank line between relations and tables if there are both\n if (relevantRelations.length > 0 && relevantTables.length > 0) {\n lines.push(\"\");\n }\n\n // Generate tables\n for (const table of relevantTables) {\n const tableLines = this.formatTable(table, fkColumns);\n lines.push(...tableLines);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Collect foreign key columns from relations for FK marker assignment\n */\n private collectForeignKeyColumns(relations: RelationDefinition[]): Map<string, Set<string>> {\n const fkColumns = new Map<string, Set<string>>();\n\n for (const relation of relations) {\n // The \"from\" side of the relation has the FK column\n if (!fkColumns.has(relation.fromTable)) {\n fkColumns.set(relation.fromTable, new Set());\n }\n for (const col of relation.fromColumns) {\n fkColumns.get(relation.fromTable)!.add(col);\n }\n }\n\n return fkColumns;\n }\n\n /**\n * Format a table definition to Mermaid syntax\n */\n private formatTable(table: TableDefinition, fkColumns: Map<string, Set<string>>): string[] {\n const lines: string[] = [];\n const tableName = this.escapeName(table.name);\n const tableFkColumns = fkColumns.get(table.name) || new Set();\n\n lines.push(` ${tableName} {`);\n\n for (const column of table.columns) {\n const columnLine = this.formatColumn(column, tableFkColumns);\n lines.push(` ${columnLine}`);\n }\n\n lines.push(\" }\");\n\n return lines;\n }\n\n /**\n * Format a column definition to Mermaid syntax\n */\n private formatColumn(column: ColumnDefinition, fkColumns: Set<string>): string {\n const parts: string[] = [];\n\n // Column type (simplified for Mermaid)\n if (this.options.includeColumnTypes) {\n parts.push(this.simplifyType(column.type));\n }\n\n // Column name\n parts.push(this.escapeName(column.name));\n\n // PK/FK markers\n const markers: string[] = [];\n if (column.primaryKey) {\n markers.push(\"PK\");\n }\n if (fkColumns.has(column.name)) {\n markers.push(\"FK\");\n }\n if (column.unique && !column.primaryKey) {\n markers.push(\"UK\");\n }\n\n if (markers.length > 0) {\n parts.push(markers.join(\",\"));\n }\n\n // Add comment as Mermaid comment (quoted string after markers)\n if (this.options.includeComments && column.comment) {\n parts.push(`\"${this.escapeString(column.comment)}\"`);\n }\n\n return parts.join(\" \");\n }\n\n /**\n * Simplify SQL type for Mermaid display\n *\n * Mermaid ER diagrams work best with simple type names\n */\n private simplifyType(type: string): string {\n // Remove parentheses content for cleaner display (e.g., varchar(255) -> varchar)\n const simplified = type.replace(/\\([^)]*\\)/g, \"\").toLowerCase();\n\n // Map common types to shorter versions\n const typeMap: Record<string, string> = {\n integer: \"int\",\n bigint: \"bigint\",\n smallint: \"smallint\",\n serial: \"serial\",\n bigserial: \"bigserial\",\n text: \"text\",\n varchar: \"varchar\",\n char: \"char\",\n boolean: \"boolean\",\n timestamp: \"timestamp\",\n timestamptz: \"timestamptz\",\n date: \"date\",\n time: \"time\",\n json: \"json\",\n jsonb: \"jsonb\",\n uuid: \"uuid\",\n real: \"real\",\n float: \"float\",\n double: \"double\",\n decimal: \"decimal\",\n numeric: \"numeric\",\n blob: \"blob\",\n bytea: \"bytea\",\n };\n\n return typeMap[simplified] || simplified;\n }\n\n /**\n * Format a relation definition to Mermaid syntax\n *\n * Mermaid ER diagram relation syntax:\n * - ||--|| : one-to-one\n * - ||--o{ : one-to-many\n * - }o--|| : many-to-one\n * - }o--o{ : many-to-many\n */\n private formatRelation(relation: RelationDefinition): string {\n const fromTable = this.escapeName(relation.fromTable);\n const toTable = this.escapeName(relation.toTable);\n const symbol = this.getRelationSymbol(relation.type);\n const label = relation.fromColumns.join(\", \");\n\n return `${fromTable} ${symbol} ${toTable} : \"${label}\"`;\n }\n\n /**\n * Convert IntermediateRelationType to Mermaid relation symbol\n *\n * @see https://mermaid.js.org/syntax/entityRelationshipDiagram.html#relationship-syntax\n */\n private getRelationSymbol(type: RelationDefinition[\"type\"]): string {\n switch (type) {\n case \"one-to-one\":\n return \"||--||\";\n case \"one-to-many\":\n return \"||--o{\";\n case \"many-to-one\":\n return \"}o--||\";\n case \"many-to-many\":\n return \"}o--o{\";\n }\n }\n\n /**\n * Escape a name for Mermaid if it contains special characters\n *\n * Mermaid entity names should be alphanumeric with underscores\n */\n private escapeName(name: string): string {\n // Mermaid accepts alphanumeric and underscores\n // For names with special characters, we need to quote them\n if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n return name;\n }\n // Replace special characters with underscores for Mermaid compatibility\n return name.replace(/[^a-zA-Z0-9_]/g, \"_\");\n }\n\n /**\n * Escape a string for use in Mermaid quoted strings\n */\n private escapeString(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \" \");\n }\n}\n"],"names":["DEFAULT_OPTIONS","MermaidErDiagramFormatter","options","schema","lines","fkColumns","relation","relationLine","table","tableLines","tableName","t","relatedTableNames","relevantRelations","relevantTables","relations","col","tableFkColumns","column","columnLine","parts","markers","type","simplified","fromTable","toTable","symbol","label","name","str"],"mappings":"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"}
1
+ {"version":3,"file":"mermaid.js","sources":["../../src/formatter/mermaid.ts"],"sourcesContent":["import type {\n IntermediateSchema,\n TableDefinition,\n ColumnDefinition,\n RelationDefinition,\n} from \"../types\";\nimport type { OutputFormatter, FormatterOptions } from \"./types\";\n\n/**\n * Options for MermaidErDiagramFormatter\n */\nexport interface MermaidFormatterOptions extends FormatterOptions {\n /**\n * Whether to include column types in the diagram\n * @default true\n */\n includeColumnTypes?: boolean;\n}\n\n/**\n * Default formatter options\n */\nconst DEFAULT_OPTIONS: Required<MermaidFormatterOptions> = {\n includeComments: true,\n includeIndexes: true,\n includeConstraints: true,\n includeColumnTypes: true,\n};\n\n/**\n * MermaidErDiagramFormatter generates Mermaid ER diagram syntax from IntermediateSchema\n *\n * This formatter creates Mermaid-compatible ER diagrams that can be rendered\n * in GitHub, GitLab, or any Mermaid-supporting platform.\n *\n * @example\n * ```typescript\n * const formatter = new MermaidErDiagramFormatter();\n * const mermaid = formatter.format(schema);\n * // Output:\n * // erDiagram\n * // users ||--o{ posts : \"author_id\"\n * // users {\n * // int id PK\n * // varchar username\n * // }\n * ```\n *\n * @see https://mermaid.js.org/syntax/entityRelationshipDiagram.html\n */\nexport class MermaidErDiagramFormatter implements OutputFormatter {\n private options: Required<MermaidFormatterOptions>;\n\n /**\n * Create a new MermaidErDiagramFormatter\n *\n * @param options - Formatter options\n */\n constructor(options: MermaidFormatterOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Format the intermediate schema into a Mermaid ER diagram\n *\n * @param schema - The intermediate schema to format\n * @returns Mermaid ER diagram string\n */\n format(schema: IntermediateSchema): string {\n const lines: string[] = [\"erDiagram\"];\n\n // Collect foreign key columns for FK markers\n const fkColumns = this.collectForeignKeyColumns(schema.relations);\n\n // Generate relations first (at the top of the diagram)\n for (const relation of schema.relations) {\n const relationLine = this.formatRelation(relation);\n if (relationLine) {\n lines.push(` ${relationLine}`);\n }\n }\n\n // Add blank line between relations and tables if there are both\n if (schema.relations.length > 0 && schema.tables.length > 0) {\n lines.push(\"\");\n }\n\n // Generate tables\n for (const table of schema.tables) {\n const tableLines = this.formatTable(table, fkColumns);\n lines.push(...tableLines);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Format a focused ER diagram showing only a specific table and its related tables\n *\n * @param schema - The intermediate schema\n * @param tableName - The name of the table to focus on\n * @returns Mermaid ER diagram string showing only the focused table and its relations\n */\n formatFocused(schema: IntermediateSchema, tableName: string): string {\n // Find the target table\n const targetTable = schema.tables.find((t) => t.name === tableName);\n if (!targetTable) {\n return \"erDiagram\";\n }\n\n // Find related tables through relations\n const relatedTableNames = new Set<string>([tableName]);\n const relevantRelations: RelationDefinition[] = [];\n\n for (const relation of schema.relations) {\n if (relation.fromTable === tableName || relation.toTable === tableName) {\n relatedTableNames.add(relation.fromTable);\n relatedTableNames.add(relation.toTable);\n relevantRelations.push(relation);\n }\n }\n\n // Filter tables to only include related ones\n const relevantTables = schema.tables.filter((t) => relatedTableNames.has(t.name));\n\n // Collect foreign key columns for FK markers\n const fkColumns = this.collectForeignKeyColumns(relevantRelations);\n\n const lines: string[] = [\"erDiagram\"];\n\n // Generate relations\n for (const relation of relevantRelations) {\n const relationLine = this.formatRelation(relation);\n if (relationLine) {\n lines.push(` ${relationLine}`);\n }\n }\n\n // Add blank line between relations and tables if there are both\n if (relevantRelations.length > 0 && relevantTables.length > 0) {\n lines.push(\"\");\n }\n\n // Generate tables\n for (const table of relevantTables) {\n const tableLines = this.formatTable(table, fkColumns);\n lines.push(...tableLines);\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Collect foreign key columns from relations for FK marker assignment\n */\n private collectForeignKeyColumns(relations: RelationDefinition[]): Map<string, Set<string>> {\n const fkColumns = new Map<string, Set<string>>();\n\n for (const relation of relations) {\n // The \"from\" side of the relation has the FK column\n if (!fkColumns.has(relation.fromTable)) {\n fkColumns.set(relation.fromTable, new Set());\n }\n for (const col of relation.fromColumns) {\n fkColumns.get(relation.fromTable)!.add(col);\n }\n }\n\n return fkColumns;\n }\n\n /**\n * Format a table definition to Mermaid syntax\n */\n private formatTable(table: TableDefinition, fkColumns: Map<string, Set<string>>): string[] {\n const lines: string[] = [];\n const tableName = this.escapeName(table.name);\n const tableFkColumns = fkColumns.get(table.name) || new Set();\n\n lines.push(` ${tableName} {`);\n\n for (const column of table.columns) {\n const columnLine = this.formatColumn(column, tableFkColumns);\n lines.push(` ${columnLine}`);\n }\n\n lines.push(\" }\");\n\n return lines;\n }\n\n /**\n * Format a column definition to Mermaid syntax\n */\n private formatColumn(column: ColumnDefinition, fkColumns: Set<string>): string {\n const parts: string[] = [];\n\n // Column type (simplified for Mermaid)\n if (this.options.includeColumnTypes) {\n parts.push(this.simplifyType(column.type));\n }\n\n // Column name\n parts.push(this.escapeName(column.name));\n\n // PK/FK markers\n const markers: string[] = [];\n if (column.primaryKey) {\n markers.push(\"PK\");\n }\n if (fkColumns.has(column.name)) {\n markers.push(\"FK\");\n }\n if (column.unique && !column.primaryKey) {\n markers.push(\"UK\");\n }\n\n if (markers.length > 0) {\n parts.push(markers.join(\",\"));\n }\n\n // Add comment as Mermaid comment (quoted string after markers)\n if (this.options.includeComments && column.comment) {\n parts.push(`\"${this.escapeString(column.comment)}\"`);\n }\n\n return parts.join(\" \");\n }\n\n /**\n * Simplify SQL type for Mermaid display\n *\n * Mermaid ER diagrams work best with simple type names\n */\n private simplifyType(type: string): string {\n // Remove parentheses content for cleaner display (e.g., varchar(255) -> varchar)\n const simplified = type.replace(/\\([^)]*\\)/g, \"\").toLowerCase();\n\n // Map common types to shorter versions\n const typeMap: Record<string, string> = {\n integer: \"int\",\n bigint: \"bigint\",\n smallint: \"smallint\",\n serial: \"serial\",\n bigserial: \"bigserial\",\n text: \"text\",\n varchar: \"varchar\",\n char: \"char\",\n boolean: \"boolean\",\n timestamp: \"timestamp\",\n timestamptz: \"timestamptz\",\n \"timestamp with time zone\": \"timestamptz\",\n \"time with time zone\": \"timetz\",\n date: \"date\",\n time: \"time\",\n timetz: \"timetz\",\n json: \"json\",\n jsonb: \"jsonb\",\n uuid: \"uuid\",\n real: \"real\",\n float: \"float\",\n double: \"double\",\n \"double precision\": \"double\",\n decimal: \"decimal\",\n numeric: \"numeric\",\n blob: \"blob\",\n bytea: \"bytea\",\n // MySQL types\n tinyint: \"tinyint\",\n mediumint: \"mediumint\",\n // MySQL unsigned types (u-prefix for distinction)\n \"tinyint unsigned\": \"utinyint\",\n \"smallint unsigned\": \"usmallint\",\n \"mediumint unsigned\": \"umediumint\",\n \"int unsigned\": \"uint\",\n \"bigint unsigned\": \"ubigint\",\n \"float unsigned\": \"ufloat\",\n \"double unsigned\": \"udouble\",\n };\n\n return typeMap[simplified] || simplified;\n }\n\n /**\n * Format a relation definition to Mermaid syntax\n *\n * Mermaid ER diagram relation syntax:\n * - ||--|| : one-to-one\n * - ||--o{ : one-to-many\n * - }o--|| : many-to-one\n * - }o--o{ : many-to-many\n */\n private formatRelation(relation: RelationDefinition): string {\n const fromTable = this.escapeName(relation.fromTable);\n const toTable = this.escapeName(relation.toTable);\n const symbol = this.getRelationSymbol(relation.type);\n const label = relation.fromColumns.join(\", \");\n\n return `${fromTable} ${symbol} ${toTable} : \"${label}\"`;\n }\n\n /**\n * Convert IntermediateRelationType to Mermaid relation symbol\n *\n * @see https://mermaid.js.org/syntax/entityRelationshipDiagram.html#relationship-syntax\n */\n private getRelationSymbol(type: RelationDefinition[\"type\"]): string {\n switch (type) {\n case \"one-to-one\":\n return \"||--||\";\n case \"one-to-many\":\n return \"||--o{\";\n case \"many-to-one\":\n return \"}o--||\";\n case \"many-to-many\":\n return \"}o--o{\";\n }\n }\n\n /**\n * Escape a name for Mermaid if it contains special characters\n *\n * Mermaid entity names should be alphanumeric with underscores\n */\n private escapeName(name: string): string {\n // Mermaid accepts alphanumeric and underscores\n // For names with special characters, we need to quote them\n if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n return name;\n }\n // Replace special characters with underscores for Mermaid compatibility\n return name.replace(/[^a-zA-Z0-9_]/g, \"_\");\n }\n\n /**\n * Escape a string for use in Mermaid quoted strings\n */\n private escapeString(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \" \");\n }\n}\n"],"names":["DEFAULT_OPTIONS","MermaidErDiagramFormatter","options","schema","lines","fkColumns","relation","relationLine","table","tableLines","tableName","t","relatedTableNames","relevantRelations","relevantTables","relations","col","tableFkColumns","column","columnLine","parts","markers","type","simplified","fromTable","toTable","symbol","label","name","str"],"mappings":"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"}
@@ -7,7 +7,6 @@ import { SchemaRelations } from '../parser/relations';
7
7
  * Configuration for different database dialects
8
8
  */
9
9
  export interface DialectConfig {
10
- escapeName: (name: string) => string;
11
10
  isIncrement: (column: AnyColumn) => boolean;
12
11
  }
13
12
  /**
@@ -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 +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 } 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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"}
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 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/generator/mysql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAiB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,cAAc,CACzB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjE,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC9B,SAAS,CAAC,aAAa,EAAE,aAAa,CAMpC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,MAAM,CASR"}
1
+ {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/generator/mysql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAiB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,cAAc,CACzB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjE,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC9B,SAAS,CAAC,aAAa,EAAE,aAAa,CAKpC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,MAAM,CASR"}
@@ -1,16 +1,15 @@
1
1
  import { BaseGenerator as n, writeDbmlFile as a } from "./common.js";
2
2
  class o extends n {
3
3
  dialectConfig = {
4
- escapeName: (r) => `\`${r}\``,
5
4
  isIncrement: (r) => r.autoIncrement === !0
6
5
  };
7
6
  }
8
- function m(e) {
7
+ function l(e) {
9
8
  const t = new o(e).generate();
10
9
  return e.out && a(e.out, t), t;
11
10
  }
12
11
  export {
13
12
  o as MySqlGenerator,
14
- m as mysqlGenerate
13
+ l as mysqlGenerate
15
14
  };
16
15
  //# sourceMappingURL=mysql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mysql.js","sources":["../../src/generator/mysql.ts"],"sourcesContent":["import type { AnyColumn } from \"drizzle-orm\";\nimport { BaseGenerator, writeDbmlFile, type DialectConfig } from \"./common\";\nimport type { GenerateOptions } from \"../types\";\n\n/**\n * MySQL-specific DBML generator\n *\n * Supports JSDoc comment extraction via `sourceFile` or `comments` options.\n * Comments are included as DBML Note clauses for tables and columns.\n */\nexport class MySqlGenerator<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseGenerator<TSchema> {\n protected dialectConfig: DialectConfig = {\n escapeName: (name: string) => `\\`${name}\\``,\n isIncrement: (column: AnyColumn) => {\n // MySQL uses autoincrement property\n return (column as unknown as { autoIncrement?: boolean }).autoIncrement === true;\n },\n };\n}\n\n/**\n * Generate DBML from a MySQL Drizzle schema\n *\n * @example\n * ```ts\n * import { mysqlTable, serial, text, varchar } from \"drizzle-orm/mysql-core\";\n * import { mysqlGenerate } from \"drizzle-docs-generator\";\n *\n * const users = mysqlTable(\"users\", {\n * id: serial(\"id\").primaryKey(),\n * name: text(\"name\").notNull(),\n * email: varchar(\"email\", { length: 255 }).unique(),\n * });\n *\n * const dbml = mysqlGenerate({ schema: { users } });\n * console.log(dbml);\n * ```\n *\n * To include JSDoc comments as DBML Note clauses, use the `source` option:\n * ```typescript\n * const dbml = mysqlGenerate({ schema: { users }, source: \"./schema.ts\" });\n * ```\n */\nexport function mysqlGenerate<TSchema extends Record<string, unknown>>(\n options: GenerateOptions<TSchema>,\n): string {\n const generator = new MySqlGenerator(options);\n const dbml = generator.generate();\n\n if (options.out) {\n writeDbmlFile(options.out, dbml);\n }\n\n return dbml;\n}\n"],"names":["MySqlGenerator","BaseGenerator","name","column","mysqlGenerate","options","dbml","writeDbmlFile"],"mappings":";AAUO,MAAMA,UAEHC,EAAuB;AAAA,EACrB,gBAA+B;AAAA,IACvC,YAAY,CAACC,MAAiB,KAAKA,CAAI;AAAA,IACvC,aAAa,CAACC,MAEJA,EAAkD,kBAAkB;AAAA,EAC9E;AAEJ;AAyBO,SAASC,EACdC,GACQ;AAER,QAAMC,IADY,IAAIN,EAAeK,CAAO,EACrB,SAAA;AAEvB,SAAIA,EAAQ,OACVE,EAAcF,EAAQ,KAAKC,CAAI,GAG1BA;AACT;"}
1
+ {"version":3,"file":"mysql.js","sources":["../../src/generator/mysql.ts"],"sourcesContent":["import type { AnyColumn } from \"drizzle-orm\";\nimport { BaseGenerator, writeDbmlFile, type DialectConfig } from \"./common\";\nimport type { GenerateOptions } from \"../types\";\n\n/**\n * MySQL-specific DBML generator\n *\n * Supports JSDoc comment extraction via `sourceFile` or `comments` options.\n * Comments are included as DBML Note clauses for tables and columns.\n */\nexport class MySqlGenerator<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseGenerator<TSchema> {\n protected dialectConfig: DialectConfig = {\n isIncrement: (column: AnyColumn) => {\n // MySQL uses autoincrement property\n return (column as unknown as { autoIncrement?: boolean }).autoIncrement === true;\n },\n };\n}\n\n/**\n * Generate DBML from a MySQL Drizzle schema\n *\n * @example\n * ```ts\n * import { mysqlTable, serial, text, varchar } from \"drizzle-orm/mysql-core\";\n * import { mysqlGenerate } from \"drizzle-docs-generator\";\n *\n * const users = mysqlTable(\"users\", {\n * id: serial(\"id\").primaryKey(),\n * name: text(\"name\").notNull(),\n * email: varchar(\"email\", { length: 255 }).unique(),\n * });\n *\n * const dbml = mysqlGenerate({ schema: { users } });\n * console.log(dbml);\n * ```\n *\n * To include JSDoc comments as DBML Note clauses, use the `source` option:\n * ```typescript\n * const dbml = mysqlGenerate({ schema: { users }, source: \"./schema.ts\" });\n * ```\n */\nexport function mysqlGenerate<TSchema extends Record<string, unknown>>(\n options: GenerateOptions<TSchema>,\n): string {\n const generator = new MySqlGenerator(options);\n const dbml = generator.generate();\n\n if (options.out) {\n writeDbmlFile(options.out, dbml);\n }\n\n return dbml;\n}\n"],"names":["MySqlGenerator","BaseGenerator","column","mysqlGenerate","options","dbml","writeDbmlFile"],"mappings":";AAUO,MAAMA,UAEHC,EAAuB;AAAA,EACrB,gBAA+B;AAAA,IACvC,aAAa,CAACC,MAEJA,EAAkD,kBAAkB;AAAA,EAC9E;AAEJ;AAyBO,SAASC,EACdC,GACQ;AAER,QAAMC,IADY,IAAIL,EAAeI,CAAO,EACrB,SAAA;AAEvB,SAAIA,EAAQ,OACVE,EAAcF,EAAQ,KAAKC,CAAI,GAG1BA;AACT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../../src/generator/pg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAiB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEhE;;;;;GAKG;AACH,qBAAa,WAAW,CACtB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjE,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC9B,SAAS,CAAC,aAAa,EAAE,aAAa,CAMpC;IAEF;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;;;;;;OAOG;cACgB,sBAAsB,IAAI,cAAc,EAAE;CAa9D;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,MAAM,CASR"}
1
+ {"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../../src/generator/pg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAiB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEhE;;;;;GAKG;AACH,qBAAa,WAAW,CACtB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjE,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC9B,SAAS,CAAC,aAAa,EAAE,aAAa,CAKpC;IAEF;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;;;;;;OAOG;cACgB,sBAAsB,IAAI,cAAc,EAAE;CAa9D;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,MAAM,CASR"}
@@ -1,9 +1,8 @@
1
- import { getTableColumns as c } from "drizzle-orm";
2
- import { PgEnumColumn as u } from "drizzle-orm/pg-core";
3
- import { BaseGenerator as a, writeDbmlFile as l } from "./common.js";
4
- class i extends a {
1
+ import { getTableColumns as u } from "drizzle-orm";
2
+ import { PgEnumColumn as c } from "drizzle-orm/pg-core";
3
+ import { BaseGenerator as l, writeDbmlFile as a } from "./common.js";
4
+ class i extends l {
5
5
  dialectConfig = {
6
- escapeName: (e) => `"${e}"`,
7
6
  isIncrement: (e) => e.getSQLType().toLowerCase().includes("serial")
8
7
  };
9
8
  /**
@@ -12,9 +11,9 @@ class i extends a {
12
11
  collectEnums() {
13
12
  const e = /* @__PURE__ */ new Map(), n = this.getTables();
14
13
  for (const s of n) {
15
- const r = c(s);
14
+ const r = u(s);
16
15
  for (const m of Object.values(r))
17
- if (m instanceof u) {
16
+ if (m instanceof c) {
18
17
  const o = m.enum;
19
18
  o && !e.has(o.enumName) && e.set(o.enumName, o.enumValues);
20
19
  }
@@ -39,12 +38,12 @@ class i extends a {
39
38
  return n;
40
39
  }
41
40
  }
42
- function b(t) {
41
+ function p(t) {
43
42
  const n = new i(t).generate();
44
- return t.out && l(t.out, n), n;
43
+ return t.out && a(t.out, n), n;
45
44
  }
46
45
  export {
47
46
  i as PgGenerator,
48
- b as pgGenerate
47
+ p as pgGenerate
49
48
  };
50
49
  //# sourceMappingURL=pg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pg.js","sources":["../../src/generator/pg.ts"],"sourcesContent":["import { type AnyColumn, getTableColumns } from \"drizzle-orm\";\nimport { PgEnumColumn } from \"drizzle-orm/pg-core\";\nimport { BaseGenerator, writeDbmlFile, type DialectConfig } from \"./common\";\nimport type { GenerateOptions, EnumDefinition } from \"../types\";\n\n/**\n * PostgreSQL-specific DBML generator\n *\n * Supports JSDoc comment extraction via `sourceFile` or `comments` options.\n * Comments are included as DBML Note clauses for tables and columns.\n */\nexport class PgGenerator<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseGenerator<TSchema> {\n protected dialectConfig: DialectConfig = {\n escapeName: (name: string) => `\"${name}\"`,\n isIncrement: (column: AnyColumn) => {\n const sqlType = column.getSQLType().toLowerCase();\n return sqlType.includes(\"serial\");\n },\n };\n\n /**\n * Collect all enum types from the schema\n */\n private collectEnums(): Map<string, string[]> {\n const enums = new Map<string, string[]>();\n const tables = this.getTables();\n\n for (const table of tables) {\n const columns = getTableColumns(table);\n\n for (const column of Object.values(columns)) {\n if (column instanceof PgEnumColumn) {\n const enumObj = (\n column as unknown as { enum: { enumName: string; enumValues: string[] } }\n ).enum;\n if (enumObj && !enums.has(enumObj.enumName)) {\n enums.set(enumObj.enumName, enumObj.enumValues);\n }\n }\n }\n }\n\n return enums;\n }\n\n /**\n * Collect enum definitions for intermediate schema\n *\n * Overrides the base implementation to extract PostgreSQL enum types\n * from enum columns in the schema.\n *\n * @returns Array of enum definitions\n */\n protected override collectEnumDefinitions(): EnumDefinition[] {\n const enums = this.collectEnums();\n const enumDefinitions: EnumDefinition[] = [];\n\n for (const [name, values] of enums) {\n enumDefinitions.push({\n name,\n values,\n });\n }\n\n return enumDefinitions;\n }\n}\n\n/**\n * Generate DBML from a PostgreSQL Drizzle schema\n *\n * @example\n * ```ts\n * import { pgTable, serial, text, varchar } from \"drizzle-orm/pg-core\";\n * import { pgGenerate } from \"drizzle-docs-generator\";\n *\n * const users = pgTable(\"users\", {\n * id: serial(\"id\").primaryKey(),\n * name: text(\"name\").notNull(),\n * email: varchar(\"email\", { length: 255 }).unique(),\n * });\n *\n * const dbml = pgGenerate({ schema: { users } });\n * console.log(dbml);\n * ```\n *\n * To include JSDoc comments as DBML Note clauses, use the `source` option:\n * ```typescript\n * const dbml = pgGenerate({ schema: { users }, source: \"./schema.ts\" });\n * ```\n */\nexport function pgGenerate<TSchema extends Record<string, unknown>>(\n options: GenerateOptions<TSchema>,\n): string {\n const generator = new PgGenerator(options);\n const dbml = generator.generate();\n\n if (options.out) {\n writeDbmlFile(options.out, dbml);\n }\n\n return dbml;\n}\n"],"names":["PgGenerator","BaseGenerator","name","column","enums","tables","table","columns","getTableColumns","PgEnumColumn","enumObj","enumDefinitions","values","pgGenerate","options","dbml","writeDbmlFile"],"mappings":";;;AAWO,MAAMA,UAEHC,EAAuB;AAAA,EACrB,gBAA+B;AAAA,IACvC,YAAY,CAACC,MAAiB,IAAIA,CAAI;AAAA,IACtC,aAAa,CAACC,MACIA,EAAO,WAAA,EAAa,YAAA,EACrB,SAAS,QAAQ;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMM,eAAsC;AAC5C,UAAMC,wBAAY,IAAA,GACZC,IAAS,KAAK,UAAA;AAEpB,eAAWC,KAASD,GAAQ;AAC1B,YAAME,IAAUC,EAAgBF,CAAK;AAErC,iBAAWH,KAAU,OAAO,OAAOI,CAAO;AACxC,YAAIJ,aAAkBM,GAAc;AAClC,gBAAMC,IACJP,EACA;AACF,UAAIO,KAAW,CAACN,EAAM,IAAIM,EAAQ,QAAQ,KACxCN,EAAM,IAAIM,EAAQ,UAAUA,EAAQ,UAAU;AAAA,QAElD;AAAA,IAEJ;AAEA,WAAON;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUmB,yBAA2C;AAC5D,UAAMA,IAAQ,KAAK,aAAA,GACbO,IAAoC,CAAA;AAE1C,eAAW,CAACT,GAAMU,CAAM,KAAKR;AAC3B,MAAAO,EAAgB,KAAK;AAAA,QACnB,MAAAT;AAAA,QACA,QAAAU;AAAA,MAAA,CACD;AAGH,WAAOD;AAAA,EACT;AACF;AAyBO,SAASE,EACdC,GACQ;AAER,QAAMC,IADY,IAAIf,EAAYc,CAAO,EAClB,SAAA;AAEvB,SAAIA,EAAQ,OACVE,EAAcF,EAAQ,KAAKC,CAAI,GAG1BA;AACT;"}
1
+ {"version":3,"file":"pg.js","sources":["../../src/generator/pg.ts"],"sourcesContent":["import { type AnyColumn, getTableColumns } from \"drizzle-orm\";\nimport { PgEnumColumn } from \"drizzle-orm/pg-core\";\nimport { BaseGenerator, writeDbmlFile, type DialectConfig } from \"./common\";\nimport type { GenerateOptions, EnumDefinition } from \"../types\";\n\n/**\n * PostgreSQL-specific DBML generator\n *\n * Supports JSDoc comment extraction via `sourceFile` or `comments` options.\n * Comments are included as DBML Note clauses for tables and columns.\n */\nexport class PgGenerator<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseGenerator<TSchema> {\n protected dialectConfig: DialectConfig = {\n isIncrement: (column: AnyColumn) => {\n const sqlType = column.getSQLType().toLowerCase();\n return sqlType.includes(\"serial\");\n },\n };\n\n /**\n * Collect all enum types from the schema\n */\n private collectEnums(): Map<string, string[]> {\n const enums = new Map<string, string[]>();\n const tables = this.getTables();\n\n for (const table of tables) {\n const columns = getTableColumns(table);\n\n for (const column of Object.values(columns)) {\n if (column instanceof PgEnumColumn) {\n const enumObj = (\n column as unknown as { enum: { enumName: string; enumValues: string[] } }\n ).enum;\n if (enumObj && !enums.has(enumObj.enumName)) {\n enums.set(enumObj.enumName, enumObj.enumValues);\n }\n }\n }\n }\n\n return enums;\n }\n\n /**\n * Collect enum definitions for intermediate schema\n *\n * Overrides the base implementation to extract PostgreSQL enum types\n * from enum columns in the schema.\n *\n * @returns Array of enum definitions\n */\n protected override collectEnumDefinitions(): EnumDefinition[] {\n const enums = this.collectEnums();\n const enumDefinitions: EnumDefinition[] = [];\n\n for (const [name, values] of enums) {\n enumDefinitions.push({\n name,\n values,\n });\n }\n\n return enumDefinitions;\n }\n}\n\n/**\n * Generate DBML from a PostgreSQL Drizzle schema\n *\n * @example\n * ```ts\n * import { pgTable, serial, text, varchar } from \"drizzle-orm/pg-core\";\n * import { pgGenerate } from \"drizzle-docs-generator\";\n *\n * const users = pgTable(\"users\", {\n * id: serial(\"id\").primaryKey(),\n * name: text(\"name\").notNull(),\n * email: varchar(\"email\", { length: 255 }).unique(),\n * });\n *\n * const dbml = pgGenerate({ schema: { users } });\n * console.log(dbml);\n * ```\n *\n * To include JSDoc comments as DBML Note clauses, use the `source` option:\n * ```typescript\n * const dbml = pgGenerate({ schema: { users }, source: \"./schema.ts\" });\n * ```\n */\nexport function pgGenerate<TSchema extends Record<string, unknown>>(\n options: GenerateOptions<TSchema>,\n): string {\n const generator = new PgGenerator(options);\n const dbml = generator.generate();\n\n if (options.out) {\n writeDbmlFile(options.out, dbml);\n }\n\n return dbml;\n}\n"],"names":["PgGenerator","BaseGenerator","column","enums","tables","table","columns","getTableColumns","PgEnumColumn","enumObj","enumDefinitions","name","values","pgGenerate","options","dbml","writeDbmlFile"],"mappings":";;;AAWO,MAAMA,UAEHC,EAAuB;AAAA,EACrB,gBAA+B;AAAA,IACvC,aAAa,CAACC,MACIA,EAAO,WAAA,EAAa,YAAA,EACrB,SAAS,QAAQ;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMM,eAAsC;AAC5C,UAAMC,wBAAY,IAAA,GACZC,IAAS,KAAK,UAAA;AAEpB,eAAWC,KAASD,GAAQ;AAC1B,YAAME,IAAUC,EAAgBF,CAAK;AAErC,iBAAWH,KAAU,OAAO,OAAOI,CAAO;AACxC,YAAIJ,aAAkBM,GAAc;AAClC,gBAAMC,IACJP,EACA;AACF,UAAIO,KAAW,CAACN,EAAM,IAAIM,EAAQ,QAAQ,KACxCN,EAAM,IAAIM,EAAQ,UAAUA,EAAQ,UAAU;AAAA,QAElD;AAAA,IAEJ;AAEA,WAAON;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUmB,yBAA2C;AAC5D,UAAMA,IAAQ,KAAK,aAAA,GACbO,IAAoC,CAAA;AAE1C,eAAW,CAACC,GAAMC,CAAM,KAAKT;AAC3B,MAAAO,EAAgB,KAAK;AAAA,QACnB,MAAAC;AAAA,QACA,QAAAC;AAAA,MAAA,CACD;AAGH,WAAOF;AAAA,EACT;AACF;AAyBO,SAASG,EACdC,GACQ;AAER,QAAMC,IADY,IAAIf,EAAYc,CAAO,EAClB,SAAA;AAEvB,SAAIA,EAAQ,OACVE,EAAcF,EAAQ,KAAKC,CAAI,GAG1BA;AACT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/generator/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAiB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,eAAe,CAC1B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjE,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC9B,SAAS,CAAC,aAAa,EAAE,aAAa,CAOpC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,MAAM,CASR"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/generator/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAiB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,eAAe,CAC1B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjE,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC9B,SAAS,CAAC,aAAa,EAAE,aAAa,CAMpC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,MAAM,CASR"}
@@ -1,16 +1,15 @@
1
1
  import { BaseGenerator as n, writeDbmlFile as a } from "./common.js";
2
2
  class o extends n {
3
3
  dialectConfig = {
4
- escapeName: (e) => `"${e}"`,
5
- isIncrement: (e) => e.getSQLType().toLowerCase() === "integer" && e.primary
4
+ isIncrement: (r) => r.getSQLType().toLowerCase() === "integer" && r.primary
6
5
  };
7
6
  }
8
- function i(r) {
9
- const t = new o(r).generate();
10
- return r.out && a(r.out, t), t;
7
+ function s(e) {
8
+ const t = new o(e).generate();
9
+ return e.out && a(e.out, t), t;
11
10
  }
12
11
  export {
13
12
  o as SqliteGenerator,
14
- i as sqliteGenerate
13
+ s as sqliteGenerate
15
14
  };
16
15
  //# sourceMappingURL=sqlite.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","sources":["../../src/generator/sqlite.ts"],"sourcesContent":["import type { AnyColumn } from \"drizzle-orm\";\nimport { BaseGenerator, writeDbmlFile, type DialectConfig } from \"./common\";\nimport type { GenerateOptions } from \"../types\";\n\n/**\n * SQLite-specific DBML generator\n *\n * Supports JSDoc comment extraction via `sourceFile` or `comments` options.\n * Comments are included as DBML Note clauses for tables and columns.\n */\nexport class SqliteGenerator<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseGenerator<TSchema> {\n protected dialectConfig: DialectConfig = {\n escapeName: (name: string) => `\"${name}\"`,\n isIncrement: (column: AnyColumn) => {\n // SQLite uses INTEGER PRIMARY KEY for autoincrement\n const sqlType = column.getSQLType().toLowerCase();\n return sqlType === \"integer\" && column.primary;\n },\n };\n}\n\n/**\n * Generate DBML from a SQLite Drizzle schema\n *\n * @example\n * ```ts\n * import { sqliteTable, integer, text } from \"drizzle-orm/sqlite-core\";\n * import { sqliteGenerate } from \"drizzle-docs-generator\";\n *\n * const users = sqliteTable(\"users\", {\n * id: integer(\"id\").primaryKey(),\n * name: text(\"name\").notNull(),\n * email: text(\"email\").unique(),\n * });\n *\n * const dbml = sqliteGenerate({ schema: { users } });\n * console.log(dbml);\n * ```\n *\n * To include JSDoc comments as DBML Note clauses, use the `source` option:\n * ```typescript\n * const dbml = sqliteGenerate({ schema: { users }, source: \"./schema.ts\" });\n * ```\n */\nexport function sqliteGenerate<TSchema extends Record<string, unknown>>(\n options: GenerateOptions<TSchema>,\n): string {\n const generator = new SqliteGenerator(options);\n const dbml = generator.generate();\n\n if (options.out) {\n writeDbmlFile(options.out, dbml);\n }\n\n return dbml;\n}\n"],"names":["SqliteGenerator","BaseGenerator","name","column","sqliteGenerate","options","dbml","writeDbmlFile"],"mappings":";AAUO,MAAMA,UAEHC,EAAuB;AAAA,EACrB,gBAA+B;AAAA,IACvC,YAAY,CAACC,MAAiB,IAAIA,CAAI;AAAA,IACtC,aAAa,CAACC,MAEIA,EAAO,WAAA,EAAa,YAAA,MACjB,aAAaA,EAAO;AAAA,EACzC;AAEJ;AAyBO,SAASC,EACdC,GACQ;AAER,QAAMC,IADY,IAAIN,EAAgBK,CAAO,EACtB,SAAA;AAEvB,SAAIA,EAAQ,OACVE,EAAcF,EAAQ,KAAKC,CAAI,GAG1BA;AACT;"}
1
+ {"version":3,"file":"sqlite.js","sources":["../../src/generator/sqlite.ts"],"sourcesContent":["import type { AnyColumn } from \"drizzle-orm\";\nimport { BaseGenerator, writeDbmlFile, type DialectConfig } from \"./common\";\nimport type { GenerateOptions } from \"../types\";\n\n/**\n * SQLite-specific DBML generator\n *\n * Supports JSDoc comment extraction via `sourceFile` or `comments` options.\n * Comments are included as DBML Note clauses for tables and columns.\n */\nexport class SqliteGenerator<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseGenerator<TSchema> {\n protected dialectConfig: DialectConfig = {\n isIncrement: (column: AnyColumn) => {\n // SQLite uses INTEGER PRIMARY KEY for autoincrement\n const sqlType = column.getSQLType().toLowerCase();\n return sqlType === \"integer\" && column.primary;\n },\n };\n}\n\n/**\n * Generate DBML from a SQLite Drizzle schema\n *\n * @example\n * ```ts\n * import { sqliteTable, integer, text } from \"drizzle-orm/sqlite-core\";\n * import { sqliteGenerate } from \"drizzle-docs-generator\";\n *\n * const users = sqliteTable(\"users\", {\n * id: integer(\"id\").primaryKey(),\n * name: text(\"name\").notNull(),\n * email: text(\"email\").unique(),\n * });\n *\n * const dbml = sqliteGenerate({ schema: { users } });\n * console.log(dbml);\n * ```\n *\n * To include JSDoc comments as DBML Note clauses, use the `source` option:\n * ```typescript\n * const dbml = sqliteGenerate({ schema: { users }, source: \"./schema.ts\" });\n * ```\n */\nexport function sqliteGenerate<TSchema extends Record<string, unknown>>(\n options: GenerateOptions<TSchema>,\n): string {\n const generator = new SqliteGenerator(options);\n const dbml = generator.generate();\n\n if (options.out) {\n writeDbmlFile(options.out, dbml);\n }\n\n return dbml;\n}\n"],"names":["SqliteGenerator","BaseGenerator","column","sqliteGenerate","options","dbml","writeDbmlFile"],"mappings":";AAUO,MAAMA,UAEHC,EAAuB;AAAA,EACrB,gBAA+B;AAAA,IACvC,aAAa,CAACC,MAEIA,EAAO,WAAA,EAAa,YAAA,MACjB,aAAaA,EAAO;AAAA,EACzC;AAEJ;AAyBO,SAASC,EACdC,GACQ;AAER,QAAMC,IADY,IAAIL,EAAgBI,CAAO,EACtB,SAAA;AAEvB,SAAIA,EAAQ,OACVE,EAAcF,EAAQ,KAAKC,CAAI,GAG1BA;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drizzle-docs-generator",
3
- "version": "0.5.4",
3
+ "version": "0.5.6",
4
4
  "description": "A CLI tool that generates DBML files from Drizzle ORM schema definitions.",
5
5
  "keywords": [
6
6
  "cli",
@@ -9,6 +9,7 @@
9
9
  "documentation",
10
10
  "drizzle",
11
11
  "drizzle-orm",
12
+ "mermaid",
12
13
  "schema",
13
14
  "typescript"
14
15
  ],
@@ -38,17 +39,18 @@
38
39
  },
39
40
  "dependencies": {
40
41
  "commander": "^14.0.2",
41
- "drizzle-orm": "1.0.0-beta.12-b5a187e",
42
+ "drizzle-orm": "1.0.0-beta.12-566a3bc",
42
43
  "tsx": "^4.21.0",
43
44
  "typescript": "^5.9.3"
44
45
  },
45
46
  "devDependencies": {
46
47
  "@types/node": "^24.10.7",
47
- "oxfmt": "^0.24.0",
48
+ "@vitest/coverage-v8": "^4.0.18",
49
+ "oxfmt": "^0.26.0",
48
50
  "oxlint": "^1.39.0",
49
51
  "vite": "^7.3.1",
50
52
  "vite-plugin-dts": "^4.5.4",
51
- "vitest": "^4.0.17"
53
+ "vitest": "^4.0.18"
52
54
  },
53
55
  "peerDependencies": {
54
56
  "drizzle-orm": ">=0.44.0 || >=1.0.0-beta.0"
@@ -62,6 +64,7 @@
62
64
  "test": "vitest",
63
65
  "test:run": "vitest run",
64
66
  "test:integration": "rm -rf src/cli/__integration_test_output__ && vitest run --config vitest.integration.config.ts",
67
+ "test:coverage": "vitest run --coverage",
65
68
  "lint": "oxlint",
66
69
  "format": "oxfmt --write",
67
70
  "format:check": "oxfmt --check",