@redocly/openapi-core 2.12.3 → 2.12.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"path-params-defined.d.ts","sourceRoot":"","sources":["../../../src/rules/common/path-params-defined.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAO5D,eAAO,MAAM,iBAAiB,EAAE,QAAQ,GAAG,QAyD1C,CAAC"}
1
+ {"version":3,"file":"path-params-defined.d.ts","sourceRoot":"","sources":["../../../src/rules/common/path-params-defined.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAc5D,eAAO,MAAM,iBAAiB,EAAE,QAAQ,GAAG,QAkB1C,CAAC"}
@@ -1,55 +1,125 @@
1
1
  const pathRegex = /\{([a-zA-Z0-9_.-]+)\}+/g;
2
+ const MAX_DEPTH = 2; // Only first callback level is supported
2
3
  export const PathParamsDefined = () => {
3
- let pathTemplateParams;
4
- let definedPathParams;
5
- let currentPath;
6
- let definedOperationParams;
4
+ const pathContext = { current: null };
5
+ const currentOperationParams = new Set();
7
6
  return {
8
7
  PathItem: {
9
8
  enter(_, { key }) {
10
- definedPathParams = new Set();
11
- currentPath = key;
12
- pathTemplateParams = new Set(Array.from(key.toString().matchAll(pathRegex)).map((m) => m[1]));
9
+ pathItemEnter(pathContext, key);
10
+ },
11
+ leave() {
12
+ pathItemLeave(pathContext);
13
+ },
14
+ Parameter(parameter, { report, location }) {
15
+ createPathItemParameterHandler(parameter, pathContext, report, location);
16
+ },
17
+ Operation: createOperationHandlers(pathContext, currentOperationParams),
18
+ },
19
+ };
20
+ };
21
+ const pathItemEnter = (pathContext, key) => {
22
+ pathContext.current = {
23
+ path: key,
24
+ templateParams: extractTemplateParams(key),
25
+ definedParams: new Set(),
26
+ };
27
+ };
28
+ const pathItemLeave = (pathContext) => {
29
+ pathContext.current = null;
30
+ };
31
+ const createPathItemParameterHandler = (parameter, pathContext, report, location) => {
32
+ if (parameter.in === 'path' && parameter.name && pathContext.current) {
33
+ pathContext.current.definedParams.add(parameter.name);
34
+ validatePathParameter(parameter.name, pathContext.current.templateParams, pathContext.current.path, report, location);
35
+ }
36
+ };
37
+ const createOperationHandlers = (pathContext, currentOperationParams, depth = 0) => {
38
+ const reportMaxDepthWarning = (report, location, depth) => {
39
+ report({
40
+ message: `Maximum callback nesting depth (${depth}) reached. Path parameter validation is limited beyond this depth to prevent infinite recursion.`,
41
+ location: location,
42
+ });
43
+ };
44
+ if (depth >= MAX_DEPTH) {
45
+ return {
46
+ enter: () => { },
47
+ leave: (_op, { report, location }) => {
48
+ reportMaxDepthWarning(report, location, depth);
49
+ },
50
+ Parameter: () => { },
51
+ Callback: undefined,
52
+ };
53
+ }
54
+ const createCallbackPathItem = () => {
55
+ let parentPathContext = null;
56
+ return {
57
+ enter(_, { key }) {
58
+ parentPathContext = pathContext.current;
59
+ pathItemEnter(pathContext, key);
60
+ },
61
+ leave() {
62
+ pathContext.current = parentPathContext;
13
63
  },
14
64
  Parameter(parameter, { report, location }) {
15
- if (parameter.in === 'path' && parameter.name) {
16
- definedPathParams.add(parameter.name);
17
- if (!pathTemplateParams.has(parameter.name)) {
18
- report({
19
- message: `Path parameter \`${parameter.name}\` is not used in the path \`${currentPath}\`.`,
20
- location: location.child(['name']),
21
- });
22
- }
23
- }
24
- },
25
- Operation: {
26
- enter() {
27
- definedOperationParams = new Set();
28
- },
29
- leave(_op, { report, location }) {
30
- for (const templateParam of Array.from(pathTemplateParams.keys())) {
31
- if (!definedOperationParams.has(templateParam) &&
32
- !definedPathParams.has(templateParam)) {
33
- report({
34
- message: `The operation does not define the path parameter \`{${templateParam}}\` expected by path \`${currentPath}\`.`,
35
- location: location.child(['parameters']).key(), // report on operation
36
- });
37
- }
38
- }
39
- },
40
- Parameter(parameter, { report, location }) {
41
- if (parameter.in === 'path' && parameter.name) {
42
- definedOperationParams.add(parameter.name);
43
- if (!pathTemplateParams.has(parameter.name)) {
44
- report({
45
- message: `Path parameter \`${parameter.name}\` is not used in the path \`${currentPath}\`.`,
46
- location: location.child(['name']),
47
- });
48
- }
49
- }
50
- },
65
+ createPathItemParameterHandler(parameter, pathContext, report, location);
66
+ },
67
+ get Operation() {
68
+ return createOperationHandlers(pathContext, currentOperationParams, depth + 1);
69
+ },
70
+ };
71
+ };
72
+ return {
73
+ enter() {
74
+ currentOperationParams = new Set();
75
+ },
76
+ leave(_op, { report, location }) {
77
+ if (!pathContext.current || !currentOperationParams)
78
+ return;
79
+ collectPathParamsFromOperation(_op, currentOperationParams);
80
+ validateRequiredPathParams(pathContext.current.templateParams, currentOperationParams, pathContext.current.definedParams, pathContext.current.path, report, location);
81
+ },
82
+ Parameter(parameter, { report, location }) {
83
+ if (parameter.in === 'path' && parameter.name && pathContext.current) {
84
+ currentOperationParams.add(parameter.name);
85
+ validatePathParameter(parameter.name, pathContext.current.templateParams, pathContext.current.path, report, location);
86
+ }
87
+ },
88
+ Callback: {
89
+ get PathItem() {
90
+ return createCallbackPathItem();
51
91
  },
52
92
  },
53
93
  };
54
94
  };
95
+ const extractTemplateParams = (path) => {
96
+ return new Set(Array.from(path.matchAll(pathRegex)).map((m) => m[1]));
97
+ };
98
+ const collectPathParamsFromOperation = (operation, targetSet) => {
99
+ const op = operation;
100
+ op?.parameters?.forEach((param) => {
101
+ if (param?.in === 'path' && param?.name) {
102
+ targetSet.add(param.name);
103
+ }
104
+ });
105
+ };
106
+ const validatePathParameter = (paramName, templateParams, path, report, location) => {
107
+ if (!templateParams.has(paramName)) {
108
+ report({
109
+ message: `Path parameter \`${paramName}\` is not used in the path \`${path}\`.`,
110
+ location: location.child(['name']),
111
+ });
112
+ }
113
+ };
114
+ const validateRequiredPathParams = (templateParams, definedOperationParams, definedPathParams, path, report, location) => {
115
+ const allDefinedParams = new Set([...definedOperationParams, ...definedPathParams]);
116
+ for (const templateParam of templateParams) {
117
+ if (!allDefinedParams.has(templateParam)) {
118
+ report({
119
+ message: `The operation does not define the path parameter \`{${templateParam}}\` expected by path \`${path}\`.`,
120
+ location: location.child(['parameters']).key(),
121
+ });
122
+ }
123
+ }
124
+ };
55
125
  //# sourceMappingURL=path-params-defined.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-params-defined.js","sourceRoot":"","sources":["../../../src/rules/common/path-params-defined.ts"],"names":[],"mappings":"AAKA,MAAM,SAAS,GAAG,yBAAyB,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAwB,GAAG,EAAE;IACzD,IAAI,kBAA+B,CAAC;IACpC,IAAI,iBAA8B,CAAC;IACnC,IAAI,WAAmB,CAAC;IACxB,IAAI,sBAAmC,CAAC;IAExC,OAAO;QACL,QAAQ,EAAE;YACR,KAAK,CAAC,CAAS,EAAE,EAAE,GAAG,EAAe;gBACnC,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC9B,WAAW,GAAG,GAAa,CAAC;gBAC5B,kBAAkB,GAAG,IAAI,GAAG,CAC1B,KAAK,CAAC,IAAI,CAAC,GAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjE,CAAC;YACJ,CAAC;YACD,SAAS,CAAC,SAAwC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAe;gBACnF,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;oBAC9C,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC5C,MAAM,CAAC;4BACL,OAAO,EAAE,oBAAoB,SAAS,CAAC,IAAI,gCAAgC,WAAW,KAAK;4BAC3F,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;yBACnC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YACD,SAAS,EAAE;gBACT,KAAK;oBACH,sBAAsB,GAAG,IAAI,GAAG,EAAE,CAAC;gBACrC,CAAC;gBACD,KAAK,CAAC,GAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAe;oBAClD,KAAK,MAAM,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;wBAClE,IACE,CAAC,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC;4BAC1C,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC,EACrC,CAAC;4BACD,MAAM,CAAC;gCACL,OAAO,EAAE,uDAAuD,aAAa,0BAA0B,WAAW,KAAK;gCACvH,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,sBAAsB;6BACvE,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,SAAS,CAAC,SAAwC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAe;oBACnF,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;wBAC9C,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;wBAC3C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC5C,MAAM,CAAC;gCACL,OAAO,EAAE,oBAAoB,SAAS,CAAC,IAAI,gCAAgC,WAAW,KAAK;gCAC3F,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;6BACnC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;aACF;SACF;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"path-params-defined.js","sourceRoot":"","sources":["../../../src/rules/common/path-params-defined.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/openapi-core",
3
- "version": "2.12.3",
3
+ "version": "2.12.5",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "types": "lib/index.d.ts",
@@ -53,7 +53,7 @@
53
53
  ],
54
54
  "dependencies": {
55
55
  "@redocly/ajv": "^8.17.1",
56
- "@redocly/config": "^0.40.0",
56
+ "@redocly/config": "^0.41.0",
57
57
  "ajv-formats": "^3.0.1",
58
58
  "colorette": "^1.2.0",
59
59
  "js-levenshtein": "^1.1.6",