UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

91 lines (90 loc) 4.53 kB
import { Command, Option } from 'commander'; import { version } from 'directus/version'; import emitter from '../emitter.js'; import { startServer } from '../server.js'; import bootstrap from './commands/bootstrap/index.js'; import count from './commands/count/index.js'; import dbInstall from './commands/database/install.js'; import dbMigrate from './commands/database/migrate.js'; import init from './commands/init/index.js'; import rolesCreate from './commands/roles/create.js'; import { apply } from './commands/schema/apply.js'; import { snapshot } from './commands/schema/snapshot.js'; import keyGenerate from './commands/security/key.js'; import secretGenerate from './commands/security/secret.js'; import usersCreate from './commands/users/create.js'; import usersPasswd from './commands/users/passwd.js'; import { loadExtensions } from './load-extensions.js'; export async function createCli() { const program = new Command(); await loadExtensions(); await emitter.emitInit('cli.before', { program }); program.name('directus').usage('[command] [options]'); program.version(version, '-v, --version'); program.command('start').description('Start the Directus API').action(startServer); program.command('init').description('Create a new Directus Project').action(init); // Security const securityCommand = program.command('security'); securityCommand.command('key:generate').description('Generate the app key').action(keyGenerate); securityCommand.command('secret:generate').description('Generate the app secret').action(secretGenerate); const dbCommand = program.command('database'); dbCommand.command('install').description('Install the database').action(dbInstall); dbCommand .command('migrate:latest') .description('Upgrade the database') .action(() => dbMigrate('latest')); dbCommand .command('migrate:up') .description('Upgrade the database') .action(() => dbMigrate('up')); dbCommand .command('migrate:down') .description('Downgrade the database') .action(() => dbMigrate('down')); const usersCommand = program.command('users'); usersCommand .command('create') .description('Create a new user') .option('--email <value>', `user's email`) .option('--password <value>', `user's password`) .option('--role <value>', `user's role`) .action(usersCreate); usersCommand .command('passwd') .description('Set user password') .option('--email <value>', `user's email`) .option('--password <value>', `user's new password`) .action(usersPasswd); const rolesCommand = program.command('roles'); rolesCommand .command('create') .description('Create a new role') .option('--role <value>', `name for the role`) .option('--admin', `whether or not the role has admin access`) .option('--app', `whether or not the role has app access`) .action(rolesCreate); program.command('count <collection>').description('Count the amount of items in a given collection').action(count); program .command('bootstrap') .description('Initialize or update the database') .option('--skipAdminInit', 'Skips the creation of the default Admin Role and User') .action(bootstrap); const schemaCommands = program.command('schema'); schemaCommands .command('snapshot') .description('Create a new Schema Snapshot') .option('-y, --yes', `Assume "yes" as answer to all prompts and run non-interactively`, false) .addOption(new Option('--format <format>', 'JSON or YAML format').choices(['json', 'yaml']).default('yaml')) .argument('[path]', 'Path to snapshot file') .action(snapshot); schemaCommands .command('apply') .description('Apply a snapshot file to the current database') .option('-y, --yes', `Assume "yes" as answer to all prompts and run non-interactively`) .option('-d, --dry-run', 'Plan and log changes to be applied', false) .option('--ignoreRules <value>', `Comma-separated list of collections and or fields to ignore. Format: "products.title,reviews" this will ignore applying changes to the title field in the products collection and the entire reviews collection`) .argument('<path>', 'Path to snapshot file') .action(apply); await emitter.emitInit('cli.after', { program }); return program; }