UNPKG

metal-soy-critic

Version:
115 lines (114 loc) 4.62 kB
"use strict"; 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;