@openlint/ruleset-spectral-oas 0.0.0-stage → 0.1.0
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/LICENSE +191 -0
- package/README.md +11 -2
- package/dist/index.d.ts +3 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/oas/functions/index.d.ts +15 -0
- package/dist/oas/functions/index.js +33 -0
- package/dist/oas/functions/index.js.map +1 -0
- package/dist/oas/functions/oasDiscriminator.d.ts +6 -0
- package/dist/oas/functions/oasDiscriminator.js +39 -0
- package/dist/oas/functions/oasDiscriminator.js.map +1 -0
- package/dist/oas/functions/oasDocumentSchema.d.ts +2 -0
- package/dist/oas/functions/oasDocumentSchema.js +104 -0
- package/dist/oas/functions/oasDocumentSchema.js.map +1 -0
- package/dist/oas/functions/oasExample.d.ts +7 -0
- package/dist/oas/functions/oasExample.js +217 -0
- package/dist/oas/functions/oasExample.js.map +1 -0
- package/dist/oas/functions/oasOpFormDataConsumeCheck.d.ts +6 -0
- package/dist/oas/functions/oasOpFormDataConsumeCheck.js +30 -0
- package/dist/oas/functions/oasOpFormDataConsumeCheck.js.map +1 -0
- package/dist/oas/functions/oasOpIdUnique.d.ts +2 -0
- package/dist/oas/functions/oasOpIdUnique.js +35 -0
- package/dist/oas/functions/oasOpIdUnique.js.map +1 -0
- package/dist/oas/functions/oasOpParams.d.ts +2 -0
- package/dist/oas/functions/oasOpParams.js +75 -0
- package/dist/oas/functions/oasOpParams.js.map +1 -0
- package/dist/oas/functions/oasOpSuccessResponse.d.ts +2 -0
- package/dist/oas/functions/oasOpSuccessResponse.js +27 -0
- package/dist/oas/functions/oasOpSuccessResponse.js.map +1 -0
- package/dist/oas/functions/oasPathParam.d.ts +2 -0
- package/dist/oas/functions/oasPathParam.js +135 -0
- package/dist/oas/functions/oasPathParam.js.map +1 -0
- package/dist/oas/functions/oasSchema.d.ts +5 -0
- package/dist/oas/functions/oasSchema.js +81 -0
- package/dist/oas/functions/oasSchema.js.map +1 -0
- package/dist/oas/functions/oasSecurityDefined.d.ts +5 -0
- package/dist/oas/functions/oasSecurityDefined.js +76 -0
- package/dist/oas/functions/oasSecurityDefined.js.map +1 -0
- package/dist/oas/functions/oasTagDefined.d.ts +2 -0
- package/dist/oas/functions/oasTagDefined.js +42 -0
- package/dist/oas/functions/oasTagDefined.js.map +1 -0
- package/dist/oas/functions/oasUnusedComponent.d.ts +4 -0
- package/dist/oas/functions/oasUnusedComponent.js +40 -0
- package/dist/oas/functions/oasUnusedComponent.js.map +1 -0
- package/dist/oas/functions/refSiblings.d.ts +2 -0
- package/dist/oas/functions/refSiblings.js +42 -0
- package/dist/oas/functions/refSiblings.js.map +1 -0
- package/dist/oas/functions/typedEnum.d.ts +7 -0
- package/dist/oas/functions/typedEnum.js +76 -0
- package/dist/oas/functions/typedEnum.js.map +1 -0
- package/dist/oas/functions/utils/getAllOperations.d.ts +7 -0
- package/dist/oas/functions/utils/getAllOperations.js +31 -0
- package/dist/oas/functions/utils/getAllOperations.js.map +1 -0
- package/dist/oas/functions/utils/isObject.d.ts +2 -0
- package/dist/oas/functions/utils/isObject.js +7 -0
- package/dist/oas/functions/utils/isObject.js.map +1 -0
- package/dist/oas/index.d.ts +733 -0
- package/dist/oas/index.js +765 -0
- package/dist/oas/index.js.map +1 -0
- package/dist/oas/schemas/__fixtures__/validate.d.ts +1 -0
- package/dist/oas/schemas/__fixtures__/validate.js +3 -0
- package/dist/oas/schemas/__fixtures__/validate.js.map +1 -0
- package/dist/oas/schemas/json-schema/draft-04.json +137 -0
- package/dist/oas/schemas/json-schema/draft-2020-12/index.json +54 -0
- package/dist/oas/schemas/json-schema/draft-2020-12/validation.json +101 -0
- package/dist/oas/schemas/oas/v2.0.json +1478 -0
- package/dist/oas/schemas/oas/v3.0.json +1652 -0
- package/dist/oas/schemas/oas/v3.1/dialect.schema.json +35 -0
- package/dist/oas/schemas/oas/v3.1/index.json +1276 -0
- package/dist/oas/schemas/oas/v3.1/meta.schema.json +93 -0
- package/dist/oas/schemas/oas/v3.2/dialect.schema.json +25 -0
- package/dist/oas/schemas/oas/v3.2/index.json +1527 -0
- package/dist/oas/schemas/oas/v3.2/meta.schema.json +103 -0
- package/dist/oas/schemas/validators.d.ts +66 -0
- package/dist/oas/schemas/validators.js +12991 -0
- package/dist/oas/schemas/validators.js.map +1 -0
- package/dist/shared/functions/index.d.ts +2 -0
- package/dist/shared/functions/index.js +7 -0
- package/dist/shared/functions/index.js.map +1 -0
- package/dist/shared/functions/serverVariables/index.d.ts +16 -0
- package/dist/shared/functions/serverVariables/index.js +154 -0
- package/dist/shared/functions/serverVariables/index.js.map +1 -0
- package/dist/shared/functions/serverVariables/utils/applyUrlVariables.d.ts +3 -0
- package/dist/shared/functions/serverVariables/utils/applyUrlVariables.js +32 -0
- package/dist/shared/functions/serverVariables/utils/applyUrlVariables.js.map +1 -0
- package/dist/shared/functions/serverVariables/utils/parseUrlVariables.d.ts +1 -0
- package/dist/shared/functions/serverVariables/utils/parseUrlVariables.js +12 -0
- package/dist/shared/functions/serverVariables/utils/parseUrlVariables.js.map +1 -0
- package/dist/shared/functions/uniquenessTags.d.ts +5 -0
- package/dist/shared/functions/uniquenessTags.js +42 -0
- package/dist/shared/functions/uniquenessTags.js.map +1 -0
- package/dist/shared/utils/getMissingProps.d.ts +1 -0
- package/dist/shared/utils/getMissingProps.js +9 -0
- package/dist/shared/utils/getMissingProps.js.map +1 -0
- package/dist/shared/utils/getRedundantProps.d.ts +1 -0
- package/dist/shared/utils/getRedundantProps.js +9 -0
- package/dist/shared/utils/getRedundantProps.js.map +1 -0
- package/package.json +47 -4
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const isObject_1 = require("./utils/isObject");
|
|
5
|
+
const oasSchema_1 = tslib_1.__importDefault(require("./oasSchema"));
|
|
6
|
+
const openlint_core_1 = require("@openlint/openlint-core");
|
|
7
|
+
const openlint_formats_1 = require("@openlint/openlint-formats");
|
|
8
|
+
const json_schema_traverse_1 = tslib_1.__importDefault(require("json-schema-traverse"));
|
|
9
|
+
const MEDIA_VALIDATION_ITEMS = {
|
|
10
|
+
2: [
|
|
11
|
+
{
|
|
12
|
+
field: 'examples',
|
|
13
|
+
multiple: true,
|
|
14
|
+
keyed: false,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
3: [
|
|
18
|
+
{
|
|
19
|
+
field: 'example',
|
|
20
|
+
multiple: false,
|
|
21
|
+
keyed: false,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
field: 'examples',
|
|
25
|
+
multiple: true,
|
|
26
|
+
keyed: true,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
const REQUEST_MEDIA_PATHS = {
|
|
31
|
+
2: [],
|
|
32
|
+
3: [
|
|
33
|
+
['components', 'requestBodies'],
|
|
34
|
+
['paths', '*', '*', 'requestBody'],
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
const RESPONSE_MEDIA_PATHS = {
|
|
38
|
+
2: [['responses'], ['paths', '*', '*', 'responses']],
|
|
39
|
+
3: [
|
|
40
|
+
['components', 'responses'],
|
|
41
|
+
['paths', '*', '*', 'responses'],
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
const SCHEMA_VALIDATION_ITEMS = {
|
|
45
|
+
2: ['example', 'x-example', 'default'],
|
|
46
|
+
3: ['example', 'default'],
|
|
47
|
+
};
|
|
48
|
+
function hasRequiredProperties(schema) {
|
|
49
|
+
return schema.required === undefined || Array.isArray(schema.required);
|
|
50
|
+
}
|
|
51
|
+
function isSubpath(path, subPaths) {
|
|
52
|
+
return subPaths.some(subPath => subPath.every((segment, idx) => segment === '*' || segment === path[idx]));
|
|
53
|
+
}
|
|
54
|
+
function isMediaRequest(path, oasVersion) {
|
|
55
|
+
return isSubpath(path, REQUEST_MEDIA_PATHS[oasVersion]);
|
|
56
|
+
}
|
|
57
|
+
function isMediaResponse(path, oasVersion) {
|
|
58
|
+
return isSubpath(path, RESPONSE_MEDIA_PATHS[oasVersion]);
|
|
59
|
+
}
|
|
60
|
+
function* getMediaValidationItems(items, targetVal, givenPath, oasVersion) {
|
|
61
|
+
for (const { field, keyed, multiple } of items) {
|
|
62
|
+
if (!(field in targetVal)) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const value = targetVal[field];
|
|
66
|
+
if (multiple) {
|
|
67
|
+
if (!(0, isObject_1.isObject)(value))
|
|
68
|
+
continue;
|
|
69
|
+
for (const exampleKey of Object.keys(value)) {
|
|
70
|
+
const exampleValue = value[exampleKey];
|
|
71
|
+
if (oasVersion === 3 && keyed && (!(0, isObject_1.isObject)(exampleValue) || 'externalValue' in exampleValue)) {
|
|
72
|
+
// should be covered by oas3-examples-value-or-externalValue
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const targetPath = [...givenPath, field, exampleKey];
|
|
76
|
+
if (keyed) {
|
|
77
|
+
targetPath.push('value');
|
|
78
|
+
}
|
|
79
|
+
yield {
|
|
80
|
+
value: keyed && (0, isObject_1.isObject)(exampleValue) ? exampleValue.value : exampleValue,
|
|
81
|
+
path: targetPath,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
yield {
|
|
88
|
+
value,
|
|
89
|
+
path: [...givenPath, field],
|
|
90
|
+
};
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function* getSchemaValidationItems(fields, targetVal, givenPath) {
|
|
96
|
+
for (const field of fields) {
|
|
97
|
+
if (!(field in targetVal)) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
yield {
|
|
101
|
+
value: targetVal[field],
|
|
102
|
+
path: [...givenPath, field],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// json-schema-traverse exposes these keyword maps at runtime, but its typings omit them
|
|
107
|
+
const { keywords, arrayKeywords, propsKeywords } = json_schema_traverse_1.default;
|
|
108
|
+
const KNOWN_TRAVERSE_KEYWORDS = [
|
|
109
|
+
...Object.keys(keywords),
|
|
110
|
+
...Object.keys(arrayKeywords),
|
|
111
|
+
...Object.keys(propsKeywords),
|
|
112
|
+
];
|
|
113
|
+
/**
|
|
114
|
+
* Modifies 'schema' (and all its sub-schemas) to remove all id fields from non-schema objects
|
|
115
|
+
* In this context, "sub-schemas" refers to all schemas reachable from 'schema'
|
|
116
|
+
* (e.g. properties, additionalProperties, allOf/anyOf/oneOf, not, items, etc.)
|
|
117
|
+
* @param schema the schema to be sanitized
|
|
118
|
+
* @returns 'schema' with id fields removed
|
|
119
|
+
*/
|
|
120
|
+
function cleanSchema(schema) {
|
|
121
|
+
(0, json_schema_traverse_1.default)(schema, { allKeys: true }, ((fragment, jsonPtr, rootSchema, parentJsonPtr, parentKeyword) => {
|
|
122
|
+
if (parentKeyword === void 0 || KNOWN_TRAVERSE_KEYWORDS.includes(parentKeyword))
|
|
123
|
+
return;
|
|
124
|
+
if ('id' in fragment) {
|
|
125
|
+
delete fragment.id;
|
|
126
|
+
}
|
|
127
|
+
if ('$id' in fragment) {
|
|
128
|
+
delete fragment.id;
|
|
129
|
+
}
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Modifies 'schema' (and all its sub-schemas) to make all
|
|
134
|
+
* readOnly or writeOnly properties optional.
|
|
135
|
+
* In this context, "sub-schemas" refers to all schemas reachable from 'schema'
|
|
136
|
+
* (e.g. properties, additionalProperties, allOf/anyOf/oneOf, not, items, etc.),
|
|
137
|
+
* except sub-schemas nested under an odd number of "not" keywords
|
|
138
|
+
* @param schema the schema to be modified
|
|
139
|
+
* @param readOnlyProperties make readOnly properties optional
|
|
140
|
+
* @param writeOnlyProperties make writeOnly properties optional
|
|
141
|
+
*/
|
|
142
|
+
function relaxRequired(schema, readOnlyProperties, writeOnlyProperties) {
|
|
143
|
+
if (readOnlyProperties || writeOnlyProperties) {
|
|
144
|
+
const negated = new Map();
|
|
145
|
+
(0, json_schema_traverse_1.default)(schema, {}, ((fragment, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parent, propertyName) => {
|
|
146
|
+
var _a, _b;
|
|
147
|
+
// "not" schemas are negative constraints: relaxing their "required" would
|
|
148
|
+
// make them match (and therefore reject) documents they should not match.
|
|
149
|
+
// Each "not" flips the polarity, so "not: { not: ... }" is a positive constraint again.
|
|
150
|
+
// parentKeyword is "not" only for the keyword itself, not for a property named "not".
|
|
151
|
+
const isNegated = (parentJsonPtr !== void 0 && negated.get(parentJsonPtr) === true) !== (parentKeyword === 'not');
|
|
152
|
+
negated.set(jsonPtr, isNegated);
|
|
153
|
+
if (isNegated)
|
|
154
|
+
return;
|
|
155
|
+
if ((fragment.readOnly === true && readOnlyProperties) || (fragment.writeOnly === true && writeOnlyProperties)) {
|
|
156
|
+
if (parentKeyword == 'properties' && parent && hasRequiredProperties(parent)) {
|
|
157
|
+
parent.required = (_a = parent.required) === null || _a === void 0 ? void 0 : _a.filter(p => p !== propertyName);
|
|
158
|
+
if (((_b = parent.required) === null || _b === void 0 ? void 0 : _b.length) === 0) {
|
|
159
|
+
delete parent.required;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.default = (0, openlint_core_1.createRulesetFunction)({
|
|
167
|
+
input: {
|
|
168
|
+
type: 'object',
|
|
169
|
+
},
|
|
170
|
+
options: {
|
|
171
|
+
type: 'object',
|
|
172
|
+
properties: {
|
|
173
|
+
oasVersion: {
|
|
174
|
+
enum: [2, 3],
|
|
175
|
+
},
|
|
176
|
+
schemaField: {
|
|
177
|
+
type: 'string',
|
|
178
|
+
},
|
|
179
|
+
type: {
|
|
180
|
+
enum: ['media', 'schema'],
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
additionalProperties: false,
|
|
184
|
+
},
|
|
185
|
+
}, function oasExample(targetVal, opts, context) {
|
|
186
|
+
const formats = context.document.formats;
|
|
187
|
+
const schemaOpts = {
|
|
188
|
+
schema: opts.schemaField === '$' ? targetVal : targetVal[opts.schemaField],
|
|
189
|
+
};
|
|
190
|
+
let results = void 0;
|
|
191
|
+
const validationItems = opts.type === 'schema'
|
|
192
|
+
? getSchemaValidationItems(SCHEMA_VALIDATION_ITEMS[opts.oasVersion], targetVal, context.path)
|
|
193
|
+
: getMediaValidationItems(MEDIA_VALIDATION_ITEMS[opts.oasVersion], targetVal, context.path, opts.oasVersion);
|
|
194
|
+
if ((formats === null || formats === void 0 ? void 0 : formats.has(openlint_formats_1.oas2)) && 'required' in schemaOpts.schema && typeof schemaOpts.schema.required === 'boolean') {
|
|
195
|
+
schemaOpts.schema = { ...schemaOpts.schema };
|
|
196
|
+
delete schemaOpts.schema.required;
|
|
197
|
+
}
|
|
198
|
+
// Make a deep copy of the schema and then remove all objects containing id or $id and that are not schema objects.
|
|
199
|
+
// This is to avoid problems down in "ajv" which does the actual schema validation.
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
201
|
+
schemaOpts.schema = JSON.parse(JSON.stringify(schemaOpts.schema));
|
|
202
|
+
cleanSchema(schemaOpts.schema);
|
|
203
|
+
relaxRequired(schemaOpts.schema, opts.type === 'media' && isMediaRequest(context.path, opts.oasVersion), opts.type === 'media' && isMediaResponse(context.path, opts.oasVersion));
|
|
204
|
+
for (const validationItem of validationItems) {
|
|
205
|
+
const result = (0, oasSchema_1.default)(validationItem.value, schemaOpts, {
|
|
206
|
+
...context,
|
|
207
|
+
path: validationItem.path,
|
|
208
|
+
});
|
|
209
|
+
if (Array.isArray(result)) {
|
|
210
|
+
if (results === void 0)
|
|
211
|
+
results = [];
|
|
212
|
+
results.push(...result);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return results;
|
|
216
|
+
});
|
|
217
|
+
//# sourceMappingURL=oasExample.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oasExample.js","sourceRoot":"","sources":["../../../src/oas/functions/oasExample.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const openlint_core_1 = require("@openlint/openlint-core");
|
|
4
|
+
const isObject_1 = require("./utils/isObject");
|
|
5
|
+
const validConsumeValue = /(application\/x-www-form-urlencoded|multipart\/form-data)/;
|
|
6
|
+
exports.default = (0, openlint_core_1.createRulesetFunction)({
|
|
7
|
+
input: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
consumes: {
|
|
11
|
+
type: 'array',
|
|
12
|
+
},
|
|
13
|
+
parameters: {
|
|
14
|
+
type: 'array',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
required: ['consumes', 'parameters'],
|
|
18
|
+
},
|
|
19
|
+
options: null,
|
|
20
|
+
}, function oasOpFormDataConsumeCheck({ parameters, consumes }) {
|
|
21
|
+
if (parameters.some(p => (0, isObject_1.isObject)(p) && p.in === 'formData') && !validConsumeValue.test(consumes === null || consumes === void 0 ? void 0 : consumes.join(','))) {
|
|
22
|
+
return [
|
|
23
|
+
{
|
|
24
|
+
message: 'Consumes must include urlencoded, multipart, or form-data media type when using formData parameter.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=oasOpFormDataConsumeCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oasOpFormDataConsumeCheck.js","sourceRoot":"","sources":["../../../src/oas/functions/oasOpFormDataConsumeCheck.ts"],"names":[],"mappings":";;AAAA,2DAAgE;AAChE,+CAA4C;AAE5C,MAAM,iBAAiB,GAAG,2DAA2D,CAAC;AAOtF,kBAAe,IAAA,qCAAqB,EAClC;IACE,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;aACd;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,OAAO;aACd;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC;KACrC;IACD,OAAO,EAAE,IAAI;CACd,EACD,SAAS,yBAAyB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;IACzD,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,mBAAQ,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7G,OAAO;YACL;gBACE,OAAO,EACL,qGAAqG;aACxG;SACF,CAAC;IACJ,CAAC;IAED,OAAO;AACT,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const openlint_core_1 = require("@openlint/openlint-core");
|
|
4
|
+
const getAllOperations_1 = require("./utils/getAllOperations");
|
|
5
|
+
const isObject_1 = require("./utils/isObject");
|
|
6
|
+
exports.default = (0, openlint_core_1.createRulesetFunction)({
|
|
7
|
+
input: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
},
|
|
10
|
+
options: null,
|
|
11
|
+
}, function oasOpIdUnique(paths) {
|
|
12
|
+
const results = [];
|
|
13
|
+
const seenIds = [];
|
|
14
|
+
for (const { path, operation } of (0, getAllOperations_1.getAllOperations)(paths)) {
|
|
15
|
+
const pathValue = paths[path];
|
|
16
|
+
if (!(0, isObject_1.isObject)(pathValue))
|
|
17
|
+
continue;
|
|
18
|
+
const operationValue = pathValue[operation];
|
|
19
|
+
if (!(0, isObject_1.isObject)(operationValue) || !('operationId' in operationValue)) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const { operationId } = operationValue;
|
|
23
|
+
if (seenIds.includes(operationId)) {
|
|
24
|
+
results.push({
|
|
25
|
+
message: 'operationId must be unique.',
|
|
26
|
+
path: ['paths', path, operation, 'operationId'],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
seenIds.push(operationId);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return results;
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=oasOpIdUnique.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oasOpIdUnique.js","sourceRoot":"","sources":["../../../src/oas/functions/oasOpIdUnique.ts"],"names":[],"mappings":";;AACA,2DAAgE;AAChE,+DAA4D;AAC5D,+CAA4C;AAE5C,kBAAe,IAAA,qCAAqB,EAClC;IACE,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;KACf;IACD,OAAO,EAAE,IAAI;CACd,EACD,SAAS,aAAa,CAAC,KAAK;IAC1B,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAc,EAAE,CAAC;IAE9B,KAAK,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAA,mCAAgB,EAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,IAAA,mBAAQ,EAAC,SAAS,CAAC;YAAE,SAAS;QAEnC,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAA,mBAAQ,EAAC,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,cAAc,CAAC,EAAE,CAAC;YACpE,SAAS;QACX,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;QAEvC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,6BAA6B;gBACtC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const isObject_1 = require("./utils/isObject");
|
|
4
|
+
const openlint_core_1 = require("@openlint/openlint-core");
|
|
5
|
+
function computeFingerprint(param) {
|
|
6
|
+
return `${String(param.in)}-${String(param.name)}`;
|
|
7
|
+
}
|
|
8
|
+
exports.default = (0, openlint_core_1.createRulesetFunction)({
|
|
9
|
+
input: {
|
|
10
|
+
type: 'array',
|
|
11
|
+
},
|
|
12
|
+
options: null,
|
|
13
|
+
}, function oasOpParams(params, _opts, { path }) {
|
|
14
|
+
/**
|
|
15
|
+
* This function verifies:
|
|
16
|
+
*
|
|
17
|
+
* 1. Operations must have unique `name` + `in` parameters.
|
|
18
|
+
* 2. Operation cannot have both `in:body` and `in:formData` parameters
|
|
19
|
+
* 3. Operation must have only one `in:body` parameter.
|
|
20
|
+
*/
|
|
21
|
+
if (!Array.isArray(params))
|
|
22
|
+
return;
|
|
23
|
+
if (params.length < 2)
|
|
24
|
+
return;
|
|
25
|
+
const results = [];
|
|
26
|
+
const count = {
|
|
27
|
+
body: [],
|
|
28
|
+
formData: [],
|
|
29
|
+
};
|
|
30
|
+
const list = [];
|
|
31
|
+
const duplicates = [];
|
|
32
|
+
let index = -1;
|
|
33
|
+
for (const param of params) {
|
|
34
|
+
index++;
|
|
35
|
+
if (!(0, isObject_1.isObject)(param))
|
|
36
|
+
continue;
|
|
37
|
+
// skip params that are refs
|
|
38
|
+
if ('$ref' in param)
|
|
39
|
+
continue;
|
|
40
|
+
// Operations must have unique `name` + `in` parameters.
|
|
41
|
+
const fingerprint = computeFingerprint(param);
|
|
42
|
+
if (list.includes(fingerprint)) {
|
|
43
|
+
duplicates.push(index);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
list.push(fingerprint);
|
|
47
|
+
}
|
|
48
|
+
if (typeof param.in === 'string' && param.in in count) {
|
|
49
|
+
count[param.in].push(index);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (duplicates.length > 0) {
|
|
53
|
+
for (const i of duplicates) {
|
|
54
|
+
results.push({
|
|
55
|
+
message: 'A parameter in this operation already exposes the same combination of "name" and "in" values.',
|
|
56
|
+
path: [...path, i],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (count.body.length > 0 && count.formData.length > 0) {
|
|
61
|
+
results.push({
|
|
62
|
+
message: 'Operation must not have both "in:body" and "in:formData" parameters.',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (count.body.length > 1) {
|
|
66
|
+
for (let i = 1; i < count.body.length; i++) {
|
|
67
|
+
results.push({
|
|
68
|
+
message: 'Operation must not have more than a single instance of the "in:body" parameter.',
|
|
69
|
+
path: [...path, count.body[i]],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=oasOpParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oasOpParams.js","sourceRoot":"","sources":["../../../src/oas/functions/oasOpParams.ts"],"names":[],"mappings":";;AACA,+CAA4C;AAC5C,2DAAgE;AAEhE,SAAS,kBAAkB,CAAC,KAA8B;IACxD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,kBAAe,IAAA,qCAAqB,EAClC;IACE,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;KACd;IACD,OAAO,EAAE,IAAI;CACd,EACD,SAAS,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE;IAC1C;;;;;;OAMG;IAEH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO;IAEnC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO;IAE9B,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,MAAM,KAAK,GAA6B;QACtC,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;KACb,CAAC;IACF,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,IAAA,mBAAQ,EAAC,KAAK,CAAC;YAAE,SAAS;QAE/B,4BAA4B;QAC5B,IAAI,MAAM,IAAI,KAAK;YAAE,SAAS;QAE9B,wDAAwD;QACxD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;YACtD,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,+FAA+F;gBACxG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,sEAAsE;SAChF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,iFAAiF;gBAC1F,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const openlint_core_1 = require("@openlint/openlint-core");
|
|
4
|
+
const openlint_formats_1 = require("@openlint/openlint-formats");
|
|
5
|
+
exports.default = (0, openlint_core_1.createRulesetFunction)({
|
|
6
|
+
input: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
},
|
|
9
|
+
options: null,
|
|
10
|
+
}, function oasOpSuccessResponse(input, opts, context) {
|
|
11
|
+
var _a;
|
|
12
|
+
const isOAS3X = ((_a = context.document.formats) === null || _a === void 0 ? void 0 : _a.has(openlint_formats_1.oas3)) === true;
|
|
13
|
+
for (const response of Object.keys(input)) {
|
|
14
|
+
if (isOAS3X && (response === '2XX' || response === '3XX')) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (Number(response) >= 200 && Number(response) < 400) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return [
|
|
22
|
+
{
|
|
23
|
+
message: 'Operation must define at least a single 2xx or 3xx response',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=oasOpSuccessResponse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oasOpSuccessResponse.js","sourceRoot":"","sources":["../../../src/oas/functions/oasOpSuccessResponse.ts"],"names":[],"mappings":";;AAAA,2DAAgE;AAChE,iEAAkD;AAElD,kBAAe,IAAA,qCAAqB,EAClC;IACE,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;KACf;IACD,OAAO,EAAE,IAAI;CACd,EACD,SAAS,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO;;IAChD,MAAM,OAAO,GAAG,CAAA,MAAA,OAAO,CAAC,QAAQ,CAAC,OAAO,0CAAE,GAAG,CAAC,uBAAI,CAAC,MAAK,IAAI,CAAC;IAE7D,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;IACH,CAAC;IAED,OAAO;QACL;YACE,OAAO,EAAE,6DAA6D;SACvE;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const isObject_1 = require("./utils/isObject");
|
|
4
|
+
const openlint_core_1 = require("@openlint/openlint-core");
|
|
5
|
+
const pathRegex = /(\{;?\??[a-zA-Z0-9_-]+\*?\})/g;
|
|
6
|
+
const isNamedPathParam = (p) => {
|
|
7
|
+
return p.in !== void 0 && p.in === 'path' && p.name !== void 0;
|
|
8
|
+
};
|
|
9
|
+
const isUnknownNamedPathParam = (p, path, results, seen) => {
|
|
10
|
+
if (!isNamedPathParam(p)) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (p.required !== true) {
|
|
14
|
+
results.push(generateResult(requiredMessage(p.name), path));
|
|
15
|
+
}
|
|
16
|
+
if (p.name in seen) {
|
|
17
|
+
results.push(generateResult(uniqueDefinitionMessage(p.name), path));
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
};
|
|
22
|
+
const ensureAllDefinedPathParamsAreUsedInPath = (path, params, expected, results) => {
|
|
23
|
+
for (const p of Object.keys(params)) {
|
|
24
|
+
if (!params[p]) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (!expected.includes(p)) {
|
|
28
|
+
const resPath = params[p];
|
|
29
|
+
results.push(generateResult(`Parameter "${p}" must be used in path "${path}".`, resPath));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const ensureAllExpectedParamsInPathAreDefined = (path, params, expected, operationPath, results) => {
|
|
34
|
+
for (const p of expected) {
|
|
35
|
+
if (!(p in params)) {
|
|
36
|
+
results.push(generateResult(`Operation must define parameter "{${p}}" as expected by path "${path}".`, operationPath));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
exports.default = (0, openlint_core_1.createRulesetFunction)({
|
|
41
|
+
input: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
},
|
|
44
|
+
options: null,
|
|
45
|
+
}, function oasPathParam(paths) {
|
|
46
|
+
/**
|
|
47
|
+
* This rule verifies:
|
|
48
|
+
*
|
|
49
|
+
* 1. for every param referenced in the path string ie /users/{userId}, var must be defined in either
|
|
50
|
+
* path.parameters, or operation.parameters object
|
|
51
|
+
* 2. every path.parameters + operation.parameters property must be used in the path string
|
|
52
|
+
*/
|
|
53
|
+
const results = [];
|
|
54
|
+
// keep track of normalized paths for verifying paths are unique
|
|
55
|
+
const uniquePaths = {};
|
|
56
|
+
const validOperationKeys = ['get', 'head', 'post', 'put', 'patch', 'delete', 'options', 'trace'];
|
|
57
|
+
for (const path of Object.keys(paths)) {
|
|
58
|
+
const pathValue = paths[path];
|
|
59
|
+
if (!(0, isObject_1.isObject)(pathValue))
|
|
60
|
+
continue;
|
|
61
|
+
// verify normalized paths are functionally unique (ie `/path/{one}` vs `/path/{two}` are
|
|
62
|
+
// different but equivalent within the context of OAS)
|
|
63
|
+
const normalized = path.replace(pathRegex, '%'); // '%' is used here since its invalid in paths
|
|
64
|
+
if (normalized in uniquePaths) {
|
|
65
|
+
results.push(generateResult(`Paths "${String(uniquePaths[normalized])}" and "${path}" must not be equivalent.`, [
|
|
66
|
+
'paths',
|
|
67
|
+
path,
|
|
68
|
+
]));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
uniquePaths[normalized] = path;
|
|
72
|
+
}
|
|
73
|
+
// find all templated path parameters
|
|
74
|
+
const pathElements = [];
|
|
75
|
+
let match;
|
|
76
|
+
while ((match = pathRegex.exec(path))) {
|
|
77
|
+
const p = match[0].replace(/[{}?*;]/g, '');
|
|
78
|
+
if (pathElements.includes(p)) {
|
|
79
|
+
results.push(generateResult(`Path "${path}" must not use parameter "{${p}}" multiple times.`, ['paths', path]));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
pathElements.push(p);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// find parameters set within the top-level 'parameters' object
|
|
86
|
+
const topParams = {};
|
|
87
|
+
if (Array.isArray(pathValue.parameters)) {
|
|
88
|
+
for (const [i, value] of pathValue.parameters.entries()) {
|
|
89
|
+
if (!(0, isObject_1.isObject)(value))
|
|
90
|
+
continue;
|
|
91
|
+
const fullParameterPath = ['paths', path, 'parameters', i];
|
|
92
|
+
if (isUnknownNamedPathParam(value, fullParameterPath, results, topParams)) {
|
|
93
|
+
topParams[value.name] = fullParameterPath;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if ((0, isObject_1.isObject)(paths[path])) {
|
|
98
|
+
// find parameters set within the operation's 'parameters' object
|
|
99
|
+
for (const op of Object.keys(pathValue)) {
|
|
100
|
+
const operationValue = pathValue[op];
|
|
101
|
+
if (!(0, isObject_1.isObject)(operationValue))
|
|
102
|
+
continue;
|
|
103
|
+
if (op === 'parameters' || !validOperationKeys.includes(op)) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const operationParams = {};
|
|
107
|
+
const { parameters } = operationValue;
|
|
108
|
+
const operationPath = ['paths', path, op];
|
|
109
|
+
if (Array.isArray(parameters)) {
|
|
110
|
+
for (const [i, p] of parameters.entries()) {
|
|
111
|
+
if (!(0, isObject_1.isObject)(p))
|
|
112
|
+
continue;
|
|
113
|
+
const fullParameterPath = [...operationPath, 'parameters', i];
|
|
114
|
+
if (isUnknownNamedPathParam(p, fullParameterPath, results, operationParams)) {
|
|
115
|
+
operationParams[p.name] = fullParameterPath;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const definedParams = { ...topParams, ...operationParams };
|
|
120
|
+
ensureAllDefinedPathParamsAreUsedInPath(path, definedParams, pathElements, results);
|
|
121
|
+
ensureAllExpectedParamsInPathAreDefined(path, definedParams, pathElements, operationPath, results);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return results;
|
|
126
|
+
});
|
|
127
|
+
function generateResult(message, path) {
|
|
128
|
+
return {
|
|
129
|
+
message,
|
|
130
|
+
path,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const requiredMessage = (name) => `Path parameter "${name}" must have "required" property that is set to "true".`;
|
|
134
|
+
const uniqueDefinitionMessage = (name) => `Path parameter "${name}" must not be defined multiple times.`;
|
|
135
|
+
//# sourceMappingURL=oasPathParam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oasPathParam.js","sourceRoot":"","sources":["../../../src/oas/functions/oasPathParam.ts"],"names":[],"mappings":"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"}
|