Skip to content

Commit

Permalink
feat(migrations): support new .data/hub/migrations
Browse files Browse the repository at this point in the history
  • Loading branch information
atinux committed Jan 16, 2025
1 parent 5d2d6c9 commit d6a0250
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 13 deletions.
4 changes: 4 additions & 0 deletions src/commands/database/migrations.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@ import { defineCommand } from 'citty'
import create from './migrations/create.mjs'
import list from './migrations/list.mjs'
import markAllApplied from './migrations/mark-all-applied.mjs'
import { consola } from 'consola'

export default defineCommand({
meta: {
name: 'migrations',
description: 'Database migrations commands.',
},
async setup() {
consola.info('Make sure to run `npx nuxi prepare` before running this command if some migrations are missing.')
},
subCommands: {
create,
list,
Expand Down
10 changes: 7 additions & 3 deletions src/commands/database/migrations/create.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { defineCommand } from 'citty'
import { consola } from 'consola'
import { useMigrationsStorage, getNextMigrationNumber } from '../../../utils/database.mjs'
import { writeFile, mkdir } from 'node:fs/promises'
import { join } from 'pathe'
import { getNextMigrationNumber } from '../../../utils/database.mjs'

export default defineCommand({
meta: {
Expand All @@ -25,8 +27,10 @@ export default defineCommand({
.replace(/-+/g, '-') // replace multiple dashes with a single dash
|| 'migration'
const migrationName = `${nextMigrationNumber}_${name}.sql`
await useMigrationsStorage().set(migrationName, `-- Migration number: ${nextMigrationNumber} \t ${new Date().toISOString()}\n`)
const userMigrationsDir = join(process.cwd(), 'server/database/migrations')
await mkdir(userMigrationsDir, { recursive: true })
await writeFile(join(userMigrationsDir, migrationName), `-- Migration number: ${nextMigrationNumber} \t ${new Date().toISOString()}\n`)

consola.success(`Created migration file \`server/migrations/${migrationName}\``)
consola.success(`Created migration file \`server/database/migrations/${migrationName}\``)
}
});
8 changes: 5 additions & 3 deletions src/commands/database/migrations/list.mjs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import ora from 'ora'
import { defineCommand, runCommand } from 'citty'
import { join, relative } from 'pathe'
import { consola } from 'consola'
import { colors } from 'consola/utils'
import { fetchUser, fetchProject, projectPath, getProjectEnv, fetchRemoteMigrations, getMigrationFiles } from '../../../utils/index.mjs'
import { fetchUser, fetchProject, projectPath, getProjectEnv, fetchRemoteMigrations, getMigrationsDir, getMigrationFiles } from '../../../utils/index.mjs'
import link from '../../link.mjs'
import login from '../../login.mjs'

Expand Down Expand Up @@ -37,7 +38,7 @@ export default defineCommand({
const total = localMigrations.length

if (total === 0) {
consola.info('No migrations found in `./server/database/migrations`, please create one first.')
consola.info('No migrations found, please create one first with `nuxthub database migrations create <name>`.')
return process.exit(0)
}

Expand Down Expand Up @@ -103,10 +104,11 @@ export default defineCommand({
const formattedPendingMigrations = pendingMigrations.map(fileName => ({ id: null, name: fileName, applied_at: null }))
const migrations = remoteMigrations.concat(formattedPendingMigrations)

const migrationsDir = relative(process.cwd(), getMigrationsDir())
for (const { name, applied_at } of migrations) {
const appliedAt = applied_at ? new Date(applied_at).toLocaleString() : 'Pending'
const color = applied_at ? colors.green : colors.yellow
consola.log(`${color(applied_at ? '✅' : '🕒')} \`./server/database/migrations/${name}.sql\` ${colors.gray(appliedAt)}`)
consola.log(`${color(applied_at ? '✅' : '🕒')} \`${join(migrationsDir, name)}.sql\` ${colors.gray(appliedAt)}`)
}

process.exit(0)
Expand Down
2 changes: 1 addition & 1 deletion src/commands/database/migrations/mark-all-applied.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export default defineCommand({
const total = localMigrations.length

if (total === 0) {
consola.info('No migrations found in `./server/database/migrations`, please create one first.')
consola.info('No migrations found, please create one first with `nuxthub database migrations create <name>`.')
return process.exit(0)
}

Expand Down
18 changes: 12 additions & 6 deletions src/utils/database.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { consola } from 'consola'
import { join } from 'pathe'
import { existsSync } from 'node:fs'
import { createStorage } from 'unstorage'
import fsDriver from 'unstorage/drivers/fs'
import { $api } from './data.mjs'
import { $fetch } from 'ofetch'


export async function queryDatabase({ env, url, token, query, params }) {
if (url) {
return queryRemoteDatabase({ url, token, query, params })
Expand Down Expand Up @@ -40,20 +40,26 @@ export async function queryRemoteDatabase({ url, token, query, params }) {
})
}

let _migrationsDir
export function getMigrationsDir() {
if (!_migrationsDir) {
const cwd = process.cwd()
_migrationsDir = existsSync(join(cwd, '.data/hub/database/migrations')) ? join(cwd, '.data/hub/database/migrations') : join(cwd, 'server/database/migrations')
}
return _migrationsDir
}

/**
* @type {import('unstorage').Storage}
*/
let _storage
export function useMigrationsStorage() {
if (!_storage) {
const cwd = process.cwd()
const migrationsDir = join(cwd, 'server/database/migrations')
_storage = createStorage({
driver: fsDriver({
base: migrationsDir,
base: getMigrationsDir(),
ignore: ['.DS_Store']
}),
})
})
}
return _storage
Expand All @@ -72,7 +78,7 @@ export async function getNextMigrationNumber() {
.sort((a, b) => a - b)
.pop() ?? 0

return (lastSequentialMigrationNumber + 1).toString().padStart(4, '0')
return (lastSequentialMigrationNumber + 1).toString().padStart(4, '0')
}

const CreateMigrationsTableQuery = `CREATE TABLE IF NOT EXISTS _hub_migrations (
Expand Down

0 comments on commit d6a0250

Please sign in to comment.