UNPKG

@whook/whook

Version:

Build strong and efficient REST web services.

72 lines 3.56 kB
import { autoService, location, } from 'knifecycle'; import { printStackTrace, YError } from 'yerror'; import { promptArgs } from '../libs/args.js'; import { DEFAULT_COERCION_OPTIONS, } from '../libs/coercion.js'; import { getCasterForSchema } from '../libs/validation.js'; import { ensureResolvedObject } from 'ya-open-api-types'; async function initCommand({ ENV, API, COMMAND_DEFINITION, COERCION_OPTIONS = DEFAULT_COERCION_OPTIONS, commandHandler, schemaValidators, $ready, $instance, $fatalError, args, log, }) { async function commandRunner() { await $ready; try { if (COMMAND_DEFINITION.config?.promptArgs && !ENV.CI && !ENV.NO_PROMPT) { // Required to ensure any logs are printed await Promise.resolve(); args = await promptArgs({ API, COMMAND_DEFINITION }, args); } for (const argument of COMMAND_DEFINITION.arguments) { const resolvedSchema = (await ensureResolvedObject(API, argument.schema)); if (typeof args.namedArguments[argument.name] === 'undefined') { if (argument.required) { log('error', `❌ - Argument "${argument.name}" is required.`); throw new YError('E_MISSING_REQUIRED_ARG', argument.name); } if (resolvedSchema.default) { args.namedArguments[argument.name] = resolvedSchema.default; } continue; } const caster = await getCasterForSchema({ API, COERCION_OPTIONS }, resolvedSchema); const validator = schemaValidators(argument.schema); // TODO: Add ajv human readable error builder validator(caster(args.namedArguments[argument.name])); if ((validator.errors || []).length) { throw new YError('E_BAD_ARG', validator.errors); } } await commandHandler(args); await $instance.destroy(); } catch (err) { if (err.code === 'E_BAD_ARG') { log('error-stack', printStackTrace(err)); if (err.params[0][0].keyword === 'required') { if (err.params[0][0].params.missingProperty) { $fatalError.throwFatalError(err); return; } } if (err.params[0][0].keyword === 'additionalProperties') { if (err.params[0][0].params.additionalProperty === '_') { log('error', 'No anonymous arguments allowed.'); $fatalError.throwFatalError(err); return; } if (err.params[0][0].params.additionalProperty) { log('error', `Argument "${err.params[0][0].params.additionalProperty}" not allowed.`); $fatalError.throwFatalError(err); return; } } log('error', 'Error parsing arguments: ', err.params[0][0].message, err.params[0][0].params); $fatalError.throwFatalError(err); return; } $fatalError.throwFatalError(err); return; } } commandRunner(); } export default location(autoService(initCommand), import.meta.url); //# sourceMappingURL=command.js.map