Ctrl K
ComunidadGuías…

app/scripts/migrate-cloudflare.mjs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { remoteDatabaseConfig } from '../src/server/db/remote-config.ts'
import { spawnSync } from 'node:child_process'
import { readFileSync } from 'node:fs'
import { resolve } from 'node:path'
import { fileURLToPath } from 'node:url'
import { parse } from 'jsonc-parser'
import { getD1Bindings } from '../../scripts/d1-config.mjs'

const appDir = fileURLToPath(new URL('../', import.meta.url))
const args = process.argv.slice(2)
let local = false
if (args.includes('--local') && args.includes('--remote'))
  throw new Error('Choose either --local or --remote.')
let configPath = process.env.DEVPUSH_WRANGLER_CONFIG || 'wrangler.jsonc'
let persistTo
for (let index = 0; index < args.length; index++) {
  const arg = args[index]
  if (arg === '--local') local = true
  else if (arg === '--remote') local = false
  else if (arg === '--config' || arg === '--persist-to') {
    const value = args[++index]
    if (!value || value.startsWith('--'))
      throw new Error(`${arg} needs a path.`)
    if (arg === '--config') configPath = value
    else persistTo = resolve(value)
  } else throw new Error(`Unknown migration option: ${arg}`)
}
if (persistTo && !local) throw new Error('--persist-to requires --local.')
configPath = resolve(appDir, configPath)
const errors = []
const config = parse(readFileSync(configPath, 'utf8'), errors, {
  allowTrailingComma: true,
})
if (errors.length) throw new Error('Cannot parse the Wrangler configuration.')
const secretsPath = resolve(
  appDir,
  process.env.DEVPUSH_CLOUDFLARE_SECRETS_FILE || '.cloudflare-secrets.json',
)
let secrets = {}
try {
  secrets = JSON.parse(readFileSync(secretsPath, 'utf8'))
} catch (error) {
  if (error.code !== 'ENOENT') throw error
}
const values = { ...config.vars, ...secrets }
const remote = remoteDatabaseConfig(values)
if (remote) {
  if (local)
    throw new Error(
      '--local is only for D1. Remote libSQL URLs always connect to the configured databases.',
    )
  const result = spawnSync('pnpm', ['exec', 'tsx', 'scripts/migrate.ts'], {
    cwd: appDir,
    stdio: 'inherit',
    env: {
      ...process.env,
      ...values,
      DEVPUSH_DATABASE_AUTH_TOKEN: remote.main.authToken || '',
      DEVPUSH_LOG_DATABASE_AUTH_TOKEN: remote.logs.authToken || '',
    },
  })
  if (result.error) throw result.error
  process.exit(result.status ?? 1)
}
const bindings = getD1Bindings(config, { local })
for (const binding of bindings) {
  const command = [
    'exec',
    'wrangler',
    'd1',
    'migrations',
    'apply',
    binding.binding,
    '--config',
    configPath,
    local ? '--local' : '--remote',
    ...(persistTo ? ['--persist-to', persistTo] : []),
  ]
  const result = spawnSync('pnpm', command, { cwd: appDir, stdio: 'inherit' })
  if (result.error) throw result.error
  if (result.status !== 0) process.exit(result.status ?? 1)
}