@netlify/build
Version:
Netlify build module
60 lines (59 loc) • 2.52 kB
JavaScript
import { join } from 'node:path';
import { logDbProvisioning, logDbMigrations } from '../../log/messages/core_steps.js';
import { getPackageJson } from '../../utils/package.js';
import { readMigrationEntries, getMigrationNames, getMigrationsSrc } from './utils.js';
const NPM_PACKAGE_NAME = '@netlify/database';
// TODO: Remove once we stop supporting the legacy `@netlify/db` package name.
const NPM_PACKAGE_NAME_LEGACY = '@netlify/db';
const condition = async ({ buildDir, packagePath, featureFlags }) => {
if (!featureFlags?.netlify_build_db_setup) {
return false;
}
const { packageJson } = await getPackageJson(buildDir);
if (hasDBPackage(packageJson)) {
return true;
}
if (packagePath) {
const { packageJson: workspacePackageJson } = await getPackageJson(join(buildDir, packagePath));
if (hasDBPackage(workspacePackageJson)) {
return true;
}
}
return false;
};
const coreStep = async ({ api, branch, buildDir, constants, context, logs }) => {
const siteId = constants.SITE_ID;
logDbProvisioning({ logs, branch, context });
const migrationsSrc = await getMigrationsSrc(buildDir, constants.DB_MIGRATIONS_SRC);
const entries = await readMigrationEntries(buildDir, migrationsSrc);
const migrationNames = getMigrationNames(entries);
if (migrationNames.length > 0 && migrationsSrc) {
logDbMigrations({ logs, migrations: migrationNames, srcDir: migrationsSrc });
}
const database = (await api.createSiteDatabase({ site_id: siteId }));
let connectionString = database.connection_string;
if (context !== 'production') {
const databaseBranch = (await api.createSiteDatabaseBranch({
site_id: siteId,
body: { branch_id: branch },
}));
connectionString = databaseBranch.connection_string;
}
process.env.NETLIFY_DB_URL = connectionString;
return { newEnvChanges: { NETLIFY_DB_URL: connectionString } };
};
const hasDBPackage = (packageJSON) => {
const { dependencies = {}, devDependencies = {} } = packageJSON;
return (NPM_PACKAGE_NAME in dependencies ||
NPM_PACKAGE_NAME in devDependencies ||
NPM_PACKAGE_NAME_LEGACY in dependencies ||
NPM_PACKAGE_NAME_LEGACY in devDependencies);
};
export const dbSetup = {
event: 'onPreBuild',
coreStep,
coreStepId: 'db_provision',
coreStepName: 'Netlify Database setup',
coreStepDescription: () => 'Netlify Database setup',
condition,
};