UNPKG

spfn

Version:

Superfunction CLI - Add SPFN to your Next.js project

73 lines (72 loc) 2.38 kB
// 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 };