forest-cli
Version:
The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.
53 lines • 5.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.explainApiError = exports.formatPlan = void 0;
const types_1 = require("./types");
const OP_PREFIX = { add: '+', remove: '-', replace: '~', test: '?' };
/** Render the plan grouped by domain, with warnings and a final count. */
function formatPlan(ops, warnings) {
if (ops.length === 0 && warnings.length === 0) {
return '✓ No changes: the remote layout already matches the file.';
}
const lines = [];
types_1.LAYOUT_DOMAINS.forEach(domain => {
const domainOps = ops.filter(op => op.domain === domain);
if (domainOps.length === 0)
return;
lines.push(`${domain} (${domainOps.length} change${domainOps.length > 1 ? 's' : ''})`);
domainOps.forEach(op => lines.push(` ${OP_PREFIX[op.op] ?? '·'} ${op.label}`));
});
warnings.forEach(warning => lines.push(` ⚠ ${warning}`));
if (ops.length > 0) {
const perDomain = types_1.LAYOUT_DOMAINS.map(domain => ({
count: ops.filter(op => op.domain === domain).length,
domain,
}))
.filter(entry => entry.count > 0)
.map(entry => `${entry.count} PATCH /api/${entry.domain}`);
lines.push('', `${ops.length} operation${ops.length > 1 ? 's' : ''} to send (${perDomain.join(', ')}).`);
}
return lines.join('\n');
}
exports.formatPlan = formatPlan;
/** Map a Forest API error to an actionable message (422 path → JSON key, 403 premium…). */
function explainApiError(error, sentOps) {
if (error.status === 422) {
const match = error.detail.match(/path:\s*'([^']+)'/);
const offending = match ? sentOps.find(op => op.path === match[1]) : undefined;
const origin = offending
? `\n → comes from: ${offending.jsonPath}\n Revert this change in the file, or edit it from the UI if you know what you are doing.`
: '';
return `The server rejected the patch (422):\n ${error.detail}${origin}`;
}
if (error.status === 403) {
const premium = sentOps.find(op => op.premiumPack);
if (premium) {
return (`Premium feature required (pack « ${premium.premiumPack} ») for ${premium.jsonPath}.\n` +
'Nothing was applied for this domain (atomic patch).');
}
return 'Access denied (403): your role does not allow editing the layout of this environment.';
}
return `Server error (${error.status}): ${error.detail}`;
}
exports.explainApiError = explainApiError;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbGF5b3V0L3BsYW4tZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLG1DQUF5QztBQUV6QyxNQUFNLFNBQVMsR0FBMkIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFN0YsMEVBQTBFO0FBQzFFLFNBQWdCLFVBQVUsQ0FBQyxHQUFnQixFQUFFLFFBQWtCO0lBQzdELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDN0MsT0FBTywyREFBMkQsQ0FBQztLQUNwRTtJQUVELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixzQkFBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUM5QixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQztRQUN6RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFbkMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sS0FBSyxTQUFTLENBQUMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxF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