UNPKG

@nuxthub/core

Version:

Build full-stack Nuxt applications on Cloudflare, with zero configuration.

51 lines (50 loc) 2.48 kB
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`); } }