fiberx-backend-toolkit 0.0.13 → 0.0.14
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/dist/{chunk-XUYXE74J.js → chunk-BLYKIQXQ.js} +2 -1
- package/dist/database/index.d.ts +14 -3
- package/dist/database/index.js +167 -3
- package/dist/database/index.js.map +1 -1
- package/dist/{database_type-TaZge-7g.d.ts → database_type-C8LkcL6x.d.ts} +6 -1
- package/dist/index.d.ts +1 -1
- package/dist/middle_ware/index.js +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
- /package/dist/{chunk-XUYXE74J.js.map → chunk-BLYKIQXQ.js.map} +0 -0
|
@@ -1019,6 +1019,7 @@ var cache_util_default = InMemoryCache;
|
|
|
1019
1019
|
export {
|
|
1020
1020
|
SCHEMAS_DIR,
|
|
1021
1021
|
SCHEMA_SNAPSHOTS_DIR,
|
|
1022
|
+
MODELS_DIR,
|
|
1022
1023
|
MIGRATIONS_DIR,
|
|
1023
1024
|
SEEDERS_DIR,
|
|
1024
1025
|
SEQUELIZE_META_TABLE_NAME,
|
|
@@ -1038,4 +1039,4 @@ export {
|
|
|
1038
1039
|
safe_execute_util_default,
|
|
1039
1040
|
cache_util_default
|
|
1040
1041
|
};
|
|
1041
|
-
//# sourceMappingURL=chunk-
|
|
1042
|
+
//# sourceMappingURL=chunk-BLYKIQXQ.js.map
|
package/dist/database/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { g as SchemaSnapshotInterface, f as SchemaDiffInterface, e as SchemaDefinitionInterface, M as MigrationOperationTypes, h as SeederOperationTypes, i as SequelizeConnectionOptions } from '../database_type-C8LkcL6x.js';
|
|
2
2
|
import { E as EnvManagerUtil, L as LoggerUtil } from '../env_manager_util-DLs1b9Q7.js';
|
|
3
3
|
import { Sequelize } from 'sequelize';
|
|
4
4
|
import '../util_type-Yyo1nXmm.js';
|
|
@@ -89,7 +89,7 @@ declare class CreateSeederScript {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
declare class SeederRunnerScript {
|
|
92
|
-
private
|
|
92
|
+
private name;
|
|
93
93
|
private readonly seeders_dir;
|
|
94
94
|
private readonly db_connection;
|
|
95
95
|
private readonly logger;
|
|
@@ -102,6 +102,17 @@ declare class SeederRunnerScript {
|
|
|
102
102
|
run(operation: SeederOperationTypes, seeder_name?: string, seeder_file?: string): Promise<void>;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
+
declare class SeqeulizeModelGeneratorScript {
|
|
106
|
+
private name;
|
|
107
|
+
private readonly schemas_dir;
|
|
108
|
+
private readonly models_dir;
|
|
109
|
+
private readonly logger;
|
|
110
|
+
constructor();
|
|
111
|
+
private updateModelsIndex;
|
|
112
|
+
private generateModelFile;
|
|
113
|
+
generateModelsFromSchemas(): void;
|
|
114
|
+
}
|
|
115
|
+
|
|
105
116
|
/**
|
|
106
117
|
* Base connector abstraction for all DB / external service connectors
|
|
107
118
|
*/
|
|
@@ -127,4 +138,4 @@ declare class SequelizeConnector extends BaseConnector<Sequelize> {
|
|
|
127
138
|
closeAll(): Promise<void>;
|
|
128
139
|
}
|
|
129
140
|
|
|
130
|
-
export { BaseConnector, CreateSchemaScript, CreateSeederScript, MakeMigrationsScript, MigrationRunnerScript, SchemaDiffUtil, SchemaNormalizerUtil, SeederRunnerScript, SequelizeConnector };
|
|
141
|
+
export { BaseConnector, CreateSchemaScript, CreateSeederScript, MakeMigrationsScript, MigrationRunnerScript, SchemaDiffUtil, SchemaNormalizerUtil, SeederRunnerScript, SeqeulizeModelGeneratorScript, SequelizeConnector };
|
package/dist/database/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MIGRATIONS_DIR,
|
|
3
|
+
MODELS_DIR,
|
|
3
4
|
SCHEMAS_DIR,
|
|
4
5
|
SCHEMA_SNAPSHOTS_DIR,
|
|
5
6
|
SEEDERS_DIR,
|
|
@@ -10,7 +11,7 @@ import {
|
|
|
10
11
|
input_validator_util_default,
|
|
11
12
|
logger_util_default,
|
|
12
13
|
sql_formatter_util_default
|
|
13
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-BLYKIQXQ.js";
|
|
14
15
|
import {
|
|
15
16
|
__require
|
|
16
17
|
} from "../chunk-6AJLW7HC.js";
|
|
@@ -462,6 +463,69 @@ class ${class_name}Seeder {
|
|
|
462
463
|
|
|
463
464
|
export default ${class_name}Seeder;
|
|
464
465
|
`;
|
|
466
|
+
var SEQUELIZE_MODEL_CODE_TEMPLATE = (schema_model_name, schema_file_name, schema_columns) => {
|
|
467
|
+
const attributes = Object.keys(schema_columns).map((col) => ` declare ${col}: any;`).join("\n");
|
|
468
|
+
return `
|
|
469
|
+
import { Model, Sequelize } from "sequelize";
|
|
470
|
+
import ${schema_model_name}Schema from "@/database/schemas/${schema_file_name.replace(".ts", "")}";
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
class ${schema_model_name} extends Model {
|
|
474
|
+
${attributes}
|
|
475
|
+
|
|
476
|
+
public static initModel(sequelize: Sequelize): typeof ${schema_model_name} {
|
|
477
|
+
sequelize: Sequelize
|
|
478
|
+
): ${schema_model_name} {
|
|
479
|
+
${schema_model_name}.init(
|
|
480
|
+
${schema_model_name}Schema.columns,
|
|
481
|
+
{
|
|
482
|
+
sequelize,
|
|
483
|
+
tableName: ${schema_model_name}Schema.table_name,
|
|
484
|
+
modelName: ${schema_model_name}Schema.model_name,
|
|
485
|
+
timestamps: ${schema_model_name}Schema.timestamps,
|
|
486
|
+
indexes: ${schema_model_name}Schema.indexes,
|
|
487
|
+
createdAt: "created_at",
|
|
488
|
+
updatedAt: "updated_at",
|
|
489
|
+
hooks: {}
|
|
490
|
+
}
|
|
491
|
+
);
|
|
492
|
+
return ${schema_model_name};
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
public static registerAssociations(): void {
|
|
496
|
+
// Example:
|
|
497
|
+
// User.belongsTo(models.Organization, { foreignKey: "org_id" });
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
export default ${schema_model_name}
|
|
502
|
+
`;
|
|
503
|
+
};
|
|
504
|
+
var SEQUELIZE_MODELS_INDEX_CODE_TEMPLATE = (model_names, imports) => {
|
|
505
|
+
const exports = model_names.join(",\n ");
|
|
506
|
+
return `
|
|
507
|
+
import { Sequelize } from "sequelize";
|
|
508
|
+
${imports}
|
|
509
|
+
|
|
510
|
+
const models = {
|
|
511
|
+
${exports}
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
export const initModels = (sequelize: Sequelize) => {
|
|
515
|
+
Object.values(models).forEach(model => {
|
|
516
|
+
model.initModel(sequelize);
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
Object.values(models).forEach(model => {
|
|
520
|
+
model.registerAssociations();
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
return models;
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
export default models;
|
|
527
|
+
`;
|
|
528
|
+
};
|
|
465
529
|
|
|
466
530
|
// src/database/scripts/create_schema_script.ts
|
|
467
531
|
var CreateSchemaScript = class {
|
|
@@ -918,10 +982,10 @@ import fs5 from "fs";
|
|
|
918
982
|
import path5 from "path";
|
|
919
983
|
import { DataTypes as DataTypes2 } from "sequelize";
|
|
920
984
|
var SeederRunnerScript = class {
|
|
921
|
-
|
|
985
|
+
name = "seeder_runner_script";
|
|
922
986
|
seeders_dir = SEEDERS_DIR;
|
|
923
987
|
db_connection = sequelize_connector_default?.getInstance?.();
|
|
924
|
-
logger = new logger_util_default(this.
|
|
988
|
+
logger = new logger_util_default(this.name);
|
|
925
989
|
sequelize_instance;
|
|
926
990
|
constructor() {
|
|
927
991
|
input_validator_util_default.dirExists(this.seeders_dir, true);
|
|
@@ -1030,6 +1094,105 @@ var seeder_runner_script_default = SeederRunnerScript;
|
|
|
1030
1094
|
}
|
|
1031
1095
|
})();
|
|
1032
1096
|
|
|
1097
|
+
// src/database/scripts/sequelize_model_generator_script.ts
|
|
1098
|
+
import fs6 from "fs";
|
|
1099
|
+
import path6 from "path";
|
|
1100
|
+
var SeqeulizeModelGeneratorScript = class {
|
|
1101
|
+
name = "sequelize_model_generator_script";
|
|
1102
|
+
schemas_dir = SCHEMAS_DIR;
|
|
1103
|
+
models_dir = MODELS_DIR;
|
|
1104
|
+
logger = new logger_util_default(this.name);
|
|
1105
|
+
constructor() {
|
|
1106
|
+
input_validator_util_default.dirExists(this.models_dir, true);
|
|
1107
|
+
}
|
|
1108
|
+
// Methdo to update models index
|
|
1109
|
+
updateModelsIndex(models_created) {
|
|
1110
|
+
const index_path = path6.join(this.models_dir, "index.ts");
|
|
1111
|
+
const model_names = [];
|
|
1112
|
+
const imports = models_created.map((model_obj) => {
|
|
1113
|
+
model_names.push(model_obj.name);
|
|
1114
|
+
return `import ${model_obj.name} from "./${model_obj.file_name.replace(".ts", "")}";`;
|
|
1115
|
+
}).join("\n");
|
|
1116
|
+
const exports = model_names.join(",\n ");
|
|
1117
|
+
const template = SEQUELIZE_MODELS_INDEX_CODE_TEMPLATE(model_names, imports);
|
|
1118
|
+
try {
|
|
1119
|
+
fs6.writeFileSync(index_path, template.trim(), { encoding: "utf-8" });
|
|
1120
|
+
this.logger.success("\u{1F4E6} models/index.ts updated");
|
|
1121
|
+
return true;
|
|
1122
|
+
} catch (error) {
|
|
1123
|
+
this.logger.error(`\u274C Failed to write model index file: ${index_path}`, { error });
|
|
1124
|
+
return false;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
// Generate a model file from a schema
|
|
1128
|
+
generateModelFile(schema_file_path, schema_content, model_file_name, model_file_path) {
|
|
1129
|
+
const { table_name, model_name, columns } = schema_content;
|
|
1130
|
+
if (!table_name || !model_name || !columns) {
|
|
1131
|
+
this.logger.error(`Schema missing required fields: ${schema_file_path}`);
|
|
1132
|
+
return "failed";
|
|
1133
|
+
}
|
|
1134
|
+
const schema_base_name = path6.basename(schema_file_path, ".ts");
|
|
1135
|
+
if (fs6.existsSync(model_file_path)) {
|
|
1136
|
+
this.logger.info(`Model file already exists, skipping: ${model_file_path}`);
|
|
1137
|
+
return "skipped";
|
|
1138
|
+
}
|
|
1139
|
+
const template = SEQUELIZE_MODEL_CODE_TEMPLATE(model_name, schema_base_name, columns);
|
|
1140
|
+
try {
|
|
1141
|
+
fs6.writeFileSync(model_file_path, template, { encoding: "utf-8" });
|
|
1142
|
+
this.logger.success(`\u2705 Model file generated: ${model_file_path}`);
|
|
1143
|
+
return "created";
|
|
1144
|
+
} catch (error) {
|
|
1145
|
+
this.logger.error(`\u274C Failed to write model file: ${model_file_path}`, { error });
|
|
1146
|
+
return "failed";
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
// Loop through all schemas and generate model files
|
|
1150
|
+
generateModelsFromSchemas() {
|
|
1151
|
+
const schema_files = fs6.readdirSync(this.schemas_dir).filter((file) => file.endsWith(".ts"));
|
|
1152
|
+
if (!schema_files.length) {
|
|
1153
|
+
this.logger.info("\u26A0\uFE0F No schema files found.");
|
|
1154
|
+
return;
|
|
1155
|
+
}
|
|
1156
|
+
let created_count = 0;
|
|
1157
|
+
let skipped_count = 0;
|
|
1158
|
+
let failed_count = 0;
|
|
1159
|
+
const models = [];
|
|
1160
|
+
for (const schema_file of schema_files) {
|
|
1161
|
+
const schema_file_path = path6.join(this.schemas_dir, schema_file);
|
|
1162
|
+
try {
|
|
1163
|
+
const schema_module = __require(schema_file_path);
|
|
1164
|
+
if (!schema_module?.default) {
|
|
1165
|
+
this.logger.error(`Schema file has no default export: ${schema_file_path}`);
|
|
1166
|
+
failed_count++;
|
|
1167
|
+
continue;
|
|
1168
|
+
}
|
|
1169
|
+
const schema_content = schema_module.default;
|
|
1170
|
+
const model_file_name = `${input_transformer_util_default.toSnakeCase(schema_content.model_name)}_model.ts`;
|
|
1171
|
+
const model_file_path = path6.join(this.models_dir, model_file_name);
|
|
1172
|
+
const generation_result = this.generateModelFile(schema_file_path, schema_content, model_file_name, model_file_path);
|
|
1173
|
+
if (generation_result === "skipped") {
|
|
1174
|
+
skipped_count++;
|
|
1175
|
+
} else if (generation_result === "failed") {
|
|
1176
|
+
failed_count++;
|
|
1177
|
+
} else if (generation_result === "created") {
|
|
1178
|
+
created_count++;
|
|
1179
|
+
}
|
|
1180
|
+
models.push({ name: schema_content.model_name, file_name: model_file_name });
|
|
1181
|
+
} catch (error) {
|
|
1182
|
+
this.logger.error(`Failed to load schema: ${schema_file_path}`, { error });
|
|
1183
|
+
failed_count++;
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
this.logger.info(`Updating Models Index file with new models`);
|
|
1187
|
+
this.updateModelsIndex(models);
|
|
1188
|
+
this.logger.success(`\u{1F3C1} Model generation summary:`);
|
|
1189
|
+
this.logger.success(`\u2705 Newly created: ${created_count}`);
|
|
1190
|
+
this.logger.success(`\u26A0\uFE0F Skipped (already exists): ${skipped_count}`);
|
|
1191
|
+
this.logger.success(`\u274C Failed: ${failed_count}`);
|
|
1192
|
+
}
|
|
1193
|
+
};
|
|
1194
|
+
var sequelize_model_generator_script_default = SeqeulizeModelGeneratorScript;
|
|
1195
|
+
|
|
1033
1196
|
// src/database/connectors/base_connector.ts
|
|
1034
1197
|
var BaseConnector = class {
|
|
1035
1198
|
constructor(connector_name) {
|
|
@@ -1140,6 +1303,7 @@ export {
|
|
|
1140
1303
|
schema_diff_util_default as SchemaDiffUtil,
|
|
1141
1304
|
schema_normalizer_util_default as SchemaNormalizerUtil,
|
|
1142
1305
|
seeder_runner_script_default as SeederRunnerScript,
|
|
1306
|
+
sequelize_model_generator_script_default as SeqeulizeModelGeneratorScript,
|
|
1143
1307
|
sequelize_connector_default as SequelizeConnector
|
|
1144
1308
|
};
|
|
1145
1309
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/database/schema/schema_diff_util.ts","../../src/database/schema/schema_normalizer_util.ts","../../src/database/scripts/create_schema_script.ts","../../src/code_templates/sequelize_code_template.ts","../../src/database/scripts/make_migrations_script.ts","../../src/database/scripts/migration_runner_script.ts","../../src/database/scripts/create_seeder_script.ts","../../src/database/scripts/seeder_runner_script.ts","../../src/database/connectors/base_connector.ts","../../src/database/connectors/sequelize_connector.ts"],"sourcesContent":["import { \n SchemaDiffInterface, \n SchemaSnapshotInterface,\n IndexFieldOptionsInterface,\n SchemaColumnInterface\n} from \"@/types/schema_type\";\n\n\n\nclass SchemaDiffUtil {\n\n private static indexKey(i: IndexFieldOptionsInterface): string {\n return JSON.stringify({\n fields: i.fields,\n unique: i.unique,\n using: i.using,\n operator: i.operator,\n });\n }\n\n public static getSchemaDifference(\n prev: SchemaSnapshotInterface, \n curr: SchemaSnapshotInterface\n ): SchemaDiffInterface {\n\n const diff: SchemaDiffInterface = {\n columns: { added: [], removed: {}, modified: {} },\n indexes: { added: [], removed: [], modified: {} },\n };\n\n // Table rename\n if (prev.table_name !== curr.table_name) {\n diff.table_renamed = {\n from: prev.table_name,\n to: curr.table_name,\n };\n }\n\n // Columns\n for (const [col_name, col_def] of Object.entries(curr.columns)) {\n const prev_col: SchemaColumnInterface = prev.columns[col_name];\n\n if(!prev_col) {\n diff.columns.added.push(col_name);\n }\n else if (JSON.stringify(prev_col) !== JSON.stringify(col_def)) {\n diff.columns.modified[col_name] = { \n before: prev_col, \n after: col_def \n };\n }\n }\n\n for (const [prev_col_name, prev_col_def] of Object.entries(prev.columns)) {\n if (!curr.columns[prev_col_name]) {\n diff.columns.removed[prev_col_name] = prev_col_def;\n }\n }\n\n // Indexes\n const prev_indexes = prev?.indexes || [];\n const curr_indexes = curr?.indexes || [];\n const prev_map = new Map(prev_indexes.map(i => [SchemaDiffUtil.indexKey(i), i]));\n const curr_map = new Map(curr_indexes.map(i => [SchemaDiffUtil.indexKey(i), i]));\n\n for (const [key, idx] of curr_map) {\n if (!prev_map.has(key)) {\n diff.indexes.added.push(idx);\n }\n }\n\n for (const [key, idx] of prev_map) {\n if (!curr_map.has(key)) {\n diff.indexes.removed.push(idx);\n }\n }\n\n // Modified indexes (same fields, different options)\n for (const curr_idx of curr_indexes) {\n const prev_idx = prev_indexes.find(\n p => JSON.stringify([...p.fields].sort()) === JSON.stringify([...curr_idx.fields].sort())\n );\n\n if (prev_idx && JSON.stringify(prev_idx) !== JSON.stringify(curr_idx)) {\n diff.indexes.modified[curr_idx?.name] = { \n before: prev_idx, \n after: curr_idx \n };\n }\n }\n\n return diff;\n }\n}\n\nexport default SchemaDiffUtil;\n","import { \n SchemaDefinitionInterface, \n SchemaSnapshotInterface \n} from \"@/types/schema_type\";\n\n\nclass SchemaNormalizerUtil {\n static normalizeColumn(column: any) {\n return {\n type: column.type?.key ?? column.type?.toString(),\n allow_null: column.allowNull ?? true,\n primary_key: !!column.primaryKey,\n auto_increment: !!column.autoIncrement,\n unique: !!column.unique,\n default_value: column.defaultValue ?? null,\n references: column.references ?? null,\n on_update: column.onUpdate ?? null,\n on_delete: column.onDelete ?? null,\n };\n }\n\n static normalizeIndex(index: any) {\n return {\n name: index.name ?? null,\n fields: [...index.fields].sort(),\n unique: !!index.unique,\n using: index.using ?? null,\n operator: index.operator ?? null,\n };\n }\n\n static normalizeSchema(\n schema: SchemaDefinitionInterface\n ): SchemaSnapshotInterface {\n return {\n database_name: schema.database_name,\n table_name: schema.table_name,\n model_name: schema.model_name,\n migration_priority: schema.migration_priority,\n timestamps: schema.timestamps,\n\n columns: Object.fromEntries(\n Object.entries(schema.columns).map(([key, col]) => [\n key,\n this.normalizeColumn(col),\n ])\n ),\n\n indexes: (schema.indexes ?? []).map(this.normalizeIndex),\n };\n }\n}\n\nexport default SchemaNormalizerUtil\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { SCHEMAS_DIR } from \"@/config/constants\";\nimport { SEQUELIZE_SCHEMA_CODE_TEMPLATE } from \"@/code_templates/sequelize_code_template\"\n\nimport { \n\tLoggerUtil,\n\tInputTransformerUtil,\n\tInputValidatorUtil,\n} from \"@/utils\";\n\nclass CreateSchemaScript {\n\tprivate name: string = \"create_schema_script\"\n\tprivate readonly raw_input: string;\n\tprivate readonly schemas_dir: string;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor(raw_input?: string) {\n\t\tif (!raw_input) {\n\t\t\tconst log_msg = \"❌ Please provide a schema name.\"\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\tthis.raw_input \t\t= raw_input;\n\t\tthis.schemas_dir \t= SCHEMAS_DIR;\n\t}\n\n // Method to ensure schema does not exist\n\tprivate ensureSchemaDoesNotExist(file_path: string): void {\n\t\tif (fs.existsSync(file_path)) {\n\t\t\tconst log_msg = `❌ Schema already exists. File: ${file_path}`\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\t}\n\n\t// Determine next migration priority from existing schemas\n private getNextMigrationPriority(): number {\n if (!fs.existsSync(this.schemas_dir)) {\n return 1;\n }\n\n const files = fs.readdirSync(this.schemas_dir);\n\n return files.length + 1;\n }\n\n // Pad migration priority (e.g. 1 -> 001)\n private formatPriority(priority: number): string {\n return priority.toString().padStart(3, \"0\");\n }\n\n\t// Method to create schema file with boilerplate data\n\tprivate createSchemaFile(\n file_path: string, \n schema_name: string, \n model_name: string, \n table_name: string, \n migration_priority: number\n ): void {\n \tconst template = SEQUELIZE_SCHEMA_CODE_TEMPLATE(schema_name, table_name, model_name, migration_priority);\n\n\t\ttry {\n\t\t\tfs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`❌ Failed to write schema file: ${file_path}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n // Main Method to run\n\tpublic run(): void {\n\t\tconst file_base_name \t\t= InputTransformerUtil.toSchemaFileName(this.raw_input);\n const base_pascal \t\t\t= InputTransformerUtil.toPascalCase(file_base_name);\n const schema_name \t= base_pascal.toLowerCase().endsWith(\"schema\") ? base_pascal : `${base_pascal}Schema`;\n const model_name \t\t\t= base_pascal.toLowerCase().endsWith(\"schema\") ? base_pascal.replace(/Schema$/i, \"\") : base_pascal;\n const table_name \t\t\t= InputTransformerUtil.pluralizeSnakeCase(InputTransformerUtil.toSnakeCase(model_name));\n const migration_priority \t= this.getNextMigrationPriority();\n const file_name \t\t\t= `${file_base_name}.ts`;\n const file_path \t\t\t= path.join(this.schemas_dir, file_name);\n\n\t\t// Ensure schemas directory exists (create if missing)\n\t\tInputValidatorUtil.dirExists(this.schemas_dir, true);\n\n\t\tthis.ensureSchemaDoesNotExist(file_path);\n\t\tthis.createSchemaFile(file_path, schema_name, model_name, table_name, migration_priority);\n;\n\t\tthis.logger.success(\"✅ Schema created successfully Created database/schemas/${file_base_name}.ts\");\n this.logger.info(`📄 File Path: ${file_path}`);\n this.logger.info(`🧩 Schema Name: ${schema_name}`);\n this.logger.info(`📦 Model Name: ${model_name}`);\n this.logger.info(`🗄️ Table Name: ${table_name}`);\n\t}\n}\n\nexport default CreateSchemaScript;\n\n// CLI entry point\ntry {\n\tnew CreateSchemaScript(process.argv[2]).run();\n\tprocess.exit(0);\n} \ncatch (error: any) {\n\tconsole.error(error?.message || \"\");\n\tprocess.exit(1);\n}","import { \n IndexFieldOptionsInterface,\n SchemaColumnInterface, \n SchemaDiffInterface \n} from \"@/types/schema_type\";\n\nconst SEQUELIZE_SCHEMA_CODE_TEMPLATE = (\n schema_name: string, \n table_name: string, \n model_name: string, \n migration_priority: number\n): string => \n{\n return `\nimport { DataTypes } from \"sequelize\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\n\nconst ${schema_name}: SchemaDefinitionInterface = {\n database_name: \"public\",\n migration_priority: ${migration_priority},\n\n table_name: \"${table_name}\",\n model_name: \"${model_name}\",\n timestamps:true,\n\n columns: {\n id: {\n type: DataTypes.BIGINT,\n primaryKey: true,\n autoIncrement: true,\n allowNull: false,\n },\n\n created_at: {\n type: DataTypes.DATE,\n defaultValue: DataTypes.NOW,\n },\n\n updated_at: {\n type: DataTypes.DATE,\n allowNull: true,\n defaultValue: null,\n },\n },\n\n indexes: [\n { fields: [\"\"], name: \"\" },\n ],\n};\n\nexport default ${schema_name};\n`\n}\n\nconst SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE = ( \n schema_table_name: string, \n schema_model_name: string,\n schema_file_name: string \n): string => `\nimport { QueryInterface, DataTypes, Sequelize } from \"sequelize\";\nimport { LoggerUtil } from \"fiberx-backend-toolkit//utils\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\nclass Create${schema_model_name}TableMigration {\n private name: string = \"create_table_${schema_table_name}_migration_file\";\n private schema: SchemaDefinitionInterface = ${schema_model_name}Schema;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {}\n\n // Migration UP\n public async up(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, columns = {}, indexes = [] } = this.schema;\n\n await queryInterface.createTable(table_name, columns);\n\n for (const index_field_obj of indexes) {\n\n const { fields, name, index_options } = index_field_obj;\n const index_name = \\`idx_\\${table_name}_\\${fields.join(\"_\")}\\`\n \n await queryInterface.addIndex(\n table_name, \n fields, \n { name: index_name, ...index_options }\n );\n }\n\n this.logger.success(\\`✅ Table \"\\${table_name}\" for schema \"\\${model_name}Schema\" created with \"\\${this.index_attributes.length}\" indexed Fields.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Migration failed: \"\\${error.message}\"\\`);\n }\n }\n\n // Migration DOWN\n public async down(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, database_name, model_name } = this.schema;\n await queryInterface.dropTable(table_name, {});\n this.logger.success(\\`🗑️ Table \"\\${table_name}\" dropped successfully.\\`);\n } catch (error: any) {\n this.logger.error(\\`🚫 Migration rollback failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Migration rollback failed: \"\\${error.message}\"\\`);\n }\n }\n}\n\nexport default Create${schema_model_name}TableMigration;\n`;\n\nconst SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE = (\n schema_table_name: string,\n schema_model_name: string,\n diff: SchemaDiffInterface,\n schema_file_name: string\n): string => `\nimport { QueryInterface, DataTypes, Sequelize } from \"sequelize\";\nimport { LoggerUtil } from \"fiberx-backend-toolkit//utils\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\nclass Update${schema_model_name}TableMigration {\n private name: string = \"update_table_${schema_table_name}_migration_file\";\n private schema: SchemaDefinitionInterface = ${schema_model_name}Schema;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {}\n\n public async up(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, model_name, columns = {}, indexes = [] } = this.schema;\n\n ${diff.table_renamed ? `\n await queryInterface.renameTable(\n \"${diff.table_renamed.from}\",\n \"${diff.table_renamed.to}\"\n );` \n : \n \"\"\n }\n\n // Add columns\n ${diff.columns.added.map((column_name: string) => `\n await queryInterface.addColumn(\n table_name,\n \"${column_name}\",\n columns[\"${column_name}\"]\n );\n `).join(\"\")}\n\n // Modify columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_modified]) => `\n await queryInterface.changeColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_modified?.after)}\n );\n `\n ).join(\"\")}\n\n // Remove columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_Def]) => `\n await queryInterface.removeColumn(\n table_name, \n \"${col_name}\"\n );\n `\n ).join(\"\")}\n\n\n // Add indexes\n ${diff.indexes.added.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx.fields)}, \n ${JSON.stringify(idx)}\n );\n `\n ).join(\"\")}\n\n // Modify indexes (remove + add)\n ${Object.entries(diff.indexes.modified).map(([idx_name, idx_modified]) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx_modified.before.name)}\n );\n\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx_modified.after.fields)}, \n ${JSON.stringify(idx_modified.after)}\n );\n `\n ).join(\"\")}\n\n // Remove indexes\n ${diff.indexes.removed.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx.name)}\n );\n `\n ).join(\"\")}\n\n\n this.logger.success(\\`✅ Table \"\\${table_name}\" for schema \"\\${model_name}Schema\" updated successfully.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Update migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Update migration failed: \"\\${error.message}\"\\`);\n }\n }\n\n public async down(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, model_name, columns = {} } = this.schema;\n\n // Revert Added indexes\n ${diff.indexes.added.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx.name)}\n );`\n ).join(\"\")}\n\n // Revert Modified Indexes\n ${Object.entries(diff.indexes.modified).map(([idx_name, idx_modified]) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx_modified.after.name)}\n );\n\n\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx_modified.before.fields)}, \n ${JSON.stringify(idx_modified.before)}\n );`\n ).join(\"\")}\n\n // Revert removed indexes\n ${diff.indexes.removed.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx.fields)}, \n ${JSON.stringify(idx)}\n );`\n ).join(\"\")}\n\n // Revert Modified columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_modified]) => `\n await queryInterface.changeColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_modified.before)}\n );`\n ).join(\"\")}\n\n // Revert added columns\n ${diff.columns.added.map((column_name: string) => `\n await queryInterface.removeColumn(table_name, \"${column_name}\");\n `).join(\"\")}\n\n ${Object.entries(diff.columns.modified).map(([col_name, col_Def]) => `\n await queryInterface.addColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_Def)}\n );\n `).join(\"\")}\n\n ${diff.table_renamed ? `\n await queryInterface.renameTable(\n \"${diff.table_renamed.to}\",\n \"${diff.table_renamed.from}\"\n );` : \"\"\n }\n\n this.logger.success(\\`🗑️ Rollback of table \"\\${table_name}\" completed successfully.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Rollback migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Rollback migration failed: \"\\${error.message}\"\\`);\n }\n }\n}\n\nexport default Update${schema_model_name}TableMigration;\n`;\n\nconst SEQUELIZE_SEEDER_TEMPLATE = (\n class_name: string, \n table_name: string\n): string => `\n'use strict';\n\nimport { QueryInterface } from 'sequelize';\n\nclass ${class_name}Seeder {\n\t/**\n\t * Seed method\n\t */\n\tpublic async up(queryInterface: QueryInterface): Promise<void> {\n const seed_data = this.getSeedData();\n\n\t\tif (!seed_data || seed_data.length === 0) {\n\t\t\tthrow new Error(\"❌ Seeder data for 'roles' is empty. Aborting bulk insert.\");\n\t\t}\n\n\t\tawait queryInterface.bulkInsert('${table_name.toLowerCase()}', seed_data);\n\t}\n\n\t/**\n\t * Undo seed method\n\t */\n\tpublic async down(queryInterface: QueryInterface): Promise<void> {\n const seed_data = this.getSeedData();\n\n\t\tif (!seed_data || seed_data.length === 0) {\n\t\t\tthrow new Error(\"❌ Seeder data for 'roles' is empty. Nothing to delete.\");\n\t\t}\n\n\t\tconst ids = seed_data.map(row => row.id);\n\n\t\tawait queryInterface.bulkDelete('${table_name.toLowerCase()}', { id: ids });\n\t}\n\n\t/**\n\t * Provide seed data array\n\t */\n\tprivate getSeedData(): Array<Record<string, any>> {\n\t\t// TODO: Replace this with real seed data\n\t\treturn [];\n\t}\n}\n\nexport default ${class_name}Seeder;\n`;\n\nexport {\n SEQUELIZE_SCHEMA_CODE_TEMPLATE,\n SEQUELIZE_SEEDER_TEMPLATE,\n SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE\n}\n\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { \n SCHEMAS_DIR,\n MIGRATIONS_DIR,\n SCHEMA_SNAPSHOTS_DIR\n} from \"@/config/constants\";\n\nimport {\n\tSEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE\n} from \"@/code_templates/sequelize_code_template\"\n\nimport { \n\tLoggerUtil,\n\tInputValidatorUtil,\n InputTransformerUtil\n} from \"@/utils\";\n\nimport { \n SchemaDefinitionInterface, \n SchemaDiffInterface, \n SchemaSnapshotInterface\n} from \"@/types/schema_type\";\n\nimport {\n SchemaDiffUtil,\n SchemaNormalizerUtil\n} from \"@/database/\"\n\n\nclass MakeMigrationsScript {\n\tprivate name: string = \"make_migrations_script\";\n private readonly schemas_dir: string = SCHEMAS_DIR;\n\tprivate readonly migrations_dir: string = MIGRATIONS_DIR;\n private readonly snapshot_dir: string = SCHEMA_SNAPSHOTS_DIR;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n\tconstructor() {}\n\n private getSnapshotPath(model_name: string) {\n return path.join(this.snapshot_dir, `${InputTransformerUtil.toSnakeCase(model_name)}.schema_snapshot.json`);\n }\n\n // Method to handle generating migration file name\n private generateMigrationFilename (\n table_name: string, \n type: \"create\" | \"update\", \n migration_priority: number\n ): string {\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, '').slice(0, 14);\n return `${migration_priority}_${timestamp}_${type}_table_${table_name}.ts`;\n };\n\n // Methos to write schema snapshot\n private writeSchemaSnapshot(\n model_name: string,\n normalized_schema: SchemaSnapshotInterface\n ): boolean {\n const snapshot_path = this.getSnapshotPath(model_name);\n\n try {\n // Ensure snapshot directory exists\n InputValidatorUtil.dirExists(this.snapshot_dir, true);\n\n fs.writeFileSync(\n snapshot_path,\n JSON.stringify(normalized_schema, null, 2),\n { encoding: \"utf-8\" }\n );\n\n this.logger.success(`📸 Schema snapshot saved: ${snapshot_path}`);\n return true;\n } catch (error: any) {\n this.logger.error(`❌ Failed to write schema snapshot: ${snapshot_path}`);\n this.logger.error(error?.message || error);\n return false;\n }\n }\n\n // Method to handle create update schema table migration file\n private createUpdateSchemaMigrationFile (\n file_path: string, \n schema_file_path: string, \n schema_content: SchemaDefinitionInterface, \n schema_diff: SchemaDiffInterface\n ): boolean {\n const { table_name, model_name } = schema_content;\n \n const schema_file_name = path.basename(schema_file_path);\n\n const template = SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE(\n table_name,\n model_name,\n schema_diff,\n schema_file_name\n );\n \n try {\n fs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n } catch (error) {\n this.logger.error(`❌ Failed to write create update schema migration file: ${file_path}`);\n return false\n }\n\n return true\n }\n\n // Method to handle create new schema table migration file\n private createNewSchemaMigrationFile (\n file_path: string, \n schema_file_path: string, \n schema_content: SchemaDefinitionInterface\n ): boolean {\n const { table_name, model_name } = schema_content;\n\n const schema_file_name = path.basename(schema_file_path);\n\n const template = SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE(\n table_name, \n model_name,\n schema_file_name\n );\n \n try {\n fs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n } catch (error) {\n this.logger.error(`❌ Failed to write create new schema migration file: ${file_path}`);\n return false\n }\n\n return true\n }\n\n // Method to handle creating migration files for new and updated schemas\n private createMigrationForSchema(\n schema_file_path: string, \n schema_content: SchemaDefinitionInterface\n ) {\n this.logger.info(`💾 Ready to create migration for: ${schema_file_path}`);\n \n const { table_name, migration_priority, model_name, } = schema_content;\n\n if (!table_name) {\n this.logger.error(`❌ Schema has no table_name: ${schema_file_path}`);\n return;\n }\n\n const normalized_schema = SchemaNormalizerUtil.normalizeSchema(schema_content);\n const snapshot_path = this.getSnapshotPath(model_name);\n const operation = !fs.existsSync(snapshot_path) ? \"create\" : \"update\";\n const migration_file_name = this.generateMigrationFilename(table_name, operation, migration_priority);\n const migration_file_path = path.join(this.migrations_dir, migration_file_name);\n\n let migration_file_created: boolean = false\n\n if (!fs.existsSync(snapshot_path)) {\n this.logger.info(`Creating Migration File for New schema: ${model_name}Schema`);\n migration_file_created = this.createNewSchemaMigrationFile(migration_file_path, schema_file_path, schema_content);\n }\n else {\n // Existing migration → UPDATE\n this.logger.info(`🔄 Found existing migration snapshots: ${snapshot_path} → checking for updates...`);\n\n const previous_snapshot: SchemaSnapshotInterface = JSON.parse(fs.readFileSync(snapshot_path, \"utf-8\"));\n const diff: SchemaDiffInterface = SchemaDiffUtil.getSchemaDifference(previous_snapshot, normalized_schema);\n\n if (\n !diff.table_renamed &&\n !diff.columns.added.length &&\n !diff.columns.removed.length &&\n !Object.keys(diff.columns.modified).length &&\n !diff.indexes.added.length &&\n !diff.indexes.removed.length\n ) {\n this.logger.info(\"ℹ️ No schema changes detected\");\n return false;\n }\n\n migration_file_created = this.createUpdateSchemaMigrationFile(\n migration_file_path, \n schema_file_path, \n schema_content,\n diff\n );\n }\n\n if (migration_file_created) {\n this.logger.success(`✅ Migration file created: ${migration_file_name}`);\n\n // Update snapshot AFTER successful migration creation\n const snapshot_written = this.writeSchemaSnapshot(model_name, normalized_schema);\n\n if (!snapshot_written) {\n this.logger.error(`⚠️ Migration created but snapshot update failed for \"${model_name}\"`);\n }\n } else {\n this.logger.info(`ℹ️ No migration created for table \"${table_name}\".`);\n }\n return migration_file_created;\n \n }\n\n // Main Method\n\tpublic run(): void {\n this.logger.info(`🔍 Scanning schemas in directory: ${this.schemas_dir}`);\n\n // Ensure directory exists\n InputValidatorUtil.dirExists(this.schemas_dir, true);\n InputValidatorUtil.dirExists(this.migrations_dir, true);\n\n // Fetch all TypeScript schema files\n const schema_files = fs.readdirSync(this.schemas_dir).filter(file => file.endsWith(\".ts\"));\n\n if (!schema_files.length) {\n this.logger.info(\"⚠️ No schema files found.\");\n return;\n }\n\n this.logger.info(`✅ Found ${schema_files.length} schema file(s).`);\n\n let created_count = 0;\n let failed_count = 0;\n\n for (const file of schema_files) {\n const file_path = path.join(this.schemas_dir, file);\n\n try {\n // Dynamically import the schema\n // Using require + resolve to get absolute path\n const schema_module = require(file_path);\n\n this.logger.info(`Processing schema file: ${file_path}`);\n \n // Log details if default export exists\n if (schema_module?.default) {\n const schema_content = schema_module.default;\n this.logger.info(`Schema Name: ${schema_content?.model_name || \"N/A\"}Schema`);\n this.logger.info(`Model Name: ${schema_content?.model_name || \"N/A\"}`);\n this.logger.info(`Table Name: ${schema_content?.table_name || \"N/A\"}`);\n\n // Pass to migration creation logic\n const created = this.createMigrationForSchema(file_path, schema_content);\n\n if (created) { created_count++; }\n } else {\n this.logger.error(`⚠️ Schema file has no default export: ${file_path}`);\n failed_count++;\n }\n } \n catch (error: any) {\n this.logger.error(`❌ Failed to load schema file: ${file_path}`);\n this.logger.error(`Error: ${error?.message || error}`);\n failed_count++;\n }\n }\n\n this.logger.success(`🏁 Migration generation summary:`);\n this.logger.success(`Successfully processed: ${created_count}`);\n this.logger.success(`Failed: ${failed_count}`);\n }\n\n}\n\nexport default MakeMigrationsScript\n\n// CLI entry point\ntry {\n\tnew MakeMigrationsScript().run();\n} \ncatch (error: any) {\n\tconsole.error(error?.message || \"\");\n\tprocess.exit(1);\n}\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { Sequelize, QueryInterface, DataTypes } from \"sequelize\";\n\nimport { SequelizeConnector } from \"@/database\";\nimport { MIGRATIONS_DIR, SEQUELIZE_META_TABLE_NAME } from \"@/config/constants\";\nimport { LoggerUtil, InputValidatorUtil, } from \"@/utils\";\nimport { MigrationOperationTypes } from \"@/types/migration_type\";\n\nclass MigrationRunnerScript {\n private module_name = \"migration_runner_script\";\n private readonly migrations_dir: string = MIGRATIONS_DIR;\n private readonly db_connection: SequelizeConnector = SequelizeConnector?.getInstance?.();\n private readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n private readonly sequelize_instance: Sequelize;\n\n constructor() {\n InputValidatorUtil.dirExists(this.migrations_dir, true);\n\n this.sequelize_instance = this.db_connection.connect();\n }\n\n // Fetch all migration files\n private getMigrationFiles(schema_name?: string): string[] {\n const files = fs.readdirSync(this.migrations_dir).filter(f => f.endsWith(\".ts\"));\n\n if (schema_name) {\n return files.filter(f => f.toLowerCase().includes(schema_name.toLowerCase()));\n }\n return files;\n }\n\n // Ensure SequelizeMeta table exists\n private async ensureMetaTable() {\n const queryInterface = this.sequelize_instance.getQueryInterface();\n const table_names = await queryInterface.showAllTables();\n\n if (!table_names.includes(SEQUELIZE_META_TABLE_NAME)) {\n this.logger.info(\"⏳ Creating SequelizeMeta table...\");\n\n await queryInterface.createTable(\n SEQUELIZE_META_TABLE_NAME, \n {\n name: { \n type: DataTypes.STRING, \n allowNull: false, \n primaryKey: true \n }\n }\n );\n\n this.logger.success(\"✅ SequelizeMeta table created.\");\n }\n }\n\n // Fetch already applied migrations\n private async getAppliedMigrations(): Promise<string[]> {\n const [results] = await this.sequelize_instance.query(`SELECT name FROM \\\"${SEQUELIZE_META_TABLE_NAME}\\\";`);\n return Array.isArray(results) ? results.map((r: any) => r.name) : [];\n }\n\n // Apply a single migration\n private async applyMigration(file_path: string, operation: MigrationOperationTypes ) {\n const MigrationClass = require(file_path)?.default;\n\n if (!MigrationClass) { \n const log_msg = `Migration file has no default export: ${file_path}`\n this.logger.error(log_msg);\n throw new Error(log_msg); \n }\n\n const migration_instance = new MigrationClass();\n\n const queryInterface: QueryInterface = this.sequelize_instance.getQueryInterface();\n\n if (operation === \"up\") {\n await migration_instance.up.bind(migration_instance)(queryInterface, this.sequelize_instance);\n await this.sequelize_instance.getQueryInterface().bulkInsert(SEQUELIZE_META_TABLE_NAME, [{ name: path.basename(file_path) }]);\n } else {\n await migration_instance.down.bind(migration_instance)(queryInterface, this.sequelize_instance);\n await this.sequelize_instance.getQueryInterface().bulkDelete(SEQUELIZE_META_TABLE_NAME, { name: path.basename(file_path) });\n }\n }\n\n // Main runner\n public async run(\n operation: MigrationOperationTypes,\n schema_name?: string,\n migration_file?: string,\n ) {\n this.logger.info(`🏃♂️ Starting Migration process Operation: ${operation.toUpperCase()}, Schema: ${schema_name}, File: ${migration_file || \"all\"}`);\n\n await this.sequelize_instance?.authenticate();\n\n this.logger.success(\"✅ Database connected.\");\n\n await this.ensureMetaTable();\n\n let files: string[] = [];\n\n if (migration_file) {\n const full_path = path.join(this.migrations_dir, migration_file);\n\n if (!fs.existsSync(full_path)){\n const log_msg = `Migration file not found: ${full_path}`;\n this.logger.error(log_msg);\n throw new Error(log_msg);\n } \n\n files = [full_path];\n } else {\n files = this.getMigrationFiles(schema_name).map(f => path.join(this.migrations_dir, f));\n }\n\n // Sort ascending for UP, descending for DOWN\n files.sort((a, b) => {\n const getPriority = (file_path: string) => {\n const file_name = file_path.split(\"/\").pop() || \"\";\n const match = file_name.match(/^(\\d+)_/);\n return match ? Number(match[1]) : Number.MAX_SAFE_INTEGER;\n };\n\n const a_priority = getPriority(a);\n const b_priority = getPriority(b);\n\n return operation === \"up\"\n ? a_priority - b_priority\n : b_priority - a_priority;\n });\n\n const applied_migrations = await this.getAppliedMigrations();\n\n for (const file of files) {\n const file_name = path.basename(file);\n\n if (operation === \"up\" && applied_migrations.includes(file_name)) {\n this.logger.info(`⏭️ Skipping already applied migration: ${file_name}`);\n continue;\n }\n if (operation === \"down\" && !applied_migrations.includes(file_name)) {\n this.logger.info(`⏭️ Skipping not-applied migration: ${file_name}`);\n continue;\n }\n\n this.logger.info(`${operation === \"up\" ? \"Applying\" : \"Reverting\"} migration: ${file_name}`);\n await this.applyMigration(file, operation);\n this.logger.success(`${operation === \"up\" ? \"Applied\" : \"Reverted\"} migration: ${file_name}`);\n }\n\n this.logger.success(`🏁 Migration process completed.`);\n }\n\n}\n\nexport default MigrationRunnerScript;\n\n// -----------------------\n// CLI ENTRY POINT\n// -----------------------\n(async () => {\n try {\n const args = process.argv.slice(2);\n\n // Parse CLI args\n const operation_arg = args.find(arg => arg.startsWith(\"--operation=\")) || \"--operation=up\";\n const schema_arg = args.find(arg => arg.startsWith(\"--schema_name=\"));\n const file_arg = args.find(arg => arg.startsWith(\"--file_name=\"));\n\n const operation = operation_arg.split(\"=\")[1] as MigrationOperationTypes;\n const schema_name = schema_arg ? schema_arg.split(\"=\")[1] : undefined;\n const migration_file = file_arg ? file_arg.split(\"=\")[1] : undefined;\n\n if (![\"up\", \"down\"].includes(operation)) {\n throw new Error(`Invalid operation: ${operation}. Must be \"up\" or \"down\".`);\n }\n\n await new MigrationRunnerScript().run(operation, schema_name, migration_file);\n process.exit(0);\n } catch (error: any) {\n console.error(\"❌\", error?.message || error);\n process.exit(1);\n }\n})();\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { SCHEMAS_DIR, SEEDERS_DIR } from \"@/config/constants\";\nimport { SEQUELIZE_SEEDER_TEMPLATE } from \"@/code_templates/sequelize_code_template\";\n\nimport { \n\tLoggerUtil,\n\tInputTransformerUtil,\n\tInputValidatorUtil,\n} from \"@/utils\";\n\nclass CreateSeederScript {\n\tprivate module_name: string = \"create_seeder_script\";\n\tprivate readonly schema_input: string;\n\tprivate readonly seeder_file_input: string;\n\tprivate readonly seeders_dir: string = SEEDERS_DIR;\n\tprivate readonly schemas_dir: string = SCHEMAS_DIR;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n\n constructor(schema_input?: string, seeder_file_input?: string) {\n\t\tif (!schema_input || !seeder_file_input) {\n\t\t\tconst log_msg = \"❌ Please provide a schema name and seeder file name.\";\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\tthis.schema_input = schema_input;\n\t\tthis.seeder_file_input = seeder_file_input;\n\t}\n\n // Method to ensure seeder file does not exists\n private ensureSeederDoesNotExist(file_path: string): void {\n\t\tif (fs.existsSync(file_path)) {\n\t\t\tconst log_msg = `❌ Seeder already exists: ${file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\t}\n\n // method to generate seeder file name\n private generateSeederFileName (\n migration_priority: number\n ): string {\n const timestamp \t\t\t\t\t= Date.now();\n const formatted_migration_priority = this.formatPriority(migration_priority)\n const seedeer_name = InputTransformerUtil.toSnakeCase(this.seeder_file_input);\n\n return `${formatted_migration_priority}_${seedeer_name}_${timestamp}.ts`\n }\n\n // Method to format migration priority number for file name\n\tprivate formatPriority(priority: number): string {\n\t\treturn priority.toString().padStart(3, \"0\");\n\t}\n\n // Method to create seeder file with content\n\tprivate createSeederFile(\n file_path: string, \n sedder_file_class_name: string, \n table_name: string\n ): void {\n\t\tconst template = SEQUELIZE_SEEDER_TEMPLATE(sedder_file_class_name, table_name);\n\n\t\ttry {\n\t\t\tfs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`❌ Failed to write seeder file: ${file_path}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n // Method to run create seeder file script\n public run(): void {\n\t\t// Transform input to schema file name (snake_case)\n\t\tconst file_base_name \t\t= InputTransformerUtil.toSchemaFileName(this.schema_input);\n\t\tconst schema_file_path \t\t= path.join(this.schemas_dir, `${file_base_name}.ts`);\n\n\t\t// Check if schema exists\n\t\tif (!fs.existsSync(schema_file_path)) {\n\t\t\tconst log_msg = `❌ Schema file not found: ${schema_file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\t// Require schema file to extract model/table info\n\t\tconst schema_module = require(schema_file_path).default;\n\n\t\tif (!schema_module) {\n\t\t\tconst log_msg = `❌ Failed to load schema file: ${schema_file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\t// Generate unique seeder file name with optional custom name or timestamp\n const { model_name, table_name, migration_priority } = schema_module;\n\n\t\tconst seeder_file_name \t\t\t\t= this.generateSeederFileName(migration_priority)\n\t\tconst file_path: string \t\t\t= path.join(this.seeders_dir, seeder_file_name);\n const seedeer_file_class_name = InputTransformerUtil.toPascalCase(this.seeder_file_input);\n\n\t\t// Ensure seeders directory exists\n\t\tInputValidatorUtil.dirExists(this.seeders_dir, true);\n\n\t\tthis.ensureSeederDoesNotExist(file_path);\n\t\tthis.createSeederFile( file_path, seedeer_file_class_name, table_name);\n\n\t\tthis.logger.success(`✅ Seeder created successfully: ${seeder_file_name}`);\n\t\tthis.logger.info(`📄 File Path: ${file_path}`);\n\t\tthis.logger.info(`🧩 Model Name: ${model_name}`);\n\t\tthis.logger.info(`🗄️ Table Name: ${table_name}`);\n\t\tthis.logger.info(`🔢 Migration Priority: ${migration_priority}`);\n\t}\n\n}\n\nexport default CreateSeederScript\n\n","import fs from \"fs\";\nimport path from \"path\";\nimport { Sequelize, QueryInterface, DataTypes } from \"sequelize\";\n\nimport { SequelizeConnector } from \"@/database\";\nimport { SEEDERS_DIR, SEQUELIZE_SEEDER_META_TABLE_NAME } from \"@/config/constants\";\nimport { LoggerUtil, InputValidatorUtil } from \"@/utils\";\nimport { SeederOperationTypes } from \"@/types/migration_type\";\n\nclass SeederRunnerScript {\n private module_name = \"seeder_runner_script\";\n private readonly seeders_dir: string = SEEDERS_DIR;\n private readonly db_connection: SequelizeConnector = SequelizeConnector?.getInstance?.();\n private readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n private readonly sequelize_instance: Sequelize;\n\n constructor() {\n InputValidatorUtil.dirExists(this.seeders_dir, true);\n\n this.sequelize_instance = this.db_connection.connect();\n }\n\n // Get all seeder files\n private getSeederFiles(seeder_name?: string): string[] {\n let files = fs.readdirSync(this.seeders_dir).filter(f => f.endsWith(\".ts\"));\n if (seeder_name) {\n files = files.filter(f => f.toLowerCase().includes(seeder_name.toLowerCase()));\n }\n return files;\n }\n\n // Ensure SequelizeSeederMeta table exists\n private async ensureMetaTable() {\n const queryInterface = this.sequelize_instance.getQueryInterface();\n const tables = await queryInterface.showAllTables();\n\n if (!tables.includes(SEQUELIZE_SEEDER_META_TABLE_NAME)) {\n this.logger.info(\"⏳ Creating Sequelize seeder meta table table...\");\n await queryInterface.createTable(SEQUELIZE_SEEDER_META_TABLE_NAME, {\n name: { type: DataTypes.STRING, allowNull: false, primaryKey: true },\n });\n this.logger.success(\"✅ SequelizeSeederMeta table created.\");\n }\n }\n\n // Get already applied seeders\n private async getAppliedSeeders(): Promise<string[]> {\n const [results] = await this.sequelize_instance.query(`SELECT name FROM \"${SEQUELIZE_SEEDER_META_TABLE_NAME}\";`);\n return Array.isArray(results) ? results.map((r: any) => r.name) : [];\n }\n\n // Apply a single seeder\n private async applySeeder(\n file_path: string, \n operation: SeederOperationTypes\n ) {\n const SeederClass = require(file_path)?.default;\n\n if (!SeederClass) {\n throw new Error(`Seeder file has no default export: ${file_path}`);\n }\n\n const seeder_instance = new SeederClass();\n const queryInterface: QueryInterface = this.sequelize_instance.getQueryInterface();\n\n if (operation === \"up\") {\n await seeder_instance.up(queryInterface, this.sequelize_instance);\n await queryInterface.bulkInsert(SEQUELIZE_SEEDER_META_TABLE_NAME, [{ name: path.basename(file_path) }]);\n } else {\n await seeder_instance.down(queryInterface, this.sequelize_instance);\n await queryInterface.bulkDelete(SEQUELIZE_SEEDER_META_TABLE_NAME, { name: path.basename(file_path) });\n }\n }\n\n // Main runner\n public async run(\n operation: SeederOperationTypes,\n seeder_name?: string,\n seeder_file?: string\n ) {\n try {\n this.logger.info(`🏃♂️ Starting seeder process Operation: ${operation.toUpperCase()}, Seeder: ${seeder_name || \"all\"}, File: ${seeder_file || \"none\"}`);\n \n await this.sequelize_instance?.authenticate();\n\n this.logger.success(\"✅ Database connected.\");\n\n await this.ensureMetaTable();\n\n let files: string[] = [];\n\n if (seeder_file) {\n const full_path = path.join(this.seeders_dir, seeder_file);\n\n if (!fs.existsSync(full_path)) { \n this.logger.error(`Seeder file not found: ${full_path}`)\n throw new Error(`Seeder file not found: ${full_path}`);\n }\n\n files = [full_path];\n } else {\n files = this.getSeederFiles(seeder_name).map(f => path.join(this.seeders_dir, f));\n }\n\n // Sort by filename: ascending for UP, descending for DOWN\n files.sort((a, b) => (operation === \"up\" ? a.localeCompare(b) : b.localeCompare(a)));\n\n const applied_seeders = await this.getAppliedSeeders();\n\n for (const file of files) {\n const file_name = path.basename(file);\n\n if (operation === \"up\" && applied_seeders.includes(file_name)) {\n this.logger.info(`⏭️ Skipping already applied seeder: ${file_name}`);\n continue;\n }\n\n if (operation === \"down\" && !applied_seeders.includes(file_name)) {\n this.logger.info(`⏭️ Skipping not-applied seeder: ${file_name}`);\n continue;\n }\n\n this.logger.info(`${operation === \"up\" ? \"Applying\" : \"Reverting\"} seeder: ${file_name}`);\n await this.applySeeder(file, operation);\n this.logger.success(`${operation === \"up\" ? \"Applied\" : \"Reverted\"} seeder: ${file_name}`);\n }\n\n this.logger.success(\"🏁 Seeder process completed.\");\n }\n catch (error: any) {\n this.logger.error(`❌ ${error?.message}`, { error })\n process.exit(1);\n }\n }\n\n}\n\nexport default SeederRunnerScript;\n\n// -----------------------\n// CLI ENTRY POINT\n// -----------------------\n(async () => {\n try {\n const args = process.argv.slice(2);\n\n const operation_arg = args.find(arg => arg.startsWith(\"--operation=\")) || \"--operation=up\";\n const seeder_arg = args.find(arg => arg.startsWith(\"--seeder=\"));\n const file_arg = args.find(arg => arg.startsWith(\"--file_name=\"));\n\n const operation = operation_arg.split(\"=\")[1] as SeederOperationTypes;\n const seeder_name = seeder_arg ? seeder_arg.split(\"=\")[1] : undefined;\n const seeder_file = file_arg ? file_arg.split(\"=\")[1] : undefined;\n\n if (![\"up\", \"down\"].includes(operation)) {\n throw new Error(`Invalid operation: ${operation}. Must be \"up\" or \"down\".`);\n }\n\n await new SeederRunnerScript().run(operation, seeder_name, seeder_file);\n process.exit(0);\n } \n catch (error: any) {\n console.error(`❌ ${error?.message}`, { error })\n process.exit(1);\n }\n})();\n\n","\nimport { LoggerUtil, EnvManagerUtil } from \"@/utils\";\n\n/**\n * Base connector abstraction for all DB / external service connectors\n */\nabstract class BaseConnector<TConnection> {\n public readonly env_manager = EnvManagerUtil.getInstance();\n public readonly logger: LoggerUtil;\n\n protected constructor(\n protected readonly connector_name: string\n ) {\n this.logger = new LoggerUtil(connector_name);\n }\n\n // Connect and return the underlying connection instance\n public abstract connect(): TConnection;\n}\n\nexport default BaseConnector;\n","import { Sequelize, Dialect } from \"sequelize\";\nimport BaseConnector from \"./base_connector\";\nimport SqlFormatterUtil from \"@/utils/sql_formatter_util\";\nimport { SequelizeConnectionOptions } from \"@/types/database_type\";\n\nclass SequelizeConnector extends BaseConnector<Sequelize> {\n private static instance: SequelizeConnector;\n private static connections: Map<string, Sequelize> = new Map();\n\n private constructor() {\n super(\"sequelize_connector\");\n }\n\n public static getInstance(): SequelizeConnector {\n if (!SequelizeConnector.instance) {\n SequelizeConnector.instance = new SequelizeConnector();\n }\n return SequelizeConnector.instance;\n }\n\n // ----------------------------------\n // SQL logging\n // ----------------------------------\n private formatSQLQueryLog = (sql: string, timing?: number): void => {\n try {\n const formatted = SqlFormatterUtil.format(sql);\n\n if (typeof timing === \"number\") {\n this.logger.info(`[SQL ${timing}ms] ${formatted}`);\n } else {\n this.logger.info(`[SQL] ${formatted}`);\n }\n } catch (error) {\n this.logger.error(\"Failed to log SQL query\", { error });\n }\n };\n\n // ----------------------------------\n // Single default connection\n // ----------------------------------\n\n public connect(options: SequelizeConnectionOptions = {}): Sequelize {\n return this.connectNamed(options.name ?? \"default\", options);\n }\n\n // ----------------------------------\n // Multiple named connections\n // ----------------------------------\n\n public connectNamed(\n name: string,\n options: SequelizeConnectionOptions = {}\n ): Sequelize {\n if (SequelizeConnector.connections.has(name)) {\n return SequelizeConnector.connections.get(name)!;\n }\n\n const dialect = options.dialect ?? this.env_manager.getEnvVar<Dialect>(\"DB_DIALECT\", \"postgres\");\n const logging_enabled = options.logging ?? this.env_manager.getEnvVar<boolean>(\"DB_LOGGING\", false);\n const logging = logging_enabled ? this.formatSQLQueryLog : false;\n const database = options.database ?? this.env_manager.getEnvVar<string>(\"DB_NAME\")!;\n const username = options.username ?? this.env_manager.getEnvVar<string>(\"DB_USER\")!;\n const password = options.password ?? this.env_manager.getEnvVar<string>(\"DB_PASSWORD\");\n const host = options.host ?? this.env_manager.getEnvVar<string>(\"DB_HOST\")!;\n const port = options.port ?? this.env_manager.getEnvVar<number>(\"DB_PORT\", 5432);\n\n\n const sequelize = new Sequelize({\n database,\n username,\n password,\n host,\n port,\n dialect,\n logging,\n benchmark: logging_enabled,\n });\n\n SequelizeConnector.connections.set(name, sequelize);\n\n this.logger.success(`✅ Sequelize connected [${name}]`);\n\n return sequelize;\n }\n\n // ----------------------------------\n // Utilities\n // ----------------------------------\n\n public getConnection(name = \"default\"): Sequelize | undefined {\n return SequelizeConnector.connections.get(name);\n }\n\n public hasConnection(name = \"default\"): boolean {\n return SequelizeConnector.connections.has(name);\n }\n\n public async closeConnection(name = \"default\"): Promise<void> {\n const conn = SequelizeConnector.connections.get(name);\n if (conn) {\n await conn.close();\n SequelizeConnector.connections.delete(name);\n this.logger.info(`🔌 Sequelize connection closed [${name}]`);\n }\n }\n\n public async closeAll(): Promise<void> {\n for (const [name, conn] of SequelizeConnector.connections.entries()) {\n await conn.close();\n this.logger.info(`🔌 Sequelize connection closed [${name}]`);\n }\n SequelizeConnector.connections.clear();\n }\n}\n\nexport default SequelizeConnector;\n"],"mappings":"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","names":["fs","path","path","fs","fs","path","fs","path","fs","path","fs","path","fs","path","DataTypes","fs","DataTypes","path","Sequelize","Sequelize"]}
|
|
1
|
+
{"version":3,"sources":["../../src/database/schema/schema_diff_util.ts","../../src/database/schema/schema_normalizer_util.ts","../../src/database/scripts/create_schema_script.ts","../../src/code_templates/sequelize_code_template.ts","../../src/database/scripts/make_migrations_script.ts","../../src/database/scripts/migration_runner_script.ts","../../src/database/scripts/create_seeder_script.ts","../../src/database/scripts/seeder_runner_script.ts","../../src/database/scripts/sequelize_model_generator_script.ts","../../src/database/connectors/base_connector.ts","../../src/database/connectors/sequelize_connector.ts"],"sourcesContent":["import { \n SchemaDiffInterface, \n SchemaSnapshotInterface,\n IndexFieldOptionsInterface,\n SchemaColumnInterface\n} from \"@/types/schema_type\";\n\n\n\nclass SchemaDiffUtil {\n\n private static indexKey(i: IndexFieldOptionsInterface): string {\n return JSON.stringify({\n fields: i.fields,\n unique: i.unique,\n using: i.using,\n operator: i.operator,\n });\n }\n\n public static getSchemaDifference(\n prev: SchemaSnapshotInterface, \n curr: SchemaSnapshotInterface\n ): SchemaDiffInterface {\n\n const diff: SchemaDiffInterface = {\n columns: { added: [], removed: {}, modified: {} },\n indexes: { added: [], removed: [], modified: {} },\n };\n\n // Table rename\n if (prev.table_name !== curr.table_name) {\n diff.table_renamed = {\n from: prev.table_name,\n to: curr.table_name,\n };\n }\n\n // Columns\n for (const [col_name, col_def] of Object.entries(curr.columns)) {\n const prev_col: SchemaColumnInterface = prev.columns[col_name];\n\n if(!prev_col) {\n diff.columns.added.push(col_name);\n }\n else if (JSON.stringify(prev_col) !== JSON.stringify(col_def)) {\n diff.columns.modified[col_name] = { \n before: prev_col, \n after: col_def \n };\n }\n }\n\n for (const [prev_col_name, prev_col_def] of Object.entries(prev.columns)) {\n if (!curr.columns[prev_col_name]) {\n diff.columns.removed[prev_col_name] = prev_col_def;\n }\n }\n\n // Indexes\n const prev_indexes = prev?.indexes || [];\n const curr_indexes = curr?.indexes || [];\n const prev_map = new Map(prev_indexes.map(i => [SchemaDiffUtil.indexKey(i), i]));\n const curr_map = new Map(curr_indexes.map(i => [SchemaDiffUtil.indexKey(i), i]));\n\n for (const [key, idx] of curr_map) {\n if (!prev_map.has(key)) {\n diff.indexes.added.push(idx);\n }\n }\n\n for (const [key, idx] of prev_map) {\n if (!curr_map.has(key)) {\n diff.indexes.removed.push(idx);\n }\n }\n\n // Modified indexes (same fields, different options)\n for (const curr_idx of curr_indexes) {\n const prev_idx = prev_indexes.find(\n p => JSON.stringify([...p.fields].sort()) === JSON.stringify([...curr_idx.fields].sort())\n );\n\n if (prev_idx && JSON.stringify(prev_idx) !== JSON.stringify(curr_idx)) {\n diff.indexes.modified[curr_idx?.name] = { \n before: prev_idx, \n after: curr_idx \n };\n }\n }\n\n return diff;\n }\n}\n\nexport default SchemaDiffUtil;\n","import { \n SchemaDefinitionInterface, \n SchemaSnapshotInterface \n} from \"@/types/schema_type\";\n\n\nclass SchemaNormalizerUtil {\n static normalizeColumn(column: any) {\n return {\n type: column.type?.key ?? column.type?.toString(),\n allow_null: column.allowNull ?? true,\n primary_key: !!column.primaryKey,\n auto_increment: !!column.autoIncrement,\n unique: !!column.unique,\n default_value: column.defaultValue ?? null,\n references: column.references ?? null,\n on_update: column.onUpdate ?? null,\n on_delete: column.onDelete ?? null,\n };\n }\n\n static normalizeIndex(index: any) {\n return {\n name: index.name ?? null,\n fields: [...index.fields].sort(),\n unique: !!index.unique,\n using: index.using ?? null,\n operator: index.operator ?? null,\n };\n }\n\n static normalizeSchema(\n schema: SchemaDefinitionInterface\n ): SchemaSnapshotInterface {\n return {\n database_name: schema.database_name,\n table_name: schema.table_name,\n model_name: schema.model_name,\n migration_priority: schema.migration_priority,\n timestamps: schema.timestamps,\n\n columns: Object.fromEntries(\n Object.entries(schema.columns).map(([key, col]) => [\n key,\n this.normalizeColumn(col),\n ])\n ),\n\n indexes: (schema.indexes ?? []).map(this.normalizeIndex),\n };\n }\n}\n\nexport default SchemaNormalizerUtil\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { SCHEMAS_DIR } from \"@/config/constants\";\nimport { SEQUELIZE_SCHEMA_CODE_TEMPLATE } from \"@/code_templates/sequelize_code_template\"\n\nimport { \n\tLoggerUtil,\n\tInputTransformerUtil,\n\tInputValidatorUtil,\n} from \"@/utils\";\n\nclass CreateSchemaScript {\n\tprivate name: string = \"create_schema_script\"\n\tprivate readonly raw_input: string;\n\tprivate readonly schemas_dir: string;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor(raw_input?: string) {\n\t\tif (!raw_input) {\n\t\t\tconst log_msg = \"❌ Please provide a schema name.\"\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\tthis.raw_input \t\t= raw_input;\n\t\tthis.schemas_dir \t= SCHEMAS_DIR;\n\t}\n\n // Method to ensure schema does not exist\n\tprivate ensureSchemaDoesNotExist(file_path: string): void {\n\t\tif (fs.existsSync(file_path)) {\n\t\t\tconst log_msg = `❌ Schema already exists. File: ${file_path}`\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\t}\n\n\t// Determine next migration priority from existing schemas\n private getNextMigrationPriority(): number {\n if (!fs.existsSync(this.schemas_dir)) {\n return 1;\n }\n\n const files = fs.readdirSync(this.schemas_dir);\n\n return files.length + 1;\n }\n\n // Pad migration priority (e.g. 1 -> 001)\n private formatPriority(priority: number): string {\n return priority.toString().padStart(3, \"0\");\n }\n\n\t// Method to create schema file with boilerplate data\n\tprivate createSchemaFile(\n file_path: string, \n schema_name: string, \n model_name: string, \n table_name: string, \n migration_priority: number\n ): void {\n \tconst template = SEQUELIZE_SCHEMA_CODE_TEMPLATE(schema_name, table_name, model_name, migration_priority);\n\n\t\ttry {\n\t\t\tfs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`❌ Failed to write schema file: ${file_path}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n // Main Method to run\n\tpublic run(): void {\n\t\tconst file_base_name \t\t= InputTransformerUtil.toSchemaFileName(this.raw_input);\n const base_pascal \t\t\t= InputTransformerUtil.toPascalCase(file_base_name);\n const schema_name \t= base_pascal.toLowerCase().endsWith(\"schema\") ? base_pascal : `${base_pascal}Schema`;\n const model_name \t\t\t= base_pascal.toLowerCase().endsWith(\"schema\") ? base_pascal.replace(/Schema$/i, \"\") : base_pascal;\n const table_name \t\t\t= InputTransformerUtil.pluralizeSnakeCase(InputTransformerUtil.toSnakeCase(model_name));\n const migration_priority \t= this.getNextMigrationPriority();\n const file_name \t\t\t= `${file_base_name}.ts`;\n const file_path \t\t\t= path.join(this.schemas_dir, file_name);\n\n\t\t// Ensure schemas directory exists (create if missing)\n\t\tInputValidatorUtil.dirExists(this.schemas_dir, true);\n\n\t\tthis.ensureSchemaDoesNotExist(file_path);\n\t\tthis.createSchemaFile(file_path, schema_name, model_name, table_name, migration_priority);\n;\n\t\tthis.logger.success(\"✅ Schema created successfully Created database/schemas/${file_base_name}.ts\");\n this.logger.info(`📄 File Path: ${file_path}`);\n this.logger.info(`🧩 Schema Name: ${schema_name}`);\n this.logger.info(`📦 Model Name: ${model_name}`);\n this.logger.info(`🗄️ Table Name: ${table_name}`);\n\t}\n}\n\nexport default CreateSchemaScript;\n\n// CLI entry point\ntry {\n\tnew CreateSchemaScript(process.argv[2]).run();\n\tprocess.exit(0);\n} \ncatch (error: any) {\n\tconsole.error(error?.message || \"\");\n\tprocess.exit(1);\n}","import { \n IndexFieldOptionsInterface,\n SchemaColumnInterface, \n SchemaDiffInterface \n} from \"@/types/schema_type\";\n\nconst SEQUELIZE_SCHEMA_CODE_TEMPLATE = (\n schema_name: string, \n table_name: string, \n model_name: string, \n migration_priority: number\n): string => \n{\n return `\nimport { DataTypes } from \"sequelize\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\n\nconst ${schema_name}: SchemaDefinitionInterface = {\n database_name: \"public\",\n migration_priority: ${migration_priority},\n\n table_name: \"${table_name}\",\n model_name: \"${model_name}\",\n timestamps:true,\n\n columns: {\n id: {\n type: DataTypes.BIGINT,\n primaryKey: true,\n autoIncrement: true,\n allowNull: false,\n },\n\n created_at: {\n type: DataTypes.DATE,\n defaultValue: DataTypes.NOW,\n },\n\n updated_at: {\n type: DataTypes.DATE,\n allowNull: true,\n defaultValue: null,\n },\n },\n\n indexes: [\n { fields: [\"\"], name: \"\" },\n ],\n};\n\nexport default ${schema_name};\n`\n}\n\nconst SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE = ( \n schema_table_name: string, \n schema_model_name: string,\n schema_file_name: string \n): string => `\nimport { QueryInterface, DataTypes, Sequelize } from \"sequelize\";\nimport { LoggerUtil } from \"fiberx-backend-toolkit//utils\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\nclass Create${schema_model_name}TableMigration {\n private name: string = \"create_table_${schema_table_name}_migration_file\";\n private schema: SchemaDefinitionInterface = ${schema_model_name}Schema;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {}\n\n // Migration UP\n public async up(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, columns = {}, indexes = [] } = this.schema;\n\n await queryInterface.createTable(table_name, columns);\n\n for (const index_field_obj of indexes) {\n\n const { fields, name, index_options } = index_field_obj;\n const index_name = \\`idx_\\${table_name}_\\${fields.join(\"_\")}\\`\n \n await queryInterface.addIndex(\n table_name, \n fields, \n { name: index_name, ...index_options }\n );\n }\n\n this.logger.success(\\`✅ Table \"\\${table_name}\" for schema \"\\${model_name}Schema\" created with \"\\${this.index_attributes.length}\" indexed Fields.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Migration failed: \"\\${error.message}\"\\`);\n }\n }\n\n // Migration DOWN\n public async down(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, database_name, model_name } = this.schema;\n await queryInterface.dropTable(table_name, {});\n this.logger.success(\\`🗑️ Table \"\\${table_name}\" dropped successfully.\\`);\n } catch (error: any) {\n this.logger.error(\\`🚫 Migration rollback failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Migration rollback failed: \"\\${error.message}\"\\`);\n }\n }\n}\n\nexport default Create${schema_model_name}TableMigration;\n`;\n\nconst SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE = (\n schema_table_name: string,\n schema_model_name: string,\n diff: SchemaDiffInterface,\n schema_file_name: string\n): string => `\nimport { QueryInterface, DataTypes, Sequelize } from \"sequelize\";\nimport { LoggerUtil } from \"fiberx-backend-toolkit//utils\";\nimport { SchemaDefinitionInterface } from \"fiberx-backend-toolkit/types/schema_type\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\nclass Update${schema_model_name}TableMigration {\n private name: string = \"update_table_${schema_table_name}_migration_file\";\n private schema: SchemaDefinitionInterface = ${schema_model_name}Schema;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {}\n\n public async up(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, model_name, columns = {}, indexes = [] } = this.schema;\n\n ${diff.table_renamed ? `\n await queryInterface.renameTable(\n \"${diff.table_renamed.from}\",\n \"${diff.table_renamed.to}\"\n );` \n : \n \"\"\n }\n\n // Add columns\n ${diff.columns.added.map((column_name: string) => `\n await queryInterface.addColumn(\n table_name,\n \"${column_name}\",\n columns[\"${column_name}\"]\n );\n `).join(\"\")}\n\n // Modify columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_modified]) => `\n await queryInterface.changeColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_modified?.after)}\n );\n `\n ).join(\"\")}\n\n // Remove columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_Def]) => `\n await queryInterface.removeColumn(\n table_name, \n \"${col_name}\"\n );\n `\n ).join(\"\")}\n\n\n // Add indexes\n ${diff.indexes.added.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx.fields)}, \n ${JSON.stringify(idx)}\n );\n `\n ).join(\"\")}\n\n // Modify indexes (remove + add)\n ${Object.entries(diff.indexes.modified).map(([idx_name, idx_modified]) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx_modified.before.name)}\n );\n\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx_modified.after.fields)}, \n ${JSON.stringify(idx_modified.after)}\n );\n `\n ).join(\"\")}\n\n // Remove indexes\n ${diff.indexes.removed.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx.name)}\n );\n `\n ).join(\"\")}\n\n\n this.logger.success(\\`✅ Table \"\\${table_name}\" for schema \"\\${model_name}Schema\" updated successfully.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Update migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Update migration failed: \"\\${error.message}\"\\`);\n }\n }\n\n public async down(\n queryInterface: QueryInterface, \n Sequelize: typeof import(\"sequelize\")\n ) {\n try {\n const { table_name, model_name, columns = {} } = this.schema;\n\n // Revert Added indexes\n ${diff.indexes.added.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx.name)}\n );`\n ).join(\"\")}\n\n // Revert Modified Indexes\n ${Object.entries(diff.indexes.modified).map(([idx_name, idx_modified]) => `\n await queryInterface.removeIndex(\n table_name, \n ${JSON.stringify(idx_modified.after.name)}\n );\n\n\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx_modified.before.fields)}, \n ${JSON.stringify(idx_modified.before)}\n );`\n ).join(\"\")}\n\n // Revert removed indexes\n ${diff.indexes.removed.map( (idx: IndexFieldOptionsInterface) => `\n await queryInterface.addIndex(\n table_name, \n ${JSON.stringify(idx.fields)}, \n ${JSON.stringify(idx)}\n );`\n ).join(\"\")}\n\n // Revert Modified columns\n ${Object.entries(diff.columns.modified).map(([col_name, col_modified]) => `\n await queryInterface.changeColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_modified.before)}\n );`\n ).join(\"\")}\n\n // Revert added columns\n ${diff.columns.added.map((column_name: string) => `\n await queryInterface.removeColumn(table_name, \"${column_name}\");\n `).join(\"\")}\n\n ${Object.entries(diff.columns.modified).map(([col_name, col_Def]) => `\n await queryInterface.addColumn(\n table_name, \n \"${col_name}\", \n ${JSON.stringify(col_Def)}\n );\n `).join(\"\")}\n\n ${diff.table_renamed ? `\n await queryInterface.renameTable(\n \"${diff.table_renamed.to}\",\n \"${diff.table_renamed.from}\"\n );` : \"\"\n }\n\n this.logger.success(\\`🗑️ Rollback of table \"\\${table_name}\" completed successfully.\\`);\n } \n catch (error: any) {\n this.logger.error(\\`🚫 Rollback migration failed: \"\\${error.message}\"\\`, { error });\n throw new Error(\\`🚫 Rollback migration failed: \"\\${error.message}\"\\`);\n }\n }\n}\n\nexport default Update${schema_model_name}TableMigration;\n`;\n\nconst SEQUELIZE_SEEDER_TEMPLATE = (\n class_name: string, \n table_name: string\n): string => `\n'use strict';\n\nimport { QueryInterface } from 'sequelize';\n\nclass ${class_name}Seeder {\n\t/**\n\t * Seed method\n\t */\n\tpublic async up(queryInterface: QueryInterface): Promise<void> {\n const seed_data = this.getSeedData();\n\n\t\tif (!seed_data || seed_data.length === 0) {\n\t\t\tthrow new Error(\"❌ Seeder data for 'roles' is empty. Aborting bulk insert.\");\n\t\t}\n\n\t\tawait queryInterface.bulkInsert('${table_name.toLowerCase()}', seed_data);\n\t}\n\n\t/**\n\t * Undo seed method\n\t */\n\tpublic async down(queryInterface: QueryInterface): Promise<void> {\n const seed_data = this.getSeedData();\n\n\t\tif (!seed_data || seed_data.length === 0) {\n\t\t\tthrow new Error(\"❌ Seeder data for 'roles' is empty. Nothing to delete.\");\n\t\t}\n\n\t\tconst ids = seed_data.map(row => row.id);\n\n\t\tawait queryInterface.bulkDelete('${table_name.toLowerCase()}', { id: ids });\n\t}\n\n\t/**\n\t * Provide seed data array\n\t */\n\tprivate getSeedData(): Array<Record<string, any>> {\n\t\t// TODO: Replace this with real seed data\n\t\treturn [];\n\t}\n}\n\nexport default ${class_name}Seeder;\n`;\n\nconst SEQUELIZE_MODEL_CODE_TEMPLATE = (\n schema_model_name: string,\n schema_file_name: string,\n schema_columns: Record<string, SchemaColumnInterface>\n): string => {\n const attributes = Object.keys(schema_columns)\n .map(col => ` declare ${col}: any;`)\n .join(\"\\n\");\n\n return `\nimport { Model, Sequelize } from \"sequelize\";\nimport ${schema_model_name}Schema from \"@/database/schemas/${schema_file_name.replace(\".ts\", \"\")}\";\n\n\nclass ${schema_model_name} extends Model {\n${attributes}\n\n public static initModel(sequelize: Sequelize): typeof ${schema_model_name} {\n sequelize: Sequelize\n ): ${schema_model_name} {\n ${schema_model_name}.init(\n ${schema_model_name}Schema.columns,\n {\n sequelize,\n tableName: ${schema_model_name}Schema.table_name,\n modelName: ${schema_model_name}Schema.model_name,\n timestamps: ${schema_model_name}Schema.timestamps,\n indexes: ${schema_model_name}Schema.indexes,\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n hooks: {}\n }\n );\n return ${schema_model_name};\n } \n\n public static registerAssociations(): void {\n // Example:\n // User.belongsTo(models.Organization, { foreignKey: \"org_id\" });\n }\n}\n\nexport default ${schema_model_name}\n`\n};\n\nconst SEQUELIZE_MODELS_INDEX_CODE_TEMPLATE = (\n model_names: string[],\n imports: string,\n\n): string => {\n const exports = model_names.join(\",\\n \");\n\n return `\nimport { Sequelize } from \"sequelize\";\n${imports}\n\nconst models = {\n ${exports}\n};\n\nexport const initModels = (sequelize: Sequelize) => {\n Object.values(models).forEach(model => {\n model.initModel(sequelize);\n });\n\n Object.values(models).forEach(model => {\n model.registerAssociations();\n });\n\n return models;\n};\n\nexport default models;\n`;\n\n}\n\nexport {\n SEQUELIZE_SCHEMA_CODE_TEMPLATE,\n SEQUELIZE_SEEDER_TEMPLATE,\n SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_MODEL_CODE_TEMPLATE,\n SEQUELIZE_MODELS_INDEX_CODE_TEMPLATE\n}\n\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { \n SCHEMAS_DIR,\n MIGRATIONS_DIR,\n SCHEMA_SNAPSHOTS_DIR\n} from \"@/config/constants\";\n\nimport {\n\tSEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE,\n SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE\n} from \"@/code_templates/sequelize_code_template\"\n\nimport { \n\tLoggerUtil,\n\tInputValidatorUtil,\n InputTransformerUtil\n} from \"@/utils\";\n\nimport { \n SchemaDefinitionInterface, \n SchemaDiffInterface, \n SchemaSnapshotInterface\n} from \"@/types/schema_type\";\n\nimport {\n SchemaDiffUtil,\n SchemaNormalizerUtil\n} from \"@/database/\"\n\n\nclass MakeMigrationsScript {\n\tprivate name: string = \"make_migrations_script\";\n private readonly schemas_dir: string = SCHEMAS_DIR;\n\tprivate readonly migrations_dir: string = MIGRATIONS_DIR;\n private readonly snapshot_dir: string = SCHEMA_SNAPSHOTS_DIR;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n\tconstructor() {}\n\n private getSnapshotPath(model_name: string) {\n return path.join(this.snapshot_dir, `${InputTransformerUtil.toSnakeCase(model_name)}.schema_snapshot.json`);\n }\n\n // Method to handle generating migration file name\n private generateMigrationFilename (\n table_name: string, \n type: \"create\" | \"update\", \n migration_priority: number\n ): string {\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, '').slice(0, 14);\n return `${migration_priority}_${timestamp}_${type}_table_${table_name}.ts`;\n };\n\n // Methos to write schema snapshot\n private writeSchemaSnapshot(\n model_name: string,\n normalized_schema: SchemaSnapshotInterface\n ): boolean {\n const snapshot_path = this.getSnapshotPath(model_name);\n\n try {\n // Ensure snapshot directory exists\n InputValidatorUtil.dirExists(this.snapshot_dir, true);\n\n fs.writeFileSync(\n snapshot_path,\n JSON.stringify(normalized_schema, null, 2),\n { encoding: \"utf-8\" }\n );\n\n this.logger.success(`📸 Schema snapshot saved: ${snapshot_path}`);\n return true;\n } catch (error: any) {\n this.logger.error(`❌ Failed to write schema snapshot: ${snapshot_path}`);\n this.logger.error(error?.message || error);\n return false;\n }\n }\n\n // Method to handle create update schema table migration file\n private createUpdateSchemaMigrationFile (\n file_path: string, \n schema_file_path: string, \n schema_content: SchemaDefinitionInterface, \n schema_diff: SchemaDiffInterface\n ): boolean {\n const { table_name, model_name } = schema_content;\n \n const schema_file_name = path.basename(schema_file_path);\n\n const template = SEQUELIZE_UPDATE_EXISTING_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE(\n table_name,\n model_name,\n schema_diff,\n schema_file_name\n );\n \n try {\n fs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n } catch (error) {\n this.logger.error(`❌ Failed to write create update schema migration file: ${file_path}`);\n return false\n }\n\n return true\n }\n\n // Method to handle create new schema table migration file\n private createNewSchemaMigrationFile (\n file_path: string, \n schema_file_path: string, \n schema_content: SchemaDefinitionInterface\n ): boolean {\n const { table_name, model_name } = schema_content;\n\n const schema_file_name = path.basename(schema_file_path);\n\n const template = SEQUELIZE_CREATE_NEW_SCHEMA_MIGRATION_FILE_CODE_TEMPLATE(\n table_name, \n model_name,\n schema_file_name\n );\n \n try {\n fs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n } catch (error) {\n this.logger.error(`❌ Failed to write create new schema migration file: ${file_path}`);\n return false\n }\n\n return true\n }\n\n // Method to handle creating migration files for new and updated schemas\n private createMigrationForSchema(\n schema_file_path: string, \n schema_content: SchemaDefinitionInterface\n ) {\n this.logger.info(`💾 Ready to create migration for: ${schema_file_path}`);\n \n const { table_name, migration_priority, model_name, } = schema_content;\n\n if (!table_name) {\n this.logger.error(`❌ Schema has no table_name: ${schema_file_path}`);\n return;\n }\n\n const normalized_schema = SchemaNormalizerUtil.normalizeSchema(schema_content);\n const snapshot_path = this.getSnapshotPath(model_name);\n const operation = !fs.existsSync(snapshot_path) ? \"create\" : \"update\";\n const migration_file_name = this.generateMigrationFilename(table_name, operation, migration_priority);\n const migration_file_path = path.join(this.migrations_dir, migration_file_name);\n\n let migration_file_created: boolean = false\n\n if (!fs.existsSync(snapshot_path)) {\n this.logger.info(`Creating Migration File for New schema: ${model_name}Schema`);\n migration_file_created = this.createNewSchemaMigrationFile(migration_file_path, schema_file_path, schema_content);\n }\n else {\n // Existing migration → UPDATE\n this.logger.info(`🔄 Found existing migration snapshots: ${snapshot_path} → checking for updates...`);\n\n const previous_snapshot: SchemaSnapshotInterface = JSON.parse(fs.readFileSync(snapshot_path, \"utf-8\"));\n const diff: SchemaDiffInterface = SchemaDiffUtil.getSchemaDifference(previous_snapshot, normalized_schema);\n\n if (\n !diff.table_renamed &&\n !diff.columns.added.length &&\n !diff.columns.removed.length &&\n !Object.keys(diff.columns.modified).length &&\n !diff.indexes.added.length &&\n !diff.indexes.removed.length\n ) {\n this.logger.info(\"ℹ️ No schema changes detected\");\n return false;\n }\n\n migration_file_created = this.createUpdateSchemaMigrationFile(\n migration_file_path, \n schema_file_path, \n schema_content,\n diff\n );\n }\n\n if (migration_file_created) {\n this.logger.success(`✅ Migration file created: ${migration_file_name}`);\n\n // Update snapshot AFTER successful migration creation\n const snapshot_written = this.writeSchemaSnapshot(model_name, normalized_schema);\n\n if (!snapshot_written) {\n this.logger.error(`⚠️ Migration created but snapshot update failed for \"${model_name}\"`);\n }\n } else {\n this.logger.info(`ℹ️ No migration created for table \"${table_name}\".`);\n }\n return migration_file_created;\n \n }\n\n // Main Method\n\tpublic run(): void {\n this.logger.info(`🔍 Scanning schemas in directory: ${this.schemas_dir}`);\n\n // Ensure directory exists\n InputValidatorUtil.dirExists(this.schemas_dir, true);\n InputValidatorUtil.dirExists(this.migrations_dir, true);\n\n // Fetch all TypeScript schema files\n const schema_files = fs.readdirSync(this.schemas_dir).filter(file => file.endsWith(\".ts\"));\n\n if (!schema_files.length) {\n this.logger.info(\"⚠️ No schema files found.\");\n return;\n }\n\n this.logger.info(`✅ Found ${schema_files.length} schema file(s).`);\n\n let created_count = 0;\n let failed_count = 0;\n\n for (const file of schema_files) {\n const file_path = path.join(this.schemas_dir, file);\n\n try {\n // Dynamically import the schema\n // Using require + resolve to get absolute path\n const schema_module = require(file_path);\n\n this.logger.info(`Processing schema file: ${file_path}`);\n \n // Log details if default export exists\n if (schema_module?.default) {\n const schema_content = schema_module.default;\n this.logger.info(`Schema Name: ${schema_content?.model_name || \"N/A\"}Schema`);\n this.logger.info(`Model Name: ${schema_content?.model_name || \"N/A\"}`);\n this.logger.info(`Table Name: ${schema_content?.table_name || \"N/A\"}`);\n\n // Pass to migration creation logic\n const created = this.createMigrationForSchema(file_path, schema_content);\n\n if (created) { created_count++; }\n } else {\n this.logger.error(`⚠️ Schema file has no default export: ${file_path}`);\n failed_count++;\n }\n } \n catch (error: any) {\n this.logger.error(`❌ Failed to load schema file: ${file_path}`);\n this.logger.error(`Error: ${error?.message || error}`);\n failed_count++;\n }\n }\n\n this.logger.success(`🏁 Migration generation summary:`);\n this.logger.success(`Successfully processed: ${created_count}`);\n this.logger.success(`Failed: ${failed_count}`);\n }\n\n}\n\nexport default MakeMigrationsScript\n\n// CLI entry point\ntry {\n\tnew MakeMigrationsScript().run();\n} \ncatch (error: any) {\n\tconsole.error(error?.message || \"\");\n\tprocess.exit(1);\n}\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { Sequelize, QueryInterface, DataTypes } from \"sequelize\";\n\nimport { SequelizeConnector } from \"@/database\";\nimport { MIGRATIONS_DIR, SEQUELIZE_META_TABLE_NAME } from \"@/config/constants\";\nimport { LoggerUtil, InputValidatorUtil, } from \"@/utils\";\nimport { MigrationOperationTypes } from \"@/types/migration_type\";\n\nclass MigrationRunnerScript {\n private module_name = \"migration_runner_script\";\n private readonly migrations_dir: string = MIGRATIONS_DIR;\n private readonly db_connection: SequelizeConnector = SequelizeConnector?.getInstance?.();\n private readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n private readonly sequelize_instance: Sequelize;\n\n constructor() {\n InputValidatorUtil.dirExists(this.migrations_dir, true);\n\n this.sequelize_instance = this.db_connection.connect();\n }\n\n // Fetch all migration files\n private getMigrationFiles(schema_name?: string): string[] {\n const files = fs.readdirSync(this.migrations_dir).filter(f => f.endsWith(\".ts\"));\n\n if (schema_name) {\n return files.filter(f => f.toLowerCase().includes(schema_name.toLowerCase()));\n }\n return files;\n }\n\n // Ensure SequelizeMeta table exists\n private async ensureMetaTable() {\n const queryInterface = this.sequelize_instance.getQueryInterface();\n const table_names = await queryInterface.showAllTables();\n\n if (!table_names.includes(SEQUELIZE_META_TABLE_NAME)) {\n this.logger.info(\"⏳ Creating SequelizeMeta table...\");\n\n await queryInterface.createTable(\n SEQUELIZE_META_TABLE_NAME, \n {\n name: { \n type: DataTypes.STRING, \n allowNull: false, \n primaryKey: true \n }\n }\n );\n\n this.logger.success(\"✅ SequelizeMeta table created.\");\n }\n }\n\n // Fetch already applied migrations\n private async getAppliedMigrations(): Promise<string[]> {\n const [results] = await this.sequelize_instance.query(`SELECT name FROM \\\"${SEQUELIZE_META_TABLE_NAME}\\\";`);\n return Array.isArray(results) ? results.map((r: any) => r.name) : [];\n }\n\n // Apply a single migration\n private async applyMigration(file_path: string, operation: MigrationOperationTypes ) {\n const MigrationClass = require(file_path)?.default;\n\n if (!MigrationClass) { \n const log_msg = `Migration file has no default export: ${file_path}`\n this.logger.error(log_msg);\n throw new Error(log_msg); \n }\n\n const migration_instance = new MigrationClass();\n\n const queryInterface: QueryInterface = this.sequelize_instance.getQueryInterface();\n\n if (operation === \"up\") {\n await migration_instance.up.bind(migration_instance)(queryInterface, this.sequelize_instance);\n await this.sequelize_instance.getQueryInterface().bulkInsert(SEQUELIZE_META_TABLE_NAME, [{ name: path.basename(file_path) }]);\n } else {\n await migration_instance.down.bind(migration_instance)(queryInterface, this.sequelize_instance);\n await this.sequelize_instance.getQueryInterface().bulkDelete(SEQUELIZE_META_TABLE_NAME, { name: path.basename(file_path) });\n }\n }\n\n // Main runner\n public async run(\n operation: MigrationOperationTypes,\n schema_name?: string,\n migration_file?: string,\n ) {\n this.logger.info(`🏃♂️ Starting Migration process Operation: ${operation.toUpperCase()}, Schema: ${schema_name}, File: ${migration_file || \"all\"}`);\n\n await this.sequelize_instance?.authenticate();\n\n this.logger.success(\"✅ Database connected.\");\n\n await this.ensureMetaTable();\n\n let files: string[] = [];\n\n if (migration_file) {\n const full_path = path.join(this.migrations_dir, migration_file);\n\n if (!fs.existsSync(full_path)){\n const log_msg = `Migration file not found: ${full_path}`;\n this.logger.error(log_msg);\n throw new Error(log_msg);\n } \n\n files = [full_path];\n } else {\n files = this.getMigrationFiles(schema_name).map(f => path.join(this.migrations_dir, f));\n }\n\n // Sort ascending for UP, descending for DOWN\n files.sort((a, b) => {\n const getPriority = (file_path: string) => {\n const file_name = file_path.split(\"/\").pop() || \"\";\n const match = file_name.match(/^(\\d+)_/);\n return match ? Number(match[1]) : Number.MAX_SAFE_INTEGER;\n };\n\n const a_priority = getPriority(a);\n const b_priority = getPriority(b);\n\n return operation === \"up\"\n ? a_priority - b_priority\n : b_priority - a_priority;\n });\n\n const applied_migrations = await this.getAppliedMigrations();\n\n for (const file of files) {\n const file_name = path.basename(file);\n\n if (operation === \"up\" && applied_migrations.includes(file_name)) {\n this.logger.info(`⏭️ Skipping already applied migration: ${file_name}`);\n continue;\n }\n if (operation === \"down\" && !applied_migrations.includes(file_name)) {\n this.logger.info(`⏭️ Skipping not-applied migration: ${file_name}`);\n continue;\n }\n\n this.logger.info(`${operation === \"up\" ? \"Applying\" : \"Reverting\"} migration: ${file_name}`);\n await this.applyMigration(file, operation);\n this.logger.success(`${operation === \"up\" ? \"Applied\" : \"Reverted\"} migration: ${file_name}`);\n }\n\n this.logger.success(`🏁 Migration process completed.`);\n }\n\n}\n\nexport default MigrationRunnerScript;\n\n// -----------------------\n// CLI ENTRY POINT\n// -----------------------\n(async () => {\n try {\n const args = process.argv.slice(2);\n\n // Parse CLI args\n const operation_arg = args.find(arg => arg.startsWith(\"--operation=\")) || \"--operation=up\";\n const schema_arg = args.find(arg => arg.startsWith(\"--schema_name=\"));\n const file_arg = args.find(arg => arg.startsWith(\"--file_name=\"));\n\n const operation = operation_arg.split(\"=\")[1] as MigrationOperationTypes;\n const schema_name = schema_arg ? schema_arg.split(\"=\")[1] : undefined;\n const migration_file = file_arg ? file_arg.split(\"=\")[1] : undefined;\n\n if (![\"up\", \"down\"].includes(operation)) {\n throw new Error(`Invalid operation: ${operation}. Must be \"up\" or \"down\".`);\n }\n\n await new MigrationRunnerScript().run(operation, schema_name, migration_file);\n process.exit(0);\n } catch (error: any) {\n console.error(\"❌\", error?.message || error);\n process.exit(1);\n }\n})();\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { SCHEMAS_DIR, SEEDERS_DIR } from \"@/config/constants\";\nimport { SEQUELIZE_SEEDER_TEMPLATE } from \"@/code_templates/sequelize_code_template\";\n\nimport { \n\tLoggerUtil,\n\tInputTransformerUtil,\n\tInputValidatorUtil,\n} from \"@/utils\";\n\nclass CreateSeederScript {\n\tprivate module_name: string = \"create_seeder_script\";\n\tprivate readonly schema_input: string;\n\tprivate readonly seeder_file_input: string;\n\tprivate readonly seeders_dir: string = SEEDERS_DIR;\n\tprivate readonly schemas_dir: string = SCHEMAS_DIR;\n\tprivate readonly logger: LoggerUtil = new LoggerUtil(this.module_name);\n\n constructor(schema_input?: string, seeder_file_input?: string) {\n\t\tif (!schema_input || !seeder_file_input) {\n\t\t\tconst log_msg = \"❌ Please provide a schema name and seeder file name.\";\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\tthis.schema_input = schema_input;\n\t\tthis.seeder_file_input = seeder_file_input;\n\t}\n\n // Method to ensure seeder file does not exists\n private ensureSeederDoesNotExist(file_path: string): void {\n\t\tif (fs.existsSync(file_path)) {\n\t\t\tconst log_msg = `❌ Seeder already exists: ${file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\t}\n\n // method to generate seeder file name\n private generateSeederFileName (\n migration_priority: number\n ): string {\n const timestamp \t\t\t\t\t= Date.now();\n const formatted_migration_priority = this.formatPriority(migration_priority)\n const seedeer_name = InputTransformerUtil.toSnakeCase(this.seeder_file_input);\n\n return `${formatted_migration_priority}_${seedeer_name}_${timestamp}.ts`\n }\n\n // Method to format migration priority number for file name\n\tprivate formatPriority(priority: number): string {\n\t\treturn priority.toString().padStart(3, \"0\");\n\t}\n\n // Method to create seeder file with content\n\tprivate createSeederFile(\n file_path: string, \n sedder_file_class_name: string, \n table_name: string\n ): void {\n\t\tconst template = SEQUELIZE_SEEDER_TEMPLATE(sedder_file_class_name, table_name);\n\n\t\ttry {\n\t\t\tfs.writeFileSync(file_path, template, { encoding: \"utf-8\" });\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`❌ Failed to write seeder file: ${file_path}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n // Method to run create seeder file script\n public run(): void {\n\t\t// Transform input to schema file name (snake_case)\n\t\tconst file_base_name \t\t= InputTransformerUtil.toSchemaFileName(this.schema_input);\n\t\tconst schema_file_path \t\t= path.join(this.schemas_dir, `${file_base_name}.ts`);\n\n\t\t// Check if schema exists\n\t\tif (!fs.existsSync(schema_file_path)) {\n\t\t\tconst log_msg = `❌ Schema file not found: ${schema_file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\t// Require schema file to extract model/table info\n\t\tconst schema_module = require(schema_file_path).default;\n\n\t\tif (!schema_module) {\n\t\t\tconst log_msg = `❌ Failed to load schema file: ${schema_file_path}`;\n\t\t\tthis.logger.error(log_msg);\n\t\t\tthrow new Error(log_msg);\n\t\t}\n\n\t\t// Generate unique seeder file name with optional custom name or timestamp\n const { model_name, table_name, migration_priority } = schema_module;\n\n\t\tconst seeder_file_name \t\t\t\t= this.generateSeederFileName(migration_priority)\n\t\tconst file_path: string \t\t\t= path.join(this.seeders_dir, seeder_file_name);\n const seedeer_file_class_name = InputTransformerUtil.toPascalCase(this.seeder_file_input);\n\n\t\t// Ensure seeders directory exists\n\t\tInputValidatorUtil.dirExists(this.seeders_dir, true);\n\n\t\tthis.ensureSeederDoesNotExist(file_path);\n\t\tthis.createSeederFile( file_path, seedeer_file_class_name, table_name);\n\n\t\tthis.logger.success(`✅ Seeder created successfully: ${seeder_file_name}`);\n\t\tthis.logger.info(`📄 File Path: ${file_path}`);\n\t\tthis.logger.info(`🧩 Model Name: ${model_name}`);\n\t\tthis.logger.info(`🗄️ Table Name: ${table_name}`);\n\t\tthis.logger.info(`🔢 Migration Priority: ${migration_priority}`);\n\t}\n\n}\n\nexport default CreateSeederScript\n\n","import fs from \"fs\";\nimport path from \"path\";\nimport { Sequelize, QueryInterface, DataTypes } from \"sequelize\";\n\nimport { SequelizeConnector } from \"@/database\";\nimport { SEEDERS_DIR, SEQUELIZE_SEEDER_META_TABLE_NAME } from \"@/config/constants\";\nimport { LoggerUtil, InputValidatorUtil } from \"@/utils\";\nimport { SeederOperationTypes } from \"@/types/migration_type\";\n\nclass SeederRunnerScript {\n private name = \"seeder_runner_script\";\n private readonly seeders_dir: string = SEEDERS_DIR;\n private readonly db_connection: SequelizeConnector = SequelizeConnector?.getInstance?.();\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly sequelize_instance: Sequelize;\n\n constructor() {\n InputValidatorUtil.dirExists(this.seeders_dir, true);\n\n this.sequelize_instance = this.db_connection.connect();\n }\n\n // Get all seeder files\n private getSeederFiles(seeder_name?: string): string[] {\n let files = fs.readdirSync(this.seeders_dir).filter(f => f.endsWith(\".ts\"));\n if (seeder_name) {\n files = files.filter(f => f.toLowerCase().includes(seeder_name.toLowerCase()));\n }\n return files;\n }\n\n // Ensure SequelizeSeederMeta table exists\n private async ensureMetaTable() {\n const queryInterface = this.sequelize_instance.getQueryInterface();\n const tables = await queryInterface.showAllTables();\n\n if (!tables.includes(SEQUELIZE_SEEDER_META_TABLE_NAME)) {\n this.logger.info(\"⏳ Creating Sequelize seeder meta table table...\");\n await queryInterface.createTable(SEQUELIZE_SEEDER_META_TABLE_NAME, {\n name: { type: DataTypes.STRING, allowNull: false, primaryKey: true },\n });\n this.logger.success(\"✅ SequelizeSeederMeta table created.\");\n }\n }\n\n // Get already applied seeders\n private async getAppliedSeeders(): Promise<string[]> {\n const [results] = await this.sequelize_instance.query(`SELECT name FROM \"${SEQUELIZE_SEEDER_META_TABLE_NAME}\";`);\n return Array.isArray(results) ? results.map((r: any) => r.name) : [];\n }\n\n // Apply a single seeder\n private async applySeeder(\n file_path: string, \n operation: SeederOperationTypes\n ) {\n const SeederClass = require(file_path)?.default;\n\n if (!SeederClass) {\n throw new Error(`Seeder file has no default export: ${file_path}`);\n }\n\n const seeder_instance = new SeederClass();\n const queryInterface: QueryInterface = this.sequelize_instance.getQueryInterface();\n\n if (operation === \"up\") {\n await seeder_instance.up(queryInterface, this.sequelize_instance);\n await queryInterface.bulkInsert(SEQUELIZE_SEEDER_META_TABLE_NAME, [{ name: path.basename(file_path) }]);\n } else {\n await seeder_instance.down(queryInterface, this.sequelize_instance);\n await queryInterface.bulkDelete(SEQUELIZE_SEEDER_META_TABLE_NAME, { name: path.basename(file_path) });\n }\n }\n\n // Main runner\n public async run(\n operation: SeederOperationTypes,\n seeder_name?: string,\n seeder_file?: string\n ) {\n try {\n this.logger.info(`🏃♂️ Starting seeder process Operation: ${operation.toUpperCase()}, Seeder: ${seeder_name || \"all\"}, File: ${seeder_file || \"none\"}`);\n \n await this.sequelize_instance?.authenticate();\n\n this.logger.success(\"✅ Database connected.\");\n\n await this.ensureMetaTable();\n\n let files: string[] = [];\n\n if (seeder_file) {\n const full_path = path.join(this.seeders_dir, seeder_file);\n\n if (!fs.existsSync(full_path)) { \n this.logger.error(`Seeder file not found: ${full_path}`)\n throw new Error(`Seeder file not found: ${full_path}`);\n }\n\n files = [full_path];\n } else {\n files = this.getSeederFiles(seeder_name).map(f => path.join(this.seeders_dir, f));\n }\n\n // Sort by filename: ascending for UP, descending for DOWN\n files.sort((a, b) => (operation === \"up\" ? a.localeCompare(b) : b.localeCompare(a)));\n\n const applied_seeders = await this.getAppliedSeeders();\n\n for (const file of files) {\n const file_name = path.basename(file);\n\n if (operation === \"up\" && applied_seeders.includes(file_name)) {\n this.logger.info(`⏭️ Skipping already applied seeder: ${file_name}`);\n continue;\n }\n\n if (operation === \"down\" && !applied_seeders.includes(file_name)) {\n this.logger.info(`⏭️ Skipping not-applied seeder: ${file_name}`);\n continue;\n }\n\n this.logger.info(`${operation === \"up\" ? \"Applying\" : \"Reverting\"} seeder: ${file_name}`);\n await this.applySeeder(file, operation);\n this.logger.success(`${operation === \"up\" ? \"Applied\" : \"Reverted\"} seeder: ${file_name}`);\n }\n\n this.logger.success(\"🏁 Seeder process completed.\");\n }\n catch (error: any) {\n this.logger.error(`❌ ${error?.message}`, { error })\n process.exit(1);\n }\n }\n\n}\n\nexport default SeederRunnerScript;\n\n// -----------------------\n// CLI ENTRY POINT\n// -----------------------\n(async () => {\n try {\n const args = process.argv.slice(2);\n\n const operation_arg = args.find(arg => arg.startsWith(\"--operation=\")) || \"--operation=up\";\n const seeder_arg = args.find(arg => arg.startsWith(\"--seeder=\"));\n const file_arg = args.find(arg => arg.startsWith(\"--file_name=\"));\n\n const operation = operation_arg.split(\"=\")[1] as SeederOperationTypes;\n const seeder_name = seeder_arg ? seeder_arg.split(\"=\")[1] : undefined;\n const seeder_file = file_arg ? file_arg.split(\"=\")[1] : undefined;\n\n if (![\"up\", \"down\"].includes(operation)) {\n throw new Error(`Invalid operation: ${operation}. Must be \"up\" or \"down\".`);\n }\n\n await new SeederRunnerScript().run(operation, seeder_name, seeder_file);\n process.exit(0);\n } \n catch (error: any) {\n console.error(`❌ ${error?.message}`, { error })\n process.exit(1);\n }\n})();\n\n","import fs from \"fs\";\nimport path from \"path\";\n\nimport { LoggerUtil, InputValidatorUtil, InputTransformerUtil } from \"@/utils\";\nimport { MODELS_DIR, SCHEMAS_DIR } from \"@/config/constants\";\nimport { SchemaDefinitionInterface } from \"@/types/schema_type\";\nimport { SEQUELIZE_MODEL_CODE_TEMPLATE, SEQUELIZE_MODELS_INDEX_CODE_TEMPLATE } from \"@/code_templates/sequelize_code_template\";\nimport { ModelGenerationResult, ModelsCreatedObj } from \"@/types\";\n\nclass SeqeulizeModelGeneratorScript {\n private name = \"sequelize_model_generator_script\";\n private readonly schemas_dir: string = SCHEMAS_DIR;\n private readonly models_dir: string = MODELS_DIR;\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);\n\n constructor() {\n InputValidatorUtil.dirExists(this.models_dir, true);\n }\n\n // Methdo to update models index\n private updateModelsIndex (models_created: ModelsCreatedObj[]): boolean {\n const index_path = path.join(this.models_dir, \"index.ts\");\n\n const model_names: string[] = [];\n\n const imports = models_created\n .map((model_obj: ModelsCreatedObj) => {\n model_names.push(model_obj.name);\n\n return `import ${model_obj.name} from \"./${model_obj.file_name.replace('.ts', '')}\";`\n }) \n .join(\"\\n\");\n\n const exports = model_names.join(\",\\n \");\n\n const template = SEQUELIZE_MODELS_INDEX_CODE_TEMPLATE(model_names, imports);\n\n try {\n fs.writeFileSync(index_path, template.trim(), { encoding: \"utf-8\" });\n this.logger.success(\"📦 models/index.ts updated\");\n return true;\n } catch (error: any) {\n this.logger.error(`❌ Failed to write model index file: ${index_path}`, { error });\n return false;\n } \n }\n\n // Generate a model file from a schema\n private generateModelFile(\n schema_file_path: string, \n schema_content: SchemaDefinitionInterface,\n model_file_name: string,\n model_file_path: string,\n ): ModelGenerationResult {\n const { table_name, model_name, columns } = schema_content;\n\n if (!table_name || !model_name || !columns) {\n this.logger.error(`Schema missing required fields: ${schema_file_path}`);\n return \"failed\";\n }\n\n const schema_base_name = path.basename(schema_file_path, \".ts\");\n\n // ✅ Skip if file already exists\n if (fs.existsSync(model_file_path)) {\n this.logger.info(`Model file already exists, skipping: ${model_file_path}`);\n return \"skipped\"\n }\n\n const template = SEQUELIZE_MODEL_CODE_TEMPLATE(model_name, schema_base_name, columns);\n\n try {\n fs.writeFileSync(model_file_path, template, { encoding: \"utf-8\" });\n this.logger.success(`✅ Model file generated: ${model_file_path}`);\n return \"created\";\n } catch (error: any) {\n this.logger.error(`❌ Failed to write model file: ${model_file_path}`, { error });\n return \"failed\";\n }\n }\n\n // Loop through all schemas and generate model files\n public generateModelsFromSchemas() {\n const schema_files = fs.readdirSync(this.schemas_dir).filter(file => file.endsWith(\".ts\"));\n\n if (!schema_files.length) {\n this.logger.info(\"⚠️ No schema files found.\");\n return;\n }\n\n let created_count = 0;\n let skipped_count = 0;\n let failed_count = 0;\n const models: ModelsCreatedObj[] = [];\n\n for (const schema_file of schema_files) {\n const schema_file_path = path.join(this.schemas_dir, schema_file);\n\n try {\n const schema_module = require(schema_file_path);\n\n if (!schema_module?.default) {\n this.logger.error(`Schema file has no default export: ${schema_file_path}`);\n failed_count++;\n continue;\n }\n\n const schema_content = schema_module.default;\n const model_file_name = `${InputTransformerUtil.toSnakeCase(schema_content.model_name)}_model.ts`;\n const model_file_path = path.join(this.models_dir, model_file_name);\n const generation_result = this.generateModelFile(schema_file_path, schema_content, model_file_name, model_file_path);\n\n if (generation_result === \"skipped\") {\n skipped_count++;\n }\n else if(generation_result === \"failed\") {\n failed_count++;\n }\n else if (generation_result === \"created\") {\n created_count++;\n }\n\n models.push({ name: schema_content.model_name, file_name: model_file_name });\n\n } catch (error: any) {\n this.logger.error(`Failed to load schema: ${schema_file_path}`, { error });\n failed_count++;\n }\n }\n\n this.logger.info(`Updating Models Index file with new models`);\n this.updateModelsIndex(models);\n\n this.logger.success(`🏁 Model generation summary:`);\n this.logger.success(`✅ Newly created: ${created_count}`);\n this.logger.success(`⚠️ Skipped (already exists): ${skipped_count}`);\n this.logger.success(`❌ Failed: ${failed_count}`);\n }\n\n\n\n}\n\nexport default SeqeulizeModelGeneratorScript;","\nimport { LoggerUtil, EnvManagerUtil } from \"@/utils\";\n\n/**\n * Base connector abstraction for all DB / external service connectors\n */\nabstract class BaseConnector<TConnection> {\n public readonly env_manager = EnvManagerUtil.getInstance();\n public readonly logger: LoggerUtil;\n\n protected constructor(\n protected readonly connector_name: string\n ) {\n this.logger = new LoggerUtil(connector_name);\n }\n\n // Connect and return the underlying connection instance\n public abstract connect(): TConnection;\n}\n\nexport default BaseConnector;\n","import { Sequelize, Dialect } from \"sequelize\";\nimport BaseConnector from \"./base_connector\";\nimport SqlFormatterUtil from \"@/utils/sql_formatter_util\";\nimport { SequelizeConnectionOptions } from \"@/types/database_type\";\n\nclass SequelizeConnector extends BaseConnector<Sequelize> {\n private static instance: SequelizeConnector;\n private static connections: Map<string, Sequelize> = new Map();\n\n private constructor() {\n super(\"sequelize_connector\");\n }\n\n public static getInstance(): SequelizeConnector {\n if (!SequelizeConnector.instance) {\n SequelizeConnector.instance = new SequelizeConnector();\n }\n return SequelizeConnector.instance;\n }\n\n // ----------------------------------\n // SQL logging\n // ----------------------------------\n private formatSQLQueryLog = (sql: string, timing?: number): void => {\n try {\n const formatted = SqlFormatterUtil.format(sql);\n\n if (typeof timing === \"number\") {\n this.logger.info(`[SQL ${timing}ms] ${formatted}`);\n } else {\n this.logger.info(`[SQL] ${formatted}`);\n }\n } catch (error) {\n this.logger.error(\"Failed to log SQL query\", { error });\n }\n };\n\n // ----------------------------------\n // Single default connection\n // ----------------------------------\n\n public connect(options: SequelizeConnectionOptions = {}): Sequelize {\n return this.connectNamed(options.name ?? \"default\", options);\n }\n\n // ----------------------------------\n // Multiple named connections\n // ----------------------------------\n\n public connectNamed(\n name: string,\n options: SequelizeConnectionOptions = {}\n ): Sequelize {\n if (SequelizeConnector.connections.has(name)) {\n return SequelizeConnector.connections.get(name)!;\n }\n\n const dialect = options.dialect ?? this.env_manager.getEnvVar<Dialect>(\"DB_DIALECT\", \"postgres\");\n const logging_enabled = options.logging ?? this.env_manager.getEnvVar<boolean>(\"DB_LOGGING\", false);\n const logging = logging_enabled ? this.formatSQLQueryLog : false;\n const database = options.database ?? this.env_manager.getEnvVar<string>(\"DB_NAME\")!;\n const username = options.username ?? this.env_manager.getEnvVar<string>(\"DB_USER\")!;\n const password = options.password ?? this.env_manager.getEnvVar<string>(\"DB_PASSWORD\");\n const host = options.host ?? this.env_manager.getEnvVar<string>(\"DB_HOST\")!;\n const port = options.port ?? this.env_manager.getEnvVar<number>(\"DB_PORT\", 5432);\n\n\n const sequelize = new Sequelize({\n database,\n username,\n password,\n host,\n port,\n dialect,\n logging,\n benchmark: logging_enabled,\n });\n\n SequelizeConnector.connections.set(name, sequelize);\n\n this.logger.success(`✅ Sequelize connected [${name}]`);\n\n return sequelize;\n }\n\n // ----------------------------------\n // Utilities\n // ----------------------------------\n\n public getConnection(name = \"default\"): Sequelize | undefined {\n return SequelizeConnector.connections.get(name);\n }\n\n public hasConnection(name = \"default\"): boolean {\n return SequelizeConnector.connections.has(name);\n }\n\n public async closeConnection(name = \"default\"): Promise<void> {\n const conn = SequelizeConnector.connections.get(name);\n if (conn) {\n await conn.close();\n SequelizeConnector.connections.delete(name);\n this.logger.info(`🔌 Sequelize connection closed [${name}]`);\n }\n }\n\n public async closeAll(): Promise<void> {\n for (const [name, conn] of SequelizeConnector.connections.entries()) {\n await conn.close();\n this.logger.info(`🔌 Sequelize connection closed [${name}]`);\n }\n SequelizeConnector.connections.clear();\n }\n}\n\nexport default SequelizeConnector;\n"],"mappings":"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","names":["fs","path","path","fs","fs","path","fs","path","fs","path","fs","path","fs","path","DataTypes","fs","DataTypes","path","fs","path","path","fs","Sequelize","Sequelize"]}
|
|
@@ -100,5 +100,10 @@ interface SequelizeConnectionOptions {
|
|
|
100
100
|
dialect?: Dialect;
|
|
101
101
|
logging?: boolean;
|
|
102
102
|
}
|
|
103
|
+
type ModelGenerationResult = "created" | "skipped" | "failed";
|
|
104
|
+
interface ModelsCreatedObj {
|
|
105
|
+
name: string;
|
|
106
|
+
file_name: string;
|
|
107
|
+
}
|
|
103
108
|
|
|
104
|
-
export type { ColumnDiffInterface as C, IndexDiffInterface as I, MigrationOperationTypes as M, SchemaColumnInterface as S, IndexFieldOptionsInterface as a, MigrationRecordInterface as b,
|
|
109
|
+
export type { ColumnDiffInterface as C, IndexDiffInterface as I, MigrationOperationTypes as M, SchemaColumnInterface as S, IndexFieldOptionsInterface as a, MigrationRecordInterface as b, ModelGenerationResult as c, ModelsCreatedObj as d, SchemaDefinitionInterface as e, SchemaDiffInterface as f, SchemaSnapshotInterface as g, SeederOperationTypes as h, SequelizeConnectionOptions as i };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, S as SchemaColumnInterface,
|
|
1
|
+
export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, c as ModelGenerationResult, d as ModelsCreatedObj, S as SchemaColumnInterface, e as SchemaDefinitionInterface, f as SchemaDiffInterface, g as SchemaSnapshotInterface, h as SeederOperationTypes, i as SequelizeConnectionOptions } from './database_type-C8LkcL6x.js';
|
|
2
2
|
export { C as CountLookupItemInterface, E as EnvConfigInterface, a as ErrorHandlingStrategyEnum, L as LogEntryInterface, b as LogLevelType, P as PaginationResultInterface, S as ServerErrorInterface } from './util_type-Yyo1nXmm.js';
|
|
3
3
|
export { C as CookieManagerOptions, a as CorsOptions, b as CorsOriginResolver, F as ForceHTTPSOptions, R as RateLimitRecord, c as RateLimiterOptions, d as ResponseFormatterOptions, S as SecureHeadersOptions } from './middle_ware_type-D8LA7qF3.js';
|
|
4
4
|
import 'sequelize';
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, S as SchemaColumnInterface,
|
|
1
|
+
export { C as ColumnDiffInterface, I as IndexDiffInterface, a as IndexFieldOptionsInterface, M as MigrationOperationTypes, b as MigrationRecordInterface, c as ModelGenerationResult, d as ModelsCreatedObj, S as SchemaColumnInterface, e as SchemaDefinitionInterface, f as SchemaDiffInterface, g as SchemaSnapshotInterface, h as SeederOperationTypes, i as SequelizeConnectionOptions } from '../database_type-C8LkcL6x.js';
|
|
2
2
|
export { C as CountLookupItemInterface, E as EnvConfigInterface, a as ErrorHandlingStrategyEnum, L as LogEntryInterface, b as LogLevelType, P as PaginationResultInterface, S as ServerErrorInterface } from '../util_type-Yyo1nXmm.js';
|
|
3
3
|
export { C as CookieManagerOptions, a as CorsOptions, b as CorsOriginResolver, F as ForceHTTPSOptions, R as RateLimitRecord, c as RateLimiterOptions, d as ResponseFormatterOptions, S as SecureHeadersOptions } from '../middle_ware_type-D8LA7qF3.js';
|
|
4
4
|
import 'sequelize';
|
package/dist/utils/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fiberx-backend-toolkit",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"description": "A TypeScript backend toolkit providing shared domain logic, infrastructure helpers, and utilities for FiberX server-side applications and services.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
File without changes
|