@jsnix/pastel
Version:
Framework for effortlessly building Ink apps
79 lines • 3.18 kB
JavaScript
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