@cheetah.js/cli 0.1.23 → 0.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,418 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.Migrator = void 0;
30
- const core_1 = require("@cheetah.js/core");
31
- const orm_1 = require("@cheetah.js/orm");
32
- const orm_2 = require("@cheetah.js/orm");
33
- const globby_1 = __importDefault(require("globby"));
34
- const knex = __importStar(require("knex"));
35
- const diff_calculator_1 = require("./diff-calculator");
36
- const tsNode = __importStar(require("ts-node"));
37
- const path = __importStar(require("path"));
38
- const fs = __importStar(require("fs"));
39
- class Migrator {
40
- constructor() {
41
- this.entities = new orm_2.EntityStorage();
42
- this.orm = orm_1.Orm.getInstance();
43
- if (this.orm === undefined)
44
- this.orm = new orm_1.Orm(new core_1.LoggerService(new core_1.InjectorService()));
45
- this.entities = orm_2.EntityStorage.getInstance();
46
- if (this.entities === undefined)
47
- this.entities = new orm_2.EntityStorage();
48
- }
49
- async startConnection(basePath = process.cwd()) {
50
- await this.initConfigFile(basePath);
51
- await this.initKnex();
52
- }
53
- useTsNode() {
54
- tsNode.register({
55
- compilerOptions: {
56
- module: 'CommonJS',
57
- },
58
- });
59
- }
60
- async initConfigFile(basePath) {
61
- const paths = await (0, globby_1.default)(['cheetah.config.ts'], {
62
- absolute: true,
63
- cwd: basePath,
64
- });
65
- if (paths.length === 0) {
66
- throw new Error('Config file not found');
67
- }
68
- const config = await Promise.resolve(`${paths[0]}`).then(s => __importStar(require(s)));
69
- this.config = config.default;
70
- if (typeof this.config.entities === 'string') {
71
- const paths = await (0, globby_1.default)(this.config.entities, {
72
- absolute: true,
73
- cwd: basePath,
74
- });
75
- for (const path of paths) {
76
- console.log(`Importing entity from: ${path}`);
77
- await Promise.resolve(`${path}`).then(s => __importStar(require(s)));
78
- }
79
- }
80
- await this.initOrm();
81
- }
82
- async initOrm() {
83
- const serv = new orm_1.OrmService(this.orm, this.entities);
84
- await serv.onInit(this.config);
85
- }
86
- initKnex() {
87
- this.knex = knex.default({
88
- client: this.config.driver === orm_1.PgDriver ? 'pg' : 'mysql',
89
- connection: {
90
- host: this.config.host,
91
- user: this.config.username,
92
- password: this.config.password,
93
- database: this.config.database,
94
- uri: this.config.connectionString,
95
- },
96
- debug: true,
97
- });
98
- }
99
- async run(diff) {
100
- const sql = [];
101
- for (const tableDiff of diff) {
102
- let query;
103
- if (tableDiff.newTable) {
104
- query = await this.createTable(tableDiff);
105
- }
106
- else {
107
- query = this.knex.schema
108
- .withSchema(tableDiff.schema)
109
- .table(tableDiff.tableName, (builder) => {
110
- for (const colDiff of tableDiff.colDiffs) {
111
- if (colDiff.actionType === 'INDEX') {
112
- colDiff.indexTables.forEach((indexTable) => {
113
- if (typeof indexTable.properties === 'undefined') {
114
- builder.dropIndex([], indexTable.name);
115
- }
116
- else {
117
- builder.index(indexTable.properties, indexTable.name);
118
- }
119
- });
120
- }
121
- if (colDiff.actionType === 'DELETE') {
122
- builder.dropColumn(colDiff.colName);
123
- continue;
124
- }
125
- if (colDiff.actionType === 'ALTER' &&
126
- !colDiff.colType &&
127
- typeof colDiff.colChanges === 'undefined')
128
- continue;
129
- if (typeof colDiff.colChanges?.unique !== 'undefined') {
130
- if (colDiff.colChanges?.unique) {
131
- builder.unique([colDiff.colName], `${tableDiff.tableName}_${colDiff.colName}_key`);
132
- }
133
- else {
134
- builder.dropUnique([colDiff.colName], `${tableDiff.tableName}_${colDiff.colName}_key`);
135
- }
136
- }
137
- if (typeof colDiff.colChanges?.foreignKeys !== 'undefined') {
138
- if (colDiff.colChanges.foreignKeys.length !== 0) {
139
- colDiff.colChanges.foreignKeys.forEach((fk) => {
140
- builder
141
- .foreign(colDiff.colName, `${tableDiff.tableName}_${colDiff.colName}_fk`)
142
- .references(`${fk.referencedTableName}.${fk.referencedColumnName}`);
143
- });
144
- }
145
- else {
146
- builder.dropForeign(colDiff.colName, `${tableDiff.tableName}_${colDiff.colName}_fk`);
147
- }
148
- }
149
- const columnBuilder = this.assignType(builder, colDiff, tableDiff);
150
- if (!columnBuilder)
151
- continue;
152
- if (colDiff.actionType === 'ALTER') {
153
- columnBuilder.alter({ alterNullable: false });
154
- continue;
155
- }
156
- }
157
- })
158
- .toSQL();
159
- }
160
- sql.push(...query.flatMap((q) => q.sql.concat(';')));
161
- }
162
- return sql;
163
- }
164
- async createTable(tableDiff) {
165
- return await this.knex.schema
166
- .withSchema(tableDiff.schema)
167
- .createTable(tableDiff.tableName, (builder) => {
168
- for (const diff of tableDiff.colDiffs) {
169
- if (diff.actionType === 'INDEX') {
170
- diff.indexTables.forEach((indexTable) => {
171
- if (typeof indexTable.properties === 'undefined') {
172
- builder.dropIndex([], indexTable.name);
173
- }
174
- else {
175
- if (indexTable.name.includes('pkey')) {
176
- return;
177
- }
178
- builder.index(indexTable.properties, indexTable.name);
179
- }
180
- });
181
- }
182
- if (typeof diff.colChanges?.foreignKeys !== 'undefined') {
183
- if (diff.colChanges.foreignKeys.length !== 0) {
184
- diff.colChanges.foreignKeys.forEach((fk) => {
185
- builder
186
- .foreign(diff.colName, `${tableDiff.tableName}_${diff.colName}_fk`)
187
- .references(`${fk.referencedTableName}.${fk.referencedColumnName}`);
188
- });
189
- }
190
- else {
191
- builder.dropForeign(diff.colName, `${tableDiff.tableName}_${diff.colName}_fk`);
192
- }
193
- }
194
- this.assignType(builder, diff, tableDiff);
195
- if (typeof diff.colChanges?.unique !== 'undefined') {
196
- if (diff.colChanges?.unique) {
197
- builder.unique([diff.colName], `${tableDiff.tableName}_${diff.colName}_key`);
198
- }
199
- else {
200
- builder.dropUnique([diff.colName], `${tableDiff.tableName}_${diff.colName}_key`);
201
- }
202
- }
203
- }
204
- })
205
- .toSQL();
206
- }
207
- assignType(builder, diff, tableDiff) {
208
- if (diff.actionType === 'ALTER') {
209
- if (diff.colChanges?.nullable !== undefined) {
210
- if (diff.colChanges?.nullable) {
211
- builder.setNullable(diff.colName);
212
- }
213
- }
214
- }
215
- if (!diff.colType)
216
- return;
217
- const columnName = diff.colName;
218
- const columnType = diff.colType;
219
- let columnBuilder;
220
- if (diff.colChanges?.autoIncrement !== undefined) {
221
- if (diff.colChanges?.autoIncrement) {
222
- columnBuilder = builder.increments(diff.colName, {
223
- primaryKey: diff.colChanges?.primary,
224
- });
225
- }
226
- }
227
- else {
228
- switch (columnType) {
229
- case 'varchar':
230
- columnBuilder = builder.string(columnName, diff.colLength);
231
- break;
232
- case 'text':
233
- columnBuilder = builder.text(columnName);
234
- break;
235
- case 'int':
236
- case 'numeric':
237
- case 'integer':
238
- columnBuilder = builder.integer(columnName, diff.colLength);
239
- break;
240
- case 'bigint':
241
- columnBuilder = builder.bigInteger(columnName);
242
- break;
243
- case 'double':
244
- case 'float4':
245
- case 'float':
246
- case 'decimal':
247
- columnBuilder = builder.decimal(columnName, diff.colChanges?.precision, diff.colChanges?.scale);
248
- break;
249
- case 'date':
250
- columnBuilder = builder.date(columnName);
251
- break;
252
- case 'datetime':
253
- columnBuilder = builder.datetime(columnName);
254
- break;
255
- case 'time':
256
- columnBuilder = builder.time(columnName);
257
- break;
258
- case 'timestamp':
259
- columnBuilder = builder.timestamp(columnName, {
260
- precision: diff.colLength,
261
- });
262
- break;
263
- case 'boolean':
264
- columnBuilder = builder.boolean(columnName);
265
- break;
266
- case 'json':
267
- columnBuilder = builder.json(columnName);
268
- break;
269
- case 'jsonb':
270
- columnBuilder = builder.jsonb(columnName);
271
- break;
272
- case 'enum':
273
- if (diff.actionType === 'ALTER' && diff.colChanges?.enumItems) {
274
- columnBuilder = builder
275
- .text(columnName)
276
- .checkIn(diff.colChanges.enumItems ?? [], `${columnName}_check`);
277
- }
278
- else {
279
- columnBuilder = builder.enum(columnName, diff.colChanges.enumItems ?? []);
280
- }
281
- break;
282
- case 'array':
283
- columnBuilder = builder.specificType(columnName, 'text[]');
284
- break;
285
- case 'uuid':
286
- columnBuilder = builder.uuid(columnName);
287
- break;
288
- default:
289
- columnBuilder = builder.string(columnName, diff.colLength);
290
- break;
291
- }
292
- }
293
- columnBuilder.notNullable();
294
- if (diff.colChanges?.nullable !== undefined) {
295
- if (diff.colChanges?.nullable) {
296
- columnBuilder.nullable();
297
- }
298
- }
299
- if (diff.colChanges?.default) {
300
- columnBuilder.defaultTo(diff.colChanges?.default);
301
- }
302
- if (typeof diff.colChanges?.primary !== 'undefined') {
303
- if (diff.colChanges?.primary) {
304
- columnBuilder.primary();
305
- }
306
- else {
307
- builder.dropPrimary();
308
- }
309
- }
310
- return columnBuilder;
311
- }
312
- async migrate() {
313
- await this.startConnection();
314
- const migrationTable = 'cheetah_migrations';
315
- const migrationDirectory = path.join(process.cwd(), this.config.migrationPath ?? 'database/migrations');
316
- const migrationFiles = fs
317
- .readdirSync(migrationDirectory)
318
- .filter((file) => file.endsWith('.sql'))
319
- .sort();
320
- if (migrationFiles.length === 0) {
321
- this.orm.logger.info('No migration files found');
322
- return;
323
- }
324
- this.orm.driverInstance.executeSql(`CREATE TABLE IF NOT EXISTS "${migrationTable}" ("migration_file" character varying(255) NOT NULL PRIMARY KEY UNIQUE);`);
325
- const migrated = await this.orm.driverInstance.executeSql(`SELECT * FROM "${migrationTable}" ORDER BY "migration_file" ASC;`);
326
- const lastMigration = migrated.rows[migrated.rows.length - 1];
327
- const lastMigrationIndex = migrationFiles.indexOf(lastMigration?.migration_file ?? '');
328
- const migrationsToExecute = migrationFiles.slice(lastMigrationIndex + 1);
329
- if (migrationsToExecute.length === 0) {
330
- this.orm.logger.info('Database is up to date');
331
- return;
332
- }
333
- for (const migrationFile of migrationsToExecute) {
334
- const migrationFilePath = path.join(migrationDirectory, migrationFile);
335
- const migrationContent = fs.readFileSync(migrationFilePath, {
336
- encoding: 'utf-8',
337
- });
338
- const sqlInstructions = migrationContent
339
- .split(';')
340
- .filter((sql) => sql.trim().length > 0);
341
- for (const sqlInstruction of sqlInstructions) {
342
- await this.orm.driverInstance.executeSql(sqlInstruction);
343
- }
344
- await this.orm.driverInstance.executeSql(`INSERT INTO "${migrationTable}" ("migration_file") VALUES ('${migrationFile}');`);
345
- this.orm.logger.info(`Migration executed: ${migrationFile}`);
346
- }
347
- }
348
- async generateMigration(configFile = process.cwd(), onlySql = false) {
349
- await this.startConnection(configFile);
350
- const snapshotBd = await this.snapshotBd();
351
- const snapshotEntities = await this.snapshotEntities();
352
- const calculator = new diff_calculator_1.DiffCalculator(this.entities, this.orm.driverInstance);
353
- const diff = calculator.diff(snapshotBd, snapshotEntities);
354
- const sql = this.lastTreatment(await this.run(diff));
355
- if (onlySql) {
356
- return sql;
357
- }
358
- const fs = await Promise.resolve().then(() => __importStar(require('fs')));
359
- const path = await Promise.resolve().then(() => __importStar(require('path')));
360
- const directory = path.join(process.cwd(), this.config.migrationPath ?? 'database/migrations');
361
- const fileName = `migration_${new Date().toISOString().replace(/[^\d]/g, '')}` + `.sql`;
362
- const migrationFilePath = path.join(directory, fileName);
363
- if (!fs.existsSync(directory)) {
364
- fs.mkdirSync(directory, { recursive: true });
365
- }
366
- const migrationContent = sql.join('\n');
367
- if (migrationContent.length === 0) {
368
- this.orm.logger.info('No changes detected');
369
- return;
370
- }
371
- else {
372
- fs.writeFileSync(migrationFilePath, migrationContent);
373
- this.orm.logger.info(`Migration file created: ${migrationFilePath}`);
374
- }
375
- }
376
- lastTreatment(sql) {
377
- const getDropIndexes = sql.filter((s) => s.startsWith('drop index'));
378
- const getDropColumns = sql.filter((s) => s.includes('drop column'));
379
- const dropIndexes = [];
380
- for (const dropIndex of getDropIndexes) {
381
- const indexName = dropIndex.split(' ')[2].split('_');
382
- let colName;
383
- if (indexName.length === 3) {
384
- colName = indexName[1];
385
- }
386
- else {
387
- colName = indexName[0];
388
- }
389
- colName = colName.split('.')[1].replace(/"/g, '');
390
- const dropColumn = getDropColumns.find((s) => s.includes(colName));
391
- if (dropColumn) {
392
- dropIndexes.push(dropIndex);
393
- }
394
- }
395
- const sqlFiltered = sql.filter((s) => !dropIndexes.includes(s));
396
- return sqlFiltered;
397
- }
398
- async snapshotBd() {
399
- const snapshot = [];
400
- for (const [_, values] of this.entities.entries()) {
401
- const bd = await this.orm.driverInstance.snapshot(values.tableName);
402
- if (!bd) {
403
- continue;
404
- }
405
- snapshot.push(bd);
406
- }
407
- return snapshot;
408
- }
409
- async snapshotEntities() {
410
- const snapshot = [];
411
- for (const [_, values] of this.entities.entries()) {
412
- snapshot.push(await this.entities.snapshot(values));
413
- }
414
- return snapshot;
415
- }
416
- }
417
- exports.Migrator = Migrator;
418
- //# sourceMappingURL=migrator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../src/migrator/migrator.ts"],"names":[],"mappings":"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"}