@coat/cli
Version:
TODO: See #3
69 lines (67 loc) • 3.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getContext = getContext;
var _fs = require("fs");
var _path = _interopRequireDefault(require("path"));
var _groupBy = _interopRequireDefault(require("lodash/groupBy"));
var _chalk = _interopRequireDefault(require("chalk"));
var _json = _interopRequireDefault(require("json5"));
var _parser = require("@babel/parser");
var _codeFrame = require("@babel/code-frame");
var _constants = require("../constants");
var _getStrictCoatManifest = require("./get-strict-coat-manifest");
var _getCoatLockfiles = require("../lockfiles/get-coat-lockfiles");
var _getPackageJson = require("./get-package-json");
var _getLocationInJsonAst = require("./get-location-in-json-ast");
var _coatManifest = require("../validation/coat-manifest");
var _validationIssue = require("../validation/validation-issue");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Retrieves and parses files that are relevant
* for a coat project
*
* @param cwd The directory of a coat project
*/
async function getContext(cwd) {
// Read package.json & coat.json files
// TODO: See #15
// More friendly error messages if files are missing
const [coatManifestRaw, coatGlobalLockfile, coatLocalLockfile, packageJson] = await Promise.all([_fs.promises.readFile(_path.default.join(cwd, _constants.COAT_MANIFEST_FILENAME), "utf8"), (0, _getCoatLockfiles.getCoatGlobalLockfile)(cwd), (0, _getCoatLockfiles.getCoatLocalLockfile)(cwd), (0, _getPackageJson.getPackageJson)(cwd)]);
const coatManifest = _json.default.parse(coatManifestRaw);
// Validation
const issues = [...(0, _coatManifest.validateCoatManifest)(coatManifest)];
if (issues.length) {
const {
[_validationIssue.ValidationIssueType.Error]: errors = [],
[_validationIssue.ValidationIssueType.Warning]: warnings = []
} = (0, _groupBy.default)(issues, "type");
const validationMessages = [(0, _chalk.default)`The coat manifest file ({green ${_constants.COAT_MANIFEST_FILENAME}}) has the following issue${issues.length > 1 ? "s" : ""}:`, ""];
validationMessages.push(...warnings.map(warning => (0, _chalk.default)`{inverse.yellow.bold WARNING } - ${warning.message}`));
validationMessages.push(...errors.map(error => (0, _chalk.default)`{inverse.red.bold ERROR } - ${error.message}`));
if (issues.length === 1 && errors.length === 1) {
const [error] = errors;
const coatManifestAst = (0, _parser.parseExpression)(coatManifestRaw);
const location = (0, _getLocationInJsonAst.getLocationInJSONAst)(coatManifestAst, error.propertyPath);
const codeFrame = (0, _codeFrame.codeFrameColumns)(coatManifestRaw, location, {
highlightCode: true,
message: error.shortMessage
});
validationMessages.push("", codeFrame);
}
validationMessages.push("");
console.error(validationMessages.join("\n"));
if (errors.length) {
throw new Error(`Validation of coat manifest threw ${errors.length > 1 ? "errors" : "an error"}.`);
}
}
const coatManifestStrict = (0, _getStrictCoatManifest.getStrictCoatManifest)(coatManifest);
return {
cwd,
coatManifest: coatManifestStrict,
coatGlobalLockfile,
coatLocalLockfile,
packageJson
};
}