@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
215 lines • 10.7 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const error_1 = __importDefault(require("@sprucelabs/error"));
const spruce_skill_utils_1 = require("@sprucelabs/spruce-skill-utils");
const upperFirst_1 = __importDefault(require("lodash/upperFirst"));
class SpruceError extends error_1.default {
/** An easy to understand version of the errors */
friendlyMessage() {
const { options } = this;
let message;
switch (options?.code) {
case 'INVALID_COMMAND':
if (!options.args || options.args.length === 0) {
message = `Hey friend 👋.. I don't support the command you tried.`;
}
else {
message = `Hey friend 👋. I don't know the command: ${options.args.join(' ')}.`;
}
message += ' Try running `spruce --help`';
break;
case 'GENERIC':
message = options.friendlyMessage ?? 'Oh shoot! 🤔';
if (options.originalError) {
message += `\n\n${options.originalError.stack ??
options.originalError.name}`;
}
break;
case 'NOT_IMPLEMENTED':
message = '';
if (options.friendlyMessage) {
message += `\n\n${options.friendlyMessage}`;
}
break;
case 'COMMAND_NOT_IMPLEMENTED':
message = `${options.command} has not yet been implemented. ${options.args ? `Args: ${options.args.join(', ')}` : ''}`;
if (options.friendlyMessage) {
message += `\n\n${options.friendlyMessage}`;
}
break;
case 'SCHEMA_FAILED_TO_IMPORT':
message = `Error importing "${options.file}". Original error:\n\n${options.originalError?.message ?? '**MISSING**'}`;
break;
case 'BUILD_FAILED':
message = `Build${options.file ? `ing ${options.file}` : ''} failed. It looks like you're not running 'yarn watch'. Run it and then run 'spruce all:sync'.`;
break;
case 'FAILED_TO_IMPORT':
message =
options.friendlyMessage ??
`Failed to import "${options.file}". Original error:\n\n${options.originalError?.message ?? '**MISSING**'}`;
break;
case 'LINT_FAILED':
message = options.friendlyMessage;
if (!message) {
message = `Lint failed on pattern ${options.pattern}.`;
if (options.originalError) {
message += `\n\nOriginal error:${options.originalError.stack ??
options.originalError.message}`;
}
}
break;
case 'EXECUTING_COMMAND_FAILED':
if (this.originalError && this.originalError.message) {
message = this.originalError.message + '\n\n';
}
else {
message = '';
}
message += `Executing command failed '${options.cmd}'.\n\n`;
if (options.cwd) {
message += `cwd: ${options.cwd}\n\n`;
}
if (options.stderr) {
message += this.cleanStdErr(options.stderr) + '\n\n';
}
if (options.stdout) {
message += options.stdout;
}
break;
case 'CREATE_AUTOLOADER_FAILED':
message = 'A Could not create an autoloader just happened!';
break;
case 'DIRECTORY_EMPTY':
message = 'A directory empty just happened!';
break;
case 'FILE_EXISTS':
message = 'A fail already exists.';
break;
case 'VSCODE_NOT_INSTALLED':
message =
"vscode's 'code' is not installed.\n\nMac instructions: https://code.visualstudio.com/docs/setup/mac\n\nLinux instructions: https://code.visualstudio.com/docs/setup/linux\n\nWindows instructions: https://code.visualstudio.com/docs/setup/windows";
break;
case 'SCHEMA_EXISTS':
message = `A schema called ${options.schemaId} already exists at ${options.destination}`;
break;
case 'COMMAND_ABORTED':
message = 'Aborted! See ya later! ✌️';
break;
case 'INVALID_FEATURE_CODE':
message = `Oh no! I couldn't find a feature with the code '${options.featureCode}'.`;
break;
case 'TEST_FAILED':
message = `${options.fileName}\n - ${options.testName}\n\n${options.errorMessage
.split('\n')
.map((line) => ` ${line}`)
.join('\n')}`;
break;
case 'FEATURE_NOT_INSTALLED':
message = `\`${(0, upperFirst_1.default)(options.featureCode)}\` feature is not installed. Install it first, then try again.`;
break;
case 'MERCURY_RESPONSE_ERROR': {
const errors = options.responseErrors;
message = `Got ${errors.length === 1 ? 'an error' : `${errors.length} errors`} from the server:\n\n`;
const errorMessages = [];
for (const err of errors) {
errorMessages.push(err.message);
}
message += errorMessages.join('\n');
break;
}
case 'INVALID_TEST_DIRECTORY':
message = `You are missing dependencies I need to run tests. Try \`spruce test.install\` to reinstall.`;
break;
case 'DIRECTORY_NOT_SKILL':
message = 'The directory you are in is not a skill!';
break;
case 'SKILL_NOT_REGISTERED':
message = `Dang! I can't continue until you register your skill! Run \`spruce login\` and then \`spruce register.skill\` to get the ball rolling!`;
break;
case 'NO_ORGANIZATIONS_FOUND':
message =
"It looks like you don't have any organizations setup yet. Try `spruce create.organization` first.";
break;
case 'INVALID_EVENT_CONTRACT':
message = `The event named \`${options.fullyQualifiedEventName}\` is not valid. Check ${options.brokenProperty}. The original error is:\n\n${options.originalError?.message}`;
break;
case 'BOOT_ERROR':
message = `Booting your skill failed: ${options.friendlyMessage ??
options.originalError?.message ??
'Not sure why, tho.'}`;
break;
case 'DEPLOY_FAILED':
message = 'Deploy halted!';
break;
case 'MISSING_DEPENDENCIES':
message = `Looks like you're missing some dependencies:\n\n${options.dependencies
.map((d) => `${d.name}: ${d.hint}`)
.join('\n')}`;
break;
case 'STORE_EXISTS':
message = 'A Store exists just happened!';
break;
case 'NOT_LOGGED_IN':
message = 'You have to be logged in to do that!';
break;
case 'SKILL_NOT_FOUND':
message =
options.friendlyMessage ?? `I couldn't find that skill!`;
break;
case 'NO_SKILLS_REGISTERED':
message = `Whoa! Looks like you haven't registered your skill yet! Try \`spruce register\` to get that done!`;
break;
case 'COMMAND_BLOCKED':
message = `${options.command} is blocked! ${options.hint}`;
break;
case 'SKILL_VIEW_EXISTS':
message = `A skill view controller already exists named ${options.name}!`;
break;
case 'THEME_EXISTS':
message = `Yikes! You can't create a new theme. One per skill for now.`;
break;
case 'CACHE_NOT_ENABLED':
message = "Cache is not enabled, so it can't be disabled!";
break;
case 'DOCKER_NOT_STARTED':
message =
'Docker has not been started (or you are trying to run this command in a monorepo)! Start it and try again (or move out of a monorepo)! Originial error:\n\n' +
options.originalError?.stack;
break;
case 'SCHEMA_TEMPLATE_ITEM_BUILDING_FAILED':
message = `Failed to build schema template item for '${spruce_skill_utils_1.namesUtil.toPascal(options.schemaNamespace)}.${options.schemaId}'. The field I had an issue on was '${options.fieldName}'. It's options are:\n\n${JSON.stringify(options.fieldOptions)}.\n\nChances are you have a circular reference in your schemas. You'll need to extract shared fields to a new file and have your schemas mix those in, vs referencing eath other.`;
break;
case 'ACTION_CANCELLED':
message = 'A Action cancelled just happened!';
break;
case 'TRANSPORT_ALREADY_EXISTS':
message = `A transport named '${options.name}' already exists!`;
break;
case 'DEPENDENCY_EXISTS':
message = `You already have ${options.namespace} as a dependency!`;
break;
case 'VIEW_PLUGIN_ALREADY_EXISTS':
message = `A view plugin by the name ${options.name} already exists!`;
break;
case 'CANNOT_PROMPT_IN_CI':
message = 'You cannot prompt in CI!';
break;
case 'APP_CONTROLLER_ALREADY_EXISTS':
message = `You already have an AppController! Run \`spruce sync.views\` if you are having issues.`;
break;
default:
message = super.friendlyMessage();
}
return message;
}
cleanStdErr(stderr) {
return stderr
.replace('warning package.json: No license field', '')
.trim();
}
}
exports.default = SpruceError;
//# sourceMappingURL=SpruceError.js.map
;