@skalfa/skalfa-api-core 1.0.30 → 1.0.32

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.
@@ -1 +1 @@
1
- export declare function listUserSessions(userId: number, currentTokenId?: number): Promise<any>;
1
+ export declare function listUserSessions(userId: number, currentTokenId?: number): Promise<any[]>;
@@ -1 +1 @@
1
- export declare function revokeAccessToken(id: number): Promise<any>;
1
+ export declare function revokeAccessToken(id: number): Promise<number>;
@@ -16,6 +16,7 @@ import { migrateCommand, migrateFreshCommand } from "./runner/migration";
16
16
  import { seederCommand } from "./runner/seeder";
17
17
  import { blueprintCommand } from "./runner/blueprint/runner";
18
18
  import { generateDocsCommand } from "./runner/generate-docs";
19
+ import { generateErdCommand } from "./runner/generate-erd";
19
20
  import { makeQueueCommand } from "./make/queue";
20
21
  import { makeMailCommand } from "./make/mail";
21
22
  import { makeNotificationCommand } from "./make/notification";
@@ -52,6 +53,7 @@ export function runCli() {
52
53
  program.addCommand(seederCommand);
53
54
  program.addCommand(blueprintCommand);
54
55
  program.addCommand(generateDocsCommand);
56
+ program.addCommand(generateErdCommand);
55
57
  if (hasMail) {
56
58
  program.addCommand(makeMailCommand);
57
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/commands/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/commands/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const generateErdCommand: Command;
@@ -0,0 +1,193 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { Command } from "commander";
4
+ function getAllFiles(dir, fileList = []) {
5
+ if (!fs.existsSync(dir))
6
+ return fileList;
7
+ const files = fs.readdirSync(dir);
8
+ for (const file of files) {
9
+ const fullPath = path.join(dir, file);
10
+ if (fs.statSync(fullPath).isDirectory()) {
11
+ getAllFiles(fullPath, fileList);
12
+ }
13
+ else if (file.endsWith(".ts") || file.endsWith(".js")) {
14
+ fileList.push(fullPath);
15
+ }
16
+ }
17
+ return fileList;
18
+ }
19
+ function parseMigrations(migrationsDir) {
20
+ const files = getAllFiles(migrationsDir);
21
+ const tables = new Map();
22
+ const relations = [];
23
+ for (const filePath of files) {
24
+ const content = fs.readFileSync(filePath, "utf-8");
25
+ // Match knex.schema.createTable("table_name", (table) => { ... })
26
+ const createTableRegex = /knex\.schema\.createTable\(\s*['"`]([^'"`]+)['"`]\s*,\s*(?:\([^)]*\)|[a-zA-Z0-9_]+)\s*=>\s*\{([\s\S]*?)\n\s*\}\)/g;
27
+ let tableMatch;
28
+ while ((tableMatch = createTableRegex.exec(content)) !== null) {
29
+ const tableName = tableMatch[1];
30
+ const body = tableMatch[2];
31
+ const columns = [];
32
+ const lines = body.split("\n");
33
+ for (const rawLine of lines) {
34
+ const line = rawLine.trim();
35
+ if (!line || line.startsWith("//") || line.startsWith("/*"))
36
+ continue;
37
+ // 1. Primary keys / increments
38
+ const incMatch = line.match(/table\.(bigIncrements|increments)\(\s*['"`]([^'"`]+)['"`]\s*\)/);
39
+ if (incMatch) {
40
+ columns.push({
41
+ name: incMatch[2],
42
+ type: "bigint",
43
+ isPrimaryKey: true,
44
+ });
45
+ continue;
46
+ }
47
+ // 2. foreignIdFor("target_table", "custom_column"?)
48
+ const foreignIdMatch = line.match(/table\.foreignIdFor\(\s*['"`]([^'"`]+)['"`](?:\s*,\s*['"`]([^'"`]+)['"`])?\s*\)/);
49
+ if (foreignIdMatch) {
50
+ const targetTable = foreignIdMatch[1];
51
+ const colName = foreignIdMatch[2] ||
52
+ (targetTable.endsWith("s")
53
+ ? targetTable.slice(0, -1) + "_id"
54
+ : targetTable + "_id");
55
+ columns.push({
56
+ name: colName,
57
+ type: "bigint",
58
+ isForeignKey: true,
59
+ });
60
+ relations.push({
61
+ fromTable: targetTable,
62
+ toTable: tableName,
63
+ relationType: "||--o{",
64
+ label: "references",
65
+ });
66
+ continue;
67
+ }
68
+ // 3. Foreign key via bigInteger with column naming conventions (*_id)
69
+ const bigIntFkMatch = line.match(/table\.bigInteger\(\s*['"`]([a-zA-Z0-9_]+_id)['"`]\s*\)/);
70
+ if (bigIntFkMatch) {
71
+ const colName = bigIntFkMatch[1];
72
+ const isNullable = line.includes(".nullable()");
73
+ const isUnique = line.includes(".unique()");
74
+ columns.push({
75
+ name: colName,
76
+ type: "bigint",
77
+ isForeignKey: true,
78
+ isUnique,
79
+ isNullable,
80
+ });
81
+ let inferredTarget = colName.replace(/_id$/, "");
82
+ if (inferredTarget === "role")
83
+ inferredTarget = "user_role";
84
+ const pluralTarget = inferredTarget.endsWith("s") ? inferredTarget : inferredTarget + "s";
85
+ relations.push({
86
+ fromTable: pluralTarget,
87
+ toTable: tableName,
88
+ relationType: "||--o{",
89
+ label: "references",
90
+ });
91
+ continue;
92
+ }
93
+ // 4. timestamps(true, true)
94
+ if (line.includes("table.timestamps(")) {
95
+ columns.push({ name: "created_at", type: "timestamp" });
96
+ columns.push({ name: "updated_at", type: "timestamp" });
97
+ continue;
98
+ }
99
+ // 5. softDelete()
100
+ if (line.includes("table.softDelete(")) {
101
+ columns.push({ name: "deleted_at", type: "timestamp", isNullable: true });
102
+ continue;
103
+ }
104
+ // 6. Generic columns: table.<type>('name', ...)
105
+ const genericMatch = line.match(/table\.([a-zA-Z0-9_]+)\(\s*['"`]([^'"`]+)['"`]/);
106
+ if (genericMatch) {
107
+ const method = genericMatch[1];
108
+ const colName = genericMatch[2];
109
+ let type = "varchar";
110
+ if (["integer", "tinyint", "smallint", "mediumint"].includes(method))
111
+ type = "int";
112
+ else if (["bigInteger", "bigint"].includes(method))
113
+ type = "bigint";
114
+ else if (["boolean", "bool"].includes(method))
115
+ type = "boolean";
116
+ else if (["json", "jsonb"].includes(method))
117
+ type = "json";
118
+ else if (["timestamp", "datetime", "date", "time"].includes(method))
119
+ type = "timestamp";
120
+ else if (["text", "longtext", "mediumtext"].includes(method))
121
+ type = "text";
122
+ else if (["float", "decimal", "double"].includes(method))
123
+ type = "decimal";
124
+ const isUnique = line.includes(".unique()");
125
+ const isNullable = line.includes(".nullable()");
126
+ const isPrimary = line.includes(".primary()");
127
+ columns.push({
128
+ name: colName,
129
+ type,
130
+ isPrimaryKey: isPrimary,
131
+ isUnique,
132
+ isNullable,
133
+ });
134
+ }
135
+ }
136
+ tables.set(tableName, { name: tableName, columns });
137
+ }
138
+ }
139
+ return { tables, relations };
140
+ }
141
+ function generateMermaid(migrationsDir) {
142
+ const { tables, relations } = parseMigrations(migrationsDir);
143
+ const lines = ["erDiagram"];
144
+ // Deduplicate relations
145
+ const uniqueRelations = new Set();
146
+ for (const rel of relations) {
147
+ const key = `${rel.fromTable}-${rel.toTable}`;
148
+ if (!uniqueRelations.has(key)) {
149
+ uniqueRelations.add(key);
150
+ lines.push(` ${rel.fromTable} ${rel.relationType} ${rel.toTable} : "${rel.label}"`);
151
+ }
152
+ }
153
+ lines.push("");
154
+ // Output tables
155
+ for (const [tableName, schema] of tables) {
156
+ lines.push(` ${tableName} {`);
157
+ for (const col of schema.columns) {
158
+ let constraint = "";
159
+ if (col.isPrimaryKey)
160
+ constraint = "PK";
161
+ else if (col.isForeignKey && col.isUnique)
162
+ constraint = "FK, UK";
163
+ else if (col.isForeignKey)
164
+ constraint = "FK";
165
+ else if (col.isUnique)
166
+ constraint = "UK";
167
+ const constraintStr = constraint ? ` ${constraint}` : "";
168
+ lines.push(` ${col.type} ${col.name}${constraintStr}`);
169
+ }
170
+ lines.push(` }`);
171
+ lines.push("");
172
+ }
173
+ return lines.join("\n");
174
+ }
175
+ export const generateErdCommand = new Command("generate:erd")
176
+ .description("Generate Mermaid ERD (.mmd) from Knex migration files")
177
+ .option("-o, --output <path>", "Output file path (default: docs/erd.mmd)", "docs/erd.mmd")
178
+ .action((options) => {
179
+ const projectRoot = process.cwd();
180
+ const migrationsDir = path.join(projectRoot, "database", "migrations");
181
+ const outputFile = path.isAbsolute(options.output)
182
+ ? options.output
183
+ : path.join(projectRoot, options.output);
184
+ const outputDir = path.dirname(outputFile);
185
+ if (!fs.existsSync(outputDir)) {
186
+ fs.mkdirSync(outputDir, { recursive: true });
187
+ }
188
+ console.log(`🔍 Parsing migrations in: ${migrationsDir}`);
189
+ const mermaidContent = generateMermaid(migrationsDir);
190
+ fs.writeFileSync(outputFile, mermaidContent, "utf-8");
191
+ console.log(`🎉 Mermaid ERD successfully generated at: ${outputFile}`);
192
+ });
193
+ //# sourceMappingURL=generate-erd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-erd.js","sourceRoot":"","sources":["../../../src/commands/runner/generate-erd.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ export const Cors = (app) => app.onRequest(({ request, set }) => {
18
18
  }
19
19
  set.headers['Access-Control-Allow-Origin'] = allowedOrigin;
20
20
  set.headers['Access-Control-Allow-Methods'] = process.env.APP_CORS_METHODS || 'GET, POST, PUT, DELETE, OPTIONS';
21
- set.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Option, x-App';
21
+ set.headers['Access-Control-Allow-Headers'] = process.env.APP_CORS_HEADERS || 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Option, x-App';
22
22
  set.headers['Access-Control-Allow-Credentials'] = 'true';
23
23
  if (request.method === 'OPTIONS') {
24
24
  return new Response(null, { status: 204, });
@@ -1 +1 @@
1
- {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;IACtE,MAAM,MAAM,GAAyB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxE,IAAI,aAAa,GAAoB,GAAG,CAAA;IAExC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAA;IAEvD,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,aAAa,GAAG,MAAM,IAAI,EAAE,CAAA;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,EAAE,GAAG,+DAA+D,CAAA;YAC1E,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;YAC/B,aAAa,GAAG,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,GAAQ,aAAa,CAAA;IAC/D,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,GAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iCAAiC,CAAA;IACnH,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,GAAO,gFAAgF,CAAA;IAClI,GAAG,CAAC,OAAO,CAAC,kCAAkC,CAAC,GAAG,MAAM,CAAA;IAExD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;IACtE,MAAM,MAAM,GAAyB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxE,IAAI,aAAa,GAAoB,GAAG,CAAA;IAExC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAA;IAEvD,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,aAAa,GAAG,MAAM,IAAI,EAAE,CAAA;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,EAAE,GAAG,+DAA+D,CAAA;YAC1E,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;YAC/B,aAAa,GAAG,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,GAAQ,aAAa,CAAA;IAC/D,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,GAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iCAAiC,CAAA;IACnH,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,GAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,gFAAgF,CAAA;IAClK,GAAG,CAAC,OAAO,CAAC,kCAAkC,CAAC,GAAG,MAAM,CAAA;IAExD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skalfa/skalfa-api-core",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "description": "Core and Foundational utilities for the Skalfa API Framework.",
5
5
  "keywords": [
6
6
  "skalfa",
@@ -17,6 +17,7 @@ import { migrateCommand, migrateFreshCommand } from "./runner/migration";
17
17
  import { seederCommand } from "./runner/seeder";
18
18
  import { blueprintCommand } from "./runner/blueprint/runner";
19
19
  import { generateDocsCommand } from "./runner/generate-docs";
20
+ import { generateErdCommand } from "./runner/generate-erd";
20
21
  import { makeQueueCommand } from "./make/queue";
21
22
  import { makeMailCommand } from "./make/mail";
22
23
  import { makeNotificationCommand } from "./make/notification";
@@ -58,6 +59,7 @@ export function runCli() {
58
59
  program.addCommand(seederCommand);
59
60
  program.addCommand(blueprintCommand);
60
61
  program.addCommand(generateDocsCommand);
62
+ program.addCommand(generateErdCommand);
61
63
 
62
64
  if (hasMail) {
63
65
  program.addCommand(makeMailCommand);
@@ -0,0 +1,239 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { Command } from "commander";
4
+
5
+ interface Column {
6
+ name: string;
7
+ type: string;
8
+ isPrimaryKey?: boolean;
9
+ isForeignKey?: boolean;
10
+ isUnique?: boolean;
11
+ isNullable?: boolean;
12
+ }
13
+
14
+ interface Relation {
15
+ fromTable: string;
16
+ toTable: string;
17
+ relationType: string;
18
+ label: string;
19
+ }
20
+
21
+ interface TableSchema {
22
+ name: string;
23
+ columns: Column[];
24
+ }
25
+
26
+ function getAllFiles(dir: string, fileList: string[] = []): string[] {
27
+ if (!fs.existsSync(dir)) return fileList;
28
+ const files = fs.readdirSync(dir);
29
+ for (const file of files) {
30
+ const fullPath = path.join(dir, file);
31
+ if (fs.statSync(fullPath).isDirectory()) {
32
+ getAllFiles(fullPath, fileList);
33
+ } else if (file.endsWith(".ts") || file.endsWith(".js")) {
34
+ fileList.push(fullPath);
35
+ }
36
+ }
37
+ return fileList;
38
+ }
39
+
40
+ function parseMigrations(migrationsDir: string): { tables: Map<string, TableSchema>; relations: Relation[] } {
41
+ const files = getAllFiles(migrationsDir);
42
+ const tables = new Map<string, TableSchema>();
43
+ const relations: Relation[] = [];
44
+
45
+ for (const filePath of files) {
46
+ const content = fs.readFileSync(filePath, "utf-8");
47
+
48
+ // Match knex.schema.createTable("table_name", (table) => { ... })
49
+ const createTableRegex =
50
+ /knex\.schema\.createTable\(\s*['"`]([^'"`]+)['"`]\s*,\s*(?:\([^)]*\)|[a-zA-Z0-9_]+)\s*=>\s*\{([\s\S]*?)\n\s*\}\)/g;
51
+
52
+ let tableMatch: RegExpExecArray | null;
53
+ while ((tableMatch = createTableRegex.exec(content)) !== null) {
54
+ const tableName = tableMatch[1];
55
+ const body = tableMatch[2];
56
+
57
+ const columns: Column[] = [];
58
+ const lines = body.split("\n");
59
+
60
+ for (const rawLine of lines) {
61
+ const line = rawLine.trim();
62
+ if (!line || line.startsWith("//") || line.startsWith("/*")) continue;
63
+
64
+ // 1. Primary keys / increments
65
+ const incMatch = line.match(/table\.(bigIncrements|increments)\(\s*['"`]([^'"`]+)['"`]\s*\)/);
66
+ if (incMatch) {
67
+ columns.push({
68
+ name: incMatch[2],
69
+ type: "bigint",
70
+ isPrimaryKey: true,
71
+ });
72
+ continue;
73
+ }
74
+
75
+ // 2. foreignIdFor("target_table", "custom_column"?)
76
+ const foreignIdMatch = line.match(
77
+ /table\.foreignIdFor\(\s*['"`]([^'"`]+)['"`](?:\s*,\s*['"`]([^'"`]+)['"`])?\s*\)/
78
+ );
79
+ if (foreignIdMatch) {
80
+ const targetTable = foreignIdMatch[1];
81
+ const colName =
82
+ foreignIdMatch[2] ||
83
+ (targetTable.endsWith("s")
84
+ ? targetTable.slice(0, -1) + "_id"
85
+ : targetTable + "_id");
86
+
87
+ columns.push({
88
+ name: colName,
89
+ type: "bigint",
90
+ isForeignKey: true,
91
+ });
92
+
93
+ relations.push({
94
+ fromTable: targetTable,
95
+ toTable: tableName,
96
+ relationType: "||--o{",
97
+ label: "references",
98
+ });
99
+ continue;
100
+ }
101
+
102
+ // 3. Foreign key via bigInteger with column naming conventions (*_id)
103
+ const bigIntFkMatch = line.match(
104
+ /table\.bigInteger\(\s*['"`]([a-zA-Z0-9_]+_id)['"`]\s*\)/
105
+ );
106
+ if (bigIntFkMatch) {
107
+ const colName = bigIntFkMatch[1];
108
+ const isNullable = line.includes(".nullable()");
109
+ const isUnique = line.includes(".unique()");
110
+
111
+ columns.push({
112
+ name: colName,
113
+ type: "bigint",
114
+ isForeignKey: true,
115
+ isUnique,
116
+ isNullable,
117
+ });
118
+
119
+ let inferredTarget = colName.replace(/_id$/, "");
120
+ if (inferredTarget === "role") inferredTarget = "user_role";
121
+ const pluralTarget = inferredTarget.endsWith("s") ? inferredTarget : inferredTarget + "s";
122
+
123
+ relations.push({
124
+ fromTable: pluralTarget,
125
+ toTable: tableName,
126
+ relationType: "||--o{",
127
+ label: "references",
128
+ });
129
+ continue;
130
+ }
131
+
132
+ // 4. timestamps(true, true)
133
+ if (line.includes("table.timestamps(")) {
134
+ columns.push({ name: "created_at", type: "timestamp" });
135
+ columns.push({ name: "updated_at", type: "timestamp" });
136
+ continue;
137
+ }
138
+
139
+ // 5. softDelete()
140
+ if (line.includes("table.softDelete(")) {
141
+ columns.push({ name: "deleted_at", type: "timestamp", isNullable: true });
142
+ continue;
143
+ }
144
+
145
+ // 6. Generic columns: table.<type>('name', ...)
146
+ const genericMatch = line.match(
147
+ /table\.([a-zA-Z0-9_]+)\(\s*['"`]([^'"`]+)['"`]/
148
+ );
149
+ if (genericMatch) {
150
+ const method = genericMatch[1];
151
+ const colName = genericMatch[2];
152
+
153
+ let type = "varchar";
154
+ if (["integer", "tinyint", "smallint", "mediumint"].includes(method)) type = "int";
155
+ else if (["bigInteger", "bigint"].includes(method)) type = "bigint";
156
+ else if (["boolean", "bool"].includes(method)) type = "boolean";
157
+ else if (["json", "jsonb"].includes(method)) type = "json";
158
+ else if (["timestamp", "datetime", "date", "time"].includes(method)) type = "timestamp";
159
+ else if (["text", "longtext", "mediumtext"].includes(method)) type = "text";
160
+ else if (["float", "decimal", "double"].includes(method)) type = "decimal";
161
+
162
+ const isUnique = line.includes(".unique()");
163
+ const isNullable = line.includes(".nullable()");
164
+ const isPrimary = line.includes(".primary()");
165
+
166
+ columns.push({
167
+ name: colName,
168
+ type,
169
+ isPrimaryKey: isPrimary,
170
+ isUnique,
171
+ isNullable,
172
+ });
173
+ }
174
+ }
175
+
176
+ tables.set(tableName, { name: tableName, columns });
177
+ }
178
+ }
179
+
180
+ return { tables, relations };
181
+ }
182
+
183
+ function generateMermaid(migrationsDir: string): string {
184
+ const { tables, relations } = parseMigrations(migrationsDir);
185
+ const lines: string[] = ["erDiagram"];
186
+
187
+ // Deduplicate relations
188
+ const uniqueRelations = new Set<string>();
189
+ for (const rel of relations) {
190
+ const key = `${rel.fromTable}-${rel.toTable}`;
191
+ if (!uniqueRelations.has(key)) {
192
+ uniqueRelations.add(key);
193
+ lines.push(` ${rel.fromTable} ${rel.relationType} ${rel.toTable} : "${rel.label}"`);
194
+ }
195
+ }
196
+
197
+ lines.push("");
198
+
199
+ // Output tables
200
+ for (const [tableName, schema] of tables) {
201
+ lines.push(` ${tableName} {`);
202
+ for (const col of schema.columns) {
203
+ let constraint = "";
204
+ if (col.isPrimaryKey) constraint = "PK";
205
+ else if (col.isForeignKey && col.isUnique) constraint = "FK, UK";
206
+ else if (col.isForeignKey) constraint = "FK";
207
+ else if (col.isUnique) constraint = "UK";
208
+
209
+ const constraintStr = constraint ? ` ${constraint}` : "";
210
+ lines.push(` ${col.type} ${col.name}${constraintStr}`);
211
+ }
212
+ lines.push(` }`);
213
+ lines.push("");
214
+ }
215
+
216
+ return lines.join("\n");
217
+ }
218
+
219
+ export const generateErdCommand = new Command("generate:erd")
220
+ .description("Generate Mermaid ERD (.mmd) from Knex migration files")
221
+ .option("-o, --output <path>", "Output file path (default: docs/erd.mmd)", "docs/erd.mmd")
222
+ .action((options: { output: string }) => {
223
+ const projectRoot = process.cwd();
224
+ const migrationsDir = path.join(projectRoot, "database", "migrations");
225
+ const outputFile = path.isAbsolute(options.output)
226
+ ? options.output
227
+ : path.join(projectRoot, options.output);
228
+
229
+ const outputDir = path.dirname(outputFile);
230
+ if (!fs.existsSync(outputDir)) {
231
+ fs.mkdirSync(outputDir, { recursive: true });
232
+ }
233
+
234
+ console.log(`🔍 Parsing migrations in: ${migrationsDir}`);
235
+ const mermaidContent = generateMermaid(migrationsDir);
236
+ fs.writeFileSync(outputFile, mermaidContent, "utf-8");
237
+
238
+ console.log(`🎉 Mermaid ERD successfully generated at: ${outputFile}`);
239
+ });
@@ -22,7 +22,7 @@ export const Cors = (app: Elysia) => app.onRequest(({ request, set }) => {
22
22
 
23
23
  set.headers['Access-Control-Allow-Origin'] = allowedOrigin
24
24
  set.headers['Access-Control-Allow-Methods'] = process.env.APP_CORS_METHODS || 'GET, POST, PUT, DELETE, OPTIONS'
25
- set.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Option, x-App'
25
+ set.headers['Access-Control-Allow-Headers'] = process.env.APP_CORS_HEADERS || 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Option, x-App'
26
26
  set.headers['Access-Control-Allow-Credentials'] = 'true'
27
27
 
28
28
  if (request.method === 'OPTIONS') {