UNPKG

@jsnix/pastel

Version:

Framework for effortlessly building Ink apps

79 lines 3.18 kB
import { render } from 'ink'; import React from 'react'; import { StatusMessage } from '@inkjs/ui'; import { fromZodError } from 'zod-validation-error'; import generateOptions from './generate-options.js'; import generateArguments from './generate-arguments.js'; const generateCommand = (commanderCommand, pastelCommand, { appComponent, app }) => { commanderCommand.helpOption('-h, --help', 'Show help'); if (pastelCommand.description) { commanderCommand.description(pastelCommand.description); } if (pastelCommand.alias) { commanderCommand.alias(pastelCommand.alias); } const optionsSchema = pastelCommand.options; if (optionsSchema) { const options = generateOptions(optionsSchema); for (const option of options) { commanderCommand.addOption(option); } } let hasVariadicArgument = false; const argumentsSchema = pastelCommand.args; if (argumentsSchema) { const arguments_ = generateArguments(argumentsSchema); for (const argument of arguments_) { if (argument.variadic) { hasVariadicArgument = true; } commanderCommand.addArgument(argument); } } const { component } = pastelCommand; if (component) { commanderCommand.action(async (...input) => { // Remove the last argument, which is an instance of Commander command input.pop(); const options = input.pop(); let parsedOptions = {}; if (pastelCommand.options) { const result = await pastelCommand.options.safeParseAsync(options); if (result.success) { parsedOptions = result.data ?? {}; } else { app.render = render(React.createElement(StatusMessage, { variant: "error" }, fromZodError(result.error, { maxIssuesInMessage: 1, prefix: '', prefixSeparator: '', }).message), app.renderOptions); } } let arguments_ = []; if (pastelCommand.args) { const result = await pastelCommand.args.safeParseAsync(hasVariadicArgument ? input.flat() : input); if (result.success) { arguments_ = result.data ?? []; } else { app.render = render(React.createElement(StatusMessage, { variant: "error" }, fromZodError(result.error, { maxIssuesInMessage: 1, prefix: '', prefixSeparator: '', }).message), app.renderOptions); } } app.render = render(React.createElement(appComponent, { Component: component, commandProps: { options: parsedOptions, args: arguments_, app }, }), app.renderOptions); }); } }; export default generateCommand; //# sourceMappingURL=generate-command.js.map