spfn
Version:
Superfunction CLI - Add SPFN to your Next.js project
73 lines (72 loc) • 2.38 kB
JavaScript
// src/utils/function-migrations.ts
import { existsSync, readdirSync, readFileSync } from "fs";
import { join } from "path";
import chalk from "chalk";
function discoverFunctionMigrations(cwd = process.cwd()) {
const nodeModulesPath = join(cwd, "node_modules");
if (!existsSync(nodeModulesPath)) {
return [];
}
const functions = [];
const spfnDir = join(nodeModulesPath, "@spfn");
if (!existsSync(spfnDir)) {
return [];
}
const packages = readdirSync(spfnDir);
for (const pkg of packages) {
const packagePath = join(spfnDir, pkg);
const packageJsonPath = join(packagePath, "package.json");
if (!existsSync(packageJsonPath)) {
continue;
}
try {
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
const spfnConfig = packageJson.spfn;
if (!spfnConfig?.migrations) {
continue;
}
const migrationsDir = join(packagePath, spfnConfig.migrations.dir);
if (!existsSync(migrationsDir)) {
console.warn(
chalk.yellow(`\u26A0\uFE0F Package @spfn/${pkg} specifies migrations but directory not found: ${migrationsDir}`)
);
continue;
}
functions.push({
packageName: `@spfn/${pkg}`,
migrationsDir,
packagePath
});
} catch (error) {
console.warn(chalk.yellow(`\u26A0\uFE0F Failed to parse package.json for @spfn/${pkg}`));
}
}
return functions;
}
async function executeFunctionMigrations(functionMigrations) {
let executedCount = 0;
const { drizzle } = await import("drizzle-orm/postgres-js");
const { migrate } = await import("drizzle-orm/postgres-js/migrator");
const postgres = await import("postgres");
if (!process.env.DATABASE_URL) {
throw new Error("DATABASE_URL not found in environment");
}
const connection = postgres.default(process.env.DATABASE_URL, { max: 1 });
const db = drizzle(connection);
try {
for (const func of functionMigrations) {
console.log(chalk.blue(`
\u{1F4E6} Running ${func.packageName} migrations...`));
await migrate(db, { migrationsFolder: func.migrationsDir });
console.log(chalk.green(` \u2713 ${func.packageName} migrations applied`));
executedCount++;
}
} finally {
await connection.end();
}
return executedCount;
}
export {
discoverFunctionMigrations,
executeFunctionMigrations
};