@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.
Files changed (98) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +11 -2
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.js +8 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/oas/functions/index.d.ts +15 -0
  7. package/dist/oas/functions/index.js +33 -0
  8. package/dist/oas/functions/index.js.map +1 -0
  9. package/dist/oas/functions/oasDiscriminator.d.ts +6 -0
  10. package/dist/oas/functions/oasDiscriminator.js +39 -0
  11. package/dist/oas/functions/oasDiscriminator.js.map +1 -0
  12. package/dist/oas/functions/oasDocumentSchema.d.ts +2 -0
  13. package/dist/oas/functions/oasDocumentSchema.js +104 -0
  14. package/dist/oas/functions/oasDocumentSchema.js.map +1 -0
  15. package/dist/oas/functions/oasExample.d.ts +7 -0
  16. package/dist/oas/functions/oasExample.js +217 -0
  17. package/dist/oas/functions/oasExample.js.map +1 -0
  18. package/dist/oas/functions/oasOpFormDataConsumeCheck.d.ts +6 -0
  19. package/dist/oas/functions/oasOpFormDataConsumeCheck.js +30 -0
  20. package/dist/oas/functions/oasOpFormDataConsumeCheck.js.map +1 -0
  21. package/dist/oas/functions/oasOpIdUnique.d.ts +2 -0
  22. package/dist/oas/functions/oasOpIdUnique.js +35 -0
  23. package/dist/oas/functions/oasOpIdUnique.js.map +1 -0
  24. package/dist/oas/functions/oasOpParams.d.ts +2 -0
  25. package/dist/oas/functions/oasOpParams.js +75 -0
  26. package/dist/oas/functions/oasOpParams.js.map +1 -0
  27. package/dist/oas/functions/oasOpSuccessResponse.d.ts +2 -0
  28. package/dist/oas/functions/oasOpSuccessResponse.js +27 -0
  29. package/dist/oas/functions/oasOpSuccessResponse.js.map +1 -0
  30. package/dist/oas/functions/oasPathParam.d.ts +2 -0
  31. package/dist/oas/functions/oasPathParam.js +135 -0
  32. package/dist/oas/functions/oasPathParam.js.map +1 -0
  33. package/dist/oas/functions/oasSchema.d.ts +5 -0
  34. package/dist/oas/functions/oasSchema.js +81 -0
  35. package/dist/oas/functions/oasSchema.js.map +1 -0
  36. package/dist/oas/functions/oasSecurityDefined.d.ts +5 -0
  37. package/dist/oas/functions/oasSecurityDefined.js +76 -0
  38. package/dist/oas/functions/oasSecurityDefined.js.map +1 -0
  39. package/dist/oas/functions/oasTagDefined.d.ts +2 -0
  40. package/dist/oas/functions/oasTagDefined.js +42 -0
  41. package/dist/oas/functions/oasTagDefined.js.map +1 -0
  42. package/dist/oas/functions/oasUnusedComponent.d.ts +4 -0
  43. package/dist/oas/functions/oasUnusedComponent.js +40 -0
  44. package/dist/oas/functions/oasUnusedComponent.js.map +1 -0
  45. package/dist/oas/functions/refSiblings.d.ts +2 -0
  46. package/dist/oas/functions/refSiblings.js +42 -0
  47. package/dist/oas/functions/refSiblings.js.map +1 -0
  48. package/dist/oas/functions/typedEnum.d.ts +7 -0
  49. package/dist/oas/functions/typedEnum.js +76 -0
  50. package/dist/oas/functions/typedEnum.js.map +1 -0
  51. package/dist/oas/functions/utils/getAllOperations.d.ts +7 -0
  52. package/dist/oas/functions/utils/getAllOperations.js +31 -0
  53. package/dist/oas/functions/utils/getAllOperations.js.map +1 -0
  54. package/dist/oas/functions/utils/isObject.d.ts +2 -0
  55. package/dist/oas/functions/utils/isObject.js +7 -0
  56. package/dist/oas/functions/utils/isObject.js.map +1 -0
  57. package/dist/oas/index.d.ts +733 -0
  58. package/dist/oas/index.js +765 -0
  59. package/dist/oas/index.js.map +1 -0
  60. package/dist/oas/schemas/__fixtures__/validate.d.ts +1 -0
  61. package/dist/oas/schemas/__fixtures__/validate.js +3 -0
  62. package/dist/oas/schemas/__fixtures__/validate.js.map +1 -0
  63. package/dist/oas/schemas/json-schema/draft-04.json +137 -0
  64. package/dist/oas/schemas/json-schema/draft-2020-12/index.json +54 -0
  65. package/dist/oas/schemas/json-schema/draft-2020-12/validation.json +101 -0
  66. package/dist/oas/schemas/oas/v2.0.json +1478 -0
  67. package/dist/oas/schemas/oas/v3.0.json +1652 -0
  68. package/dist/oas/schemas/oas/v3.1/dialect.schema.json +35 -0
  69. package/dist/oas/schemas/oas/v3.1/index.json +1276 -0
  70. package/dist/oas/schemas/oas/v3.1/meta.schema.json +93 -0
  71. package/dist/oas/schemas/oas/v3.2/dialect.schema.json +25 -0
  72. package/dist/oas/schemas/oas/v3.2/index.json +1527 -0
  73. package/dist/oas/schemas/oas/v3.2/meta.schema.json +103 -0
  74. package/dist/oas/schemas/validators.d.ts +66 -0
  75. package/dist/oas/schemas/validators.js +12991 -0
  76. package/dist/oas/schemas/validators.js.map +1 -0
  77. package/dist/shared/functions/index.d.ts +2 -0
  78. package/dist/shared/functions/index.js +7 -0
  79. package/dist/shared/functions/index.js.map +1 -0
  80. package/dist/shared/functions/serverVariables/index.d.ts +16 -0
  81. package/dist/shared/functions/serverVariables/index.js +154 -0
  82. package/dist/shared/functions/serverVariables/index.js.map +1 -0
  83. package/dist/shared/functions/serverVariables/utils/applyUrlVariables.d.ts +3 -0
  84. package/dist/shared/functions/serverVariables/utils/applyUrlVariables.js +32 -0
  85. package/dist/shared/functions/serverVariables/utils/applyUrlVariables.js.map +1 -0
  86. package/dist/shared/functions/serverVariables/utils/parseUrlVariables.d.ts +1 -0
  87. package/dist/shared/functions/serverVariables/utils/parseUrlVariables.js +12 -0
  88. package/dist/shared/functions/serverVariables/utils/parseUrlVariables.js.map +1 -0
  89. package/dist/shared/functions/uniquenessTags.d.ts +5 -0
  90. package/dist/shared/functions/uniquenessTags.js +42 -0
  91. package/dist/shared/functions/uniquenessTags.js.map +1 -0
  92. package/dist/shared/utils/getMissingProps.d.ts +1 -0
  93. package/dist/shared/utils/getMissingProps.js +9 -0
  94. package/dist/shared/utils/getMissingProps.js.map +1 -0
  95. package/dist/shared/utils/getRedundantProps.d.ts +1 -0
  96. package/dist/shared/utils/getRedundantProps.js +9 -0
  97. package/dist/shared/utils/getRedundantProps.js.map +1 -0
  98. 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,6 @@
1
+ type Input = {
2
+ consumes: unknown[];
3
+ parameters: unknown[];
4
+ };
5
+ declare const _default: import("@openlint/openlint-core").RulesetFunctionWithValidator<Input, null>;
6
+ export default _default;
@@ -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,2 @@
1
+ declare const _default: import("@openlint/openlint-core").RulesetFunctionWithValidator<Record<string, unknown>, null>;
2
+ export default _default;
@@ -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,2 @@
1
+ declare const _default: import("@openlint/openlint-core").RulesetFunctionWithValidator<unknown[], null>;
2
+ export default _default;
@@ -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,2 @@
1
+ declare const _default: import("@openlint/openlint-core").RulesetFunctionWithValidator<Record<string, unknown>, null>;
2
+ export default _default;
@@ -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,2 @@
1
+ declare const _default: import("@openlint/openlint-core").RulesetFunctionWithValidator<Record<string, unknown>, null>;
2
+ export default _default;
@@ -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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"}
@@ -0,0 +1,5 @@
1
+ export type Options = {
2
+ schema: Record<string, unknown>;
3
+ };
4
+ declare const _default: import("@openlint/openlint-core").RulesetFunctionWithValidator<unknown, Options>;
5
+ export default _default;