@nuxthub/core
Version:
Build full-stack Nuxt applications on Cloudflare, with zero configuration.
51 lines (50 loc) • 2.48 kB
JavaScript
import { consola } from "consola";
import { hubDatabase } from "../database.js";
import { AppliedDatabaseMigrationsQuery, CreateDatabaseMigrationsTableQuery, getDatabaseMigrationFiles, getDatabaseQueryFiles, splitSqlQueries, useDatabaseMigrationsStorage, useDatabaseQueriesStorage } from "./helpers.js";
export async function applyDatabaseMigrations(hub) {
const migrationsStorage = useDatabaseMigrationsStorage(hub);
const db = hubDatabase();
await db.prepare(CreateDatabaseMigrationsTableQuery).all();
const appliedMigrations = (await db.prepare(AppliedDatabaseMigrationsQuery).all()).results;
const localMigrations = (await getDatabaseMigrationFiles(hub)).map((fileName) => fileName.replace(".sql", ""));
const pendingMigrations = localMigrations.filter((localName) => !appliedMigrations.find(({ name }) => name === localName));
if (!pendingMigrations.length) return consola.success("Database migrations up to date");
for (const migration of pendingMigrations) {
let query = await migrationsStorage.getItem(`${migration}.sql`);
if (!query) continue;
query += `
INSERT INTO _hub_migrations (name) values ('${migration}');
`;
const queries = splitSqlQueries(query);
try {
await db.batch(queries.map((q) => db.prepare(q)));
} catch (error) {
consola.error(`Failed to apply migration \`.data/hub/database/migrations/${migration}.sql\`
`, error?.message);
if (error?.message?.includes("already exists")) {
consola.info("If your database already contains the migration, run `npx nuxthub database migrations mark-all-applied` to mark all migrations as applied.");
}
break;
}
consola.success(`Database migration \`.data/hub/database/migrations/${migration}.sql\` applied`);
}
}
export async function applyDatabaseQueries(hub) {
const queriesStorage = useDatabaseQueriesStorage(hub);
const db = hubDatabase();
const queriesPaths = await getDatabaseQueryFiles(hub);
if (!queriesPaths.length) return;
for (const queryPath of queriesPaths) {
const sql = await queriesStorage.getItem(queryPath);
if (!sql) continue;
const queries = splitSqlQueries(sql);
try {
await db.batch(queries.map((q) => db.prepare(q)));
} catch (error) {
consola.error(`Failed to apply query \`.data/hub/database/queries/${queryPath}\`
`, error?.message);
break;
}
consola.success(`Database query \`.data/hub/database/queries/${queryPath}\` applied`);
}
}