metal-soy-critic
Version:
A metal-soy code validation utility.
115 lines (114 loc) • 4.62 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("./util");
const soyparser_1 = require("soyparser");
const fs = require("fs");
const js_context_1 = require("./js-context");
const soy_context_1 = require("./soy-context");
/* Validators */
const validate_render_template_1 = require("./validate-render-template");
const validate_call_imports_1 = require("./validate-call-imports");
const validate_doc_params_1 = require("./validate-doc-params");
const validate_params_1 = require("./validate-params");
const validate_internal_1 = require("./validate-internal");
const validate_required_params_1 = require("./validate-required-params");
const validate_noop_events_1 = require("./validate-noop-events");
const validate_sorted_params_1 = require("./validate-sorted-params");
const validate_sorted_param_declarations_1 = require("./validate-sorted-param-declarations");
const validate_sorted_maps_1 = require("./validate-sorted-maps");
const validate_ternary_elvis_1 = require("./validate-ternary-elvis");
const validate_whitespace_1 = require("./validate-whitespace");
const validators = [
validate_call_imports_1.default,
validate_params_1.default,
validate_internal_1.default,
validate_required_params_1.default,
];
const soyValidators = [
validate_doc_params_1.default,
validate_render_template_1.default,
validate_noop_events_1.default,
validate_sorted_params_1.default,
validate_sorted_param_declarations_1.default,
validate_sorted_maps_1.default,
validate_ternary_elvis_1.default,
validate_whitespace_1.default
];
function readFile(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, (err, buffer) => {
if (err) {
return reject(err);
}
resolve(buffer.toString('utf8'));
});
});
}
function getJSPath(filePath) {
return filePath.replace('.soy', '.js');
}
function getSoyContext(filePath) {
return __awaiter(this, void 0, void 0, function* () {
const raw = yield readFile(filePath);
return new soy_context_1.default(raw);
});
}
function getJSContext(filePath) {
return __awaiter(this, void 0, void 0, function* () {
const raw = yield readFile(filePath);
return new js_context_1.default(raw);
});
}
function runValidators(soyContext, jsContext) {
return validators
.map(validator => validator(soyContext, jsContext))
.reduce(util_1.combineResults);
}
function runSoyValidators(soyContext) {
return soyValidators
.map(validator => validator(soyContext))
.reduce(util_1.combineResults);
}
function validateWithSoy(soyContext, filePath) {
return __awaiter(this, void 0, void 0, function* () {
try {
const jsContext = yield getJSContext(getJSPath(filePath));
return util_1.combineResults(runSoyValidators(soyContext), runValidators(soyContext, jsContext));
}
catch (err) {
if (err.code === 'ENOENT') {
return runSoyValidators(soyContext);
}
else if (err instanceof SyntaxError) {
return util_1.toResult(false, 'Failed to parse component (javascript) file');
}
throw new Error();
}
});
}
function validateFile(filePath) {
return __awaiter(this, void 0, void 0, function* () {
try {
const soyContext = yield getSoyContext(filePath);
return validateWithSoy(soyContext, filePath);
}
catch (err) {
if (err.code === 'ENOENT') {
return util_1.toResult(false, 'Failed to open soy file, does it exist?');
}
else if (err instanceof soyparser_1.SoyParseError) {
return util_1.toResult(false, err.message);
}
return util_1.toResult(false, 'Something went wrong validating this soy file');
}
});
}
exports.default = validateFile;