UNPKG

4.3 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const json_1 = require("@stoplight/json");
5const json_ref_resolver_1 = require("@stoplight/json-ref-resolver");
6const types_1 = require("@stoplight/types");
7const yaml_1 = require("@stoplight/yaml");
8const lodash_1 = require("lodash");
9const functions_1 = require("./functions");
10const runner_1 = require("./runner");
11tslib_1.__exportStar(require("./types"), exports);
12class Spectral {
13 constructor(opts) {
14 this._rules = {};
15 this._functions = functions_1.functions;
16 this.resolver = opts && opts.resolver ? opts.resolver : new json_ref_resolver_1.Resolver();
17 }
18 run(target) {
19 return tslib_1.__awaiter(this, void 0, void 0, function* () {
20 let results = [];
21 let parsedResult;
22 if (!exports.isParsedResult(target)) {
23 parsedResult = {
24 parsed: yaml_1.parseWithPointers(typeof target === 'string' ? target : json_1.safeStringify(target, undefined, 2)),
25 getLocationForJsonPath: yaml_1.getLocationForJsonPath,
26 };
27 results = results.concat(formatParserDiagnostics(parsedResult.parsed, parsedResult.source));
28 }
29 else {
30 parsedResult = target;
31 }
32 const { result: resolvedTarget, errors } = yield this.resolver.resolve(parsedResult.parsed.data);
33 return [
34 ...results,
35 ...formatResolverErrors(errors, parsedResult),
36 ...runner_1.runRules(parsedResult, this.rules, this.functions, { resolvedTarget }),
37 ];
38 });
39 }
40 get functions() {
41 return this._functions;
42 }
43 addFunctions(functions) {
44 Object.assign(this._functions, lodash_1.merge({}, functions));
45 }
46 get rules() {
47 const rules = {};
48 for (const name in this._rules) {
49 if (!this._rules.hasOwnProperty(name))
50 continue;
51 const rule = this._rules[name];
52 rules[name] = Object.assign({ name }, rule);
53 }
54 return rules;
55 }
56 addRules(rules) {
57 Object.assign(this._rules, lodash_1.merge({}, rules));
58 }
59 mergeRules(rules) {
60 for (const ruleName in lodash_1.merge({}, rules)) {
61 if (!rules.hasOwnProperty(ruleName))
62 continue;
63 const rule = rules[ruleName];
64 if (rule) {
65 this._rules[ruleName] = lodash_1.merge(this._rules[ruleName], rule);
66 }
67 }
68 }
69 applyRuleDeclarations(declarations) {
70 for (const ruleName in declarations) {
71 if (!declarations.hasOwnProperty(ruleName))
72 continue;
73 const declaration = declarations[ruleName];
74 const rule = this.rules[ruleName];
75 if (rule) {
76 if (typeof declaration === 'boolean') {
77 this._rules[ruleName].enabled = declaration;
78 }
79 }
80 }
81 }
82}
83exports.Spectral = Spectral;
84exports.isParsedResult = (obj) => {
85 if (!obj || typeof obj !== 'object')
86 return false;
87 if (!obj.parsed || typeof obj.parsed !== 'object')
88 return false;
89 if (!obj.getLocationForJsonPath || typeof obj.getLocationForJsonPath !== 'function')
90 return false;
91 return true;
92};
93function formatParserDiagnostics(parsed, source) {
94 return parsed.diagnostics.map(diagnostic => (Object.assign({}, diagnostic, { path: [], source })));
95}
96const prettyPrintResolverError = (message) => message.replace(/^Error\s*:\s*/, '');
97const formatResolverErrors = (resolveErrors, result) => {
98 return lodash_1.uniqBy(resolveErrors, 'message').reduce((errors, error) => {
99 const path = [...error.path, '$ref'];
100 const location = result.getLocationForJsonPath(result.parsed, path);
101 if (location) {
102 errors.push({
103 code: 'invalid-ref',
104 path,
105 message: prettyPrintResolverError(error.message),
106 severity: types_1.DiagnosticSeverity.Error,
107 range: location.range,
108 });
109 }
110 return errors;
111 }, []);
112};
113//# sourceMappingURL=spectral.js.map
\No newline at end of file