@netlify/build
Version:
Netlify build module
61 lines (60 loc) • 2.58 kB
JavaScript
import { copyFile, mkdir } from 'node:fs/promises';
import { join, resolve } from 'node:path';
import { pathExists } from 'path-exists';
import { readMigrationEntries, getMigrationsSrc } from './utils.js';
import { validateMigrations, formatValidationErrors } from './validation.js';
const condition = async ({ featureFlags, constants, buildDir }) => {
if (!featureFlags?.netlify_build_db_setup) {
return false;
}
const srcDir = await getMigrationsSrc(buildDir, constants.DB_MIGRATIONS_SRC);
if (!srcDir) {
return false;
}
return pathExists(resolve(buildDir, srcDir));
};
const coreStep = async ({ constants, buildDir, systemLog }) => {
const migrationsSrc = await getMigrationsSrc(buildDir, constants.DB_MIGRATIONS_SRC);
const srcDir = resolve(buildDir, migrationsSrc);
const destDir = resolve(buildDir, constants.DB_MIGRATIONS_DIST);
const { dirNames, fileNames } = await readMigrationEntries(buildDir, migrationsSrc);
if (dirNames.length === 0 && fileNames.length === 0) {
systemLog('No migration directories found, skipping copy.');
return {};
}
const existingSqlFiles = new Set();
for (const dirName of dirNames) {
const sqlPath = join(srcDir, dirName, 'migration.sql');
if (await pathExists(sqlPath)) {
existingSqlFiles.add(dirName);
}
}
const result = validateMigrations(dirNames, fileNames, existingSqlFiles);
if (!result.valid) {
const message = formatValidationErrors(result.errors);
throw new Error(message);
}
for (const dirName of result.dirs) {
const migrationDestDir = join(destDir, dirName);
await mkdir(migrationDestDir, { recursive: true });
await copyFile(join(srcDir, dirName, 'migration.sql'), join(migrationDestDir, 'migration.sql'));
}
for (const fileName of result.files) {
const stem = fileName.replace(/\.sql$/, '');
const migrationDestDir = join(destDir, stem);
await mkdir(migrationDestDir, { recursive: true });
await copyFile(join(srcDir, fileName), join(migrationDestDir, 'migration.sql'));
}
const totalCount = result.dirs.length + result.files.length;
systemLog(`Copied ${String(totalCount)} migration(s) to ${destDir}`);
return {};
};
export const copyDbMigrations = {
event: 'onBuild',
coreStep,
coreStepId: 'db_migrations_copy',
coreStepName: 'Netlify Database migrations',
coreStepDescription: () => 'Copy database migrations to internal directory',
condition,
quiet: true,
};