8const getQsNameFromAppCfg = (appCfg: Record<string, any>): string | undefined => { 9 if (appCfg.dbQsCfg?.dbQsName) return appCfg.dbQsCfg.dbQsName 10 const dbSecrets = appCfg.envConf?.dbSecrets 12 const primaryQs = dbSecrets.db 13 if (typeof primaryQs === 'string' && primaryQs.endsWith('_qs')) return primaryQs 15 const secretsMapping = appCfg.envConf?.secretsMapping 17 const defaultQs = secretsMapping.defaultdb_qs 18 if (typeof defaultQs === 'string' && defaultQs.endsWith('_qs')) return defaultQs 22export const guardPendingMigrations = async ({appCfg}: {appCfg: Record<string, any>}) => { 23 if (cliFlag('--skipMigrationCheck')) return 24 const qsName = getQsNameFromAppCfg(appCfg) 27 if (!dbEps.length) return 28 const dbEpPath = ptDir + '/' + dbEps[0].regEpPath 29 let dbEpCfg: { migrationOpts: Record<string, unknown> } 31 const imported = await import(dbEpPath) as { dbEpCfg: { migrationOpts: Record<string, unknown> } } 32 dbEpCfg = imported.dbEpCfg 34 throw new Error(`guardPendingMigrations: failed to import dbEpCfg from ${dbEpPath}: ${err}\nUse --skipMigrationCheck to bypass`) 36 if (!dbEpCfg?.migrationOpts) return 40 pending = await withDb(async ({db}) => { 41 const [, result] = await (db as import('knex').Knex).migrate.list(dbEpCfg.migrationOpts) 43 }, {reuseConn: false}) 45 throw new Error(`guardPendingMigrations: failed to check migration status for ${qsName}: ${err}\nUse --skipMigrationCheck to bypass`) 47 portForwardMgr.teardown() 49 if (pending?.length) { 50 const pendingNames = pending.map((m: any) => m.file || m.name || m).join('\n - ') 52 `${pending.length} pending migration(s) must be applied before deploying:\n - ${pendingNames}\n\nRun: ptnode ${dbEps[0].regEpPath} migrate\nOr: --skipMigrationCheck`