UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

143 lines (142 loc) 5.12 kB
// @ts-strict-ignore /* eslint-disable no-console */ import { Cron } from 'croner'; import minimist from 'minimist'; import { pathToFileURL } from 'node:url'; import path from 'path'; import { findConfig } from '../config/find.js'; import payload, { getPayload } from '../index.js'; import { generateImportMap } from './generateImportMap/index.js'; import { generateTypes } from './generateTypes.js'; import { info } from './info.js'; import { loadEnv } from './loadEnv.js'; import { migrate, availableCommands as migrateCommands } from './migrate.js'; // Note: this does not account for any user bin scripts const availableScripts = [ 'generate:db-schema', 'generate:importmap', 'generate:types', 'info', 'jobs:run', 'run', ...migrateCommands ]; export const bin = async ()=>{ loadEnv(); const args = minimist(process.argv.slice(2)); const script = (typeof args._[0] === 'string' ? args._[0] : '').toLowerCase(); if (script === 'info') { await info(); return; } if (script === 'run') { const scriptPath = args._[1]; if (!scriptPath) { console.error('Please provide a script path to run.'); process.exit(1); } const absoluteScriptPath = path.resolve(process.cwd(), scriptPath); // Modify process.argv to remove 'run' and the script path const originalArgv = process.argv; process.argv = [ process.argv[0], process.argv[1], ...args._.slice(2) ]; try { await import(pathToFileURL(absoluteScriptPath).toString()); } catch (error) { console.error(`Error running script: ${absoluteScriptPath}`); console.error(error); process.exit(1); } finally{ // Restore original process.argv process.argv = originalArgv; } return; } const configPath = findConfig(); const configPromise = await import(pathToFileURL(configPath).toString()); let config = await configPromise; if (config.default) { config = await config.default; } const userBinScript = Array.isArray(config.bin) ? config.bin.find(({ key })=>key === script) : false; if (userBinScript) { try { const module = await import(pathToFileURL(userBinScript.scriptPath).toString()); if (!module.script || typeof module.script !== 'function') { console.error(`Could not find "script" function export for script ${userBinScript.key} in ${userBinScript.scriptPath}`); } else { await module.script(config).catch((err)=>{ console.log(`Script ${userBinScript.key} failed, details:`); console.error(err); }); } } catch (err) { console.log(`Could not find associated bin script for the ${userBinScript.key} command`); console.error(err); } return; } if (script.startsWith('migrate')) { return migrate({ config, parsedArgs: args }).then(()=>process.exit(0)); } if (script === 'generate:types') { return generateTypes(config); } if (script === 'generate:importmap') { return generateImportMap(config); } if (script === 'jobs:run') { const payload = await getPayload({ config }); const limit = args.limit ? parseInt(args.limit, 10) : undefined; const queue = args.queue ? args.queue : undefined; if (args.cron) { new Cron(args.cron, async ()=>{ await payload.jobs.run({ limit, queue }); }); process.stdin.resume() // Keep the process alive ; return; } else { await payload.jobs.run({ limit, queue }); await payload.db.destroy() // close database connections after running jobs so process can exit cleanly ; return; } } if (script === 'generate:db-schema') { // Barebones instance to access database adapter, without connecting to the DB await payload.init({ config, disableDBConnect: true, disableOnInit: true }); if (typeof payload.db.generateSchema !== 'function') { payload.logger.error({ msg: `${payload.db.packageName} does not support database schema generation` }); process.exit(1); } await payload.db.generateSchema({ log: args.log === 'false' ? false : true, prettify: args.prettify === 'false' ? false : true }); process.exit(0); } console.error(script ? `Unknown command: "${script}"` : 'Please provide a command to run'); console.log(`\nAvailable commands:\n${availableScripts.map((c)=>` - ${c}`).join('\n')}`); process.exit(1); }; //# sourceMappingURL=index.js.map