diff --git a/packages/sync-server/src/migrations.js b/packages/sync-server/src/migrations.js deleted file mode 100644 index 8d002a4f61..0000000000 --- a/packages/sync-server/src/migrations.js +++ /dev/null @@ -1,39 +0,0 @@ -import path, { dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -import migrate from 'migrate'; - -import { config } from './load-config'; - -export function run(direction = 'up') { - console.log( - `Checking if there are any migrations to run for direction "${direction}"...`, - ); - - const __dirname = dirname(fileURLToPath(import.meta.url)); // this directory - - return new Promise(resolve => - migrate.load( - { - stateStore: `${path.join(config.get('dataDir'), '.migrate')}${ - config.get('mode') === 'test' ? '-test' : '' - }`, - migrationsDirectory: path.join(__dirname, '../migrations'), - }, - (err, set) => { - if (err) { - throw err; - } - - set[direction](err => { - if (err) { - throw err; - } - - console.log('Migrations: DONE'); - resolve(); - }); - }, - ), - ); -} diff --git a/packages/sync-server/src/migrations.ts b/packages/sync-server/src/migrations.ts new file mode 100644 index 0000000000..363036e9c1 --- /dev/null +++ b/packages/sync-server/src/migrations.ts @@ -0,0 +1,58 @@ +import { readdir } from 'node:fs/promises'; +import path, { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { load } from 'migrate'; + +import { config } from './load-config'; + +type MigrationCallback = (err?: Error) => void; + +export async function run(direction: 'up' | 'down' = 'up'): Promise { + console.log( + `Checking if there are any migrations to run for direction "${direction}"...`, + ); + + const __dirname = dirname(fileURLToPath(import.meta.url)); // this directory + const migrationsDir = path.join(__dirname, '../migrations'); + + try { + // Load all script files in the migrations directory + const files = await readdir(migrationsDir); + const migrationsModules: Record< + string, + { + up: (next?: MigrationCallback) => void; + down: (next?: MigrationCallback) => void; + } + > = {}; + + for (const f of files + .filter(f => f.endsWith('.js') || f.endsWith('.ts')) + .sort()) { + migrationsModules[f] = await import(path.join(migrationsDir, f)); + } + + return new Promise((resolve, reject) => { + load( + { + stateStore: `${path.join(config.get('dataDir'), '.migrate')}${config.get('mode') === 'test' ? '-test' : ''}`, + migrations: migrationsModules, + }, + (err, set) => { + if (err) return reject(err); + + set[direction](err => { + if (err) return reject(err); + + console.log('Migrations: DONE'); + resolve(); + }); + }, + ); + }); + } catch (err) { + console.error('Error during migration process:', err); + throw err; + } +} diff --git a/upcoming-release-notes/6346.md b/upcoming-release-notes/6346.md new file mode 100644 index 0000000000..23f8d723ce --- /dev/null +++ b/upcoming-release-notes/6346.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [jgranick] +--- + +Fix sync-server migrations to use ESM loader