@redocly/openapi-core 1.0.0-beta.78 → 1.0.0-beta.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/utils.ts +11 -1
- package/lib/bundle.js +18 -7
- package/lib/config/builtIn.js +18 -4
- package/lib/{rules → decorators}/common/info-description-override.d.ts +0 -0
- package/lib/{rules → decorators}/common/info-description-override.js +0 -0
- package/lib/{rules → decorators}/common/operation-description-override.d.ts +0 -0
- package/lib/{rules → decorators}/common/operation-description-override.js +0 -0
- package/lib/{rules → decorators}/common/registry-dependencies.d.ts +0 -0
- package/lib/{rules → decorators}/common/registry-dependencies.js +0 -0
- package/lib/{rules → decorators}/common/remove-x-internal.d.ts +0 -0
- package/lib/{rules → decorators}/common/remove-x-internal.js +20 -2
- package/lib/{rules → decorators}/common/tag-description-override.d.ts +0 -0
- package/lib/{rules → decorators}/common/tag-description-override.js +0 -0
- package/lib/decorators/oas2/index.d.ts +8 -0
- package/lib/decorators/oas2/index.js +15 -0
- package/lib/decorators/oas3/index.d.ts +8 -0
- package/lib/decorators/oas3/index.js +15 -0
- package/lib/js-yaml/index.js +1 -1
- package/lib/resolve.d.ts +1 -0
- package/lib/resolve.js +7 -3
- package/lib/rules/common/operation-security-defined.js +1 -4
- package/lib/rules/common/spec.js +18 -3
- package/lib/rules/oas2/index.d.ts +1 -8
- package/lib/rules/oas2/index.js +1 -13
- package/lib/rules/oas2/remove-unused-components.js +11 -9
- package/lib/rules/oas3/index.d.ts +0 -8
- package/lib/rules/oas3/index.js +1 -13
- package/lib/rules/oas3/no-invalid-media-type-examples.js +12 -11
- package/lib/rules/oas3/remove-unused-components.js +11 -9
- package/lib/types/index.d.ts +4 -0
- package/lib/types/oas2.js +42 -35
- package/lib/types/oas3.js +68 -139
- package/lib/types/oas3_1.js +52 -49
- package/lib/utils.js +1 -1
- package/lib/walk.js +1 -1
- package/package.json +1 -1
- package/src/__tests__/js-yaml.test.ts +29 -5
- package/src/__tests__/lint.test.ts +1 -3
- package/src/bundle.ts +21 -8
- package/src/config/builtIn.ts +20 -7
- package/src/{rules/__tests__/hide-internals.test.ts → decorators/__tests__/remove-x-internal.test.ts} +124 -42
- package/src/{rules → decorators}/common/info-description-override.ts +0 -0
- package/src/{rules → decorators}/common/operation-description-override.ts +0 -0
- package/src/{rules → decorators}/common/registry-dependencies.ts +0 -0
- package/src/{rules → decorators}/common/remove-x-internal.ts +20 -3
- package/src/{rules → decorators}/common/tag-description-override.ts +0 -0
- package/src/decorators/oas2/index.ts +14 -0
- package/src/decorators/oas3/index.ts +14 -0
- package/src/js-yaml/index.ts +1 -2
- package/src/redocly/registry-api.ts +4 -1
- package/src/resolve.ts +6 -6
- package/src/rules/__tests__/no-unresolved-refs.test.ts +1 -4
- package/src/rules/common/__tests__/info-description.test.ts +1 -3
- package/src/rules/common/__tests__/info-license.test.ts +1 -2
- package/src/rules/common/__tests__/license-url.test.ts +1 -2
- package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +1 -2
- package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +1 -2
- package/src/rules/common/__tests__/no-identical-paths.test.ts +1 -2
- package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +1 -2
- package/src/rules/common/__tests__/operation-2xx-response.test.ts +1 -2
- package/src/rules/common/__tests__/operation-4xx-response.test.ts +1 -2
- package/src/rules/common/__tests__/operation-operationId-unique.test.ts +1 -2
- package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +1 -2
- package/src/rules/common/__tests__/operation-parameters-unique.test.ts +1 -2
- package/src/rules/common/__tests__/operation-security-defined.test.ts +1 -2
- package/src/rules/common/__tests__/operation-singular-tag.test.ts +1 -2
- package/src/rules/common/__tests__/path-http-verbs-order.test.ts +1 -2
- package/src/rules/common/__tests__/path-not-include-query.test.ts +1 -2
- package/src/rules/common/__tests__/path-params-defined.test.ts +1 -2
- package/src/rules/common/__tests__/paths-kebab-case.test.ts +1 -2
- package/src/rules/common/__tests__/tag-description.test.ts +1 -2
- package/src/rules/common/__tests__/tags-alphabetical.test.ts +1 -2
- package/src/rules/common/operation-security-defined.ts +4 -5
- package/src/rules/common/spec.ts +18 -0
- package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +1 -2
- package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +1 -2
- package/src/rules/oas2/index.ts +1 -13
- package/src/rules/oas2/remove-unused-components.ts +12 -10
- package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +1 -2
- package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +1 -2
- package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +1 -2
- package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +1 -2
- package/src/rules/oas3/__tests__/no-server-example.com.test.ts +1 -2
- package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +1 -2
- package/src/rules/oas3/__tests__/no-unused-components.test.ts +1 -2
- package/src/rules/oas3/index.ts +0 -14
- package/src/rules/oas3/no-invalid-media-type-examples.ts +17 -21
- package/src/rules/oas3/remove-unused-components.ts +12 -10
- package/src/types/index.ts +4 -0
- package/src/types/oas2.ts +42 -40
- package/src/types/oas3.ts +68 -141
- package/src/types/oas3_1.ts +51 -50
- package/src/utils.ts +1 -1
- package/src/walk.ts +2 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/lib/rules/builtin.d.ts +0 -22
- package/lib/rules/builtin.js +0 -17
- package/src/rules/__tests__/config.ts +0 -11
- package/src/rules/builtin.ts +0 -18
package/__tests__/utils.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
|
|
3
3
|
import { Document, Source, NormalizedProblem, parseYaml, stringifyYaml } from '../src';
|
|
4
|
-
import { RuleConfig, LintConfig, Plugin } from '../src/config/config';
|
|
4
|
+
import { RuleConfig, LintConfig, Plugin, DecoratorConfig } from '../src/config/config';
|
|
5
5
|
import { Oas3RuleSet } from '../src/oas-types';
|
|
6
|
+
import { defaultPlugin } from '../src/config/builtIn';
|
|
6
7
|
|
|
7
8
|
export function parseYamlToDocument(body: string, absoluteRef: string = ''): Document {
|
|
8
9
|
return {
|
|
@@ -62,3 +63,12 @@ export function makeConfigForRuleset(rules: Oas3RuleSet, plugin?: Partial<Plugin
|
|
|
62
63
|
rules: rulesConf,
|
|
63
64
|
});
|
|
64
65
|
}
|
|
66
|
+
|
|
67
|
+
export function makeConfig(rules: Record<string, RuleConfig>, decorators?: Record<string, DecoratorConfig>) {
|
|
68
|
+
return new LintConfig({
|
|
69
|
+
plugins: [defaultPlugin],
|
|
70
|
+
extends: [],
|
|
71
|
+
rules,
|
|
72
|
+
decorators,
|
|
73
|
+
});
|
|
74
|
+
}
|
package/lib/bundle.js
CHANGED
|
@@ -74,20 +74,20 @@ function bundleDocument(opts) {
|
|
|
74
74
|
: remove_unused_components_2.RemoveUnusedComponents({})
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
|
+
const resolvedRefMap = yield resolve_1.resolveDocument({
|
|
78
|
+
rootDocument: document,
|
|
79
|
+
rootType: types.DefinitionRoot,
|
|
80
|
+
externalRefResolver,
|
|
81
|
+
});
|
|
77
82
|
const bundleVisitor = visitors_1.normalizeVisitors([
|
|
78
83
|
...preprocessors,
|
|
79
84
|
{
|
|
80
85
|
severity: 'error',
|
|
81
86
|
ruleId: 'bundler',
|
|
82
|
-
visitor: makeBundleVisitor(oasMajorVersion, dereference, skipRedoclyRegistryRefs, document),
|
|
87
|
+
visitor: makeBundleVisitor(oasMajorVersion, dereference, skipRedoclyRegistryRefs, document, resolvedRefMap),
|
|
83
88
|
},
|
|
84
89
|
...decorators,
|
|
85
90
|
], types);
|
|
86
|
-
const resolvedRefMap = yield resolve_1.resolveDocument({
|
|
87
|
-
rootDocument: document,
|
|
88
|
-
rootType: types.DefinitionRoot,
|
|
89
|
-
externalRefResolver,
|
|
90
|
-
});
|
|
91
91
|
walk_1.walkDocument({
|
|
92
92
|
document,
|
|
93
93
|
rootType: types.DefinitionRoot,
|
|
@@ -146,7 +146,7 @@ function mapTypeToComponent(typeName, version) {
|
|
|
146
146
|
}
|
|
147
147
|
exports.mapTypeToComponent = mapTypeToComponent;
|
|
148
148
|
// function oas3Move
|
|
149
|
-
function makeBundleVisitor(version, dereference, skipRedoclyRegistryRefs, rootDocument) {
|
|
149
|
+
function makeBundleVisitor(version, dereference, skipRedoclyRegistryRefs, rootDocument, resolvedRefMap) {
|
|
150
150
|
let components;
|
|
151
151
|
const visitor = {
|
|
152
152
|
ref: {
|
|
@@ -175,6 +175,7 @@ function makeBundleVisitor(version, dereference, skipRedoclyRegistryRefs, rootDo
|
|
|
175
175
|
}
|
|
176
176
|
else {
|
|
177
177
|
node.$ref = saveComponent(componentType, resolved, ctx);
|
|
178
|
+
resolveBundledComponent(node, resolved, ctx);
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
181
|
},
|
|
@@ -211,6 +212,16 @@ function makeBundleVisitor(version, dereference, skipRedoclyRegistryRefs, rootDo
|
|
|
211
212
|
},
|
|
212
213
|
};
|
|
213
214
|
}
|
|
215
|
+
function resolveBundledComponent(node, resolved, ctx) {
|
|
216
|
+
const newRefId = resolve_1.makeRefId(ctx.location.source.absoluteRef, node.$ref);
|
|
217
|
+
resolvedRefMap.set(newRefId, {
|
|
218
|
+
document: rootDocument,
|
|
219
|
+
isRemote: false,
|
|
220
|
+
node: resolved.node,
|
|
221
|
+
nodePointer: node.$ref,
|
|
222
|
+
resolved: true,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
214
225
|
function replaceRef(ref, resolved, ctx) {
|
|
215
226
|
if (!utils_1.isPlainObject(resolved.node)) {
|
|
216
227
|
ctx.parent[ctx.key] = resolved.node;
|
package/lib/config/builtIn.js
CHANGED
|
@@ -4,7 +4,12 @@ exports.defaultPlugin = exports.builtInConfigs = void 0;
|
|
|
4
4
|
const recommended_1 = require("./recommended");
|
|
5
5
|
const all_1 = require("./all");
|
|
6
6
|
const minimal_1 = require("./minimal");
|
|
7
|
-
const
|
|
7
|
+
const oas3_1 = require("../rules/oas3");
|
|
8
|
+
const oas2_1 = require("../rules/oas2");
|
|
9
|
+
const oas3_2 = require("../rules/oas3");
|
|
10
|
+
const oas2_2 = require("../rules/oas2");
|
|
11
|
+
const oas3_3 = require("../decorators/oas3");
|
|
12
|
+
const oas2_3 = require("../decorators/oas2");
|
|
8
13
|
exports.builtInConfigs = {
|
|
9
14
|
recommended: recommended_1.default,
|
|
10
15
|
minimal: minimal_1.default,
|
|
@@ -15,8 +20,17 @@ exports.builtInConfigs = {
|
|
|
15
20
|
};
|
|
16
21
|
exports.defaultPlugin = {
|
|
17
22
|
id: '',
|
|
18
|
-
rules:
|
|
19
|
-
|
|
20
|
-
|
|
23
|
+
rules: {
|
|
24
|
+
oas3: oas3_1.rules,
|
|
25
|
+
oas2: oas2_1.rules,
|
|
26
|
+
},
|
|
27
|
+
preprocessors: {
|
|
28
|
+
oas3: oas3_2.preprocessors,
|
|
29
|
+
oas2: oas2_2.preprocessors,
|
|
30
|
+
},
|
|
31
|
+
decorators: {
|
|
32
|
+
oas3: oas3_3.decorators,
|
|
33
|
+
oas2: oas2_3.decorators,
|
|
34
|
+
},
|
|
21
35
|
configs: exports.builtInConfigs,
|
|
22
36
|
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -2,15 +2,25 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RemoveXInternal = void 0;
|
|
4
4
|
const utils_1 = require("../../utils");
|
|
5
|
+
const ref_utils_1 = require("../../ref-utils");
|
|
5
6
|
const DEFAULT_INTERNAL_PROPERTY_NAME = 'x-internal';
|
|
6
7
|
const RemoveXInternal = ({ internalFlagProperty }) => {
|
|
7
8
|
const hiddenTag = internalFlagProperty || DEFAULT_INTERNAL_PROPERTY_NAME;
|
|
8
9
|
function removeInternal(node, ctx) {
|
|
10
|
+
var _a, _b, _c, _d;
|
|
9
11
|
const { parent, key } = ctx;
|
|
10
12
|
let didDelete = false;
|
|
11
13
|
if (Array.isArray(node)) {
|
|
12
14
|
for (let i = 0; i < node.length; i++) {
|
|
13
|
-
if (node[i]
|
|
15
|
+
if (ref_utils_1.isRef(node[i])) {
|
|
16
|
+
const resolved = ctx.resolve(node[i]);
|
|
17
|
+
if ((_a = resolved.node) === null || _a === void 0 ? void 0 : _a[hiddenTag]) {
|
|
18
|
+
node.splice(i, 1);
|
|
19
|
+
didDelete = true;
|
|
20
|
+
i--;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if ((_b = node[i]) === null || _b === void 0 ? void 0 : _b[hiddenTag]) {
|
|
14
24
|
node.splice(i, 1);
|
|
15
25
|
didDelete = true;
|
|
16
26
|
i--;
|
|
@@ -19,7 +29,15 @@ const RemoveXInternal = ({ internalFlagProperty }) => {
|
|
|
19
29
|
}
|
|
20
30
|
else if (utils_1.isPlainObject(node)) {
|
|
21
31
|
for (const key of Object.keys(node)) {
|
|
22
|
-
|
|
32
|
+
node = node;
|
|
33
|
+
if (ref_utils_1.isRef(node[key])) {
|
|
34
|
+
const resolved = ctx.resolve(node[key]);
|
|
35
|
+
if ((_c = resolved.node) === null || _c === void 0 ? void 0 : _c[hiddenTag]) {
|
|
36
|
+
delete node[key];
|
|
37
|
+
didDelete = true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if ((_d = node[key]) === null || _d === void 0 ? void 0 : _d[hiddenTag]) {
|
|
23
41
|
delete node[key];
|
|
24
42
|
didDelete = true;
|
|
25
43
|
}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Oas2Decorator } from '../../visitors';
|
|
2
|
+
export declare const decorators: {
|
|
3
|
+
'registry-dependencies': Oas2Decorator;
|
|
4
|
+
'operation-description-override': Oas2Decorator;
|
|
5
|
+
'tag-description-override': Oas2Decorator;
|
|
6
|
+
'info-description-override': Oas2Decorator;
|
|
7
|
+
'remove-x-internal': Oas2Decorator;
|
|
8
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decorators = void 0;
|
|
4
|
+
const registry_dependencies_1 = require("../common/registry-dependencies");
|
|
5
|
+
const operation_description_override_1 = require("../common/operation-description-override");
|
|
6
|
+
const tag_description_override_1 = require("../common/tag-description-override");
|
|
7
|
+
const info_description_override_1 = require("../common/info-description-override");
|
|
8
|
+
const remove_x_internal_1 = require("../common/remove-x-internal");
|
|
9
|
+
exports.decorators = {
|
|
10
|
+
'registry-dependencies': registry_dependencies_1.RegistryDependencies,
|
|
11
|
+
'operation-description-override': operation_description_override_1.OperationDescriptionOverride,
|
|
12
|
+
'tag-description-override': tag_description_override_1.TagDescriptionOverride,
|
|
13
|
+
'info-description-override': info_description_override_1.InfoDescriptionOverride,
|
|
14
|
+
'remove-x-internal': remove_x_internal_1.RemoveXInternal
|
|
15
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Oas3Decorator } from '../../visitors';
|
|
2
|
+
export declare const decorators: {
|
|
3
|
+
'registry-dependencies': Oas3Decorator;
|
|
4
|
+
'operation-description-override': Oas3Decorator;
|
|
5
|
+
'tag-description-override': Oas3Decorator;
|
|
6
|
+
'info-description-override': Oas3Decorator;
|
|
7
|
+
'remove-x-internal': Oas3Decorator;
|
|
8
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decorators = void 0;
|
|
4
|
+
const registry_dependencies_1 = require("../common/registry-dependencies");
|
|
5
|
+
const operation_description_override_1 = require("../common/operation-description-override");
|
|
6
|
+
const tag_description_override_1 = require("../common/tag-description-override");
|
|
7
|
+
const info_description_override_1 = require("../common/info-description-override");
|
|
8
|
+
const remove_x_internal_1 = require("../common/remove-x-internal");
|
|
9
|
+
exports.decorators = {
|
|
10
|
+
'registry-dependencies': registry_dependencies_1.RegistryDependencies,
|
|
11
|
+
'operation-description-override': operation_description_override_1.OperationDescriptionOverride,
|
|
12
|
+
'tag-description-override': tag_description_override_1.TagDescriptionOverride,
|
|
13
|
+
'info-description-override': info_description_override_1.InfoDescriptionOverride,
|
|
14
|
+
'remove-x-internal': remove_x_internal_1.RemoveXInternal
|
|
15
|
+
};
|
package/lib/js-yaml/index.js
CHANGED
|
@@ -15,5 +15,5 @@ const DEFAULT_SCHEMA_WITHOUT_TIMESTAMP = js_yaml_1.JSON_SCHEMA.extend({
|
|
|
15
15
|
});
|
|
16
16
|
const parseYaml = (str, opts) => js_yaml_1.load(str, Object.assign({ schema: DEFAULT_SCHEMA_WITHOUT_TIMESTAMP }, opts));
|
|
17
17
|
exports.parseYaml = parseYaml;
|
|
18
|
-
const stringifyYaml = (obj, opts) => js_yaml_1.dump(obj,
|
|
18
|
+
const stringifyYaml = (obj, opts) => js_yaml_1.dump(obj, opts);
|
|
19
19
|
exports.stringifyYaml = stringifyYaml;
|
package/lib/resolve.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export declare type Document = {
|
|
|
27
27
|
source: Source;
|
|
28
28
|
parsed: any;
|
|
29
29
|
};
|
|
30
|
+
export declare function makeRefId(absoluteRef: string, pointer: string): string;
|
|
30
31
|
export declare function makeDocumentFromString(sourceString: string, absoluteRef: string): {
|
|
31
32
|
source: Source;
|
|
32
33
|
parsed: unknown;
|
package/lib/resolve.js
CHANGED
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.resolveDocument = exports.BaseResolver = exports.makeDocumentFromString = exports.YamlParseError = exports.ResolveError = exports.Source = void 0;
|
|
12
|
+
exports.resolveDocument = exports.BaseResolver = exports.makeDocumentFromString = exports.makeRefId = exports.YamlParseError = exports.ResolveError = exports.Source = void 0;
|
|
13
13
|
const fs = require("fs");
|
|
14
14
|
const path = require("path");
|
|
15
15
|
const url = require("url");
|
|
@@ -69,6 +69,10 @@ class YamlParseError extends Error {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
exports.YamlParseError = YamlParseError;
|
|
72
|
+
function makeRefId(absoluteRef, pointer) {
|
|
73
|
+
return absoluteRef + '::' + pointer;
|
|
74
|
+
}
|
|
75
|
+
exports.makeRefId = makeRefId;
|
|
72
76
|
function makeDocumentFromString(sourceString, absoluteRef) {
|
|
73
77
|
const source = new Source(absoluteRef, sourceString);
|
|
74
78
|
try {
|
|
@@ -255,7 +259,7 @@ function resolveDocument(opts) {
|
|
|
255
259
|
document: undefined,
|
|
256
260
|
error: error,
|
|
257
261
|
};
|
|
258
|
-
const refId = document.source.absoluteRef
|
|
262
|
+
const refId = makeRefId(document.source.absoluteRef, ref.$ref);
|
|
259
263
|
resolvedRefMap.set(refId, resolvedRef);
|
|
260
264
|
return resolvedRef;
|
|
261
265
|
}
|
|
@@ -294,7 +298,7 @@ function resolveDocument(opts) {
|
|
|
294
298
|
}
|
|
295
299
|
resolvedRef.node = target;
|
|
296
300
|
resolvedRef.document = targetDoc;
|
|
297
|
-
const refId = document.source.absoluteRef
|
|
301
|
+
const refId = makeRefId(document.source.absoluteRef, ref.$ref);
|
|
298
302
|
if (resolvedRef.document && ref_utils_1.isRef(target)) {
|
|
299
303
|
resolvedRef = yield followRef(resolvedRef.document, target, pushRef(refStack, target));
|
|
300
304
|
}
|
|
@@ -19,10 +19,7 @@ const OperationSecurityDefined = () => {
|
|
|
19
19
|
},
|
|
20
20
|
},
|
|
21
21
|
SecurityScheme(_securityScheme, { key }) {
|
|
22
|
-
referencedSchemes.set(key.toString(), {
|
|
23
|
-
defined: true,
|
|
24
|
-
from: [],
|
|
25
|
-
});
|
|
22
|
+
referencedSchemes.set(key.toString(), { defined: true, from: [] });
|
|
26
23
|
},
|
|
27
24
|
SecurityRequirement(requirements, { location }) {
|
|
28
25
|
for (const requirement of Object.keys(requirements)) {
|
package/lib/rules/common/spec.js
CHANGED
|
@@ -4,10 +4,11 @@ exports.OasSpec = void 0;
|
|
|
4
4
|
const types_1 = require("../../types");
|
|
5
5
|
const utils_1 = require("../utils");
|
|
6
6
|
const ref_utils_1 = require("../../ref-utils");
|
|
7
|
+
const utils_2 = require("../../utils");
|
|
7
8
|
const OasSpec = () => {
|
|
8
9
|
return {
|
|
9
10
|
any(node, { report, type, location, key, resolve, ignoreNextVisitorsOnNode }) {
|
|
10
|
-
var _a, _b;
|
|
11
|
+
var _a, _b, _c;
|
|
11
12
|
const nodeType = utils_1.oasTypeOf(node);
|
|
12
13
|
if (type.items) {
|
|
13
14
|
if (nodeType !== 'array') {
|
|
@@ -34,6 +35,20 @@ const OasSpec = () => {
|
|
|
34
35
|
});
|
|
35
36
|
}
|
|
36
37
|
}
|
|
38
|
+
const allowed = (_a = type.allowed) === null || _a === void 0 ? void 0 : _a.call(type, node);
|
|
39
|
+
if (allowed && utils_2.isPlainObject(node)) {
|
|
40
|
+
for (const propName in node) {
|
|
41
|
+
if (allowed.includes(propName) ||
|
|
42
|
+
(type.extensionsPrefix && propName.startsWith(type.extensionsPrefix)) ||
|
|
43
|
+
!Object.keys(type.properties).includes(propName)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
report({
|
|
47
|
+
message: `The field \`${propName}\` is not allowed here.`,
|
|
48
|
+
location: location.child([propName]).key()
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
37
52
|
const requiredOneOf = type.requiredOneOf || null;
|
|
38
53
|
if (requiredOneOf) {
|
|
39
54
|
let hasProperty = false;
|
|
@@ -94,8 +109,8 @@ const OasSpec = () => {
|
|
|
94
109
|
location: propLocation,
|
|
95
110
|
});
|
|
96
111
|
}
|
|
97
|
-
else if (propValueType === 'array' && ((
|
|
98
|
-
const itemsType = (
|
|
112
|
+
else if (propValueType === 'array' && ((_b = propSchema.items) === null || _b === void 0 ? void 0 : _b.type)) {
|
|
113
|
+
const itemsType = (_c = propSchema.items) === null || _c === void 0 ? void 0 : _c.type;
|
|
99
114
|
for (let i = 0; i < propValue.length; i++) {
|
|
100
115
|
const item = propValue[i];
|
|
101
116
|
if (!utils_1.matchesJsonSchemaType(item, itemsType, false)) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const rules: {
|
|
3
3
|
spec: Oas2Rule;
|
|
4
4
|
'no-invalid-schema-examples': any;
|
|
@@ -40,10 +40,3 @@ export declare const rules: {
|
|
|
40
40
|
'path-segment-plural': Oas2Rule;
|
|
41
41
|
};
|
|
42
42
|
export declare const preprocessors: {};
|
|
43
|
-
export declare const decorators: {
|
|
44
|
-
'registry-dependencies': Oas2Decorator;
|
|
45
|
-
'operation-description-override': Oas2Decorator;
|
|
46
|
-
'tag-description-override': Oas2Decorator;
|
|
47
|
-
'info-description-override': Oas2Decorator;
|
|
48
|
-
'remove-x-internal': Oas2Decorator;
|
|
49
|
-
};
|
package/lib/rules/oas2/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.preprocessors = exports.rules = void 0;
|
|
4
4
|
const spec_1 = require("../common/spec");
|
|
5
5
|
const no_invalid_schema_examples_1 = require("../common/no-invalid-schema-examples");
|
|
6
6
|
const no_invalid_parameter_examples_1 = require("../common/no-invalid-parameter-examples");
|
|
@@ -29,7 +29,6 @@ const operation_singular_tag_1 = require("../common/operation-singular-tag");
|
|
|
29
29
|
const operation_security_defined_1 = require("../common/operation-security-defined");
|
|
30
30
|
const no_unresolved_refs_1 = require("../no-unresolved-refs");
|
|
31
31
|
const path_http_verbs_order_1 = require("../common/path-http-verbs-order");
|
|
32
|
-
const registry_dependencies_1 = require("../common/registry-dependencies");
|
|
33
32
|
const no_identical_paths_1 = require("../common/no-identical-paths");
|
|
34
33
|
const operation_operationId_1 = require("../common/operation-operationId");
|
|
35
34
|
const operation_summary_1 = require("../common/operation-summary");
|
|
@@ -39,10 +38,6 @@ const path_excludes_patterns_1 = require("../common/path-excludes-patterns");
|
|
|
39
38
|
const request_mime_type_1 = require("./request-mime-type");
|
|
40
39
|
const response_mime_type_1 = require("./response-mime-type");
|
|
41
40
|
const path_segment_plural_1 = require("../common/path-segment-plural");
|
|
42
|
-
const operation_description_override_1 = require("../common/operation-description-override");
|
|
43
|
-
const tag_description_override_1 = require("../common/tag-description-override");
|
|
44
|
-
const info_description_override_1 = require("../common/info-description-override");
|
|
45
|
-
const remove_x_internal_1 = require("../common/remove-x-internal");
|
|
46
41
|
exports.rules = {
|
|
47
42
|
spec: spec_1.OasSpec,
|
|
48
43
|
'no-invalid-schema-examples': no_invalid_schema_examples_1.NoInvalidSchemaExamples,
|
|
@@ -84,10 +79,3 @@ exports.rules = {
|
|
|
84
79
|
'path-segment-plural': path_segment_plural_1.PathSegmentPlural,
|
|
85
80
|
};
|
|
86
81
|
exports.preprocessors = {};
|
|
87
|
-
exports.decorators = {
|
|
88
|
-
'registry-dependencies': registry_dependencies_1.RegistryDependencies,
|
|
89
|
-
'operation-description-override': operation_description_override_1.OperationDescriptionOverride,
|
|
90
|
-
'tag-description-override': tag_description_override_1.TagDescriptionOverride,
|
|
91
|
-
'info-description-override': info_description_override_1.InfoDescriptionOverride,
|
|
92
|
-
'remove-x-internal': remove_x_internal_1.RemoveXInternal
|
|
93
|
-
};
|
|
@@ -13,15 +13,17 @@ const RemoveUnusedComponents = () => {
|
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
return {
|
|
16
|
-
ref
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
ref: {
|
|
17
|
+
leave(ref, { type, resolve, key }) {
|
|
18
|
+
if (['Schema', 'Parameter', 'Response', 'SecurityScheme'].includes(type.name)) {
|
|
19
|
+
const resolvedRef = resolve(ref);
|
|
20
|
+
if (!resolvedRef.location)
|
|
21
|
+
return;
|
|
22
|
+
components.set(resolvedRef.location.absolutePointer, {
|
|
23
|
+
used: true,
|
|
24
|
+
name: key.toString(),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
25
27
|
}
|
|
26
28
|
},
|
|
27
29
|
DefinitionRoot: {
|
|
@@ -1,11 +1,3 @@
|
|
|
1
1
|
import { Oas3RuleSet } from '../../oas-types';
|
|
2
|
-
import { Oas3Decorator } from '../../visitors';
|
|
3
2
|
export declare const rules: Oas3RuleSet;
|
|
4
3
|
export declare const preprocessors: {};
|
|
5
|
-
export declare const decorators: {
|
|
6
|
-
'registry-dependencies': Oas3Decorator;
|
|
7
|
-
'operation-description-override': Oas3Decorator;
|
|
8
|
-
'tag-description-override': Oas3Decorator;
|
|
9
|
-
'info-description-override': Oas3Decorator;
|
|
10
|
-
'remove-x-internal': Oas3Decorator;
|
|
11
|
-
};
|
package/lib/rules/oas3/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.preprocessors = exports.rules = void 0;
|
|
4
4
|
const spec_1 = require("../common/spec");
|
|
5
5
|
const operation_2xx_response_1 = require("../common/operation-2xx-response");
|
|
6
6
|
const operation_4xx_response_1 = require("../common/operation-4xx-response");
|
|
@@ -33,7 +33,6 @@ const paths_kebab_case_1 = require("../common/paths-kebab-case");
|
|
|
33
33
|
const path_http_verbs_order_1 = require("../common/path-http-verbs-order");
|
|
34
34
|
const no_empty_servers_1 = require("./no-empty-servers");
|
|
35
35
|
const no_invalid_media_type_examples_1 = require("./no-invalid-media-type-examples");
|
|
36
|
-
const registry_dependencies_1 = require("../common/registry-dependencies");
|
|
37
36
|
const no_identical_paths_1 = require("../common/no-identical-paths");
|
|
38
37
|
const no_undefined_server_variable_1 = require("./no-undefined-server-variable");
|
|
39
38
|
const operation_operationId_1 = require("../common/operation-operationId");
|
|
@@ -44,13 +43,9 @@ const no_http_verbs_in_paths_1 = require("../common/no-http-verbs-in-paths");
|
|
|
44
43
|
const request_mime_type_1 = require("./request-mime-type");
|
|
45
44
|
const response_mime_type_1 = require("./response-mime-type");
|
|
46
45
|
const path_segment_plural_1 = require("../common/path-segment-plural");
|
|
47
|
-
const operation_description_override_1 = require("../common/operation-description-override");
|
|
48
|
-
const tag_description_override_1 = require("../common/tag-description-override");
|
|
49
|
-
const info_description_override_1 = require("../common/info-description-override");
|
|
50
46
|
const path_excludes_patterns_1 = require("../common/path-excludes-patterns");
|
|
51
47
|
const no_invalid_schema_examples_1 = require("../common/no-invalid-schema-examples");
|
|
52
48
|
const no_invalid_parameter_examples_1 = require("../common/no-invalid-parameter-examples");
|
|
53
|
-
const remove_x_internal_1 = require("../common/remove-x-internal");
|
|
54
49
|
exports.rules = {
|
|
55
50
|
spec: spec_1.OasSpec,
|
|
56
51
|
'info-description': info_description_1.InfoDescription,
|
|
@@ -100,10 +95,3 @@ exports.rules = {
|
|
|
100
95
|
'no-invalid-parameter-examples': no_invalid_parameter_examples_1.NoInvalidParameterExamples,
|
|
101
96
|
};
|
|
102
97
|
exports.preprocessors = {};
|
|
103
|
-
exports.decorators = {
|
|
104
|
-
'registry-dependencies': registry_dependencies_1.RegistryDependencies,
|
|
105
|
-
'operation-description-override': operation_description_override_1.OperationDescriptionOverride,
|
|
106
|
-
'tag-description-override': tag_description_override_1.TagDescriptionOverride,
|
|
107
|
-
'info-description-override': info_description_override_1.InfoDescriptionOverride,
|
|
108
|
-
'remove-x-internal': remove_x_internal_1.RemoveXInternal
|
|
109
|
-
};
|
|
@@ -13,22 +13,23 @@ const ValidContentExamples = (opts) => {
|
|
|
13
13
|
if (!mediaType.schema)
|
|
14
14
|
return;
|
|
15
15
|
if (mediaType.example) {
|
|
16
|
-
|
|
16
|
+
resolveAndValidateExample(mediaType.example, location.child('example'));
|
|
17
17
|
}
|
|
18
18
|
else if (mediaType.examples) {
|
|
19
19
|
for (const exampleName of Object.keys(mediaType.examples)) {
|
|
20
|
-
|
|
21
|
-
let dataLoc = location.child(['examples', exampleName, 'value']);
|
|
22
|
-
if (ref_utils_1.isRef(example)) {
|
|
23
|
-
const resolved = resolve(example);
|
|
24
|
-
if (!resolved.location)
|
|
25
|
-
continue;
|
|
26
|
-
dataLoc = resolved.location.child('value');
|
|
27
|
-
example = resolved.node;
|
|
28
|
-
}
|
|
29
|
-
utils_1.validateExample(example.value, mediaType.schema, dataLoc, ctx, disallowAdditionalProperties);
|
|
20
|
+
resolveAndValidateExample(mediaType.examples[exampleName], location.child(['examples', exampleName, 'value']), true);
|
|
30
21
|
}
|
|
31
22
|
}
|
|
23
|
+
function resolveAndValidateExample(example, location, isMultiple) {
|
|
24
|
+
if (ref_utils_1.isRef(example)) {
|
|
25
|
+
const resolved = resolve(example);
|
|
26
|
+
if (!resolved.location)
|
|
27
|
+
return;
|
|
28
|
+
location = isMultiple ? resolved.location.child('value') : resolved.location;
|
|
29
|
+
example = resolved.node;
|
|
30
|
+
}
|
|
31
|
+
utils_1.validateExample(isMultiple ? example.value : example, mediaType.schema, location, ctx, disallowAdditionalProperties);
|
|
32
|
+
}
|
|
32
33
|
},
|
|
33
34
|
},
|
|
34
35
|
};
|
|
@@ -13,15 +13,17 @@ const RemoveUnusedComponents = () => {
|
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
return {
|
|
16
|
-
ref
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
ref: {
|
|
17
|
+
leave(ref, { type, resolve, key }) {
|
|
18
|
+
if (['Schema', 'Header', 'Parameter', 'Response', 'Example', 'RequestBody'].includes(type.name)) {
|
|
19
|
+
const resolvedRef = resolve(ref);
|
|
20
|
+
if (!resolvedRef.location)
|
|
21
|
+
return;
|
|
22
|
+
components.set(resolvedRef.location.absolutePointer, {
|
|
23
|
+
used: true,
|
|
24
|
+
name: key.toString(),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
25
27
|
}
|
|
26
28
|
},
|
|
27
29
|
DefinitionRoot: {
|
package/lib/types/index.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export declare type NodeType = {
|
|
|
22
22
|
items?: string;
|
|
23
23
|
required?: string[] | ((value: any, key: string | number | undefined) => string[]);
|
|
24
24
|
requiredOneOf?: string[];
|
|
25
|
+
allowed?: ((value: any) => string[] | undefined);
|
|
26
|
+
extensionsPrefix?: string;
|
|
25
27
|
};
|
|
26
28
|
declare type PropType = string | NodeType | ScalarSchema | undefined | null;
|
|
27
29
|
declare type ResolveTypeFn = (value: any, key: string) => string | PropType;
|
|
@@ -32,6 +34,8 @@ export declare type NormalizedNodeType = {
|
|
|
32
34
|
items?: NormalizedNodeType;
|
|
33
35
|
required?: string[] | ((value: any, key: string | number | undefined) => string[]);
|
|
34
36
|
requiredOneOf?: string[];
|
|
37
|
+
allowed?: ((value: any) => string[] | undefined);
|
|
38
|
+
extensionsPrefix?: string;
|
|
35
39
|
};
|
|
36
40
|
declare type NormalizedPropType = NormalizedNodeType | NormalizedScalarSchema | undefined | null;
|
|
37
41
|
declare type NormalizedResolveTypeFn = (value: any, key: string) => NormalizedNodeType | NormalizedScalarSchema | undefined | null;
|