1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const json_1 = require("@stoplight/json");
|
5 | const json_ref_resolver_1 = require("@stoplight/json-ref-resolver");
|
6 | const types_1 = require("@stoplight/types");
|
7 | const yaml_1 = require("@stoplight/yaml");
|
8 | const lodash_1 = require("lodash");
|
9 | const functions_1 = require("./functions");
|
10 | const runner_1 = require("./runner");
|
11 | tslib_1.__exportStar(require("./types"), exports);
|
12 | class 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 | }
|
83 | exports.Spectral = Spectral;
|
84 | exports.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 | };
|
93 | function formatParserDiagnostics(parsed, source) {
|
94 | return parsed.diagnostics.map(diagnostic => (Object.assign({}, diagnostic, { path: [], source })));
|
95 | }
|
96 | const prettyPrintResolverError = (message) => message.replace(/^Error\s*:\s*/, '');
|
97 | const 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 |
|
\ | No newline at end of file |