"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const chalk = require("chalk");
const commonTags = require("common-tags");
const os = require("os");
const observatory = require("observatory");
const stripIndent = commonTags.stripIndent;
const EOL = os.EOL;
const highlight = chalk.yellow;
const colorPath = chalk.gray;
function reportError(logObj) {
    if (logObj['err']) {
        const err = logObj['err'];
        switch (err.code) {
            case 'UNEXPECTED_STORE':
                reportUnexpectedStore(err, logObj['message']);
                return;
            case 'STORE_BREAKING_CHANGE':
                reportStoreBreakingChange(err, logObj['message']);
                return;
            case 'MODULES_BREAKING_CHANGE':
                reportModulesBreakingChange(err, logObj['message']);
                return;
            case 'MODIFIED_DEPENDENCY':
                reportModifiedDependency(err, logObj['message']);
                return;
            case 'SHRINKWRAP_BREAKING_CHANGE':
                reportShrinkwrapBreakingChange(err, logObj['message']);
                return;
            default:
                observatory.add(formatErrorSummary(err.message || logObj['message']));
                return;
        }
    }
    observatory.add(formatErrorSummary(logObj['message']));
}
exports.default = reportError;
function reportUnexpectedStore(err, msg) {
    observatory.add(stripIndent `
    ${formatErrorSummary(err.message)}

    expected: ${highlight(msg['expectedStorePath'])}
    actual: ${highlight(msg['actualStorePath'])}

    If you want to use the new store, run the same command with the ${highlight('--force')} parameter.
  `);
}
function reportStoreBreakingChange(err, msg) {
    let output = stripIndent `
    ${formatErrorSummary(`The store used for the current node_modules is incomatible with the current version of pnpm`)}
    Store path: ${colorPath(msg['storePath'])}

    Try running the same command with the ${highlight('--force')} parameter.
  `;
    if (msg['additionalInformation']) {
        output += EOL + EOL + msg['additionalInformation'];
    }
    output += formatRelatedSources(msg);
    observatory.add(output);
}
function reportModulesBreakingChange(err, msg) {
    let output = stripIndent `
    ${formatErrorSummary(`The current version of pnpm is not compatible with the available node_modules structure`)}
    node_modules path: ${colorPath(msg['modulesPath'])}

    Run ${highlight('pnpm install --force')} to recreate node_modules.
  `;
    if (msg['additionalInformation']) {
        output += EOL + EOL + msg['additionalInformation'];
    }
    output += formatRelatedSources(msg);
    observatory.add(output);
}
function formatRelatedSources(msg) {
    let output = '';
    if (!msg['relatedIssue'] && !msg['relatedPR'])
        return output;
    output += EOL;
    if (msg['relatedIssue']) {
        output += EOL + `Related issue: ${colorPath(`https://github.com/pnpm/pnpm/issues/${msg['relatedIssue']}`)}`;
    }
    if (msg['relatedPR']) {
        output += EOL + `Related PR: ${colorPath(`https://github.com/pnpm/pnpm/pull/${msg['relatedPR']}`)}`;
    }
    return output;
}
function formatErrorSummary(message) {
    return `${chalk.red('ERROR')} ${message}`;
}
function reportModifiedDependency(err, msg) {
    observatory.add(stripIndent `
    ${formatErrorSummary('Packages in the store have been mutated')}

    These packages are modified:
    ${msg['modified'].map((pkgPath) => colorPath(pkgPath)).join(EOL)}

    You can run ${highlight('pnpm install')} to refetch the modified packages
  `);
}
function reportShrinkwrapBreakingChange(err, msg) {
    observatory.add(stripIndent `
    ${formatErrorSummary(err.message)}

    Run with the ${highlight('--force')} parameter to recreate the shrinkwrap file.
  `);
}
//# sourceMappingURL=reportError.js.map