node-server-engine 2.0.0 → 2.0.1
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/utils/dbMigration/dbMigration.d.ts +1 -0
- package/dist/utils/dbMigration/dbMigration.js +13 -2
- package/dist/utils/dbMigration/dbMigration.js.map +1 -1
- package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js +29 -3
- package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ClearDbOptions, RecreateDbOptions } from './dbMigration.types';
|
|
2
|
+
export declare function getMigrationPaths(): Array<string> | undefined;
|
|
2
3
|
/** Run all the non-executed migrations one by one */
|
|
3
4
|
export declare function runPendingMigrations(): Promise<void>;
|
|
4
5
|
/** Rollback all migrations up to a specified target version */
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.getMigrationPaths = getMigrationPaths;
|
|
6
7
|
exports.rollbackMigrations = rollbackMigrations;
|
|
7
8
|
exports.runPendingMigrations = runPendingMigrations;
|
|
8
9
|
exports.testClearDB = testClearDB;
|
|
@@ -24,7 +25,8 @@ function getMigrationPaths() {
|
|
|
24
25
|
// First a user specified one, then the production default, then the development default
|
|
25
26
|
const prodDefaultPath = (0, _path.join)(process.cwd(), './dist/db/migrations');
|
|
26
27
|
const devDefaultPath = (0, _path.join)(process.cwd(), './src/db/migrations');
|
|
27
|
-
const
|
|
28
|
+
const isProduction = ['prod', 'production'].includes(process.env.NODE_ENV ?? '');
|
|
29
|
+
const path = [process.env.DB_MIGRATIONS_DIR, isProduction ? prodDefaultPath : devDefaultPath].filter(path => !!path && (0, _fs.existsSync)(path) && (0, _fs.lstatSync)(path).isDirectory());
|
|
28
30
|
(0, _report.reportDebug)({
|
|
29
31
|
namespace,
|
|
30
32
|
message: 'Obtaining Umzug migration options',
|
|
@@ -35,7 +37,16 @@ function getMigrationPaths() {
|
|
|
35
37
|
customPath: process.env.DB_MIGRATIONS_DIR
|
|
36
38
|
}
|
|
37
39
|
});
|
|
38
|
-
return path.map(p =>
|
|
40
|
+
return path.map(p => `${p}/*.${getMigrationExtension(p)}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Detect whether a migration folder holds TypeScript sources or compiled JavaScript,
|
|
45
|
+
* so migrations are found regardless of the NODE_ENV value
|
|
46
|
+
*/
|
|
47
|
+
function getMigrationExtension(directory) {
|
|
48
|
+
const hasTypeScript = (0, _fs.readdirSync)(directory).some(file => file.endsWith('.ts') && !file.endsWith('.d.ts'));
|
|
49
|
+
return hasTypeScript ? 'ts' : 'js';
|
|
39
50
|
}
|
|
40
51
|
|
|
41
52
|
/** Run all the non-executed migrations one by one */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dbMigration.js","names":["_fs","require","_path","_umzug","_migrateMetadataTable","_models","_EngineError","_Sequelize","_report","_semverCompare","cache","_interopRequireWildcard","e","t","__esModule","r","c","a","Object","defineProperty","n","__proto__","default","WeakMap","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","namespace","getMigrationPaths","prodDefaultPath","join","process","cwd","devDefaultPath","path","env","DB_MIGRATIONS_DIR","NODE_ENV","filter","existsSync","lstatSync","isDirectory","reportDebug","message","data","prodPath","devPath","customPath","map","p","runPendingMigrations","sequelize","EngineError","sqlHost","SQL_HOST","sqlDb","SQL_DB","sqlUser","SQL_USER","nodeEnv","migrateMetadataTable","migrationPaths","length","migrator","Umzug","migrations","glob","resolve","name","context","nameWithoutExtension","replace","migrationPromise","specifier","Promise","then","s","up","migration","down","getQueryInterface","storage","SequelizeStorage","logger","console","reportInfo","error","Error","String","stack","undefined","rollbackMigrations","BUILD_ID","SequelizeMeta","findAll","order","raw","rollbackUntil","find","version","semverCompare","buildId","to","testRecreateDB","options","query","SQL_TYPE","clean","testClearDB","transaction","clearDbTransaction","model","keys","models","includeMetadata","table","tableName"],"sources":["../../../src/utils/dbMigration/dbMigration.ts"],"sourcesContent":["import { existsSync, lstatSync } from 'fs';\nimport { join } from 'path';\nimport { Sequelize, Transaction } from 'sequelize';\nimport { Umzug, SequelizeStorage } from 'umzug';\nimport { ClearDbOptions, RecreateDbOptions } from './dbMigration.types';\nimport { migrateMetadataTable } from './migrateMetadataTable';\nimport { SequelizeMeta } from 'db/models';\nimport { EngineError } from 'entities/EngineError';\nimport { sequelize } from 'entities/Sequelize';\nimport { reportDebug, reportInfo } from 'utils/report';\nimport { semverCompare } from 'utils/semverCompare';\n\nconst namespace = 'engine:utils:dbMigration';\n\nfunction getMigrationPaths(): Array<string> | undefined {\n // We look between possibilities for the first directory that exists and matches our expectations\n // First a user specified one, then the production default, then the development default\n const prodDefaultPath = join(process.cwd(), './dist/db/migrations');\n const devDefaultPath = join(process.cwd(), './src/db/migrations');\n const path = [\n process.env.DB_MIGRATIONS_DIR,\n process.env.NODE_ENV === 'prod' ? prodDefaultPath : devDefaultPath\n ].filter((path) => path && existsSync(path) && lstatSync(path).isDirectory());\n reportDebug({\n namespace,\n message: 'Obtaining Umzug migration options',\n data: {\n path,\n prodPath: prodDefaultPath,\n devPath: devDefaultPath,\n customPath: process.env.DB_MIGRATIONS_DIR\n }\n });\n return path.map((p) =>\n process.env.NODE_ENV === 'prod' ? `${p}/*.js` : `${p}/*.ts`\n );\n}\n\n/** Run all the non-executed migrations one by one */\nexport async function runPendingMigrations(): Promise<void> {\n if (!sequelize)\n throw new EngineError({ message: 'Sequelize is not initialized' });\n \n try {\n reportDebug({\n namespace,\n message: 'Starting migration process',\n data: {\n sqlHost: process.env.SQL_HOST,\n sqlDb: process.env.SQL_DB,\n sqlUser: process.env.SQL_USER,\n nodeEnv: process.env.NODE_ENV\n }\n });\n\n // First make sure that the metadata table is up to date\n reportDebug({\n namespace,\n message: 'Migrating metadata table'\n });\n await migrateMetadataTable(sequelize);\n \n const migrationPaths = getMigrationPaths();\n\n if (!migrationPaths || migrationPaths.length <= 0) {\n reportDebug({\n namespace,\n message: 'No valid migration paths found.',\n data: { migrationPaths }\n });\n return;\n }\n\n // Process migrations sequentially to avoid race conditions\n for (const path of migrationPaths) {\n reportDebug({\n namespace,\n message: 'Processing migration path',\n data: { path }\n });\n\n const migrator = new Umzug({\n migrations: {\n glob: path,\n resolve: ({ name, path, context }) => {\n const nameWithoutExtension = name.replace(/\\.(ts|js)$/, '');\n \n // Use dynamic import for better TypeScript/ES module support\n const migrationPromise = import(path || '');\n return {\n name: nameWithoutExtension,\n up: async () => {\n reportDebug({\n namespace,\n message: `Running migration: ${nameWithoutExtension}`\n });\n const migration = await migrationPromise;\n return migration.up(context);\n },\n down: async () => {\n const migration = await migrationPromise;\n return migration.down(context);\n }\n };\n }\n },\n context: sequelize.getQueryInterface(),\n storage: new SequelizeStorage({ sequelize }),\n logger: console\n });\n\n reportDebug({\n namespace,\n message: 'Starting pending database migrations',\n data: { path }\n });\n \n await migrator.up();\n \n reportInfo({\n message: 'Database migration completed successfully',\n data: { path }\n });\n }\n } catch (error) {\n reportDebug({\n namespace,\n message: 'Migration failed with error',\n data: {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n sqlHost: process.env.SQL_HOST,\n sqlDb: process.env.SQL_DB\n }\n });\n throw error;\n }\n}\n\n/** Rollback all migrations up to a specified target version */\nexport async function rollbackMigrations(): Promise<void> {\n if (!sequelize)\n throw new EngineError({ message: 'Sequelize is not initialized' });\n if (!process.env.BUILD_ID)\n throw new EngineError({ message: 'BUILD_ID is not defined' });\n\n // Fetch executed migrations in ascending order\n const migrations = await SequelizeMeta.findAll({\n order: [['name', 'ASC']],\n raw: true\n });\n const rollbackUntil = migrations.find(\n (migration) =>\n migration.version &&\n semverCompare(migration.version, process.env.BUILD_ID as string) === 1\n );\n\n if (!rollbackUntil) {\n reportDebug({\n namespace,\n message: 'No rollback target found for the current BUILD_ID.',\n data: { buildId: process.env.BUILD_ID }\n });\n return;\n }\n\n const migrationPaths = getMigrationPaths();\n\n if (!migrationPaths || migrationPaths.length <= 0) {\n reportDebug({\n namespace,\n message: 'No valid migration paths found for rollback.',\n data: { migrationPaths }\n });\n return;\n }\n\n // Process rollback migrations sequentially\n for (const path of migrationPaths) {\n const migrator = new Umzug({\n migrations: {\n glob: path,\n resolve: ({ name, path, context }) => {\n // Strip file extension to ensure consistent naming across .ts and .js files\n const nameWithoutExtension = name.replace(/\\.(ts|js)$/, '');\n \n const migrationPromise = import(path || '');\n return {\n name: nameWithoutExtension,\n up: async () => {\n const migration = await migrationPromise;\n return migration.up(context);\n },\n down: async () => {\n const migration = await migrationPromise;\n return migration.down(context);\n }\n };\n }\n },\n context: sequelize.getQueryInterface(),\n storage: new SequelizeStorage({ sequelize }),\n logger: console\n });\n\n reportDebug({\n namespace,\n message: `Rolling back migrations up to: ${rollbackUntil.name}`,\n data: { path }\n });\n\n await migrator.down({ to: rollbackUntil.name });\n }\n}\n\n/**\n * Recreate the whole database\n * Quick way to make sure that we are working on a clean database\n * /!\\ Should only be used when running tests\n */\nexport async function testRecreateDB(\n options: RecreateDbOptions = {}\n): Promise<void> {\n if (!sequelize)\n throw new EngineError({ message: 'Sequelize is not initialized' });\n await sequelize.query(\n `DROP SCHEMA public${process.env.SQL_TYPE === 'postgres' ? ' CASCADE' : ''}`\n );\n await sequelize.query(`CREATE SCHEMA public`);\n if (!options.clean) await runPendingMigrations();\n}\n\n/**\n * Empty all the schemas in the database\n * Quick way to flush the database data while keep the structure\n * /!\\ Should only be used when running tests\n */\nexport async function testClearDB(options: ClearDbOptions = {}): Promise<void> {\n if (!sequelize)\n throw new EngineError({ message: 'Sequelize is not initialized' });\n await sequelize.transaction(clearDbTransaction(sequelize, options));\n}\n\n/** DB clearing transaction */\nfunction clearDbTransaction(sequelize: Sequelize, options: ClearDbOptions) {\n return async (t: Transaction): Promise<void> => {\n for (const model of Object.keys(sequelize.models)) {\n // We ignore the migration metadata schema\n if (!options.includeMetadata && model === 'sequelizeMeta') continue;\n const table = sequelize.models[model].tableName;\n await sequelize.query(\n `TRUNCATE ${table}${process.env.SQL_TYPE === 'postgres' ? ' CASCADE' : ''};`,\n {\n raw: true,\n transaction: t\n }\n );\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"dbMigration.js","names":["_fs","require","_path","_umzug","_migrateMetadataTable","_models","_EngineError","_Sequelize","_report","_semverCompare","cache","_interopRequireWildcard","e","t","__esModule","r","c","a","Object","defineProperty","n","__proto__","default","WeakMap","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","namespace","getMigrationPaths","prodDefaultPath","join","process","cwd","devDefaultPath","isProduction","includes","env","NODE_ENV","path","DB_MIGRATIONS_DIR","filter","existsSync","lstatSync","isDirectory","reportDebug","message","data","prodPath","devPath","customPath","map","p","getMigrationExtension","directory","hasTypeScript","readdirSync","some","file","endsWith","runPendingMigrations","sequelize","EngineError","sqlHost","SQL_HOST","sqlDb","SQL_DB","sqlUser","SQL_USER","nodeEnv","migrateMetadataTable","migrationPaths","length","migrator","Umzug","migrations","glob","resolve","name","context","nameWithoutExtension","replace","migrationPromise","specifier","Promise","then","s","up","migration","down","getQueryInterface","storage","SequelizeStorage","logger","console","reportInfo","error","Error","String","stack","undefined","rollbackMigrations","BUILD_ID","SequelizeMeta","findAll","order","raw","rollbackUntil","find","version","semverCompare","buildId","to","testRecreateDB","options","query","SQL_TYPE","clean","testClearDB","transaction","clearDbTransaction","model","keys","models","includeMetadata","table","tableName"],"sources":["../../../src/utils/dbMigration/dbMigration.ts"],"sourcesContent":["import { existsSync, lstatSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { Sequelize, Transaction } from 'sequelize';\nimport { Umzug, SequelizeStorage } from 'umzug';\nimport { ClearDbOptions, RecreateDbOptions } from './dbMigration.types';\nimport { migrateMetadataTable } from './migrateMetadataTable';\nimport { SequelizeMeta } from 'db/models';\nimport { EngineError } from 'entities/EngineError';\nimport { sequelize } from 'entities/Sequelize';\nimport { reportDebug, reportInfo } from 'utils/report';\nimport { semverCompare } from 'utils/semverCompare';\n\nconst namespace = 'engine:utils:dbMigration';\n\nexport function getMigrationPaths(): Array<string> | undefined {\n // We look between possibilities for the first directory that exists and matches our expectations\n // First a user specified one, then the production default, then the development default\n const prodDefaultPath = join(process.cwd(), './dist/db/migrations');\n const devDefaultPath = join(process.cwd(), './src/db/migrations');\n const isProduction = ['prod', 'production'].includes(\n process.env.NODE_ENV ?? ''\n );\n const path = [\n process.env.DB_MIGRATIONS_DIR,\n isProduction ? prodDefaultPath : devDefaultPath\n ].filter(\n (path): path is string =>\n !!path && existsSync(path) && lstatSync(path).isDirectory()\n );\n reportDebug({\n namespace,\n message: 'Obtaining Umzug migration options',\n data: {\n path,\n prodPath: prodDefaultPath,\n devPath: devDefaultPath,\n customPath: process.env.DB_MIGRATIONS_DIR\n }\n });\n return path.map((p) => `${p}/*.${getMigrationExtension(p)}`);\n}\n\n/**\n * Detect whether a migration folder holds TypeScript sources or compiled JavaScript,\n * so migrations are found regardless of the NODE_ENV value\n */\nfunction getMigrationExtension(directory: string): 'ts' | 'js' {\n const hasTypeScript = readdirSync(directory).some(\n (file) => file.endsWith('.ts') && !file.endsWith('.d.ts')\n );\n return hasTypeScript ? 'ts' : 'js';\n}\n\n/** Run all the non-executed migrations one by one */\nexport async function runPendingMigrations(): Promise<void> {\n if (!sequelize)\n throw new EngineError({ message: 'Sequelize is not initialized' });\n \n try {\n reportDebug({\n namespace,\n message: 'Starting migration process',\n data: {\n sqlHost: process.env.SQL_HOST,\n sqlDb: process.env.SQL_DB,\n sqlUser: process.env.SQL_USER,\n nodeEnv: process.env.NODE_ENV\n }\n });\n\n // First make sure that the metadata table is up to date\n reportDebug({\n namespace,\n message: 'Migrating metadata table'\n });\n await migrateMetadataTable(sequelize);\n \n const migrationPaths = getMigrationPaths();\n\n if (!migrationPaths || migrationPaths.length <= 0) {\n reportDebug({\n namespace,\n message: 'No valid migration paths found.',\n data: { migrationPaths }\n });\n return;\n }\n\n // Process migrations sequentially to avoid race conditions\n for (const path of migrationPaths) {\n reportDebug({\n namespace,\n message: 'Processing migration path',\n data: { path }\n });\n\n const migrator = new Umzug({\n migrations: {\n glob: path,\n resolve: ({ name, path, context }) => {\n const nameWithoutExtension = name.replace(/\\.(ts|js)$/, '');\n \n // Use dynamic import for better TypeScript/ES module support\n const migrationPromise = import(path || '');\n return {\n name: nameWithoutExtension,\n up: async () => {\n reportDebug({\n namespace,\n message: `Running migration: ${nameWithoutExtension}`\n });\n const migration = await migrationPromise;\n return migration.up(context);\n },\n down: async () => {\n const migration = await migrationPromise;\n return migration.down(context);\n }\n };\n }\n },\n context: sequelize.getQueryInterface(),\n storage: new SequelizeStorage({ sequelize }),\n logger: console\n });\n\n reportDebug({\n namespace,\n message: 'Starting pending database migrations',\n data: { path }\n });\n \n await migrator.up();\n \n reportInfo({\n message: 'Database migration completed successfully',\n data: { path }\n });\n }\n } catch (error) {\n reportDebug({\n namespace,\n message: 'Migration failed with error',\n data: {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n sqlHost: process.env.SQL_HOST,\n sqlDb: process.env.SQL_DB\n }\n });\n throw error;\n }\n}\n\n/** Rollback all migrations up to a specified target version */\nexport async function rollbackMigrations(): Promise<void> {\n if (!sequelize)\n throw new EngineError({ message: 'Sequelize is not initialized' });\n if (!process.env.BUILD_ID)\n throw new EngineError({ message: 'BUILD_ID is not defined' });\n\n // Fetch executed migrations in ascending order\n const migrations = await SequelizeMeta.findAll({\n order: [['name', 'ASC']],\n raw: true\n });\n const rollbackUntil = migrations.find(\n (migration) =>\n migration.version &&\n semverCompare(migration.version, process.env.BUILD_ID as string) === 1\n );\n\n if (!rollbackUntil) {\n reportDebug({\n namespace,\n message: 'No rollback target found for the current BUILD_ID.',\n data: { buildId: process.env.BUILD_ID }\n });\n return;\n }\n\n const migrationPaths = getMigrationPaths();\n\n if (!migrationPaths || migrationPaths.length <= 0) {\n reportDebug({\n namespace,\n message: 'No valid migration paths found for rollback.',\n data: { migrationPaths }\n });\n return;\n }\n\n // Process rollback migrations sequentially\n for (const path of migrationPaths) {\n const migrator = new Umzug({\n migrations: {\n glob: path,\n resolve: ({ name, path, context }) => {\n // Strip file extension to ensure consistent naming across .ts and .js files\n const nameWithoutExtension = name.replace(/\\.(ts|js)$/, '');\n \n const migrationPromise = import(path || '');\n return {\n name: nameWithoutExtension,\n up: async () => {\n const migration = await migrationPromise;\n return migration.up(context);\n },\n down: async () => {\n const migration = await migrationPromise;\n return migration.down(context);\n }\n };\n }\n },\n context: sequelize.getQueryInterface(),\n storage: new SequelizeStorage({ sequelize }),\n logger: console\n });\n\n reportDebug({\n namespace,\n message: `Rolling back migrations up to: ${rollbackUntil.name}`,\n data: { path }\n });\n\n await migrator.down({ to: rollbackUntil.name });\n }\n}\n\n/**\n * Recreate the whole database\n * Quick way to make sure that we are working on a clean database\n * /!\\ Should only be used when running tests\n */\nexport async function testRecreateDB(\n options: RecreateDbOptions = {}\n): Promise<void> {\n if (!sequelize)\n throw new EngineError({ message: 'Sequelize is not initialized' });\n await sequelize.query(\n `DROP SCHEMA public${process.env.SQL_TYPE === 'postgres' ? ' CASCADE' : ''}`\n );\n await sequelize.query(`CREATE SCHEMA public`);\n if (!options.clean) await runPendingMigrations();\n}\n\n/**\n * Empty all the schemas in the database\n * Quick way to flush the database data while keep the structure\n * /!\\ Should only be used when running tests\n */\nexport async function testClearDB(options: ClearDbOptions = {}): Promise<void> {\n if (!sequelize)\n throw new EngineError({ message: 'Sequelize is not initialized' });\n await sequelize.transaction(clearDbTransaction(sequelize, options));\n}\n\n/** DB clearing transaction */\nfunction clearDbTransaction(sequelize: Sequelize, options: ClearDbOptions) {\n return async (t: Transaction): Promise<void> => {\n for (const model of Object.keys(sequelize.models)) {\n // We ignore the migration metadata schema\n if (!options.includeMetadata && model === 'sequelizeMeta') continue;\n const table = sequelize.models[model].tableName;\n await sequelize.query(\n `TRUNCATE ${table}${process.env.SQL_TYPE === 'postgres' ? ' CASCADE' : ''};`,\n {\n raw: true,\n transaction: t\n }\n );\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -8,6 +8,28 @@ var _sequelize = require("sequelize");
|
|
|
8
8
|
var _report = require("../../report");
|
|
9
9
|
const namespace = 'engine:utils:dbMigration';
|
|
10
10
|
|
|
11
|
+
/** List the tables of the current database (not of every database on the server) */
|
|
12
|
+
function listTablesQuery(sqlType) {
|
|
13
|
+
switch (sqlType) {
|
|
14
|
+
case 'sqlite':
|
|
15
|
+
return `SELECT name AS table_name FROM sqlite_master WHERE type = 'table'`;
|
|
16
|
+
case 'mysql':
|
|
17
|
+
return `SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE()`;
|
|
18
|
+
case 'postgres':
|
|
19
|
+
return `SELECT table_name FROM information_schema.tables WHERE table_schema = current_schema()`;
|
|
20
|
+
default:
|
|
21
|
+
return `SELECT table_name FROM information_schema.tables`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Extract the table name from a result row, whatever shape the driver returns */
|
|
26
|
+
function getTableName(row) {
|
|
27
|
+
if (typeof row === 'string') return row;
|
|
28
|
+
if (Array.isArray(row)) return getTableName(row[0]);
|
|
29
|
+
if (row && typeof row === 'object') return getTableName(Object.values(row)[0]);
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
11
33
|
/**
|
|
12
34
|
* Run migrations on the metadata table
|
|
13
35
|
* The table containing the migrations metadata cannot be handled through migrations
|
|
@@ -19,7 +41,7 @@ async function migrateMetadataTable(sequelize) {
|
|
|
19
41
|
namespace,
|
|
20
42
|
message: 'Executing metadata migration routine'
|
|
21
43
|
});
|
|
22
|
-
const query =
|
|
44
|
+
const query = listTablesQuery(process.env.SQL_TYPE);
|
|
23
45
|
(0, _report.reportDebug)({
|
|
24
46
|
namespace,
|
|
25
47
|
message: 'Checking for existing metadata tables',
|
|
@@ -32,8 +54,9 @@ async function migrateMetadataTable(sequelize) {
|
|
|
32
54
|
const tables = await sequelize.query(query, {
|
|
33
55
|
type: _sequelize.QueryTypes.SELECT
|
|
34
56
|
});
|
|
35
|
-
const
|
|
36
|
-
const
|
|
57
|
+
const tableNames = tables.map(getTableName);
|
|
58
|
+
const hasCustomSequelizeMeta = tableNames.includes('sequelize_meta');
|
|
59
|
+
const hasLegacySequelizeMeta = tableNames.includes('SequelizeMeta');
|
|
37
60
|
if (!hasCustomSequelizeMeta) {
|
|
38
61
|
(0, _report.reportDebug)({
|
|
39
62
|
namespace,
|
|
@@ -45,6 +68,7 @@ async function migrateMetadataTable(sequelize) {
|
|
|
45
68
|
switch (process.env.SQL_TYPE) {
|
|
46
69
|
case 'mysql':
|
|
47
70
|
case 'postgres':
|
|
71
|
+
case 'sqlite':
|
|
48
72
|
createTableQuery = `
|
|
49
73
|
CREATE TABLE sequelize_meta (
|
|
50
74
|
name VARCHAR(100) PRIMARY KEY,
|
|
@@ -98,6 +122,8 @@ async function migrateMetadataTable(sequelize) {
|
|
|
98
122
|
case 'mysql':
|
|
99
123
|
case 'postgres':
|
|
100
124
|
return `('${migration.name}', NULL, NOW(), NOW())`;
|
|
125
|
+
case 'sqlite':
|
|
126
|
+
return `('${migration.name}', NULL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`;
|
|
101
127
|
case 'mssql':
|
|
102
128
|
return `('${migration.name}', NULL, GETDATE(), GETDATE())`;
|
|
103
129
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrateMetadataTable.js","names":["_sequelize","require","_report","namespace","
|
|
1
|
+
{"version":3,"file":"migrateMetadataTable.js","names":["_sequelize","require","_report","namespace","listTablesQuery","sqlType","getTableName","row","Array","isArray","Object","values","undefined","migrateMetadataTable","sequelize","reportDebug","message","query","process","env","SQL_TYPE","data","tables","type","QueryTypes","SELECT","tableNames","map","hasCustomSequelizeMeta","includes","hasLegacySequelizeMeta","createTableQuery","Error","RAW","migrations","insertQuery","migration","name","join","INSERT","error","reportError","String","stack","sqlHost","SQL_HOST"],"sources":["../../../../src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts"],"sourcesContent":["import { Sequelize, QueryTypes } from 'sequelize';\nimport { SequelizeMeta } from 'db/models';\nimport { reportDebug, reportError } from 'utils/report';\n\nconst namespace = 'engine:utils:dbMigration';\n\n/** List the tables of the current database (not of every database on the server) */\nfunction listTablesQuery(sqlType?: string): string {\n switch (sqlType) {\n case 'sqlite':\n return `SELECT name AS table_name FROM sqlite_master WHERE type = 'table'`;\n case 'mysql':\n return `SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE()`;\n case 'postgres':\n return `SELECT table_name FROM information_schema.tables WHERE table_schema = current_schema()`;\n default:\n return `SELECT table_name FROM information_schema.tables`;\n }\n}\n\n/** Extract the table name from a result row, whatever shape the driver returns */\nfunction getTableName(row: unknown): string | undefined {\n if (typeof row === 'string') return row;\n if (Array.isArray(row)) return getTableName(row[0]);\n if (row && typeof row === 'object') return getTableName(Object.values(row)[0]);\n return undefined;\n}\n\n/**\n * Run migrations on the metadata table\n * The table containing the migrations metadata cannot be handled through migrations\n * Therefore, we use a more classic approach with this function and pure SQL queries\n */\nexport async function migrateMetadataTable(\n sequelize: Sequelize\n): Promise<void> {\n try {\n reportDebug({ namespace, message: 'Executing metadata migration routine' });\n\n const query = listTablesQuery(process.env.SQL_TYPE);\n\n reportDebug({ \n namespace, \n message: 'Checking for existing metadata tables',\n data: { sqlType: process.env.SQL_TYPE }\n });\n\n // We check if we have a custom sequelize_meta table yet\n const tables = await sequelize.query<Record<string, unknown>>(query, {\n type: QueryTypes.SELECT\n });\n const tableNames = tables.map(getTableName);\n\n const hasCustomSequelizeMeta = tableNames.includes('sequelize_meta');\n const hasLegacySequelizeMeta = tableNames.includes('SequelizeMeta');\n if (!hasCustomSequelizeMeta) {\n reportDebug({\n namespace,\n message: 'No metadata table found, creating new one'\n });\n\n // Define SQL for creating the table based on the database type\n let createTableQuery = '';\n\n switch (process.env.SQL_TYPE) {\n case 'mysql':\n case 'postgres':\n case 'sqlite':\n createTableQuery = `\n CREATE TABLE sequelize_meta (\n name VARCHAR(100) PRIMARY KEY,\n version VARCHAR(25),\n createdAt TIMESTAMP NOT NULL,\n updatedAt TIMESTAMP NOT NULL\n )`;\n break;\n case 'mssql':\n createTableQuery = `\n CREATE TABLE sequelize_meta (\n name VARCHAR(100) PRIMARY KEY,\n version VARCHAR(25),\n createdAt DATETIME NOT NULL,\n updatedAt DATETIME NOT NULL\n )`;\n break;\n default:\n throw new Error('Unsupported SQL type');\n }\n\n // Create the new sequelize_meta table if it does not exist\n reportDebug({ \n namespace, \n message: 'Creating sequelize_meta table',\n data: { sqlType: process.env.SQL_TYPE }\n });\n await sequelize.query(createTableQuery, { type: QueryTypes.RAW });\n reportDebug({ namespace, message: 'sequelize_meta table created successfully' });\n\n // Migrate the data from the old table to the new one if needed\n if (hasLegacySequelizeMeta) {\n reportDebug({\n namespace,\n message: 'Legacy metadata table found, migrating data'\n });\n\n const migrations = await sequelize.query<SequelizeMeta>(\n 'SELECT name FROM SequelizeMeta ORDER BY name',\n {\n type: QueryTypes.SELECT\n }\n );\n\n const insertQuery = `\n INSERT INTO sequelize_meta (name, version, createdAt, updatedAt) VALUES\n ${migrations\n .map((migration) => {\n switch (process.env.SQL_TYPE) {\n case 'mysql':\n case 'postgres':\n return `('${migration.name}', NULL, NOW(), NOW())`;\n case 'sqlite':\n return `('${migration.name}', NULL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`;\n case 'mssql':\n return `('${migration.name}', NULL, GETDATE(), GETDATE())`;\n default:\n throw new Error('Unsupported SQL type');\n }\n })\n .join(',')}\n `;\n\n await sequelize.query(insertQuery, { type: QueryTypes.INSERT });\n }\n }\n } catch (error) {\n reportError({\n namespace,\n message: 'Error in metadata migration',\n data: {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n sqlType: process.env.SQL_TYPE,\n sqlHost: process.env.SQL_HOST\n }\n });\n throw error;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-server-engine",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Framework used to develop backend services. This package ships with a lot of features to standardize the creation of services, letting you focus on the business logic.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|