@speclynx/apidom-ns-openapi-3-1 4.0.2 → 4.0.3

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 (287) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/package.json +9 -10
  3. package/src/elements/Callback.cjs +10 -0
  4. package/src/elements/Callback.mjs +7 -0
  5. package/src/elements/Callback.ts +8 -0
  6. package/src/elements/Components.cjs +17 -0
  7. package/src/elements/Components.mjs +14 -0
  8. package/src/elements/Components.ts +17 -0
  9. package/src/elements/Contact.cjs +10 -0
  10. package/src/elements/Contact.mjs +7 -0
  11. package/src/elements/Contact.ts +8 -0
  12. package/src/elements/Discriminator.cjs +10 -0
  13. package/src/elements/Discriminator.mjs +7 -0
  14. package/src/elements/Discriminator.ts +8 -0
  15. package/src/elements/Encoding.cjs +10 -0
  16. package/src/elements/Encoding.mjs +7 -0
  17. package/src/elements/Encoding.ts +8 -0
  18. package/src/elements/Example.cjs +10 -0
  19. package/src/elements/Example.mjs +7 -0
  20. package/src/elements/Example.ts +8 -0
  21. package/src/elements/ExternalDocumentation.cjs +10 -0
  22. package/src/elements/ExternalDocumentation.mjs +7 -0
  23. package/src/elements/ExternalDocumentation.ts +8 -0
  24. package/src/elements/Header.cjs +17 -0
  25. package/src/elements/Header.mjs +13 -0
  26. package/src/elements/Header.ts +18 -0
  27. package/src/elements/Info.cjs +23 -0
  28. package/src/elements/Info.mjs +19 -0
  29. package/src/elements/Info.ts +27 -0
  30. package/src/elements/JsonSchemaDialect.cjs +16 -0
  31. package/src/elements/JsonSchemaDialect.mjs +13 -0
  32. package/src/elements/JsonSchemaDialect.ts +15 -0
  33. package/src/elements/License.cjs +17 -0
  34. package/src/elements/License.mjs +14 -0
  35. package/src/elements/License.ts +17 -0
  36. package/src/elements/Link.cjs +10 -0
  37. package/src/elements/Link.mjs +7 -0
  38. package/src/elements/Link.ts +8 -0
  39. package/src/elements/MediaType.cjs +17 -0
  40. package/src/elements/MediaType.mjs +13 -0
  41. package/src/elements/MediaType.ts +18 -0
  42. package/src/elements/OAuthFlow.cjs +10 -0
  43. package/src/elements/OAuthFlow.mjs +7 -0
  44. package/src/elements/OAuthFlow.ts +8 -0
  45. package/src/elements/OAuthFlows.cjs +10 -0
  46. package/src/elements/OAuthFlows.mjs +7 -0
  47. package/src/elements/OAuthFlows.ts +8 -0
  48. package/src/elements/OpenApi3-1.cjs +77 -0
  49. package/src/elements/OpenApi3-1.mjs +73 -0
  50. package/src/elements/OpenApi3-1.ts +107 -0
  51. package/src/elements/Openapi.cjs +10 -0
  52. package/src/elements/Openapi.mjs +7 -0
  53. package/src/elements/Openapi.ts +8 -0
  54. package/src/elements/Operation.cjs +17 -0
  55. package/src/elements/Operation.mjs +13 -0
  56. package/src/elements/Operation.ts +19 -0
  57. package/src/elements/Parameter.cjs +17 -0
  58. package/src/elements/Parameter.mjs +13 -0
  59. package/src/elements/Parameter.ts +18 -0
  60. package/src/elements/PathItem.cjs +59 -0
  61. package/src/elements/PathItem.mjs +55 -0
  62. package/src/elements/PathItem.ts +74 -0
  63. package/src/elements/Paths.cjs +10 -0
  64. package/src/elements/Paths.mjs +7 -0
  65. package/src/elements/Paths.ts +8 -0
  66. package/src/elements/Reference.cjs +28 -0
  67. package/src/elements/Reference.mjs +25 -0
  68. package/src/elements/Reference.ts +29 -0
  69. package/src/elements/RequestBody.cjs +10 -0
  70. package/src/elements/RequestBody.mjs +7 -0
  71. package/src/elements/RequestBody.ts +8 -0
  72. package/src/elements/Response.cjs +10 -0
  73. package/src/elements/Response.mjs +7 -0
  74. package/src/elements/Response.ts +8 -0
  75. package/src/elements/Responses.cjs +10 -0
  76. package/src/elements/Responses.mjs +7 -0
  77. package/src/elements/Responses.ts +8 -0
  78. package/src/elements/Schema.cjs +50 -0
  79. package/src/elements/Schema.mjs +46 -0
  80. package/src/elements/Schema.ts +59 -0
  81. package/src/elements/SecurityRequirement.cjs +10 -0
  82. package/src/elements/SecurityRequirement.mjs +7 -0
  83. package/src/elements/SecurityRequirement.ts +8 -0
  84. package/src/elements/SecurityScheme.cjs +10 -0
  85. package/src/elements/SecurityScheme.mjs +7 -0
  86. package/src/elements/SecurityScheme.ts +8 -0
  87. package/src/elements/Server.cjs +10 -0
  88. package/src/elements/Server.mjs +7 -0
  89. package/src/elements/Server.ts +8 -0
  90. package/src/elements/ServerVariable.cjs +10 -0
  91. package/src/elements/ServerVariable.mjs +7 -0
  92. package/src/elements/ServerVariable.ts +8 -0
  93. package/src/elements/Tag.cjs +10 -0
  94. package/src/elements/Tag.mjs +7 -0
  95. package/src/elements/Tag.ts +8 -0
  96. package/src/elements/Xml.cjs +10 -0
  97. package/src/elements/Xml.mjs +7 -0
  98. package/src/elements/Xml.ts +8 -0
  99. package/src/elements/nces/ComponentsPathItems.cjs +16 -0
  100. package/src/elements/nces/ComponentsPathItems.mjs +13 -0
  101. package/src/elements/nces/ComponentsPathItems.ts +15 -0
  102. package/src/elements/nces/Webhooks.cjs +16 -0
  103. package/src/elements/nces/Webhooks.mjs +13 -0
  104. package/src/elements/nces/Webhooks.ts +15 -0
  105. package/src/index.cjs +182 -0
  106. package/src/index.mjs +31 -0
  107. package/src/index.ts +592 -0
  108. package/src/media-types.cjs +34 -0
  109. package/src/media-types.mjs +30 -0
  110. package/src/media-types.ts +46 -0
  111. package/src/namespace.cjs +81 -0
  112. package/src/namespace.mjs +76 -0
  113. package/src/namespace.ts +80 -0
  114. package/src/predicates.cjs +228 -0
  115. package/src/predicates.mjs +195 -0
  116. package/src/predicates.ts +229 -0
  117. package/src/refractor/index.cjs +368 -0
  118. package/src/refractor/index.mjs +330 -0
  119. package/src/refractor/index.ts +380 -0
  120. package/src/refractor/inspect.cjs +207 -0
  121. package/src/refractor/inspect.mjs +171 -0
  122. package/src/refractor/inspect.ts +241 -0
  123. package/src/refractor/plugins/normalize-header-examples/NormalizeStorage.cjs +38 -0
  124. package/src/refractor/plugins/normalize-header-examples/NormalizeStorage.mjs +34 -0
  125. package/src/refractor/plugins/normalize-header-examples/NormalizeStorage.ts +53 -0
  126. package/src/refractor/plugins/normalize-header-examples/index.cjs +109 -0
  127. package/src/refractor/plugins/normalize-header-examples/index.mjs +103 -0
  128. package/src/refractor/plugins/normalize-header-examples/index.ts +125 -0
  129. package/src/refractor/plugins/normalize-operation-ids.cjs +166 -0
  130. package/src/refractor/plugins/normalize-operation-ids.mjs +161 -0
  131. package/src/refractor/plugins/normalize-operation-ids.ts +198 -0
  132. package/src/refractor/plugins/normalize-parameter-examples.cjs +109 -0
  133. package/src/refractor/plugins/normalize-parameter-examples.mjs +103 -0
  134. package/src/refractor/plugins/normalize-parameter-examples.ts +128 -0
  135. package/src/refractor/plugins/normalize-parameters.cjs +109 -0
  136. package/src/refractor/plugins/normalize-parameters.mjs +103 -0
  137. package/src/refractor/plugins/normalize-parameters.ts +136 -0
  138. package/src/refractor/plugins/normalize-security-requirements.cjs +75 -0
  139. package/src/refractor/plugins/normalize-security-requirements.mjs +69 -0
  140. package/src/refractor/plugins/normalize-security-requirements.ts +87 -0
  141. package/src/refractor/plugins/normalize-servers.cjs +124 -0
  142. package/src/refractor/plugins/normalize-servers.mjs +118 -0
  143. package/src/refractor/plugins/normalize-servers.ts +144 -0
  144. package/src/refractor/plugins/replace-empty-element.cjs +669 -0
  145. package/src/refractor/plugins/replace-empty-element.mjs +661 -0
  146. package/src/refractor/plugins/replace-empty-element.ts +726 -0
  147. package/src/refractor/predicates.cjs +36 -0
  148. package/src/refractor/predicates.mjs +31 -0
  149. package/src/refractor/predicates.ts +39 -0
  150. package/src/refractor/specification.cjs +531 -0
  151. package/src/refractor/specification.mjs +526 -0
  152. package/src/refractor/specification.ts +594 -0
  153. package/src/refractor/toolbox.cjs +61 -0
  154. package/src/refractor/toolbox.mjs +53 -0
  155. package/src/refractor/toolbox.ts +70 -0
  156. package/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.cjs +25 -0
  157. package/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.mjs +19 -0
  158. package/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.ts +32 -0
  159. package/src/refractor/visitors/open-api-3-1/OpenapiVisitor.cjs +25 -0
  160. package/src/refractor/visitors/open-api-3-1/OpenapiVisitor.mjs +19 -0
  161. package/src/refractor/visitors/open-api-3-1/OpenapiVisitor.ts +30 -0
  162. package/src/refractor/visitors/open-api-3-1/WebhooksVisitor.cjs +43 -0
  163. package/src/refractor/visitors/open-api-3-1/WebhooksVisitor.mjs +37 -0
  164. package/src/refractor/visitors/open-api-3-1/WebhooksVisitor.ts +57 -0
  165. package/src/refractor/visitors/open-api-3-1/bases.cjs +46 -0
  166. package/src/refractor/visitors/open-api-3-1/bases.mjs +43 -0
  167. package/src/refractor/visitors/open-api-3-1/bases.ts +66 -0
  168. package/src/refractor/visitors/open-api-3-1/callback/index.cjs +36 -0
  169. package/src/refractor/visitors/open-api-3-1/callback/index.mjs +31 -0
  170. package/src/refractor/visitors/open-api-3-1/callback/index.ts +56 -0
  171. package/src/refractor/visitors/open-api-3-1/components/PathItemsVisitor.cjs +33 -0
  172. package/src/refractor/visitors/open-api-3-1/components/PathItemsVisitor.mjs +27 -0
  173. package/src/refractor/visitors/open-api-3-1/components/PathItemsVisitor.ts +45 -0
  174. package/src/refractor/visitors/open-api-3-1/components/SchemasVisitor.cjs +22 -0
  175. package/src/refractor/visitors/open-api-3-1/components/SchemasVisitor.mjs +17 -0
  176. package/src/refractor/visitors/open-api-3-1/components/SchemasVisitor.ts +26 -0
  177. package/src/refractor/visitors/open-api-3-1/components/index.cjs +21 -0
  178. package/src/refractor/visitors/open-api-3-1/components/index.mjs +16 -0
  179. package/src/refractor/visitors/open-api-3-1/components/index.ts +29 -0
  180. package/src/refractor/visitors/open-api-3-1/contact/index.cjs +21 -0
  181. package/src/refractor/visitors/open-api-3-1/contact/index.mjs +16 -0
  182. package/src/refractor/visitors/open-api-3-1/contact/index.ts +29 -0
  183. package/src/refractor/visitors/open-api-3-1/distriminator/index.cjs +22 -0
  184. package/src/refractor/visitors/open-api-3-1/distriminator/index.mjs +17 -0
  185. package/src/refractor/visitors/open-api-3-1/distriminator/index.ts +32 -0
  186. package/src/refractor/visitors/open-api-3-1/encoding/index.cjs +21 -0
  187. package/src/refractor/visitors/open-api-3-1/encoding/index.mjs +16 -0
  188. package/src/refractor/visitors/open-api-3-1/encoding/index.ts +29 -0
  189. package/src/refractor/visitors/open-api-3-1/example/index.cjs +21 -0
  190. package/src/refractor/visitors/open-api-3-1/example/index.mjs +16 -0
  191. package/src/refractor/visitors/open-api-3-1/example/index.ts +29 -0
  192. package/src/refractor/visitors/open-api-3-1/external-documentation/index.cjs +21 -0
  193. package/src/refractor/visitors/open-api-3-1/external-documentation/index.mjs +16 -0
  194. package/src/refractor/visitors/open-api-3-1/external-documentation/index.ts +29 -0
  195. package/src/refractor/visitors/open-api-3-1/header/index.cjs +21 -0
  196. package/src/refractor/visitors/open-api-3-1/header/index.mjs +16 -0
  197. package/src/refractor/visitors/open-api-3-1/header/index.ts +29 -0
  198. package/src/refractor/visitors/open-api-3-1/index.cjs +41 -0
  199. package/src/refractor/visitors/open-api-3-1/index.mjs +35 -0
  200. package/src/refractor/visitors/open-api-3-1/index.ts +52 -0
  201. package/src/refractor/visitors/open-api-3-1/info/index.cjs +21 -0
  202. package/src/refractor/visitors/open-api-3-1/info/index.mjs +16 -0
  203. package/src/refractor/visitors/open-api-3-1/info/index.ts +29 -0
  204. package/src/refractor/visitors/open-api-3-1/license/index.cjs +21 -0
  205. package/src/refractor/visitors/open-api-3-1/license/index.mjs +16 -0
  206. package/src/refractor/visitors/open-api-3-1/license/index.ts +29 -0
  207. package/src/refractor/visitors/open-api-3-1/link/index.cjs +21 -0
  208. package/src/refractor/visitors/open-api-3-1/link/index.mjs +16 -0
  209. package/src/refractor/visitors/open-api-3-1/link/index.ts +29 -0
  210. package/src/refractor/visitors/open-api-3-1/media-type/index.cjs +21 -0
  211. package/src/refractor/visitors/open-api-3-1/media-type/index.mjs +16 -0
  212. package/src/refractor/visitors/open-api-3-1/media-type/index.ts +29 -0
  213. package/src/refractor/visitors/open-api-3-1/oauth-flow/index.cjs +21 -0
  214. package/src/refractor/visitors/open-api-3-1/oauth-flow/index.mjs +16 -0
  215. package/src/refractor/visitors/open-api-3-1/oauth-flow/index.ts +29 -0
  216. package/src/refractor/visitors/open-api-3-1/oauth-flows/index.cjs +21 -0
  217. package/src/refractor/visitors/open-api-3-1/oauth-flows/index.mjs +16 -0
  218. package/src/refractor/visitors/open-api-3-1/oauth-flows/index.ts +29 -0
  219. package/src/refractor/visitors/open-api-3-1/operation/index.cjs +21 -0
  220. package/src/refractor/visitors/open-api-3-1/operation/index.mjs +16 -0
  221. package/src/refractor/visitors/open-api-3-1/operation/index.ts +29 -0
  222. package/src/refractor/visitors/open-api-3-1/parameter/index.cjs +21 -0
  223. package/src/refractor/visitors/open-api-3-1/parameter/index.mjs +16 -0
  224. package/src/refractor/visitors/open-api-3-1/parameter/index.ts +29 -0
  225. package/src/refractor/visitors/open-api-3-1/path-item/index.cjs +21 -0
  226. package/src/refractor/visitors/open-api-3-1/path-item/index.mjs +16 -0
  227. package/src/refractor/visitors/open-api-3-1/path-item/index.ts +29 -0
  228. package/src/refractor/visitors/open-api-3-1/paths/index.cjs +21 -0
  229. package/src/refractor/visitors/open-api-3-1/paths/index.mjs +16 -0
  230. package/src/refractor/visitors/open-api-3-1/paths/index.ts +29 -0
  231. package/src/refractor/visitors/open-api-3-1/reference/index.cjs +21 -0
  232. package/src/refractor/visitors/open-api-3-1/reference/index.mjs +16 -0
  233. package/src/refractor/visitors/open-api-3-1/reference/index.ts +29 -0
  234. package/src/refractor/visitors/open-api-3-1/request-body/index.cjs +21 -0
  235. package/src/refractor/visitors/open-api-3-1/request-body/index.mjs +16 -0
  236. package/src/refractor/visitors/open-api-3-1/request-body/index.ts +29 -0
  237. package/src/refractor/visitors/open-api-3-1/response/index.cjs +21 -0
  238. package/src/refractor/visitors/open-api-3-1/response/index.mjs +16 -0
  239. package/src/refractor/visitors/open-api-3-1/response/index.ts +29 -0
  240. package/src/refractor/visitors/open-api-3-1/responses/index.cjs +21 -0
  241. package/src/refractor/visitors/open-api-3-1/responses/index.mjs +16 -0
  242. package/src/refractor/visitors/open-api-3-1/responses/index.ts +29 -0
  243. package/src/refractor/visitors/open-api-3-1/schema/$defsVisitor.cjs +19 -0
  244. package/src/refractor/visitors/open-api-3-1/schema/$defsVisitor.mjs +16 -0
  245. package/src/refractor/visitors/open-api-3-1/schema/$defsVisitor.ts +21 -0
  246. package/src/refractor/visitors/open-api-3-1/schema/AllOfVisitor.cjs +15 -0
  247. package/src/refractor/visitors/open-api-3-1/schema/AllOfVisitor.mjs +11 -0
  248. package/src/refractor/visitors/open-api-3-1/schema/AllOfVisitor.ts +18 -0
  249. package/src/refractor/visitors/open-api-3-1/schema/AnyOfVisitor.cjs +15 -0
  250. package/src/refractor/visitors/open-api-3-1/schema/AnyOfVisitor.mjs +11 -0
  251. package/src/refractor/visitors/open-api-3-1/schema/AnyOfVisitor.ts +18 -0
  252. package/src/refractor/visitors/open-api-3-1/schema/DependentSchemasVisitor.cjs +15 -0
  253. package/src/refractor/visitors/open-api-3-1/schema/DependentSchemasVisitor.mjs +11 -0
  254. package/src/refractor/visitors/open-api-3-1/schema/DependentSchemasVisitor.ts +18 -0
  255. package/src/refractor/visitors/open-api-3-1/schema/OneOfVisitor.cjs +15 -0
  256. package/src/refractor/visitors/open-api-3-1/schema/OneOfVisitor.mjs +11 -0
  257. package/src/refractor/visitors/open-api-3-1/schema/OneOfVisitor.ts +18 -0
  258. package/src/refractor/visitors/open-api-3-1/schema/PatternPropertiesVisitor.cjs +15 -0
  259. package/src/refractor/visitors/open-api-3-1/schema/PatternPropertiesVisitor.mjs +11 -0
  260. package/src/refractor/visitors/open-api-3-1/schema/PatternPropertiesVisitor.ts +18 -0
  261. package/src/refractor/visitors/open-api-3-1/schema/PrefixItemsVisitor.cjs +15 -0
  262. package/src/refractor/visitors/open-api-3-1/schema/PrefixItemsVisitor.mjs +11 -0
  263. package/src/refractor/visitors/open-api-3-1/schema/PrefixItemsVisitor.ts +18 -0
  264. package/src/refractor/visitors/open-api-3-1/schema/PropertiesVisitor.cjs +15 -0
  265. package/src/refractor/visitors/open-api-3-1/schema/PropertiesVisitor.mjs +11 -0
  266. package/src/refractor/visitors/open-api-3-1/schema/PropertiesVisitor.ts +18 -0
  267. package/src/refractor/visitors/open-api-3-1/schema/index.cjs +76 -0
  268. package/src/refractor/visitors/open-api-3-1/schema/index.mjs +70 -0
  269. package/src/refractor/visitors/open-api-3-1/schema/index.ts +88 -0
  270. package/src/refractor/visitors/open-api-3-1/security-requirement/index.cjs +21 -0
  271. package/src/refractor/visitors/open-api-3-1/security-requirement/index.mjs +16 -0
  272. package/src/refractor/visitors/open-api-3-1/security-requirement/index.ts +29 -0
  273. package/src/refractor/visitors/open-api-3-1/security-scheme/index.cjs +21 -0
  274. package/src/refractor/visitors/open-api-3-1/security-scheme/index.mjs +16 -0
  275. package/src/refractor/visitors/open-api-3-1/security-scheme/index.ts +29 -0
  276. package/src/refractor/visitors/open-api-3-1/server/index.cjs +21 -0
  277. package/src/refractor/visitors/open-api-3-1/server/index.mjs +16 -0
  278. package/src/refractor/visitors/open-api-3-1/server/index.ts +29 -0
  279. package/src/refractor/visitors/open-api-3-1/server-variable/index.cjs +21 -0
  280. package/src/refractor/visitors/open-api-3-1/server-variable/index.mjs +16 -0
  281. package/src/refractor/visitors/open-api-3-1/server-variable/index.ts +29 -0
  282. package/src/refractor/visitors/open-api-3-1/tag/index.cjs +21 -0
  283. package/src/refractor/visitors/open-api-3-1/tag/index.mjs +16 -0
  284. package/src/refractor/visitors/open-api-3-1/tag/index.ts +29 -0
  285. package/src/refractor/visitors/open-api-3-1/xml/index.cjs +21 -0
  286. package/src/refractor/visitors/open-api-3-1/xml/index.mjs +16 -0
  287. package/src/refractor/visitors/open-api-3-1/xml/index.ts +29 -0
@@ -0,0 +1,198 @@
1
+ import { last, defaultTo, groupBy } from 'ramda';
2
+ import { StringElement, cloneDeep } from '@speclynx/apidom-datamodel';
3
+ import { toValue } from '@speclynx/apidom-core';
4
+ import { Path } from '@speclynx/apidom-traverse';
5
+
6
+ import LinkElement from '../../elements/Link.ts';
7
+ import PathItemElement from '../../elements/PathItem.ts';
8
+ import OperationElement from '../../elements/Operation.ts';
9
+ import type { Toolbox } from '../toolbox.ts';
10
+ import OpenApi3_1Element from '../../elements/OpenApi3-1.ts';
11
+ import NormalizeStorage from './normalize-header-examples/NormalizeStorage.ts';
12
+
13
+ const removeSpaces = (operationId: string) => {
14
+ return operationId.replace(/\s/g, '');
15
+ };
16
+
17
+ const replaceSpecialCharsWithUnderscore = (operationId: string) => {
18
+ return operationId.replace(/\W/gi, '_');
19
+ };
20
+
21
+ const createNormalizedOperationId = (path: string, method: string) => {
22
+ const normalizedMethod = replaceSpecialCharsWithUnderscore(removeSpaces(method.toLowerCase()));
23
+ const normalizedPath = replaceSpecialCharsWithUnderscore(removeSpaces(path));
24
+
25
+ return `${normalizedMethod}${normalizedPath}`;
26
+ };
27
+
28
+ const normalizeOperationId = (operationId: string, path: string, method: string) => {
29
+ const withoutSpaces = removeSpaces(operationId);
30
+
31
+ if (withoutSpaces.length > 0) {
32
+ return replaceSpecialCharsWithUnderscore(withoutSpaces);
33
+ }
34
+
35
+ return createNormalizedOperationId(path, method);
36
+ };
37
+
38
+ /**
39
+ * Normalization of Operation.operationId field.
40
+ *
41
+ * This normalization is not guided by OpenAPI 3.1 specification.
42
+ *
43
+ * Existing Operation.operationId fields are normalized into snake case form.
44
+ *
45
+ * Operation Objects, that do not define operationId field, are left untouched.
46
+ *
47
+ * Original operationId is stored in meta and as new `__originalOperationId` field.
48
+ *
49
+ * This plugin also guarantees the uniqueness of all defined Operation.operationId fields,
50
+ * and make sure Link.operationId fields are pointing to correct and normalized Operation.operationId fields.
51
+ *
52
+ * NOTE: this plugin is idempotent
53
+ * @public
54
+ */
55
+
56
+ export interface PluginOptions {
57
+ storageField?: string;
58
+ operationIdNormalizer?: (operationId: string, path: string, method: string) => string;
59
+ }
60
+
61
+ /**
62
+ * @public
63
+ */
64
+ const plugin =
65
+ ({
66
+ storageField = 'x-normalized',
67
+ operationIdNormalizer = normalizeOperationId,
68
+ }: PluginOptions = {}) =>
69
+ (toolbox: Toolbox) => {
70
+ const { predicates, ancestorLineageToJSONPointer, namespace } = toolbox;
71
+ const pathTemplates: string[] = [];
72
+ const normalizedOperations: OperationElement[] = [];
73
+ const links: LinkElement[] = [];
74
+ let storage: NormalizeStorage | undefined;
75
+
76
+ return {
77
+ visitor: {
78
+ OpenApi3_1Element: {
79
+ enter(path: Path<OpenApi3_1Element>) {
80
+ const element = path.node;
81
+ storage = new NormalizeStorage(element, storageField, 'operation-ids');
82
+ },
83
+ leave() {
84
+ // group normalized operations by normalized operationId
85
+ const normalizedOperationGroups = groupBy((operationElement: OperationElement) => {
86
+ return toValue(operationElement.operationId as StringElement) as string;
87
+ }, normalizedOperations);
88
+
89
+ // append incremental numerical suffixes to identical operationIds
90
+ Object.entries(normalizedOperationGroups).forEach(
91
+ ([normalizedOperationId, operationElements]) => {
92
+ if (!Array.isArray(operationElements)) return;
93
+ if (operationElements.length <= 1) return;
94
+
95
+ operationElements.forEach((operationElement, index) => {
96
+ const indexedNormalizedOperationId = `${normalizedOperationId}${index + 1}`;
97
+ // @ts-ignore
98
+ operationElement.operationId = new namespace.elements.String(
99
+ indexedNormalizedOperationId,
100
+ );
101
+ });
102
+ },
103
+ );
104
+
105
+ // rectify possibly broken Link.operationId fields
106
+ links.forEach((linkElement) => {
107
+ if (typeof linkElement.operationId === 'undefined') return;
108
+
109
+ const linkOperationId = String(toValue(linkElement.operationId));
110
+ const operationElement = normalizedOperations.find((normalizedOperationElement) => {
111
+ const originalOperationId =
112
+ normalizedOperationElement.meta.get('originalOperationId');
113
+ return originalOperationId === linkOperationId;
114
+ });
115
+
116
+ // Link Object doesn't need to be rectified
117
+ if (typeof operationElement === 'undefined') return;
118
+
119
+ linkElement.operationId = cloneDeep.safe(operationElement.operationId);
120
+ linkElement.meta.set('originalOperationId', linkOperationId);
121
+ linkElement.set('__originalOperationId', linkOperationId);
122
+ });
123
+
124
+ // cleanup the references
125
+ normalizedOperations.length = 0;
126
+ links.length = 0;
127
+ storage = undefined;
128
+ },
129
+ },
130
+ PathItemElement: {
131
+ enter(path: Path<PathItemElement>) {
132
+ const pathItemElement = path.node;
133
+ // `path` meta may not be always available, e.g. in Callback Object or Components Object
134
+ const pathTemplate = defaultTo('path', pathItemElement.meta.get('path') as string);
135
+ pathTemplates.push(pathTemplate);
136
+ },
137
+ leave() {
138
+ pathTemplates.pop();
139
+ },
140
+ },
141
+ OperationElement: {
142
+ enter(path: Path<OperationElement>) {
143
+ const operationElement = path.node;
144
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
145
+
146
+ // operationId field is undefined, needs no normalization
147
+ if (typeof operationElement.operationId === 'undefined') return;
148
+
149
+ const operationJSONPointer = ancestorLineageToJSONPointer([
150
+ ...ancestors,
151
+ operationElement,
152
+ ]);
153
+
154
+ // skip visiting this Operation Object if it's already normalized
155
+ if (storage!.includes(operationJSONPointer)) {
156
+ return;
157
+ }
158
+
159
+ // cast operationId to string type
160
+ const originalOperationId = String(toValue(operationElement.operationId));
161
+ // perform operationId normalization
162
+ const pathTemplate = last(pathTemplates) as string;
163
+ // `http-method` meta may not be always available, e.g. in Callback Object or Components Object
164
+ const method = defaultTo('method', operationElement.meta.get('http-method')) as string;
165
+ const normalizedOperationId = operationIdNormalizer(
166
+ originalOperationId,
167
+ pathTemplate,
168
+ method,
169
+ );
170
+
171
+ // normalization is not necessary
172
+ if (originalOperationId === normalizedOperationId) return;
173
+
174
+ // @ts-ignore
175
+ operationElement.operationId = new namespace.elements.String(normalizedOperationId);
176
+ operationElement.set('__originalOperationId', originalOperationId);
177
+ operationElement.meta.set('originalOperationId', originalOperationId);
178
+
179
+ normalizedOperations.push(operationElement);
180
+ storage!.append(operationJSONPointer);
181
+ },
182
+ },
183
+ LinkElement: {
184
+ leave(path: Path<LinkElement>) {
185
+ const linkElement = path.node;
186
+ // make sure this Link elements doesn't come from base namespace
187
+ if (!predicates.isLinkElement(linkElement)) return;
188
+ // ignore Link Objects with undefined operationId
189
+ if (typeof linkElement.operationId === 'undefined') return;
190
+
191
+ links.push(linkElement);
192
+ },
193
+ },
194
+ },
195
+ };
196
+ };
197
+
198
+ export default plugin;
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
+ exports.__esModule = true;
5
+ exports.default = void 0;
6
+ var _apidomDatamodel = require("@speclynx/apidom-datamodel");
7
+ var _NormalizeStorage = _interopRequireDefault(require("./normalize-header-examples/NormalizeStorage.cjs"));
8
+ /**
9
+ * Override of Schema.example and Schema.examples field inside the Parameter Objects.
10
+ *
11
+ * Parameter Object has two fixed fields:
12
+ * - `example` of type `Any`
13
+ * - `examples` of type `Map[string, Example Object | Reference Object]`
14
+ *
15
+ * OpenAPI 3.1 specification excerpt that defines the override behavior:
16
+ *
17
+ * The example value SHALL override the example provided by the schema.
18
+ * Furthermore, if referencing a schema that contains an example, the examples value SHALL override the example provided by the schema.
19
+ *
20
+ * NOTE: this plugin is idempotent
21
+ * @public
22
+ */
23
+
24
+ /**
25
+ * @public
26
+ */
27
+ const plugin = ({
28
+ storageField = 'x-normalized'
29
+ } = {}) => toolbox => {
30
+ const {
31
+ predicates,
32
+ ancestorLineageToJSONPointer
33
+ } = toolbox;
34
+ let storage;
35
+ return {
36
+ visitor: {
37
+ OpenApi3_1Element: {
38
+ enter(path) {
39
+ const element = path.node;
40
+ storage = new _NormalizeStorage.default(element, storageField, 'parameter-examples');
41
+ },
42
+ leave() {
43
+ storage = undefined;
44
+ }
45
+ },
46
+ ParameterElement: {
47
+ leave(path) {
48
+ const parameterElement = path.node;
49
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
50
+
51
+ // skip visiting this Parameter Object
52
+ if (ancestors.some(predicates.isComponentsElement)) {
53
+ return;
54
+ }
55
+
56
+ // no Parameter.schema field present
57
+ if (typeof parameterElement.schema === 'undefined' || !predicates.isSchemaElement(parameterElement.schema)) {
58
+ return;
59
+ }
60
+ // Schema contains no example
61
+ if (typeof parameterElement.schema?.example === 'undefined' && typeof parameterElement.schema?.examples === 'undefined') {
62
+ return;
63
+ }
64
+ const parameterJSONPointer = ancestorLineageToJSONPointer([...ancestors, parameterElement]);
65
+
66
+ // skip visiting this Parameter Object if it's already normalized
67
+ if (storage.includes(parameterJSONPointer)) {
68
+ return;
69
+ }
70
+
71
+ /**
72
+ * Parameter.examples and Schema.examples have preferences over the older
73
+ * and deprected `example` field.
74
+ */
75
+ if (typeof parameterElement.examples !== 'undefined' && predicates.isObjectElement(parameterElement.examples)) {
76
+ // @ts-ignore
77
+ const examples = parameterElement.examples.map(example => {
78
+ return _apidomDatamodel.cloneDeep.safe(example.value);
79
+ });
80
+ if (typeof parameterElement.schema.examples !== 'undefined') {
81
+ parameterElement.schema.set('examples', examples);
82
+ storage.append(parameterJSONPointer);
83
+ }
84
+ if (typeof parameterElement.schema.example !== 'undefined') {
85
+ parameterElement.schema.set('example', examples[0]);
86
+ storage.append(parameterJSONPointer);
87
+ }
88
+ return;
89
+ }
90
+
91
+ /**
92
+ * Handle deprecated `example` field.
93
+ */
94
+ if (typeof parameterElement.example !== 'undefined') {
95
+ if (typeof parameterElement.schema.examples !== 'undefined') {
96
+ parameterElement.schema.set('examples', [(0, _apidomDatamodel.cloneDeep)(parameterElement.example)]);
97
+ storage.append(parameterJSONPointer);
98
+ }
99
+ if (typeof parameterElement.schema.example !== 'undefined') {
100
+ parameterElement.schema.set('example', (0, _apidomDatamodel.cloneDeep)(parameterElement.example));
101
+ storage.append(parameterJSONPointer);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ };
108
+ };
109
+ var _default = exports.default = plugin;
@@ -0,0 +1,103 @@
1
+ import { cloneDeep } from '@speclynx/apidom-datamodel';
2
+ import NormalizeStorage from "./normalize-header-examples/NormalizeStorage.mjs";
3
+ /**
4
+ * Override of Schema.example and Schema.examples field inside the Parameter Objects.
5
+ *
6
+ * Parameter Object has two fixed fields:
7
+ * - `example` of type `Any`
8
+ * - `examples` of type `Map[string, Example Object | Reference Object]`
9
+ *
10
+ * OpenAPI 3.1 specification excerpt that defines the override behavior:
11
+ *
12
+ * The example value SHALL override the example provided by the schema.
13
+ * Furthermore, if referencing a schema that contains an example, the examples value SHALL override the example provided by the schema.
14
+ *
15
+ * NOTE: this plugin is idempotent
16
+ * @public
17
+ */
18
+ /**
19
+ * @public
20
+ */
21
+ const plugin = ({
22
+ storageField = 'x-normalized'
23
+ } = {}) => toolbox => {
24
+ const {
25
+ predicates,
26
+ ancestorLineageToJSONPointer
27
+ } = toolbox;
28
+ let storage;
29
+ return {
30
+ visitor: {
31
+ OpenApi3_1Element: {
32
+ enter(path) {
33
+ const element = path.node;
34
+ storage = new NormalizeStorage(element, storageField, 'parameter-examples');
35
+ },
36
+ leave() {
37
+ storage = undefined;
38
+ }
39
+ },
40
+ ParameterElement: {
41
+ leave(path) {
42
+ const parameterElement = path.node;
43
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
44
+
45
+ // skip visiting this Parameter Object
46
+ if (ancestors.some(predicates.isComponentsElement)) {
47
+ return;
48
+ }
49
+
50
+ // no Parameter.schema field present
51
+ if (typeof parameterElement.schema === 'undefined' || !predicates.isSchemaElement(parameterElement.schema)) {
52
+ return;
53
+ }
54
+ // Schema contains no example
55
+ if (typeof parameterElement.schema?.example === 'undefined' && typeof parameterElement.schema?.examples === 'undefined') {
56
+ return;
57
+ }
58
+ const parameterJSONPointer = ancestorLineageToJSONPointer([...ancestors, parameterElement]);
59
+
60
+ // skip visiting this Parameter Object if it's already normalized
61
+ if (storage.includes(parameterJSONPointer)) {
62
+ return;
63
+ }
64
+
65
+ /**
66
+ * Parameter.examples and Schema.examples have preferences over the older
67
+ * and deprected `example` field.
68
+ */
69
+ if (typeof parameterElement.examples !== 'undefined' && predicates.isObjectElement(parameterElement.examples)) {
70
+ // @ts-ignore
71
+ const examples = parameterElement.examples.map(example => {
72
+ return cloneDeep.safe(example.value);
73
+ });
74
+ if (typeof parameterElement.schema.examples !== 'undefined') {
75
+ parameterElement.schema.set('examples', examples);
76
+ storage.append(parameterJSONPointer);
77
+ }
78
+ if (typeof parameterElement.schema.example !== 'undefined') {
79
+ parameterElement.schema.set('example', examples[0]);
80
+ storage.append(parameterJSONPointer);
81
+ }
82
+ return;
83
+ }
84
+
85
+ /**
86
+ * Handle deprecated `example` field.
87
+ */
88
+ if (typeof parameterElement.example !== 'undefined') {
89
+ if (typeof parameterElement.schema.examples !== 'undefined') {
90
+ parameterElement.schema.set('examples', [cloneDeep(parameterElement.example)]);
91
+ storage.append(parameterJSONPointer);
92
+ }
93
+ if (typeof parameterElement.schema.example !== 'undefined') {
94
+ parameterElement.schema.set('example', cloneDeep(parameterElement.example));
95
+ storage.append(parameterJSONPointer);
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ };
102
+ };
103
+ export default plugin;
@@ -0,0 +1,128 @@
1
+ import { cloneDeep } from '@speclynx/apidom-datamodel';
2
+ import { Path } from '@speclynx/apidom-traverse';
3
+
4
+ import ParameterElement from '../../elements/Parameter.ts';
5
+ import ExampleElement from '../../elements/Example.ts';
6
+ import type { Toolbox } from '../toolbox.ts';
7
+ import OpenApi3_1Element from '../../elements/OpenApi3-1.ts';
8
+ import NormalizeStorage from './normalize-header-examples/NormalizeStorage.ts';
9
+
10
+ /**
11
+ * Override of Schema.example and Schema.examples field inside the Parameter Objects.
12
+ *
13
+ * Parameter Object has two fixed fields:
14
+ * - `example` of type `Any`
15
+ * - `examples` of type `Map[string, Example Object | Reference Object]`
16
+ *
17
+ * OpenAPI 3.1 specification excerpt that defines the override behavior:
18
+ *
19
+ * The example value SHALL override the example provided by the schema.
20
+ * Furthermore, if referencing a schema that contains an example, the examples value SHALL override the example provided by the schema.
21
+ *
22
+ * NOTE: this plugin is idempotent
23
+ * @public
24
+ */
25
+
26
+ export interface PluginOptions {
27
+ storageField?: string;
28
+ }
29
+
30
+ /**
31
+ * @public
32
+ */
33
+ const plugin =
34
+ ({ storageField = 'x-normalized' }: PluginOptions = {}) =>
35
+ (toolbox: Toolbox) => {
36
+ const { predicates, ancestorLineageToJSONPointer } = toolbox;
37
+ let storage: NormalizeStorage | undefined;
38
+
39
+ return {
40
+ visitor: {
41
+ OpenApi3_1Element: {
42
+ enter(path: Path<OpenApi3_1Element>) {
43
+ const element = path.node;
44
+ storage = new NormalizeStorage(element, storageField, 'parameter-examples');
45
+ },
46
+ leave() {
47
+ storage = undefined;
48
+ },
49
+ },
50
+ ParameterElement: {
51
+ leave(path: Path<ParameterElement>) {
52
+ const parameterElement = path.node;
53
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
54
+
55
+ // skip visiting this Parameter Object
56
+ if (ancestors.some(predicates.isComponentsElement)) {
57
+ return;
58
+ }
59
+
60
+ // no Parameter.schema field present
61
+ if (
62
+ typeof parameterElement.schema === 'undefined' ||
63
+ !predicates.isSchemaElement(parameterElement.schema)
64
+ ) {
65
+ return;
66
+ }
67
+ // Schema contains no example
68
+ if (
69
+ typeof parameterElement.schema?.example === 'undefined' &&
70
+ typeof parameterElement.schema?.examples === 'undefined'
71
+ ) {
72
+ return;
73
+ }
74
+
75
+ const parameterJSONPointer = ancestorLineageToJSONPointer([
76
+ ...ancestors,
77
+ parameterElement,
78
+ ]);
79
+
80
+ // skip visiting this Parameter Object if it's already normalized
81
+ if (storage!.includes(parameterJSONPointer)) {
82
+ return;
83
+ }
84
+
85
+ /**
86
+ * Parameter.examples and Schema.examples have preferences over the older
87
+ * and deprected `example` field.
88
+ */
89
+ if (
90
+ typeof parameterElement.examples !== 'undefined' &&
91
+ predicates.isObjectElement(parameterElement.examples)
92
+ ) {
93
+ // @ts-ignore
94
+ const examples = parameterElement.examples.map((example: ExampleElement) => {
95
+ return cloneDeep.safe(example.value);
96
+ });
97
+
98
+ if (typeof parameterElement.schema.examples !== 'undefined') {
99
+ parameterElement.schema.set('examples', examples);
100
+ storage!.append(parameterJSONPointer);
101
+ }
102
+ if (typeof parameterElement.schema.example !== 'undefined') {
103
+ parameterElement.schema.set('example', examples[0]);
104
+ storage!.append(parameterJSONPointer);
105
+ }
106
+ return;
107
+ }
108
+
109
+ /**
110
+ * Handle deprecated `example` field.
111
+ */
112
+ if (typeof parameterElement.example !== 'undefined') {
113
+ if (typeof parameterElement.schema.examples !== 'undefined') {
114
+ parameterElement.schema.set('examples', [cloneDeep(parameterElement.example)]);
115
+ storage!.append(parameterJSONPointer);
116
+ }
117
+ if (typeof parameterElement.schema.example !== 'undefined') {
118
+ parameterElement.schema.set('example', cloneDeep(parameterElement.example));
119
+ storage!.append(parameterJSONPointer);
120
+ }
121
+ }
122
+ },
123
+ },
124
+ },
125
+ };
126
+ };
127
+
128
+ export default plugin;
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
+ exports.__esModule = true;
5
+ exports.default = void 0;
6
+ var _ramda = require("ramda");
7
+ var _apidomCore = require("@speclynx/apidom-core");
8
+ var _apidomNsOpenapi = require("@speclynx/apidom-ns-openapi-3-0");
9
+ var _NormalizeStorage = _interopRequireDefault(require("./normalize-header-examples/NormalizeStorage.cjs"));
10
+ /**
11
+ * Inheritance of Parameter Objects.
12
+ *
13
+ * OpenAPI 3.1 specification excerpt that defines the inheritance behavior:
14
+ *
15
+ * A list of parameters that are applicable for this operation. If a parameter is already defined at the Path Item,
16
+ * the new definition will override it but can never remove it. The list MUST NOT include duplicated parameters.
17
+ * A unique parameter is defined by a combination of a name and location.
18
+ *
19
+ * NOTE: this plugin is idempotent
20
+ * @public
21
+ */
22
+
23
+ /**
24
+ * @public
25
+ */
26
+ const plugin = ({
27
+ storageField = 'x-normalized'
28
+ } = {}) => toolbox => {
29
+ const {
30
+ predicates,
31
+ ancestorLineageToJSONPointer
32
+ } = toolbox;
33
+ /**
34
+ * Establishes identity between two Parameter Objects.
35
+ *
36
+ * {@link https://spec.openapis.org/oas/v3.1.2.html#operation-parameters}
37
+ */
38
+ const parameterEquals = (parameter1, parameter2) => {
39
+ if (!predicates.isParameterElement(parameter1)) return false;
40
+ if (!predicates.isParameterElement(parameter2)) return false;
41
+ if (!predicates.isStringElement(parameter1.name)) return false;
42
+ if (!predicates.isStringElement(parameter1.in)) return false;
43
+ if (!predicates.isStringElement(parameter2.name)) return false;
44
+ if (!predicates.isStringElement(parameter2.in)) return false;
45
+ return (0, _apidomCore.toValue)(parameter1.name) === (0, _apidomCore.toValue)(parameter2.name) && (0, _apidomCore.toValue)(parameter1.in) === (0, _apidomCore.toValue)(parameter2.in);
46
+ };
47
+ const pathItemParameters = [];
48
+ let storage;
49
+ return {
50
+ visitor: {
51
+ OpenApi3_1Element: {
52
+ enter(path) {
53
+ const element = path.node;
54
+ storage = new _NormalizeStorage.default(element, storageField, 'parameters');
55
+ },
56
+ leave() {
57
+ storage = undefined;
58
+ }
59
+ },
60
+ PathItemElement: {
61
+ enter(path) {
62
+ const pathItemElement = path.node;
63
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
64
+
65
+ // skip visiting this Path Item
66
+ if (ancestors.some(predicates.isComponentsElement)) {
67
+ return;
68
+ }
69
+ const {
70
+ parameters
71
+ } = pathItemElement;
72
+ if (predicates.isArrayElement(parameters)) {
73
+ pathItemParameters.push([...(parameters.content ?? [])]);
74
+ } else {
75
+ pathItemParameters.push([]);
76
+ }
77
+ },
78
+ leave() {
79
+ pathItemParameters.pop();
80
+ }
81
+ },
82
+ OperationElement: {
83
+ leave(path) {
84
+ const operationElement = path.node;
85
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
86
+ const parentPathItemParameters = (0, _ramda.last)(pathItemParameters);
87
+
88
+ // no Path Item Object parameters to inherit from
89
+ if (!Array.isArray(parentPathItemParameters) || parentPathItemParameters.length === 0) {
90
+ return;
91
+ }
92
+ const operationJSONPointer = ancestorLineageToJSONPointer([...ancestors, operationElement]);
93
+
94
+ // skip visiting this Operation Object if it's already normalized
95
+ if (storage.includes(operationJSONPointer)) {
96
+ return;
97
+ }
98
+ const operationParameters = (0, _ramda.pathOr)([], ['parameters', 'content'], operationElement);
99
+
100
+ // prefers the first item if two items compare equal based on the predicate
101
+ const mergedParameters = (0, _ramda.uniqWith)(parameterEquals, [...operationParameters, ...parentPathItemParameters]);
102
+ operationElement.parameters = new _apidomNsOpenapi.OperationParametersElement(mergedParameters);
103
+ storage.append(operationJSONPointer);
104
+ }
105
+ }
106
+ }
107
+ };
108
+ };
109
+ var _default = exports.default = plugin;