@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,118 @@
1
+ import { PathItemServersElement, OperationServersElement, ServersElement } from '@speclynx/apidom-ns-openapi-3-0';
2
+ import NormalizeStorage from "./normalize-header-examples/NormalizeStorage.mjs";
3
+ import { refractServer } from "../index.mjs";
4
+ /**
5
+ * Override of Server Objects.
6
+ *
7
+ * List of Server Objects can be defined in OpenAPI 3.1 on multiple levels:
8
+ *
9
+ * - OpenAPI.servers
10
+ * - PathItem.servers
11
+ * - Operation.servers
12
+ *
13
+ * If a servers array is specified at the OpenAPI Object level, it will be overridden by `PathItem`.servers.
14
+ * If a servers array is specified at the Path Item Object or OpenAPI Object level, it will be overridden by Operation.servers.
15
+ * @public
16
+ */
17
+ /**
18
+ * @public
19
+ */
20
+ const plugin = ({
21
+ storageField = 'x-normalized'
22
+ } = {}) => toolbox => {
23
+ const {
24
+ ancestorLineageToJSONPointer,
25
+ predicates
26
+ } = toolbox;
27
+ let storage;
28
+ return {
29
+ visitor: {
30
+ OpenApi3_1Element: {
31
+ enter(path) {
32
+ const openapiElement = path.node;
33
+ const isServersUndefined = typeof openapiElement.servers === 'undefined';
34
+ const isServersArrayElement = predicates.isArrayElement(openapiElement.servers);
35
+ const isServersEmpty = isServersArrayElement && openapiElement.servers.length === 0;
36
+ const defaultServer = refractServer({
37
+ url: '/'
38
+ });
39
+ if (isServersUndefined || !isServersArrayElement) {
40
+ openapiElement.servers = new ServersElement([defaultServer]);
41
+ } else if (isServersArrayElement && isServersEmpty) {
42
+ openapiElement.servers.push(defaultServer);
43
+ }
44
+ storage = new NormalizeStorage(openapiElement, storageField, 'servers');
45
+ },
46
+ leave() {
47
+ storage = undefined;
48
+ }
49
+ },
50
+ PathItemElement(path) {
51
+ const pathItemElement = path.node;
52
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
53
+
54
+ // skip visiting this Path Item
55
+ if (ancestors.some(predicates.isComponentsElement)) return;
56
+ if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
57
+ const pathItemJSONPointer = ancestorLineageToJSONPointer([...ancestors, pathItemElement]);
58
+
59
+ // skip visiting this Path Item Object if it's already normalized
60
+ if (storage.includes(pathItemJSONPointer)) {
61
+ return;
62
+ }
63
+ const parentOpenapiElement = ancestors.find(predicates.isOpenApi3_1Element);
64
+ const isServersUndefined = typeof pathItemElement.servers === 'undefined';
65
+ const isServersArrayElement = predicates.isArrayElement(pathItemElement.servers);
66
+ const isServersEmpty = isServersArrayElement && pathItemElement.servers.length === 0;
67
+
68
+ // duplicate OpenAPI.servers into this Path Item object
69
+ if (predicates.isOpenApi3_1Element(parentOpenapiElement)) {
70
+ const openapiServersContent = parentOpenapiElement.servers?.content;
71
+ const openapiServers = openapiServersContent ?? [];
72
+ if (isServersUndefined || !isServersArrayElement) {
73
+ pathItemElement.servers = new PathItemServersElement(openapiServers);
74
+ } else if (isServersArrayElement && isServersEmpty) {
75
+ openapiServers.forEach(server => {
76
+ pathItemElement.servers.push(server);
77
+ });
78
+ }
79
+ storage.append(pathItemJSONPointer);
80
+ }
81
+ },
82
+ OperationElement(path) {
83
+ const operationElement = path.node;
84
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
85
+
86
+ // skip visiting this Operation
87
+ if (ancestors.some(predicates.isComponentsElement)) return;
88
+ if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
89
+ const operationJSONPointer = ancestorLineageToJSONPointer([...ancestors, operationElement]);
90
+
91
+ // skip visiting this Operation Object if it's already normalized
92
+ if (storage.includes(operationJSONPointer)) {
93
+ return;
94
+ }
95
+
96
+ // @TODO(vladimir.gorej@gmail.com): can be replaced by Array.prototype.findLast in future
97
+ const parentPathItemElement = ancestors.findLast(predicates.isPathItemElement);
98
+ const isServersUndefined = typeof operationElement.servers === 'undefined';
99
+ const isServersArrayElement = predicates.isArrayElement(operationElement.servers);
100
+ const isServersEmpty = isServersArrayElement && operationElement.servers.length === 0;
101
+ if (predicates.isPathItemElement(parentPathItemElement)) {
102
+ const pathItemServersContent = parentPathItemElement.servers?.content;
103
+ const pathItemServers = pathItemServersContent ?? [];
104
+ if (isServersUndefined || !isServersArrayElement) {
105
+ // duplicate parent PathItem.servers into this Operation object
106
+ operationElement.servers = new OperationServersElement(pathItemServers);
107
+ } else if (isServersArrayElement && isServersEmpty) {
108
+ pathItemServers.forEach(server => {
109
+ operationElement.servers.push(server);
110
+ });
111
+ }
112
+ storage.append(operationJSONPointer);
113
+ }
114
+ }
115
+ }
116
+ };
117
+ };
118
+ export default plugin;
@@ -0,0 +1,144 @@
1
+ import { Path } from '@speclynx/apidom-traverse';
2
+ import {
3
+ PathItemServersElement,
4
+ OperationServersElement,
5
+ ServersElement,
6
+ } from '@speclynx/apidom-ns-openapi-3-0';
7
+
8
+ import type OpenApi3_1Element from '../../elements/OpenApi3-1.ts';
9
+ import type PathItemElement from '../../elements/PathItem.ts';
10
+ import type ServerElement from '../../elements/Server.ts';
11
+ import type OperationElement from '../../elements/Operation.ts';
12
+ import type { Toolbox } from '../toolbox.ts';
13
+ import NormalizeStorage from './normalize-header-examples/NormalizeStorage.ts';
14
+ import { refractServer } from '../index.ts';
15
+
16
+ /**
17
+ * Override of Server Objects.
18
+ *
19
+ * List of Server Objects can be defined in OpenAPI 3.1 on multiple levels:
20
+ *
21
+ * - OpenAPI.servers
22
+ * - PathItem.servers
23
+ * - Operation.servers
24
+ *
25
+ * If a servers array is specified at the OpenAPI Object level, it will be overridden by `PathItem`.servers.
26
+ * If a servers array is specified at the Path Item Object or OpenAPI Object level, it will be overridden by Operation.servers.
27
+ * @public
28
+ */
29
+
30
+ export interface PluginOptions {
31
+ storageField?: string;
32
+ }
33
+
34
+ /**
35
+ * @public
36
+ */
37
+ const plugin =
38
+ ({ storageField = 'x-normalized' }: PluginOptions = {}) =>
39
+ (toolbox: Toolbox) => {
40
+ const { ancestorLineageToJSONPointer, predicates } = toolbox;
41
+ let storage: NormalizeStorage | undefined;
42
+
43
+ return {
44
+ visitor: {
45
+ OpenApi3_1Element: {
46
+ enter(path: Path<OpenApi3_1Element>) {
47
+ const openapiElement = path.node;
48
+ const isServersUndefined = typeof openapiElement.servers === 'undefined';
49
+ const isServersArrayElement = predicates.isArrayElement(openapiElement.servers);
50
+ const isServersEmpty = isServersArrayElement && openapiElement.servers!.length === 0;
51
+ const defaultServer = refractServer({ url: '/' });
52
+
53
+ if (isServersUndefined || !isServersArrayElement) {
54
+ openapiElement.servers = new ServersElement([defaultServer]);
55
+ } else if (isServersArrayElement && isServersEmpty) {
56
+ openapiElement.servers!.push(defaultServer);
57
+ }
58
+ storage = new NormalizeStorage(openapiElement, storageField, 'servers');
59
+ },
60
+ leave() {
61
+ storage = undefined;
62
+ },
63
+ },
64
+ PathItemElement(path: Path<PathItemElement>) {
65
+ const pathItemElement = path.node;
66
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
67
+
68
+ // skip visiting this Path Item
69
+ if (ancestors.some(predicates.isComponentsElement)) return;
70
+ if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
71
+
72
+ const pathItemJSONPointer = ancestorLineageToJSONPointer([...ancestors, pathItemElement]);
73
+
74
+ // skip visiting this Path Item Object if it's already normalized
75
+ if (storage!.includes(pathItemJSONPointer)) {
76
+ return;
77
+ }
78
+
79
+ const parentOpenapiElement = ancestors.find(predicates.isOpenApi3_1Element);
80
+ const isServersUndefined = typeof pathItemElement.servers === 'undefined';
81
+ const isServersArrayElement = predicates.isArrayElement(pathItemElement.servers);
82
+ const isServersEmpty = isServersArrayElement && pathItemElement.servers!.length === 0;
83
+
84
+ // duplicate OpenAPI.servers into this Path Item object
85
+ if (predicates.isOpenApi3_1Element(parentOpenapiElement)) {
86
+ const openapiServersContent = (parentOpenapiElement as unknown as OpenApi3_1Element)
87
+ .servers?.content;
88
+ const openapiServers = (openapiServersContent ?? []) as ServerElement[];
89
+
90
+ if (isServersUndefined || !isServersArrayElement) {
91
+ pathItemElement.servers = new PathItemServersElement(openapiServers);
92
+ } else if (isServersArrayElement && isServersEmpty) {
93
+ openapiServers.forEach((server) => {
94
+ pathItemElement.servers!.push(server);
95
+ });
96
+ }
97
+ storage!.append(pathItemJSONPointer);
98
+ }
99
+ },
100
+ OperationElement(path: Path<OperationElement>) {
101
+ const operationElement = path.node;
102
+ const ancestors = path.getAncestorNodes().reverse(); // root to parent order
103
+
104
+ // skip visiting this Operation
105
+ if (ancestors.some(predicates.isComponentsElement)) return;
106
+ if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
107
+
108
+ const operationJSONPointer = ancestorLineageToJSONPointer([
109
+ ...ancestors,
110
+ operationElement,
111
+ ]);
112
+
113
+ // skip visiting this Operation Object if it's already normalized
114
+ if (storage!.includes(operationJSONPointer)) {
115
+ return;
116
+ }
117
+
118
+ // @TODO(vladimir.gorej@gmail.com): can be replaced by Array.prototype.findLast in future
119
+ const parentPathItemElement = ancestors.findLast(predicates.isPathItemElement);
120
+ const isServersUndefined = typeof operationElement.servers === 'undefined';
121
+ const isServersArrayElement = predicates.isArrayElement(operationElement.servers);
122
+ const isServersEmpty = isServersArrayElement && operationElement.servers!.length === 0;
123
+
124
+ if (predicates.isPathItemElement(parentPathItemElement)) {
125
+ const pathItemServersContent = (parentPathItemElement as unknown as PathItemElement)
126
+ .servers?.content;
127
+ const pathItemServers = (pathItemServersContent ?? []) as ServerElement[];
128
+
129
+ if (isServersUndefined || !isServersArrayElement) {
130
+ // duplicate parent PathItem.servers into this Operation object
131
+ operationElement.servers = new OperationServersElement(pathItemServers);
132
+ } else if (isServersArrayElement && isServersEmpty) {
133
+ pathItemServers.forEach((server) => {
134
+ operationElement.servers!.push(server);
135
+ });
136
+ }
137
+ storage!.append(operationJSONPointer);
138
+ }
139
+ },
140
+ },
141
+ };
142
+ };
143
+
144
+ export default plugin;