UNPKG

@augment-vir/node

Version:

A collection of augments, helpers types, functions, and classes only for Node.js (backend) JavaScript environments.

91 lines (82 loc) 2.91 kB
import {log, type PartialWithUndefined, wrapString} from '@augment-vir/common'; import {dirname} from 'node:path'; import {interpolationSafeWindowsPath} from '../augments/path/os-path.js'; import {runShellCommand, type ShellOutput} from '../augments/terminal/shell.js'; import {PrismaSchemaError} from './prisma-errors.js'; /** * All commands in the Prisma CLI that support the `--no-hints` flag, used to turn off ads. * * @category Prisma : Node : Util * @category Package : @augment-vir/node * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) */ export const prismaCommandsThatSupportNoHints = ['generate']; /** * Directly run a Prisma command. * * @category Prisma : Node : Util * @category Package : @augment-vir/node * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) */ export async function runPrismaCommand( { command, ignoreExitCode = false, hideLogs = false, }: { command: string; } & PartialWithUndefined<{ /** If `true`, prevents errors from being thrown if this command exits with a non-0 status. */ ignoreExitCode: boolean; hideLogs: boolean; }>, /** Set to `undefined` to omit the `--schema` flag. */ schemaFilePath: string | undefined, env: Record<string, string> | undefined = {}, ) { const schemaFileArgs = schemaFilePath ? [ '--schema', wrapString({value: schemaFilePath, wrapper: "'"}), ] : []; /** Disable Prisma's in-CLI ads. */ const noHintsArg = prismaCommandsThatSupportNoHints.some((commandName) => command.startsWith(commandName), ) ? '--no-hints' : ''; const fullCommand = [ 'prisma', command, ...schemaFileArgs, noHintsArg, ].join(' '); log.faint(`> ${fullCommand}`); const result = await runShellCommand(interpolationSafeWindowsPath(fullCommand), { env: { ...process.env, ...env, }, hookUpToConsole: !hideLogs, cwd: schemaFilePath ? dirname(schemaFilePath) : process.cwd(), }); return verifyOutput(schemaFilePath || '', result, ignoreExitCode); } export function verifyOutput( schemaFilePath: string, shellOutput: Readonly<ShellOutput>, ignoreExitCode: boolean, ) { if (shellOutput.stderr.includes('Validation Error Count')) { throw new PrismaSchemaError( `Invalid schema file at '${schemaFilePath}':\n\n${shellOutput.stderr}`, ); } else if (shellOutput.stderr.includes('does not exist')) { throw new PrismaSchemaError(`Database does not exist: ${shellOutput.stderr}`); } else if (shellOutput.exitCode === 0 || ignoreExitCode) { return shellOutput; } else { throw new Error(shellOutput.stdout + shellOutput.stderr); } }